/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.emdev.ui.gl;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint.FontMetricsInt;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.FloatMath;
import org.emdev.utils.CompareUtils;
// StringTexture is a texture shows the content of a specified String.
//
// To create a StringTexture, use the newInstance() method and specify
// the String, the font size, and the color.
public class StringTexture extends CanvasTexture {
private TextPaint mPaint;
private FontMetricsInt mMetrics;
private String mText;
private int mTextWidth;
private int mTextHeight;
private volatile boolean recycled;
public StringTexture(final int maxWidth, final int maxHeight) {
super(Math.max(1, maxWidth), Math.max(1, maxHeight));
}
public void setText(final String text, final TextPaint paint) {
final String oldText = mText;
final int oldTextHeight = mTextHeight;
mPaint = paint;
mMetrics = paint.getFontMetricsInt();
mText = text;
mTextWidth = (int) Math.ceil(mPaint.measureText(mText));
mTextHeight = mMetrics.bottom - mMetrics.top;
if (mTextWidth > mCanvasWidth) {
mText = TextUtils.ellipsize(mText, mPaint, mCanvasWidth, TextUtils.TruncateAt.END).toString();
mTextWidth = (int) Math.ceil(mPaint.measureText(mText));
}
if (!CompareUtils.equals(mText, oldText) || mTextHeight != oldTextHeight) {
if (mBitmap != null) {
mBitmap.eraseColor(0);
}
mContentValid = false;
mWidth = UNSPECIFIED;
mHeight = UNSPECIFIED;
}
}
public String getText() {
return mText;
}
public int getTextWidth() {
return mTextWidth;
}
public int getTextHeight() {
return mTextHeight;
}
@Override
public void recycle() {
recycled = true;
super.recycle();
}
@Override
protected void freeBitmap() {
if (recycled) {
super.freeBitmap();
}
}
@Override
protected void onDraw(final Canvas canvas, final Bitmap backing) {
if (mText != null && mPaint != null && mMetrics != null) {
canvas.translate(0, -mMetrics.ascent);
canvas.drawText(mText, 0, 0, mPaint);
}
}
}