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
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user