1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.gallery3d.glrenderer;
18 
19 import android.graphics.Bitmap;
20 import android.graphics.Canvas;
21 import android.graphics.Color;
22 import android.graphics.Paint.FontMetricsInt;
23 import android.graphics.Typeface;
24 import android.text.TextPaint;
25 import android.text.TextUtils;
26 
27 // StringTexture is a texture shows the content of a specified String.
28 //
29 // To create a StringTexture, use the newInstance() method and specify
30 // the String, the font size, and the color.
31 public class StringTexture extends CanvasTexture {
32     private final String mText;
33     private final TextPaint mPaint;
34     private final FontMetricsInt mMetrics;
35 
StringTexture(String text, TextPaint paint, FontMetricsInt metrics, int width, int height)36     private StringTexture(String text, TextPaint paint,
37             FontMetricsInt metrics, int width, int height) {
38         super(width, height);
39         mText = text;
40         mPaint = paint;
41         mMetrics = metrics;
42     }
43 
getDefaultPaint(float textSize, int color)44     public static TextPaint getDefaultPaint(float textSize, int color) {
45         TextPaint paint = new TextPaint();
46         paint.setTextSize(textSize);
47         paint.setAntiAlias(true);
48         paint.setColor(color);
49         paint.setShadowLayer(2f, 0f, 0f, Color.BLACK);
50         return paint;
51     }
52 
newInstance( String text, float textSize, int color)53     public static StringTexture newInstance(
54             String text, float textSize, int color) {
55         return newInstance(text, getDefaultPaint(textSize, color));
56     }
57 
newInstance( String text, float textSize, int color, float lengthLimit, boolean isBold)58     public static StringTexture newInstance(
59             String text, float textSize, int color,
60             float lengthLimit, boolean isBold) {
61         TextPaint paint = getDefaultPaint(textSize, color);
62         if (isBold) {
63             paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
64         }
65         if (lengthLimit > 0) {
66             text = TextUtils.ellipsize(
67                     text, paint, lengthLimit, TextUtils.TruncateAt.END).toString();
68         }
69         return newInstance(text, paint);
70     }
71 
newInstance(String text, TextPaint paint)72     private static StringTexture newInstance(String text, TextPaint paint) {
73         FontMetricsInt metrics = paint.getFontMetricsInt();
74         int width = (int) Math.ceil(paint.measureText(text));
75         int height = metrics.bottom - metrics.top;
76         // The texture size needs to be at least 1x1.
77         if (width <= 0) width = 1;
78         if (height <= 0) height = 1;
79         return new StringTexture(text, paint, metrics, width, height);
80     }
81 
82     @Override
onDraw(Canvas canvas, Bitmap backing)83     protected void onDraw(Canvas canvas, Bitmap backing) {
84         canvas.translate(0, -mMetrics.ascent);
85         canvas.drawText(mText, 0, 0, mPaint);
86     }
87 }
88