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