summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/text/MeasuredText.java6
-rw-r--r--core/java/android/text/StaticLayout.java41
2 files changed, 30 insertions, 17 deletions
diff --git a/core/java/android/text/MeasuredText.java b/core/java/android/text/MeasuredText.java
index ce3e2822fa22..9f54d8e2ab7b 100644
--- a/core/java/android/text/MeasuredText.java
+++ b/core/java/android/text/MeasuredText.java
@@ -180,7 +180,7 @@ class MeasuredText {
if (widths != null) {
width = paint.getTextRunAdvances(mChars, p, len, p, len, isRtl, widths, p);
if (mBuilder != null) {
- mBuilder.addMeasuredRun(p, p + len, widths);
+ mBuilder.addMeasuredRun(paint, p, p + len, widths);
}
} else {
width = mBuilder.addStyleRun(paint, p, p + len, isRtl);
@@ -197,7 +197,7 @@ class MeasuredText {
totalAdvance +=
paint.getTextRunAdvances(mChars, q, i - q, q, i - q, isRtl, widths, q);
if (mBuilder != null) {
- mBuilder.addMeasuredRun(q, i, widths);
+ mBuilder.addMeasuredRun(paint, q, i, widths);
}
} else {
totalAdvance += mBuilder.addStyleRun(paint, q, i, isRtl);
@@ -243,7 +243,7 @@ class MeasuredText {
for (int i = mPos + 1, e = mPos + len; i < e; i++)
w[i] = 0;
} else {
- mBuilder.addReplacementRun(mPos, mPos + len, wid);
+ mBuilder.addReplacementRun(paint, mPos, mPos + len, wid);
}
mPos += len;
}
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);