| Index: skia/ext/analysis_canvas.cc
|
| diff --git a/skia/ext/analysis_canvas.cc b/skia/ext/analysis_canvas.cc
|
| index ca19170339fdede31acb2af07dd4cc30c6ab89ca..48a09d11f535f01cb4c39b6766f40e9f2f45af00 100644
|
| --- a/skia/ext/analysis_canvas.cc
|
| +++ b/skia/ext/analysis_canvas.cc
|
| @@ -15,6 +15,23 @@ namespace {
|
|
|
| const int kNoLayer = -1;
|
|
|
| +bool ActsLikeClear(SkXfermode::Mode mode, unsigned src_alpha) {
|
| + switch (mode) {
|
| + case SkXfermode::kClear_Mode:
|
| + return true;
|
| + case SkXfermode::kSrc_Mode:
|
| + case SkXfermode::kSrcIn_Mode:
|
| + case SkXfermode::kDstIn_Mode:
|
| + case SkXfermode::kSrcOut_Mode:
|
| + case SkXfermode::kDstATop_Mode:
|
| + return src_alpha == 0;
|
| + case SkXfermode::kDstOut_Mode:
|
| + return src_alpha == 0xFF;
|
| + default:
|
| + return false;
|
| + }
|
| +}
|
| +
|
| bool IsSolidColorPaint(const SkPaint& paint) {
|
| SkXfermode::Mode xfermode;
|
|
|
| @@ -90,14 +107,9 @@ void AnalysisCanvas::clear(SkColor color) {
|
| }
|
|
|
| void AnalysisCanvas::drawPaint(const SkPaint& paint) {
|
| - // This check is in SkCanvas::drawPaint(), and some of our unittests rely on
|
| - // on this, so we reproduce it here.
|
| - if (isClipEmpty())
|
| - return;
|
| -
|
| - is_solid_color_ = false;
|
| - is_transparent_ = false;
|
| - ++draw_op_count_;
|
| + SkRect rect;
|
| + getClipBounds(&rect);
|
| + drawRect(rect, paint);
|
| }
|
|
|
| void AnalysisCanvas::drawPoints(SkCanvas::PointMode mode,
|
| @@ -137,7 +149,7 @@ void AnalysisCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
|
| // In all other cases, we keep the current transparent value
|
| if (does_cover_canvas &&
|
| !is_forced_not_transparent_ &&
|
| - xfermode == SkXfermode::kClear_Mode) {
|
| + ActsLikeClear(xfermode, paint.getAlpha())) {
|
| is_transparent_ = true;
|
| } else if (paint.getAlpha() != 0 || xfermode != SkXfermode::kSrc_Mode) {
|
| is_transparent_ = false;
|
|
|