Title: [274436] trunk/Source/WebCore
Revision
274436
Author
simon.fra...@apple.com
Date
2021-03-15 13:43:16 -0700 (Mon, 15 Mar 2021)

Log Message

Change canvasChanged() to take a Optional<FloatRect>
https://bugs.webkit.org/show_bug.cgi?id=223203

Reviewed by Said Abou-Hallawa.

As a precursor to webkit.org/b/223056, change the FloatRect argument to
canvasChanged() to be an Optional<FloatRect>. A nullopt value here indicates
that the changed rect is inside the existing dirtied bounds of the canvas backing
store since the last repaint, so clients that are using the callback for repaint
don't need to do anything.

* Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp:
(WebCore::CanvasCaptureMediaStreamTrack::Source::canvasChanged):
* Modules/mediastream/CanvasCaptureMediaStreamTrack.h:
* Modules/webxr/WebXRWebGLLayer.h:
* css/CSSCanvasValue.cpp:
(WebCore::CSSCanvasValue::canvasChanged):
* css/CSSCanvasValue.h:
* dom/Document.cpp:
(WebCore::Document::canvasChanged):
* dom/Document.h:
* html/CanvasBase.cpp:
(WebCore::CanvasBase::notifyObserversCanvasChanged):
* html/CanvasBase.h:
* html/CustomPaintCanvas.h:
* html/HTMLCanvasElement.cpp:
(WebCore::HTMLCanvasElement::didDraw):
* html/HTMLCanvasElement.h:
* html/canvas/CanvasRenderingContext2DBase.cpp:
(WebCore::CanvasRenderingContext2DBase::didDrawEntireCanvas):
(WebCore::CanvasRenderingContext2DBase::paintRenderingResultsToCanvas):
* html/canvas/CanvasRenderingContext2DBase.h:
(WebCore::CanvasRenderingContext2DBase::backingStoreBounds const):
* inspector/agents/InspectorCanvasAgent.cpp:
(WebCore::InspectorCanvasAgent::canvasChanged):
* inspector/agents/InspectorCanvasAgent.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (274435 => 274436)


--- trunk/Source/WebCore/ChangeLog	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/ChangeLog	2021-03-15 20:43:16 UTC (rev 274436)
@@ -1,3 +1,42 @@
+2021-03-15  Simon Fraser  <simon.fra...@apple.com>
+
+        Change canvasChanged() to take a Optional<FloatRect>
+        https://bugs.webkit.org/show_bug.cgi?id=223203
+
+        Reviewed by Said Abou-Hallawa.
+
+        As a precursor to webkit.org/b/223056, change the FloatRect argument to
+        canvasChanged() to be an Optional<FloatRect>. A nullopt value here indicates
+        that the changed rect is inside the existing dirtied bounds of the canvas backing
+        store since the last repaint, so clients that are using the callback for repaint
+        don't need to do anything.
+
+        * Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp:
+        (WebCore::CanvasCaptureMediaStreamTrack::Source::canvasChanged):
+        * Modules/mediastream/CanvasCaptureMediaStreamTrack.h:
+        * Modules/webxr/WebXRWebGLLayer.h:
+        * css/CSSCanvasValue.cpp:
+        (WebCore::CSSCanvasValue::canvasChanged):
+        * css/CSSCanvasValue.h:
+        * dom/Document.cpp:
+        (WebCore::Document::canvasChanged):
+        * dom/Document.h:
+        * html/CanvasBase.cpp:
+        (WebCore::CanvasBase::notifyObserversCanvasChanged):
+        * html/CanvasBase.h:
+        * html/CustomPaintCanvas.h:
+        * html/HTMLCanvasElement.cpp:
+        (WebCore::HTMLCanvasElement::didDraw):
+        * html/HTMLCanvasElement.h:
+        * html/canvas/CanvasRenderingContext2DBase.cpp:
+        (WebCore::CanvasRenderingContext2DBase::didDrawEntireCanvas):
+        (WebCore::CanvasRenderingContext2DBase::paintRenderingResultsToCanvas):
+        * html/canvas/CanvasRenderingContext2DBase.h:
+        (WebCore::CanvasRenderingContext2DBase::backingStoreBounds const):
+        * inspector/agents/InspectorCanvasAgent.cpp:
+        (WebCore::InspectorCanvasAgent::canvasChanged):
+        * inspector/agents/InspectorCanvasAgent.h:
+
 2021-03-15  Chris Dumez  <cdu...@apple.com>
 
         Avoid doing a heap allocation in AudioParam::calculateFinalValues() on the audio thread

Modified: trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp (274435 => 274436)


--- trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp	2021-03-15 20:43:16 UTC (rev 274436)
@@ -149,7 +149,7 @@
     setSize(IntSize(m_canvas->width(), m_canvas->height()));
 }
 
-void CanvasCaptureMediaStreamTrack::Source::canvasChanged(CanvasBase& canvas, const FloatRect&)
+void CanvasCaptureMediaStreamTrack::Source::canvasChanged(CanvasBase& canvas, const Optional<FloatRect>&)
 {
     ASSERT_UNUSED(canvas, m_canvas == &canvas);
 

Modified: trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.h (274435 => 274436)


--- trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.h	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.h	2021-03-15 20:43:16 UTC (rev 274436)
@@ -61,7 +61,7 @@
         Source(HTMLCanvasElement&, Optional<double>&&);
 
         // CanvasObserver API
-        void canvasChanged(CanvasBase&, const FloatRect&) final;
+        void canvasChanged(CanvasBase&, const Optional<FloatRect>&) final;
         void canvasResized(CanvasBase&) final;
         void canvasDestroyed(CanvasBase&) final;
 

Modified: trunk/Source/WebCore/Modules/webxr/WebXRWebGLLayer.h (274435 => 274436)


--- trunk/Source/WebCore/Modules/webxr/WebXRWebGLLayer.h	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/Modules/webxr/WebXRWebGLLayer.h	2021-03-15 20:43:16 UTC (rev 274436)
@@ -29,8 +29,10 @@
 
 #include "CanvasBase.h"
 #include "ExceptionOr.h"
+#include "FloatRect.h"
 #include "WebXRLayer.h"
 #include <wtf/IsoMalloc.h>
+#include <wtf/Optional.h>
 #include <wtf/Ref.h>
 #include <wtf/RefPtr.h>
 #include <wtf/Variant.h>
@@ -87,7 +89,7 @@
     static IntSize computeNativeWebGLFramebufferResolution();
     static IntSize computeRecommendedWebGLFramebufferResolution();
 
-    void canvasChanged(CanvasBase&, const FloatRect&) final { };
+    void canvasChanged(CanvasBase&, const Optional<FloatRect>&) final { };
     void canvasResized(CanvasBase&) final;
     void canvasDestroyed(CanvasBase&) final { };
 

Modified: trunk/Source/WebCore/css/CSSCanvasValue.cpp (274435 => 274436)


--- trunk/Source/WebCore/css/CSSCanvasValue.cpp	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/css/CSSCanvasValue.cpp	2021-03-15 20:43:16 UTC (rev 274436)
@@ -41,9 +41,12 @@
     return makeString("-webkit-canvas(", m_name, ')');
 }
 
-void CSSCanvasValue::canvasChanged(HTMLCanvasElement&, const FloatRect& changedRect)
+void CSSCanvasValue::canvasChanged(HTMLCanvasElement&, const Optional<FloatRect>& changedRect)
 {
-    IntRect imageChangeRect = enclosingIntRect(changedRect);
+    if (!changedRect)
+        return;
+
+    auto imageChangeRect = enclosingIntRect(changedRect.value());
     for (auto it = clients().begin(), end = clients().end(); it != end; ++it)
         it->key->imageChanged(static_cast<WrappedImagePtr>(this), &imageChangeRect);
 }

Modified: trunk/Source/WebCore/css/CSSCanvasValue.h (274435 => 274436)


--- trunk/Source/WebCore/css/CSSCanvasValue.h	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/css/CSSCanvasValue.h	2021-03-15 20:43:16 UTC (rev 274436)
@@ -66,7 +66,7 @@
         const CSSCanvasValue& ownerValue() const { return m_ownerValue; }
 
     private:
-        void canvasChanged(CanvasBase& canvasBase, const FloatRect& changedRect) final
+        void canvasChanged(CanvasBase& canvasBase, const Optional<FloatRect>& changedRect) final
         {
             ASSERT(is<HTMLCanvasElement>(canvasBase));
             m_ownerValue.canvasChanged(downcast<HTMLCanvasElement>(canvasBase), changedRect);
@@ -93,7 +93,7 @@
     {
     }
 
-    void canvasChanged(HTMLCanvasElement&, const FloatRect& changedRect);
+    void canvasChanged(HTMLCanvasElement&, const Optional<FloatRect>& changedRect);
     void canvasResized(HTMLCanvasElement&);
     void canvasDestroyed(HTMLCanvasElement&);
 

Modified: trunk/Source/WebCore/dom/Document.cpp (274435 => 274436)


--- trunk/Source/WebCore/dom/Document.cpp	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/dom/Document.cpp	2021-03-15 20:43:16 UTC (rev 274436)
@@ -8786,7 +8786,7 @@
     m_canvasesNeedingDisplayPreparation.remove(canvas);
 }
 
-void Document::canvasChanged(CanvasBase& canvasBase, const FloatRect&)
+void Document::canvasChanged(CanvasBase& canvasBase, const Optional<FloatRect>&)
 {
     if (is<HTMLCanvasElement>(canvasBase)) {
         auto* canvas = downcast<HTMLCanvasElement>(&canvasBase);

Modified: trunk/Source/WebCore/dom/Document.h (274435 => 274436)


--- trunk/Source/WebCore/dom/Document.h	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/dom/Document.h	2021-03-15 20:43:16 UTC (rev 274436)
@@ -1610,7 +1610,7 @@
 
     void prepareCanvasesForDisplayIfNeeded();
     void clearCanvasPreparation(HTMLCanvasElement*);
-    void canvasChanged(CanvasBase&, const FloatRect&) final;
+    void canvasChanged(CanvasBase&, const Optional<FloatRect>&) final;
     void canvasResized(CanvasBase&) final { };
     void canvasDestroyed(CanvasBase&) final;
 

Modified: trunk/Source/WebCore/html/CanvasBase.cpp (274435 => 274436)


--- trunk/Source/WebCore/html/CanvasBase.cpp	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/html/CanvasBase.cpp	2021-03-15 20:43:16 UTC (rev 274436)
@@ -136,7 +136,7 @@
         InspectorInstrumentation::didChangeCSSCanvasClientNodes(*this);
 }
 
-void CanvasBase::notifyObserversCanvasChanged(const FloatRect& rect)
+void CanvasBase::notifyObserversCanvasChanged(const Optional<FloatRect>& rect)
 {
     for (auto& observer : m_observers)
         observer->canvasChanged(*this, rect);

Modified: trunk/Source/WebCore/html/CanvasBase.h (274435 => 274436)


--- trunk/Source/WebCore/html/CanvasBase.h	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/html/CanvasBase.h	2021-03-15 20:43:16 UTC (rev 274436)
@@ -49,7 +49,7 @@
 
     virtual bool isCanvasObserverProxy() const { return false; }
 
-    virtual void canvasChanged(CanvasBase&, const FloatRect& changedRect) = 0;
+    virtual void canvasChanged(CanvasBase&, const Optional<FloatRect>& changedRect) = 0;
     virtual void canvasResized(CanvasBase&) = 0;
     virtual void canvasDestroyed(CanvasBase&) = 0;
 };
@@ -89,7 +89,7 @@
 
     void addObserver(CanvasObserver&);
     void removeObserver(CanvasObserver&);
-    void notifyObserversCanvasChanged(const FloatRect&);
+    void notifyObserversCanvasChanged(const Optional<FloatRect>&);
     void notifyObserversCanvasResized();
     void notifyObserversCanvasDestroyed(); // Must be called in destruction before clearing m_context.
 
@@ -98,7 +98,7 @@
     virtual GraphicsContext* drawingContext() const;
     virtual GraphicsContext* existingDrawingContext() const;
 
-    virtual void didDraw(const FloatRect&) = 0;
+    virtual void didDraw(const Optional<FloatRect>&) = 0;
 
     virtual Image* copiedImage() const = 0;
     virtual void clearCopiedImage() const = 0;

Modified: trunk/Source/WebCore/html/CustomPaintCanvas.h (274435 => 274436)


--- trunk/Source/WebCore/html/CustomPaintCanvas.h	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/html/CustomPaintCanvas.h	2021-03-15 20:43:16 UTC (rev 274436)
@@ -59,7 +59,7 @@
     GraphicsContext* drawingContext() const final;
     GraphicsContext* existingDrawingContext() const final;
 
-    void didDraw(const FloatRect&) final { }
+    void didDraw(const Optional<FloatRect>&) final { }
 
     AffineTransform baseTransform() const final { ASSERT(m_destinationGraphicsContext && m_copiedBuffer); return m_copiedBuffer->baseTransform(); }
     Image* copiedImage() const final;

Modified: trunk/Source/WebCore/html/HTMLCanvasElement.cpp (274435 => 274436)


--- trunk/Source/WebCore/html/HTMLCanvasElement.cpp	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/html/HTMLCanvasElement.cpp	2021-03-15 20:43:16 UTC (rev 274436)
@@ -553,11 +553,16 @@
     return static_cast<ImageBitmapRenderingContext*>(m_context.get());
 }
 
-void HTMLCanvasElement::didDraw(const FloatRect& rect)
+void HTMLCanvasElement::didDraw(const Optional<FloatRect>& rect)
 {
     clearCopiedImage();
+    
+    if (!rect) {
+        notifyObserversCanvasChanged(WTF::nullopt);
+        return;
+    }
 
-    FloatRect dirtyRect = rect;
+    auto dirtyRect = rect.value();
     if (auto* renderer = renderBox()) {
         FloatRect destRect;
         if (is<RenderReplaced>(renderer))

Modified: trunk/Source/WebCore/html/HTMLCanvasElement.h (274435 => 274436)


--- trunk/Source/WebCore/html/HTMLCanvasElement.h	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/html/HTMLCanvasElement.h	2021-03-15 20:43:16 UTC (rev 274436)
@@ -106,7 +106,7 @@
 #endif
 
     // Used for rendering
-    void didDraw(const FloatRect&) final;
+    void didDraw(const Optional<FloatRect>&) final;
 
     void paint(GraphicsContext&, const LayoutRect&);
 

Modified: trunk/Source/WebCore/html/OffscreenCanvas.cpp (274435 => 274436)


--- trunk/Source/WebCore/html/OffscreenCanvas.cpp	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/html/OffscreenCanvas.cpp	2021-03-15 20:43:16 UTC (rev 274436)
@@ -348,7 +348,7 @@
     promise->resolveWithNewlyCreated<IDLInterface<Blob>>(WTFMove(blob));
 }
 
-void OffscreenCanvas::didDraw(const FloatRect& rect)
+void OffscreenCanvas::didDraw(const Optional<FloatRect>& rect)
 {
     clearCopiedImage();
     scheduleCommitToPlaceholderCanvas();

Modified: trunk/Source/WebCore/html/OffscreenCanvas.h (274435 => 274436)


--- trunk/Source/WebCore/html/OffscreenCanvas.h	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/html/OffscreenCanvas.h	2021-03-15 20:43:16 UTC (rev 274436)
@@ -128,7 +128,7 @@
     ExceptionOr<RefPtr<ImageBitmap>> transferToImageBitmap();
     void convertToBlob(ImageEncodeOptions&&, Ref<DeferredPromise>&&);
 
-    void didDraw(const FloatRect&) final;
+    void didDraw(const Optional<FloatRect>&) final;
 
     Image* copiedImage() const final;
     void clearCopiedImage() const final;

Modified: trunk/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp (274435 => 274436)


--- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp	2021-03-15 20:43:16 UTC (rev 274436)
@@ -2000,7 +2000,7 @@
 
 void CanvasRenderingContext2DBase::didDrawEntireCanvas()
 {
-    didDraw(FloatRect(FloatPoint::zero(), canvasBase().size()), DidDrawOption::ApplyClip);
+    didDraw(backingStoreBounds(), DidDrawOption::ApplyClip);
 }
 
 void CanvasRenderingContext2DBase::didDraw(const FloatRect& r, OptionSet<DidDrawOption> options)
@@ -2044,7 +2044,7 @@
     auto& displayList = m_recordingContext->displayList();
     if (!displayList.isEmpty()) {
         DisplayList::Replayer replayer(*canvasBase().drawingContext(), displayList);
-        replayer.replay({ FloatPoint::zero(), canvasBase().size() });
+        replayer.replay(backingStoreBounds());
         displayList.clear();
     }
 }

Modified: trunk/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h (274435 => 274436)


--- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h	2021-03-15 20:43:16 UTC (rev 274436)
@@ -318,6 +318,8 @@
     };
     void didDraw(const FloatRect&, OptionSet<DidDrawOption> = { DidDrawOption::ApplyTransform, DidDrawOption::ApplyShadow, DidDrawOption::ApplyClip });
     void didDrawEntireCanvas();
+    
+    FloatRect backingStoreBounds() const { return FloatRect { { }, FloatSize { canvasBase().size() } }; }
 
     void paintRenderingResultsToCanvas() override;
     bool needsPreparationForDisplay() const final;

Modified: trunk/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp (274435 => 274436)


--- trunk/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp	2021-03-15 20:43:16 UTC (rev 274436)
@@ -475,7 +475,7 @@
         m_frontendDispatcher->canvasMemoryChanged(inspectorCanvas->identifier(), node->memoryCost());
 }
 
-void InspectorCanvasAgent::canvasChanged(CanvasBase& canvasBase, const FloatRect&)
+void InspectorCanvasAgent::canvasChanged(CanvasBase& canvasBase, const Optional<FloatRect>&)
 {
     auto* context = canvasBase.renderingContext();
     if (!context)

Modified: trunk/Source/WebCore/inspector/agents/InspectorCanvasAgent.h (274435 => 274436)


--- trunk/Source/WebCore/inspector/agents/InspectorCanvasAgent.h	2021-03-15 20:38:55 UTC (rev 274435)
+++ trunk/Source/WebCore/inspector/agents/InspectorCanvasAgent.h	2021-03-15 20:43:16 UTC (rev 274436)
@@ -91,9 +91,9 @@
 #endif // ENABLE(WEBGL) || ENABLE(WEBGPU)
 
     // CanvasObserver
-    void canvasChanged(CanvasBase&, const FloatRect&);
-    void canvasResized(CanvasBase&) { }
-    void canvasDestroyed(CanvasBase&);
+    void canvasChanged(CanvasBase&, const Optional<FloatRect>&) final;
+    void canvasResized(CanvasBase&) final { }
+    void canvasDestroyed(CanvasBase&) final;
 
     // InspectorInstrumentation
     void frameNavigated(Frame&);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to