Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/core/SkPicturePlayback.cpp

Issue 2187613002: Deserialize pictures with custom image-deserializer (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698