SkXfermode.h revision 26e18b593ab65e4d92dfbce92579d8bc180d4c2c
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkXfermode_DEFINED 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkXfermode_DEFINED 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkFlattenable.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColor.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 16f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.comclass GrContext; 17f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.comclass GrEffectRef; 18b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.comclass SkString; 19b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.com 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkXfermode 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkXfermode is the base class for objects that are called to implement custom 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com "transfer-modes" in the drawing pipeline. The static function Create(Modes) 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com can be called to return an instance of any of the predefined subclasses as 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com specified in the Modes enum. When an SkXfermode is assigned to an SkPaint, 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com then objects drawn with that paint have the xfermode applied. 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 287ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.orgclass SK_API SkXfermode : public SkFlattenable { 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 300456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com SK_DECLARE_INST_COUNT(SkXfermode) 310456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkXfermode() {} 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, 3530da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const; 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count, 3730da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const; 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count, 3930da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const; 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count, 4130da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const; 421447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 43d252db03d9650013b545ef9781fe993c07f8f314reed@android.com /** Enum of possible coefficients to describe some xfermodes 44d252db03d9650013b545ef9781fe993c07f8f314reed@android.com */ 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com enum Coeff { 46d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kZero_Coeff, /** 0 */ 47d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kOne_Coeff, /** 1 */ 48d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kSC_Coeff, /** src color */ 49d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kISC_Coeff, /** inverse src color (i.e. 1 - sc) */ 50d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kDC_Coeff, /** dst color */ 51d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kIDC_Coeff, /** inverse dst color (i.e. 1 - dc) */ 52d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kSA_Coeff, /** src alpha */ 53d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kISA_Coeff, /** inverse src alpha (i.e. 1 - sa) */ 54d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kDA_Coeff, /** dst alpha */ 55d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kIDA_Coeff, /** inverse dst alpha (i.e. 1 - da) */ 561447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kCoeffCount 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 591447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 60d252db03d9650013b545ef9781fe993c07f8f314reed@android.com /** If the xfermode can be expressed as an equation using the coefficients 61d252db03d9650013b545ef9781fe993c07f8f314reed@android.com in Coeff, then asCoeff() returns true, and sets (if not null) src and 62d252db03d9650013b545ef9781fe993c07f8f314reed@android.com dst accordingly. 631447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 64d252db03d9650013b545ef9781fe993c07f8f314reed@android.com result = src_coeff * src_color + dst_coeff * dst_color; 651447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 66d252db03d9650013b545ef9781fe993c07f8f314reed@android.com As examples, here are some of the porterduff coefficients 671447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 68d252db03d9650013b545ef9781fe993c07f8f314reed@android.com MODE SRC_COEFF DST_COEFF 69d252db03d9650013b545ef9781fe993c07f8f314reed@android.com clear zero zero 70d252db03d9650013b545ef9781fe993c07f8f314reed@android.com src one zero 71d252db03d9650013b545ef9781fe993c07f8f314reed@android.com dst zero one 72d252db03d9650013b545ef9781fe993c07f8f314reed@android.com srcover one isa 73d252db03d9650013b545ef9781fe993c07f8f314reed@android.com dstover ida one 74d252db03d9650013b545ef9781fe993c07f8f314reed@android.com */ 7530da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com virtual bool asCoeff(Coeff* src, Coeff* dst) const; 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 7743c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com /** 7843c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * The same as calling xfermode->asCoeff(..), except that this also checks 79f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com * if the xfermode is NULL, and if so, treats it as kSrcOver_Mode. 8043c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com */ 8130da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool AsCoeff(const SkXfermode*, Coeff* src, Coeff* dst); 821447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 83a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** List of predefined xfermodes. 84a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com The algebra for the modes uses the following symbols: 85a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com Sa, Sc - source alpha and color 86a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com Da, Dc - destination alpha and color (before compositing) 87a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com [a, c] - Resulting (alpha, color) values 88a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com For these equations, the colors are in premultiplied state. 89a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com If no xfermode is specified, kSrcOver is assumed. 90a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 91a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com enum Mode { 92a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kClear_Mode, //!< [0, 0] 93a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrc_Mode, //!< [Sa, Sc] 94a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDst_Mode, //!< [Da, Dc] 95a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc] 96a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc] 97a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcIn_Mode, //!< [Sa * Da, Sc * Da] 98a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstIn_Mode, //!< [Sa * Da, Sa * Dc] 99a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] 100a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] 101a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] 102a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] 103a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kXor_Mode, //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] 104b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kPlus_Mode, //!< [Sa + Da, Sc + Dc] 1058d3cd7a170c810e3816bf00220cbef51e7b16795reed@google.com kModulate_Mode, // multiplies all components (= alpha and color) 106fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 107f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com // all above modes can be expressed as pair of src/dst Coeffs 108fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com kCoeffModesCnt, 109fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 11064334352cc3f29f52dfa07225d65eb218d2fd830skia.committer@gmail.com // Following blend modes are defined in the CSS Compositing standard: 111b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org // https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blending 112f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com kScreen_Mode = kCoeffModesCnt, 113a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kOverlay_Mode, 114a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDarken_Mode, 115a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kLighten_Mode, 116a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kColorDodge_Mode, 117a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kColorBurn_Mode, 118a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kHardLight_Mode, 119a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSoftLight_Mode, 120a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDifference_Mode, 121a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kExclusion_Mode, 12225cfa693420b6da4182bda42ba15970999b840ddreed@google.com kMultiply_Mode, 123a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 124b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kHue_Mode, 125b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kSaturation_Mode, 126b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kColor_Mode, 127b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kLuminosity_Mode, 128b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org 129b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kLastMode = kLuminosity_Mode 130a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com }; 131a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 132c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com /** 133c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com * If the xfermode is one of the modes in the Mode enum, then asMode() 134c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com * returns true and sets (if not null) mode accordingly. Otherwise it 135c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com * returns false and ignores the mode parameter. 13648543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org */ 13730da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com virtual bool asMode(Mode* mode) const; 13848543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org 13943c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com /** 14043c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * The same as calling xfermode->asMode(mode), except that this also checks 141f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com * if the xfermode is NULL, and if so, treats it as kSrcOver_Mode. 14243c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com */ 14330da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool AsMode(const SkXfermode*, Mode* mode); 14443c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com 145e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org /** 146e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * Returns true if the xfermode claims to be the specified Mode. This works 147e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * correctly even if the xfermode is NULL (which equates to kSrcOver.) Thus 148e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * you can say this without checking for a null... 149e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * 150e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * If (SkXfermode::IsMode(paint.getXfermode(), 151e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * SkXfermode::kDstOver_Mode)) { 152e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * ... 153e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * } 154e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org */ 15530da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool IsMode(const SkXfermode* xfer, Mode mode); 156e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org 157a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** Return an SkXfermode object for the specified mode. 158a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 159a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com static SkXfermode* Create(Mode mode); 160a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 161a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** Return a function pointer to a routine that applies the specified 162a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com porter-duff transfer mode. 163a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 164a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com static SkXfermodeProc GetProc(Mode mode); 165a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 166a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** Return a function pointer to a routine that applies the specified 167a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com porter-duff transfer mode and srcColor to a 16bit device color. Note, 168a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com if the mode+srcColor might return a non-opaque color, then there is not 169a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 16bit proc, and this will return NULL. 170a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 171a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com static SkXfermodeProc16 GetProc16(Mode mode, SkColor srcColor); 1721447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 173c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com /** 17443c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * If the specified mode can be represented by a pair of Coeff, then return 17543c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * true and set (if not NULL) the corresponding coeffs. If the mode is 17643c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * not representable as a pair of Coeffs, return false and ignore the 17743c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * src and dst parameters. 178a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 17943c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com static bool ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst); 180a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 18143c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com // DEPRECATED: call AsMode(...) 18230da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool IsMode(const SkXfermode* xfer, Mode* mode) { 18343c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com return AsMode(xfer, mode); 18443c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com } 1851447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 186f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com /** A subclass may implement this factory function to work with the GPU backend. It is legal 187f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com to call this with all but the context param NULL to simply test the return value. effect, 188f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com src, and dst must all be NULL or all non-NULL. If effect is non-NULL then the xfermode may 189f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com optionally allocate an effect to return and the caller as *effect. The caller will install 190f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com it and own a ref to it. Since the xfermode may or may not assign *effect, the caller should 19126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com set *effect to NULL beforehand. If the function returns true and *effect is NULL then the 19226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com src and dst coeffs will be applied to the draw. When *effect is non-NULL the coeffs are 19326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com ignored. 194f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com */ 19526e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com virtual bool asNewEffectOrCoeff(GrContext*, 19626e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com GrEffectRef** effect, 19726e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com Coeff* src, 19826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com Coeff* dst) const; 199f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com 200f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com /** 201f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com * The same as calling xfermode->asNewEffect(...), except that this also checks if the xfermode 202f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com * is NULL, and if so, treats it as kSrcOver_Mode. 203f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com */ 20426e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com static bool AsNewEffectOrCoeff(SkXfermode*, 20526e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com GrContext*, 20626e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com GrEffectRef** effect, 20726e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com Coeff* src, 20826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com Coeff* dst); 209f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com 210b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.com SkDEVCODE(virtual void toString(SkString* str) const = 0;) 211a2ca41e3afdd8fad5e0e924dec029f33918e0a67djsollen@google.com SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() 2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkXfermode(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {} 2141447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /** The default implementation of xfer32/xfer16/xferA8 in turn call this 2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com method, 1 color at a time (upscaled to a SkPMColor). The default 2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com implmentation of this method just returns dst. If performance is 2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com important, your subclass should override xfer32/xfer16/xferA8 directly. 2191447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com This method will not be called directly by the client, so it need not 2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com be implemented if your subclass has overridden xfer32/xfer16/xferA8 2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 22330da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst) const; 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 226a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com enum { 227a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kModeCount = kLastMode + 1 228a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com }; 2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkFlattenable INHERITED; 2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkProcXfermode 2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkProcXfermode is a xfermode that applies the specified proc to its colors. 2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com This class is not exported to java. 2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkProcXfermode : public SkXfermode { 2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkProcXfermode(SkXfermodeProc proc) : fProc(proc) {} 2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // overrides from SkXfermode 2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, 24530da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const SK_OVERRIDE; 2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count, 24730da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const SK_OVERRIDE; 2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count, 24930da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const SK_OVERRIDE; 2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count, 25130da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const SK_OVERRIDE; 2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 253b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.com SK_DEVELOPER_TO_STRING() 254ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcXfermode) 2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkProcXfermode(SkFlattenableReadBuffer&); 25854924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 260c34d7cfca1892babc0c3b8811da1201ef466bd03reed@google.com // allow subclasses to update this after we unflatten 261c34d7cfca1892babc0c3b8811da1201ef466bd03reed@google.com void setProc(SkXfermodeProc proc) { 262c34d7cfca1892babc0c3b8811da1201ef466bd03reed@google.com fProc = proc; 263c34d7cfca1892babc0c3b8811da1201ef466bd03reed@google.com } 264c34d7cfca1892babc0c3b8811da1201ef466bd03reed@google.com 2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkXfermodeProc fProc; 2671447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkXfermode INHERITED; 2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 272