| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkCanvasStateUtils.h" | 8 #include "SkCanvasStateUtils.h" |
| 9 | 9 |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 | 199 |
| 200 // Check the clip can be decomposed into rectangles (i.e. no soft clips). | 200 // Check the clip can be decomposed into rectangles (i.e. no soft clips). |
| 201 ClipValidator validator; | 201 ClipValidator validator; |
| 202 canvas->replayClips(&validator); | 202 canvas->replayClips(&validator); |
| 203 if (validator.failed()) { | 203 if (validator.failed()) { |
| 204 SkErrorInternals::SetError(kInvalidOperation_SkError, | 204 SkErrorInternals::SetError(kInvalidOperation_SkError, |
| 205 "CaptureCanvasState does not support canvases with antialiased c
lips.\n"); | 205 "CaptureCanvasState does not support canvases with antialiased c
lips.\n"); |
| 206 return NULL; | 206 return NULL; |
| 207 } | 207 } |
| 208 | 208 |
| 209 SkAutoTDelete<SkCanvasState_v1> canvasState(SkNEW_ARGS(SkCanvasState_v1, (ca
nvas))); | 209 SkAutoTDelete<SkCanvasState_v1> canvasState(new SkCanvasState_v1(canvas)); |
| 210 | 210 |
| 211 // decompose the total matrix and clip | 211 // decompose the total matrix and clip |
| 212 setup_MC_state(&canvasState->mcState, canvas->getTotalMatrix(), | 212 setup_MC_state(&canvasState->mcState, canvas->getTotalMatrix(), |
| 213 canvas->internal_private_getTotalClip()); | 213 canvas->internal_private_getTotalClip()); |
| 214 | 214 |
| 215 /* | 215 /* |
| 216 * decompose the layers | 216 * decompose the layers |
| 217 * | 217 * |
| 218 * storage is allocated on the stack for the first 3 layers. It is common in | 218 * storage is allocated on the stack for the first 3 layers. It is common in |
| 219 * some view systems (e.g. Android) that a few non-clipped layers are presen
t | 219 * some view systems (e.g. Android) that a few non-clipped layers are presen
t |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 return NULL; | 304 return NULL; |
| 305 } | 305 } |
| 306 | 306 |
| 307 bitmap.installPixels(SkImageInfo::Make(layerState.width, layerState.height, | 307 bitmap.installPixels(SkImageInfo::Make(layerState.width, layerState.height, |
| 308 colorType, kPremul_SkAlphaType), | 308 colorType, kPremul_SkAlphaType), |
| 309 layerState.raster.pixels, (size_t) layerState.raster.ro
wBytes); | 309 layerState.raster.pixels, (size_t) layerState.raster.ro
wBytes); |
| 310 | 310 |
| 311 SkASSERT(!bitmap.empty()); | 311 SkASSERT(!bitmap.empty()); |
| 312 SkASSERT(!bitmap.isNull()); | 312 SkASSERT(!bitmap.isNull()); |
| 313 | 313 |
| 314 SkAutoTUnref<SkCanvas> canvas(SkNEW_ARGS(SkCanvas, (bitmap))); | 314 SkAutoTUnref<SkCanvas> canvas(new SkCanvas(bitmap)); |
| 315 | 315 |
| 316 // setup the matrix and clip | 316 // setup the matrix and clip |
| 317 setup_canvas_from_MC_state(layerState.mcState, canvas.get()); | 317 setup_canvas_from_MC_state(layerState.mcState, canvas.get()); |
| 318 | 318 |
| 319 return canvas.detach(); | 319 return canvas.detach(); |
| 320 } | 320 } |
| 321 | 321 |
| 322 SkCanvas* SkCanvasStateUtils::CreateFromCanvasState(const SkCanvasState* state)
{ | 322 SkCanvas* SkCanvasStateUtils::CreateFromCanvasState(const SkCanvasState* state)
{ |
| 323 SkASSERT(state); | 323 SkASSERT(state); |
| 324 // Currently there is only one possible version. | 324 // Currently there is only one possible version. |
| 325 SkASSERT(SkCanvasState_v1::kVersion == state->version); | 325 SkASSERT(SkCanvasState_v1::kVersion == state->version); |
| 326 | 326 |
| 327 const SkCanvasState_v1* state_v1 = static_cast<const SkCanvasState_v1*>(stat
e); | 327 const SkCanvasState_v1* state_v1 = static_cast<const SkCanvasState_v1*>(stat
e); |
| 328 | 328 |
| 329 if (state_v1->layerCount < 1) { | 329 if (state_v1->layerCount < 1) { |
| 330 return NULL; | 330 return NULL; |
| 331 } | 331 } |
| 332 | 332 |
| 333 SkAutoTUnref<SkCanvasStack> canvas(SkNEW_ARGS(SkCanvasStack, (state->width,
state->height))); | 333 SkAutoTUnref<SkCanvasStack> canvas(new SkCanvasStack(state->width, state->he
ight)); |
| 334 | 334 |
| 335 // setup the matrix and clip on the n-way canvas | 335 // setup the matrix and clip on the n-way canvas |
| 336 setup_canvas_from_MC_state(state_v1->mcState, canvas); | 336 setup_canvas_from_MC_state(state_v1->mcState, canvas); |
| 337 | 337 |
| 338 // Iterate over the layers and add them to the n-way canvas | 338 // Iterate over the layers and add them to the n-way canvas |
| 339 for (int i = state_v1->layerCount - 1; i >= 0; --i) { | 339 for (int i = state_v1->layerCount - 1; i >= 0; --i) { |
| 340 SkAutoTUnref<SkCanvas> canvasLayer(create_canvas_from_canvas_layer(state
_v1->layers[i])); | 340 SkAutoTUnref<SkCanvas> canvasLayer(create_canvas_from_canvas_layer(state
_v1->layers[i])); |
| 341 if (!canvasLayer.get()) { | 341 if (!canvasLayer.get()) { |
| 342 return NULL; | 342 return NULL; |
| 343 } | 343 } |
| 344 canvas->pushCanvas(canvasLayer.get(), SkIPoint::Make(state_v1->layers[i]
.x, | 344 canvas->pushCanvas(canvasLayer.get(), SkIPoint::Make(state_v1->layers[i]
.x, |
| 345 state_v1->layers[i]
.y)); | 345 state_v1->layers[i]
.y)); |
| 346 } | 346 } |
| 347 | 347 |
| 348 return canvas.detach(); | 348 return canvas.detach(); |
| 349 } | 349 } |
| 350 | 350 |
| 351 //////////////////////////////////////////////////////////////////////////////// | 351 //////////////////////////////////////////////////////////////////////////////// |
| 352 | 352 |
| 353 void SkCanvasStateUtils::ReleaseCanvasState(SkCanvasState* state) { | 353 void SkCanvasStateUtils::ReleaseCanvasState(SkCanvasState* state) { |
| 354 SkASSERT(!state || SkCanvasState_v1::kVersion == state->version); | 354 SkASSERT(!state || SkCanvasState_v1::kVersion == state->version); |
| 355 // Upcast to the correct version of SkCanvasState. This avoids having a virt
ual destructor on | 355 // Upcast to the correct version of SkCanvasState. This avoids having a virt
ual destructor on |
| 356 // SkCanvasState. That would be strange since SkCanvasState has no other vir
tual functions, and | 356 // SkCanvasState. That would be strange since SkCanvasState has no other vir
tual functions, and |
| 357 // instead uses the field "version" to determine how to behave. | 357 // instead uses the field "version" to determine how to behave. |
| 358 SkDELETE(static_cast<SkCanvasState_v1*>(state)); | 358 delete static_cast<SkCanvasState_v1*>(state); |
| 359 } | 359 } |
| OLD | NEW |