Reviewed by Darin Adler.
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Dec 2007 19:37:12 +0000 (19:37 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Dec 2007 19:37:12 +0000 (19:37 +0000)
        - fix <rdar://problem/5643663> text-shadow and box-shadow offsets 1px smaller than specified
          which is the root cause of:
          http://bugs.webkit.org/show_bug.cgi?id=12943
          box-shadow: small values don't affect shadow position
          http://bugs.webkit.org/show_bug.cgi?id=14736
          Safari implementation of text-shadow off by 1px

        * platform/graphics/cg/GraphicsContextCG.cpp:
        (WebCore::GraphicsContext::setShadow): Slightly increase the magnitude
        of the offsets passed to CGContextSetShadow* to ensure that the end
        result after truncation is the desired integer offsets.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@28714 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/graphics/cg/GraphicsContextCG.cpp

index 14093d5303680a0ec59e744d1a3932f3f6b93ee1..0af29b07a5bf5b7ac4128cfac39a9938fca328b4 100644 (file)
@@ -1,3 +1,19 @@
+2007-12-14  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Darin Adler.
+
+        - fix <rdar://problem/5643663> text-shadow and box-shadow offsets 1px smaller than specified
+          which is the root cause of:
+          http://bugs.webkit.org/show_bug.cgi?id=12943
+          box-shadow: small values don't affect shadow position
+          http://bugs.webkit.org/show_bug.cgi?id=14736
+          Safari implementation of text-shadow off by 1px
+
+        * platform/graphics/cg/GraphicsContextCG.cpp:
+        (WebCore::GraphicsContext::setShadow): Slightly increase the magnitude
+        of the offsets passed to CGContextSetShadow* to ensure that the end
+        result after truncation is the desired integer offsets.
+
 2007-12-13  Alp Toker  <alp@atoker.com>
 
         curl backend build fix for breakage introduced in r28709.
index 16aa10ea11385d7871f215dc38e00bd26511e943..fc9d58687fae0834bca8b7ab4a4665245ca0d44f 100644 (file)
@@ -30,6 +30,7 @@
 #if PLATFORM(CG)
 
 #include "AffineTransform.h"
+#include "FloatConversion.h"
 #include "GraphicsContextPlatformPrivate.h"
 #include "KURL.h"
 #include "Path.h"
@@ -509,15 +510,35 @@ void GraphicsContext::setShadow(const IntSize& size, int blur, const Color& colo
 
     if (paintingDisabled())
         return;
+    CGContextRef context = platformContext();
+
+    CGFloat width = size.width();
+    CGFloat height = size.height();
+
+#if PLATFORM(MAC)
+    // Work around <rdar://problem/5539388> by ensuring that the offsets will get truncated
+    // to the desired integer.
+    // FIXME: This is not needed post-Leopard.
+    static const CGFloat extraShadowOffset = narrowPrecisionToCGFloat(1.0 / 128);
+    if (width > 0)
+        width += extraShadowOffset;
+    else if (width < 0)
+        width -= extraShadowOffset;
+
+    if (height > 0)
+        height += extraShadowOffset;
+    else if (height < 0)
+        height -= extraShadowOffset;
+#endif
+
     // Check for an invalid color, as this means that the color was not set for the shadow
     // and we should therefore just use the default shadow color.
-    CGContextRef context = platformContext();
     if (!color.isValid())
-        CGContextSetShadow(context, CGSizeMake(size.width(), -size.height()), blur); // y is flipped.
+        CGContextSetShadow(context, CGSizeMake(width, -height), blur); // y is flipped.
     else {
         CGColorRef colorCG = cgColor(color);
         CGContextSetShadowWithColor(context,
-                                    CGSizeMake(size.width(), -size.height()), // y is flipped.
+                                    CGSizeMake(width, -height), // y is flipped.
                                     blur, 
                                     colorCG);
         CGColorRelease(colorCG);