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&);