SkXfermode.h revision 40528743dbb9ce7f39f093e0cdc47849ac8887cf
10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * you may not use this file except in compliance with the License.
60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * You may obtain a copy of the License at
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * See the License for the specific language governing permissions and
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * limitations under the License.
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkXfermode_DEFINED
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkXfermode_DEFINED
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFlattenable.h"
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkColor.h"
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkXfermode
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkXfermode is the base class for objects that are called to implement custom
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    "transfer-modes" in the drawing pipeline. The static function Create(Modes)
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    can be called to return an instance of any of the predefined subclasses as
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    specified in the Modes enum. When an SkXfermode is assigned to an SkPaint,
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    then objects drawn with that paint have the xfermode applied.
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkXfermode : public SkFlattenable {
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkXfermode() {}
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkAlpha aa[]);
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkAlpha aa[]);
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkAlpha aa[]);
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkAlpha aa[]);
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
44ab1af391811c7721e755a3893539d51565422eccMike Reed    /** Enum of possible coefficients to describe some xfermodes
45ab1af391811c7721e755a3893539d51565422eccMike Reed     */
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum Coeff {
47ab1af391811c7721e755a3893539d51565422eccMike Reed        kZero_Coeff,    /** 0 */
48ab1af391811c7721e755a3893539d51565422eccMike Reed        kOne_Coeff,     /** 1 */
49ab1af391811c7721e755a3893539d51565422eccMike Reed        kSC_Coeff,      /** src color */
50ab1af391811c7721e755a3893539d51565422eccMike Reed        kISC_Coeff,     /** inverse src color (i.e. 1 - sc) */
51ab1af391811c7721e755a3893539d51565422eccMike Reed        kDC_Coeff,      /** dst color */
52ab1af391811c7721e755a3893539d51565422eccMike Reed        kIDC_Coeff,     /** inverse dst color (i.e. 1 - dc) */
53ab1af391811c7721e755a3893539d51565422eccMike Reed        kSA_Coeff,      /** src alpha */
54ab1af391811c7721e755a3893539d51565422eccMike Reed        kISA_Coeff,     /** inverse src alpha (i.e. 1 - sa) */
55ab1af391811c7721e755a3893539d51565422eccMike Reed        kDA_Coeff,      /** dst alpha */
56ab1af391811c7721e755a3893539d51565422eccMike Reed        kIDA_Coeff,     /** inverse dst alpha (i.e. 1 - da) */
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kCoeffCount
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
60ab1af391811c7721e755a3893539d51565422eccMike Reed
61ab1af391811c7721e755a3893539d51565422eccMike Reed    /** If the xfermode can be expressed as an equation using the coefficients
62ab1af391811c7721e755a3893539d51565422eccMike Reed        in Coeff, then asCoeff() returns true, and sets (if not null) src and
63ab1af391811c7721e755a3893539d51565422eccMike Reed        dst accordingly.
64ab1af391811c7721e755a3893539d51565422eccMike Reed
65ab1af391811c7721e755a3893539d51565422eccMike Reed            result = src_coeff * src_color + dst_coeff * dst_color;
66ab1af391811c7721e755a3893539d51565422eccMike Reed
67ab1af391811c7721e755a3893539d51565422eccMike Reed        As examples, here are some of the porterduff coefficients
68ab1af391811c7721e755a3893539d51565422eccMike Reed
69ab1af391811c7721e755a3893539d51565422eccMike Reed        MODE        SRC_COEFF       DST_COEFF
70ab1af391811c7721e755a3893539d51565422eccMike Reed        clear       zero            zero
71ab1af391811c7721e755a3893539d51565422eccMike Reed        src         one             zero
72ab1af391811c7721e755a3893539d51565422eccMike Reed        dst         zero            one
73ab1af391811c7721e755a3893539d51565422eccMike Reed        srcover     one             isa
74ab1af391811c7721e755a3893539d51565422eccMike Reed        dstover     ida             one
75ab1af391811c7721e755a3893539d51565422eccMike Reed     */
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool asCoeff(Coeff* src, Coeff* dst);
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
789f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    /** List of predefined xfermodes.
799f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        The algebra for the modes uses the following symbols:
809f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        Sa, Sc  - source alpha and color
819f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        Da, Dc - destination alpha and color (before compositing)
829f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        [a, c] - Resulting (alpha, color) values
839f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        For these equations, the colors are in premultiplied state.
849f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        If no xfermode is specified, kSrcOver is assumed.
859f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed     */
869f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    enum Mode {
879f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kClear_Mode,    //!< [0, 0]
889f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSrc_Mode,      //!< [Sa, Sc]
899f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDst_Mode,      //!< [Da, Dc]
909f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSrcOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc]
919f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDstOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc]
929f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSrcIn_Mode,    //!< [Sa * Da, Sc * Da]
939f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDstIn_Mode,    //!< [Sa * Da, Sa * Dc]
949f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSrcOut_Mode,   //!< [Sa * (1 - Da), Sc * (1 - Da)]
959f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDstOut_Mode,   //!< [Da * (1 - Sa), Dc * (1 - Sa)]
969f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSrcATop_Mode,  //!< [Da, Sc * Da + (1 - Sa) * Dc]
979f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDstATop_Mode,  //!< [Sa, Sa * Dc + Sc * (1 - Da)]
989f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kXor_Mode,      //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
999f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
1009f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        // these modes are defined in the SVG Compositing standard
1019f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        // http://www.w3.org/TR/2009/WD-SVGCompositing-20090430/
1029f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kPlus_Mode,
1039f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kMultiply_Mode,
1049f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kScreen_Mode,
1059f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kOverlay_Mode,
1069f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDarken_Mode,
1079f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kLighten_Mode,
1089f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kColorDodge_Mode,
1099f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kColorBurn_Mode,
1109f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kHardLight_Mode,
1119f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSoftLight_Mode,
1129f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDifference_Mode,
1139f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kExclusion_Mode,
1149f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
1159f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kLastMode = kExclusion_Mode
1169f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    };
1179f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
11840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /** If the xfermode is one of the modes in the Mode enum, then asMode()
11940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        returns true and sets (if not null) mode accordingly.
12040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        This is a better version of IsMode(), which is only able to report
12140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        about modes that are expressible as coefficients.
12240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
12340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    virtual bool asMode(Mode* mode);
12440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
1259f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    /** Return an SkXfermode object for the specified mode.
1269f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed     */
1279f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    static SkXfermode* Create(Mode mode);
1289f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
1299f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    /** Return a function pointer to a routine that applies the specified
1309f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        porter-duff transfer mode.
1319f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed     */
1329f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    static SkXfermodeProc GetProc(Mode mode);
1339f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
1349f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    /** Return a function pointer to a routine that applies the specified
1359f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        porter-duff transfer mode and srcColor to a 16bit device color. Note,
1369f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        if the mode+srcColor might return a non-opaque color, then there is not
1379f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        16bit proc, and this will return NULL.
1389f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed      */
1399f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    static SkXfermodeProc16 GetProc16(Mode mode, SkColor srcColor);
1409f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
1419f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    /** If the specified xfermode advertises itself as one of the porterduff
1429f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        modes (via SkXfermode::Coeff), return true and if not null, set mode
1439f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        to the corresponding porterduff mode. If it is not recognized as a one,
1449f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        return false and ignore the mode parameter.
1459f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed     */
1469f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    static bool IsMode(SkXfermode*, Mode* mode);
14740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
148064c4371c21a4205ed6acdb3c839e4e7805e346bRomain Guy    Mode fMode;
1499f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkXfermode(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {}
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** The default implementation of xfer32/xfer16/xferA8 in turn call this
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        method, 1 color at a time (upscaled to a SkPMColor). The default
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        implmentation of this method just returns dst. If performance is
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        important, your subclass should override xfer32/xfer16/xferA8 directly.
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        This method will not be called directly by the client, so it need not
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        be implemented if your subclass has overridden xfer32/xfer16/xferA8
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst);
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1649f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    enum {
1659f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kModeCount = kLastMode + 1
1669f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    };
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkFlattenable INHERITED;
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkProcXfermode
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkProcXfermode is a xfermode that applies the specified proc to its colors.
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    This class is not exported to java.
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkProcXfermode : public SkXfermode {
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkProcXfermode(SkXfermodeProc proc) : fProc(proc) {}
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // overrides from SkXfermode
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkAlpha aa[]);
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkAlpha aa[]);
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkAlpha aa[]);
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkAlpha aa[]);
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // overrides from SkFlattenable
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual Factory getFactory() { return CreateProc; }
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void    flatten(SkFlattenableWriteBuffer&);
19440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    virtual bool asMode(SkXfermode::Mode* mode);
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkProcXfermode(SkFlattenableReadBuffer&);
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkXfermodeProc  fProc;
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return SkNEW_ARGS(SkProcXfermode, (buffer)); }
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkXfermode INHERITED;
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
210