| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "SkCanvas.h" | 8 #include "SkCanvas.h" |
| 9 #include "SkPatchUtils.h" | 9 #include "SkPatchUtils.h" |
| 10 #include "SkPictureData.h" | 10 #include "SkPictureData.h" |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 const void* text() { return (const void*)fText; } | 73 const void* text() { return (const void*)fText; } |
| 74 size_t fByteLength; | 74 size_t fByteLength; |
| 75 const char* fText; | 75 const char* fText; |
| 76 }; | 76 }; |
| 77 | 77 |
| 78 void get_text(SkReadBuffer* reader, TextContainer* text) { | 78 void get_text(SkReadBuffer* reader, TextContainer* text) { |
| 79 size_t length = text->fByteLength = reader->readInt(); | 79 size_t length = text->fByteLength = reader->readInt(); |
| 80 text->fText = (const char*)reader->skip(length); | 80 text->fText = (const char*)reader->skip(length); |
| 81 } | 81 } |
| 82 | 82 |
| 83 // FIXME: SkBitmaps are stateful, so we need to copy them to play back in multip
le threads. | |
| 84 static SkBitmap shallow_copy(const SkBitmap& bitmap) { | |
| 85 return bitmap; | |
| 86 } | |
| 87 | |
| 88 void SkPicturePlayback::draw(SkCanvas* canvas, | 83 void SkPicturePlayback::draw(SkCanvas* canvas, |
| 89 SkPicture::AbortCallback* callback, | 84 SkPicture::AbortCallback* callback, |
| 90 const SkReadBuffer* buffer) { | 85 const SkReadBuffer* buffer) { |
| 91 AutoResetOpID aroi(this); | 86 AutoResetOpID aroi(this); |
| 92 SkASSERT(0 == fCurOffset); | 87 SkASSERT(0 == fCurOffset); |
| 93 | 88 |
| 94 SkAutoTDelete<SkReadBuffer> reader; | 89 SkAutoTDelete<SkReadBuffer> reader; |
| 95 if (buffer) { | 90 if (buffer) { |
| 96 reader.reset(buffer->clone(fPictureData->opData()->bytes(), | 91 reader.reset(buffer->clone(fPictureData->opData()->bytes(), |
| 97 fPictureData->opData()->size())); | 92 fPictureData->opData()->size())); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 mode = (SkXfermode::Mode)reader->readUInt(); | 202 mode = (SkXfermode::Mode)reader->readUInt(); |
| 208 } | 203 } |
| 209 const SkRect* cull = nullptr; | 204 const SkRect* cull = nullptr; |
| 210 if (flags & DRAW_ATLAS_HAS_CULL) { | 205 if (flags & DRAW_ATLAS_HAS_CULL) { |
| 211 cull = (const SkRect*)reader->skip(sizeof(SkRect)); | 206 cull = (const SkRect*)reader->skip(sizeof(SkRect)); |
| 212 } | 207 } |
| 213 canvas->drawAtlas(atlas, xform, tex, colors, count, mode, cull, pain
t); | 208 canvas->drawAtlas(atlas, xform, tex, colors, count, mode, cull, pain
t); |
| 214 } break; | 209 } break; |
| 215 case DRAW_BITMAP: { | 210 case DRAW_BITMAP: { |
| 216 const SkPaint* paint = fPictureData->getPaint(reader); | 211 const SkPaint* paint = fPictureData->getPaint(reader); |
| 217 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); | 212 const SkImage* image = fPictureData->getBitmapAsImage(reader); |
| 218 SkPoint loc; | 213 SkPoint loc; |
| 219 reader->readPoint(&loc); | 214 reader->readPoint(&loc); |
| 220 canvas->drawBitmap(bitmap, loc.fX, loc.fY, paint); | 215 canvas->drawImage(image, loc.fX, loc.fY, paint); |
| 221 } break; | 216 } break; |
| 222 case DRAW_BITMAP_RECT: { | 217 case DRAW_BITMAP_RECT: { |
| 223 const SkPaint* paint = fPictureData->getPaint(reader); | 218 const SkPaint* paint = fPictureData->getPaint(reader); |
| 224 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); | 219 const SkImage* image = fPictureData->getBitmapAsImage(reader); |
| 225 SkRect storage; | 220 SkRect storage; |
| 226 const SkRect* src = get_rect_ptr(reader, &storage); // may be null | 221 const SkRect* src = get_rect_ptr(reader, &storage); // may be null |
| 227 SkRect dst; | 222 SkRect dst; |
| 228 reader->readRect(&dst); // required | 223 reader->readRect(&dst); // required |
| 229 SkCanvas::SrcRectConstraint constraint = (SkCanvas::SrcRectConstrain
t)reader->readInt(); | 224 SkCanvas::SrcRectConstraint constraint = (SkCanvas::SrcRectConstrain
t)reader->readInt(); |
| 230 canvas->legacy_drawBitmapRect(bitmap, src, dst, paint, constraint); | 225 if (src) { |
| 226 canvas->drawImageRect(image, *src, dst, paint, constraint); |
| 227 } else { |
| 228 canvas->drawImageRect(image, dst, paint, constraint); |
| 229 } |
| 231 } break; | 230 } break; |
| 232 case DRAW_BITMAP_MATRIX: { | 231 case DRAW_BITMAP_MATRIX: { |
| 233 const SkPaint* paint = fPictureData->getPaint(reader); | 232 const SkPaint* paint = fPictureData->getPaint(reader); |
| 234 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); | 233 const SkImage* image = fPictureData->getBitmapAsImage(reader); |
| 235 SkMatrix matrix; | 234 SkMatrix matrix; |
| 236 reader->readMatrix(&matrix); | 235 reader->readMatrix(&matrix); |
| 237 | 236 |
| 238 SkAutoCanvasRestore acr(canvas, true); | 237 SkAutoCanvasRestore acr(canvas, true); |
| 239 canvas->concat(matrix); | 238 canvas->concat(matrix); |
| 240 canvas->drawBitmap(bitmap, 0, 0, paint); | 239 canvas->drawImage(image, 0, 0, paint); |
| 241 } break; | 240 } break; |
| 242 case DRAW_BITMAP_NINE: { | 241 case DRAW_BITMAP_NINE: { |
| 243 const SkPaint* paint = fPictureData->getPaint(reader); | 242 const SkPaint* paint = fPictureData->getPaint(reader); |
| 244 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); | 243 const SkImage* image = fPictureData->getBitmapAsImage(reader); |
| 245 SkIRect src; | 244 SkIRect src; |
| 246 reader->readIRect(&src); | 245 reader->readIRect(&src); |
| 247 SkRect dst; | 246 SkRect dst; |
| 248 reader->readRect(&dst); | 247 reader->readRect(&dst); |
| 249 canvas->drawBitmapNine(bitmap, src, dst, paint); | 248 canvas->drawImageNine(image, src, dst, paint); |
| 250 } break; | 249 } break; |
| 251 case DRAW_CLEAR: | 250 case DRAW_CLEAR: |
| 252 canvas->clear(reader->readInt()); | 251 canvas->clear(reader->readInt()); |
| 253 break; | 252 break; |
| 254 case DRAW_DATA: { | 253 case DRAW_DATA: { |
| 255 // This opcode is now dead, just need to skip it for backwards compa
tibility | 254 // This opcode is now dead, just need to skip it for backwards compa
tibility |
| 256 size_t length = reader->readInt(); | 255 size_t length = reader->readInt(); |
| 257 (void)reader->skip(length); | 256 (void)reader->skip(length); |
| 258 // skip handles padding the read out to a multiple of 4 | 257 // skip handles padding the read out to a multiple of 4 |
| 259 } break; | 258 } break; |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 case DRAW_RRECT: { | 457 case DRAW_RRECT: { |
| 459 const SkPaint* paint = fPictureData->getPaint(reader); | 458 const SkPaint* paint = fPictureData->getPaint(reader); |
| 460 SkRRect rrect; | 459 SkRRect rrect; |
| 461 reader->readRRect(&rrect); | 460 reader->readRRect(&rrect); |
| 462 if (paint) { | 461 if (paint) { |
| 463 canvas->drawRRect(rrect, *paint); | 462 canvas->drawRRect(rrect, *paint); |
| 464 } | 463 } |
| 465 } break; | 464 } break; |
| 466 case DRAW_SPRITE: { | 465 case DRAW_SPRITE: { |
| 467 /* const SkPaint* paint = */ fPictureData->getPaint(reader); | 466 /* const SkPaint* paint = */ fPictureData->getPaint(reader); |
| 468 /* const SkBitmap bitmap = */ shallow_copy(fPictureData->getBitmap(r
eader)); | 467 /* const SkImage* image = */ fPictureData->getBitmapAsImage(reader); |
| 469 /* int left = */ reader->readInt(); | 468 /* int left = */ reader->readInt(); |
| 470 /* int top = */ reader->readInt(); | 469 /* int top = */ reader->readInt(); |
| 471 // drawSprite removed dec-2015 | 470 // drawSprite removed dec-2015 |
| 472 } break; | 471 } break; |
| 473 case DRAW_TEXT: { | 472 case DRAW_TEXT: { |
| 474 const SkPaint* paint = fPictureData->getPaint(reader); | 473 const SkPaint* paint = fPictureData->getPaint(reader); |
| 475 TextContainer text; | 474 TextContainer text; |
| 476 get_text(reader, &text); | 475 get_text(reader, &text); |
| 477 SkScalar x = reader->readScalar(); | 476 SkScalar x = reader->readScalar(); |
| 478 SkScalar y = reader->readScalar(); | 477 SkScalar y = reader->readScalar(); |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 case TRANSLATE_Z: { | 630 case TRANSLATE_Z: { |
| 632 #ifdef SK_EXPERIMENTAL_SHADOWING | 631 #ifdef SK_EXPERIMENTAL_SHADOWING |
| 633 SkScalar dz = reader->readScalar(); | 632 SkScalar dz = reader->readScalar(); |
| 634 canvas->translateZ(dz); | 633 canvas->translateZ(dz); |
| 635 #endif | 634 #endif |
| 636 } break; | 635 } break; |
| 637 default: | 636 default: |
| 638 SkASSERTF(false, "Unknown draw type: %d", op); | 637 SkASSERTF(false, "Unknown draw type: %d", op); |
| 639 } | 638 } |
| 640 } | 639 } |
| OLD | NEW |