Title: [171896] trunk/Source/WebCore
Revision
171896
Author
[email protected]
Date
2014-07-31 16:55:31 -0700 (Thu, 31 Jul 2014)

Log Message

Subpixel rendering: Region painting needs to take subpixel accumulation into account.
https://bugs.webkit.org/show_bug.cgi?id=135469

Similar to non-region painting, when the context is translated, we need to propagate
the subpixel difference so that renderers get snapped to the same position as if they
were not part of a region.

Reviewed by Simon Fraser.

Covered by existing tests/not testable (webkit.org/b/135470)

* html/shadow/MediaControlElements.cpp:
(WebCore::MediaControlTextTrackContainerElement::createTextTrackRepresentationImage):
* page/FrameView.cpp:
(WebCore::FrameView::paintContents):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::paint):
(WebCore::RenderLayer::calculateClipRects):
* rendering/RenderLayer.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (171895 => 171896)


--- trunk/Source/WebCore/ChangeLog	2014-07-31 23:52:19 UTC (rev 171895)
+++ trunk/Source/WebCore/ChangeLog	2014-07-31 23:55:31 UTC (rev 171896)
@@ -1,3 +1,25 @@
+2014-07-31  Zalan Bujtas  <[email protected]>
+
+        Subpixel rendering: Region painting needs to take subpixel accumulation into account.
+        https://bugs.webkit.org/show_bug.cgi?id=135469
+
+        Similar to non-region painting, when the context is translated, we need to propagate
+        the subpixel difference so that renderers get snapped to the same position as if they
+        were not part of a region.
+
+        Reviewed by Simon Fraser.
+
+        Covered by existing tests/not testable (webkit.org/b/135470)
+
+        * html/shadow/MediaControlElements.cpp:
+        (WebCore::MediaControlTextTrackContainerElement::createTextTrackRepresentationImage):
+        * page/FrameView.cpp:
+        (WebCore::FrameView::paintContents):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::paint):
+        (WebCore::RenderLayer::calculateClipRects):
+        * rendering/RenderLayer.h:
+
 2014-07-31  Jer Noble  <[email protected]>
 
         [iOS] Video in an <embed> has a bad aspect ratio when in fullscreen mode.

Modified: trunk/Source/WebCore/html/shadow/MediaControlElements.cpp (171895 => 171896)


--- trunk/Source/WebCore/html/shadow/MediaControlElements.cpp	2014-07-31 23:52:19 UTC (rev 171895)
+++ trunk/Source/WebCore/html/shadow/MediaControlElements.cpp	2014-07-31 23:55:31 UTC (rev 171896)
@@ -1534,7 +1534,7 @@
     if (!buffer)
         return nullptr;
 
-    layer->paint(buffer->context(), paintingRect, PaintBehaviorFlattenCompositingLayers, nullptr, RenderLayer::PaintLayerPaintingCompositingAllPhases);
+    layer->paint(buffer->context(), paintingRect, LayoutSize(), PaintBehaviorFlattenCompositingLayers, nullptr, RenderLayer::PaintLayerPaintingCompositingAllPhases);
 
     return buffer->copyImage();
 }

Modified: trunk/Source/WebCore/page/FrameView.cpp (171895 => 171896)


--- trunk/Source/WebCore/page/FrameView.cpp	2014-07-31 23:52:19 UTC (rev 171895)
+++ trunk/Source/WebCore/page/FrameView.cpp	2014-07-31 23:55:31 UTC (rev 171896)
@@ -3690,7 +3690,7 @@
     while (eltRenderer && eltRenderer->isRenderInline() && !toRenderInline(eltRenderer)->firstLineBox())
         eltRenderer = eltRenderer->parent();
 
-    rootLayer->paint(context, dirtyRect, m_paintBehavior, eltRenderer);
+    rootLayer->paint(context, dirtyRect, LayoutSize(), m_paintBehavior, eltRenderer);
     if (rootLayer->containsDirtyOverlayScrollbars())
         rootLayer->paintOverlayScrollbars(context, dirtyRect, m_paintBehavior, eltRenderer);
 

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (171895 => 171896)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2014-07-31 23:52:19 UTC (rev 171895)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2014-07-31 23:55:31 UTC (rev 171896)
@@ -3546,11 +3546,11 @@
     return ScrollableArea::scroll(direction, granularity, multiplier);
 }
 
-void RenderLayer::paint(GraphicsContext* context, const LayoutRect& damageRect, PaintBehavior paintBehavior, RenderObject* subtreePaintRoot, PaintLayerFlags paintFlags)
+void RenderLayer::paint(GraphicsContext* context, const LayoutRect& damageRect, const LayoutSize& subpixelAccumulation, PaintBehavior paintBehavior, RenderObject* subtreePaintRoot, PaintLayerFlags paintFlags)
 {
     OverlapTestRequestMap overlapTestRequests;
 
-    LayerPaintingInfo paintingInfo(this, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), subtreePaintRoot, &overlapTestRequests);
+    LayerPaintingInfo paintingInfo(this, enclosingIntRect(damageRect), paintBehavior, subpixelAccumulation, subtreePaintRoot, &overlapTestRequests);
     paintLayer(context, paintingInfo, paintFlags);
 
     OverlapTestRequestMap::iterator end = overlapTestRequests.end();
@@ -6680,21 +6680,19 @@
 void RenderLayer::paintNamedFlowThreadInsideRegion(GraphicsContext* context, RenderNamedFlowFragment* region, LayoutRect paintDirtyRect, LayoutPoint paintOffset, PaintBehavior paintBehavior, PaintLayerFlags paintFlags)
 {
     LayoutRect regionContentBox = toRenderBox(region->layerOwner()).contentBoxRect();
-    LayoutSize moveOffset = region->flowThreadPortionLocation() - (paintOffset + regionContentBox.location()) + region->fragmentContainer().scrolledContentOffset();
-
-    FloatPoint adjustedPaintOffset = roundedForPainting(LayoutPoint(-moveOffset.width(), -moveOffset.height()), renderer().document().deviceScaleFactor());
-    paintDirtyRect.move(moveOffset);
-
-    context->save();
-    context->translate(adjustedPaintOffset.x(), adjustedPaintOffset.y());
-
     CurrentRenderFlowThreadMaintainer flowThreadMaintainer(toRenderFlowThread(&renderer()));
     CurrentRenderRegionMaintainer regionMaintainer(*region);
-
     region->setRegionObjectsRegionStyle();
-    paint(context, paintDirtyRect, paintBehavior, nullptr, paintFlags | PaintLayerTemporaryClipRects);
-    region->restoreRegionObjectsOriginalStyle();
 
+    LayoutSize moveOffset = region->flowThreadPortionLocation() - (paintOffset + regionContentBox.location()) + region->fragmentContainer().scrolledContentOffset();
+    FloatPoint adjustedPaintOffset = roundedForPainting(toLayoutPoint(moveOffset), renderer().document().deviceScaleFactor());
+    context->save();
+    context->translate(-adjustedPaintOffset.x(), -adjustedPaintOffset.y());
+
+    LayoutSize subpixelAccumulation = moveOffset - toLayoutSize(LayoutPoint(adjustedPaintOffset));
+    paintDirtyRect.move(moveOffset);
+    paint(context, paintDirtyRect, subpixelAccumulation, paintBehavior, nullptr, paintFlags | PaintLayerTemporaryClipRects);
+    region->restoreRegionObjectsOriginalStyle();
     context->restore();
 }
 

Modified: trunk/Source/WebCore/rendering/RenderLayer.h (171895 => 171896)


--- trunk/Source/WebCore/rendering/RenderLayer.h	2014-07-31 23:52:19 UTC (rev 171895)
+++ trunk/Source/WebCore/rendering/RenderLayer.h	2014-07-31 23:55:31 UTC (rev 171896)
@@ -671,7 +671,8 @@
     // paints the layers that intersect the damage rect from back to
     // front.  The hitTest method looks for mouse events by walking
     // layers that intersect the point from front to back.
-    void paint(GraphicsContext*, const LayoutRect& damageRect, PaintBehavior = PaintBehaviorNormal, RenderObject* subtreePaintRoot = nullptr, PaintLayerFlags = 0);
+    void paint(GraphicsContext*, const LayoutRect& damageRect, const LayoutSize& subpixelAccumulation = LayoutSize(), PaintBehavior = PaintBehaviorNormal,
+        RenderObject* subtreePaintRoot = nullptr, PaintLayerFlags = 0);
     bool hitTest(const HitTestRequest&, HitTestResult&);
     bool hitTest(const HitTestRequest&, const HitTestLocation&, HitTestResult&);
     void paintOverlayScrollbars(GraphicsContext*, const LayoutRect& damageRect, PaintBehavior, RenderObject* subtreePaintRoot = nullptr);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to