summaryrefslogtreecommitdiff
path: root/core/java/android/text/StaticLayout.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/text/StaticLayout.java')
-rw-r--r--core/java/android/text/StaticLayout.java41
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);