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