Index: src/core/SkBlitter.cpp |
diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp |
index d8553f16a2c9f40b831699075646c17182f8bf83..5276356206b81e36dad1b9a7c1efa6111311dcd5 100644 |
--- a/src/core/SkBlitter.cpp |
+++ b/src/core/SkBlitter.cpp |
@@ -19,6 +19,7 @@ |
#include "SkTLazy.h" |
#include "SkUtils.h" |
#include "SkXfermode.h" |
+#include "SkXfermodeInterpretation.h" |
SkBlitter::~SkBlitter() {} |
@@ -777,63 +778,6 @@ private: |
#include "SkCoreBlitters.h" |
-static bool just_solid_color(const SkPaint& paint) { |
- if (paint.getAlpha() == 0xFF && paint.getColorFilter() == NULL) { |
- SkShader* shader = paint.getShader(); |
- if (NULL == shader) { |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-/** By analyzing the paint (with an xfermode), we may decide we can take |
- special action. This enum lists our possible actions |
- */ |
-enum XferInterp { |
- kNormal_XferInterp, // no special interpretation, draw normally |
- kSrcOver_XferInterp, // draw as if in srcover mode |
- kSkipDrawing_XferInterp // draw nothing |
-}; |
- |
-static XferInterp interpret_xfermode(const SkPaint& paint, SkXfermode* xfer, |
- SkColorType deviceCT) { |
- SkXfermode::Mode mode; |
- |
- if (SkXfermode::AsMode(xfer, &mode)) { |
- switch (mode) { |
- case SkXfermode::kSrc_Mode: |
- if (just_solid_color(paint)) { |
- return kSrcOver_XferInterp; |
- } |
- break; |
- case SkXfermode::kDst_Mode: |
- return kSkipDrawing_XferInterp; |
- case SkXfermode::kSrcOver_Mode: |
- return kSrcOver_XferInterp; |
- case SkXfermode::kDstOver_Mode: |
- if (kRGB_565_SkColorType == deviceCT) { |
- return kSkipDrawing_XferInterp; |
- } |
- break; |
- case SkXfermode::kSrcIn_Mode: |
- if (kRGB_565_SkColorType == deviceCT && |
- just_solid_color(paint)) { |
- return kSrcOver_XferInterp; |
- } |
- break; |
- case SkXfermode::kDstIn_Mode: |
- if (just_solid_color(paint)) { |
- return kSkipDrawing_XferInterp; |
- } |
- break; |
- default: |
- break; |
- } |
- } |
- return kNormal_XferInterp; |
-} |
- |
SkBlitter* SkBlitter::Choose(const SkBitmap& device, |
const SkMatrix& matrix, |
const SkPaint& origPaint, |
@@ -864,12 +808,13 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device, |
} |
if (mode) { |
- switch (interpret_xfermode(*paint, mode, device.colorType())) { |
- case kSrcOver_XferInterp: |
+ bool deviceIsOpaque = kRGB_565_SkColorType == device.colorType(); |
+ switch (SkInterpretXfermode(*paint, deviceIsOpaque)) { |
+ case kSrcOver_SkXfermodeInterpretation: |
mode = NULL; |
paint.writable()->setXfermode(NULL); |
break; |
- case kSkipDrawing_XferInterp:{ |
+ case kSkipDrawing_SkXfermodeInterpretation:{ |
return allocator->createT<SkNullBlitter>(); |
} |
default: |