diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkXfermode.cpp | 32 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 9 |
2 files changed, 15 insertions, 26 deletions
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp index 37dbd0d1e2..ac1ebcccb0 100644 --- a/src/core/SkXfermode.cpp +++ b/src/core/SkXfermode.cpp @@ -687,30 +687,18 @@ bool SkXfermode::asXPFactory(GrXPFactory**) const { #if SK_SUPPORT_GPU #include "effects/GrPorterDuffXferProcessor.h" -bool SkXfermode::AsFragmentProcessorOrXPFactory(SkXfermode* xfermode, - GrFragmentProcessor** fp, - GrXPFactory** xpf) { - Coeff src, dst; - Mode mode; +bool SkXfermode::AsXPFactory(SkXfermode* xfermode, GrXPFactory** xpf) { if (NULL == xfermode) { - *xpf = GrPorterDuffXPFactory::Create(kSrcOver_Mode); - return true; - } else if (xfermode->asMode(&mode) && mode <= kLastCoeffMode) { - *xpf = GrPorterDuffXPFactory::Create(mode); - return true; - } else if (xfermode->asCoeff(&src, &dst)) { - *xpf = GrPorterDuffXPFactory::Create(src, dst); - return true; - } else if (xfermode->asXPFactory(xpf)) { + if (xpf) { + *xpf = GrPorterDuffXPFactory::Create(kSrcOver_Mode); + } return true; } else { - return xfermode->asFragmentProcessor(fp, NULL); + return xfermode->asXPFactory(xpf); } } #else -bool SkXfermode::AsFragmentProcessorOrXPFactory(SkXfermode* xfermode, - GrFragmentProcessor** fp, - GrXPFactory** xpf) { +bool SkXfermode::AsXPFactory(SkXfermode* xfermode, GrXPFactory** xpf) { return false; } #endif @@ -934,6 +922,14 @@ bool SkProcCoeffXfermode::asFragmentProcessor(GrFragmentProcessor** fp, } bool SkProcCoeffXfermode::asXPFactory(GrXPFactory** xp) const { + if (CANNOT_USE_COEFF != fSrcCoeff) { + if (xp) { + *xp = GrPorterDuffXPFactory::Create(fMode); + SkASSERT(*xp); + } + return true; + } + if (GrCustomXfermode::IsSupportedMode(fMode)) { if (xp) { *xp = GrCustomXfermode::CreateXPFactory(fMode); diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index 64142fe07e..a3972806f7 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -514,15 +514,8 @@ void SkPaint2GrPaintNoShader(GrContext* context, const SkPaint& skPaint, GrColor grPaint->setAntiAlias(skPaint.isAntiAlias()); SkXfermode* mode = skPaint.getXfermode(); - GrFragmentProcessor* fragmentProcessor = NULL; GrXPFactory* xpFactory = NULL; - if (SkXfermode::AsFragmentProcessorOrXPFactory(mode, &fragmentProcessor, &xpFactory)) { - if (fragmentProcessor) { - SkASSERT(NULL == xpFactory); - grPaint->addColorProcessor(fragmentProcessor)->unref(); - xpFactory = GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode); - } - } else { + if (!SkXfermode::AsXPFactory(mode, &xpFactory)) { // Fall back to src-over xpFactory = GrPorterDuffXPFactory::Create(SkXfermode::kSrcOver_Mode); } |