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