aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkXfermode.cpp
diff options
context:
space:
mode:
authorGravatar egdaniel <egdaniel@google.com>2014-12-03 10:40:13 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2014-12-03 10:40:13 -0800
commit378092f3d10b1dd62967f419c35cfefec7c10ee7 (patch)
tree2053505fc4cccddb5a366ef26897128b2a65b0cd /src/core/SkXfermode.cpp
parent5ab7e80f2b477c55be9861ab1c56e33e19aa97a6 (diff)
Add XferProcessor factory in GrPaint and GrDrawState.
In this CL the XP should have zero effect on the actual rendering pipeline. BUG=skia: Review URL: https://codereview.chromium.org/751283002
Diffstat (limited to 'src/core/SkXfermode.cpp')
-rw-r--r--src/core/SkXfermode.cpp34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index e0abb4ebdd..ef44b1e747 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -6,7 +6,6 @@
* found in the LICENSE file.
*/
-
#include "SkXfermode.h"
#include "SkXfermode_opts_SSE2.h"
#include "SkXfermode_proccoeff.h"
@@ -680,16 +679,41 @@ bool SkXfermode::asFragmentProcessor(GrFragmentProcessor**, GrTexture*) const {
return false;
}
-bool SkXfermode::asFragmentProcessorOrCoeff(SkXfermode* xfermode, GrFragmentProcessor** fp,
- Coeff* src, Coeff* dst, GrTexture* background) {
+bool SkXfermode::asXPFactory(GrXPFactory**) const {
+ return false;
+}
+
+
+#if SK_SUPPORT_GPU
+#include "effects/GrPorterDuffXferProcessor.h"
+
+bool SkXfermode::AsFragmentProcessorOrXPFactory(SkXfermode* xfermode,
+ GrFragmentProcessor** fp,
+ GrXPFactory** xpf,
+ Coeff* src, Coeff* dst) {
if (NULL == xfermode) {
- return ModeAsCoeff(kSrcOver_Mode, src, dst);
+ SkAssertResult(ModeAsCoeff(kSrcOver_Mode, src, dst));
+ *xpf = GrPorterDuffXPFactory::Create(*src, *dst);
+ return true;
} else if (xfermode->asCoeff(src, dst)) {
+ *xpf = GrPorterDuffXPFactory::Create(*src, *dst);
+ return true;
+ } else if (xfermode->asXPFactory(xpf)) {
+ *src = SkXfermode::kOne_Coeff;
+ *dst = SkXfermode::kZero_Coeff;
return true;
} else {
- return xfermode->asFragmentProcessor(fp, background);
+ return xfermode->asFragmentProcessor(fp);
}
}
+#else
+bool SkXfermode::AsFragmentProcessorOrXPFactory(SkXfermode* xfermode,
+ GrFragmentProcessor** fp,
+ GrXPFactory** xpf,
+ Coeff* src, Coeff* dst) {
+ return false;
+}
+#endif
SkPMColor SkXfermode::xferColor(SkPMColor src, SkPMColor dst) const{
// no-op. subclasses should override this