15bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com
2f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com/*
35bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Copyright 2006 The Android Open Source Project
4f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com *
55bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Use of this source code is governed by a BSD-style license that can be
65bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * found in the LICENSE file.
7f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com */
8f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
95bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com
10f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#ifndef SkXfermode_DEFINED
11f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#define SkXfermode_DEFINED
12f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
13f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#include "SkFlattenable.h"
14f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#include "SkColor.h"
15f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
168bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.comclass GrEffectRef;
17c96186de18e0a7714079dcef811114d22c7e056csenorblanco@chromium.orgclass GrTexture;
18157df59c19760346cd2301d4623a541a63f5ec13robertphillips@google.comclass SkString;
19157df59c19760346cd2301d4623a541a63f5ec13robertphillips@google.com
20f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com/** \class SkXfermode
219b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com *
229b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com *  SkXfermode is the base class for objects that are called to implement custom
239b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com *  "transfer-modes" in the drawing pipeline. The static function Create(Modes)
249b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com *  can be called to return an instance of any of the predefined subclasses as
259b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com *  specified in the Modes enum. When an SkXfermode is assigned to an SkPaint,
269b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com *  then objects drawn with that paint have the xfermode applied.
279b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com *
289b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com *  All subclasses are required to be reentrant-safe : it must be legal to share
299b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com *  the same instance between several threads.
309b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com */
312083387d719b933797044ad07efd3bb67f99a5c5ctguil@chromium.orgclass SK_API SkXfermode : public SkFlattenable {
32f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.compublic:
334f0673f27c2dbb98a7cfebb87d1a5cf3ab5924derobertphillips@google.com    SK_DECLARE_INST_COUNT(SkXfermode)
344f0673f27c2dbb98a7cfebb87d1a5cf3ab5924derobertphillips@google.com
35f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    SkXfermode() {}
36f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
37f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
38b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com                        const SkAlpha aa[]) const;
39f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
40b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com                        const SkAlpha aa[]) const;
41f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
42b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com                        const SkAlpha aa[]) const;
43718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
44d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com    /** Enum of possible coefficients to describe some xfermodes
45d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com     */
46f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    enum Coeff {
47d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        kZero_Coeff,    /** 0 */
48d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        kOne_Coeff,     /** 1 */
49d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        kSC_Coeff,      /** src color */
50d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        kISC_Coeff,     /** inverse src color (i.e. 1 - sc) */
51d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        kDC_Coeff,      /** dst color */
52d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        kIDC_Coeff,     /** inverse dst color (i.e. 1 - dc) */
53d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        kSA_Coeff,      /** src alpha */
54d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        kISA_Coeff,     /** inverse src alpha (i.e. 1 - sa) */
55d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        kDA_Coeff,      /** dst alpha */
56d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        kIDA_Coeff,     /** inverse dst alpha (i.e. 1 - da) */
57718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
58f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        kCoeffCount
59f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    };
60718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
61d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com    /** If the xfermode can be expressed as an equation using the coefficients
62d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        in Coeff, then asCoeff() returns true, and sets (if not null) src and
63d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        dst accordingly.
64718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
65d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com            result = src_coeff * src_color + dst_coeff * dst_color;
66718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
67d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        As examples, here are some of the porterduff coefficients
68718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
69d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        MODE        SRC_COEFF       DST_COEFF
70d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        clear       zero            zero
71d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        src         one             zero
72d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        dst         zero            one
73d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        srcover     one             isa
74d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com        dstover     ida             one
75d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com     */
76b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com    virtual bool asCoeff(Coeff* src, Coeff* dst) const;
77f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
7814bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com    /**
7914bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com     *  The same as calling xfermode->asCoeff(..), except that this also checks
808bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com     *  if the xfermode is NULL, and if so, treats it as kSrcOver_Mode.
8114bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com     */
82b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com    static bool AsCoeff(const SkXfermode*, Coeff* src, Coeff* dst);
83718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
84802256ce934549e12ead45ea28f00f15784c45bbreed@android.com    /** List of predefined xfermodes.
85802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        The algebra for the modes uses the following symbols:
86802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        Sa, Sc  - source alpha and color
87802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        Da, Dc - destination alpha and color (before compositing)
88802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        [a, c] - Resulting (alpha, color) values
89802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        For these equations, the colors are in premultiplied state.
90802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        If no xfermode is specified, kSrcOver is assumed.
911d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com        The modes are ordered by those that can be expressed as a pair of Coeffs, followed by those
921d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com        that aren't Coeffs but have separable r,g,b computations, and finally
931d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com        those that are not separable.
94802256ce934549e12ead45ea28f00f15784c45bbreed@android.com     */
95802256ce934549e12ead45ea28f00f15784c45bbreed@android.com    enum Mode {
96802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kClear_Mode,    //!< [0, 0]
97802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kSrc_Mode,      //!< [Sa, Sc]
98802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kDst_Mode,      //!< [Da, Dc]
99802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kSrcOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc]
100802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kDstOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc]
101802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kSrcIn_Mode,    //!< [Sa * Da, Sc * Da]
102802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kDstIn_Mode,    //!< [Sa * Da, Sa * Dc]
103802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kSrcOut_Mode,   //!< [Sa * (1 - Da), Sc * (1 - Da)]
104802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kDstOut_Mode,   //!< [Da * (1 - Sa), Dc * (1 - Sa)]
105802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kSrcATop_Mode,  //!< [Da, Sc * Da + (1 - Sa) * Dc]
106802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kDstATop_Mode,  //!< [Sa, Sa * Dc + Sc * (1 - Da)]
107802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kXor_Mode,      //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
108d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org        kPlus_Mode,     //!< [Sa + Da, Sc + Dc]
1099d94a06c9b2e291c720f27f920554be39d7e08careed@google.com        kModulate_Mode, // multiplies all components (= alpha and color)
1101fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com
1115efd372d4459416a9f33318bd60f41a8a6b9c5cfskia.committer@gmail.com        // Following blend modes are defined in the CSS Compositing standard:
112d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org        // https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blending
113140ba0d3509b8eda54f8a25c7d01be6a3e00a541bsalomon@google.com        kScreen_Mode,
1141d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com        kLastCoeffMode = kScreen_Mode,
1151d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com
1161d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com        kOverlay_Mode,
117802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kDarken_Mode,
118802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kLighten_Mode,
119802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kColorDodge_Mode,
120802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kColorBurn_Mode,
121802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kHardLight_Mode,
122802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kSoftLight_Mode,
123802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kDifference_Mode,
124802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kExclusion_Mode,
125cc109174848be71c2fcfa2f3f9f8bbe81a15276creed@google.com        kMultiply_Mode,
1261d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com        kLastSeparableMode = kMultiply_Mode,
127802256ce934549e12ead45ea28f00f15784c45bbreed@android.com
128d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org        kHue_Mode,
129d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org        kSaturation_Mode,
130d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org        kColor_Mode,
131d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org        kLuminosity_Mode,
132d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org        kLastMode = kLuminosity_Mode
133802256ce934549e12ead45ea28f00f15784c45bbreed@android.com    };
134117e2610daa4ac90cfaf9e973bfa59dca238c7afskia.committer@gmail.com
13547d7275abb0b94655bc59f0a31e5b82694c27fd7commit-bot@chromium.org    /**
13647d7275abb0b94655bc59f0a31e5b82694c27fd7commit-bot@chromium.org     * Gets the name of the Mode as a string.
13747d7275abb0b94655bc59f0a31e5b82694c27fd7commit-bot@chromium.org     */
13847d7275abb0b94655bc59f0a31e5b82694c27fd7commit-bot@chromium.org    static const char* ModeName(Mode);
139802256ce934549e12ead45ea28f00f15784c45bbreed@android.com
1404922e5674b2a45a06355dcdd50512aa49acbbcbfreed@google.com    /**
1414922e5674b2a45a06355dcdd50512aa49acbbcbfreed@google.com     *  If the xfermode is one of the modes in the Mode enum, then asMode()
1424922e5674b2a45a06355dcdd50512aa49acbbcbfreed@google.com     *  returns true and sets (if not null) mode accordingly. Otherwise it
1434922e5674b2a45a06355dcdd50512aa49acbbcbfreed@google.com     *  returns false and ignores the mode parameter.
1446ed4aff9594bacd7036ebbb3f19054abc54cf6abvandebo@chromium.org     */
145b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com    virtual bool asMode(Mode* mode) const;
1466ed4aff9594bacd7036ebbb3f19054abc54cf6abvandebo@chromium.org
14714bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com    /**
14814bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com     *  The same as calling xfermode->asMode(mode), except that this also checks
1498bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com     *  if the xfermode is NULL, and if so, treats it as kSrcOver_Mode.
15014bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com     */
151b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com    static bool AsMode(const SkXfermode*, Mode* mode);
15214bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com
153d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org    /**
154d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org     *  Returns true if the xfermode claims to be the specified Mode. This works
155d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org     *  correctly even if the xfermode is NULL (which equates to kSrcOver.) Thus
156d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org     *  you can say this without checking for a null...
157d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org     *
158d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org     *  If (SkXfermode::IsMode(paint.getXfermode(),
159d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org     *                         SkXfermode::kDstOver_Mode)) {
160d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org     *      ...
161d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org     *  }
162d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org     */
163b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com    static bool IsMode(const SkXfermode* xfer, Mode mode);
164d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org
165802256ce934549e12ead45ea28f00f15784c45bbreed@android.com    /** Return an SkXfermode object for the specified mode.
166802256ce934549e12ead45ea28f00f15784c45bbreed@android.com     */
167802256ce934549e12ead45ea28f00f15784c45bbreed@android.com    static SkXfermode* Create(Mode mode);
168802256ce934549e12ead45ea28f00f15784c45bbreed@android.com
169802256ce934549e12ead45ea28f00f15784c45bbreed@android.com    /** Return a function pointer to a routine that applies the specified
170802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        porter-duff transfer mode.
171802256ce934549e12ead45ea28f00f15784c45bbreed@android.com     */
172802256ce934549e12ead45ea28f00f15784c45bbreed@android.com    static SkXfermodeProc GetProc(Mode mode);
173802256ce934549e12ead45ea28f00f15784c45bbreed@android.com
174802256ce934549e12ead45ea28f00f15784c45bbreed@android.com    /** Return a function pointer to a routine that applies the specified
175802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        porter-duff transfer mode and srcColor to a 16bit device color. Note,
176802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        if the mode+srcColor might return a non-opaque color, then there is not
177802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        16bit proc, and this will return NULL.
178802256ce934549e12ead45ea28f00f15784c45bbreed@android.com      */
179802256ce934549e12ead45ea28f00f15784c45bbreed@android.com    static SkXfermodeProc16 GetProc16(Mode mode, SkColor srcColor);
180718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
1814922e5674b2a45a06355dcdd50512aa49acbbcbfreed@google.com    /**
18214bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com     *  If the specified mode can be represented by a pair of Coeff, then return
18314bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com     *  true and set (if not NULL) the corresponding coeffs. If the mode is
18414bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com     *  not representable as a pair of Coeffs, return false and ignore the
18514bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com     *  src and dst parameters.
186802256ce934549e12ead45ea28f00f15784c45bbreed@android.com     */
18714bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com    static bool ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst);
188802256ce934549e12ead45ea28f00f15784c45bbreed@android.com
18983f9f7e836c0cf22241d9a9cb80deafb526993e0reed@google.com    SK_ATTR_DEPRECATED("use AsMode(...)")
190b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com    static bool IsMode(const SkXfermode* xfer, Mode* mode) {
19114bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com        return AsMode(xfer, mode);
19214bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com    }
193718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
1948bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com    /** A subclass may implement this factory function to work with the GPU backend. It is legal
195e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org        to call this with all params NULL to simply test the return value. If effect is non-NULL
196e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org        then the xfermode may optionally allocate an effect to return and the caller as *effect.
197e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org        The caller will install it and own a ref to it. Since the xfermode may or may not assign
198e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org        *effect, the caller should set *effect to NULL beforehand. background specifies the
199e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org        texture to use as the background for compositing, and should be accessed in the effect's
200e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org        fragment shader. If NULL, the effect should request access to destination color
201e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org        (setWillReadDstColor()), and use that in the fragment shader (builder->dstColor()).
2028bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com     */
203e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org    virtual bool asNewEffect(GrEffectRef** effect, GrTexture* background = NULL) const;
2048bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com
205e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org    /** Returns true if the xfermode can be expressed as coeffs (src, dst), or as an effect
206e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org        (effect). This helper calls the asCoeff() and asNewEffect() virtuals. If the xfermode is
207e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org        NULL, it is treated as kSrcOver_Mode. It is legal to call this with all params NULL to
208e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org        simply test the return value.  effect, src, and dst must all be NULL or all non-NULL.
2098bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com     */
210d9ac5ced77d4e34bec616bfa033762cfd6768df2bsalomon@google.com    static bool AsNewEffectOrCoeff(SkXfermode*,
211d9ac5ced77d4e34bec616bfa033762cfd6768df2bsalomon@google.com                                   GrEffectRef** effect,
212d9ac5ced77d4e34bec616bfa033762cfd6768df2bsalomon@google.com                                   Coeff* src,
213c96186de18e0a7714079dcef811114d22c7e056csenorblanco@chromium.org                                   Coeff* dst,
214c96186de18e0a7714079dcef811114d22c7e056csenorblanco@chromium.org                                   GrTexture* background = NULL);
2158bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com
216157df59c19760346cd2301d4623a541a63f5ec13robertphillips@google.com    SkDEVCODE(virtual void toString(SkString* str) const = 0;)
2179b9da23a5235e15f735e0838b6ca7c62345169e3djsollen@google.com    SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
2184035169372231efab50ead6ca20b4f4156146373commit-bot@chromium.org    SK_DEFINE_FLATTENABLE_TYPE(SkXfermode)
2194035169372231efab50ead6ca20b4f4156146373commit-bot@chromium.org
220f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comprotected:
221f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    SkXfermode(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {}
222718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
223f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    /** The default implementation of xfer32/xfer16/xferA8 in turn call this
224f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        method, 1 color at a time (upscaled to a SkPMColor). The default
225f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        implmentation of this method just returns dst. If performance is
226f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        important, your subclass should override xfer32/xfer16/xferA8 directly.
227718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
228f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        This method will not be called directly by the client, so it need not
229f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com        be implemented if your subclass has overridden xfer32/xfer16/xferA8
230f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    */
231b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com    virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst) const;
232f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
233f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comprivate:
234802256ce934549e12ead45ea28f00f15784c45bbreed@android.com    enum {
235802256ce934549e12ead45ea28f00f15784c45bbreed@android.com        kModeCount = kLastMode + 1
236802256ce934549e12ead45ea28f00f15784c45bbreed@android.com    };
2379c0dc41ca51ae17c54b14a804c6089cf5b0240c7commit-bot@chromium.org
2389c0dc41ca51ae17c54b14a804c6089cf5b0240c7commit-bot@chromium.org    friend class SkGraphics;
2399c0dc41ca51ae17c54b14a804c6089cf5b0240c7commit-bot@chromium.org    static void Term();
2409c0dc41ca51ae17c54b14a804c6089cf5b0240c7commit-bot@chromium.org
241f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    typedef SkFlattenable INHERITED;
242f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com};
243f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
244f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com///////////////////////////////////////////////////////////////////////////////
245f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
246f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com/** \class SkProcXfermode
247f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
248f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    SkProcXfermode is a xfermode that applies the specified proc to its colors.
249f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    This class is not exported to java.
250f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com*/
251f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comclass SkProcXfermode : public SkXfermode {
252f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.compublic:
253f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    SkProcXfermode(SkXfermodeProc proc) : fProc(proc) {}
254f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
255f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    // overrides from SkXfermode
256f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
257b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com                        const SkAlpha aa[]) const SK_OVERRIDE;
258f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
259b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com                        const SkAlpha aa[]) const SK_OVERRIDE;
260f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
261b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com                        const SkAlpha aa[]) const SK_OVERRIDE;
262f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
263157df59c19760346cd2301d4623a541a63f5ec13robertphillips@google.com    SK_DEVELOPER_TO_STRING()
26414f592f823cedde633bf7d468c3a14b02ee56674djsollen@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcXfermode)
265f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
266f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comprotected:
267f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    SkProcXfermode(SkFlattenableReadBuffer&);
268e133d6ad314603114c7ef80423391f65cbb599d7djsollen@google.com    virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
269f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
270f7d014f9f8e26c75ca398d98cbd580afdd5ca15dreed@google.com    // allow subclasses to update this after we unflatten
271f7d014f9f8e26c75ca398d98cbd580afdd5ca15dreed@google.com    void setProc(SkXfermodeProc proc) {
272f7d014f9f8e26c75ca398d98cbd580afdd5ca15dreed@google.com        fProc = proc;
273f7d014f9f8e26c75ca398d98cbd580afdd5ca15dreed@google.com    }
274f7d014f9f8e26c75ca398d98cbd580afdd5ca15dreed@google.com
27597a3f754ead7c227355ff7183f87c971803a3194commit-bot@chromium.org    SkXfermodeProc getProc() const {
27697a3f754ead7c227355ff7183f87c971803a3194commit-bot@chromium.org        return fProc;
27797a3f754ead7c227355ff7183f87c971803a3194commit-bot@chromium.org    }
27897a3f754ead7c227355ff7183f87c971803a3194commit-bot@chromium.org
279f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comprivate:
280f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    SkXfermodeProc  fProc;
281718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com
282f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com    typedef SkXfermode INHERITED;
283f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com};
284f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com
285f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#endif
286