<rdar://problem/9155067> REGRESSION (float-based line boxes): Gaps and overlaps in...
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 1 May 2011 09:19:17 +0000 (09:19 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 1 May 2011 09:19:17 +0000 (09:19 +0000)
https://bugs.webkit.org/show_bug.cgi?id=56658

Reviewed by Anders Carlsson.

Source/WebCore:

Test: fast/text/selection-rect-rounding.html

* platform/graphics/FontFastPath.cpp:
(WebCore::Font::selectionRectForSimpleText): Account for non-integral anchor point coordinates.
* platform/graphics/mac/FontComplexTextMac.cpp:
(WebCore::Font::selectionRectForComplexText): Ditto.
* rendering/InlineTextBox.cpp:
(WebCore::InlineTextBox::selectionRect): Floor the horizontal sides of the clip rect.
(WebCore::InlineTextBox::paintSelection): Pass the logical left location to Font::selectionRectForText(),
since it affects rounding.

LayoutTests:

* fast/text/selection-rect-rounding.html: Added.
* platform/mac/fast/text/selection-rect-rounding-expected.png: Added.
* platform/mac/fast/text/selection-rect-rounding-expected.txt: Added.

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

LayoutTests/ChangeLog
LayoutTests/fast/text/selection-rect-rounding.html [new file with mode: 0644]
LayoutTests/platform/mac/fast/text/selection-rect-rounding-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/fast/text/selection-rect-rounding-expected.txt [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/FontFastPath.cpp
Source/WebCore/platform/graphics/mac/FontComplexTextMac.cpp
Source/WebCore/rendering/InlineTextBox.cpp

index bf591af..459927b 100644 (file)
@@ -1,3 +1,14 @@
+2011-05-01  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/9155067> REGRESSION (float-based line boxes): Gaps and overlaps in selection highlight
+        https://bugs.webkit.org/show_bug.cgi?id=56658
+
+        * fast/text/selection-rect-rounding.html: Added.
+        * platform/mac/fast/text/selection-rect-rounding-expected.png: Added.
+        * platform/mac/fast/text/selection-rect-rounding-expected.txt: Added.
+
 2011-04-30  Justin Schuh  <jschuh@chromium.org>
 
         Reviewed by Dirk Schulze.
diff --git a/LayoutTests/fast/text/selection-rect-rounding.html b/LayoutTests/fast/text/selection-rect-rounding.html
new file mode 100644 (file)
index 0000000..8731541
--- /dev/null
@@ -0,0 +1,7 @@
+<style>
+    div::selection { background-color: green; }
+</style>
+<div id="target" style="font: 11px 'lucida grande'; color: transparent; width: 100px; overflow: hidden;">i  x  m  n  o  p  q  r  s  t  u  v  w  x  y  z  i  x  m  n  o  p  q  r  s  t  u  v  w  x  y  z  i  x  m  n  o  p  q  r  s  t  u  v  w  x  y  z  i  x  m  n  o  p  q  r  s  t  u  v  w  x  y  z  i  x  m  n  o  p  q  r  s  t  u  v  w  x  y  z  i  x  m  n  o  p  q  r  s  t  u  </div>
+<script>
+    getSelection().setBaseAndExtent(target, 0, target, 1);
+</script>
diff --git a/LayoutTests/platform/mac/fast/text/selection-rect-rounding-expected.png b/LayoutTests/platform/mac/fast/text/selection-rect-rounding-expected.png
new file mode 100644 (file)
index 0000000..eaf9664
Binary files /dev/null and b/LayoutTests/platform/mac/fast/text/selection-rect-rounding-expected.png differ
diff --git a/LayoutTests/platform/mac/fast/text/selection-rect-rounding-expected.txt b/LayoutTests/platform/mac/fast/text/selection-rect-rounding-expected.txt
new file mode 100644 (file)
index 0000000..0a1f879
--- /dev/null
@@ -0,0 +1,101 @@
+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 100x117
+  RenderBlock {DIV} at (0,0) size 100x117 [color=#00000000]
+    RenderText {#text} at (0,0) size 100x117
+      text run at (0,0) width 7: "i "
+      text run at (6,0) width 11: "x "
+      text run at (16,0) width 15: "m "
+      text run at (30,0) width 11: "n "
+      text run at (40,0) width 12: "o "
+      text run at (51,0) width 11: "p "
+      text run at (61,0) width 11: "q "
+      text run at (71,0) width 9: "r "
+      text run at (79,0) width 11: "s "
+      text run at (89,0) width 5: "t"
+      text run at (0,13) width 11: "u "
+      text run at (10,13) width 10: "v "
+      text run at (19,13) width 13: "w "
+      text run at (31,13) width 11: "x "
+      text run at (41,13) width 10: "y "
+      text run at (50,13) width 11: "z "
+      text run at (60,13) width 8: "i "
+      text run at (67,13) width 11: "x "
+      text run at (77,13) width 15: "m "
+      text run at (91,13) width 8: "n"
+      text run at (0,26) width 11: "o "
+      text run at (10,26) width 11: "p "
+      text run at (20,26) width 12: "q "
+      text run at (31,26) width 9: "r "
+      text run at (39,26) width 10: "s "
+      text run at (48,26) width 8: "t "
+      text run at (55,26) width 12: "u "
+      text run at (66,26) width 10: "v "
+      text run at (75,26) width 13: "w "
+      text run at (87,26) width 7: "x"
+      text run at (0,39) width 10: "y "
+      text run at (9,39) width 11: "z "
+      text run at (19,39) width 7: "i "
+      text run at (25,39) width 11: "x "
+      text run at (35,39) width 15: "m "
+      text run at (49,39) width 11: "n "
+      text run at (59,39) width 12: "o "
+      text run at (70,39) width 11: "p "
+      text run at (80,39) width 12: "q "
+      text run at (91,39) width 5: "r"
+      text run at (0,52) width 10: "s "
+      text run at (9,52) width 8: "t "
+      text run at (16,52) width 11: "u "
+      text run at (26,52) width 11: "v "
+      text run at (36,52) width 13: "w "
+      text run at (48,52) width 11: "x "
+      text run at (58,52) width 10: "y "
+      text run at (67,52) width 11: "z "
+      text run at (77,52) width 8: "i "
+      text run at (84,52) width 7: "x"
+      text run at (0,65) width 14: "m "
+      text run at (13,65) width 12: "n "
+      text run at (24,65) width 11: "o "
+      text run at (34,65) width 11: "p "
+      text run at (44,65) width 12: "q "
+      text run at (55,65) width 9: "r "
+      text run at (63,65) width 10: "s "
+      text run at (72,65) width 8: "t "
+      text run at (79,65) width 12: "u "
+      text run at (90,65) width 6: "v"
+      text run at (0,78) width 12: "w "
+      text run at (11,78) width 12: "x "
+      text run at (22,78) width 10: "y "
+      text run at (31,78) width 11: "z "
+      text run at (41,78) width 7: "i "
+      text run at (47,78) width 12: "x "
+      text run at (58,78) width 14: "m "
+      text run at (71,78) width 12: "n "
+      text run at (82,78) width 11: "o "
+      text run at (92,78) width 8: "p"
+      text run at (0,91) width 11: "q "
+      text run at (10,91) width 9: "r "
+      text run at (18,91) width 10: "s "
+      text run at (27,91) width 9: "t "
+      text run at (35,91) width 11: "u "
+      text run at (45,91) width 10: "v "
+      text run at (54,91) width 13: "w "
+      text run at (66,91) width 11: "x "
+      text run at (76,91) width 10: "y "
+      text run at (85,91) width 11: "z "
+      text run at (95,91) width 4: "i"
+      text run at (0,104) width 11: "x "
+      text run at (10,104) width 14: "m "
+      text run at (23,104) width 12: "n "
+      text run at (34,104) width 11: "o "
+      text run at (44,104) width 11: "p "
+      text run at (54,104) width 12: "q "
+      text run at (65,104) width 9: "r "
+      text run at (73,104) width 10: "s "
+      text run at (82,104) width 8: "t "
+      text run at (89,104) width 8: "u"
+selection start: position 0 of child 0 {#text} of child 0 {DIV} of body
+selection end:   position 271 of child 0 {#text} of child 0 {DIV} of body
index 1d7b842..637fb72 100644 (file)
@@ -1,3 +1,21 @@
+2011-05-01  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        <rdar://problem/9155067> REGRESSION (float-based line boxes): Gaps and overlaps in selection highlight
+        https://bugs.webkit.org/show_bug.cgi?id=56658
+
+        Test: fast/text/selection-rect-rounding.html
+
+        * platform/graphics/FontFastPath.cpp:
+        (WebCore::Font::selectionRectForSimpleText): Account for non-integral anchor point coordinates.
+        * platform/graphics/mac/FontComplexTextMac.cpp:
+        (WebCore::Font::selectionRectForComplexText): Ditto.
+        * rendering/InlineTextBox.cpp:
+        (WebCore::InlineTextBox::selectionRect): Floor the horizontal sides of the clip rect.
+        (WebCore::InlineTextBox::paintSelection): Pass the logical left location to Font::selectionRectForText(),
+        since it affects rounding.
+
 2011-04-30  Justin Schuh  <jschuh@chromium.org>
 
         Reviewed by Dirk Schulze.
index b741ca0..b2447b8 100644 (file)
@@ -473,10 +473,10 @@ FloatRect Font::selectionRectForSimpleText(const TextRun& run, const FloatPoint&
     if (run.rtl()) {
         it.advance(run.length());
         float totalWidth = it.m_runWidthSoFar;
-        return FloatRect(point.x() + floorf(totalWidth - afterWidth), point.y(), roundf(totalWidth - beforeWidth) - floorf(totalWidth - afterWidth), h);
+        return FloatRect(floorf(point.x() + totalWidth - afterWidth), point.y(), roundf(point.x() + totalWidth - beforeWidth) - floorf(point.x() + totalWidth - afterWidth), h);
     }
 
-    return FloatRect(point.x() + floorf(beforeWidth), point.y(), roundf(afterWidth) - floorf(beforeWidth), h);
+    return FloatRect(floorf(point.x() + beforeWidth), point.y(), roundf(point.x() + afterWidth) - floorf(point.x() + beforeWidth), h);
 }
 
 int Font::offsetForPositionForSimpleText(const TextRun& run, float x, bool includePartialGlyphs) const
index fe2a22c..dca9b35 100644 (file)
@@ -50,10 +50,10 @@ FloatRect Font::selectionRectForComplexText(const TextRun& run, const FloatPoint
     // Using roundf() rather than ceilf() for the right edge as a compromise to ensure correct caret positioning
     if (run.rtl()) {
         float totalWidth = controller.totalWidth();
-        return FloatRect(point.x() + floorf(totalWidth - afterWidth), point.y(), roundf(totalWidth - beforeWidth) - floorf(totalWidth - afterWidth), h);
+        return FloatRect(floorf(point.x() + totalWidth - afterWidth), point.y(), roundf(point.x() + totalWidth - beforeWidth) - floorf(point.x() + totalWidth - afterWidth), h);
     } 
 
-    return FloatRect(point.x() + floorf(beforeWidth), point.y(), roundf(afterWidth) - floorf(beforeWidth), h);
+    return FloatRect(floorf(point.x() + beforeWidth), point.y(), roundf(point.x() + afterWidth) - floorf(point.x() + beforeWidth), h);
 }
 
 float Font::getGlyphsAndAdvancesForComplexText(const TextRun& run, int from, int to, GlyphBuffer& glyphBuffer, ForTextEmphasisOrNot forTextEmphasis) const
index 3c04106..94b2f0d 100644 (file)
@@ -194,18 +194,18 @@ IntRect InlineTextBox::selectionRect(int tx, int ty, int startPos, int endPos)
     }
 
     IntRect r = enclosingIntRect(f.selectionRectForText(TextRun(characters, len, textObj->allowTabs(), textPos(), m_expansion, expansionBehavior(), direction(), m_dirOverride),
-                                                        IntPoint(), selHeight, sPos, ePos));
-                                                        
+                                                        FloatPoint(logicalLeft(), selTop), selHeight, sPos, ePos));
+
     int logicalWidth = r.width();
-    if (r.x() > m_logicalWidth)
+    if (r.x() > logicalRight())
         logicalWidth  = 0;
-    else if (r.maxX() > m_logicalWidth)
-        logicalWidth = m_logicalWidth - r.x();
-    
-    IntPoint topPoint = isHorizontal() ? IntPoint(tx + m_x + r.x(), ty + selTop) : IntPoint(tx + selTop, ty + m_y + r.x());
+    else if (r.maxX() > logicalRight())
+        logicalWidth = logicalRight() - r.x();
+
+    IntPoint topPoint = isHorizontal() ? IntPoint(r.x(), ty + selTop) : IntPoint(tx + selTop, r.x());
     int width = isHorizontal() ? logicalWidth : selHeight;
     int height = isHorizontal() ? selHeight : logicalWidth;
-    
+
     return IntRect(topPoint, IntSize(width, height));
 }
 
@@ -784,6 +784,9 @@ void InlineTextBox::selectionStartEnd(int& sPos, int& ePos)
 
 void InlineTextBox::paintSelection(GraphicsContext* context, const FloatPoint& boxOrigin, RenderStyle* style, const Font& font)
 {
+    if (context->paintingDisabled())
+        return;
+
     // See if we have a selection to paint at all.
     int sPos, ePos;
     selectionStartEnd(sPos, ePos);
@@ -817,7 +820,13 @@ void InlineTextBox::paintSelection(GraphicsContext* context, const FloatPoint& b
     int deltaY = renderer()->style()->isFlippedLinesWritingMode() ? selectionBottom() - logicalBottom() : logicalTop() - selectionTop();
     int selHeight = selectionHeight();
     FloatPoint localOrigin(boxOrigin.x(), boxOrigin.y() - deltaY);
-    context->clip(FloatRect(localOrigin, FloatSize(m_logicalWidth, selHeight)));
+
+    FloatRect clipRect(localOrigin, FloatSize(m_logicalWidth, selHeight));
+    float maxX = floorf(clipRect.maxX());
+    clipRect.setX(floorf(clipRect.x()));
+    clipRect.setWidth(maxX - clipRect.x());
+    context->clip(clipRect);
+
     context->drawHighlightForText(font, TextRun(characters, length, textRenderer()->allowTabs(), textPos(), m_expansion, expansionBehavior(), 
                                   direction(), m_dirOverride || style->visuallyOrdered()),
                                   localOrigin, selHeight, c, style->colorSpace(), sPos, ePos);