| 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 "SkRecordDraw.h" | 8 #include "SkRecordDraw.h" |
| 9 #include "SkPatchUtils.h" | 9 #include "SkPatchUtils.h" |
| 10 | 10 |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 this->pushControl(); | 334 this->pushControl(); |
| 335 } | 335 } |
| 336 | 336 |
| 337 static bool PaintMayAffectTransparentBlack(const SkPaint* paint) { | 337 static bool PaintMayAffectTransparentBlack(const SkPaint* paint) { |
| 338 if (paint) { | 338 if (paint) { |
| 339 // FIXME: this is very conservative | 339 // FIXME: this is very conservative |
| 340 if (paint->getImageFilter() || paint->getColorFilter()) { | 340 if (paint->getImageFilter() || paint->getColorFilter()) { |
| 341 return true; | 341 return true; |
| 342 } | 342 } |
| 343 | 343 |
| 344 // Unusual Xfermodes require us to process a saved layer | 344 // Unusual blendmodes require us to process a saved layer |
| 345 // even with operations outisde the clip. | 345 // even with operations outisde the clip. |
| 346 // For example, DstIn is used by masking layers. | 346 // For example, DstIn is used by masking layers. |
| 347 // https://code.google.com/p/skia/issues/detail?id=1291 | 347 // https://code.google.com/p/skia/issues/detail?id=1291 |
| 348 // https://crbug.com/401593 | 348 // https://crbug.com/401593 |
| 349 SkXfermode* xfermode = paint->getXfermode(); | 349 switch (paint->getBlendMode()) { |
| 350 SkXfermode::Mode mode; | 350 // For each of the following transfer modes, if the source |
| 351 // SrcOver is ok, and is also the common case with a nullptr xfermod
e. | 351 // alpha is zero (our transparent black), the resulting |
| 352 // So we should make that the fast path and bypass the mode extracti
on | 352 // blended alpha is not necessarily equal to the original |
| 353 // and test. | 353 // destination alpha. |
| 354 if (xfermode && xfermode->asMode(&mode)) { | 354 case SkBlendMode::kClear: |
| 355 switch (mode) { | 355 case SkBlendMode::kSrc: |
| 356 // For each of the following transfer modes, if the source | 356 case SkBlendMode::kSrcIn: |
| 357 // alpha is zero (our transparent black), the resulting | 357 case SkBlendMode::kDstIn: |
| 358 // blended alpha is not necessarily equal to the original | 358 case SkBlendMode::kSrcOut: |
| 359 // destination alpha. | 359 case SkBlendMode::kDstATop: |
| 360 case SkXfermode::kClear_Mode: | 360 case SkBlendMode::kModulate: |
| 361 case SkXfermode::kSrc_Mode: | 361 return true; |
| 362 case SkXfermode::kSrcIn_Mode: | 362 break; |
| 363 case SkXfermode::kDstIn_Mode: | 363 default: |
| 364 case SkXfermode::kSrcOut_Mode: | 364 break; |
| 365 case SkXfermode::kDstATop_Mode: | |
| 366 case SkXfermode::kModulate_Mode: | |
| 367 return true; | |
| 368 break; | |
| 369 default: | |
| 370 break; | |
| 371 } | |
| 372 } | 365 } |
| 373 } | 366 } |
| 374 return false; | 367 return false; |
| 375 } | 368 } |
| 376 | 369 |
| 377 Bounds popSaveBlock() { | 370 Bounds popSaveBlock() { |
| 378 // We're done the Save block. Apply the block's bounds to all control o
ps inside it. | 371 // We're done the Save block. Apply the block's bounds to all control o
ps inside it. |
| 379 SaveBounds sb; | 372 SaveBounds sb; |
| 380 fSaveStack.pop(&sb); | 373 fSaveStack.pop(&sb); |
| 381 | 374 |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 | 624 |
| 632 void SkRecordFillBounds(const SkRect& cullRect, const SkRecord& record, SkRect b
ounds[]) { | 625 void SkRecordFillBounds(const SkRect& cullRect, const SkRecord& record, SkRect b
ounds[]) { |
| 633 SkRecords::FillBounds visitor(cullRect, record, bounds); | 626 SkRecords::FillBounds visitor(cullRect, record, bounds); |
| 634 for (int curOp = 0; curOp < record.count(); curOp++) { | 627 for (int curOp = 0; curOp < record.count(); curOp++) { |
| 635 visitor.setCurrentOp(curOp); | 628 visitor.setCurrentOp(curOp); |
| 636 record.visit(curOp, visitor); | 629 record.visit(curOp, visitor); |
| 637 } | 630 } |
| 638 visitor.cleanUp(); | 631 visitor.cleanUp(); |
| 639 } | 632 } |
| 640 | 633 |
| OLD | NEW |