SkXfermode.h revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
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
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkXfermode
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkXfermode is the base class for objects that are called to implement custom
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    "transfer-modes" in the drawing pipeline. The static function Create(Modes)
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    can be called to return an instance of any of the predefined subclasses as
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    specified in the Modes enum. When an SkXfermode is assigned to an SkPaint,
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    then objects drawn with that paint have the xfermode applied.
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
247ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.orgclass SK_API SkXfermode : public SkFlattenable {
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkXfermode() {}
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        const SkAlpha aa[]);
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        const SkAlpha aa[]);
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                          const SkAlpha aa[]);
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        const SkAlpha aa[]);
361447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
37d252db03d9650013b545ef9781fe993c07f8f314reed@android.com    /** Enum of possible coefficients to describe some xfermodes
38d252db03d9650013b545ef9781fe993c07f8f314reed@android.com     */
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    enum Coeff {
40d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        kZero_Coeff,    /** 0 */
41d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        kOne_Coeff,     /** 1 */
42d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        kSC_Coeff,      /** src color */
43d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        kISC_Coeff,     /** inverse src color (i.e. 1 - sc) */
44d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        kDC_Coeff,      /** dst color */
45d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        kIDC_Coeff,     /** inverse dst color (i.e. 1 - dc) */
46d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        kSA_Coeff,      /** src alpha */
47d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        kISA_Coeff,     /** inverse src alpha (i.e. 1 - sa) */
48d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        kDA_Coeff,      /** dst alpha */
49d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        kIDA_Coeff,     /** inverse dst alpha (i.e. 1 - da) */
501447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kCoeffCount
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
531447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
54d252db03d9650013b545ef9781fe993c07f8f314reed@android.com    /** If the xfermode can be expressed as an equation using the coefficients
55d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        in Coeff, then asCoeff() returns true, and sets (if not null) src and
56d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        dst accordingly.
571447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
58d252db03d9650013b545ef9781fe993c07f8f314reed@android.com            result = src_coeff * src_color + dst_coeff * dst_color;
591447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
60d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        As examples, here are some of the porterduff coefficients
611447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
62d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        MODE        SRC_COEFF       DST_COEFF
63d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        clear       zero            zero
64d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        src         one             zero
65d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        dst         zero            one
66d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        srcover     one             isa
67d252db03d9650013b545ef9781fe993c07f8f314reed@android.com        dstover     ida             one
68d252db03d9650013b545ef9781fe993c07f8f314reed@android.com     */
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool asCoeff(Coeff* src, Coeff* dst);
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
7143c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com    /**
7243c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com     *  The same as calling xfermode->asCoeff(..), except that this also checks
7343c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com     *  if the xfermode is NULL, and if so, treats its as kSrcOver_Mode.
7443c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com     */
7543c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com    static bool AsCoeff(SkXfermode*, Coeff* src, Coeff* dst);
761447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
77a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    /** List of predefined xfermodes.
78a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        The algebra for the modes uses the following symbols:
79a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        Sa, Sc  - source alpha and color
80a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        Da, Dc - destination alpha and color (before compositing)
81a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        [a, c] - Resulting (alpha, color) values
82a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        For these equations, the colors are in premultiplied state.
83a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        If no xfermode is specified, kSrcOver is assumed.
84a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com     */
85a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    enum Mode {
86a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kClear_Mode,    //!< [0, 0]
87a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kSrc_Mode,      //!< [Sa, Sc]
88a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kDst_Mode,      //!< [Da, Dc]
89a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kSrcOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc]
90a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kDstOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc]
91a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kSrcIn_Mode,    //!< [Sa * Da, Sc * Da]
92a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kDstIn_Mode,    //!< [Sa * Da, Sa * Dc]
93a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kSrcOut_Mode,   //!< [Sa * (1 - Da), Sc * (1 - Da)]
94a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kDstOut_Mode,   //!< [Da * (1 - Sa), Dc * (1 - Sa)]
95a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kSrcATop_Mode,  //!< [Da, Sc * Da + (1 - Sa) * Dc]
96a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kDstATop_Mode,  //!< [Sa, Sa * Dc + Sc * (1 - Da)]
97a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kXor_Mode,      //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
98a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
99f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com        // all remaining modes are defined in the SVG Compositing standard
100a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        // http://www.w3.org/TR/2009/WD-SVGCompositing-20090430/
101a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kPlus_Mode,
102f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com        kMultiply_Mode,
103f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com
104f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com        // all above modes can be expressed as pair of src/dst Coeffs
105f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com        kCoeffModesCnt,
106f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com
107f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com        kScreen_Mode = kCoeffModesCnt,
108a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kOverlay_Mode,
109a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kDarken_Mode,
110a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kLighten_Mode,
111a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kColorDodge_Mode,
112a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kColorBurn_Mode,
113a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kHardLight_Mode,
114a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kSoftLight_Mode,
115a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kDifference_Mode,
116a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kExclusion_Mode,
117a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
118a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kLastMode = kExclusion_Mode
119a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    };
120a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
121c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com    /**
122c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com     *  If the xfermode is one of the modes in the Mode enum, then asMode()
123c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com     *  returns true and sets (if not null) mode accordingly. Otherwise it
124c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com     *  returns false and ignores the mode parameter.
12548543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org     */
12648543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org    virtual bool asMode(Mode* mode);
12748543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org
12843c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com    /**
12943c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com     *  The same as calling xfermode->asMode(mode), except that this also checks
13043c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com     *  if the xfermode is NULL, and if so, treats its as kSrcOver_Mode.
13143c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com     */
13243c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com    static bool AsMode(SkXfermode*, Mode* mode);
13343c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com
134a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    /** Return an SkXfermode object for the specified mode.
135a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com     */
136a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    static SkXfermode* Create(Mode mode);
137a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
138a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    /** Return a function pointer to a routine that applies the specified
139a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        porter-duff transfer mode.
140a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com     */
141a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    static SkXfermodeProc GetProc(Mode mode);
142a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
143a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    /** Return a function pointer to a routine that applies the specified
144a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        porter-duff transfer mode and srcColor to a 16bit device color. Note,
145a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        if the mode+srcColor might return a non-opaque color, then there is not
146a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        16bit proc, and this will return NULL.
147a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com      */
148a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    static SkXfermodeProc16 GetProc16(Mode mode, SkColor srcColor);
1491447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
150c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com    /**
15143c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com     *  If the specified mode can be represented by a pair of Coeff, then return
15243c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com     *  true and set (if not NULL) the corresponding coeffs. If the mode is
15343c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com     *  not representable as a pair of Coeffs, return false and ignore the
15443c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com     *  src and dst parameters.
155a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com     */
15643c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com    static bool ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst);
157a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com
15843c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com    // DEPRECATED: call AsMode(...)
15943c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com    static bool IsMode(SkXfermode* xfer, Mode* mode) {
16043c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com        return AsMode(xfer, mode);
16143c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com    }
1621447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkXfermode(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {}
1651447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** The default implementation of xfer32/xfer16/xferA8 in turn call this
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        method, 1 color at a time (upscaled to a SkPMColor). The default
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        implmentation of this method just returns dst. If performance is
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        important, your subclass should override xfer32/xfer16/xferA8 directly.
1701447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        This method will not be called directly by the client, so it need not
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        be implemented if your subclass has overridden xfer32/xfer16/xferA8
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst);
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
177a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    enum {
178a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com        kModeCount = kLastMode + 1
179a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com    };
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkFlattenable INHERITED;
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkProcXfermode
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkProcXfermode is a xfermode that applies the specified proc to its colors.
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    This class is not exported to java.
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkProcXfermode : public SkXfermode {
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkProcXfermode(SkXfermodeProc proc) : fProc(proc) {}
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides from SkXfermode
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        const SkAlpha aa[]);
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        const SkAlpha aa[]);
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                          const SkAlpha aa[]);
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                        const SkAlpha aa[]);
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides from SkFlattenable
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual Factory getFactory() { return CreateProc; }
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void    flatten(SkFlattenableWriteBuffer&);
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkProcXfermode(SkFlattenableReadBuffer&);
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkXfermodeProc  fProc;
2131447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return SkNEW_ARGS(SkProcXfermode, (buffer)); }
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkXfermode INHERITED;
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
221