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

Commit eb189d39 authored by Gilles Debunne's avatar Gilles Debunne Committed by Android (Google) Code Review
Browse files

Merge "Performance improvement in TextView" into ics-mr1

parents 09cbff02 8a439ac7
Loading
Loading
Loading
Loading
+17 −7
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ class TextLine {
     * @param hasTabs true if the line might contain tabs or emoji
     * @param tabStops the tabStops. Can be null.
     */
    @SuppressWarnings("null")
    void set(TextPaint paint, CharSequence text, int start, int limit, int dir,
            Directions directions, boolean hasTabs, TabStops tabStops) {
        mPaint = paint;
@@ -134,11 +135,12 @@ class TextLine {
        mSpanned = null;

        boolean hasReplacement = false;
        SpanSet<ReplacementSpan> replacementSpans = null;
        if (text instanceof Spanned) {
            mSpanned = (Spanned) text;
            ReplacementSpan[] spans = mSpanned.getSpans(start, limit, ReplacementSpan.class);
            spans = TextUtils.removeEmptySpans(spans, mSpanned, ReplacementSpan.class);
            hasReplacement = spans.length > 0;
            replacementSpans = new SpanSet<ReplacementSpan>(mSpanned, start, limit,
                    ReplacementSpan.class);
            hasReplacement = replacementSpans.numberOfSpans > 0;
        }

        mCharsValid = hasReplacement || hasTabs || directions != Layout.DIRS_ALL_LEFT_TO_RIGHT;
@@ -156,10 +158,9 @@ class TextLine {
                // zero-width characters.
                char[] chars = mChars;
                for (int i = start, inext; i < limit; i = inext) {
                    inext = mSpanned.nextSpanTransition(i, limit, ReplacementSpan.class);
                    ReplacementSpan[] spans = mSpanned.getSpans(i, inext, ReplacementSpan.class);
                    spans = TextUtils.removeEmptySpans(spans, mSpanned, ReplacementSpan.class);
                    if (spans.length > 0) {
                    // replacementSpans cannot be null if hasReplacement is true
                    inext = replacementSpans.getNextTransition(i, limit);
                    if (replacementSpans.hasSpansIntersecting(i, inext)) {
                        // transition into a span
                        chars[i - start] = '\ufffc';
                        for (int j = i - start + 1, e = inext - start; j < e; ++j) {
@@ -908,6 +909,15 @@ class TextLine {
            numberOfSpans = count;
        }

        public boolean hasSpansIntersecting(int start, int end) {
            for (int i = 0; i < numberOfSpans; i++) {
                // equal test is valid since both intervals are not empty by construction
                if (spanStarts[i] >= end || spanEnds[i] <= start) continue;
                return true;
            }
            return false;
        }

        int getNextTransition(int start, int limit) {
            for (int i = 0; i < numberOfSpans; i++) {
                final int spanStart = spanStarts[i];