00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkXfermode_DEFINED
00018 #define SkXfermode_DEFINED
00019
00020 #include "SkFlattenable.h"
00021 #include "SkColor.h"
00022
00031 class SkXfermode : public SkFlattenable {
00032 public:
00033 SkXfermode() {}
00034
00035 virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
00036 const SkAlpha aa[]);
00037 virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
00038 const SkAlpha aa[]);
00039 virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
00040 const SkAlpha aa[]);
00041 virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
00042 const SkAlpha aa[]);
00043
00046 enum Coeff {
00047 kZero_Coeff,
00048 kOne_Coeff,
00049 kSC_Coeff,
00050 kISC_Coeff,
00051 kDC_Coeff,
00052 kIDC_Coeff,
00053 kSA_Coeff,
00054 kISA_Coeff,
00055 kDA_Coeff,
00056 kIDA_Coeff,
00058 kCoeffCount
00059 };
00060
00076 virtual bool asCoeff(Coeff* src, Coeff* dst);
00077
00086 enum Mode {
00087 kClear_Mode,
00088 kSrc_Mode,
00089 kDst_Mode,
00090 kSrcOver_Mode,
00091 kDstOver_Mode,
00092 kSrcIn_Mode,
00093 kDstIn_Mode,
00094 kSrcOut_Mode,
00095 kDstOut_Mode,
00096 kSrcATop_Mode,
00097 kDstATop_Mode,
00098 kXor_Mode,
00099
00100
00101
00102 kPlus_Mode,
00103 kMultiply_Mode,
00104 kScreen_Mode,
00105 kOverlay_Mode,
00106 kDarken_Mode,
00107 kLighten_Mode,
00108 kColorDodge_Mode,
00109 kColorBurn_Mode,
00110 kHardLight_Mode,
00111 kSoftLight_Mode,
00112 kDifference_Mode,
00113 kExclusion_Mode,
00114
00115 kLastMode = kExclusion_Mode
00116 };
00117
00120 static SkXfermode* Create(Mode mode);
00121
00125 static SkXfermodeProc GetProc(Mode mode);
00126
00132 static SkXfermodeProc16 GetProc16(Mode mode, SkColor srcColor);
00133
00139 static bool IsMode(SkXfermode*, Mode* mode);
00140
00141 protected:
00142 SkXfermode(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {}
00143
00152 virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst);
00153
00154 private:
00155 enum {
00156 kModeCount = kLastMode + 1
00157 };
00158 typedef SkFlattenable INHERITED;
00159 };
00160
00162
00168 class SkProcXfermode : public SkXfermode {
00169 public:
00170 SkProcXfermode(SkXfermodeProc proc) : fProc(proc) {}
00171
00172
00173 virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
00174 const SkAlpha aa[]);
00175 virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
00176 const SkAlpha aa[]);
00177 virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
00178 const SkAlpha aa[]);
00179 virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
00180 const SkAlpha aa[]);
00181
00182
00183 virtual Factory getFactory() { return CreateProc; }
00184 virtual void flatten(SkFlattenableWriteBuffer&);
00185
00186 protected:
00187 SkProcXfermode(SkFlattenableReadBuffer&);
00188
00189 private:
00190 SkXfermodeProc fProc;
00191
00192 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
00193 return SkNEW_ARGS(SkProcXfermode, (buffer)); }
00194
00195 typedef SkXfermode INHERITED;
00196 };
00197
00198 #endif
00199