OSDN Git Service

Fix line height problem with inline images in StaticLayout.
authorRoozbeh Pournader <roozbeh@google.com>
Fri, 16 Oct 2015 09:27:03 +0000 (02:27 -0700)
committerRoozbeh Pournader <roozbeh@google.com>
Fri, 16 Oct 2015 09:49:13 +0000 (02:49 -0700)
Previously, paragraphs with ImageSpans in their middle would continue to
carry the height of the image into the line height of next lines. This was
a regression from L.

The bug was due to StaticLayout's out() method almost always
modifying the value of its parameter "fm", although that was only
intended when there were LineHeightSpans in the text. The method
generate() was assuming that it can restore fmTop etc to metrics of
the current span by setting them from "fm" after out() was run, while
"fm" was modified by out() and its original values was lost!

The fix makes sure to set chooseHt back to null if there were no
LineHeightSpans, so out() would not modify "fm" unless necessary.

AOSP bug: https://code.google.com/p/android/issues/detail?id=188042
Bug: 24548073

Change-Id: I0d00af384c35a9d863377972318da9db7668118f

core/java/android/text/StaticLayout.java

index b0b08db..fdc6cb1 100644 (file)
@@ -627,7 +627,9 @@ public class StaticLayout extends Layout {
 
                 chooseHt = getParagraphSpans(spanned, paraStart, paraEnd, LineHeightSpan.class);
 
-                if (chooseHt.length != 0) {
+                if (chooseHt.length == 0) {
+                    chooseHt = null; // So that out() would not assume it has any contents
+                } else {
                     if (chooseHtv == null ||
                         chooseHtv.length < chooseHt.length) {
                         chooseHtv = ArrayUtils.newUnpaddedIntArray(chooseHt.length);
@@ -810,7 +812,7 @@ public class StaticLayout extends Layout {
 
                     v = out(source, here, endPos,
                             fmAscent, fmDescent, fmTop, fmBottom,
-                            v, spacingmult, spacingadd, chooseHt,chooseHtv, fm, flags[breakIndex],
+                            v, spacingmult, spacingadd, chooseHt, chooseHtv, fm, flags[breakIndex],
                             needMultiply, chdirs, dir, easy, bufEnd, includepad, trackpad,
                             chs, widths, paraStart, ellipsize, ellipsizedWidth,
                             lineWidths[breakIndex], paint, moreChars);