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 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 case DRAW_RRECT: { | 445 case DRAW_RRECT: { |
447 const SkPaint* paint = fPictureData->getPaint(reader); | 446 const SkPaint* paint = fPictureData->getPaint(reader); |
448 SkRRect rrect; | 447 SkRRect rrect; |
449 reader->readRRect(&rrect); | 448 reader->readRRect(&rrect); |
450 if (paint) { | 449 if (paint) { |
451 canvas->drawRRect(rrect, *paint); | 450 canvas->drawRRect(rrect, *paint); |
452 } | 451 } |
453 } break; | 452 } break; |
454 case DRAW_SPRITE: { | 453 case DRAW_SPRITE: { |
455 /* const SkPaint* paint = */ fPictureData->getPaint(reader); | 454 /* const SkPaint* paint = */ fPictureData->getPaint(reader); |
456 /* const SkBitmap bitmap = */ shallow_copy(fPictureData->getBitmap(r
eader)); | 455 /* const SkImage* image = */ fPictureData->getBitmapAsImage(reader); |
457 /* int left = */ reader->readInt(); | 456 /* int left = */ reader->readInt(); |
458 /* int top = */ reader->readInt(); | 457 /* int top = */ reader->readInt(); |
459 // drawSprite removed dec-2015 | 458 // drawSprite removed dec-2015 |
460 } break; | 459 } break; |
461 case DRAW_TEXT: { | 460 case DRAW_TEXT: { |
462 const SkPaint* paint = fPictureData->getPaint(reader); | 461 const SkPaint* paint = fPictureData->getPaint(reader); |
463 TextContainer text; | 462 TextContainer text; |
464 get_text(reader, &text); | 463 get_text(reader, &text); |
465 SkScalar x = reader->readScalar(); | 464 SkScalar x = reader->readScalar(); |
466 SkScalar y = reader->readScalar(); | 465 SkScalar y = reader->readScalar(); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 case TRANSLATE_Z: { | 618 case TRANSLATE_Z: { |
620 #ifdef SK_EXPERIMENTAL_SHADOWING | 619 #ifdef SK_EXPERIMENTAL_SHADOWING |
621 SkScalar dz = reader->readScalar(); | 620 SkScalar dz = reader->readScalar(); |
622 canvas->translateZ(dz); | 621 canvas->translateZ(dz); |
623 #endif | 622 #endif |
624 } break; | 623 } break; |
625 default: | 624 default: |
626 SkASSERTF(false, "Unknown draw type: %d", op); | 625 SkASSERTF(false, "Unknown draw type: %d", op); |
627 } | 626 } |
628 } | 627 } |
OLD | NEW |