From 01e813736810d4afade739af76893f2d9ff1f93a Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Wed, 23 May 2018 11:57:42 -0700 Subject: Update dimensions early in ClearTarget. --- dom/canvas/CanvasRenderingContext2D.cpp | 14 +++++++++----- dom/canvas/CanvasRenderingContext2D.h | 5 ++++- 2 files changed, 13 insertions(+), 6 deletions(-) (limited to 'dom/canvas') diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp index f4c4259f6..18af28e9f 100644 --- a/dom/canvas/CanvasRenderingContext2D.cpp +++ b/dom/canvas/CanvasRenderingContext2D.cpp @@ -1862,8 +1862,6 @@ CanvasRenderingContext2D::GetHeight() const NS_IMETHODIMP CanvasRenderingContext2D::SetDimensions(int32_t aWidth, int32_t aHeight) { - ClearTarget(); - // Zero sized surfaces can cause problems. mZero = false; if (aHeight == 0) { @@ -1874,14 +1872,14 @@ CanvasRenderingContext2D::SetDimensions(int32_t aWidth, int32_t aHeight) aWidth = 1; mZero = true; } - mWidth = aWidth; - mHeight = aHeight; + + ClearTarget(aWidth, aHeight); return NS_OK; } void -CanvasRenderingContext2D::ClearTarget() +CanvasRenderingContext2D::ClearTarget(int32_t aWidth, int32_t aHeight) { Reset(); @@ -1889,6 +1887,12 @@ CanvasRenderingContext2D::ClearTarget() SetInitialState(); + // Update dimensions only if new (strictly positive) values were passed. + if (aWidth > 0 && aHeight > 0) { + mWidth = aWidth; + mHeight = aHeight; + } + // For vertical writing-mode, unless text-orientation is sideways, // we'll modify the initial value of textBaseline to 'middle'. RefPtr canvasStyle; diff --git a/dom/canvas/CanvasRenderingContext2D.h b/dom/canvas/CanvasRenderingContext2D.h index d5dff8f3b..848b3ee08 100644 --- a/dom/canvas/CanvasRenderingContext2D.h +++ b/dom/canvas/CanvasRenderingContext2D.h @@ -669,8 +669,11 @@ protected: /** * Disposes an old target and prepares to lazily create a new target. + * + * Parameters are the new dimensions to be used, or if either is negative, + * existing dimensions will be left unchanged. */ - void ClearTarget(); + void ClearTarget(int32_t aWidth = -1, int32_t aHeight = -1); /* * Returns the target to the buffer provider. i.e. this will queue a frame for -- cgit v1.2.3