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 GrEffectRef; 1786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgclass GrTexture; 18b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.comclass SkString; 19b83b6b4f7690fe929d8d6b1a3d2b7ed562b95ba6robertphillips@google.com 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkXfermode 21fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com * 22fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com * SkXfermode is the base class for objects that are called to implement custom 23fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com * "transfer-modes" in the drawing pipeline. The static function Create(Modes) 24fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com * can be called to return an instance of any of the predefined subclasses as 25fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com * specified in the Modes enum. When an SkXfermode is assigned to an SkPaint, 26fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com * then objects drawn with that paint have the xfermode applied. 27fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com * 28fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com * All subclasses are required to be reentrant-safe : it must be legal to share 29fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com * the same instance between several threads. 30fb6deed66c20f86c86c105f41dbbf3f3c4a47e4creed@google.com */ 317ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.orgclass SK_API SkXfermode : public SkFlattenable { 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 330456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com SK_DECLARE_INST_COUNT(SkXfermode) 340456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, 3630da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const; 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count, 3830da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const; 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count, 4030da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const; 411447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 42d252db03d9650013b545ef9781fe993c07f8f314reed@android.com /** Enum of possible coefficients to describe some xfermodes 43d252db03d9650013b545ef9781fe993c07f8f314reed@android.com */ 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com enum Coeff { 45d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kZero_Coeff, /** 0 */ 46d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kOne_Coeff, /** 1 */ 47d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kSC_Coeff, /** src color */ 48d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kISC_Coeff, /** inverse src color (i.e. 1 - sc) */ 49d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kDC_Coeff, /** dst color */ 50d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kIDC_Coeff, /** inverse dst color (i.e. 1 - dc) */ 51d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kSA_Coeff, /** src alpha */ 52d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kISA_Coeff, /** inverse src alpha (i.e. 1 - sa) */ 53d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kDA_Coeff, /** dst alpha */ 54d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kIDA_Coeff, /** inverse dst alpha (i.e. 1 - da) */ 551447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kCoeffCount 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 581447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 59d252db03d9650013b545ef9781fe993c07f8f314reed@android.com /** If the xfermode can be expressed as an equation using the coefficients 60d252db03d9650013b545ef9781fe993c07f8f314reed@android.com in Coeff, then asCoeff() returns true, and sets (if not null) src and 61d252db03d9650013b545ef9781fe993c07f8f314reed@android.com dst accordingly. 621447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 63d252db03d9650013b545ef9781fe993c07f8f314reed@android.com result = src_coeff * src_color + dst_coeff * dst_color; 641447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 65d252db03d9650013b545ef9781fe993c07f8f314reed@android.com As examples, here are some of the porterduff coefficients 661447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 67d252db03d9650013b545ef9781fe993c07f8f314reed@android.com MODE SRC_COEFF DST_COEFF 68d252db03d9650013b545ef9781fe993c07f8f314reed@android.com clear zero zero 69d252db03d9650013b545ef9781fe993c07f8f314reed@android.com src one zero 70d252db03d9650013b545ef9781fe993c07f8f314reed@android.com dst zero one 71d252db03d9650013b545ef9781fe993c07f8f314reed@android.com srcover one isa 72d252db03d9650013b545ef9781fe993c07f8f314reed@android.com dstover ida one 73d252db03d9650013b545ef9781fe993c07f8f314reed@android.com */ 7430da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com virtual bool asCoeff(Coeff* src, Coeff* dst) const; 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 7643c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com /** 7743c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * The same as calling xfermode->asCoeff(..), except that this also checks 78f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com * if the xfermode is NULL, and if so, treats it as kSrcOver_Mode. 7943c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com */ 8030da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool AsCoeff(const SkXfermode*, Coeff* src, Coeff* dst); 811447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 82a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** List of predefined xfermodes. 83a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com The algebra for the modes uses the following symbols: 84a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com Sa, Sc - source alpha and color 85a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com Da, Dc - destination alpha and color (before compositing) 86a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com [a, c] - Resulting (alpha, color) values 87a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com For these equations, the colors are in premultiplied state. 88a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com If no xfermode is specified, kSrcOver is assumed. 898da9bc751e1898d50dd84d7e5ca666b00e4ff624bsalomon@google.com The modes are ordered by those that can be expressed as a pair of Coeffs, followed by those 908da9bc751e1898d50dd84d7e5ca666b00e4ff624bsalomon@google.com that aren't Coeffs but have separable r,g,b computations, and finally 918da9bc751e1898d50dd84d7e5ca666b00e4ff624bsalomon@google.com those that are not separable. 92a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 93a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com enum Mode { 94a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kClear_Mode, //!< [0, 0] 95a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrc_Mode, //!< [Sa, Sc] 96a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDst_Mode, //!< [Da, Dc] 97a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc] 98a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc] 99a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcIn_Mode, //!< [Sa * Da, Sc * Da] 100a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstIn_Mode, //!< [Sa * Da, Sa * Dc] 101a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] 102a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] 103a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] 104a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] 105a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kXor_Mode, //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] 106b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kPlus_Mode, //!< [Sa + Da, Sc + Dc] 1078d3cd7a170c810e3816bf00220cbef51e7b16795reed@google.com kModulate_Mode, // multiplies all components (= alpha and color) 108fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 10964334352cc3f29f52dfa07225d65eb218d2fd830skia.committer@gmail.com // Following blend modes are defined in the CSS Compositing standard: 110b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org // https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blending 111b0091b8382970c28dba57adc170e27b2e3d7394absalomon@google.com kScreen_Mode, 1128da9bc751e1898d50dd84d7e5ca666b00e4ff624bsalomon@google.com kLastCoeffMode = kScreen_Mode, 1138da9bc751e1898d50dd84d7e5ca666b00e4ff624bsalomon@google.com 1148da9bc751e1898d50dd84d7e5ca666b00e4ff624bsalomon@google.com kOverlay_Mode, 115a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDarken_Mode, 116a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kLighten_Mode, 117a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kColorDodge_Mode, 118a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kColorBurn_Mode, 119a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kHardLight_Mode, 120a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSoftLight_Mode, 121a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDifference_Mode, 122a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kExclusion_Mode, 12325cfa693420b6da4182bda42ba15970999b840ddreed@google.com kMultiply_Mode, 1248da9bc751e1898d50dd84d7e5ca666b00e4ff624bsalomon@google.com kLastSeparableMode = kMultiply_Mode, 125a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 126b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kHue_Mode, 127b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kSaturation_Mode, 128b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kColor_Mode, 129b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kLuminosity_Mode, 130b24f89353ed7a45b27ab0ffc69c222b81bbf87c3commit-bot@chromium.org kLastMode = kLuminosity_Mode 131a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com }; 13205a2ee052c9ef4c781b7b590b00b3d2da3b3449askia.committer@gmail.com 133d7aaf6034e519ea9b70649c1d344f2f24de90ccbcommit-bot@chromium.org /** 134d7aaf6034e519ea9b70649c1d344f2f24de90ccbcommit-bot@chromium.org * Gets the name of the Mode as a string. 135d7aaf6034e519ea9b70649c1d344f2f24de90ccbcommit-bot@chromium.org */ 136d7aaf6034e519ea9b70649c1d344f2f24de90ccbcommit-bot@chromium.org static const char* ModeName(Mode); 137a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 138c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com /** 139c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com * If the xfermode is one of the modes in the Mode enum, then asMode() 140c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com * returns true and sets (if not null) mode accordingly. Otherwise it 141c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com * returns false and ignores the mode parameter. 14248543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org */ 14330da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com virtual bool asMode(Mode* mode) const; 14448543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org 14543c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com /** 14643c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * The same as calling xfermode->asMode(mode), except that this also checks 147f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com * if the xfermode is NULL, and if so, treats it as kSrcOver_Mode. 14843c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com */ 14930da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool AsMode(const SkXfermode*, Mode* mode); 15043c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com 151e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org /** 152e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * Returns true if the xfermode claims to be the specified Mode. This works 153e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * correctly even if the xfermode is NULL (which equates to kSrcOver.) Thus 154e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * you can say this without checking for a null... 155e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * 156e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * If (SkXfermode::IsMode(paint.getXfermode(), 157e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * SkXfermode::kDstOver_Mode)) { 158e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * ... 159e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * } 160e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org */ 16130da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool IsMode(const SkXfermode* xfer, Mode mode); 162e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org 163a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** Return an SkXfermode object for the specified mode. 164a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 165a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com static SkXfermode* Create(Mode mode); 166a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 167a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** Return a function pointer to a routine that applies the specified 168a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com porter-duff transfer mode. 169a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 170a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com static SkXfermodeProc GetProc(Mode mode); 171a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 172a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** Return a function pointer to a routine that applies the specified 173a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com porter-duff transfer mode and srcColor to a 16bit device color. Note, 174a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com if the mode+srcColor might return a non-opaque color, then there is not 175a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 16bit proc, and this will return NULL. 176a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 177a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com static SkXfermodeProc16 GetProc16(Mode mode, SkColor srcColor); 1781447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 179c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com /** 18043c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * If the specified mode can be represented by a pair of Coeff, then return 18143c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * true and set (if not NULL) the corresponding coeffs. If the mode is 18243c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * not representable as a pair of Coeffs, return false and ignore the 18343c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * src and dst parameters. 184a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 18543c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com static bool ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst); 186a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 1874469938e92d779dff05e745559e67907bbf21e78reed@google.com SK_ATTR_DEPRECATED("use AsMode(...)") 18830da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool IsMode(const SkXfermode* xfer, Mode* mode) { 18943c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com return AsMode(xfer, mode); 19043c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com } 1911447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 192f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com /** A subclass may implement this factory function to work with the GPU backend. It is legal 1931a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org to call this with all params NULL to simply test the return value. If effect is non-NULL 1941a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org then the xfermode may optionally allocate an effect to return and the caller as *effect. 1951a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org The caller will install it and own a ref to it. Since the xfermode may or may not assign 1961a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org *effect, the caller should set *effect to NULL beforehand. background specifies the 1971a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org texture to use as the background for compositing, and should be accessed in the effect's 1981a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org fragment shader. If NULL, the effect should request access to destination color 1991a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org (setWillReadDstColor()), and use that in the fragment shader (builder->dstColor()). 200f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com */ 2011a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org virtual bool asNewEffect(GrEffectRef** effect, GrTexture* background = NULL) const; 202f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com 2031a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org /** Returns true if the xfermode can be expressed as coeffs (src, dst), or as an effect 2041a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org (effect). This helper calls the asCoeff() and asNewEffect() virtuals. If the xfermode is 2051a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org NULL, it is treated as kSrcOver_Mode. It is legal to call this with all params NULL to 2061a6382f5e76c051ffbbb60f3a68524dfe57cf798senorblanco@chromium.org simply test the return value. effect, src, and dst must all be NULL or all non-NULL. 207f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com */ 20826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com static bool AsNewEffectOrCoeff(SkXfermode*, 20926e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com GrEffectRef** effect, 21026e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com Coeff* src, 21186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org Coeff* dst, 21286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org GrTexture* background = NULL); 213f51c01328dc52a87c07e056d6fc4eb7452ccac7absalomon@google.com 2140f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org SK_TO_STRING_PUREVIRT() 215a2ca41e3afdd8fad5e0e924dec029f33918e0a67djsollen@google.com SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() 216c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SK_DEFINE_FLATTENABLE_TYPE(SkXfermode) 217c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org 2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 219bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org SkXfermode() {} 220bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org explicit SkXfermode(SkReadBuffer& rb) : SkFlattenable(rb) {} 2211447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /** The default implementation of xfer32/xfer16/xferA8 in turn call this 2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com method, 1 color at a time (upscaled to a SkPMColor). The default 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com implmentation of this method just returns dst. If performance is 2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com important, your subclass should override xfer32/xfer16/xferA8 directly. 2261447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com This method will not be called directly by the client, so it need not 2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com be implemented if your subclass has overridden xfer32/xfer16/xferA8 2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 23030da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst) const; 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 233a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com enum { 234a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kModeCount = kLastMode + 1 235a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com }; 23686490573b5cba554a27637e22485455a7b133de7commit-bot@chromium.org 2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkFlattenable INHERITED; 2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 241