Skip to content

Commit

Permalink
Fix Layout.primaryIsTrailingPreviousAllLineOffsets
Browse files Browse the repository at this point in the history
The CL fixes a crash in Layout.primaryIsTrailingPreviousAllLineOffsets.
The crash was happening when the method was called for a line beginning
with an empty bidi run. This could happen, for example, for empty text -
I was unable to find any other case. The CL improves the existing test
for the method with this case, which was previously crashing.

The CL also fixes a potential crash in getLineHorizontals. However, this
bug could never happen as in the current code path clamped is always
false (and kept as parameter for parity with getHorizontal).

Bug: 135444178
Test: atest FrameworksCoreTests:android.text.LayoutTest\#testPrimaryIsTrailingPrevious
Change-Id: I47157abe1d74675884734e3810628a566e40c1b4
  • Loading branch information
mihaipopa12 committed Jun 25, 2019
1 parent d701e95 commit 7ad499d
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 3 deletions.
9 changes: 6 additions & 3 deletions core/java/android/text/Layout.java
Original file line number Diff line number Diff line change
Expand Up @@ -1122,6 +1122,9 @@ public boolean[] primaryIsTrailingPreviousAllLineOffsets(int line) {
if (limit > lineEnd) {
limit = lineEnd;
}
if (limit == start) {
continue;
}
level[limit - lineStart - 1] =
(byte) ((runs[i + 1] >>> RUN_LEVEL_SHIFT) & RUN_LEVEL_MASK);
}
Expand Down Expand Up @@ -1220,8 +1223,8 @@ private float getHorizontal(int offset, boolean trailing, int line, boolean clam
}

/**
* Computes in linear time the results of calling
* #getHorizontal for all offsets on a line.
* Computes in linear time the results of calling #getHorizontal for all offsets on a line.
*
* @param line The line giving the offsets we compute information for
* @param clamped Whether to clamp the results to the width of the layout
* @param primary Whether the results should be the primary or the secondary horizontal
Expand Down Expand Up @@ -1257,7 +1260,7 @@ private float[] getLineHorizontals(int line, boolean clamped, boolean primary) {
TextLine.recycle(tl);

if (clamped) {
for (int offset = 0; offset <= wid.length; ++offset) {
for (int offset = 0; offset < wid.length; ++offset) {
if (wid[offset] > mWidth) {
wid[offset] = mWidth;
}
Expand Down
3 changes: 3 additions & 0 deletions core/tests/coretests/src/android/text/LayoutTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -743,6 +743,9 @@ public void testPrimaryIsTrailingPrevious() {
assertPrimaryIsTrailingPrevious(
RTL + LRI + RTL + LTR + PDI + RTL,
new boolean[]{false, false, true, false, false, false, false});
assertPrimaryIsTrailingPrevious(
"",
new boolean[]{false});
}
}

0 comments on commit 7ad499d

Please sign in to comment.