diff options
| -rw-r--r-- | core/java/android/text/ClientFlags.java | 7 | ||||
| -rw-r--r-- | core/java/android/text/MeasuredParagraph.java | 224 | ||||
| -rw-r--r-- | core/java/android/text/TextFlags.java | 2 | ||||
| -rw-r--r-- | core/java/android/text/flags/flags.aconfig | 7 |
4 files changed, 91 insertions, 149 deletions
diff --git a/core/java/android/text/ClientFlags.java b/core/java/android/text/ClientFlags.java index bbe9cdbbce9f..5f2823b7630f 100644 --- a/core/java/android/text/ClientFlags.java +++ b/core/java/android/text/ClientFlags.java @@ -42,13 +42,6 @@ public class ClientFlags { } /** - * @see Flags#icuBidiMigration() - */ - public static boolean icuBidiMigration() { - return TextFlags.isFeatureEnabled(Flags.FLAG_ICU_BIDI_MIGRATION); - } - - /** * @see Flags#fixMisalignedContextMenu() */ public static boolean fixMisalignedContextMenu() { diff --git a/core/java/android/text/MeasuredParagraph.java b/core/java/android/text/MeasuredParagraph.java index 896e08726419..31a226341907 100644 --- a/core/java/android/text/MeasuredParagraph.java +++ b/core/java/android/text/MeasuredParagraph.java @@ -42,8 +42,6 @@ import android.text.style.MetricAffectingSpan; import android.text.style.ReplacementSpan; import android.util.Pools.SynchronizedPool; -import com.android.text.flags.Flags; - import java.util.Arrays; /** @@ -201,14 +199,11 @@ public class MeasuredParagraph { * @hide */ public @Layout.Direction int getParagraphDir() { - if (Flags.icuBidiMigration()) { - if (mBidi == null) { - return Layout.DIR_LEFT_TO_RIGHT; - } - return (mBidi.getParaLevel() & 0x01) == 0 - ? Layout.DIR_LEFT_TO_RIGHT : Layout.DIR_RIGHT_TO_LEFT; + if (mBidi == null) { + return Layout.DIR_LEFT_TO_RIGHT; } - return mParaDir; + return (mBidi.getParaLevel() & 0x01) == 0 + ? Layout.DIR_LEFT_TO_RIGHT : Layout.DIR_RIGHT_TO_LEFT; } /** @@ -219,71 +214,62 @@ public class MeasuredParagraph { */ public Directions getDirections(@IntRange(from = 0) int start, // inclusive @IntRange(from = 0) int end) { // exclusive - if (Flags.icuBidiMigration()) { - // Easy case: mBidi == null means the text is all LTR and no bidi suppot is needed. - if (mBidi == null) { - return Layout.DIRS_ALL_LEFT_TO_RIGHT; - } + // Easy case: mBidi == null means the text is all LTR and no bidi suppot is needed. + if (mBidi == null) { + return Layout.DIRS_ALL_LEFT_TO_RIGHT; + } - // Easy case: If the original text only contains single directionality run, the - // substring is only single run. - if (start == end) { - if ((mBidi.getParaLevel() & 0x01) == 0) { - return Layout.DIRS_ALL_LEFT_TO_RIGHT; - } else { - return Layout.DIRS_ALL_RIGHT_TO_LEFT; - } + // Easy case: If the original text only contains single directionality run, the + // substring is only single run. + if (start == end) { + if ((mBidi.getParaLevel() & 0x01) == 0) { + return Layout.DIRS_ALL_LEFT_TO_RIGHT; + } else { + return Layout.DIRS_ALL_RIGHT_TO_LEFT; } + } - // Okay, now we need to generate the line instance. - Bidi bidi = mBidi.createLineBidi(start, end); - - // Easy case: If the line instance only contains single directionality run, no need - // to reorder visually. - if (bidi.getRunCount() == 1) { - if (bidi.getRunLevel(0) == 1) { - return Layout.DIRS_ALL_RIGHT_TO_LEFT; - } else if (bidi.getRunLevel(0) == 0) { - return Layout.DIRS_ALL_LEFT_TO_RIGHT; - } else { - return new Directions(new int[] { - 0, bidi.getRunLevel(0) << Layout.RUN_LEVEL_SHIFT | (end - start)}); - } - } + // Okay, now we need to generate the line instance. + Bidi bidi = mBidi.createLineBidi(start, end); - // Reorder directionality run visually. - byte[] levels = new byte[bidi.getRunCount()]; - for (int i = 0; i < bidi.getRunCount(); ++i) { - levels[i] = (byte) bidi.getRunLevel(i); + // Easy case: If the line instance only contains single directionality run, no need + // to reorder visually. + if (bidi.getRunCount() == 1) { + if (bidi.getRunLevel(0) == 1) { + return Layout.DIRS_ALL_RIGHT_TO_LEFT; + } else if (bidi.getRunLevel(0) == 0) { + return Layout.DIRS_ALL_LEFT_TO_RIGHT; + } else { + return new Directions(new int[] { + 0, bidi.getRunLevel(0) << Layout.RUN_LEVEL_SHIFT | (end - start)}); } - int[] visualOrders = Bidi.reorderVisual(levels); - - int[] dirs = new int[bidi.getRunCount() * 2]; - for (int i = 0; i < bidi.getRunCount(); ++i) { - int vIndex; - if ((mBidi.getBaseLevel() & 0x01) == 1) { - // For the historical reasons, if the base directionality is RTL, the Android - // draws from the right, i.e. the visually reordered run needs to be reversed. - vIndex = visualOrders[bidi.getRunCount() - i - 1]; - } else { - vIndex = visualOrders[i]; - } + } - // Special packing of dire - dirs[i * 2] = bidi.getRunStart(vIndex); - dirs[i * 2 + 1] = bidi.getRunLevel(vIndex) << Layout.RUN_LEVEL_SHIFT - | (bidi.getRunLimit(vIndex) - dirs[i * 2]); + // Reorder directionality run visually. + byte[] levels = new byte[bidi.getRunCount()]; + for (int i = 0; i < bidi.getRunCount(); ++i) { + levels[i] = (byte) bidi.getRunLevel(i); + } + int[] visualOrders = Bidi.reorderVisual(levels); + + int[] dirs = new int[bidi.getRunCount() * 2]; + for (int i = 0; i < bidi.getRunCount(); ++i) { + int vIndex; + if ((mBidi.getBaseLevel() & 0x01) == 1) { + // For the historical reasons, if the base directionality is RTL, the Android + // draws from the right, i.e. the visually reordered run needs to be reversed. + vIndex = visualOrders[bidi.getRunCount() - i - 1]; + } else { + vIndex = visualOrders[i]; } - return new Directions(dirs); - } - if (mLtrWithoutBidi) { - return Layout.DIRS_ALL_LEFT_TO_RIGHT; + // Special packing of dire + dirs[i * 2] = bidi.getRunStart(vIndex); + dirs[i * 2 + 1] = bidi.getRunLevel(vIndex) << Layout.RUN_LEVEL_SHIFT + | (bidi.getRunLimit(vIndex) - dirs[i * 2]); } - final int length = end - start; - return AndroidBidi.directions(mParaDir, mLevels.getRawArray(), start, mCopiedBuffer, start, - length); + return new Directions(dirs); } /** @@ -681,84 +667,56 @@ public class MeasuredParagraph { } } - if (Flags.icuBidiMigration()) { - if ((textDir == TextDirectionHeuristics.LTR - || textDir == TextDirectionHeuristics.FIRSTSTRONG_LTR - || textDir == TextDirectionHeuristics.ANYRTL_LTR) - && TextUtils.doesNotNeedBidi(mCopiedBuffer, 0, mTextLength)) { - mLevels.clear(); - mLtrWithoutBidi = true; - return; - } - final int bidiRequest; - if (textDir == TextDirectionHeuristics.LTR) { - bidiRequest = Bidi.LTR; - } else if (textDir == TextDirectionHeuristics.RTL) { - bidiRequest = Bidi.RTL; - } else if (textDir == TextDirectionHeuristics.FIRSTSTRONG_LTR) { - bidiRequest = Bidi.LEVEL_DEFAULT_LTR; - } else if (textDir == TextDirectionHeuristics.FIRSTSTRONG_RTL) { - bidiRequest = Bidi.LEVEL_DEFAULT_RTL; - } else { - final boolean isRtl = textDir.isRtl(mCopiedBuffer, 0, mTextLength); - bidiRequest = isRtl ? Bidi.RTL : Bidi.LTR; - } - mBidi = new Bidi(mCopiedBuffer, 0, null, 0, mCopiedBuffer.length, bidiRequest); - - if (mCopiedBuffer.length > 0 - && mBidi.getParagraphIndex(mCopiedBuffer.length - 1) != 0) { - // Historically, the MeasuredParagraph does not treat the CR letters as paragraph - // breaker but ICU BiDi treats it as paragraph breaker. In the MeasureParagraph, - // the given range always represents a single paragraph, so if the BiDi object has - // multiple paragraph, it should contains a CR letters in the text. Using CR is not - // common in Android and also it should not penalize the easy case, e.g. all LTR, - // check the paragraph count here and replace the CR letters and re-calculate - // BiDi again. - for (int i = 0; i < mTextLength; ++i) { - if (Character.isSurrogate(mCopiedBuffer[i])) { - // All block separators are in BMP. - continue; - } - if (UCharacter.getDirection(mCopiedBuffer[i]) - == UCharacterDirection.BLOCK_SEPARATOR) { - mCopiedBuffer[i] = OBJECT_REPLACEMENT_CHARACTER; - } - } - mBidi = new Bidi(mCopiedBuffer, 0, null, 0, mCopiedBuffer.length, bidiRequest); - } - mLevels.resize(mTextLength); - byte[] rawArray = mLevels.getRawArray(); - for (int i = 0; i < mTextLength; ++i) { - rawArray[i] = mBidi.getLevelAt(i); - } - mLtrWithoutBidi = false; - return; - } if ((textDir == TextDirectionHeuristics.LTR || textDir == TextDirectionHeuristics.FIRSTSTRONG_LTR || textDir == TextDirectionHeuristics.ANYRTL_LTR) && TextUtils.doesNotNeedBidi(mCopiedBuffer, 0, mTextLength)) { mLevels.clear(); - mParaDir = Layout.DIR_LEFT_TO_RIGHT; mLtrWithoutBidi = true; + return; + } + final int bidiRequest; + if (textDir == TextDirectionHeuristics.LTR) { + bidiRequest = Bidi.LTR; + } else if (textDir == TextDirectionHeuristics.RTL) { + bidiRequest = Bidi.RTL; + } else if (textDir == TextDirectionHeuristics.FIRSTSTRONG_LTR) { + bidiRequest = Bidi.LEVEL_DEFAULT_LTR; + } else if (textDir == TextDirectionHeuristics.FIRSTSTRONG_RTL) { + bidiRequest = Bidi.LEVEL_DEFAULT_RTL; } else { - final int bidiRequest; - if (textDir == TextDirectionHeuristics.LTR) { - bidiRequest = Layout.DIR_REQUEST_LTR; - } else if (textDir == TextDirectionHeuristics.RTL) { - bidiRequest = Layout.DIR_REQUEST_RTL; - } else if (textDir == TextDirectionHeuristics.FIRSTSTRONG_LTR) { - bidiRequest = Layout.DIR_REQUEST_DEFAULT_LTR; - } else if (textDir == TextDirectionHeuristics.FIRSTSTRONG_RTL) { - bidiRequest = Layout.DIR_REQUEST_DEFAULT_RTL; - } else { - final boolean isRtl = textDir.isRtl(mCopiedBuffer, 0, mTextLength); - bidiRequest = isRtl ? Layout.DIR_REQUEST_RTL : Layout.DIR_REQUEST_LTR; + final boolean isRtl = textDir.isRtl(mCopiedBuffer, 0, mTextLength); + bidiRequest = isRtl ? Bidi.RTL : Bidi.LTR; + } + mBidi = new Bidi(mCopiedBuffer, 0, null, 0, mCopiedBuffer.length, bidiRequest); + + if (mCopiedBuffer.length > 0 + && mBidi.getParagraphIndex(mCopiedBuffer.length - 1) != 0) { + // Historically, the MeasuredParagraph does not treat the CR letters as paragraph + // breaker but ICU BiDi treats it as paragraph breaker. In the MeasureParagraph, + // the given range always represents a single paragraph, so if the BiDi object has + // multiple paragraph, it should contains a CR letters in the text. Using CR is not + // common in Android and also it should not penalize the easy case, e.g. all LTR, + // check the paragraph count here and replace the CR letters and re-calculate + // BiDi again. + for (int i = 0; i < mTextLength; ++i) { + if (Character.isSurrogate(mCopiedBuffer[i])) { + // All block separators are in BMP. + continue; + } + if (UCharacter.getDirection(mCopiedBuffer[i]) + == UCharacterDirection.BLOCK_SEPARATOR) { + mCopiedBuffer[i] = OBJECT_REPLACEMENT_CHARACTER; + } } - mLevels.resize(mTextLength); - mParaDir = AndroidBidi.bidi(bidiRequest, mCopiedBuffer, mLevels.getRawArray()); - mLtrWithoutBidi = false; + mBidi = new Bidi(mCopiedBuffer, 0, null, 0, mCopiedBuffer.length, bidiRequest); + } + mLevels.resize(mTextLength); + byte[] rawArray = mLevels.getRawArray(); + for (int i = 0; i < mTextLength; ++i) { + rawArray[i] = mBidi.getLevelAt(i); } + mLtrWithoutBidi = false; } private void applyReplacementRun(@NonNull ReplacementSpan replacement, diff --git a/core/java/android/text/TextFlags.java b/core/java/android/text/TextFlags.java index 0f1b031a8fad..8ee2ad0ef35e 100644 --- a/core/java/android/text/TextFlags.java +++ b/core/java/android/text/TextFlags.java @@ -57,7 +57,6 @@ public final class TextFlags { public static final String[] TEXT_ACONFIGS_FLAGS = { Flags.FLAG_NO_BREAK_NO_HYPHENATION_SPAN, Flags.FLAG_FIX_LINE_HEIGHT_FOR_LOCALE, - Flags.FLAG_ICU_BIDI_MIGRATION, Flags.FLAG_FIX_MISALIGNED_CONTEXT_MENU, }; @@ -69,7 +68,6 @@ public final class TextFlags { public static final boolean[] TEXT_ACONFIG_DEFAULT_VALUE = { Flags.noBreakNoHyphenationSpan(), Flags.fixLineHeightForLocale(), - Flags.icuBidiMigration(), Flags.fixMisalignedContextMenu(), }; diff --git a/core/java/android/text/flags/flags.aconfig b/core/java/android/text/flags/flags.aconfig index 34b6c840dd6a..e827cbedf503 100644 --- a/core/java/android/text/flags/flags.aconfig +++ b/core/java/android/text/flags/flags.aconfig @@ -113,13 +113,6 @@ flag { } flag { - name: "icu_bidi_migration" - namespace: "text" - description: "A flag for replacing AndroidBidi with android.icu.text.Bidi." - bug: "317144801" -} - -flag { name: "lazy_variation_instance" namespace: "text" description: "A flag for enabling lazy variation instance creation." |