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" |
11 #include "SkPicturePlayback.h" | 11 #include "SkPicturePlayback.h" |
12 #include "SkPictureRecord.h" | 12 #include "SkPictureRecord.h" |
13 #include "SkReader32.h" | 13 #include "SkReadBuffer.h" |
14 #include "SkRSXform.h" | 14 #include "SkRSXform.h" |
15 #include "SkTextBlob.h" | 15 #include "SkTextBlob.h" |
16 #include "SkTDArray.h" | 16 #include "SkTDArray.h" |
17 #include "SkTypes.h" | 17 #include "SkTypes.h" |
18 | 18 |
19 // matches old SkCanvas::SaveFlags | 19 // matches old SkCanvas::SaveFlags |
20 enum LegacySaveFlags { | 20 enum LegacySaveFlags { |
21 kHasAlphaLayer_LegacySaveFlags = 0x04, | 21 kHasAlphaLayer_LegacySaveFlags = 0x04, |
22 kClipToLayer_LegacySaveFlags = 0x10, | 22 kClipToLayer_LegacySaveFlags = 0x10, |
23 }; | 23 }; |
(...skipping 10 matching lines...) Expand all Loading... |
34 return layerFlags; | 34 return layerFlags; |
35 } | 35 } |
36 | 36 |
37 /* | 37 /* |
38 * Read the next op code and chunk size from 'reader'. The returned size | 38 * Read the next op code and chunk size from 'reader'. The returned size |
39 * is the entire size of the chunk (including the opcode). Thus, the | 39 * is the entire size of the chunk (including the opcode). Thus, the |
40 * offset just prior to calling ReadOpAndSize + 'size' is the offset | 40 * offset just prior to calling ReadOpAndSize + 'size' is the offset |
41 * to the next chunk's op code. This also means that the size of a chunk | 41 * to the next chunk's op code. This also means that the size of a chunk |
42 * with no arguments (just an opcode) will be 4. | 42 * with no arguments (just an opcode) will be 4. |
43 */ | 43 */ |
44 DrawType SkPicturePlayback::ReadOpAndSize(SkReader32* reader, uint32_t* size) { | 44 DrawType SkPicturePlayback::ReadOpAndSize(SkReadBuffer* reader, uint32_t* size)
{ |
45 uint32_t temp = reader->readInt(); | 45 uint32_t temp = reader->readInt(); |
46 uint32_t op; | 46 uint32_t op; |
47 if (((uint8_t)temp) == temp) { | 47 if (((uint8_t)temp) == temp) { |
48 // old skp file - no size information | 48 // old skp file - no size information |
49 op = temp; | 49 op = temp; |
50 *size = 0; | 50 *size = 0; |
51 } else { | 51 } else { |
52 UNPACK_8_24(temp, op, *size); | 52 UNPACK_8_24(temp, op, *size); |
53 if (MASK_24 == *size) { | 53 if (MASK_24 == *size) { |
54 *size = reader->readInt(); | 54 *size = reader->readInt(); |
55 } | 55 } |
56 } | 56 } |
57 return (DrawType)op; | 57 return (DrawType)op; |
58 } | 58 } |
59 | 59 |
60 | 60 |
61 static const SkRect* get_rect_ptr(SkReader32* reader) { | 61 static const SkRect* get_rect_ptr(SkReadBuffer* reader, SkRect* storage) { |
62 if (reader->readBool()) { | 62 if (reader->readBool()) { |
63 return &reader->skipT<SkRect>(); | 63 reader->readRect(storage); |
| 64 return storage; |
64 } else { | 65 } else { |
65 return nullptr; | 66 return nullptr; |
66 } | 67 } |
67 } | 68 } |
68 | 69 |
69 class TextContainer { | 70 class TextContainer { |
70 public: | 71 public: |
71 size_t length() { return fByteLength; } | 72 size_t length() { return fByteLength; } |
72 const void* text() { return (const void*)fText; } | 73 const void* text() { return (const void*)fText; } |
73 size_t fByteLength; | 74 size_t fByteLength; |
74 const char* fText; | 75 const char* fText; |
75 }; | 76 }; |
76 | 77 |
77 void get_text(SkReader32* reader, TextContainer* text) { | 78 void get_text(SkReadBuffer* reader, TextContainer* text) { |
78 size_t length = text->fByteLength = reader->readInt(); | 79 size_t length = text->fByteLength = reader->readInt(); |
79 text->fText = (const char*)reader->skip(length); | 80 text->fText = (const char*)reader->skip(length); |
80 } | 81 } |
81 | 82 |
82 // FIXME: SkBitmaps are stateful, so we need to copy them to play back in multip
le threads. | 83 // FIXME: SkBitmaps are stateful, so we need to copy them to play back in multip
le threads. |
83 static SkBitmap shallow_copy(const SkBitmap& bitmap) { | 84 static SkBitmap shallow_copy(const SkBitmap& bitmap) { |
84 return bitmap; | 85 return bitmap; |
85 } | 86 } |
86 | 87 |
87 void SkPicturePlayback::draw(SkCanvas* canvas, SkPicture::AbortCallback* callbac
k) { | 88 void SkPicturePlayback::draw(SkCanvas* canvas, SkPicture::AbortCallback* callbac
k) { |
88 AutoResetOpID aroi(this); | 89 AutoResetOpID aroi(this); |
89 SkASSERT(0 == fCurOffset); | 90 SkASSERT(0 == fCurOffset); |
90 | 91 |
91 SkReader32 reader(fPictureData->opData()->bytes(), fPictureData->opData()->s
ize()); | 92 SkReadBuffer reader(fPictureData->opData()->bytes(), fPictureData->opData()-
>size()); |
92 | 93 |
93 // Record this, so we can concat w/ it if we encounter a setMatrix() | 94 // Record this, so we can concat w/ it if we encounter a setMatrix() |
94 SkMatrix initialMatrix = canvas->getTotalMatrix(); | 95 SkMatrix initialMatrix = canvas->getTotalMatrix(); |
95 | 96 |
96 SkAutoCanvasRestore acr(canvas, false); | 97 SkAutoCanvasRestore acr(canvas, false); |
97 | 98 |
98 while (!reader.eof()) { | 99 while (!reader.eof()) { |
99 if (callback && callback->abort()) { | 100 if (callback && callback->abort()) { |
100 return; | 101 return; |
101 } | 102 } |
102 | 103 |
103 fCurOffset = reader.offset(); | 104 fCurOffset = reader.offset(); |
104 uint32_t size; | 105 uint32_t size; |
105 DrawType op = ReadOpAndSize(&reader, &size); | 106 DrawType op = ReadOpAndSize(&reader, &size); |
106 | 107 |
107 this->handleOp(&reader, op, size, canvas, initialMatrix); | 108 this->handleOp(&reader, op, size, canvas, initialMatrix); |
108 } | 109 } |
109 } | 110 } |
110 | 111 |
111 void SkPicturePlayback::handleOp(SkReader32* reader, | 112 void SkPicturePlayback::handleOp(SkReadBuffer* reader, |
112 DrawType op, | 113 DrawType op, |
113 uint32_t size, | 114 uint32_t size, |
114 SkCanvas* canvas, | 115 SkCanvas* canvas, |
115 const SkMatrix& initialMatrix) { | 116 const SkMatrix& initialMatrix) { |
116 switch (op) { | 117 switch (op) { |
117 case NOOP: { | 118 case NOOP: { |
118 SkASSERT(size >= 4); | 119 SkASSERT(size >= 4); |
119 reader->skip(size - 4); | 120 reader->skip(size - 4); |
120 } break; | 121 } break; |
121 case CLIP_PATH: { | 122 case CLIP_PATH: { |
122 const SkPath& path = fPictureData->getPath(reader); | 123 const SkPath& path = fPictureData->getPath(reader); |
123 uint32_t packed = reader->readInt(); | 124 uint32_t packed = reader->readInt(); |
124 SkRegion::Op regionOp = ClipParams_unpackRegionOp(packed); | 125 SkRegion::Op regionOp = ClipParams_unpackRegionOp(packed); |
125 bool doAA = ClipParams_unpackDoAA(packed); | 126 bool doAA = ClipParams_unpackDoAA(packed); |
126 size_t offsetToRestore = reader->readInt(); | 127 size_t offsetToRestore = reader->readInt(); |
127 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); | 128 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); |
128 canvas->clipPath(path, regionOp, doAA); | 129 canvas->clipPath(path, regionOp, doAA); |
129 if (canvas->isClipEmpty() && offsetToRestore) { | 130 if (canvas->isClipEmpty() && offsetToRestore) { |
130 reader->setOffset(offsetToRestore); | 131 reader->skip(offsetToRestore - reader->offset()); |
131 } | 132 } |
132 } break; | 133 } break; |
133 case CLIP_REGION: { | 134 case CLIP_REGION: { |
134 SkRegion region; | 135 SkRegion region; |
135 reader->readRegion(®ion); | 136 reader->readRegion(®ion); |
136 uint32_t packed = reader->readInt(); | 137 uint32_t packed = reader->readInt(); |
137 SkRegion::Op regionOp = ClipParams_unpackRegionOp(packed); | 138 SkRegion::Op regionOp = ClipParams_unpackRegionOp(packed); |
138 size_t offsetToRestore = reader->readInt(); | 139 size_t offsetToRestore = reader->readInt(); |
139 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); | 140 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); |
140 canvas->clipRegion(region, regionOp); | 141 canvas->clipRegion(region, regionOp); |
141 if (canvas->isClipEmpty() && offsetToRestore) { | 142 if (canvas->isClipEmpty() && offsetToRestore) { |
142 reader->setOffset(offsetToRestore); | 143 reader->skip(offsetToRestore - reader->offset()); |
143 } | 144 } |
144 } break; | 145 } break; |
145 case CLIP_RECT: { | 146 case CLIP_RECT: { |
146 const SkRect& rect = reader->skipT<SkRect>(); | 147 SkRect rect; |
| 148 reader->readRect(&rect); |
147 uint32_t packed = reader->readInt(); | 149 uint32_t packed = reader->readInt(); |
148 SkRegion::Op regionOp = ClipParams_unpackRegionOp(packed); | 150 SkRegion::Op regionOp = ClipParams_unpackRegionOp(packed); |
149 bool doAA = ClipParams_unpackDoAA(packed); | 151 bool doAA = ClipParams_unpackDoAA(packed); |
150 size_t offsetToRestore = reader->readInt(); | 152 size_t offsetToRestore = reader->readInt(); |
151 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); | 153 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); |
152 canvas->clipRect(rect, regionOp, doAA); | 154 canvas->clipRect(rect, regionOp, doAA); |
153 if (canvas->isClipEmpty() && offsetToRestore) { | 155 if (canvas->isClipEmpty() && offsetToRestore) { |
154 reader->setOffset(offsetToRestore); | 156 reader->skip(offsetToRestore - reader->offset()); |
155 } | 157 } |
156 } break; | 158 } break; |
157 case CLIP_RRECT: { | 159 case CLIP_RRECT: { |
158 SkRRect rrect; | 160 SkRRect rrect; |
159 reader->readRRect(&rrect); | 161 reader->readRRect(&rrect); |
160 uint32_t packed = reader->readInt(); | 162 uint32_t packed = reader->readInt(); |
161 SkRegion::Op regionOp = ClipParams_unpackRegionOp(packed); | 163 SkRegion::Op regionOp = ClipParams_unpackRegionOp(packed); |
162 bool doAA = ClipParams_unpackDoAA(packed); | 164 bool doAA = ClipParams_unpackDoAA(packed); |
163 size_t offsetToRestore = reader->readInt(); | 165 size_t offsetToRestore = reader->readInt(); |
164 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); | 166 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); |
165 canvas->clipRRect(rrect, regionOp, doAA); | 167 canvas->clipRRect(rrect, regionOp, doAA); |
166 if (canvas->isClipEmpty() && offsetToRestore) { | 168 if (canvas->isClipEmpty() && offsetToRestore) { |
167 reader->setOffset(offsetToRestore); | 169 reader->skip(offsetToRestore - reader->offset()); |
168 } | 170 } |
169 } break; | 171 } break; |
170 case PUSH_CULL: break; // Deprecated, safe to ignore both push and pop. | 172 case PUSH_CULL: break; // Deprecated, safe to ignore both push and pop. |
171 case POP_CULL: break; | 173 case POP_CULL: break; |
172 case CONCAT: { | 174 case CONCAT: { |
173 SkMatrix matrix; | 175 SkMatrix matrix; |
174 reader->readMatrix(&matrix); | 176 reader->readMatrix(&matrix); |
175 canvas->concat(matrix); | 177 canvas->concat(matrix); |
176 break; | 178 break; |
177 } | 179 } |
178 case DRAW_ANNOTATION: { | 180 case DRAW_ANNOTATION: { |
179 const SkRect& rect = reader->skipT<SkRect>(); | 181 SkRect rect; |
180 const char* key = reader->readString(); | 182 reader->readRect(&rect); |
181 canvas->drawAnnotation(rect, key, reader->readData().get()); | 183 SkString key; |
| 184 reader->readString(&key); |
| 185 canvas->drawAnnotation(rect, key.c_str(), reader->readByteArrayAsDat
a().get()); |
182 } break; | 186 } break; |
183 case DRAW_ATLAS: { | 187 case DRAW_ATLAS: { |
184 const SkPaint* paint = fPictureData->getPaint(reader); | 188 const SkPaint* paint = fPictureData->getPaint(reader); |
185 const SkImage* atlas = fPictureData->getImage(reader); | 189 const SkImage* atlas = fPictureData->getImage(reader); |
186 const uint32_t flags = reader->readU32(); | 190 const uint32_t flags = reader->readUInt(); |
187 const int count = reader->readU32(); | 191 const int count = reader->readUInt(); |
188 const SkRSXform* xform = (const SkRSXform*)reader->skip(count * size
of(SkRSXform)); | 192 const SkRSXform* xform = (const SkRSXform*)reader->skip(count * size
of(SkRSXform)); |
189 const SkRect* tex = (const SkRect*)reader->skip(count * sizeof(SkRec
t)); | 193 const SkRect* tex = (const SkRect*)reader->skip(count * sizeof(SkRec
t)); |
190 const SkColor* colors = nullptr; | 194 const SkColor* colors = nullptr; |
191 SkXfermode::Mode mode = SkXfermode::kDst_Mode; | 195 SkXfermode::Mode mode = SkXfermode::kDst_Mode; |
192 if (flags & DRAW_ATLAS_HAS_COLORS) { | 196 if (flags & DRAW_ATLAS_HAS_COLORS) { |
193 colors = (const SkColor*)reader->skip(count * sizeof(SkColor)); | 197 colors = (const SkColor*)reader->skip(count * sizeof(SkColor)); |
194 mode = (SkXfermode::Mode)reader->readU32(); | 198 mode = (SkXfermode::Mode)reader->readUInt(); |
195 } | 199 } |
196 const SkRect* cull = nullptr; | 200 const SkRect* cull = nullptr; |
197 if (flags & DRAW_ATLAS_HAS_CULL) { | 201 if (flags & DRAW_ATLAS_HAS_CULL) { |
198 cull = (const SkRect*)reader->skip(sizeof(SkRect)); | 202 cull = (const SkRect*)reader->skip(sizeof(SkRect)); |
199 } | 203 } |
200 canvas->drawAtlas(atlas, xform, tex, colors, count, mode, cull, pain
t); | 204 canvas->drawAtlas(atlas, xform, tex, colors, count, mode, cull, pain
t); |
201 } break; | 205 } break; |
202 case DRAW_BITMAP: { | 206 case DRAW_BITMAP: { |
203 const SkPaint* paint = fPictureData->getPaint(reader); | 207 const SkPaint* paint = fPictureData->getPaint(reader); |
204 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); | 208 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); |
205 const SkPoint& loc = reader->skipT<SkPoint>(); | 209 SkPoint loc; |
| 210 reader->readPoint(&loc); |
206 canvas->drawBitmap(bitmap, loc.fX, loc.fY, paint); | 211 canvas->drawBitmap(bitmap, loc.fX, loc.fY, paint); |
207 } break; | 212 } break; |
208 case DRAW_BITMAP_RECT: { | 213 case DRAW_BITMAP_RECT: { |
209 const SkPaint* paint = fPictureData->getPaint(reader); | 214 const SkPaint* paint = fPictureData->getPaint(reader); |
210 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); | 215 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); |
211 const SkRect* src = get_rect_ptr(reader); // may be null | 216 SkRect storage; |
212 const SkRect& dst = reader->skipT<SkRect>(); // required | 217 const SkRect* src = get_rect_ptr(reader, &storage); // may be null |
| 218 SkRect dst; |
| 219 reader->readRect(&dst); // required |
213 SkCanvas::SrcRectConstraint constraint = (SkCanvas::SrcRectConstrain
t)reader->readInt(); | 220 SkCanvas::SrcRectConstraint constraint = (SkCanvas::SrcRectConstrain
t)reader->readInt(); |
214 canvas->legacy_drawBitmapRect(bitmap, src, dst, paint, constraint); | 221 canvas->legacy_drawBitmapRect(bitmap, src, dst, paint, constraint); |
215 } break; | 222 } break; |
216 case DRAW_BITMAP_MATRIX: { | 223 case DRAW_BITMAP_MATRIX: { |
217 const SkPaint* paint = fPictureData->getPaint(reader); | 224 const SkPaint* paint = fPictureData->getPaint(reader); |
218 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); | 225 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); |
219 SkMatrix matrix; | 226 SkMatrix matrix; |
220 reader->readMatrix(&matrix); | 227 reader->readMatrix(&matrix); |
221 | 228 |
222 SkAutoCanvasRestore acr(canvas, true); | 229 SkAutoCanvasRestore acr(canvas, true); |
223 canvas->concat(matrix); | 230 canvas->concat(matrix); |
224 canvas->drawBitmap(bitmap, 0, 0, paint); | 231 canvas->drawBitmap(bitmap, 0, 0, paint); |
225 } break; | 232 } break; |
226 case DRAW_BITMAP_NINE: { | 233 case DRAW_BITMAP_NINE: { |
227 const SkPaint* paint = fPictureData->getPaint(reader); | 234 const SkPaint* paint = fPictureData->getPaint(reader); |
228 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); | 235 const SkBitmap bitmap = shallow_copy(fPictureData->getBitmap(reader)
); |
229 const SkIRect& src = reader->skipT<SkIRect>(); | 236 SkIRect src; |
230 const SkRect& dst = reader->skipT<SkRect>(); | 237 reader->readIRect(&src); |
| 238 SkRect dst; |
| 239 reader->readRect(&dst); |
231 canvas->drawBitmapNine(bitmap, src, dst, paint); | 240 canvas->drawBitmapNine(bitmap, src, dst, paint); |
232 } break; | 241 } break; |
233 case DRAW_CLEAR: | 242 case DRAW_CLEAR: |
234 canvas->clear(reader->readInt()); | 243 canvas->clear(reader->readInt()); |
235 break; | 244 break; |
236 case DRAW_DATA: { | 245 case DRAW_DATA: { |
237 // This opcode is now dead, just need to skip it for backwards compa
tibility | 246 // This opcode is now dead, just need to skip it for backwards compa
tibility |
238 size_t length = reader->readInt(); | 247 size_t length = reader->readInt(); |
239 (void)reader->skip(length); | 248 (void)reader->skip(length); |
240 // skip handles padding the read out to a multiple of 4 | 249 // skip handles padding the read out to a multiple of 4 |
241 } break; | 250 } break; |
242 case DRAW_DRRECT: { | 251 case DRAW_DRRECT: { |
243 const SkPaint& paint = *fPictureData->getPaint(reader); | 252 const SkPaint& paint = *fPictureData->getPaint(reader); |
244 SkRRect outer, inner; | 253 SkRRect outer, inner; |
245 reader->readRRect(&outer); | 254 reader->readRRect(&outer); |
246 reader->readRRect(&inner); | 255 reader->readRRect(&inner); |
247 canvas->drawDRRect(outer, inner, paint); | 256 canvas->drawDRRect(outer, inner, paint); |
248 } break; | 257 } break; |
249 case BEGIN_COMMENT_GROUP: | 258 case BEGIN_COMMENT_GROUP: { |
250 reader->readString(); | 259 SkString tmp; |
| 260 reader->readString(&tmp); |
251 // deprecated (M44) | 261 // deprecated (M44) |
252 break; | 262 break; |
253 case COMMENT: | 263 } |
254 reader->readString(); | 264 case COMMENT: { |
255 reader->readString(); | 265 SkString tmp; |
| 266 reader->readString(&tmp); |
| 267 reader->readString(&tmp); |
256 // deprecated (M44) | 268 // deprecated (M44) |
257 break; | 269 break; |
| 270 } |
258 case END_COMMENT_GROUP: | 271 case END_COMMENT_GROUP: |
259 // deprecated (M44) | 272 // deprecated (M44) |
260 break; | 273 break; |
261 case DRAW_IMAGE: { | 274 case DRAW_IMAGE: { |
262 const SkPaint* paint = fPictureData->getPaint(reader); | 275 const SkPaint* paint = fPictureData->getPaint(reader); |
263 const SkImage* image = fPictureData->getImage(reader); | 276 const SkImage* image = fPictureData->getImage(reader); |
264 const SkPoint& loc = reader->skipT<SkPoint>(); | 277 SkPoint loc; |
| 278 reader->readPoint(&loc); |
265 canvas->drawImage(image, loc.fX, loc.fY, paint); | 279 canvas->drawImage(image, loc.fX, loc.fY, paint); |
266 } break; | 280 } break; |
267 case DRAW_IMAGE_NINE: { | 281 case DRAW_IMAGE_NINE: { |
268 const SkPaint* paint = fPictureData->getPaint(reader); | 282 const SkPaint* paint = fPictureData->getPaint(reader); |
269 const SkImage* image = fPictureData->getImage(reader); | 283 const SkImage* image = fPictureData->getImage(reader); |
270 const SkIRect& center = reader->skipT<SkIRect>(); | 284 SkIRect center; |
271 const SkRect& dst = reader->skipT<SkRect>(); | 285 reader->readIRect(¢er); |
| 286 SkRect dst; |
| 287 reader->readRect(&dst); |
272 canvas->drawImageNine(image, center, dst, paint); | 288 canvas->drawImageNine(image, center, dst, paint); |
273 } break; | 289 } break; |
274 case DRAW_IMAGE_RECT_STRICT: | 290 case DRAW_IMAGE_RECT_STRICT: |
275 case DRAW_IMAGE_RECT: { | 291 case DRAW_IMAGE_RECT: { |
276 const SkPaint* paint = fPictureData->getPaint(reader); | 292 const SkPaint* paint = fPictureData->getPaint(reader); |
277 const SkImage* image = fPictureData->getImage(reader); | 293 const SkImage* image = fPictureData->getImage(reader); |
278 const SkRect* src = get_rect_ptr(reader); // may be null | 294 SkRect storage; |
279 const SkRect& dst = reader->skipT<SkRect>(); // required | 295 const SkRect* src = get_rect_ptr(reader, &storage); // may be null |
| 296 SkRect dst; |
| 297 reader->readRect(&dst); // required |
280 // DRAW_IMAGE_RECT_STRICT assumes this constraint, and doesn't store
it | 298 // DRAW_IMAGE_RECT_STRICT assumes this constraint, and doesn't store
it |
281 SkCanvas::SrcRectConstraint constraint = SkCanvas::kStrict_SrcRectCo
nstraint; | 299 SkCanvas::SrcRectConstraint constraint = SkCanvas::kStrict_SrcRectCo
nstraint; |
282 if (DRAW_IMAGE_RECT == op) { | 300 if (DRAW_IMAGE_RECT == op) { |
283 // newer op-code stores the constraint explicitly | 301 // newer op-code stores the constraint explicitly |
284 constraint = (SkCanvas::SrcRectConstraint)reader->readInt(); | 302 constraint = (SkCanvas::SrcRectConstraint)reader->readInt(); |
285 } | 303 } |
286 canvas->legacy_drawImageRect(image, src, dst, paint, constraint); | 304 canvas->legacy_drawImageRect(image, src, dst, paint, constraint); |
287 } break; | 305 } break; |
288 case DRAW_OVAL: { | 306 case DRAW_OVAL: { |
289 const SkPaint& paint = *fPictureData->getPaint(reader); | 307 const SkPaint& paint = *fPictureData->getPaint(reader); |
290 canvas->drawOval(reader->skipT<SkRect>(), paint); | 308 SkRect rect; |
| 309 reader->readRect(&rect); |
| 310 canvas->drawOval(rect, paint); |
291 } break; | 311 } break; |
292 case DRAW_PAINT: | 312 case DRAW_PAINT: |
293 canvas->drawPaint(*fPictureData->getPaint(reader)); | 313 canvas->drawPaint(*fPictureData->getPaint(reader)); |
294 break; | 314 break; |
295 case DRAW_PATCH: { | 315 case DRAW_PATCH: { |
296 const SkPaint& paint = *fPictureData->getPaint(reader); | 316 const SkPaint& paint = *fPictureData->getPaint(reader); |
297 | 317 |
298 const SkPoint* cubics = (const SkPoint*)reader->skip(SkPatchUtils::k
NumCtrlPts * | 318 const SkPoint* cubics = (const SkPoint*)reader->skip(SkPatchUtils::k
NumCtrlPts * |
299 sizeof(SkPoint)
); | 319 sizeof(SkPoint)
); |
300 uint32_t flag = reader->readInt(); | 320 uint32_t flag = reader->readInt(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 const SkScalar* xpos = (const SkScalar*)reader->skip((3 + xCount) *
sizeof(SkScalar)); | 395 const SkScalar* xpos = (const SkScalar*)reader->skip((3 + xCount) *
sizeof(SkScalar)); |
376 const SkScalar top = *xpos++; | 396 const SkScalar top = *xpos++; |
377 const SkScalar bottom = *xpos++; | 397 const SkScalar bottom = *xpos++; |
378 const SkScalar constY = *xpos++; | 398 const SkScalar constY = *xpos++; |
379 if (!canvas->quickRejectY(top, bottom)) { | 399 if (!canvas->quickRejectY(top, bottom)) { |
380 canvas->drawPosTextH(text.text(), text.length(), xpos, constY, p
aint); | 400 canvas->drawPosTextH(text.text(), text.length(), xpos, constY, p
aint); |
381 } | 401 } |
382 } break; | 402 } break; |
383 case DRAW_RECT: { | 403 case DRAW_RECT: { |
384 const SkPaint& paint = *fPictureData->getPaint(reader); | 404 const SkPaint& paint = *fPictureData->getPaint(reader); |
385 canvas->drawRect(reader->skipT<SkRect>(), paint); | 405 SkRect rect; |
| 406 reader->readRect(&rect); |
| 407 canvas->drawRect(rect, paint); |
386 } break; | 408 } break; |
387 case DRAW_RRECT: { | 409 case DRAW_RRECT: { |
388 const SkPaint& paint = *fPictureData->getPaint(reader); | 410 const SkPaint& paint = *fPictureData->getPaint(reader); |
389 SkRRect rrect; | 411 SkRRect rrect; |
390 reader->readRRect(&rrect); | 412 reader->readRRect(&rrect); |
391 canvas->drawRRect(rrect, paint); | 413 canvas->drawRRect(rrect, paint); |
392 } break; | 414 } break; |
393 case DRAW_SPRITE: { | 415 case DRAW_SPRITE: { |
394 /* const SkPaint* paint = */ fPictureData->getPaint(reader); | 416 /* const SkPaint* paint = */ fPictureData->getPaint(reader); |
395 /* const SkBitmap bitmap = */ shallow_copy(fPictureData->getBitmap(r
eader)); | 417 /* const SkBitmap bitmap = */ shallow_copy(fPictureData->getBitmap(r
eader)); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 break; | 494 break; |
473 case SAVE: | 495 case SAVE: |
474 // SKPs with version < 29 also store a SaveFlags param. | 496 // SKPs with version < 29 also store a SaveFlags param. |
475 if (size > 4) { | 497 if (size > 4) { |
476 SkASSERT(8 == size); | 498 SkASSERT(8 == size); |
477 reader->readInt(); | 499 reader->readInt(); |
478 } | 500 } |
479 canvas->save(); | 501 canvas->save(); |
480 break; | 502 break; |
481 case SAVE_LAYER_SAVEFLAGS_DEPRECATED: { | 503 case SAVE_LAYER_SAVEFLAGS_DEPRECATED: { |
482 const SkRect* boundsPtr = get_rect_ptr(reader); | 504 SkRect storage; |
| 505 const SkRect* boundsPtr = get_rect_ptr(reader, &storage); |
483 const SkPaint* paint = fPictureData->getPaint(reader); | 506 const SkPaint* paint = fPictureData->getPaint(reader); |
484 auto flags = SkCanvas::LegacySaveFlagsToSaveLayerFlags(reader->readI
nt()); | 507 auto flags = SkCanvas::LegacySaveFlagsToSaveLayerFlags(reader->readI
nt()); |
485 canvas->saveLayer(SkCanvas::SaveLayerRec(boundsPtr, paint, flags)); | 508 canvas->saveLayer(SkCanvas::SaveLayerRec(boundsPtr, paint, flags)); |
486 } break; | 509 } break; |
487 case SAVE_LAYER_SAVELAYERFLAGS_DEPRECATED_JAN_2016: { | 510 case SAVE_LAYER_SAVELAYERFLAGS_DEPRECATED_JAN_2016: { |
488 const SkRect* boundsPtr = get_rect_ptr(reader); | 511 SkRect storage; |
| 512 const SkRect* boundsPtr = get_rect_ptr(reader, &storage); |
489 const SkPaint* paint = fPictureData->getPaint(reader); | 513 const SkPaint* paint = fPictureData->getPaint(reader); |
490 canvas->saveLayer(SkCanvas::SaveLayerRec(boundsPtr, paint, reader->r
eadInt())); | 514 canvas->saveLayer(SkCanvas::SaveLayerRec(boundsPtr, paint, reader->r
eadInt())); |
491 } break; | 515 } break; |
492 case SAVE_LAYER_SAVELAYERREC: { | 516 case SAVE_LAYER_SAVELAYERREC: { |
493 SkCanvas::SaveLayerRec rec(nullptr, nullptr, nullptr, 0); | 517 SkCanvas::SaveLayerRec rec(nullptr, nullptr, nullptr, 0); |
494 const uint32_t flatFlags = reader->readInt(); | 518 const uint32_t flatFlags = reader->readInt(); |
| 519 SkRect bounds; |
495 if (flatFlags & SAVELAYERREC_HAS_BOUNDS) { | 520 if (flatFlags & SAVELAYERREC_HAS_BOUNDS) { |
496 rec.fBounds = &reader->skipT<SkRect>(); | 521 reader->readRect(&bounds); |
| 522 rec.fBounds = &bounds; |
497 } | 523 } |
498 if (flatFlags & SAVELAYERREC_HAS_PAINT) { | 524 if (flatFlags & SAVELAYERREC_HAS_PAINT) { |
499 rec.fPaint = fPictureData->getPaint(reader); | 525 rec.fPaint = fPictureData->getPaint(reader); |
500 } | 526 } |
501 if (flatFlags & SAVELAYERREC_HAS_BACKDROP) { | 527 if (flatFlags & SAVELAYERREC_HAS_BACKDROP) { |
502 const SkPaint* paint = fPictureData->getPaint(reader); | 528 const SkPaint* paint = fPictureData->getPaint(reader); |
503 rec.fBackdrop = paint->getImageFilter(); | 529 rec.fBackdrop = paint->getImageFilter(); |
504 } | 530 } |
505 if (flatFlags & SAVELAYERREC_HAS_FLAGS) { | 531 if (flatFlags & SAVELAYERREC_HAS_FLAGS) { |
506 rec.fSaveLayerFlags = reader->readInt(); | 532 rec.fSaveLayerFlags = reader->readInt(); |
(...skipping 18 matching lines...) Expand all Loading... |
525 } break; | 551 } break; |
526 case TRANSLATE: { | 552 case TRANSLATE: { |
527 SkScalar dx = reader->readScalar(); | 553 SkScalar dx = reader->readScalar(); |
528 SkScalar dy = reader->readScalar(); | 554 SkScalar dy = reader->readScalar(); |
529 canvas->translate(dx, dy); | 555 canvas->translate(dx, dy); |
530 } break; | 556 } break; |
531 default: | 557 default: |
532 SkASSERTF(false, "Unknown draw type: %d", op); | 558 SkASSERTF(false, "Unknown draw type: %d", op); |
533 } | 559 } |
534 } | 560 } |
OLD | NEW |