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

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

Issue 2399043002: Harden SkPicturePlayback::handleOp() skips (Closed)
Patch Set: BREAK_ON_READ_ERROR Created 4 years, 2 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
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(&region); 152 reader->readRegion(&region);
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(&center); 381 reader->readIRect(&center);
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(&region); 559 reader->readRegion(&region);
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
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 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698