diff options
author | Heather Miller <hcm@google.com> | 2016-11-10 21:25:30 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2016-11-10 21:25:44 +0000 |
commit | b613c266df48cf45296ecc23d1bd7098c84bb7ba (patch) | |
tree | 50f7d84a4238918bf5869ee760ed78332b2db946 /src/utils/SkCanvasStateUtils.cpp | |
parent | fac8db2df8b5cf6fd62189315bad0726d8e51f6d (diff) |
Revert "Change SkCanvas to *not* inherit from SkRefCnt"
This reverts commit 824075071885b6b741c141cbe2134d8345d34589.
Reason for revert: Breaking WebView (chromium:663959)
Original change's description:
> Change SkCanvas to *not* inherit from SkRefCnt
>
> Definitely tricky for classes like SkNWayCanvas, where the caller (today)
> need not pay attention to ownership of the canvases it gave the NWay
> (after this CL, the caller *must* managed ownership)
>
> BUG=skia:
>
> GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=4441
>
> DOCS_PREVIEW= https://skia.org/?cl=4441
>
> Change-Id: Ib1ac07a3cdf0686d78e7aaa4735d45cc90bea081
> Reviewed-on: https://skia-review.googlesource.com/4441
> Commit-Queue: Mike Reed <reed@google.com>
> Reviewed-by: Florin Malita <fmalita@chromium.org>
> Reviewed-by: Robert Phillips <robertphillips@google.com>
>
TBR=djsollen@google.com,mtklein@google.com,halcanary@google.com,robertphillips@google.com,fmalita@chromium.org,fmalita@google.com,reed@google.com,reviews@skia.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
Change-Id: I5e3b3e876b7d2c09833cf841801321033b6b968b
Reviewed-on: https://skia-review.googlesource.com/4687
Commit-Queue: Heather Miller <hcm@google.com>
Reviewed-by: Heather Miller <hcm@google.com>
Diffstat (limited to 'src/utils/SkCanvasStateUtils.cpp')
-rw-r--r-- | src/utils/SkCanvasStateUtils.cpp | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/utils/SkCanvasStateUtils.cpp b/src/utils/SkCanvasStateUtils.cpp index 58f26b6c79..062dc13ed9 100644 --- a/src/utils/SkCanvasStateUtils.cpp +++ b/src/utils/SkCanvasStateUtils.cpp @@ -100,12 +100,14 @@ class SkCanvasState_v1 : public SkCanvasState { public: static const int32_t kVersion = 1; - SkCanvasState_v1(SkCanvas* canvas) : INHERITED(kVersion, canvas) { + SkCanvasState_v1(SkCanvas* canvas) + : INHERITED(kVersion, canvas) + { layerCount = 0; layers = nullptr; mcState.clipRectCount = 0; mcState.clipRects = nullptr; - originalCanvas = canvas; + originalCanvas = SkRef(canvas); } ~SkCanvasState_v1() { @@ -116,6 +118,10 @@ public: sk_free(mcState.clipRects); sk_free(layers); + + // it is now safe to free the canvas since there should be no remaining + // references to the content that is referenced by this canvas (e.g. pixels) + originalCanvas->unref(); } SkMCState mcState; @@ -278,8 +284,7 @@ static void setup_canvas_from_MC_state(const SkMCState& state, SkCanvas* canvas) canvas->clipRegion(clip, SkCanvas::kReplace_Op); } -static std::unique_ptr<SkCanvas> -make_canvas_from_canvas_layer(const SkCanvasLayerState& layerState) { +static SkCanvas* create_canvas_from_canvas_layer(const SkCanvasLayerState& layerState) { SkASSERT(kRaster_CanvasBackend == layerState.type); SkBitmap bitmap; @@ -299,15 +304,15 @@ make_canvas_from_canvas_layer(const SkCanvasLayerState& layerState) { SkASSERT(!bitmap.empty()); SkASSERT(!bitmap.isNull()); - std::unique_ptr<SkCanvas> canvas(new SkCanvas(bitmap)); + sk_sp<SkCanvas> canvas(new SkCanvas(bitmap)); // setup the matrix and clip setup_canvas_from_MC_state(layerState.mcState, canvas.get()); - return canvas; + return canvas.release(); } -std::unique_ptr<SkCanvas> SkCanvasStateUtils::MakeFromCanvasState(const SkCanvasState* state) { +SkCanvas* SkCanvasStateUtils::CreateFromCanvasState(const SkCanvasState* state) { SkASSERT(state); // Currently there is only one possible version. SkASSERT(SkCanvasState_v1::kVersion == state->version); @@ -318,14 +323,14 @@ std::unique_ptr<SkCanvas> SkCanvasStateUtils::MakeFromCanvasState(const SkCanvas return nullptr; } - std::unique_ptr<SkCanvasStack> canvas(new SkCanvasStack(state->width, state->height)); + sk_sp<SkCanvasStack> canvas(new SkCanvasStack(state->width, state->height)); // setup the matrix and clip on the n-way canvas setup_canvas_from_MC_state(state_v1->mcState, canvas.get()); // Iterate over the layers and add them to the n-way canvas for (int i = state_v1->layerCount - 1; i >= 0; --i) { - std::unique_ptr<SkCanvas> canvasLayer = make_canvas_from_canvas_layer(state_v1->layers[i]); + sk_sp<SkCanvas> canvasLayer(create_canvas_from_canvas_layer(state_v1->layers[i])); if (!canvasLayer.get()) { return nullptr; } @@ -333,7 +338,7 @@ std::unique_ptr<SkCanvas> SkCanvasStateUtils::MakeFromCanvasState(const SkCanvas state_v1->layers[i].y)); } - return std::move(canvas); + return canvas.release(); } //////////////////////////////////////////////////////////////////////////////// |