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