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
17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.ui;
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;
262b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport android.util.FloatMath;
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// StringTexture is a texture shows the content of a specified String.
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin//
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// To create a StringTexture, use the newInstance() method and specify
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// the String, the font size, and the color.
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linclass StringTexture extends CanvasTexture {
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final String mText;
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final TextPaint mPaint;
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final FontMetricsInt mMetrics;
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private StringTexture(String text, TextPaint paint,
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            FontMetricsInt metrics, int width, int height) {
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super(width, height);
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mText = text;
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPaint = paint;
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMetrics = metrics;
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static TextPaint getDefaultPaint(float textSize, int color) {
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        TextPaint paint = new TextPaint();
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        paint.setTextSize(textSize);
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        paint.setAntiAlias(true);
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        paint.setColor(color);
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        paint.setShadowLayer(2f, 0f, 0f, Color.BLACK);
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return paint;
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static StringTexture newInstance(
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            String text, float textSize, int color) {
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return newInstance(text, getDefaultPaint(textSize, color));
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static StringTexture newInstance(
609201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang            String text, float textSize, int color,
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            float lengthLimit, boolean isBold) {
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        TextPaint paint = getDefaultPaint(textSize, color);
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (isBold) {
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
666b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        if (lengthLimit > 0) {
676b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang            text = TextUtils.ellipsize(
686b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang                    text, paint, lengthLimit, TextUtils.TruncateAt.END).toString();
696b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang        }
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return newInstance(text, paint);
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static StringTexture newInstance(String text, TextPaint paint) {
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        FontMetricsInt metrics = paint.getFontMetricsInt();
75fd91413ab46e2960803a33652025aebe3e05f2d9Chih-Chung Chang        int width = (int) FloatMath.ceil(paint.measureText(text));
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int height = metrics.bottom - metrics.top;
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // The texture size needs to be at least 1x1.
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (width <= 0) width = 1;
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (height <= 0) height = 1;
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return new StringTexture(text, paint, metrics, width, height);
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onDraw(Canvas canvas, Bitmap backing) {
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        canvas.translate(0, -mMetrics.ascent);
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        canvas.drawText(mText, 0, 0, mPaint);
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
89