Index: src/core/SkXfermode_proccoeff.h |
diff --git a/src/core/SkXfermode_proccoeff.h b/src/core/SkXfermode_proccoeff.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..79879b1abea3cd2d2a7d5422654611763811631b |
--- /dev/null |
+++ b/src/core/SkXfermode_proccoeff.h |
@@ -0,0 +1,95 @@ |
+#ifndef SkXfermode_subs_DEFINED |
+#define SkXfermode_subs_DEFINED |
+ |
+#include "SkXfermode.h" |
+#include "SkFlattenableBuffers.h" |
+ |
+struct ProcCoeff { |
+ SkXfermodeProc fProc; |
+ SkXfermode::Coeff fSC; |
+ SkXfermode::Coeff fDC; |
+}; |
+ |
+#define CANNOT_USE_COEFF SkXfermode::Coeff(-1) |
+ |
+extern const ProcCoeff gProcCoeffs[]; |
+ |
+class SkProcCoeffXfermode : public SkProcXfermode { |
+public: |
+ SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode) |
+ : INHERITED(rec.fProc) { |
+ fMode = mode; |
+ // these may be valid, or may be CANNOT_USE_COEFF |
+ fSrcCoeff = rec.fSC; |
+ fDstCoeff = rec.fDC; |
+ } |
+ |
+ virtual bool asMode(Mode* mode) const SK_OVERRIDE { |
+ if (mode) { |
+ *mode = fMode; |
+ } |
+ return true; |
+ } |
+ |
+ virtual bool asCoeff(Coeff* sc, Coeff* dc) const SK_OVERRIDE { |
+ if (CANNOT_USE_COEFF == fSrcCoeff) { |
+ return false; |
+ } |
+ |
+ if (sc) { |
+ *sc = fSrcCoeff; |
+ } |
+ if (dc) { |
+ *dc = fDstCoeff; |
+ } |
+ return true; |
+ } |
+ |
+#if SK_SUPPORT_GPU |
+ virtual bool asNewEffectOrCoeff(GrContext*, |
+ GrEffectRef** effect, |
+ Coeff* src, |
+ Coeff* dst, |
+ GrTexture* background) const SK_OVERRIDE { |
+ if (this->asCoeff(src, dst)) { |
+ return true; |
+ } |
+ if (XferEffect::IsSupportedMode(fMode)) { |
+ if (NULL != effect) { |
+ *effect = XferEffect::Create(fMode, background); |
+ SkASSERT(NULL != *effect); |
+ } |
+ return true; |
+ } |
+ return false; |
+ } |
+#endif |
+ |
+ SK_DEVELOPER_TO_STRING() |
+ SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode) |
+ |
+protected: |
+ SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { |
+ fMode = (SkXfermode::Mode)buffer.read32(); |
+ |
+ const ProcCoeff& rec = gProcCoeffs[fMode]; |
+ // these may be valid, or may be CANNOT_USE_COEFF |
+ fSrcCoeff = rec.fSC; |
+ fDstCoeff = rec.fDC; |
+ // now update our function-ptr in the super class |
+ this->INHERITED::setProc(rec.fProc); |
+ } |
+ |
+ virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { |
+ this->INHERITED::flatten(buffer); |
+ buffer.write32(fMode); |
+ } |
+ |
+private: |
+ Mode fMode; |
+ Coeff fSrcCoeff, fDstCoeff; |
+ |
+ typedef SkProcXfermode INHERITED; |
+}; |
+ |
+#endif // #ifndef SkXfermode_subs_DEFINED |