BiDiTestView.java revision 0a1413e4bf9dcda2a8abb2287e43f612a7fb2453
19f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio/*
29f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio * Copyright (C) 2011 The Android Open Source Project
39f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio *
49f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License");
59f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio * you may not use this file except in compliance with the License.
69f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio * You may obtain a copy of the License at
79f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio *
89f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio *      http://www.apache.org/licenses/LICENSE-2.0
99f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio *
109f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio * Unless required by applicable law or agreed to in writing, software
119f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS,
129f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio * See the License for the specific language governing permissions and
149f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio * limitations under the License.
159f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio */
169f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
179f82b580d744ce4baf057b061994394dcf239eedFabrice Di Megliopackage com.android.bidi;
189f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
199f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglioimport android.content.Context;
209f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglioimport android.graphics.Canvas;
219f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglioimport android.graphics.Color;
229f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglioimport android.graphics.Paint;
239f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglioimport android.graphics.Rect;
249f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglioimport android.graphics.Typeface;
259f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglioimport android.util.AttributeSet;
269f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglioimport android.util.Log;
279f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglioimport android.view.View;
289f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
299f82b580d744ce4baf057b061994394dcf239eedFabrice Di Megliopublic class BiDiTestView extends View {
309f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
319f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private static final String TAG = "BiDiTestView";
329f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
339f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private static final int BORDER_PADDING = 4;
349f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private static final int TEXT_PADDING = 16;
35eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    private static final int TEXT_SIZE = 16;
36eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    private static final int ORIGIN = 80;
379f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
389f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private static final float DEFAULT_ITALIC_SKEW_X = -0.25f;
399f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
409f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private Paint paint = new Paint();
419f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private Rect rect = new Rect();
429f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
439f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String NORMAL_TEXT;
449f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String NORMAL_LONG_TEXT;
45eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    private String NORMAL_LONG_TEXT_2;
46eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    private String NORMAL_LONG_TEXT_3;
479f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String ITALIC_TEXT;
489f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String BOLD_TEXT;
499f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String BOLD_ITALIC_TEXT;
509f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String ARABIC_TEXT;
519f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String CHINESE_TEXT;
52689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio    private String MIXED_TEXT_1;
539f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
549f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private Typeface typeface;
559f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
56eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    private int currentTextSize;
57eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
589f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    public BiDiTestView(Context context) {
599f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        super(context);
609f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        init(context);
619f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
629f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
639f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    public BiDiTestView(Context context, AttributeSet attrs) {
649f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        super(context, attrs);
659f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        init(context);
669f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
679f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
689f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    public BiDiTestView(Context context, AttributeSet attrs, int defStyle) {
699f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        super(context, attrs, defStyle);
709f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        init(context);
719f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
729f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
739f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private void init(Context context) {
749f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        NORMAL_TEXT = context.getString(R.string.normal_text);
759f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        NORMAL_LONG_TEXT = context.getString(R.string.normal_long_text);
76eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        NORMAL_LONG_TEXT_2 = context.getString(R.string.normal_long_text_2);
77eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        NORMAL_LONG_TEXT_3 = context.getString(R.string.normal_long_text_3);
789f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        ITALIC_TEXT = context.getString(R.string.italic_text);
799f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        BOLD_TEXT = context.getString(R.string.bold_text);
809f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        BOLD_ITALIC_TEXT = context.getString(R.string.bold_italic_text);
819f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        ARABIC_TEXT = context.getString(R.string.arabic_text);
829f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        CHINESE_TEXT = context.getString(R.string.chinese_text);
83689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        MIXED_TEXT_1 = context.getString(R.string.mixed_text_1);
849f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
859f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        typeface = paint.getTypeface();
869f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setAntiAlias(true);
879f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
889f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
89eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    public void setCurrentTextSize(int size) {
90eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        currentTextSize = size;
91eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        invalidate();
92eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    }
93eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
949f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    @Override
959f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    public void onDraw(Canvas canvas) {
969f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        drawInsideRect(canvas, Color.BLACK);
979f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
98eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        int deltaX = testString(canvas, NORMAL_TEXT, ORIGIN, ORIGIN,
99eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio                paint, typeface, false, false,  Paint.DIRECTION_LTR, currentTextSize);
100eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
101eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX += testString(canvas, ITALIC_TEXT, ORIGIN + deltaX, ORIGIN,
102eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio                paint, typeface, true, false,  Paint.DIRECTION_LTR, currentTextSize);
103eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
104eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX += testString(canvas, BOLD_TEXT, ORIGIN + deltaX, ORIGIN,
105eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio                paint, typeface, false, true,  Paint.DIRECTION_LTR, currentTextSize);
106eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
107eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX += testString(canvas, BOLD_ITALIC_TEXT, ORIGIN + deltaX, ORIGIN,
108eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio                paint, typeface, true, true,  Paint.DIRECTION_LTR, currentTextSize);
1099f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1109f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        // Test with a long string
111eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX = testString(canvas, NORMAL_LONG_TEXT, ORIGIN, ORIGIN + 2 * currentTextSize,
112eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio                paint, typeface, false, false,  Paint.DIRECTION_LTR, currentTextSize);
113eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
114eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        // Test with a long string
115eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX = testString(canvas, NORMAL_LONG_TEXT_2, ORIGIN, ORIGIN + 4 * currentTextSize,
116eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio                paint, typeface, false, false,  Paint.DIRECTION_LTR, currentTextSize);
117eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
118eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        // Test with a long string
119eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX = testString(canvas, NORMAL_LONG_TEXT_3, ORIGIN, ORIGIN + 6 * currentTextSize,
120eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio                paint, typeface, false, false,  Paint.DIRECTION_LTR, currentTextSize);
1219f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1229f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        // Test Arabic ligature
123eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX = testString(canvas, ARABIC_TEXT, ORIGIN, ORIGIN + 8 * currentTextSize,
124eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio                paint, typeface, false, false,  Paint.DIRECTION_RTL, currentTextSize);
1259f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1269f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        // Test Chinese
127eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX = testString(canvas, CHINESE_TEXT, ORIGIN, ORIGIN + 10 * currentTextSize,
128eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio                paint, typeface, false, false,  Paint.DIRECTION_LTR, currentTextSize);
129689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio
130689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        // Test Mixed (English and Arabic)
131689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        deltaX = testString(canvas, MIXED_TEXT_1, ORIGIN, ORIGIN + 12 * currentTextSize,
132689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio                paint, typeface, false, false,  Paint.DIRECTION_LTR, currentTextSize);
1339f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
1349f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1359f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private int testString(Canvas canvas, String text, int x, int y, Paint paint, Typeface typeface,
136eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio            boolean isItalic, boolean isBold, int dir, int textSize) {
1379f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setTypeface(typeface);
1389f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1399f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        // Set paint properties
1409f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        boolean oldFakeBold = paint.isFakeBoldText();
1419f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setFakeBoldText(isBold);
1429f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1439f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        float oldTextSkewX = paint.getTextSkewX();
1449f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        if (isItalic) {
1459f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio            paint.setTextSkewX(DEFAULT_ITALIC_SKEW_X);
1469f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        }
1479f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
148689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        Log.v(TAG, "START -- drawTextWithCanvasDrawText");
149689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        drawTextWithCanvasDrawText(text, canvas, x, y, textSize, Color.WHITE, dir);
150689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        Log.v(TAG, "END   -- drawTextWithCanvasDrawText");
1519f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1529f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        int length = text.length();
1539f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        float[] advances = new float[length];
154689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        float textWidthHB = paint.getTextRunAdvances(text, 0, length, 0, length, dir, advances, 0);
155689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        setPaintDir(paint, dir);
1560a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio        float textWidthICU = paint.getTextRunAdvances(text, 0, length, 0, length, dir, advances, 0,
1570a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio                1 /* use ICU */);
1589f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
159eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        logAdvances(text, textWidthHB, textWidthICU, advances);
160eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        drawMetricsAroundText(canvas, x, y, textWidthHB, textWidthICU, textSize, Color.RED, Color.GREEN);
1619f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1629f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setColor(Color.WHITE);
163fcf2be1846935e7983ea2fe87fdd4d7af27764b6Fabrice Di Meglio//        char[] glyphs = new char[2*length];
164fcf2be1846935e7983ea2fe87fdd4d7af27764b6Fabrice Di Meglio//        int count = getGlyphs(text, glyphs, dir);
165fcf2be1846935e7983ea2fe87fdd4d7af27764b6Fabrice Di Meglio//
166eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio//        logGlypths(glyphs, count);
167fcf2be1846935e7983ea2fe87fdd4d7af27764b6Fabrice Di Meglio//        drawTextWithDrawGlyph(canvas, glyphs, count, x, y + currentTextSize);
168fcf2be1846935e7983ea2fe87fdd4d7af27764b6Fabrice Di Meglio
169689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        Log.v(TAG, "START -- drawTextWithGlyphs");
170fcf2be1846935e7983ea2fe87fdd4d7af27764b6Fabrice Di Meglio        drawTextWithGlyphs(canvas, text, x, y + currentTextSize, dir);
171689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        Log.v(TAG, "END   -- drawTextWithGlyphs");
1729f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1739f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        // Restore old paint properties
1749f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setFakeBoldText(oldFakeBold);
1759f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setTextSkewX(oldTextSkewX);
1769f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
177eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        return (int) Math.ceil(textWidthHB) + TEXT_PADDING;
1789f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
1799f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
180689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio    private void setPaintDir(Paint paint, int dir) {
181689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        Log.v(TAG, "Setting Paint dir=" + dir);
182689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        paint.setBidiFlags(dir);
183689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio    }
184689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio
1859f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private void drawTextWithDrawGlyph(Canvas canvas, char[] glyphs, int count, int x, int y) {
1869f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        canvas.drawGlyphs(glyphs, 0, count, x, y, paint);
1879f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
1889f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
189fcf2be1846935e7983ea2fe87fdd4d7af27764b6Fabrice Di Meglio    private void drawTextWithGlyphs(Canvas canvas, String text, int x, int y, int dir) {
190689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        setPaintDir(paint, dir);
191fcf2be1846935e7983ea2fe87fdd4d7af27764b6Fabrice Di Meglio        canvas.drawTextWithGlyphs(text, x, y, paint);
192fcf2be1846935e7983ea2fe87fdd4d7af27764b6Fabrice Di Meglio    }
193fcf2be1846935e7983ea2fe87fdd4d7af27764b6Fabrice Di Meglio
1949f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private void logGlypths(char[] glyphs, int count) {
1959f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        Log.v(TAG, "GlyphIds - count=" + count);
1969f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        for (int n = 0; n < count; n++) {
1979f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio            Log.v(TAG, "GlyphIds - Id[" + n + "]="+ (int)glyphs[n]);
1989f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        }
1999f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
2009f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
2019f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private int getGlyphs(String text, char[] glyphs, int dir) {
2029f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        return paint.getTextGlypths(text, 0, text.length(), 0, text.length(), dir, glyphs);
2039f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
2049f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
2059f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private void drawInsideRect(Canvas canvas, int color) {
2069f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setColor(color);
2079f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        int width = getWidth();
2089f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        int height = getHeight();
2099f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        rect.set(BORDER_PADDING, BORDER_PADDING, width - BORDER_PADDING, height - BORDER_PADDING);
2109f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        canvas.drawRect(rect, paint);
2119f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
2129f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
2139f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private void drawTextWithCanvasDrawText(String text, Canvas canvas,
214689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio            float x, float y, float textSize, int color, int dir) {
215689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        setPaintDir(paint, dir);
2169f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setColor(color);
2179f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setTextSize(textSize);
2189f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        canvas.drawText(text, x, y, paint);
2199f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
2209f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
221eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    private void drawMetricsAroundText(Canvas canvas, int x, int y, float textWidthHB,
222eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio            float textWidthICU, int textSize, int color, int colorICU) {
2239f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setColor(color);
2249f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        canvas.drawLine(x, y - textSize, x, y + 8, paint);
225eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        canvas.drawLine(x, y + 8, x + textWidthHB, y + 8, paint);
226eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        canvas.drawLine(x + textWidthHB, y - textSize, x + textWidthHB, y + 8, paint);
227eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        paint.setColor(colorICU);
228eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        canvas.drawLine(x + textWidthICU, y - textSize, x + textWidthICU, y + 8, paint);
2299f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
2309f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
231eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    private void logAdvances(String text, float textWidth, float textWidthICU, float[] advances) {
232eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        Log.v(TAG, "Advances for text: " + text + " total= " + textWidth + " - totalICU= " + textWidthICU);
233eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio//        int length = advances.length;
234eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio//        for(int n=0; n<length; n++){
235eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio//            Log.v(TAG, "adv[" + n + "]=" + advances[n]);
236eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio//        }
2379f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
2389f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio}
239