<rdar://problem/9018212> Underline thickness is not uniform under non-integral scale...
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 Apr 2011 22:15:32 +0000 (22:15 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 Apr 2011 22:15:32 +0000 (22:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=58083

Reviewed by Simon Fraser.

Source/WebCore:

Test: fast/text/decorations-transformed.html

* platform/graphics/GraphicsContext.h: Added a RoundingMode enum with two values. RoundAllSides
is the existing rounding mode, where each side of the rectangle snaps to the nearest pixel
gridline. RoundOriginAndDimensions snaps the origin to the nearest pixel gridpoint and rounds
the width and the height. In this new mode, translating a rectangle in user space never changes
its dimensions in device pixels.
* platform/graphics/cg/GraphicsContextCG.cpp:
(WebCore::GraphicsContext::roundToDevicePixels): Implemented RoundOriginAndDimensions.
(WebCore::GraphicsContext::drawLineForText): Use RoundOriginAndDimensions, thus ensuring that
all underlines have the same thickness in device pixels.
* platform/graphics/openvg/GraphicsContextOpenVG.cpp:
(WebCore::GraphicsContext::roundToDevicePixels): Added RoundingMode parameter, but did not implement it.
* platform/graphics/qt/GraphicsContextQt.cpp:
(WebCore::GraphicsContext::roundToDevicePixels): Ditto.
* platform/graphics/skia/GraphicsContextSkia.cpp:
(WebCore::GraphicsContext::roundToDevicePixels): Ditto.
* platform/graphics/wince/GraphicsContextWinCE.cpp:
(WebCore::GraphicsContext::roundToDevicePixels): Ditto.
* platform/graphics/wx/GraphicsContextWx.cpp:
(WebCore::GraphicsContext::roundToDevicePixels): Ditto.
* rendering/InlineTextBox.cpp:
(WebCore::InlineTextBox::paintDecoration):

LayoutTests:

* fast/text/decorations-transformed.html: Added.
* platform/mac/fast/text/decorations-transformed-expected.checksum: Added.
* platform/mac/fast/text/decorations-transformed-expected.png: Added.
* platform/mac/fast/text/decorations-transformed-expected.txt: Added.

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

13 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/text/decorations-transformed.html [new file with mode: 0644]
LayoutTests/platform/mac/fast/text/decorations-transformed-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/fast/text/decorations-transformed-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/fast/text/decorations-transformed-expected.txt [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/GraphicsContext.h
Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp
Source/WebCore/platform/graphics/openvg/GraphicsContextOpenVG.cpp
Source/WebCore/platform/graphics/qt/GraphicsContextQt.cpp
Source/WebCore/platform/graphics/skia/GraphicsContextSkia.cpp
Source/WebCore/platform/graphics/wince/GraphicsContextWinCE.cpp
Source/WebCore/platform/graphics/wx/GraphicsContextWx.cpp

index fb6f8747d21ae46a14324ca6d9df610518447600..aa6c2088513d5615eebd802575fa7846a8d8d4d1 100644 (file)
@@ -1,3 +1,15 @@
+2011-04-07  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Simon Fraser.
+
+        <rdar://problem/9018212> Underline thickness is not uniform under non-integral scale factor
+        https://bugs.webkit.org/show_bug.cgi?id=58083
+
+        * fast/text/decorations-transformed.html: Added.
+        * platform/mac/fast/text/decorations-transformed-expected.checksum: Added.
+        * platform/mac/fast/text/decorations-transformed-expected.png: Added.
+        * platform/mac/fast/text/decorations-transformed-expected.txt: Added.
+
 2011-04-07  Jer Noble  <jer.noble@apple.com>
 
         Unreviewed; Add the media/media-fullscreen-inline.html test to the mac-snowleopard Skipped list.
diff --git a/LayoutTests/fast/text/decorations-transformed.html b/LayoutTests/fast/text/decorations-transformed.html
new file mode 100644 (file)
index 0000000..93fcc78
--- /dev/null
@@ -0,0 +1,27 @@
+<body>
+    <script>
+        function addTest(scaleFactor)
+        {
+            var div = document.createElement("div");
+            div.style.float = "left";
+            div.style.marginRight = 100 * (scaleFactor - 1) + "px";
+            div.style.webkitTransform = "scale(" + scaleFactor + ")";
+            div.style.webkitTransformOrigin = "0 0";
+            div.style.textDecoration = "underline";
+            div.style.fontFamily = "ahem";
+            for (var i = 0; i < 15; ++i) {
+                div.appendChild(document.createTextNode("\u00a0\u00a0\u00a0\u00a0"));
+                div.appendChild(document.createElement("br"));
+            }
+            document.body.appendChild(div);
+        }
+
+        addTest(1.15);
+        addTest(1.2);
+        addTest(1.22);
+        addTest(1.3);
+        addTest(1.45);
+        addTest(1.55);
+        addTest(1.75);
+    </script>
+</body>
diff --git a/LayoutTests/platform/mac/fast/text/decorations-transformed-expected.checksum b/LayoutTests/platform/mac/fast/text/decorations-transformed-expected.checksum
new file mode 100644 (file)
index 0000000..e1559a2
--- /dev/null
@@ -0,0 +1 @@
+0fabab9479e04544c9aebf1a421df2b5
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/fast/text/decorations-transformed-expected.png b/LayoutTests/platform/mac/fast/text/decorations-transformed-expected.png
new file mode 100644 (file)
index 0000000..72f9123
Binary files /dev/null and b/LayoutTests/platform/mac/fast/text/decorations-transformed-expected.png differ
diff --git a/LayoutTests/platform/mac/fast/text/decorations-transformed-expected.txt b/LayoutTests/platform/mac/fast/text/decorations-transformed-expected.txt
new file mode 100644 (file)
index 0000000..9d6f20c
--- /dev/null
@@ -0,0 +1,334 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+layer at (8,8) size 64x240
+  RenderBlock (floating) {DIV} at (0,0) size 64x240
+    RenderText {#text} at (0,0) size 64x16
+      text run at (0,0) width 64: "    "
+    RenderBR {BR} at (64,13) size 0x0
+    RenderText {#text} at (0,16) size 64x16
+      text run at (0,16) width 64: "    "
+    RenderBR {BR} at (64,29) size 0x0
+    RenderText {#text} at (0,32) size 64x16
+      text run at (0,32) width 64: "    "
+    RenderBR {BR} at (64,45) size 0x0
+    RenderText {#text} at (0,48) size 64x16
+      text run at (0,48) width 64: "    "
+    RenderBR {BR} at (64,61) size 0x0
+    RenderText {#text} at (0,64) size 64x16
+      text run at (0,64) width 64: "    "
+    RenderBR {BR} at (64,77) size 0x0
+    RenderText {#text} at (0,80) size 64x16
+      text run at (0,80) width 64: "    "
+    RenderBR {BR} at (64,93) size 0x0
+    RenderText {#text} at (0,96) size 64x16
+      text run at (0,96) width 64: "    "
+    RenderBR {BR} at (64,109) size 0x0
+    RenderText {#text} at (0,112) size 64x16
+      text run at (0,112) width 64: "    "
+    RenderBR {BR} at (64,125) size 0x0
+    RenderText {#text} at (0,128) size 64x16
+      text run at (0,128) width 64: "    "
+    RenderBR {BR} at (64,141) size 0x0
+    RenderText {#text} at (0,144) size 64x16
+      text run at (0,144) width 64: "    "
+    RenderBR {BR} at (64,157) size 0x0
+    RenderText {#text} at (0,160) size 64x16
+      text run at (0,160) width 64: "    "
+    RenderBR {BR} at (64,173) size 0x0
+    RenderText {#text} at (0,176) size 64x16
+      text run at (0,176) width 64: "    "
+    RenderBR {BR} at (64,189) size 0x0
+    RenderText {#text} at (0,192) size 64x16
+      text run at (0,192) width 64: "    "
+    RenderBR {BR} at (64,205) size 0x0
+    RenderText {#text} at (0,208) size 64x16
+      text run at (0,208) width 64: "    "
+    RenderBR {BR} at (64,221) size 0x0
+    RenderText {#text} at (0,224) size 64x16
+      text run at (0,224) width 64: "    "
+    RenderBR {BR} at (64,237) size 0x0
+layer at (87,8) size 64x240
+  RenderBlock (floating) {DIV} at (79,0) size 64x240
+    RenderText {#text} at (0,0) size 64x16
+      text run at (0,0) width 64: "    "
+    RenderBR {BR} at (64,13) size 0x0
+    RenderText {#text} at (0,16) size 64x16
+      text run at (0,16) width 64: "    "
+    RenderBR {BR} at (64,29) size 0x0
+    RenderText {#text} at (0,32) size 64x16
+      text run at (0,32) width 64: "    "
+    RenderBR {BR} at (64,45) size 0x0
+    RenderText {#text} at (0,48) size 64x16
+      text run at (0,48) width 64: "    "
+    RenderBR {BR} at (64,61) size 0x0
+    RenderText {#text} at (0,64) size 64x16
+      text run at (0,64) width 64: "    "
+    RenderBR {BR} at (64,77) size 0x0
+    RenderText {#text} at (0,80) size 64x16
+      text run at (0,80) width 64: "    "
+    RenderBR {BR} at (64,93) size 0x0
+    RenderText {#text} at (0,96) size 64x16
+      text run at (0,96) width 64: "    "
+    RenderBR {BR} at (64,109) size 0x0
+    RenderText {#text} at (0,112) size 64x16
+      text run at (0,112) width 64: "    "
+    RenderBR {BR} at (64,125) size 0x0
+    RenderText {#text} at (0,128) size 64x16
+      text run at (0,128) width 64: "    "
+    RenderBR {BR} at (64,141) size 0x0
+    RenderText {#text} at (0,144) size 64x16
+      text run at (0,144) width 64: "    "
+    RenderBR {BR} at (64,157) size 0x0
+    RenderText {#text} at (0,160) size 64x16
+      text run at (0,160) width 64: "    "
+    RenderBR {BR} at (64,173) size 0x0
+    RenderText {#text} at (0,176) size 64x16
+      text run at (0,176) width 64: "    "
+    RenderBR {BR} at (64,189) size 0x0
+    RenderText {#text} at (0,192) size 64x16
+      text run at (0,192) width 64: "    "
+    RenderBR {BR} at (64,205) size 0x0
+    RenderText {#text} at (0,208) size 64x16
+      text run at (0,208) width 64: "    "
+    RenderBR {BR} at (64,221) size 0x0
+    RenderText {#text} at (0,224) size 64x16
+      text run at (0,224) width 64: "    "
+    RenderBR {BR} at (64,237) size 0x0
+layer at (171,8) size 64x240
+  RenderBlock (floating) {DIV} at (163,0) size 64x240
+    RenderText {#text} at (0,0) size 64x16
+      text run at (0,0) width 64: "    "
+    RenderBR {BR} at (64,13) size 0x0
+    RenderText {#text} at (0,16) size 64x16
+      text run at (0,16) width 64: "    "
+    RenderBR {BR} at (64,29) size 0x0
+    RenderText {#text} at (0,32) size 64x16
+      text run at (0,32) width 64: "    "
+    RenderBR {BR} at (64,45) size 0x0
+    RenderText {#text} at (0,48) size 64x16
+      text run at (0,48) width 64: "    "
+    RenderBR {BR} at (64,61) size 0x0
+    RenderText {#text} at (0,64) size 64x16
+      text run at (0,64) width 64: "    "
+    RenderBR {BR} at (64,77) size 0x0
+    RenderText {#text} at (0,80) size 64x16
+      text run at (0,80) width 64: "    "
+    RenderBR {BR} at (64,93) size 0x0
+    RenderText {#text} at (0,96) size 64x16
+      text run at (0,96) width 64: "    "
+    RenderBR {BR} at (64,109) size 0x0
+    RenderText {#text} at (0,112) size 64x16
+      text run at (0,112) width 64: "    "
+    RenderBR {BR} at (64,125) size 0x0
+    RenderText {#text} at (0,128) size 64x16
+      text run at (0,128) width 64: "    "
+    RenderBR {BR} at (64,141) size 0x0
+    RenderText {#text} at (0,144) size 64x16
+      text run at (0,144) width 64: "    "
+    RenderBR {BR} at (64,157) size 0x0
+    RenderText {#text} at (0,160) size 64x16
+      text run at (0,160) width 64: "    "
+    RenderBR {BR} at (64,173) size 0x0
+    RenderText {#text} at (0,176) size 64x16
+      text run at (0,176) width 64: "    "
+    RenderBR {BR} at (64,189) size 0x0
+    RenderText {#text} at (0,192) size 64x16
+      text run at (0,192) width 64: "    "
+    RenderBR {BR} at (64,205) size 0x0
+    RenderText {#text} at (0,208) size 64x16
+      text run at (0,208) width 64: "    "
+    RenderBR {BR} at (64,221) size 0x0
+    RenderText {#text} at (0,224) size 64x16
+      text run at (0,224) width 64: "    "
+    RenderBR {BR} at (64,237) size 0x0
+layer at (257,8) size 64x240
+  RenderBlock (floating) {DIV} at (249,0) size 64x240
+    RenderText {#text} at (0,0) size 64x16
+      text run at (0,0) width 64: "    "
+    RenderBR {BR} at (64,13) size 0x0
+    RenderText {#text} at (0,16) size 64x16
+      text run at (0,16) width 64: "    "
+    RenderBR {BR} at (64,29) size 0x0
+    RenderText {#text} at (0,32) size 64x16
+      text run at (0,32) width 64: "    "
+    RenderBR {BR} at (64,45) size 0x0
+    RenderText {#text} at (0,48) size 64x16
+      text run at (0,48) width 64: "    "
+    RenderBR {BR} at (64,61) size 0x0
+    RenderText {#text} at (0,64) size 64x16
+      text run at (0,64) width 64: "    "
+    RenderBR {BR} at (64,77) size 0x0
+    RenderText {#text} at (0,80) size 64x16
+      text run at (0,80) width 64: "    "
+    RenderBR {BR} at (64,93) size 0x0
+    RenderText {#text} at (0,96) size 64x16
+      text run at (0,96) width 64: "    "
+    RenderBR {BR} at (64,109) size 0x0
+    RenderText {#text} at (0,112) size 64x16
+      text run at (0,112) width 64: "    "
+    RenderBR {BR} at (64,125) size 0x0
+    RenderText {#text} at (0,128) size 64x16
+      text run at (0,128) width 64: "    "
+    RenderBR {BR} at (64,141) size 0x0
+    RenderText {#text} at (0,144) size 64x16
+      text run at (0,144) width 64: "    "
+    RenderBR {BR} at (64,157) size 0x0
+    RenderText {#text} at (0,160) size 64x16
+      text run at (0,160) width 64: "    "
+    RenderBR {BR} at (64,173) size 0x0
+    RenderText {#text} at (0,176) size 64x16
+      text run at (0,176) width 64: "    "
+    RenderBR {BR} at (64,189) size 0x0
+    RenderText {#text} at (0,192) size 64x16
+      text run at (0,192) width 64: "    "
+    RenderBR {BR} at (64,205) size 0x0
+    RenderText {#text} at (0,208) size 64x16
+      text run at (0,208) width 64: "    "
+    RenderBR {BR} at (64,221) size 0x0
+    RenderText {#text} at (0,224) size 64x16
+      text run at (0,224) width 64: "    "
+    RenderBR {BR} at (64,237) size 0x0
+layer at (351,8) size 64x240
+  RenderBlock (floating) {DIV} at (343,0) size 64x240
+    RenderText {#text} at (0,0) size 64x16
+      text run at (0,0) width 64: "    "
+    RenderBR {BR} at (64,13) size 0x0
+    RenderText {#text} at (0,16) size 64x16
+      text run at (0,16) width 64: "    "
+    RenderBR {BR} at (64,29) size 0x0
+    RenderText {#text} at (0,32) size 64x16
+      text run at (0,32) width 64: "    "
+    RenderBR {BR} at (64,45) size 0x0
+    RenderText {#text} at (0,48) size 64x16
+      text run at (0,48) width 64: "    "
+    RenderBR {BR} at (64,61) size 0x0
+    RenderText {#text} at (0,64) size 64x16
+      text run at (0,64) width 64: "    "
+    RenderBR {BR} at (64,77) size 0x0
+    RenderText {#text} at (0,80) size 64x16
+      text run at (0,80) width 64: "    "
+    RenderBR {BR} at (64,93) size 0x0
+    RenderText {#text} at (0,96) size 64x16
+      text run at (0,96) width 64: "    "
+    RenderBR {BR} at (64,109) size 0x0
+    RenderText {#text} at (0,112) size 64x16
+      text run at (0,112) width 64: "    "
+    RenderBR {BR} at (64,125) size 0x0
+    RenderText {#text} at (0,128) size 64x16
+      text run at (0,128) width 64: "    "
+    RenderBR {BR} at (64,141) size 0x0
+    RenderText {#text} at (0,144) size 64x16
+      text run at (0,144) width 64: "    "
+    RenderBR {BR} at (64,157) size 0x0
+    RenderText {#text} at (0,160) size 64x16
+      text run at (0,160) width 64: "    "
+    RenderBR {BR} at (64,173) size 0x0
+    RenderText {#text} at (0,176) size 64x16
+      text run at (0,176) width 64: "    "
+    RenderBR {BR} at (64,189) size 0x0
+    RenderText {#text} at (0,192) size 64x16
+      text run at (0,192) width 64: "    "
+    RenderBR {BR} at (64,205) size 0x0
+    RenderText {#text} at (0,208) size 64x16
+      text run at (0,208) width 64: "    "
+    RenderBR {BR} at (64,221) size 0x0
+    RenderText {#text} at (0,224) size 64x16
+      text run at (0,224) width 64: "    "
+    RenderBR {BR} at (64,237) size 0x0
+layer at (460,8) size 64x240
+  RenderBlock (floating) {DIV} at (452,0) size 64x240
+    RenderText {#text} at (0,0) size 64x16
+      text run at (0,0) width 64: "    "
+    RenderBR {BR} at (64,13) size 0x0
+    RenderText {#text} at (0,16) size 64x16
+      text run at (0,16) width 64: "    "
+    RenderBR {BR} at (64,29) size 0x0
+    RenderText {#text} at (0,32) size 64x16
+      text run at (0,32) width 64: "    "
+    RenderBR {BR} at (64,45) size 0x0
+    RenderText {#text} at (0,48) size 64x16
+      text run at (0,48) width 64: "    "
+    RenderBR {BR} at (64,61) size 0x0
+    RenderText {#text} at (0,64) size 64x16
+      text run at (0,64) width 64: "    "
+    RenderBR {BR} at (64,77) size 0x0
+    RenderText {#text} at (0,80) size 64x16
+      text run at (0,80) width 64: "    "
+    RenderBR {BR} at (64,93) size 0x0
+    RenderText {#text} at (0,96) size 64x16
+      text run at (0,96) width 64: "    "
+    RenderBR {BR} at (64,109) size 0x0
+    RenderText {#text} at (0,112) size 64x16
+      text run at (0,112) width 64: "    "
+    RenderBR {BR} at (64,125) size 0x0
+    RenderText {#text} at (0,128) size 64x16
+      text run at (0,128) width 64: "    "
+    RenderBR {BR} at (64,141) size 0x0
+    RenderText {#text} at (0,144) size 64x16
+      text run at (0,144) width 64: "    "
+    RenderBR {BR} at (64,157) size 0x0
+    RenderText {#text} at (0,160) size 64x16
+      text run at (0,160) width 64: "    "
+    RenderBR {BR} at (64,173) size 0x0
+    RenderText {#text} at (0,176) size 64x16
+      text run at (0,176) width 64: "    "
+    RenderBR {BR} at (64,189) size 0x0
+    RenderText {#text} at (0,192) size 64x16
+      text run at (0,192) width 64: "    "
+    RenderBR {BR} at (64,205) size 0x0
+    RenderText {#text} at (0,208) size 64x16
+      text run at (0,208) width 64: "    "
+    RenderBR {BR} at (64,221) size 0x0
+    RenderText {#text} at (0,224) size 64x16
+      text run at (0,224) width 64: "    "
+    RenderBR {BR} at (64,237) size 0x0
+layer at (579,8) size 64x240
+  RenderBlock (floating) {DIV} at (571,0) size 64x240
+    RenderText {#text} at (0,0) size 64x16
+      text run at (0,0) width 64: "    "
+    RenderBR {BR} at (64,13) size 0x0
+    RenderText {#text} at (0,16) size 64x16
+      text run at (0,16) width 64: "    "
+    RenderBR {BR} at (64,29) size 0x0
+    RenderText {#text} at (0,32) size 64x16
+      text run at (0,32) width 64: "    "
+    RenderBR {BR} at (64,45) size 0x0
+    RenderText {#text} at (0,48) size 64x16
+      text run at (0,48) width 64: "    "
+    RenderBR {BR} at (64,61) size 0x0
+    RenderText {#text} at (0,64) size 64x16
+      text run at (0,64) width 64: "    "
+    RenderBR {BR} at (64,77) size 0x0
+    RenderText {#text} at (0,80) size 64x16
+      text run at (0,80) width 64: "    "
+    RenderBR {BR} at (64,93) size 0x0
+    RenderText {#text} at (0,96) size 64x16
+      text run at (0,96) width 64: "    "
+    RenderBR {BR} at (64,109) size 0x0
+    RenderText {#text} at (0,112) size 64x16
+      text run at (0,112) width 64: "    "
+    RenderBR {BR} at (64,125) size 0x0
+    RenderText {#text} at (0,128) size 64x16
+      text run at (0,128) width 64: "    "
+    RenderBR {BR} at (64,141) size 0x0
+    RenderText {#text} at (0,144) size 64x16
+      text run at (0,144) width 64: "    "
+    RenderBR {BR} at (64,157) size 0x0
+    RenderText {#text} at (0,160) size 64x16
+      text run at (0,160) width 64: "    "
+    RenderBR {BR} at (64,173) size 0x0
+    RenderText {#text} at (0,176) size 64x16
+      text run at (0,176) width 64: "    "
+    RenderBR {BR} at (64,189) size 0x0
+    RenderText {#text} at (0,192) size 64x16
+      text run at (0,192) width 64: "    "
+    RenderBR {BR} at (64,205) size 0x0
+    RenderText {#text} at (0,208) size 64x16
+      text run at (0,208) width 64: "    "
+    RenderBR {BR} at (64,221) size 0x0
+    RenderText {#text} at (0,224) size 64x16
+      text run at (0,224) width 64: "    "
+    RenderBR {BR} at (64,237) size 0x0
index dca05b808f254baec75eb3b1c146eafaa3e4d051..e92d4ffcce27bfbea0e834924c1d6614d77ed12b 100644 (file)
@@ -1,3 +1,34 @@
+2011-04-07  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Simon Fraser.
+
+        <rdar://problem/9018212> Underline thickness is not uniform under non-integral scale factor
+        https://bugs.webkit.org/show_bug.cgi?id=58083
+
+        Test: fast/text/decorations-transformed.html
+
+        * platform/graphics/GraphicsContext.h: Added a RoundingMode enum with two values. RoundAllSides
+        is the existing rounding mode, where each side of the rectangle snaps to the nearest pixel
+        gridline. RoundOriginAndDimensions snaps the origin to the nearest pixel gridpoint and rounds
+        the width and the height. In this new mode, translating a rectangle in user space never changes
+        its dimensions in device pixels.
+        * platform/graphics/cg/GraphicsContextCG.cpp:
+        (WebCore::GraphicsContext::roundToDevicePixels): Implemented RoundOriginAndDimensions.
+        (WebCore::GraphicsContext::drawLineForText): Use RoundOriginAndDimensions, thus ensuring that
+        all underlines have the same thickness in device pixels.
+        * platform/graphics/openvg/GraphicsContextOpenVG.cpp:
+        (WebCore::GraphicsContext::roundToDevicePixels): Added RoundingMode parameter, but did not implement it.
+        * platform/graphics/qt/GraphicsContextQt.cpp:
+        (WebCore::GraphicsContext::roundToDevicePixels): Ditto.
+        * platform/graphics/skia/GraphicsContextSkia.cpp:
+        (WebCore::GraphicsContext::roundToDevicePixels): Ditto.
+        * platform/graphics/wince/GraphicsContextWinCE.cpp:
+        (WebCore::GraphicsContext::roundToDevicePixels): Ditto.
+        * platform/graphics/wx/GraphicsContextWx.cpp:
+        (WebCore::GraphicsContext::roundToDevicePixels): Ditto.
+        * rendering/InlineTextBox.cpp:
+        (WebCore::InlineTextBox::paintDecoration):
+
 2011-04-06  Vitaly Repeshko  <vitalyr@chromium.org>
 
         Reviewed by Nate Chapin.
index 991d0473aa9ae75bfa17bd3e019e376811fbf4ac..4c725bea5ebcc5a308acceef18c251f891600d9f 100644 (file)
@@ -349,7 +349,11 @@ namespace WebCore {
         void drawBidiText(const Font&, const TextRun&, const FloatPoint&);
         void drawHighlightForText(const Font&, const TextRun&, const FloatPoint&, int h, const Color& backgroundColor, ColorSpace, int from = 0, int to = -1);
 
-        FloatRect roundToDevicePixels(const FloatRect&);
+        enum RoundingMode {
+            RoundAllSides,
+            RoundOriginAndDimensions
+        };
+        FloatRect roundToDevicePixels(const FloatRect&, RoundingMode = RoundAllSides);
 
         void drawLineForText(const FloatPoint&, float width, bool printing);
         enum TextCheckingLineStyle {
index 7799137e32f8034e4ba5b2879c0f54d13df350dc..9ac53b030898fae0d201ffd996502b2f656bd5b6 100644 (file)
@@ -1167,7 +1167,7 @@ AffineTransform GraphicsContext::getCTM() const
     return AffineTransform(t.a, t.b, t.c, t.d, t.tx, t.ty);
 }
 
-FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& rect)
+FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& rect, RoundingMode roundingMode)
 {
     // It is not enough just to round to pixels in device space. The rotation part of the
     // affine transform matrix to device space can mess with this conversion if we have a
@@ -1192,8 +1192,13 @@ FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& rect)
 
     deviceOrigin.x = roundf(deviceOrigin.x);
     deviceOrigin.y = roundf(deviceOrigin.y);
-    deviceLowerRight.x = roundf(deviceLowerRight.x);
-    deviceLowerRight.y = roundf(deviceLowerRight.y);
+    if (roundingMode == RoundAllSides) {
+        deviceLowerRight.x = roundf(deviceLowerRight.x);
+        deviceLowerRight.y = roundf(deviceLowerRight.y);
+    } else {
+        deviceLowerRight.x = deviceOrigin.x + roundf(rect.width() * deviceScaleX);
+        deviceLowerRight.y = deviceOrigin.y + roundf(rect.height() * deviceScaleY);
+    }
 
     // Don't let the height or width round to 0 unless either was originally 0
     if (deviceOrigin.y == deviceLowerRight.y && rect.height())
@@ -1232,7 +1237,7 @@ void GraphicsContext::drawLineForText(const FloatPoint& point, float width, bool
         // We try to round all parameters to integer boundaries in device space. If rounding pixels in device space
         // makes our thickness more than double, then there must be a shrinking-scale factor and rounding to pixels
         // in device space will make the underlines too thick.
-        CGRect lineRect = roundToDevicePixels(FloatRect(x, y, lineLength, adjustedThickness));
+        CGRect lineRect = roundToDevicePixels(FloatRect(x, y, lineLength, adjustedThickness), RoundOriginAndDimensions);
         if (lineRect.size.height < thickness * 2.0) {
             x = lineRect.origin.x;
             y = lineRect.origin.y;
index 75dbadb2273945f892172293f516f9cf40fa5ac1..159569245967c9ad491b3806b09c90ead4d09043 100644 (file)
@@ -257,7 +257,7 @@ void GraphicsContext::drawLineForTextChecking(const IntPoint& origin, int width,
     UNUSED_PARAM(style);
 }
 
-FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& rect)
+FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& rect, RoundingMode)
 {
     if (paintingDisabled())
         return FloatRect();
index e3e0fa689b3ad2c70807d83b81da3defcf88a374..a3a08ebf212c4beeea785b40a7ee2b166f30fe73 100644 (file)
@@ -900,7 +900,7 @@ void GraphicsContext::drawLineForTextChecking(const FloatPoint&, float, TextChec
     notImplemented();
 }
 
-FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& frect)
+FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& frect, RoundingMode)
 {
     // It is not enough just to round to pixels in device space. The rotation part of the
     // affine transform matrix to device space can mess with this conversion if we have a
index 6d57fb87fc20f9ac4f8389f2888c5679162282cd..fd5d147cd57e6443242d92f93a014e59b84ce8ed 100644 (file)
@@ -868,7 +868,7 @@ AffineTransform GraphicsContext::getCTM() const
                            SkScalarToDouble(m.getTranslateY()));
 }
 
-FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& rect)
+FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& rect, RoundingMode)
 {
     return rect;
 }
index 19683dffd23b758f73f4506e113381802b4ff5dc..e501621d15fc8bb19f3dc74dadc92a53604ff83c 100644 (file)
@@ -1300,7 +1300,7 @@ void GraphicsContext::drawRoundCorner(bool needsNewClip, RECT clipRect, RECT rec
 }
 
 
-FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& frect)
+FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& frect, RoundingMode)
 {
     notImplemented();
     return frect;
index 47f32115e755d4225564671a4f94c10dec386377..071df47a13f4affc0e1e01288d0d0f7db8fb745a 100644 (file)
@@ -416,7 +416,7 @@ void GraphicsContext::scale(const FloatSize& scale)
 }
 
 
-FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& frect)
+FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& frect, RoundingMode)
 {
     FloatRect result;