Reuse buffer allocation if canvas size does not change
[WebKit-https.git] / Source / WebCore / ChangeLog
index b95d9d730c420315405e55b28ee3bfad25943be8..9ca76128ca272fb36a78ad448449264afbd8b13c 100644 (file)
@@ -1,3 +1,52 @@
+2012-03-20  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):
+        (WebCore::HTMLCanvasElement::clearImageBuffer):
+        (WebCore):
+        (WebCore::HTMLCanvasElement::clearCopiedImage):
+        * html/HTMLCanvasElement.h:
+        (HTMLCanvasElement):
+        * html/canvas/CanvasRenderingContext2D.cpp:
+        (WebCore::CanvasRenderingContext2D::CanvasRenderingContext2D): Save the
+        initial graphics context state so we can restore it without creating a
+        new context.
+        (WebCore::CanvasRenderingContext2D::unwindStateStack):
+        (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-20  Dana Jansens  <danakj@chromium.org>
 
         [chromium] Allow us to disable overdraw metrics when tracing is off