Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1173)

Unified Diff: src/utils/SkCanvasStateUtils.cpp

Issue 372003002: Change SkCanvasState to use inheritance. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Specify the version of the bad SkCanvasState. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/utils/SkCanvasStateUtils.cpp
diff --git a/src/utils/SkCanvasStateUtils.cpp b/src/utils/SkCanvasStateUtils.cpp
index eaee61b5e829a6534c87f0180b7f4c1856e7a7b0..bdcb9af086315a6fde37d873bfc4b42ba32b770a 100644
--- a/src/utils/SkCanvasStateUtils.cpp
+++ b/src/utils/SkCanvasStateUtils.cpp
@@ -74,17 +74,39 @@ public:
SkCanvasState(SkCanvas* canvas) {
SkASSERT(canvas);
version = CANVAS_STATE_VERSION;
- width = canvas->getDeviceSize().width();
- height = canvas->getDeviceSize().height();
+ width = canvas->getBaseLayerSize().width();
+ height = canvas->getBaseLayerSize().height();
+
+ }
+
+ virtual ~SkCanvasState() {}
+
+ /**
+ * The version this struct was built with. This field must always appear
+ * first in the struct so that when the versions don't match (and the
+ * remaining contents and size are potentially different) we can still
+ * compare the version numbers.
+ */
+ int32_t version;
+ int32_t width;
+ int32_t height;
+ int32_t alignmentPadding;
+};
+
+class SkCanvasState_v1 : public SkCanvasState {
+public:
+ SkCanvasState_v1(SkCanvas* canvas)
+ : INHERITED(canvas)
+ {
+ SkASSERT(this->version == 1);
layerCount = 0;
layers = NULL;
- originalCanvas = SkRef(canvas);
-
mcState.clipRectCount = 0;
mcState.clipRects = NULL;
+ originalCanvas = SkRef(canvas);
}
- ~SkCanvasState() {
+ ~SkCanvasState_v1() {
// loop through the layers and free the data allocated to the clipRects
for (int i = 0; i < layerCount; ++i) {
sk_free(layers[i].mcState.clipRects);
@@ -98,24 +120,13 @@ public:
originalCanvas->unref();
}
- /**
- * The version this struct was built with. This field must always appear
- * first in the struct so that when the versions don't match (and the
- * remaining contents and size are potentially different) we can still
- * compare the version numbers.
- */
- int32_t version;
-
- int32_t width;
- int32_t height;
-
SkMCState mcState;
int32_t layerCount;
SkCanvasLayerState* layers;
-
private:
SkCanvas* originalCanvas;
+ typedef SkCanvasState INHERITED;
};
////////////////////////////////////////////////////////////////////////////////
@@ -191,7 +202,7 @@ SkCanvasState* SkCanvasStateUtils::CaptureCanvasState(SkCanvas* canvas) {
return NULL;
}
- SkAutoTDelete<SkCanvasState> canvasState(SkNEW_ARGS(SkCanvasState, (canvas)));
+ SkAutoTDelete<SkCanvasState_v1> canvasState(SkNEW_ARGS(SkCanvasState_v1, (canvas)));
// decompose the total matrix and clip
setup_MC_state(&canvasState->mcState, canvas->getTotalMatrix(),
@@ -247,7 +258,7 @@ SkCanvasState* SkCanvasStateUtils::CaptureCanvasState(SkCanvas* canvas) {
// for now, just ignore any client supplied DrawFilter.
if (canvas->getDrawFilter()) {
-// SkDEBUGF(("CaptureCanvasState will ignore the canvases draw filter.\n"));
+// SkDEBUGF(("CaptureCanvasState will ignore the canvas's draw filter.\n"));
}
return canvasState.detach();
@@ -307,32 +318,34 @@ static SkCanvas* create_canvas_from_canvas_layer(const SkCanvasLayerState& layer
SkCanvas* SkCanvasStateUtils::CreateFromCanvasState(const SkCanvasState* state) {
SkASSERT(state);
- // check that the versions match
- if (CANVAS_STATE_VERSION != state->version) {
- SkDebugf("CreateFromCanvasState version does not match the one use to create the input");
- return NULL;
- }
+ if (state->version == 1) {
+ const SkCanvasState_v1* state_v1 = static_cast<const SkCanvasState_v1*>(state);
- if (state->layerCount < 1) {
- return NULL;
- }
+ if (state_v1->layerCount < 1) {
+ return NULL;
+ }
- SkAutoTUnref<SkCanvasStack> canvas(SkNEW_ARGS(SkCanvasStack, (state->width, state->height)));
+ SkAutoTUnref<SkCanvasStack> canvas(SkNEW_ARGS(SkCanvasStack,
+ (state->width, state->height)));
- // setup the matrix and clip on the n-way canvas
- setup_canvas_from_MC_state(state->mcState, canvas);
+ // setup the matrix and clip on the n-way canvas
+ setup_canvas_from_MC_state(state_v1->mcState, canvas);
- // Iterate over the layers and add them to the n-way canvas
- for (int i = state->layerCount - 1; i >= 0; --i) {
- SkAutoTUnref<SkCanvas> canvasLayer(create_canvas_from_canvas_layer(state->layers[i]));
- if (!canvasLayer.get()) {
- return NULL;
+ // Iterate over the layers and add them to the n-way canvas
+ for (int i = state_v1->layerCount - 1; i >= 0; --i) {
+ SkAutoTUnref<SkCanvas> cLayer(create_canvas_from_canvas_layer(state_v1->layers[i]));
+ if (!cLayer.get()) {
+ return NULL;
+ }
+ canvas->pushCanvas(cLayer.get(), SkIPoint::Make(state_v1->layers[i].x,
+ state_v1->layers[i].y));
}
- canvas->pushCanvas(canvasLayer.get(), SkIPoint::Make(state->layers[i].x,
- state->layers[i].y));
- }
- return canvas.detach();
+ return canvas.detach();
+ } else {
+ SkDebugf("CreateFromCanvasState from version %d is not supported!", state->version);
+ return NULL;
+ }
}
////////////////////////////////////////////////////////////////////////////////
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698