12779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi/*
22779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi * Copyright (C) 2015 The Android Open Source Project
32779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi *
42779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License");
52779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi * you may not use this file except in compliance with the License.
62779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi * You may obtain a copy of the License at
72779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi *
82779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi *      http://www.apache.org/licenses/LICENSE-2.0
92779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi *
102779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software
112779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS,
122779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi * See the License for the specific language governing permissions and
142779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi * limitations under the License.
152779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi */
162779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
172779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagipackage android.graphics;
182779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
192779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagiimport android.test.AndroidTestCase;
202779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
212779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagipublic class PaintTest extends AndroidTestCase {
222779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi    public void testGetTextRunAdvances() {
232779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        {
242779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            // LTR
252779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            String text = "abcdef";
262779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            assertGetTextRunAdvances(text, 0, text.length(), 0, text.length(), false, true);
272779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            assertGetTextRunAdvances(text, 1, text.length() - 1, 0, text.length(), false, false);
282779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
292779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        {
302779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            // RTL
312779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            final String text =
322779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    "\u0645\u0627\u0020\u0647\u064A\u0020\u0627\u0644\u0634" +
332779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    "\u0641\u0631\u0629\u0020\u0627\u0644\u0645\u0648\u062D" +
342779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    "\u062F\u0629\u0020\u064A\u0648\u0646\u064A\u0643\u0648" +
352779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    "\u062F\u061F";
362779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            assertGetTextRunAdvances(text, 0, text.length(), 0, text.length(), true, true);
372779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            assertGetTextRunAdvances(text, 1, text.length() - 1, 0, text.length(), true, false);
382779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
392779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi    }
402779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
412779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi    private void assertGetTextRunAdvances(String str, int start, int end,
422779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            int contextStart, int contextEnd, boolean isRtl, boolean compareWithOtherMethods) {
432779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        Paint p = new Paint();
442779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
452779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        final int count = end - start;
462779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        final float[][] advanceArrays = new float[4][count];
472779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
482779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        final float advance = p.getTextRunAdvances(str, start, end, contextStart, contextEnd,
492779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                isRtl, advanceArrays[0], 0);
502779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
512779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        char chars[] = str.toCharArray();
522779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        final float advance_c = p.getTextRunAdvances(chars, start, count, contextStart,
532779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                contextEnd - contextStart, isRtl, advanceArrays[1], 0);
542779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        assertEquals(advance, advance_c, 1.0f);
552779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
562779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        for (int c = 1; c < count; ++c) {
572779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            final float firstPartAdvance = p.getTextRunAdvances(str, start, start + c,
582779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    contextStart, contextEnd, isRtl, advanceArrays[2], 0);
592779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            final float secondPartAdvance = p.getTextRunAdvances(str, start + c, end,
602779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    contextStart, contextEnd, isRtl, advanceArrays[2], c);
612779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            assertEquals(advance, firstPartAdvance + secondPartAdvance, 1.0f);
622779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
632779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
642779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            final float firstPartAdvance_c = p.getTextRunAdvances(chars, start, c,
652779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    contextStart, contextEnd - contextStart, isRtl, advanceArrays[3], 0);
662779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            final float secondPartAdvance_c = p.getTextRunAdvances(chars, start + c,
672779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    count - c, contextStart, contextEnd - contextStart, isRtl,
682779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    advanceArrays[3], c);
692779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            assertEquals(advance, firstPartAdvance_c + secondPartAdvance_c, 1.0f);
702779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            assertEquals(firstPartAdvance, firstPartAdvance_c, 1.0f);
712779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            assertEquals(secondPartAdvance, secondPartAdvance_c, 1.0f);
722779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
732779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            for (int i = 1; i < advanceArrays.length; i++) {
742779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                for (int j = 0; j < count; j++) {
752779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    assertEquals(advanceArrays[0][j], advanceArrays[i][j], 1.0f);
762779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                }
772779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            }
782779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
792779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            // Compare results with measureText, getRunAdvance, and getTextWidths.
802779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            if (compareWithOtherMethods && start == contextStart && end == contextEnd) {
812779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                assertEquals(advance, p.measureText(str, start, end), 1.0f);
822779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                assertEquals(advance, p.getRunAdvance(
832779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                        str, start, end, contextStart, contextEnd, isRtl, end), 1.0f);
842779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
852779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                final float[] widths = new float[count];
862779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                p.getTextWidths(str, start, end, widths);
872779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                for (int i = 0; i < count; i++) {
882779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    assertEquals(advanceArrays[0][i], widths[i], 1.0f);
892779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                }
902779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            }
912779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
922779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi    }
932779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
942779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi    public void testGetTextRunAdvances_invalid() {
952779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        Paint p = new Paint();
962779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        String text = "test";
972779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
982779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        try {
992779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            p.getTextRunAdvances((String)null, 0, 0, 0, 0, false, null, 0);
1002779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            fail("Should throw an IllegalArgumentException.");
1012779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
1022779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
1032779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
1042779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        try {
1052779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            p.getTextRunAdvances((CharSequence)null, 0, 0, 0, 0, false, null, 0);
1062779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            fail("Should throw an IllegalArgumentException.");
1072779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
1082779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
1092779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
1102779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        try {
1112779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            p.getTextRunAdvances((char[])null, 0, 0, 0, 0, false, null, 0);
1122779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            fail("Should throw an IllegalArgumentException.");
1132779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
1142779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
1152779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
1162779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        try {
1172779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            p.getTextRunAdvances(text, 0, text.length(), 0, text.length(), false,
1182779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    new float[text.length() - 1], 0);
1192779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            fail("Should throw an IndexOutOfBoundsException.");
1202779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        } catch (IndexOutOfBoundsException e) {
1212779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
1222779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
1232779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        try {
1242779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            p.getTextRunAdvances(text, 0, text.length(), 0, text.length(), false,
1252779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi                    new float[text.length()], 1);
1262779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            fail("Should throw an IndexOutOfBoundsException.");
1272779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        } catch (IndexOutOfBoundsException e) {
1282779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
1292779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
1302779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        // 0 > contextStart
1312779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        try {
1322779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            p.getTextRunAdvances(text, 0, text.length(), -1, text.length(), false, null, 0);
1332779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            fail("Should throw an IndexOutOfBoundsException.");
1342779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        } catch (IndexOutOfBoundsException e) {
1352779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
1362779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
1372779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        // contextStart > start
1382779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        try {
1392779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            p.getTextRunAdvances(text, 0, text.length(), 1, text.length(), false, null, 0);
1402779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            fail("Should throw an IndexOutOfBoundsException.");
1412779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        } catch (IndexOutOfBoundsException e) {
1422779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
1432779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
1442779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        // start > end
1452779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        try {
1462779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            p.getTextRunAdvances(text, 1, 0, 0, text.length(), false, null, 0);
1472779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            fail("Should throw an IndexOutOfBoundsException.");
1482779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        } catch (IndexOutOfBoundsException e) {
1492779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
1502779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
1512779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        // end > contextEnd
1522779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        try {
1532779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            p.getTextRunAdvances(text, 0, text.length(), 0, text.length() - 1, false, null, 0);
1542779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            fail("Should throw an IndexOutOfBoundsException.");
1552779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        } catch (IndexOutOfBoundsException e) {
1562779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
1572779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi
1582779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        // contextEnd > text.length
1592779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        try {
1602779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            p.getTextRunAdvances(text, 0, text.length(), 0, text.length() + 1, false, null, 0);
1612779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi            fail("Should throw an IndexOutOfBoundsException.");
1622779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        } catch (IndexOutOfBoundsException e) {
1632779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi        }
1642779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi    }
16505de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi
16605de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi    public void testMeasureTextBidi() {
16705de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        Paint p = new Paint();
16805de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        {
16905de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            String bidiText = "abc \u0644\u063A\u0629 def";
17005de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            p.setBidiFlags(Paint.BIDI_LTR);
17105de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            float width = p.measureText(bidiText, 0, 4);
17205de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            p.setBidiFlags(Paint.BIDI_RTL);
17305de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 4, 7);
17405de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            p.setBidiFlags(Paint.BIDI_LTR);
17505de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 7, bidiText.length());
17605de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            assertEquals(width, p.measureText(bidiText), 1.0f);
17705de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        }
17805de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        {
17905de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            String bidiText = "abc \u0644\u063A\u0629 def";
18005de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            p.setBidiFlags(Paint.BIDI_DEFAULT_LTR);
18105de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            float width = p.measureText(bidiText, 0, 4);
18205de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 4, 7);
18305de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 7, bidiText.length());
18405de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            assertEquals(width, p.measureText(bidiText), 1.0f);
18505de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        }
18605de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        {
18705de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            String bidiText = "abc \u0644\u063A\u0629 def";
18805de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            p.setBidiFlags(Paint.BIDI_FORCE_LTR);
18905de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            float width = p.measureText(bidiText, 0, 4);
19005de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 4, 7);
19105de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 7, bidiText.length());
19205de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            assertEquals(width, p.measureText(bidiText), 1.0f);
19305de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        }
19405de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        {
19505de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            String bidiText = "\u0644\u063A\u0629 abc \u0644\u063A\u0629";
19605de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            p.setBidiFlags(Paint.BIDI_RTL);
19705de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            float width = p.measureText(bidiText, 0, 4);
19805de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            p.setBidiFlags(Paint.BIDI_LTR);
19905de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 4, 7);
20005de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            p.setBidiFlags(Paint.BIDI_RTL);
20105de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 7, bidiText.length());
20205de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            assertEquals(width, p.measureText(bidiText), 1.0f);
20305de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        }
20405de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        {
20505de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            String bidiText = "\u0644\u063A\u0629 abc \u0644\u063A\u0629";
20605de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            p.setBidiFlags(Paint.BIDI_DEFAULT_RTL);
20705de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            float width = p.measureText(bidiText, 0, 4);
20805de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 4, 7);
20905de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 7, bidiText.length());
21005de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            assertEquals(width, p.measureText(bidiText), 1.0f);
21105de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        }
21205de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        {
21305de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            String bidiText = "\u0644\u063A\u0629 abc \u0644\u063A\u0629";
21405de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            p.setBidiFlags(Paint.BIDI_FORCE_RTL);
21505de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            float width = p.measureText(bidiText, 0, 4);
21605de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 4, 7);
21705de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            width += p.measureText(bidiText, 7, bidiText.length());
21805de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi            assertEquals(width, p.measureText(bidiText), 1.0f);
21905de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi        }
22005de8fb29af618b0b3446fe81caca7402c6da666Keisuke Kuroyanagi    }
2212779b5978fc1d466cdfb3cf2c4a4a509663d1dd2Keisuke Kuroyanagi}
222