SkXfermode_proccoeff.h revision 84cc1ebc5a4789e93e23c65eb4014ef5b8b0bab4
1#ifndef SkXfermode_proccoeff_DEFINED
2#define SkXfermode_proccoeff_DEFINED
3
4#include "SkXfermode.h"
5#include "SkFlattenableBuffers.h"
6
7struct ProcCoeff {
8    SkXfermodeProc      fProc;
9    SkXfermode::Coeff   fSC;
10    SkXfermode::Coeff   fDC;
11};
12
13#define CANNOT_USE_COEFF    SkXfermode::Coeff(-1)
14
15extern  const ProcCoeff gProcCoeffs[];
16
17class SkProcCoeffXfermode : public SkProcXfermode {
18public:
19    SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode)
20            : INHERITED(rec.fProc) {
21        fMode = mode;
22        // these may be valid, or may be CANNOT_USE_COEFF
23        fSrcCoeff = rec.fSC;
24        fDstCoeff = rec.fDC;
25    }
26
27    virtual bool asMode(Mode* mode) const SK_OVERRIDE;
28
29    virtual bool asCoeff(Coeff* sc, Coeff* dc) const SK_OVERRIDE;
30
31#if SK_SUPPORT_GPU
32    virtual bool asNewEffectOrCoeff(GrContext*,
33                                    GrEffectRef** effect,
34                                    Coeff* src,
35                                    Coeff* dst,
36                                    GrTexture* background) const SK_OVERRIDE;
37#endif
38
39    SK_DEVELOPER_TO_STRING()
40    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode)
41
42protected:
43    SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
44        fMode = (SkXfermode::Mode)buffer.read32();
45
46        const ProcCoeff& rec = gProcCoeffs[fMode];
47        // these may be valid, or may be CANNOT_USE_COEFF
48        fSrcCoeff = rec.fSC;
49        fDstCoeff = rec.fDC;
50        // now update our function-ptr in the super class
51        this->INHERITED::setProc(rec.fProc);
52    }
53
54    virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE;
55
56private:
57    Mode    fMode;
58    Coeff   fSrcCoeff, fDstCoeff;
59
60    typedef SkProcXfermode INHERITED;
61};
62
63#endif // #ifndef SkXfermode_proccoeff_DEFINED
64