| 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 |