aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/utils/SkCanvasStateUtils.cpp
diff options
context:
space:
mode:
authorGravatar Heather Miller <hcm@google.com>2016-11-10 21:25:30 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-11-10 21:25:44 +0000
commitb613c266df48cf45296ecc23d1bd7098c84bb7ba (patch)
tree50f7d84a4238918bf5869ee760ed78332b2db946 /src/utils/SkCanvasStateUtils.cpp
parentfac8db2df8b5cf6fd62189315bad0726d8e51f6d (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.cpp25
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();
}
////////////////////////////////////////////////////////////////////////////////