<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 fb6f874..aa6c208 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 dca05b8..e92d4ff 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 991d047..4c725be 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 7799137..9ac53b0 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 75dbadb..1595692 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 e3e0fa6..a3a08eb 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 6d57fb8..fd5d147 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 19683df..e501621 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 47f3211..071df47 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;