Loading core/java/android/text/Layout.java +3 −2 Original line number Diff line number Diff line Loading @@ -1966,12 +1966,13 @@ public abstract class Layout { /** * @hide */ /* package */ static class TabStops { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public static class TabStops { private int[] mStops; private int mNumStops; private int mIncrement; TabStops(int increment, Object[] spans) { public TabStops(int increment, Object[] spans) { reset(increment, spans); } Loading core/java/android/text/TextLine.java +1 −1 Original line number Diff line number Diff line Loading @@ -313,7 +313,7 @@ public class TextLine { * @return the signed offset from the leading margin to the requested * character edge. */ float measure(int offset, boolean trailing, FontMetricsInt fmi) { public float measure(int offset, boolean trailing, FontMetricsInt fmi) { int target = trailing ? offset - 1 : offset; if (target < 0) { return 0; Loading core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf +24 B (888 B) File changed.No diff preview for this file type. View original file View changed file core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx +2 −0 Original line number Diff line number Diff line Loading @@ -144,6 +144,8 @@ <map code="0x0056" name="5em" /> <!-- V --> <map code="0x0058" name="10em" /> <!-- X --> <map code="0x005f" name="0em" /> <!-- _ --> <map code="0x05D0" name="1em" /> <!-- HEBREW LETTER ALEF --> <map code="0x05D1" name="5em" /> <!-- HEBREW LETTER BET --> <map code="0xfffd" name="7em" /> <!-- REPLACEMENT CHAR --> <map code="0x10331" name="10em" /> </cmap_format_12> Loading core/tests/coretests/src/android/text/TextLineTest.java +256 −0 Original line number Diff line number Diff line Loading @@ -16,13 +16,18 @@ package android.text; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import android.graphics.Typeface; import android.platform.test.annotations.Presubmit; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.filters.Suppress; import android.support.test.runner.AndroidJUnit4; import android.text.Layout.TabStops; import android.text.style.TabStopSpan; import org.junit.Test; import org.junit.runner.RunWith; Loading Loading @@ -66,4 +71,255 @@ public class TextLineTest { final char combining_acute = '\u0301'; assertFalse(stretchesToFullWidth("combining" + nbsp + combining_acute + "acute")); } // The test font has following coverage and width. // U+0020: 10em // U+002E (.): 10em // U+0043 (C): 100em // U+0049 (I): 1em // U+004C (L): 50em // U+0056 (V): 5em // U+0058 (X): 10em // U+005F (_): 0em // U+05D0 : 1em // HEBREW LETTER ALEF // U+05D1 : 5em // HEBREW LETTER BET // U+FFFD (invalid surrogate will be replaced to this): 7em // U+10331 (\uD800\uDF31): 10em private static final Typeface TYPEFACE = Typeface.createFromAsset( InstrumentationRegistry.getInstrumentation().getTargetContext().getAssets(), "fonts/StaticLayoutLineBreakingTestFont.ttf"); private TextLine getTextLine(String str, TextPaint paint, TabStops tabStops) { Layout layout = StaticLayout.Builder.obtain(str, 0, str.length(), paint, Integer.MAX_VALUE) .build(); TextLine tl = TextLine.obtain(); tl.set(paint, str, 0, str.length(), TextDirectionHeuristics.FIRSTSTRONG_LTR.isRtl(str, 0, str.length()) ? -1 : 1, layout.getLineDirections(0), tabStops != null, tabStops); return tl; } private TextLine getTextLine(String str, TextPaint paint) { return getTextLine(str, paint, null); } @Test public void testMeasure_LTR() { final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("IIIIIV", paint); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(10.0f, tl.measure(1, false, null), 0.0f); assertEquals(20.0f, tl.measure(2, false, null), 0.0f); assertEquals(30.0f, tl.measure(3, false, null), 0.0f); assertEquals(40.0f, tl.measure(4, false, null), 0.0f); assertEquals(50.0f, tl.measure(5, false, null), 0.0f); assertEquals(100.0f, tl.measure(6, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(10.0f, tl.measure(1, true, null), 0.0f); assertEquals(20.0f, tl.measure(2, true, null), 0.0f); assertEquals(30.0f, tl.measure(3, true, null), 0.0f); assertEquals(40.0f, tl.measure(4, true, null), 0.0f); assertEquals(50.0f, tl.measure(5, true, null), 0.0f); assertEquals(100.0f, tl.measure(6, true, null), 0.0f); } @Test public void testMeasure_RTL() { final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("\u05D0\u05D0\u05D0\u05D0\u05D0\u05D1", paint); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(-10.0f, tl.measure(1, false, null), 0.0f); assertEquals(-20.0f, tl.measure(2, false, null), 0.0f); assertEquals(-30.0f, tl.measure(3, false, null), 0.0f); assertEquals(-40.0f, tl.measure(4, false, null), 0.0f); assertEquals(-50.0f, tl.measure(5, false, null), 0.0f); assertEquals(-100.0f, tl.measure(6, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(-10.0f, tl.measure(1, true, null), 0.0f); assertEquals(-20.0f, tl.measure(2, true, null), 0.0f); assertEquals(-30.0f, tl.measure(3, true, null), 0.0f); assertEquals(-40.0f, tl.measure(4, true, null), 0.0f); assertEquals(-50.0f, tl.measure(5, true, null), 0.0f); assertEquals(-100.0f, tl.measure(6, true, null), 0.0f); } @Test public void testMeasure_BiDi() { final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("II\u05D0\u05D0II", paint); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(10.0f, tl.measure(1, false, null), 0.0f); assertEquals(40.0f, tl.measure(2, false, null), 0.0f); assertEquals(30.0f, tl.measure(3, false, null), 0.0f); assertEquals(40.0f, tl.measure(4, false, null), 0.0f); assertEquals(50.0f, tl.measure(5, false, null), 0.0f); assertEquals(60.0f, tl.measure(6, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(10.0f, tl.measure(1, true, null), 0.0f); assertEquals(20.0f, tl.measure(2, true, null), 0.0f); assertEquals(30.0f, tl.measure(3, true, null), 0.0f); assertEquals(20.0f, tl.measure(4, true, null), 0.0f); assertEquals(50.0f, tl.measure(5, true, null), 0.0f); assertEquals(60.0f, tl.measure(6, true, null), 0.0f); } private static final String LRI = "\u2066"; // LEFT-TO-RIGHT ISOLATE private static final String RLI = "\u2067"; // RIGHT-TO-LEFT ISOLATE private static final String PDI = "\u2069"; // POP DIRECTIONAL ISOLATE @Test public void testMeasure_BiDi2() { final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("I" + RLI + "I\u05D0\u05D0" + PDI + "I", paint); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(10.0f, tl.measure(1, false, null), 0.0f); assertEquals(30.0f, tl.measure(2, false, null), 0.0f); assertEquals(30.0f, tl.measure(3, false, null), 0.0f); assertEquals(20.0f, tl.measure(4, false, null), 0.0f); assertEquals(40.0f, tl.measure(5, false, null), 0.0f); assertEquals(40.0f, tl.measure(6, false, null), 0.0f); assertEquals(50.0f, tl.measure(7, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(10.0f, tl.measure(1, true, null), 0.0f); assertEquals(10.0f, tl.measure(2, true, null), 0.0f); assertEquals(40.0f, tl.measure(3, true, null), 0.0f); assertEquals(20.0f, tl.measure(4, true, null), 0.0f); assertEquals(10.0f, tl.measure(5, true, null), 0.0f); assertEquals(40.0f, tl.measure(6, true, null), 0.0f); assertEquals(50.0f, tl.measure(7, true, null), 0.0f); } @Test public void testMeasure_BiDi3() { final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("\u05D0" + LRI + "\u05D0II" + PDI + "\u05D0", paint); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(-10.0f, tl.measure(1, false, null), 0.0f); assertEquals(-30.0f, tl.measure(2, false, null), 0.0f); assertEquals(-30.0f, tl.measure(3, false, null), 0.0f); assertEquals(-20.0f, tl.measure(4, false, null), 0.0f); assertEquals(-40.0f, tl.measure(5, false, null), 0.0f); assertEquals(-40.0f, tl.measure(6, false, null), 0.0f); assertEquals(-50.0f, tl.measure(7, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(-10.0f, tl.measure(1, true, null), 0.0f); assertEquals(-10.0f, tl.measure(2, true, null), 0.0f); assertEquals(-40.0f, tl.measure(3, true, null), 0.0f); assertEquals(-20.0f, tl.measure(4, true, null), 0.0f); assertEquals(-10.0f, tl.measure(5, true, null), 0.0f); assertEquals(-40.0f, tl.measure(6, true, null), 0.0f); assertEquals(-50.0f, tl.measure(7, true, null), 0.0f); } @Test public void testMeasure_Tab_LTR() { final Object[] spans = { new TabStopSpan.Standard(100) }; final TabStops stops = new TabStops(100, spans); final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("II\tII", paint, stops); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(10.0f, tl.measure(1, false, null), 0.0f); assertEquals(20.0f, tl.measure(2, false, null), 0.0f); assertEquals(100.0f, tl.measure(3, false, null), 0.0f); assertEquals(110.0f, tl.measure(4, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(10.0f, tl.measure(1, true, null), 0.0f); assertEquals(20.0f, tl.measure(2, true, null), 0.0f); assertEquals(100.0f, tl.measure(3, true, null), 0.0f); assertEquals(110.0f, tl.measure(4, true, null), 0.0f); } @Test public void testMeasure_Tab_RTL() { final Object[] spans = { new TabStopSpan.Standard(100) }; final TabStops stops = new TabStops(100, spans); final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("\u05D0\u05D0\t\u05D0\u05D0", paint, stops); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(-10.0f, tl.measure(1, false, null), 0.0f); assertEquals(-20.0f, tl.measure(2, false, null), 0.0f); assertEquals(-100.0f, tl.measure(3, false, null), 0.0f); assertEquals(-110.0f, tl.measure(4, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(-10.0f, tl.measure(1, true, null), 0.0f); assertEquals(-20.0f, tl.measure(2, true, null), 0.0f); assertEquals(-100.0f, tl.measure(3, true, null), 0.0f); assertEquals(-110.0f, tl.measure(4, true, null), 0.0f); } @Test public void testMeasure_Tab_BiDi() { final Object[] spans = { new TabStopSpan.Standard(100) }; final TabStops stops = new TabStops(100, spans); final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("I\u05D0\tI\u05D0", paint, stops); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(20.0f, tl.measure(1, false, null), 0.0f); assertEquals(20.0f, tl.measure(2, false, null), 0.0f); assertEquals(100.0f, tl.measure(3, false, null), 0.0f); assertEquals(120.0f, tl.measure(4, false, null), 0.0f); assertEquals(120.0f, tl.measure(5, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(10.0f, tl.measure(1, true, null), 0.0f); assertEquals(10.0f, tl.measure(2, true, null), 0.0f); assertEquals(100.0f, tl.measure(3, true, null), 0.0f); assertEquals(110.0f, tl.measure(4, true, null), 0.0f); assertEquals(110.0f, tl.measure(5, true, null), 0.0f); } @Test public void testMeasure_Tab_BiDi2() { final Object[] spans = { new TabStopSpan.Standard(100) }; final TabStops stops = new TabStops(100, spans); final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("\u05D0I\t\u05D0I", paint, stops); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(-20.0f, tl.measure(1, false, null), 0.0f); assertEquals(-20.0f, tl.measure(2, false, null), 0.0f); assertEquals(-100.0f, tl.measure(3, false, null), 0.0f); assertEquals(-120.0f, tl.measure(4, false, null), 0.0f); assertEquals(-120.0f, tl.measure(5, false, null), 0.0f); assertEquals(-0.0f, tl.measure(0, true, null), 0.0f); assertEquals(-10.0f, tl.measure(1, true, null), 0.0f); assertEquals(-10.0f, tl.measure(2, true, null), 0.0f); assertEquals(-100.0f, tl.measure(3, true, null), 0.0f); assertEquals(-110.0f, tl.measure(4, true, null), 0.0f); assertEquals(-110.0f, tl.measure(5, true, null), 0.0f); } } Loading
core/java/android/text/Layout.java +3 −2 Original line number Diff line number Diff line Loading @@ -1966,12 +1966,13 @@ public abstract class Layout { /** * @hide */ /* package */ static class TabStops { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public static class TabStops { private int[] mStops; private int mNumStops; private int mIncrement; TabStops(int increment, Object[] spans) { public TabStops(int increment, Object[] spans) { reset(increment, spans); } Loading
core/java/android/text/TextLine.java +1 −1 Original line number Diff line number Diff line Loading @@ -313,7 +313,7 @@ public class TextLine { * @return the signed offset from the leading margin to the requested * character edge. */ float measure(int offset, boolean trailing, FontMetricsInt fmi) { public float measure(int offset, boolean trailing, FontMetricsInt fmi) { int target = trailing ? offset - 1 : offset; if (target < 0) { return 0; Loading
core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf +24 B (888 B) File changed.No diff preview for this file type. View original file View changed file
core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx +2 −0 Original line number Diff line number Diff line Loading @@ -144,6 +144,8 @@ <map code="0x0056" name="5em" /> <!-- V --> <map code="0x0058" name="10em" /> <!-- X --> <map code="0x005f" name="0em" /> <!-- _ --> <map code="0x05D0" name="1em" /> <!-- HEBREW LETTER ALEF --> <map code="0x05D1" name="5em" /> <!-- HEBREW LETTER BET --> <map code="0xfffd" name="7em" /> <!-- REPLACEMENT CHAR --> <map code="0x10331" name="10em" /> </cmap_format_12> Loading
core/tests/coretests/src/android/text/TextLineTest.java +256 −0 Original line number Diff line number Diff line Loading @@ -16,13 +16,18 @@ package android.text; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import android.graphics.Typeface; import android.platform.test.annotations.Presubmit; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.filters.Suppress; import android.support.test.runner.AndroidJUnit4; import android.text.Layout.TabStops; import android.text.style.TabStopSpan; import org.junit.Test; import org.junit.runner.RunWith; Loading Loading @@ -66,4 +71,255 @@ public class TextLineTest { final char combining_acute = '\u0301'; assertFalse(stretchesToFullWidth("combining" + nbsp + combining_acute + "acute")); } // The test font has following coverage and width. // U+0020: 10em // U+002E (.): 10em // U+0043 (C): 100em // U+0049 (I): 1em // U+004C (L): 50em // U+0056 (V): 5em // U+0058 (X): 10em // U+005F (_): 0em // U+05D0 : 1em // HEBREW LETTER ALEF // U+05D1 : 5em // HEBREW LETTER BET // U+FFFD (invalid surrogate will be replaced to this): 7em // U+10331 (\uD800\uDF31): 10em private static final Typeface TYPEFACE = Typeface.createFromAsset( InstrumentationRegistry.getInstrumentation().getTargetContext().getAssets(), "fonts/StaticLayoutLineBreakingTestFont.ttf"); private TextLine getTextLine(String str, TextPaint paint, TabStops tabStops) { Layout layout = StaticLayout.Builder.obtain(str, 0, str.length(), paint, Integer.MAX_VALUE) .build(); TextLine tl = TextLine.obtain(); tl.set(paint, str, 0, str.length(), TextDirectionHeuristics.FIRSTSTRONG_LTR.isRtl(str, 0, str.length()) ? -1 : 1, layout.getLineDirections(0), tabStops != null, tabStops); return tl; } private TextLine getTextLine(String str, TextPaint paint) { return getTextLine(str, paint, null); } @Test public void testMeasure_LTR() { final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("IIIIIV", paint); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(10.0f, tl.measure(1, false, null), 0.0f); assertEquals(20.0f, tl.measure(2, false, null), 0.0f); assertEquals(30.0f, tl.measure(3, false, null), 0.0f); assertEquals(40.0f, tl.measure(4, false, null), 0.0f); assertEquals(50.0f, tl.measure(5, false, null), 0.0f); assertEquals(100.0f, tl.measure(6, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(10.0f, tl.measure(1, true, null), 0.0f); assertEquals(20.0f, tl.measure(2, true, null), 0.0f); assertEquals(30.0f, tl.measure(3, true, null), 0.0f); assertEquals(40.0f, tl.measure(4, true, null), 0.0f); assertEquals(50.0f, tl.measure(5, true, null), 0.0f); assertEquals(100.0f, tl.measure(6, true, null), 0.0f); } @Test public void testMeasure_RTL() { final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("\u05D0\u05D0\u05D0\u05D0\u05D0\u05D1", paint); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(-10.0f, tl.measure(1, false, null), 0.0f); assertEquals(-20.0f, tl.measure(2, false, null), 0.0f); assertEquals(-30.0f, tl.measure(3, false, null), 0.0f); assertEquals(-40.0f, tl.measure(4, false, null), 0.0f); assertEquals(-50.0f, tl.measure(5, false, null), 0.0f); assertEquals(-100.0f, tl.measure(6, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(-10.0f, tl.measure(1, true, null), 0.0f); assertEquals(-20.0f, tl.measure(2, true, null), 0.0f); assertEquals(-30.0f, tl.measure(3, true, null), 0.0f); assertEquals(-40.0f, tl.measure(4, true, null), 0.0f); assertEquals(-50.0f, tl.measure(5, true, null), 0.0f); assertEquals(-100.0f, tl.measure(6, true, null), 0.0f); } @Test public void testMeasure_BiDi() { final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("II\u05D0\u05D0II", paint); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(10.0f, tl.measure(1, false, null), 0.0f); assertEquals(40.0f, tl.measure(2, false, null), 0.0f); assertEquals(30.0f, tl.measure(3, false, null), 0.0f); assertEquals(40.0f, tl.measure(4, false, null), 0.0f); assertEquals(50.0f, tl.measure(5, false, null), 0.0f); assertEquals(60.0f, tl.measure(6, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(10.0f, tl.measure(1, true, null), 0.0f); assertEquals(20.0f, tl.measure(2, true, null), 0.0f); assertEquals(30.0f, tl.measure(3, true, null), 0.0f); assertEquals(20.0f, tl.measure(4, true, null), 0.0f); assertEquals(50.0f, tl.measure(5, true, null), 0.0f); assertEquals(60.0f, tl.measure(6, true, null), 0.0f); } private static final String LRI = "\u2066"; // LEFT-TO-RIGHT ISOLATE private static final String RLI = "\u2067"; // RIGHT-TO-LEFT ISOLATE private static final String PDI = "\u2069"; // POP DIRECTIONAL ISOLATE @Test public void testMeasure_BiDi2() { final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("I" + RLI + "I\u05D0\u05D0" + PDI + "I", paint); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(10.0f, tl.measure(1, false, null), 0.0f); assertEquals(30.0f, tl.measure(2, false, null), 0.0f); assertEquals(30.0f, tl.measure(3, false, null), 0.0f); assertEquals(20.0f, tl.measure(4, false, null), 0.0f); assertEquals(40.0f, tl.measure(5, false, null), 0.0f); assertEquals(40.0f, tl.measure(6, false, null), 0.0f); assertEquals(50.0f, tl.measure(7, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(10.0f, tl.measure(1, true, null), 0.0f); assertEquals(10.0f, tl.measure(2, true, null), 0.0f); assertEquals(40.0f, tl.measure(3, true, null), 0.0f); assertEquals(20.0f, tl.measure(4, true, null), 0.0f); assertEquals(10.0f, tl.measure(5, true, null), 0.0f); assertEquals(40.0f, tl.measure(6, true, null), 0.0f); assertEquals(50.0f, tl.measure(7, true, null), 0.0f); } @Test public void testMeasure_BiDi3() { final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("\u05D0" + LRI + "\u05D0II" + PDI + "\u05D0", paint); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(-10.0f, tl.measure(1, false, null), 0.0f); assertEquals(-30.0f, tl.measure(2, false, null), 0.0f); assertEquals(-30.0f, tl.measure(3, false, null), 0.0f); assertEquals(-20.0f, tl.measure(4, false, null), 0.0f); assertEquals(-40.0f, tl.measure(5, false, null), 0.0f); assertEquals(-40.0f, tl.measure(6, false, null), 0.0f); assertEquals(-50.0f, tl.measure(7, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(-10.0f, tl.measure(1, true, null), 0.0f); assertEquals(-10.0f, tl.measure(2, true, null), 0.0f); assertEquals(-40.0f, tl.measure(3, true, null), 0.0f); assertEquals(-20.0f, tl.measure(4, true, null), 0.0f); assertEquals(-10.0f, tl.measure(5, true, null), 0.0f); assertEquals(-40.0f, tl.measure(6, true, null), 0.0f); assertEquals(-50.0f, tl.measure(7, true, null), 0.0f); } @Test public void testMeasure_Tab_LTR() { final Object[] spans = { new TabStopSpan.Standard(100) }; final TabStops stops = new TabStops(100, spans); final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("II\tII", paint, stops); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(10.0f, tl.measure(1, false, null), 0.0f); assertEquals(20.0f, tl.measure(2, false, null), 0.0f); assertEquals(100.0f, tl.measure(3, false, null), 0.0f); assertEquals(110.0f, tl.measure(4, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(10.0f, tl.measure(1, true, null), 0.0f); assertEquals(20.0f, tl.measure(2, true, null), 0.0f); assertEquals(100.0f, tl.measure(3, true, null), 0.0f); assertEquals(110.0f, tl.measure(4, true, null), 0.0f); } @Test public void testMeasure_Tab_RTL() { final Object[] spans = { new TabStopSpan.Standard(100) }; final TabStops stops = new TabStops(100, spans); final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("\u05D0\u05D0\t\u05D0\u05D0", paint, stops); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(-10.0f, tl.measure(1, false, null), 0.0f); assertEquals(-20.0f, tl.measure(2, false, null), 0.0f); assertEquals(-100.0f, tl.measure(3, false, null), 0.0f); assertEquals(-110.0f, tl.measure(4, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(-10.0f, tl.measure(1, true, null), 0.0f); assertEquals(-20.0f, tl.measure(2, true, null), 0.0f); assertEquals(-100.0f, tl.measure(3, true, null), 0.0f); assertEquals(-110.0f, tl.measure(4, true, null), 0.0f); } @Test public void testMeasure_Tab_BiDi() { final Object[] spans = { new TabStopSpan.Standard(100) }; final TabStops stops = new TabStops(100, spans); final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("I\u05D0\tI\u05D0", paint, stops); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(20.0f, tl.measure(1, false, null), 0.0f); assertEquals(20.0f, tl.measure(2, false, null), 0.0f); assertEquals(100.0f, tl.measure(3, false, null), 0.0f); assertEquals(120.0f, tl.measure(4, false, null), 0.0f); assertEquals(120.0f, tl.measure(5, false, null), 0.0f); assertEquals(0.0f, tl.measure(0, true, null), 0.0f); assertEquals(10.0f, tl.measure(1, true, null), 0.0f); assertEquals(10.0f, tl.measure(2, true, null), 0.0f); assertEquals(100.0f, tl.measure(3, true, null), 0.0f); assertEquals(110.0f, tl.measure(4, true, null), 0.0f); assertEquals(110.0f, tl.measure(5, true, null), 0.0f); } @Test public void testMeasure_Tab_BiDi2() { final Object[] spans = { new TabStopSpan.Standard(100) }; final TabStops stops = new TabStops(100, spans); final TextPaint paint = new TextPaint(); paint.setTypeface(TYPEFACE); paint.setTextSize(10.0f); // make 1em = 10px TextLine tl = getTextLine("\u05D0I\t\u05D0I", paint, stops); assertEquals(0.0f, tl.measure(0, false, null), 0.0f); assertEquals(-20.0f, tl.measure(1, false, null), 0.0f); assertEquals(-20.0f, tl.measure(2, false, null), 0.0f); assertEquals(-100.0f, tl.measure(3, false, null), 0.0f); assertEquals(-120.0f, tl.measure(4, false, null), 0.0f); assertEquals(-120.0f, tl.measure(5, false, null), 0.0f); assertEquals(-0.0f, tl.measure(0, true, null), 0.0f); assertEquals(-10.0f, tl.measure(1, true, null), 0.0f); assertEquals(-10.0f, tl.measure(2, true, null), 0.0f); assertEquals(-100.0f, tl.measure(3, true, null), 0.0f); assertEquals(-110.0f, tl.measure(4, true, null), 0.0f); assertEquals(-110.0f, tl.measure(5, true, null), 0.0f); } }