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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 if (buffer) { | 119 if (buffer) { |
120 buffer->validate(reader->isValid()); | 120 buffer->validate(reader->isValid()); |
121 } | 121 } |
122 } | 122 } |
123 | 123 |
124 void SkPicturePlayback::handleOp(SkReadBuffer* reader, | 124 void SkPicturePlayback::handleOp(SkReadBuffer* reader, |
125 DrawType op, | 125 DrawType op, |
126 uint32_t size, | 126 uint32_t size, |
127 SkCanvas* canvas, | 127 SkCanvas* canvas, |
128 const SkMatrix& initialMatrix) { | 128 const SkMatrix& initialMatrix) { |
| 129 #define BREAK_ON_READ_ERROR(r) if (!r->isValid()) { break; } |
| 130 |
129 switch (op) { | 131 switch (op) { |
130 case NOOP: { | 132 case NOOP: { |
131 SkASSERT(size >= 4); | 133 SkASSERT(size >= 4); |
132 reader->skip(size - 4); | 134 reader->skip(size - 4); |
133 } break; | 135 } break; |
134 case CLIP_PATH: { | 136 case CLIP_PATH: { |
135 const SkPath& path = fPictureData->getPath(reader); | 137 const SkPath& path = fPictureData->getPath(reader); |
136 uint32_t packed = reader->readInt(); | 138 uint32_t packed = reader->readInt(); |
137 SkCanvas::ClipOp clipOp = ClipParams_unpackRegionOp(packed); | 139 SkCanvas::ClipOp clipOp = ClipParams_unpackRegionOp(packed); |
138 bool doAA = ClipParams_unpackDoAA(packed); | 140 bool doAA = ClipParams_unpackDoAA(packed); |
139 size_t offsetToRestore = reader->readInt(); | 141 size_t offsetToRestore = reader->readInt(); |
| 142 BREAK_ON_READ_ERROR(reader); |
| 143 |
140 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); | 144 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); |
141 canvas->clipPath(path, clipOp, doAA); | 145 canvas->clipPath(path, clipOp, doAA); |
142 if (canvas->isClipEmpty() && offsetToRestore) { | 146 if (canvas->isClipEmpty() && offsetToRestore) { |
143 reader->skip(offsetToRestore - reader->offset()); | 147 reader->skip(offsetToRestore - reader->offset()); |
144 } | 148 } |
145 } break; | 149 } break; |
146 case CLIP_REGION: { | 150 case CLIP_REGION: { |
147 SkRegion region; | 151 SkRegion region; |
148 reader->readRegion(®ion); | 152 reader->readRegion(®ion); |
149 uint32_t packed = reader->readInt(); | 153 uint32_t packed = reader->readInt(); |
150 SkCanvas::ClipOp clipOp = ClipParams_unpackRegionOp(packed); | 154 SkCanvas::ClipOp clipOp = ClipParams_unpackRegionOp(packed); |
151 size_t offsetToRestore = reader->readInt(); | 155 size_t offsetToRestore = reader->readInt(); |
| 156 BREAK_ON_READ_ERROR(reader); |
| 157 |
152 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); | 158 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); |
153 canvas->clipRegion(region, clipOp); | 159 canvas->clipRegion(region, clipOp); |
154 if (canvas->isClipEmpty() && offsetToRestore) { | 160 if (canvas->isClipEmpty() && offsetToRestore) { |
155 reader->skip(offsetToRestore - reader->offset()); | 161 reader->skip(offsetToRestore - reader->offset()); |
156 } | 162 } |
157 } break; | 163 } break; |
158 case CLIP_RECT: { | 164 case CLIP_RECT: { |
159 SkRect rect; | 165 SkRect rect; |
160 reader->readRect(&rect); | 166 reader->readRect(&rect); |
161 uint32_t packed = reader->readInt(); | 167 uint32_t packed = reader->readInt(); |
162 SkCanvas::ClipOp clipOp = ClipParams_unpackRegionOp(packed); | 168 SkCanvas::ClipOp clipOp = ClipParams_unpackRegionOp(packed); |
163 bool doAA = ClipParams_unpackDoAA(packed); | 169 bool doAA = ClipParams_unpackDoAA(packed); |
164 size_t offsetToRestore = reader->readInt(); | 170 size_t offsetToRestore = reader->readInt(); |
| 171 BREAK_ON_READ_ERROR(reader); |
| 172 |
165 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); | 173 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); |
166 canvas->clipRect(rect, clipOp, doAA); | 174 canvas->clipRect(rect, clipOp, doAA); |
167 if (canvas->isClipEmpty() && offsetToRestore) { | 175 if (canvas->isClipEmpty() && offsetToRestore) { |
168 reader->skip(offsetToRestore - reader->offset()); | 176 reader->skip(offsetToRestore - reader->offset()); |
169 } | 177 } |
170 } break; | 178 } break; |
171 case CLIP_RRECT: { | 179 case CLIP_RRECT: { |
172 SkRRect rrect; | 180 SkRRect rrect; |
173 reader->readRRect(&rrect); | 181 reader->readRRect(&rrect); |
174 uint32_t packed = reader->readInt(); | 182 uint32_t packed = reader->readInt(); |
175 SkCanvas::ClipOp clipOp = ClipParams_unpackRegionOp(packed); | 183 SkCanvas::ClipOp clipOp = ClipParams_unpackRegionOp(packed); |
176 bool doAA = ClipParams_unpackDoAA(packed); | 184 bool doAA = ClipParams_unpackDoAA(packed); |
177 size_t offsetToRestore = reader->readInt(); | 185 size_t offsetToRestore = reader->readInt(); |
| 186 BREAK_ON_READ_ERROR(reader); |
| 187 |
178 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); | 188 SkASSERT(!offsetToRestore || offsetToRestore >= reader->offset()); |
179 canvas->clipRRect(rrect, clipOp, doAA); | 189 canvas->clipRRect(rrect, clipOp, doAA); |
180 if (canvas->isClipEmpty() && offsetToRestore) { | 190 if (canvas->isClipEmpty() && offsetToRestore) { |
181 reader->skip(offsetToRestore - reader->offset()); | 191 reader->skip(offsetToRestore - reader->offset()); |
182 } | 192 } |
183 } break; | 193 } break; |
184 case PUSH_CULL: break; // Deprecated, safe to ignore both push and pop. | 194 case PUSH_CULL: break; // Deprecated, safe to ignore both push and pop. |
185 case POP_CULL: break; | 195 case POP_CULL: break; |
186 case CONCAT: { | 196 case CONCAT: { |
187 SkMatrix matrix; | 197 SkMatrix matrix; |
188 reader->readMatrix(&matrix); | 198 reader->readMatrix(&matrix); |
| 199 BREAK_ON_READ_ERROR(reader); |
| 200 |
189 canvas->concat(matrix); | 201 canvas->concat(matrix); |
190 break; | 202 break; |
191 } | 203 } |
192 case DRAW_ANNOTATION: { | 204 case DRAW_ANNOTATION: { |
193 SkRect rect; | 205 SkRect rect; |
194 reader->readRect(&rect); | 206 reader->readRect(&rect); |
195 SkString key; | 207 SkString key; |
196 reader->readString(&key); | 208 reader->readString(&key); |
197 canvas->drawAnnotation(rect, key.c_str(), reader->readByteArrayAsDat
a().get()); | 209 sk_sp<SkData> data = reader->readByteArrayAsData(); |
| 210 BREAK_ON_READ_ERROR(reader); |
| 211 |
| 212 canvas->drawAnnotation(rect, key.c_str(), data.get()); |
198 } break; | 213 } break; |
199 case DRAW_ARC: { | 214 case DRAW_ARC: { |
200 const SkPaint* paint = fPictureData->getPaint(reader); | 215 const SkPaint* paint = fPictureData->getPaint(reader); |
201 SkRect rect; | 216 SkRect rect; |
202 reader->readRect(&rect); | 217 reader->readRect(&rect); |
203 SkScalar startAngle = reader->readScalar(); | 218 SkScalar startAngle = reader->readScalar(); |
204 SkScalar sweepAngle = reader->readScalar(); | 219 SkScalar sweepAngle = reader->readScalar(); |
205 int useCenter = reader->readInt(); | 220 int useCenter = reader->readInt(); |
| 221 BREAK_ON_READ_ERROR(reader); |
| 222 |
206 if (paint) { | 223 if (paint) { |
207 canvas->drawArc(rect, startAngle, sweepAngle, SkToBool(useCenter
), *paint); | 224 canvas->drawArc(rect, startAngle, sweepAngle, SkToBool(useCenter
), *paint); |
208 } | 225 } |
209 } break; | 226 } break; |
210 case DRAW_ATLAS: { | 227 case DRAW_ATLAS: { |
211 const SkPaint* paint = fPictureData->getPaint(reader); | 228 const SkPaint* paint = fPictureData->getPaint(reader); |
212 const SkImage* atlas = fPictureData->getImage(reader); | 229 const SkImage* atlas = fPictureData->getImage(reader); |
213 const uint32_t flags = reader->readUInt(); | 230 const uint32_t flags = reader->readUInt(); |
214 const int count = reader->readUInt(); | 231 const int count = reader->readUInt(); |
215 const SkRSXform* xform = (const SkRSXform*)reader->skip(count * size
of(SkRSXform)); | 232 const SkRSXform* xform = (const SkRSXform*)reader->skip(count * size
of(SkRSXform)); |
216 const SkRect* tex = (const SkRect*)reader->skip(count * sizeof(SkRec
t)); | 233 const SkRect* tex = (const SkRect*)reader->skip(count * sizeof(SkRec
t)); |
217 const SkColor* colors = nullptr; | 234 const SkColor* colors = nullptr; |
218 SkXfermode::Mode mode = SkXfermode::kDst_Mode; | 235 SkXfermode::Mode mode = SkXfermode::kDst_Mode; |
219 if (flags & DRAW_ATLAS_HAS_COLORS) { | 236 if (flags & DRAW_ATLAS_HAS_COLORS) { |
220 colors = (const SkColor*)reader->skip(count * sizeof(SkColor)); | 237 colors = (const SkColor*)reader->skip(count * sizeof(SkColor)); |
221 mode = (SkXfermode::Mode)reader->readUInt(); | 238 mode = (SkXfermode::Mode)reader->readUInt(); |
222 } | 239 } |
223 const SkRect* cull = nullptr; | 240 const SkRect* cull = nullptr; |
224 if (flags & DRAW_ATLAS_HAS_CULL) { | 241 if (flags & DRAW_ATLAS_HAS_CULL) { |
225 cull = (const SkRect*)reader->skip(sizeof(SkRect)); | 242 cull = (const SkRect*)reader->skip(sizeof(SkRect)); |
226 } | 243 } |
| 244 BREAK_ON_READ_ERROR(reader); |
| 245 |
227 canvas->drawAtlas(atlas, xform, tex, colors, count, mode, cull, pain
t); | 246 canvas->drawAtlas(atlas, xform, tex, colors, count, mode, cull, pain
t); |
228 } break; | 247 } break; |
229 case DRAW_BITMAP: { | 248 case DRAW_BITMAP: { |
230 const SkPaint* paint = fPictureData->getPaint(reader); | 249 const SkPaint* paint = fPictureData->getPaint(reader); |
231 const SkImage* image = fPictureData->getBitmapAsImage(reader); | 250 const SkImage* image = fPictureData->getBitmapAsImage(reader); |
232 SkPoint loc; | 251 SkPoint loc; |
233 reader->readPoint(&loc); | 252 reader->readPoint(&loc); |
| 253 BREAK_ON_READ_ERROR(reader); |
| 254 |
234 canvas->drawImage(image, loc.fX, loc.fY, paint); | 255 canvas->drawImage(image, loc.fX, loc.fY, paint); |
235 } break; | 256 } break; |
236 case DRAW_BITMAP_RECT: { | 257 case DRAW_BITMAP_RECT: { |
237 const SkPaint* paint = fPictureData->getPaint(reader); | 258 const SkPaint* paint = fPictureData->getPaint(reader); |
238 const SkImage* image = fPictureData->getBitmapAsImage(reader); | 259 const SkImage* image = fPictureData->getBitmapAsImage(reader); |
239 SkRect storage; | 260 SkRect storage; |
240 const SkRect* src = get_rect_ptr(reader, &storage); // may be null | 261 const SkRect* src = get_rect_ptr(reader, &storage); // may be null |
241 SkRect dst; | 262 SkRect dst; |
242 reader->readRect(&dst); // required | 263 reader->readRect(&dst); // required |
243 SkCanvas::SrcRectConstraint constraint = (SkCanvas::SrcRectConstrain
t)reader->readInt(); | 264 SkCanvas::SrcRectConstraint constraint = (SkCanvas::SrcRectConstrain
t)reader->readInt(); |
| 265 BREAK_ON_READ_ERROR(reader); |
| 266 |
244 if (src) { | 267 if (src) { |
245 canvas->drawImageRect(image, *src, dst, paint, constraint); | 268 canvas->drawImageRect(image, *src, dst, paint, constraint); |
246 } else { | 269 } else { |
247 canvas->drawImageRect(image, dst, paint, constraint); | 270 canvas->drawImageRect(image, dst, paint, constraint); |
248 } | 271 } |
249 } break; | 272 } break; |
250 case DRAW_BITMAP_MATRIX: { | 273 case DRAW_BITMAP_MATRIX: { |
251 const SkPaint* paint = fPictureData->getPaint(reader); | 274 const SkPaint* paint = fPictureData->getPaint(reader); |
252 const SkImage* image = fPictureData->getBitmapAsImage(reader); | 275 const SkImage* image = fPictureData->getBitmapAsImage(reader); |
253 SkMatrix matrix; | 276 SkMatrix matrix; |
254 reader->readMatrix(&matrix); | 277 reader->readMatrix(&matrix); |
| 278 BREAK_ON_READ_ERROR(reader); |
255 | 279 |
256 SkAutoCanvasRestore acr(canvas, true); | 280 SkAutoCanvasRestore acr(canvas, true); |
257 canvas->concat(matrix); | 281 canvas->concat(matrix); |
258 canvas->drawImage(image, 0, 0, paint); | 282 canvas->drawImage(image, 0, 0, paint); |
259 } break; | 283 } break; |
260 case DRAW_BITMAP_NINE: { | 284 case DRAW_BITMAP_NINE: { |
261 const SkPaint* paint = fPictureData->getPaint(reader); | 285 const SkPaint* paint = fPictureData->getPaint(reader); |
262 const SkImage* image = fPictureData->getBitmapAsImage(reader); | 286 const SkImage* image = fPictureData->getBitmapAsImage(reader); |
263 SkIRect src; | 287 SkIRect src; |
264 reader->readIRect(&src); | 288 reader->readIRect(&src); |
265 SkRect dst; | 289 SkRect dst; |
266 reader->readRect(&dst); | 290 reader->readRect(&dst); |
| 291 BREAK_ON_READ_ERROR(reader); |
| 292 |
267 canvas->drawImageNine(image, src, dst, paint); | 293 canvas->drawImageNine(image, src, dst, paint); |
268 } break; | 294 } break; |
269 case DRAW_CLEAR: | 295 case DRAW_CLEAR: { |
270 canvas->clear(reader->readInt()); | 296 auto c = reader->readInt(); |
271 break; | 297 BREAK_ON_READ_ERROR(reader); |
| 298 |
| 299 canvas->clear(c); |
| 300 } break; |
272 case DRAW_DATA: { | 301 case DRAW_DATA: { |
273 // This opcode is now dead, just need to skip it for backwards compa
tibility | 302 // This opcode is now dead, just need to skip it for backwards compa
tibility |
274 size_t length = reader->readInt(); | 303 size_t length = reader->readInt(); |
275 (void)reader->skip(length); | 304 (void)reader->skip(length); |
276 // skip handles padding the read out to a multiple of 4 | 305 // skip handles padding the read out to a multiple of 4 |
277 } break; | 306 } break; |
278 case DRAW_DRAWABLE: | 307 case DRAW_DRAWABLE: { |
279 canvas->drawDrawable(fPictureData->getDrawable(reader)); | 308 auto* d = fPictureData->getDrawable(reader); |
280 break; | 309 BREAK_ON_READ_ERROR(reader); |
| 310 |
| 311 canvas->drawDrawable(d); |
| 312 } break; |
281 case DRAW_DRAWABLE_MATRIX: { | 313 case DRAW_DRAWABLE_MATRIX: { |
282 SkMatrix matrix; | 314 SkMatrix matrix; |
283 reader->readMatrix(&matrix); | 315 reader->readMatrix(&matrix); |
284 SkDrawable* drawable = fPictureData->getDrawable(reader); | 316 SkDrawable* drawable = fPictureData->getDrawable(reader); |
| 317 BREAK_ON_READ_ERROR(reader); |
| 318 |
285 canvas->drawDrawable(drawable, &matrix); | 319 canvas->drawDrawable(drawable, &matrix); |
286 } break; | 320 } break; |
287 case DRAW_DRRECT: { | 321 case DRAW_DRRECT: { |
288 const SkPaint* paint = fPictureData->getPaint(reader); | 322 const SkPaint* paint = fPictureData->getPaint(reader); |
289 SkRRect outer, inner; | 323 SkRRect outer, inner; |
290 reader->readRRect(&outer); | 324 reader->readRRect(&outer); |
291 reader->readRRect(&inner); | 325 reader->readRRect(&inner); |
| 326 BREAK_ON_READ_ERROR(reader); |
| 327 |
292 if (paint) { | 328 if (paint) { |
293 canvas->drawDRRect(outer, inner, *paint); | 329 canvas->drawDRRect(outer, inner, *paint); |
294 } | 330 } |
295 } break; | 331 } break; |
296 case BEGIN_COMMENT_GROUP: { | 332 case BEGIN_COMMENT_GROUP: { |
297 SkString tmp; | 333 SkString tmp; |
298 reader->readString(&tmp); | 334 reader->readString(&tmp); |
299 // deprecated (M44) | 335 // deprecated (M44) |
300 break; | 336 break; |
301 } | 337 } |
302 case COMMENT: { | 338 case COMMENT: { |
303 SkString tmp; | 339 SkString tmp; |
304 reader->readString(&tmp); | 340 reader->readString(&tmp); |
305 reader->readString(&tmp); | 341 reader->readString(&tmp); |
306 // deprecated (M44) | 342 // deprecated (M44) |
307 break; | 343 break; |
308 } | 344 } |
309 case END_COMMENT_GROUP: | 345 case END_COMMENT_GROUP: |
310 // deprecated (M44) | 346 // deprecated (M44) |
311 break; | 347 break; |
312 case DRAW_IMAGE: { | 348 case DRAW_IMAGE: { |
313 const SkPaint* paint = fPictureData->getPaint(reader); | 349 const SkPaint* paint = fPictureData->getPaint(reader); |
314 const SkImage* image = fPictureData->getImage(reader); | 350 const SkImage* image = fPictureData->getImage(reader); |
315 SkPoint loc; | 351 SkPoint loc; |
316 reader->readPoint(&loc); | 352 reader->readPoint(&loc); |
| 353 BREAK_ON_READ_ERROR(reader); |
| 354 |
317 canvas->drawImage(image, loc.fX, loc.fY, paint); | 355 canvas->drawImage(image, loc.fX, loc.fY, paint); |
318 } break; | 356 } break; |
319 case DRAW_IMAGE_LATTICE: { | 357 case DRAW_IMAGE_LATTICE: { |
320 const SkPaint* paint = fPictureData->getPaint(reader); | 358 const SkPaint* paint = fPictureData->getPaint(reader); |
321 const SkImage* image = fPictureData->getImage(reader); | 359 const SkImage* image = fPictureData->getImage(reader); |
322 SkCanvas::Lattice lattice; | 360 SkCanvas::Lattice lattice; |
323 lattice.fXCount = reader->readInt(); | 361 lattice.fXCount = reader->readInt(); |
324 lattice.fXDivs = (const int*) reader->skip(lattice.fXCount * sizeof(
int32_t)); | 362 lattice.fXDivs = (const int*) reader->skip(lattice.fXCount * sizeof(
int32_t)); |
325 lattice.fYCount = reader->readInt(); | 363 lattice.fYCount = reader->readInt(); |
326 lattice.fYDivs = (const int*) reader->skip(lattice.fYCount * sizeof(
int32_t)); | 364 lattice.fYDivs = (const int*) reader->skip(lattice.fYCount * sizeof(
int32_t)); |
327 int flagCount = reader->readInt(); | 365 int flagCount = reader->readInt(); |
328 lattice.fFlags = (0 == flagCount) ? nullptr : (const SkCanvas::Latti
ce::Flags*) | 366 lattice.fFlags = (0 == flagCount) ? nullptr : (const SkCanvas::Latti
ce::Flags*) |
329 reader->skip(SkAlign4(flagCount * sizeof(SkCanvas::Lattice::
Flags))); | 367 reader->skip(SkAlign4(flagCount * sizeof(SkCanvas::Lattice::
Flags))); |
330 SkIRect src; | 368 SkIRect src; |
331 reader->readIRect(&src); | 369 reader->readIRect(&src); |
332 lattice.fBounds = &src; | 370 lattice.fBounds = &src; |
333 SkRect dst; | 371 SkRect dst; |
334 reader->readRect(&dst); | 372 reader->readRect(&dst); |
| 373 BREAK_ON_READ_ERROR(reader); |
| 374 |
335 canvas->drawImageLattice(image, lattice, dst, paint); | 375 canvas->drawImageLattice(image, lattice, dst, paint); |
336 } break; | 376 } break; |
337 case DRAW_IMAGE_NINE: { | 377 case DRAW_IMAGE_NINE: { |
338 const SkPaint* paint = fPictureData->getPaint(reader); | 378 const SkPaint* paint = fPictureData->getPaint(reader); |
339 const SkImage* image = fPictureData->getImage(reader); | 379 const SkImage* image = fPictureData->getImage(reader); |
340 SkIRect center; | 380 SkIRect center; |
341 reader->readIRect(¢er); | 381 reader->readIRect(¢er); |
342 SkRect dst; | 382 SkRect dst; |
343 reader->readRect(&dst); | 383 reader->readRect(&dst); |
| 384 BREAK_ON_READ_ERROR(reader); |
| 385 |
344 canvas->drawImageNine(image, center, dst, paint); | 386 canvas->drawImageNine(image, center, dst, paint); |
345 } break; | 387 } break; |
346 case DRAW_IMAGE_RECT_STRICT: | 388 case DRAW_IMAGE_RECT_STRICT: |
347 case DRAW_IMAGE_RECT: { | 389 case DRAW_IMAGE_RECT: { |
348 const SkPaint* paint = fPictureData->getPaint(reader); | 390 const SkPaint* paint = fPictureData->getPaint(reader); |
349 const SkImage* image = fPictureData->getImage(reader); | 391 const SkImage* image = fPictureData->getImage(reader); |
350 SkRect storage; | 392 SkRect storage; |
351 const SkRect* src = get_rect_ptr(reader, &storage); // may be null | 393 const SkRect* src = get_rect_ptr(reader, &storage); // may be null |
352 SkRect dst; | 394 SkRect dst; |
353 reader->readRect(&dst); // required | 395 reader->readRect(&dst); // required |
354 // DRAW_IMAGE_RECT_STRICT assumes this constraint, and doesn't store
it | 396 // DRAW_IMAGE_RECT_STRICT assumes this constraint, and doesn't store
it |
355 SkCanvas::SrcRectConstraint constraint = SkCanvas::kStrict_SrcRectCo
nstraint; | 397 SkCanvas::SrcRectConstraint constraint = SkCanvas::kStrict_SrcRectCo
nstraint; |
356 if (DRAW_IMAGE_RECT == op) { | 398 if (DRAW_IMAGE_RECT == op) { |
357 // newer op-code stores the constraint explicitly | 399 // newer op-code stores the constraint explicitly |
358 constraint = (SkCanvas::SrcRectConstraint)reader->readInt(); | 400 constraint = (SkCanvas::SrcRectConstraint)reader->readInt(); |
359 } | 401 } |
| 402 BREAK_ON_READ_ERROR(reader); |
| 403 |
360 canvas->legacy_drawImageRect(image, src, dst, paint, constraint); | 404 canvas->legacy_drawImageRect(image, src, dst, paint, constraint); |
361 } break; | 405 } break; |
362 case DRAW_OVAL: { | 406 case DRAW_OVAL: { |
363 const SkPaint* paint = fPictureData->getPaint(reader); | 407 const SkPaint* paint = fPictureData->getPaint(reader); |
364 SkRect rect; | 408 SkRect rect; |
365 reader->readRect(&rect); | 409 reader->readRect(&rect); |
| 410 BREAK_ON_READ_ERROR(reader); |
| 411 |
366 if (paint) { | 412 if (paint) { |
367 canvas->drawOval(rect, *paint); | 413 canvas->drawOval(rect, *paint); |
368 } | 414 } |
369 } break; | 415 } break; |
370 case DRAW_PAINT: { | 416 case DRAW_PAINT: { |
371 const SkPaint* paint = fPictureData->getPaint(reader); | 417 const SkPaint* paint = fPictureData->getPaint(reader); |
| 418 BREAK_ON_READ_ERROR(reader); |
| 419 |
372 if (paint) { | 420 if (paint) { |
373 canvas->drawPaint(*paint); | 421 canvas->drawPaint(*paint); |
374 } | 422 } |
375 } break; | 423 } break; |
376 case DRAW_PATCH: { | 424 case DRAW_PATCH: { |
377 const SkPaint* paint = fPictureData->getPaint(reader); | 425 const SkPaint* paint = fPictureData->getPaint(reader); |
378 | 426 |
379 const SkPoint* cubics = (const SkPoint*)reader->skip(SkPatchUtils::k
NumCtrlPts * | 427 const SkPoint* cubics = (const SkPoint*)reader->skip(SkPatchUtils::k
NumCtrlPts * |
380 sizeof(SkPoint)
); | 428 sizeof(SkPoint)
); |
381 uint32_t flag = reader->readInt(); | 429 uint32_t flag = reader->readInt(); |
382 const SkColor* colors = nullptr; | 430 const SkColor* colors = nullptr; |
383 if (flag & DRAW_VERTICES_HAS_COLORS) { | 431 if (flag & DRAW_VERTICES_HAS_COLORS) { |
384 colors = (const SkColor*)reader->skip(SkPatchUtils::kNumCorners
* sizeof(SkColor)); | 432 colors = (const SkColor*)reader->skip(SkPatchUtils::kNumCorners
* sizeof(SkColor)); |
385 } | 433 } |
386 const SkPoint* texCoords = nullptr; | 434 const SkPoint* texCoords = nullptr; |
387 if (flag & DRAW_VERTICES_HAS_TEXS) { | 435 if (flag & DRAW_VERTICES_HAS_TEXS) { |
388 texCoords = (const SkPoint*)reader->skip(SkPatchUtils::kNumCorne
rs * | 436 texCoords = (const SkPoint*)reader->skip(SkPatchUtils::kNumCorne
rs * |
389 sizeof(SkPoint)); | 437 sizeof(SkPoint)); |
390 } | 438 } |
391 sk_sp<SkXfermode> xfer; | 439 sk_sp<SkXfermode> xfer; |
392 if (flag & DRAW_VERTICES_HAS_XFER) { | 440 if (flag & DRAW_VERTICES_HAS_XFER) { |
393 int mode = reader->readInt(); | 441 int mode = reader->readInt(); |
394 if (mode < 0 || mode > SkXfermode::kLastMode) { | 442 if (mode < 0 || mode > SkXfermode::kLastMode) { |
395 mode = SkXfermode::kModulate_Mode; | 443 mode = SkXfermode::kModulate_Mode; |
396 } | 444 } |
397 xfer = SkXfermode::Make((SkXfermode::Mode)mode); | 445 xfer = SkXfermode::Make((SkXfermode::Mode)mode); |
398 } | 446 } |
| 447 BREAK_ON_READ_ERROR(reader); |
| 448 |
399 if (paint) { | 449 if (paint) { |
400 canvas->drawPatch(cubics, colors, texCoords, std::move(xfer), *p
aint); | 450 canvas->drawPatch(cubics, colors, texCoords, std::move(xfer), *p
aint); |
401 } | 451 } |
402 } break; | 452 } break; |
403 case DRAW_PATH: { | 453 case DRAW_PATH: { |
404 const SkPaint* paint = fPictureData->getPaint(reader); | 454 const SkPaint* paint = fPictureData->getPaint(reader); |
| 455 const auto& path = fPictureData->getPath(reader); |
| 456 BREAK_ON_READ_ERROR(reader); |
| 457 |
405 if (paint) { | 458 if (paint) { |
406 canvas->drawPath(fPictureData->getPath(reader), *paint); | 459 canvas->drawPath(path, *paint); |
407 } | 460 } |
408 } break; | 461 } break; |
409 case DRAW_PICTURE: | 462 case DRAW_PICTURE: { |
410 canvas->drawPicture(fPictureData->getPicture(reader)); | 463 const auto* pic = fPictureData->getPicture(reader); |
411 break; | 464 BREAK_ON_READ_ERROR(reader); |
| 465 |
| 466 canvas->drawPicture(pic); |
| 467 } break; |
412 case DRAW_PICTURE_MATRIX_PAINT: { | 468 case DRAW_PICTURE_MATRIX_PAINT: { |
413 const SkPaint* paint = fPictureData->getPaint(reader); | 469 const SkPaint* paint = fPictureData->getPaint(reader); |
414 SkMatrix matrix; | 470 SkMatrix matrix; |
415 reader->readMatrix(&matrix); | 471 reader->readMatrix(&matrix); |
416 const SkPicture* pic = fPictureData->getPicture(reader); | 472 const SkPicture* pic = fPictureData->getPicture(reader); |
| 473 BREAK_ON_READ_ERROR(reader); |
| 474 |
417 canvas->drawPicture(pic, &matrix, paint); | 475 canvas->drawPicture(pic, &matrix, paint); |
418 } break; | 476 } break; |
419 case DRAW_POINTS: { | 477 case DRAW_POINTS: { |
420 const SkPaint* paint = fPictureData->getPaint(reader); | 478 const SkPaint* paint = fPictureData->getPaint(reader); |
421 SkCanvas::PointMode mode = (SkCanvas::PointMode)reader->readInt(); | 479 SkCanvas::PointMode mode = (SkCanvas::PointMode)reader->readInt(); |
422 size_t count = reader->readInt(); | 480 size_t count = reader->readInt(); |
423 const SkPoint* pts = (const SkPoint*)reader->skip(sizeof(SkPoint)* c
ount); | 481 const SkPoint* pts = (const SkPoint*)reader->skip(sizeof(SkPoint)* c
ount); |
| 482 BREAK_ON_READ_ERROR(reader); |
| 483 |
424 if (paint) { | 484 if (paint) { |
425 canvas->drawPoints(mode, count, pts, *paint); | 485 canvas->drawPoints(mode, count, pts, *paint); |
426 } | 486 } |
427 } break; | 487 } break; |
428 case DRAW_POS_TEXT: { | 488 case DRAW_POS_TEXT: { |
429 const SkPaint* paint = fPictureData->getPaint(reader); | 489 const SkPaint* paint = fPictureData->getPaint(reader); |
430 TextContainer text; | 490 TextContainer text; |
431 get_text(reader, &text); | 491 get_text(reader, &text); |
432 size_t points = reader->readInt(); | 492 size_t points = reader->readInt(); |
433 const SkPoint* pos = (const SkPoint*)reader->skip(points * sizeof(Sk
Point)); | 493 const SkPoint* pos = (const SkPoint*)reader->skip(points * sizeof(Sk
Point)); |
| 494 BREAK_ON_READ_ERROR(reader); |
| 495 |
434 if (paint && text.text()) { | 496 if (paint && text.text()) { |
435 canvas->drawPosText(text.text(), text.length(), pos, *paint); | 497 canvas->drawPosText(text.text(), text.length(), pos, *paint); |
436 } | 498 } |
437 } break; | 499 } break; |
438 case DRAW_POS_TEXT_TOP_BOTTOM: { | 500 case DRAW_POS_TEXT_TOP_BOTTOM: { |
439 const SkPaint* paint = fPictureData->getPaint(reader); | 501 const SkPaint* paint = fPictureData->getPaint(reader); |
440 TextContainer text; | 502 TextContainer text; |
441 get_text(reader, &text); | 503 get_text(reader, &text); |
442 size_t points = reader->readInt(); | 504 size_t points = reader->readInt(); |
443 const SkPoint* pos = (const SkPoint*)reader->skip(points * sizeof(Sk
Point)); | 505 const SkPoint* pos = (const SkPoint*)reader->skip(points * sizeof(Sk
Point)); |
444 const SkScalar top = reader->readScalar(); | 506 const SkScalar top = reader->readScalar(); |
445 const SkScalar bottom = reader->readScalar(); | 507 const SkScalar bottom = reader->readScalar(); |
| 508 BREAK_ON_READ_ERROR(reader); |
| 509 |
446 SkRect clip; | 510 SkRect clip; |
447 canvas->getClipBounds(&clip); | 511 canvas->getClipBounds(&clip); |
448 if (top < clip.fBottom && bottom > clip.fTop && paint && text.text()
) { | 512 if (top < clip.fBottom && bottom > clip.fTop && paint && text.text()
) { |
449 canvas->drawPosText(text.text(), text.length(), pos, *paint); | 513 canvas->drawPosText(text.text(), text.length(), pos, *paint); |
450 } | 514 } |
451 } break; | 515 } break; |
452 case DRAW_POS_TEXT_H: { | 516 case DRAW_POS_TEXT_H: { |
453 const SkPaint* paint = fPictureData->getPaint(reader); | 517 const SkPaint* paint = fPictureData->getPaint(reader); |
454 TextContainer text; | 518 TextContainer text; |
455 get_text(reader, &text); | 519 get_text(reader, &text); |
456 size_t xCount = reader->readInt(); | 520 size_t xCount = reader->readInt(); |
457 const SkScalar constY = reader->readScalar(); | 521 const SkScalar constY = reader->readScalar(); |
458 const SkScalar* xpos = (const SkScalar*)reader->skip(xCount * sizeof
(SkScalar)); | 522 const SkScalar* xpos = (const SkScalar*)reader->skip(xCount * sizeof
(SkScalar)); |
| 523 BREAK_ON_READ_ERROR(reader); |
| 524 |
459 if (paint && text.text()) { | 525 if (paint && text.text()) { |
460 canvas->drawPosTextH(text.text(), text.length(), xpos, constY, *
paint); | 526 canvas->drawPosTextH(text.text(), text.length(), xpos, constY, *
paint); |
461 } | 527 } |
462 } break; | 528 } break; |
463 case DRAW_POS_TEXT_H_TOP_BOTTOM: { | 529 case DRAW_POS_TEXT_H_TOP_BOTTOM: { |
464 const SkPaint* paint = fPictureData->getPaint(reader); | 530 const SkPaint* paint = fPictureData->getPaint(reader); |
465 TextContainer text; | 531 TextContainer text; |
466 get_text(reader, &text); | 532 get_text(reader, &text); |
467 size_t xCount = reader->readInt(); | 533 size_t xCount = reader->readInt(); |
468 const SkScalar* xpos = (const SkScalar*)reader->skip((3 + xCount) *
sizeof(SkScalar)); | 534 const SkScalar* xpos = (const SkScalar*)reader->skip((3 + xCount) *
sizeof(SkScalar)); |
| 535 BREAK_ON_READ_ERROR(reader); |
| 536 |
469 const SkScalar top = *xpos++; | 537 const SkScalar top = *xpos++; |
470 const SkScalar bottom = *xpos++; | 538 const SkScalar bottom = *xpos++; |
471 const SkScalar constY = *xpos++; | 539 const SkScalar constY = *xpos++; |
472 SkRect clip; | 540 SkRect clip; |
473 canvas->getClipBounds(&clip); | 541 canvas->getClipBounds(&clip); |
474 if (top < clip.fBottom && bottom > clip.fTop && paint && text.text()
) { | 542 if (top < clip.fBottom && bottom > clip.fTop && paint && text.text()
) { |
475 canvas->drawPosTextH(text.text(), text.length(), xpos, constY, *
paint); | 543 canvas->drawPosTextH(text.text(), text.length(), xpos, constY, *
paint); |
476 } | 544 } |
477 } break; | 545 } break; |
478 case DRAW_RECT: { | 546 case DRAW_RECT: { |
479 const SkPaint* paint = fPictureData->getPaint(reader); | 547 const SkPaint* paint = fPictureData->getPaint(reader); |
480 SkRect rect; | 548 SkRect rect; |
481 reader->readRect(&rect); | 549 reader->readRect(&rect); |
| 550 BREAK_ON_READ_ERROR(reader); |
| 551 |
482 if (paint) { | 552 if (paint) { |
483 canvas->drawRect(rect, *paint); | 553 canvas->drawRect(rect, *paint); |
484 } | 554 } |
485 } break; | 555 } break; |
486 case DRAW_REGION: { | 556 case DRAW_REGION: { |
487 const SkPaint* paint = fPictureData->getPaint(reader); | 557 const SkPaint* paint = fPictureData->getPaint(reader); |
488 SkRegion region; | 558 SkRegion region; |
489 reader->readRegion(®ion); | 559 reader->readRegion(®ion); |
| 560 BREAK_ON_READ_ERROR(reader); |
| 561 |
490 if (paint) { | 562 if (paint) { |
491 canvas->drawRegion(region, *paint); | 563 canvas->drawRegion(region, *paint); |
492 } | 564 } |
493 } break; | 565 } break; |
494 case DRAW_RRECT: { | 566 case DRAW_RRECT: { |
495 const SkPaint* paint = fPictureData->getPaint(reader); | 567 const SkPaint* paint = fPictureData->getPaint(reader); |
496 SkRRect rrect; | 568 SkRRect rrect; |
497 reader->readRRect(&rrect); | 569 reader->readRRect(&rrect); |
| 570 BREAK_ON_READ_ERROR(reader); |
| 571 |
498 if (paint) { | 572 if (paint) { |
499 canvas->drawRRect(rrect, *paint); | 573 canvas->drawRRect(rrect, *paint); |
500 } | 574 } |
501 } break; | 575 } break; |
502 case DRAW_SPRITE: { | 576 case DRAW_SPRITE: { |
503 /* const SkPaint* paint = */ fPictureData->getPaint(reader); | 577 /* const SkPaint* paint = */ fPictureData->getPaint(reader); |
504 /* const SkImage* image = */ fPictureData->getBitmapAsImage(reader); | 578 /* const SkImage* image = */ fPictureData->getBitmapAsImage(reader); |
505 /* int left = */ reader->readInt(); | 579 /* int left = */ reader->readInt(); |
506 /* int top = */ reader->readInt(); | 580 /* int top = */ reader->readInt(); |
507 // drawSprite removed dec-2015 | 581 // drawSprite removed dec-2015 |
508 } break; | 582 } break; |
509 case DRAW_TEXT: { | 583 case DRAW_TEXT: { |
510 const SkPaint* paint = fPictureData->getPaint(reader); | 584 const SkPaint* paint = fPictureData->getPaint(reader); |
511 TextContainer text; | 585 TextContainer text; |
512 get_text(reader, &text); | 586 get_text(reader, &text); |
513 SkScalar x = reader->readScalar(); | 587 SkScalar x = reader->readScalar(); |
514 SkScalar y = reader->readScalar(); | 588 SkScalar y = reader->readScalar(); |
| 589 BREAK_ON_READ_ERROR(reader); |
| 590 |
515 if (paint && text.text()) { | 591 if (paint && text.text()) { |
516 canvas->drawText(text.text(), text.length(), x, y, *paint); | 592 canvas->drawText(text.text(), text.length(), x, y, *paint); |
517 } | 593 } |
518 } break; | 594 } break; |
519 case DRAW_TEXT_BLOB: { | 595 case DRAW_TEXT_BLOB: { |
520 const SkPaint* paint = fPictureData->getPaint(reader); | 596 const SkPaint* paint = fPictureData->getPaint(reader); |
521 const SkTextBlob* blob = fPictureData->getTextBlob(reader); | 597 const SkTextBlob* blob = fPictureData->getTextBlob(reader); |
522 SkScalar x = reader->readScalar(); | 598 SkScalar x = reader->readScalar(); |
523 SkScalar y = reader->readScalar(); | 599 SkScalar y = reader->readScalar(); |
| 600 BREAK_ON_READ_ERROR(reader); |
| 601 |
524 if (paint) { | 602 if (paint) { |
525 canvas->drawTextBlob(blob, x, y, *paint); | 603 canvas->drawTextBlob(blob, x, y, *paint); |
526 } | 604 } |
527 } break; | 605 } break; |
528 case DRAW_TEXT_TOP_BOTTOM: { | 606 case DRAW_TEXT_TOP_BOTTOM: { |
529 const SkPaint* paint = fPictureData->getPaint(reader); | 607 const SkPaint* paint = fPictureData->getPaint(reader); |
530 TextContainer text; | 608 TextContainer text; |
531 get_text(reader, &text); | 609 get_text(reader, &text); |
532 const SkScalar* ptr = (const SkScalar*)reader->skip(4 * sizeof(SkSca
lar)); | 610 const SkScalar* ptr = (const SkScalar*)reader->skip(4 * sizeof(SkSca
lar)); |
| 611 BREAK_ON_READ_ERROR(reader); |
| 612 |
533 // ptr[0] == x | 613 // ptr[0] == x |
534 // ptr[1] == y | 614 // ptr[1] == y |
535 // ptr[2] == top | 615 // ptr[2] == top |
536 // ptr[3] == bottom | 616 // ptr[3] == bottom |
537 SkRect clip; | 617 SkRect clip; |
538 canvas->getClipBounds(&clip); | 618 canvas->getClipBounds(&clip); |
539 float top = ptr[2]; | 619 float top = ptr[2]; |
540 float bottom = ptr[3]; | 620 float bottom = ptr[3]; |
541 if (top < clip.fBottom && bottom > clip.fTop && paint && text.text()
) { | 621 if (top < clip.fBottom && bottom > clip.fTop && paint && text.text()
) { |
542 canvas->drawText(text.text(), text.length(), ptr[0], ptr[1], *pa
int); | 622 canvas->drawText(text.text(), text.length(), ptr[0], ptr[1], *pa
int); |
543 } | 623 } |
544 } break; | 624 } break; |
545 case DRAW_TEXT_ON_PATH: { | 625 case DRAW_TEXT_ON_PATH: { |
546 const SkPaint* paint = fPictureData->getPaint(reader); | 626 const SkPaint* paint = fPictureData->getPaint(reader); |
547 TextContainer text; | 627 TextContainer text; |
548 get_text(reader, &text); | 628 get_text(reader, &text); |
549 const SkPath& path = fPictureData->getPath(reader); | 629 const SkPath& path = fPictureData->getPath(reader); |
550 SkMatrix matrix; | 630 SkMatrix matrix; |
551 reader->readMatrix(&matrix); | 631 reader->readMatrix(&matrix); |
| 632 BREAK_ON_READ_ERROR(reader); |
| 633 |
552 if (paint && text.text()) { | 634 if (paint && text.text()) { |
553 canvas->drawTextOnPath(text.text(), text.length(), path, &matrix
, *paint); | 635 canvas->drawTextOnPath(text.text(), text.length(), path, &matrix
, *paint); |
554 } | 636 } |
555 } break; | 637 } break; |
556 case DRAW_TEXT_RSXFORM: { | 638 case DRAW_TEXT_RSXFORM: { |
557 const SkPaint* paint = fPictureData->getPaint(reader); | 639 const SkPaint* paint = fPictureData->getPaint(reader); |
558 int count = reader->readInt(); | 640 int count = reader->readInt(); |
559 uint32_t flags = reader->read32(); | 641 uint32_t flags = reader->read32(); |
560 TextContainer text; | 642 TextContainer text; |
561 get_text(reader, &text); | 643 get_text(reader, &text); |
562 const SkRSXform* xform = (const SkRSXform*)reader->skip(count * size
of(SkRSXform)); | 644 const SkRSXform* xform = (const SkRSXform*)reader->skip(count * size
of(SkRSXform)); |
563 const SkRect* cull = nullptr; | 645 const SkRect* cull = nullptr; |
564 if (flags & DRAW_TEXT_RSXFORM_HAS_CULL) { | 646 if (flags & DRAW_TEXT_RSXFORM_HAS_CULL) { |
565 cull = (const SkRect*)reader->skip(sizeof(SkRect)); | 647 cull = (const SkRect*)reader->skip(sizeof(SkRect)); |
566 } | 648 } |
| 649 BREAK_ON_READ_ERROR(reader); |
| 650 |
567 if (text.text()) { | 651 if (text.text()) { |
568 canvas->drawTextRSXform(text.text(), text.length(), xform, cull,
*paint); | 652 canvas->drawTextRSXform(text.text(), text.length(), xform, cull,
*paint); |
569 } | 653 } |
570 } break; | 654 } break; |
571 case DRAW_VERTICES: { | 655 case DRAW_VERTICES: { |
572 sk_sp<SkXfermode> xfer; | 656 sk_sp<SkXfermode> xfer; |
573 const SkPaint* paint = fPictureData->getPaint(reader); | 657 const SkPaint* paint = fPictureData->getPaint(reader); |
574 DrawVertexFlags flags = (DrawVertexFlags)reader->readInt(); | 658 DrawVertexFlags flags = (DrawVertexFlags)reader->readInt(); |
575 SkCanvas::VertexMode vmode = (SkCanvas::VertexMode)reader->readInt()
; | 659 SkCanvas::VertexMode vmode = (SkCanvas::VertexMode)reader->readInt()
; |
576 int vCount = reader->readInt(); | 660 int vCount = reader->readInt(); |
(...skipping 12 matching lines...) Expand all Loading... |
589 iCount = reader->readInt(); | 673 iCount = reader->readInt(); |
590 indices = (const uint16_t*)reader->skip(iCount * sizeof(uint16_t
)); | 674 indices = (const uint16_t*)reader->skip(iCount * sizeof(uint16_t
)); |
591 } | 675 } |
592 if (flags & DRAW_VERTICES_HAS_XFER) { | 676 if (flags & DRAW_VERTICES_HAS_XFER) { |
593 int mode = reader->readInt(); | 677 int mode = reader->readInt(); |
594 if (mode < 0 || mode > SkXfermode::kLastMode) { | 678 if (mode < 0 || mode > SkXfermode::kLastMode) { |
595 mode = SkXfermode::kModulate_Mode; | 679 mode = SkXfermode::kModulate_Mode; |
596 } | 680 } |
597 xfer = SkXfermode::Make((SkXfermode::Mode)mode); | 681 xfer = SkXfermode::Make((SkXfermode::Mode)mode); |
598 } | 682 } |
| 683 BREAK_ON_READ_ERROR(reader); |
| 684 |
599 if (paint) { | 685 if (paint) { |
600 canvas->drawVertices(vmode, vCount, verts, texs, colors, | 686 canvas->drawVertices(vmode, vCount, verts, texs, colors, |
601 xfer, indices, iCount, *paint); | 687 xfer, indices, iCount, *paint); |
602 } | 688 } |
603 } break; | 689 } break; |
604 case RESTORE: | 690 case RESTORE: |
605 canvas->restore(); | 691 canvas->restore(); |
606 break; | 692 break; |
607 case ROTATE: | 693 case ROTATE: { |
608 canvas->rotate(reader->readScalar()); | 694 auto deg = reader->readScalar(); |
609 break; | 695 BREAK_ON_READ_ERROR(reader); |
| 696 |
| 697 canvas->rotate(deg); |
| 698 } break; |
610 case SAVE: | 699 case SAVE: |
611 // SKPs with version < 29 also store a SaveFlags param. | |
612 if (size > 4) { | |
613 if (reader->validate(8 == size)) { | |
614 reader->readInt(); | |
615 } | |
616 } | |
617 canvas->save(); | 700 canvas->save(); |
618 break; | 701 break; |
619 case SAVE_LAYER_SAVEFLAGS_DEPRECATED: { | 702 case SAVE_LAYER_SAVEFLAGS_DEPRECATED: { |
620 SkRect storage; | 703 SkRect storage; |
621 const SkRect* boundsPtr = get_rect_ptr(reader, &storage); | 704 const SkRect* boundsPtr = get_rect_ptr(reader, &storage); |
622 const SkPaint* paint = fPictureData->getPaint(reader); | 705 const SkPaint* paint = fPictureData->getPaint(reader); |
623 auto flags = SkCanvas::LegacySaveFlagsToSaveLayerFlags(reader->readI
nt()); | 706 auto flags = SkCanvas::LegacySaveFlagsToSaveLayerFlags(reader->readI
nt()); |
| 707 BREAK_ON_READ_ERROR(reader); |
| 708 |
624 canvas->saveLayer(SkCanvas::SaveLayerRec(boundsPtr, paint, flags)); | 709 canvas->saveLayer(SkCanvas::SaveLayerRec(boundsPtr, paint, flags)); |
625 } break; | 710 } break; |
626 case SAVE_LAYER_SAVELAYERFLAGS_DEPRECATED_JAN_2016: { | 711 case SAVE_LAYER_SAVELAYERFLAGS_DEPRECATED_JAN_2016: { |
627 SkRect storage; | 712 SkRect storage; |
628 const SkRect* boundsPtr = get_rect_ptr(reader, &storage); | 713 const SkRect* boundsPtr = get_rect_ptr(reader, &storage); |
629 const SkPaint* paint = fPictureData->getPaint(reader); | 714 const SkPaint* paint = fPictureData->getPaint(reader); |
630 canvas->saveLayer(SkCanvas::SaveLayerRec(boundsPtr, paint, reader->r
eadInt())); | 715 auto flags = reader->readInt(); |
| 716 BREAK_ON_READ_ERROR(reader); |
| 717 |
| 718 canvas->saveLayer(SkCanvas::SaveLayerRec(boundsPtr, paint, flags)); |
631 } break; | 719 } break; |
632 case SAVE_LAYER_SAVELAYERREC: { | 720 case SAVE_LAYER_SAVELAYERREC: { |
633 SkCanvas::SaveLayerRec rec(nullptr, nullptr, nullptr, 0); | 721 SkCanvas::SaveLayerRec rec(nullptr, nullptr, nullptr, 0); |
634 const uint32_t flatFlags = reader->readInt(); | 722 const uint32_t flatFlags = reader->readInt(); |
635 SkRect bounds; | 723 SkRect bounds; |
636 if (flatFlags & SAVELAYERREC_HAS_BOUNDS) { | 724 if (flatFlags & SAVELAYERREC_HAS_BOUNDS) { |
637 reader->readRect(&bounds); | 725 reader->readRect(&bounds); |
638 rec.fBounds = &bounds; | 726 rec.fBounds = &bounds; |
639 } | 727 } |
640 if (flatFlags & SAVELAYERREC_HAS_PAINT) { | 728 if (flatFlags & SAVELAYERREC_HAS_PAINT) { |
641 rec.fPaint = fPictureData->getPaint(reader); | 729 rec.fPaint = fPictureData->getPaint(reader); |
642 } | 730 } |
643 if (flatFlags & SAVELAYERREC_HAS_BACKDROP) { | 731 if (flatFlags & SAVELAYERREC_HAS_BACKDROP) { |
644 const SkPaint* paint = fPictureData->getPaint(reader); | 732 if (const auto* paint = fPictureData->getPaint(reader)) { |
645 rec.fBackdrop = paint->getImageFilter(); | 733 rec.fBackdrop = paint->getImageFilter(); |
| 734 } |
646 } | 735 } |
647 if (flatFlags & SAVELAYERREC_HAS_FLAGS) { | 736 if (flatFlags & SAVELAYERREC_HAS_FLAGS) { |
648 rec.fSaveLayerFlags = reader->readInt(); | 737 rec.fSaveLayerFlags = reader->readInt(); |
649 } | 738 } |
| 739 BREAK_ON_READ_ERROR(reader); |
| 740 |
650 canvas->saveLayer(rec); | 741 canvas->saveLayer(rec); |
651 } break; | 742 } break; |
652 case SCALE: { | 743 case SCALE: { |
653 SkScalar sx = reader->readScalar(); | 744 SkScalar sx = reader->readScalar(); |
654 SkScalar sy = reader->readScalar(); | 745 SkScalar sy = reader->readScalar(); |
| 746 BREAK_ON_READ_ERROR(reader); |
| 747 |
655 canvas->scale(sx, sy); | 748 canvas->scale(sx, sy); |
656 } break; | 749 } break; |
657 case SET_MATRIX: { | 750 case SET_MATRIX: { |
658 SkMatrix matrix; | 751 SkMatrix matrix; |
659 reader->readMatrix(&matrix); | 752 reader->readMatrix(&matrix); |
| 753 BREAK_ON_READ_ERROR(reader); |
| 754 |
660 matrix.postConcat(initialMatrix); | 755 matrix.postConcat(initialMatrix); |
661 canvas->setMatrix(matrix); | 756 canvas->setMatrix(matrix); |
662 } break; | 757 } break; |
663 case SKEW: { | 758 case SKEW: { |
664 SkScalar sx = reader->readScalar(); | 759 SkScalar sx = reader->readScalar(); |
665 SkScalar sy = reader->readScalar(); | 760 SkScalar sy = reader->readScalar(); |
| 761 BREAK_ON_READ_ERROR(reader); |
| 762 |
666 canvas->skew(sx, sy); | 763 canvas->skew(sx, sy); |
667 } break; | 764 } break; |
668 case TRANSLATE: { | 765 case TRANSLATE: { |
669 SkScalar dx = reader->readScalar(); | 766 SkScalar dx = reader->readScalar(); |
670 SkScalar dy = reader->readScalar(); | 767 SkScalar dy = reader->readScalar(); |
| 768 BREAK_ON_READ_ERROR(reader); |
| 769 |
671 canvas->translate(dx, dy); | 770 canvas->translate(dx, dy); |
672 } break; | 771 } break; |
673 case TRANSLATE_Z: { | 772 case TRANSLATE_Z: { |
674 #ifdef SK_EXPERIMENTAL_SHADOWING | 773 #ifdef SK_EXPERIMENTAL_SHADOWING |
675 SkScalar dz = reader->readScalar(); | 774 SkScalar dz = reader->readScalar(); |
| 775 BREAK_ON_READ_ERROR(reader); |
| 776 |
676 canvas->translateZ(dz); | 777 canvas->translateZ(dz); |
677 #endif | 778 #endif |
678 } break; | 779 } break; |
679 default: | 780 default: |
680 SkASSERTF(false, "Unknown draw type: %d", op); | 781 SkASSERTF(false, "Unknown draw type: %d", op); |
681 } | 782 } |
| 783 |
| 784 #undef BREAK_ON_READ_ERROR |
682 } | 785 } |
OLD | NEW |