< prev index next >

src/java.desktop/share/classes/sun/java2d/pipe/GlyphListPipe.java

Print this page

        

@@ -51,12 +51,12 @@
 
         float devx, devy;
         if (sg2d.transformState >= SunGraphics2D.TRANSFORM_TRANSLATESCALE) {
             double origin[] = {x + info.originX, y + info.originY};
             sg2d.transform.transform(origin, 0, origin, 0, 1);
-            devx = (float)origin[0];
-            devy = (float)origin[1];
+            devx = (float) closeToHalfInteger(origin[0]);
+            devy = (float) closeToHalfInteger(origin[1]);
         } else {
             devx = (float)(x + info.originX + sg2d.transX);
             devy = (float)(y + info.originY + sg2d.transY);
         }
         /* setFromString returns false if shaping is needed, and we then back

@@ -73,10 +73,21 @@
                                            sg2d.getFontRenderContext());
             tl.draw(sg2d, (float)x, (float)y);
         }
     }
 
+    private static final double MAX_TX_ERROR = .0001;
+
+    private static double closeToHalfInteger(double value) {
+        double d = value + 0.5;
+        int i = (int) Math.floor(d + 0.5);
+        if (Math.abs(d - i) < MAX_TX_ERROR) {
+            return i - 0.5;
+        }
+        return value;
+    }
+
     public void drawChars(SunGraphics2D sg2d,
                           char data[], int offset, int length,
                           int ix, int iy)
     {
         FontInfo info = sg2d.getFontInfo();
< prev index next >