Reuse buffer allocation if canvas size does not change
[WebKit-https.git] / Source / WebCore / ChangeLog
index a481235dd87b31b70eed821bd54606920a29b58f..0a7b639a1dc3843c64b1d4ae754b28bf50248165 100644 (file)
@@ -1,3 +1,50 @@
+2012-03-23  Sami Kyostila  <skyostil@chromium.org>
+
+        Reuse buffer allocation if canvas size does not change
+        https://bugs.webkit.org/show_bug.cgi?id=80871
+
+        Reviewed by Stephen White.
+
+        If the user changes the width or height attributes of a canvas element,
+        the contents of the canvas should be cleared and the context state
+        should be reset. This has become a common idiom to clear the canvas
+        "efficiently" at the start of a frame.
+
+        Previously, this code path triggered a full reallocation of the image
+        buffer backing the canvas, leading to reduced performance. This patch
+        implements an optimization where we reuse the previous image buffer
+        allocation if the size of the canvas did not change. Also, instead of
+        clearing the canvas every time its dimensions are touched, we only clear
+        if anything has been drawn into the canvas since it was previously
+        cleared.
+
+        Note that for now this optimization only applies for 2D canvases,
+        since it is not entirely clear how touching the dimensions of a WebGL
+        canvas should work.
+
+        Test: fast/canvas/canvas-resize-after-paint-without-layout.html +
+              existing layout tests for canvas resetting.
+
+        * html/HTMLCanvasElement.cpp:
+        (WebCore::HTMLCanvasElement::HTMLCanvasElement):
+        (WebCore::HTMLCanvasElement::reset):
+        (WebCore::HTMLCanvasElement::createImageBuffer): Save the initial
+        graphics context state so we can restore it without creating a new
+        context.
+        (WebCore::HTMLCanvasElement::clearImageBuffer):
+        (WebCore):
+        (WebCore::HTMLCanvasElement::clearCopiedImage):
+        * html/HTMLCanvasElement.h:
+        (HTMLCanvasElement):
+        * html/canvas/CanvasRenderingContext2D.cpp:
+        (WebCore::CanvasRenderingContext2D::reset): No need to notify the
+        compositor when the context is reset, because clearing the image buffer
+        does the same thing. We can also skip the notification if we did not
+        have an image buffer at the time of the reset, because the reset will
+        not have any visual impact in this case. Finally, if the canvas size
+        did change, the notification is also unnecessary because of the call
+        to RenderObject::repaint() from HTMLCanvasElement::reset().
+
 2012-03-22  Martin Robinson  <mrobinson@igalia.com>
 
         Fix some code generation warnings on GTK+.