diff options
Diffstat (limited to 'core/java/android/text/StaticLayout.java')
| -rw-r--r-- | core/java/android/text/StaticLayout.java | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index b6911fe8cb29..e71ad5b21fcf 100644 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -28,6 +28,7 @@ import android.text.style.LineHeightSpan; import android.text.style.MetricAffectingSpan; import android.text.style.TabStopSpan; import android.util.Log; +import android.util.Pair; import android.util.Pools.SynchronizedPool; import com.android.internal.util.ArrayUtils; @@ -439,29 +440,34 @@ public class StaticLayout extends Layout { * After all paragraphs, call finish() to release expensive buffers. */ - /* package */ float addStyleRun(TextPaint paint, int start, int end, boolean isRtl) { + private Pair<String, long[]> getLocaleAndHyphenatorIfChanged(TextPaint paint) { final LocaleList locales = paint.getTextLocales(); final String languageTags; long[] hyphenators; if (!locales.equals(mLocales)) { - languageTags = locales.toLanguageTags(); - hyphenators = getHyphenators(locales); + mLocales = locales; + return new Pair(locales.toLanguageTags(), getHyphenators(locales)); } else { // passing null means keep current locale. // TODO: move locale change detection to native. - languageTags = null; - hyphenators = null; + return new Pair(null, null); } + } + + /* package */ float addStyleRun(TextPaint paint, int start, int end, boolean isRtl) { + Pair<String, long[]> locHyph = getLocaleAndHyphenatorIfChanged(paint); return nAddStyleRun(mNativePtr, paint.getNativeInstance(), start, end, isRtl, - languageTags, hyphenators); + locHyph.first, locHyph.second); } - /* package */ void addMeasuredRun(int start, int end, float[] widths) { - nAddMeasuredRun(mNativePtr, start, end, widths); + /* package */ void addMeasuredRun(TextPaint paint, int start, int end, float[] widths) { + Pair<String, long[]> locHyph = getLocaleAndHyphenatorIfChanged(paint); + nAddMeasuredRun(mNativePtr, start, end, widths, locHyph.first, locHyph.second); } - /* package */ void addReplacementRun(int start, int end, float width) { - nAddReplacementRun(mNativePtr, start, end, width); + /* package */ void addReplacementRun(TextPaint paint, int start, int end, float width) { + Pair<String, long[]> locHyph = getLocaleAndHyphenatorIfChanged(paint); + nAddReplacementRun(mNativePtr, start, end, width, locHyph.first, locHyph.second); } /** @@ -810,6 +816,9 @@ public class StaticLayout extends Layout { } } + // TODO: Move locale tracking code to native. + b.mLocales = null; // Reset the locale tracking. + nSetupParagraph(b.mNativePtr, chs, paraEnd - paraStart, firstWidth, firstWidthLineCount, restWidth, variableTabStops, TAB_INCREMENT, b.mBreakStrategy, b.mHyphenationFrequency, @@ -1539,14 +1548,18 @@ public class StaticLayout extends Layout { @IntRange(from = 0) int indentsOffset); private static native float nAddStyleRun( - /* non zero */ long nativePtr, /* non zero */ long nativePaint, + /* non-zero */ long nativePtr, /* non-zero */ long nativePaint, @IntRange(from = 0) int start, @IntRange(from = 0) int end, boolean isRtl, @Nullable String languageTags, @Nullable long[] hyphenators); - private static native void nAddMeasuredRun(long nativePtr, - int start, int end, float[] widths); + private static native void nAddMeasuredRun(/* non-zero */ long nativePtr, + @IntRange(from = 0) int start, @IntRange(from = 0) int end, @NonNull float[] widths, + @Nullable String languageTags, @Nullable long[] hyphenators); - private static native void nAddReplacementRun(long nativePtr, int start, int end, float width); + private static native void nAddReplacementRun(/* non-zero */ long nativePtr, + @IntRange(from = 0) int start, @IntRange(from = 0) int end, + @FloatRange(from = 0.0f) float width, @Nullable String languageTags, + @Nullable long[] hyphenators); private static native void nGetWidths(long nativePtr, float[] widths); |
