Title: [251640] trunk/Source/WebCore
Revision
251640
Author
za...@apple.com
Date
2019-10-27 09:33:01 -0700 (Sun, 27 Oct 2019)

Log Message

[LFC][Painting] Use the dirty rect to decide what to paint
https://bugs.webkit.org/show_bug.cgi?id=203467
<rdar://problem/56653229>

Reviewed by Antti Koivisto.

This is a very basic dirty rect instersect check since we don't yet have layout overflow.
It enables us to not paint the entire content on every paint frame.

* layout/LayoutContext.cpp:
(WebCore::Layout::LayoutContext::paint):
* layout/LayoutContext.h:
* layout/displaytree/DisplayPainter.cpp:
(WebCore::Display::paintBoxDecorationAndChildren):
(WebCore::Display::Painter::paint):
* layout/displaytree/DisplayPainter.h:
* page/FrameView.cpp:
(WebCore::FrameView::paintContents):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (251639 => 251640)


--- trunk/Source/WebCore/ChangeLog	2019-10-26 20:50:40 UTC (rev 251639)
+++ trunk/Source/WebCore/ChangeLog	2019-10-27 16:33:01 UTC (rev 251640)
@@ -1,3 +1,24 @@
+2019-10-27  Zalan Bujtas  <za...@apple.com>
+
+        [LFC][Painting] Use the dirty rect to decide what to paint
+        https://bugs.webkit.org/show_bug.cgi?id=203467
+        <rdar://problem/56653229>
+
+        Reviewed by Antti Koivisto.
+
+        This is a very basic dirty rect instersect check since we don't yet have layout overflow.
+        It enables us to not paint the entire content on every paint frame. 
+
+        * layout/LayoutContext.cpp:
+        (WebCore::Layout::LayoutContext::paint):
+        * layout/LayoutContext.h:
+        * layout/displaytree/DisplayPainter.cpp:
+        (WebCore::Display::paintBoxDecorationAndChildren):
+        (WebCore::Display::Painter::paint):
+        * layout/displaytree/DisplayPainter.h:
+        * page/FrameView.cpp:
+        (WebCore::FrameView::paintContents):
+
 2019-10-26  youenn fablet  <you...@apple.com>
 
         Enforce user gesture for getUserMedia in case a previous getUserMedia call was denied

Modified: trunk/Source/WebCore/layout/LayoutContext.cpp (251639 => 251640)


--- trunk/Source/WebCore/layout/LayoutContext.cpp	2019-10-26 20:50:40 UTC (rev 251639)
+++ trunk/Source/WebCore/layout/LayoutContext.cpp	2019-10-27 16:33:01 UTC (rev 251640)
@@ -170,9 +170,9 @@
     return layoutState;
 }
 
-void LayoutContext::paint(const LayoutState& layoutState, GraphicsContext& context)
+void LayoutContext::paint(const LayoutState& layoutState, GraphicsContext& context, const IntRect& dirtyRect)
 {
-    Display::Painter::paint(layoutState, context);
+    Display::Painter::paint(layoutState, context, dirtyRect);
 }
 
 }

Modified: trunk/Source/WebCore/layout/LayoutContext.h (251639 => 251640)


--- trunk/Source/WebCore/layout/LayoutContext.h	2019-10-26 20:50:40 UTC (rev 251639)
+++ trunk/Source/WebCore/layout/LayoutContext.h	2019-10-27 16:33:01 UTC (rev 251640)
@@ -34,6 +34,7 @@
 namespace WebCore {
 
 class GraphicsContext;
+class IntRect;
 class RenderView;
 
 namespace Layout {
@@ -55,7 +56,7 @@
 public:
     // FIXME: These are temporary entry points for LFC layout.
     static std::unique_ptr<LayoutState> runLayoutAndVerify(const RenderView&);
-    static void paint(const LayoutState&, GraphicsContext&);
+    static void paint(const LayoutState&, GraphicsContext&, const IntRect& dirtyRect);
 
     LayoutContext(LayoutState&);
     void layout();

Modified: trunk/Source/WebCore/layout/displaytree/DisplayPainter.cpp (251639 => 251640)


--- trunk/Source/WebCore/layout/displaytree/DisplayPainter.cpp	2019-10-26 20:50:40 UTC (rev 251639)
+++ trunk/Source/WebCore/layout/displaytree/DisplayPainter.cpp	2019-10-27 16:33:01 UTC (rev 251640)
@@ -34,6 +34,7 @@
 #include "GraphicsContext.h"
 #include "InlineFormattingState.h"
 #include "InlineTextItem.h"
+#include "IntRect.h"
 #include "LayoutContainer.h"
 #include "LayoutDescendantIterator.h"
 #include "LayoutState.h"
@@ -145,10 +146,13 @@
     return absoluteBox;
 }
 
-static void paintBoxDecorationAndChildren(GraphicsContext& context, const Layout::LayoutState& layoutState, const Layout::Box& layoutBox)
+static void paintBoxDecorationAndChildren(GraphicsContext& context, const Layout::LayoutState& layoutState, const Layout::Box& layoutBox, const IntRect& dirtyRect)
 {
-    if (!layoutBox.isAnonymous())
-        paintBoxDecoration(context, absoluteDisplayBox(layoutState, layoutBox), layoutBox.style(), layoutBox.isBodyBox());
+    if (!layoutBox.isAnonymous()) {
+        auto absoluteDisplayBox = Display::absoluteDisplayBox(layoutState, layoutBox);
+        if (dirtyRect.intersects(snappedIntRect(absoluteDisplayBox.rect())))
+            paintBoxDecoration(context, absoluteDisplayBox, layoutBox.style(), layoutBox.isBodyBox());
+    }
 
     if (!is<Layout::Container>(layoutBox))
         return;
@@ -155,28 +159,35 @@
     for (auto& childLayoutBox : Layout::childrenOfType<Layout::Box>(downcast<Layout::Container>(layoutBox))) {
         if (childLayoutBox.style().visibility() != Visibility::Visible)
             continue;
-        paintBoxDecorationAndChildren(context, layoutState, childLayoutBox);
+        paintBoxDecorationAndChildren(context, layoutState, childLayoutBox, dirtyRect);
     }
 }
 
-void Painter::paint(const Layout::LayoutState& layoutState, GraphicsContext& context)
+void Painter::paint(const Layout::LayoutState& layoutState, GraphicsContext& context, const IntRect& dirtyRect)
 {
     auto& layoutRoot = layoutState.root();
-    auto& rootDisplayBox = layoutState.displayBoxForLayoutBox(layoutRoot);
-    context.fillRect({ FloatPoint { }, FloatSize { rootDisplayBox.borderBoxWidth(), rootDisplayBox.borderBoxHeight() } }, Color::white);
     if (!layoutRoot.firstChild())
         return;
+    // Fill the entire content area.
+    auto rootRect = LayoutRect { layoutState.displayBoxForLayoutBox(layoutRoot).rect() };
+    for (auto& layoutBox : Layout::descendantsOfType<Layout::Box>(layoutRoot))
+        rootRect.uniteIfNonZero(Display::absoluteDisplayBox(layoutState, layoutBox).rect());
+    context.fillRect(rootRect, Color::white);
 
     // 1. Paint box decoration (both block and inline).
-    paintBoxDecorationAndChildren(context, layoutState, *layoutRoot.firstChild());
+    paintBoxDecorationAndChildren(context, layoutState, *layoutRoot.firstChild(), dirtyRect);
 
     // 2. Paint content
     for (auto& layoutBox : Layout::descendantsOfType<Layout::Box>(layoutRoot)) {
+        auto absoluteDisplayBox = Display::absoluteDisplayBox(layoutState, layoutBox);
+        // FIXME: This is the best we can do with no layout overflow support.
+        if (!dirtyRect.intersects(snappedIntRect(absoluteDisplayBox.rect())))
+            continue;
         if (layoutBox.style().visibility() != Visibility::Visible)
             continue;
         if (layoutBox.establishesInlineFormattingContext()) {
             auto& container = downcast<Layout::Container>(layoutBox);
-            paintInlineContent(context, absoluteDisplayBox(layoutState, container), downcast<Layout::InlineFormattingState>(layoutState.establishedFormattingState(container)));
+            paintInlineContent(context, absoluteDisplayBox, downcast<Layout::InlineFormattingState>(layoutState.establishedFormattingState(container)));
             continue;
         }
     }

Modified: trunk/Source/WebCore/layout/displaytree/DisplayPainter.h (251639 => 251640)


--- trunk/Source/WebCore/layout/displaytree/DisplayPainter.h	2019-10-26 20:50:40 UTC (rev 251639)
+++ trunk/Source/WebCore/layout/displaytree/DisplayPainter.h	2019-10-27 16:33:01 UTC (rev 251640)
@@ -30,6 +30,7 @@
 namespace WebCore {
 
 class GraphicsContext;
+class IntRect;
 
 namespace Layout {
 class LayoutState;
@@ -39,7 +40,7 @@
 
 class Painter {
 public:
-    static void paint(const Layout::LayoutState&, GraphicsContext&);
+    static void paint(const Layout::LayoutState&, GraphicsContext&, const IntRect& dirtyRect);
 };
 
 }

Modified: trunk/Source/WebCore/page/FrameView.cpp (251639 => 251640)


--- trunk/Source/WebCore/page/FrameView.cpp	2019-10-26 20:50:40 UTC (rev 251639)
+++ trunk/Source/WebCore/page/FrameView.cpp	2019-10-27 16:33:01 UTC (rev 251640)
@@ -4181,7 +4181,7 @@
 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
     if (RuntimeEnabledFeatures::sharedFeatures().layoutFormattingContextEnabled()) {
         if (auto* layoutState = layoutContext().initialLayoutState())
-            Layout::LayoutContext::paint(*layoutState, context);
+            Layout::LayoutContext::paint(*layoutState, context, dirtyRect);
         return;
     }
 #endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to