OSDN Git Service

round subpixels up to next integer in measureText DO NOT MERGE
authorVictoria Lease <violets@google.com>
Tue, 26 Feb 2013 19:18:42 +0000 (11:18 -0800)
committerVictoria Lease <violets@google.com>
Wed, 27 Feb 2013 19:38:05 +0000 (11:38 -0800)
A common source of layout bugs we're seeing these days involves the
output of measureText() being fed into StaticLayout's constructor.
measureText() returns subpixel-accurate values, but StaticLayout only
takes integral bounds, resulting in the subpixel portion of the
bounds being truncated. This leaves StaticLayout with insufficient
space to layout the text that was just measured, causing all manner
of unexpected line breaks.

This could be causing issues elsewhere, as well. Until our text
pipeline is fully subpixel-perfect, it's best that measureText
guarantee that the value it returns will be sufficient to contain
the text, even if cast to int.

Cherry-pick of Ib84947f0d0a1229287f5b19b99e7efd40f5317f7

Bug: 8164205
Change-Id: I69795ba5770112c0a3d0e752158076a8d1646b1a

graphics/java/android/graphics/Paint.java

index 7d99fec..8da20f2 100644 (file)
@@ -1197,14 +1197,14 @@ public class Paint {
             return 0f;
         }
         if (!mHasCompatScaling) {
-            return native_measureText(text, index, count);
+            return (float) Math.ceil(native_measureText(text, index, count));
         }
 
         final float oldSize = getTextSize();
         setTextSize(oldSize*mCompatScaling);
         float w = native_measureText(text, index, count);
         setTextSize(oldSize);
-        return w*mInvCompatScaling;
+        return (float) Math.ceil(w*mInvCompatScaling);
     }
 
     private native float native_measureText(char[] text, int index, int count);
@@ -1229,14 +1229,14 @@ public class Paint {
             return 0f;
         }
         if (!mHasCompatScaling) {
-            return native_measureText(text, start, end);
+            return (float) Math.ceil(native_measureText(text, start, end));
         }
 
         final float oldSize = getTextSize();
         setTextSize(oldSize*mCompatScaling);
         float w = native_measureText(text, start, end);
         setTextSize(oldSize);
-        return w*mInvCompatScaling;
+        return (float) Math.ceil(w*mInvCompatScaling);
     }
 
     private native float native_measureText(String text, int start, int end);
@@ -1256,12 +1256,14 @@ public class Paint {
             return 0f;
         }
 
-        if (!mHasCompatScaling) return native_measureText(text);
+        if (!mHasCompatScaling) {
+            return (float) Math.ceil(native_measureText(text));
+        }
         final float oldSize = getTextSize();
         setTextSize(oldSize*mCompatScaling);
         float w = native_measureText(text);
         setTextSize(oldSize);
-        return w*mInvCompatScaling;
+        return (float) Math.ceil(w*mInvCompatScaling);
     }
 
     private native float native_measureText(String text);