Index: include/core/SkXfermode.h |
diff --git a/include/core/SkXfermode.h b/include/core/SkXfermode.h |
index 2d12b3c931ca6658d71acf111b9f0ea7fc872d83..253ee1b4089ae5be24ca7ef1ab37cf729310ba03 100644 |
--- a/include/core/SkXfermode.h |
+++ b/include/core/SkXfermode.h |
@@ -8,8 +8,9 @@ |
#ifndef SkXfermode_DEFINED |
#define SkXfermode_DEFINED |
-#include "SkFlattenable.h" |
+#include "SkBlendMode.h" |
#include "SkColor.h" |
+#include "SkFlattenable.h" |
class GrFragmentProcessor; |
class GrTexture; |
@@ -17,6 +18,8 @@ class GrXPFactory; |
class SkRasterPipeline; |
class SkString; |
+struct SkArithmeticParams; |
+ |
struct SkPM4f; |
typedef SkPM4f (*SkXfermodeProc4f)(const SkPM4f& src, const SkPM4f& dst); |
@@ -112,6 +115,9 @@ public: |
* Gets the name of the Mode as a string. |
*/ |
static const char* ModeName(Mode); |
+ static const char* ModeName(SkBlendMode mode) { |
+ return ModeName(Mode(mode)); |
+ } |
/** |
* If the xfermode is one of the modes in the Mode enum, then asMode() |
@@ -157,6 +163,31 @@ public: |
} |
#endif |
+ /** |
+ * Skia maintains global xfermode objects corresponding to each BlendMode. This returns a |
+ * ptr to that global xfermode (or null if the mode is srcover). Thus the caller may use |
+ * the returned ptr, but it should leave its refcnt untouched. |
+ */ |
+ static SkXfermode* Peek(SkBlendMode mode) { |
+ sk_sp<SkXfermode> xfer = Make(mode); |
+ if (!xfer) { |
+ SkASSERT(SkBlendMode::kSrcOver == mode); |
+ return nullptr; |
+ } |
+ SkASSERT(!xfer->unique()); |
+ return xfer.get(); |
+ } |
+ |
+ static sk_sp<SkXfermode> Make(SkBlendMode bm) { |
+ return Make((Mode)bm); |
+ } |
+ |
+ SkBlendMode blend() const { |
+ Mode mode; |
+ SkAssertResult(this->asMode(&mode)); |
+ return (SkBlendMode)mode; |
+ } |
+ |
/** Return a function pointer to a routine that applies the specified |
porter-duff transfer mode. |
*/ |
@@ -215,6 +246,7 @@ public: |
static bool IsOpaque(const sk_sp<SkXfermode>& xfer, SrcColorOpacity opacityType) { |
return IsOpaque(xfer.get(), opacityType); |
} |
+ static bool IsOpaque(SkBlendMode, SrcColorOpacity); |
#if SK_SUPPORT_GPU |
/** Used by the SkXfermodeImageFilter to blend two colors via a GrFragmentProcessor. |
@@ -270,6 +302,8 @@ public: |
static LCD32Proc GetLCD32Proc(uint32_t flags); |
static LCDF16Proc GetLCDF16Proc(uint32_t) { return nullptr; } |
+ virtual bool isArithmetic(SkArithmeticParams*) const { return false; } |
+ |
protected: |
SkXfermode() {} |
/** The default implementation of xfer32/xfer16/xferA8 in turn call this |