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

Commit 170e0949 authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Fix wrong offset of BiDi text by TextShaper

This CL includes:
- Fix relative offset of BidiRun by reviving width calculation in TextLine.
- Fix bidi level buffer offset. It shuold be relative to the substring, but
  the absolute offset was passed.
- Removed paint argument from PositionedGlyph which is not used.

Bug: 171275519
Test: atest android.graphics.text.cts.TextRunShaperTest
Test: atest android.text.cts.TextShaperTest

Change-Id: I36949089d744bdfae61995210b2051866a7510ac
parent 276718de
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -931,7 +931,8 @@ public class TextLine {
        float totalWidth = 0;

        final int numDecorations = decorations == null ? 0 : decorations.size();
        if (needWidth || (c != null && (wp.bgColor != 0 || numDecorations != 0 || runIsRtl))) {
        if (needWidth || ((c != null || consumer != null) && (wp.bgColor != 0
                || numDecorations != 0 || runIsRtl))) {
            totalWidth = getRunAdvance(wp, start, end, contextStart, contextEnd, runIsRtl, offset);
        }

+5 −1
Original line number Diff line number Diff line
@@ -198,6 +198,10 @@ public class TextShaper {
    /**
     * Shape multi-styled text.
     *
     * In the LTR context, the shape result will go from left to right, thus you may want to draw
     * glyphs from left most position of the canvas. In the RTL context, the shape result will go
     * from right to left, thus you may want to draw glyphs from right most position of the canvas.
     *
     * @param text a styled text.
     * @param start a start index of shaping target in the text.
     * @param count a length of shaping target in the text.
@@ -215,7 +219,7 @@ public class TextShaper {
        try {
            tl.set(paint, text, start, start + count,
                    mp.getParagraphDir(),
                    mp.getDirections(start, start + count),
                    mp.getDirections(0, count),
                    false /* tabstop is not supported */,
                    null,
                    -1, -1 // ellipsis is not supported.
+1 −2
Original line number Diff line number Diff line
@@ -170,9 +170,8 @@ public final class PositionedGlyphs {
     * @hide
     *
     * @param layoutPtr the address of native layout object.
     * @param paint a paint object
     */
    public PositionedGlyphs(long layoutPtr, @NonNull Paint paint, float xOffset, float yOffset) {
    public PositionedGlyphs(long layoutPtr, float xOffset, float yOffset) {
        mLayoutPtr = layoutPtr;
        int glyphCount = nGetGlyphCount(layoutPtr);
        mFonts = new ArrayList<>(glyphCount);
+3 −3
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ public class TextRunShaper {
        return new PositionedGlyphs(
                nativeShapeTextRun(text, start, count, contextStart, contextCount, isRtl,
                        paint.getNativeInstance()),
                paint, xOffset, yOffset);
                xOffset, yOffset);
    }

    /**
@@ -104,7 +104,7 @@ public class TextRunShaper {
                    nativeShapeTextRun(
                            (String) text, start, count, contextStart, contextCount, isRtl,
                            paint.getNativeInstance()),
                    paint, xOffset, yOffset);
                    xOffset, yOffset);
        } else {
            char[] buf = new char[contextCount];
            TextUtils.getChars(text, contextStart, contextStart + contextCount, buf, 0);
@@ -112,7 +112,7 @@ public class TextRunShaper {
                    nativeShapeTextRun(
                            buf, start - contextStart, count,
                            0, contextCount, isRtl, paint.getNativeInstance()),
                    paint, xOffset, yOffset);
                    xOffset, yOffset);
        }
    }