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