Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6f75525b authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Fix crash due to inconsistent handling of CR

ICU BiDi handles CR as paragraph separator but Android doen't do it.
To minimize the performane penalty, recompute the BiDi only when the
CR letter is present.

Bug: 330051215
Test: atest StaticLayoutTest#testNotCrashByCRCharacter
Change-Id: Ie86a9fda7f2452eb913154e79a59fe19f060c5f8
parent e2f574dd
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -700,6 +700,22 @@ public class MeasuredParagraph {
                bidiRequest = isRtl ? Bidi.RTL : Bidi.LTR;
            }
            mBidi = new Bidi(mCopiedBuffer, 0, null, 0, mCopiedBuffer.length, bidiRequest);

            if (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 (mCopiedBuffer[i] == '\r') {
                        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) {