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;
24c6f247ca31e5d4a9cc9d130cfb0abd5657176303Fabrice Di Meglioimport android.text.TextPaint;
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 Rect rect = new Rect();
419f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
429f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String NORMAL_TEXT;
439f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String NORMAL_LONG_TEXT;
44eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    private String NORMAL_LONG_TEXT_2;
45eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    private String NORMAL_LONG_TEXT_3;
469f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String ITALIC_TEXT;
479f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String BOLD_TEXT;
489f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String BOLD_ITALIC_TEXT;
499f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String ARABIC_TEXT;
509f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    private String CHINESE_TEXT;
51689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio    private String MIXED_TEXT_1;
52589e4e27ee071f028a4bc72b91a1fb053ab13404Fabrice Di Meglio    private String HEBREW_TEXT;
53c6f247ca31e5d4a9cc9d130cfb0abd5657176303Fabrice Di Meglio    private String RTL_TEXT;
5403e250aefa29387f30a01243682eab2371103f8eFabrice Di Meglio    private String THAI_TEXT;
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);
84589e4e27ee071f028a4bc72b91a1fb053ab13404Fabrice Di Meglio        HEBREW_TEXT = context.getString(R.string.hebrew_text);
85c6f247ca31e5d4a9cc9d130cfb0abd5657176303Fabrice Di Meglio        RTL_TEXT = context.getString(R.string.rtl);
8603e250aefa29387f30a01243682eab2371103f8eFabrice Di Meglio        THAI_TEXT = context.getString(R.string.pointer_location);
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) {
96c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio        drawInsideRect(canvas, new Paint(), Color.BLACK);
979f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
98589e4e27ee071f028a4bc72b91a1fb053ab13404Fabrice Di Meglio        int deltaX = 0;
99589e4e27ee071f028a4bc72b91a1fb053ab13404Fabrice Di Meglio
100589e4e27ee071f028a4bc72b91a1fb053ab13404Fabrice Di Meglio        deltaX  = testString(canvas, NORMAL_TEXT, ORIGIN, ORIGIN,
101c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio                false, false,  Paint.DIRECTION_LTR, currentTextSize);
102eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
103eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX += testString(canvas, ITALIC_TEXT, ORIGIN + deltaX, ORIGIN,
104c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio                true, false,  Paint.DIRECTION_LTR, currentTextSize);
105eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
106eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX += testString(canvas, BOLD_TEXT, ORIGIN + deltaX, ORIGIN,
107c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio                false, true,  Paint.DIRECTION_LTR, currentTextSize);
108eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
109eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX += testString(canvas, BOLD_ITALIC_TEXT, ORIGIN + deltaX, ORIGIN,
110c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio                true, true,  Paint.DIRECTION_LTR, currentTextSize);
1119f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1129f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        // Test with a long string
113eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX = testString(canvas, NORMAL_LONG_TEXT, ORIGIN, ORIGIN + 2 * currentTextSize,
114c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio                false, false,  Paint.DIRECTION_LTR, currentTextSize);
115eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
116eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        // Test with a long string
117eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX = testString(canvas, NORMAL_LONG_TEXT_2, ORIGIN, ORIGIN + 4 * currentTextSize,
118c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio                false, false,  Paint.DIRECTION_LTR, currentTextSize);
119eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
120eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        // Test with a long string
121eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX = testString(canvas, NORMAL_LONG_TEXT_3, ORIGIN, ORIGIN + 6 * currentTextSize,
122c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio                false, false,  Paint.DIRECTION_LTR, currentTextSize);
1239f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1249f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        // Test Arabic ligature
125eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX = testString(canvas, ARABIC_TEXT, ORIGIN, ORIGIN + 8 * currentTextSize,
126c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio                false, false,  Paint.DIRECTION_RTL, currentTextSize);
1279f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1289f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        // Test Chinese
129eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        deltaX = testString(canvas, CHINESE_TEXT, ORIGIN, ORIGIN + 10 * currentTextSize,
130c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio                false, false,  Paint.DIRECTION_LTR, currentTextSize);
131689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio
132689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        // Test Mixed (English and Arabic)
133689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        deltaX = testString(canvas, MIXED_TEXT_1, ORIGIN, ORIGIN + 12 * currentTextSize,
134c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio                false, false,  Paint.DIRECTION_LTR, currentTextSize);
135589e4e27ee071f028a4bc72b91a1fb053ab13404Fabrice Di Meglio
136589e4e27ee071f028a4bc72b91a1fb053ab13404Fabrice Di Meglio        // Test Hebrew
137c6f247ca31e5d4a9cc9d130cfb0abd5657176303Fabrice Di Meglio        deltaX = testString(canvas, RTL_TEXT, ORIGIN, ORIGIN + 14 * currentTextSize,
138c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio                false, false,  Paint.DIRECTION_RTL, currentTextSize);
13903e250aefa29387f30a01243682eab2371103f8eFabrice Di Meglio
14003e250aefa29387f30a01243682eab2371103f8eFabrice Di Meglio        // Test Thai
14103e250aefa29387f30a01243682eab2371103f8eFabrice Di Meglio        deltaX = testString(canvas, THAI_TEXT, ORIGIN, ORIGIN + 16 * currentTextSize,
14203e250aefa29387f30a01243682eab2371103f8eFabrice Di Meglio                false, false,  Paint.DIRECTION_LTR, currentTextSize);
1439f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
1449f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
145c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio    private int testString(Canvas canvas, String text, int x, int y,
146eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio            boolean isItalic, boolean isBold, int dir, int textSize) {
147c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio
148c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio        TextPaint paint = new TextPaint();
149c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio        paint.setAntiAlias(true);
1509f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1519f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        // Set paint properties
1529f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        boolean oldFakeBold = paint.isFakeBoldText();
1539f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setFakeBoldText(isBold);
1549f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1559f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        float oldTextSkewX = paint.getTextSkewX();
1569f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        if (isItalic) {
1579f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio            paint.setTextSkewX(DEFAULT_ITALIC_SKEW_X);
1589f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        }
1599f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
160c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio        paint.setTextSize(textSize);
161c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio        paint.setColor(Color.WHITE);
162c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio        canvas.drawText(text, x, y, paint);
1639f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1649f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        int length = text.length();
1659f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        float[] advances = new float[length];
166689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        float textWidthHB = paint.getTextRunAdvances(text, 0, length, 0, length, dir, advances, 0);
167689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        setPaintDir(paint, dir);
1680a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio        float textWidthICU = paint.getTextRunAdvances(text, 0, length, 0, length, dir, advances, 0,
1690a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio                1 /* use ICU */);
1709f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
171eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        logAdvances(text, textWidthHB, textWidthICU, advances);
172eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        drawMetricsAroundText(canvas, x, y, textWidthHB, textWidthICU, textSize, Color.RED, Color.GREEN);
1739f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
1749f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        // Restore old paint properties
1759f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setFakeBoldText(oldFakeBold);
1769f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setTextSkewX(oldTextSkewX);
1779f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
178eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        return (int) Math.ceil(textWidthHB) + TEXT_PADDING;
1799f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
1809f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
181689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio    private void setPaintDir(Paint paint, int dir) {
182689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        Log.v(TAG, "Setting Paint dir=" + dir);
183689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio        paint.setBidiFlags(dir);
184689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio    }
185689e515ed2b8064c15e54d8ab69d87de54c5e0d6Fabrice Di Meglio
186c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio    private void drawInsideRect(Canvas canvas, Paint paint, int color) {
1879f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setColor(color);
1889f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        int width = getWidth();
1899f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        int height = getHeight();
1909f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        rect.set(BORDER_PADDING, BORDER_PADDING, width - BORDER_PADDING, height - BORDER_PADDING);
1919f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        canvas.drawRect(rect, paint);
1929f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
1939f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
194eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    private void drawMetricsAroundText(Canvas canvas, int x, int y, float textWidthHB,
195eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio            float textWidthICU, int textSize, int color, int colorICU) {
196c2063a5b18bc2e54f000b411c82f43992a53854eFabrice Di Meglio        Paint paint = new Paint();
1979f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        paint.setColor(color);
1989f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio        canvas.drawLine(x, y - textSize, x, y + 8, paint);
199eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        canvas.drawLine(x, y + 8, x + textWidthHB, y + 8, paint);
200eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        canvas.drawLine(x + textWidthHB, y - textSize, x + textWidthHB, y + 8, paint);
201eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        paint.setColor(colorICU);
202eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        canvas.drawLine(x + textWidthICU, y - textSize, x + textWidthICU, y + 8, paint);
2039f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
2049f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio
205eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    private void logAdvances(String text, float textWidth, float textWidthICU, float[] advances) {
206eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        Log.v(TAG, "Advances for text: " + text + " total= " + textWidth + " - totalICU= " + textWidthICU);
207eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio//        int length = advances.length;
208eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio//        for(int n=0; n<length; n++){
209eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio//            Log.v(TAG, "adv[" + n + "]=" + advances[n]);
210eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio//        }
2119f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio    }
2129f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio}
213