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 |