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 |