11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkXfermode_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkXfermode_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFlattenable.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkColor.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkXfermode
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkXfermode is the base class for objects that are called to implement custom
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    "transfer-modes" in the drawing pipeline. The static function Create(Modes)
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    can be called to return an instance of any of the predefined subclasses as
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    specified in the Modes enum. When an SkXfermode is assigned to an SkPaint,
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    then objects drawn with that paint have the xfermode applied.
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
24137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerclass SK_API SkXfermode : public SkFlattenable {
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkXfermode() {}
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkAlpha aa[]);
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkAlpha aa[]);
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkAlpha aa[]);
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const SkAlpha aa[]);
3635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
37ab1af391811c7721e755a3893539d51565422eccMike Reed    /** Enum of possible coefficients to describe some xfermodes
38ab1af391811c7721e755a3893539d51565422eccMike Reed     */
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum Coeff {
40ab1af391811c7721e755a3893539d51565422eccMike Reed        kZero_Coeff,    /** 0 */
41ab1af391811c7721e755a3893539d51565422eccMike Reed        kOne_Coeff,     /** 1 */
42ab1af391811c7721e755a3893539d51565422eccMike Reed        kSC_Coeff,      /** src color */
43ab1af391811c7721e755a3893539d51565422eccMike Reed        kISC_Coeff,     /** inverse src color (i.e. 1 - sc) */
44ab1af391811c7721e755a3893539d51565422eccMike Reed        kDC_Coeff,      /** dst color */
45ab1af391811c7721e755a3893539d51565422eccMike Reed        kIDC_Coeff,     /** inverse dst color (i.e. 1 - dc) */
46ab1af391811c7721e755a3893539d51565422eccMike Reed        kSA_Coeff,      /** src alpha */
47ab1af391811c7721e755a3893539d51565422eccMike Reed        kISA_Coeff,     /** inverse src alpha (i.e. 1 - sa) */
48ab1af391811c7721e755a3893539d51565422eccMike Reed        kDA_Coeff,      /** dst alpha */
49ab1af391811c7721e755a3893539d51565422eccMike Reed        kIDA_Coeff,     /** inverse dst alpha (i.e. 1 - da) */
5035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kCoeffCount
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
5335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
54ab1af391811c7721e755a3893539d51565422eccMike Reed    /** If the xfermode can be expressed as an equation using the coefficients
55ab1af391811c7721e755a3893539d51565422eccMike Reed        in Coeff, then asCoeff() returns true, and sets (if not null) src and
56ab1af391811c7721e755a3893539d51565422eccMike Reed        dst accordingly.
5735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
58ab1af391811c7721e755a3893539d51565422eccMike Reed            result = src_coeff * src_color + dst_coeff * dst_color;
5935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
60ab1af391811c7721e755a3893539d51565422eccMike Reed        As examples, here are some of the porterduff coefficients
6135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
62ab1af391811c7721e755a3893539d51565422eccMike Reed        MODE        SRC_COEFF       DST_COEFF
63ab1af391811c7721e755a3893539d51565422eccMike Reed        clear       zero            zero
64ab1af391811c7721e755a3893539d51565422eccMike Reed        src         one             zero
65ab1af391811c7721e755a3893539d51565422eccMike Reed        dst         zero            one
66ab1af391811c7721e755a3893539d51565422eccMike Reed        srcover     one             isa
67ab1af391811c7721e755a3893539d51565422eccMike Reed        dstover     ida             one
68ab1af391811c7721e755a3893539d51565422eccMike Reed     */
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool asCoeff(Coeff* src, Coeff* dst);
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
7135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
7235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  The same as calling xfermode->asCoeff(..), except that this also checks
7335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  if the xfermode is NULL, and if so, treats its as kSrcOver_Mode.
7435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
7535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    static bool AsCoeff(SkXfermode*, Coeff* src, Coeff* dst);
7635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
779f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    /** List of predefined xfermodes.
789f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        The algebra for the modes uses the following symbols:
799f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        Sa, Sc  - source alpha and color
809f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        Da, Dc - destination alpha and color (before compositing)
819f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        [a, c] - Resulting (alpha, color) values
829f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        For these equations, the colors are in premultiplied state.
839f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        If no xfermode is specified, kSrcOver is assumed.
849f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed     */
859f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    enum Mode {
869f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kClear_Mode,    //!< [0, 0]
879f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSrc_Mode,      //!< [Sa, Sc]
889f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDst_Mode,      //!< [Da, Dc]
899f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSrcOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc]
909f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDstOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc]
919f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSrcIn_Mode,    //!< [Sa * Da, Sc * Da]
929f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDstIn_Mode,    //!< [Sa * Da, Sa * Dc]
939f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSrcOut_Mode,   //!< [Sa * (1 - Da), Sc * (1 - Da)]
949f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDstOut_Mode,   //!< [Da * (1 - Sa), Dc * (1 - Sa)]
959f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSrcATop_Mode,  //!< [Da, Sc * Da + (1 - Sa) * Dc]
969f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDstATop_Mode,  //!< [Sa, Sa * Dc + Sc * (1 - Da)]
979f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kXor_Mode,      //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
989f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // all remaining modes are defined in the SVG Compositing standard
1009f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        // http://www.w3.org/TR/2009/WD-SVGCompositing-20090430/
1019f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kPlus_Mode,
1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kMultiply_Mode,
1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // all above modes can be expressed as pair of src/dst Coeffs
1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kCoeffModesCnt,
1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kScreen_Mode = kCoeffModesCnt,
1089f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kOverlay_Mode,
1099f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDarken_Mode,
1109f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kLighten_Mode,
1119f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kColorDodge_Mode,
1129f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kColorBurn_Mode,
1139f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kHardLight_Mode,
1149f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kSoftLight_Mode,
1159f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kDifference_Mode,
1169f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kExclusion_Mode,
1179f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
1189f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kLastMode = kExclusion_Mode
1199f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    };
1209f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
12135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
12235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  If the xfermode is one of the modes in the Mode enum, then asMode()
12335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  returns true and sets (if not null) mode accordingly. Otherwise it
12435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  returns false and ignores the mode parameter.
12540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     */
12640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    virtual bool asMode(Mode* mode);
12740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
12835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
12935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  The same as calling xfermode->asMode(mode), except that this also checks
13035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  if the xfermode is NULL, and if so, treats its as kSrcOver_Mode.
13135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
13235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    static bool AsMode(SkXfermode*, Mode* mode);
13335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Returns true if the xfermode claims to be the specified Mode. This works
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  correctly even if the xfermode is NULL (which equates to kSrcOver.) Thus
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  you can say this without checking for a null...
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If (SkXfermode::IsMode(paint.getXfermode(),
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *                         SkXfermode::kDstOver_Mode)) {
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *      ...
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  }
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static bool IsMode(SkXfermode* xfer, Mode mode);
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1469f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    /** Return an SkXfermode object for the specified mode.
1479f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed     */
1489f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    static SkXfermode* Create(Mode mode);
1499f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
1509f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    /** Return a function pointer to a routine that applies the specified
1519f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        porter-duff transfer mode.
1529f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed     */
1539f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    static SkXfermodeProc GetProc(Mode mode);
1549f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
1559f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    /** Return a function pointer to a routine that applies the specified
1569f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        porter-duff transfer mode and srcColor to a 16bit device color. Note,
1579f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        if the mode+srcColor might return a non-opaque color, then there is not
1589f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        16bit proc, and this will return NULL.
1599f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed      */
1609f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    static SkXfermodeProc16 GetProc16(Mode mode, SkColor srcColor);
1619f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
16235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
16335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  If the specified mode can be represented by a pair of Coeff, then return
16435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  true and set (if not NULL) the corresponding coeffs. If the mode is
16535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  not representable as a pair of Coeffs, return false and ignore the
16635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     *  src and dst parameters.
1679f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed     */
16835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    static bool ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst);
16940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
17035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    // DEPRECATED: call AsMode(...)
17135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    static bool IsMode(SkXfermode* xfer, Mode* mode) {
17235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        return AsMode(xfer, mode);
17335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    }
1749f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SK_DECLARE_FLATTENABLE_REGISTRAR()
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkXfermode(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {}
17835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** The default implementation of xfer32/xfer16/xferA8 in turn call this
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        method, 1 color at a time (upscaled to a SkPMColor). The default
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        implmentation of this method just returns dst. If performance is
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        important, your subclass should override xfer32/xfer16/xferA8 directly.
18335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        This method will not be called directly by the client, so it need not
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        be implemented if your subclass has overridden xfer32/xfer16/xferA8
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst);
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1909f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    enum {
1919f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed        kModeCount = kLastMode + 1
1929f0b433bdd1680cd1d371c19d7e0ffde8fb2c484Mike Reed    };
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkFlattenable INHERITED;
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkProcXfermode
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkProcXfermode is a xfermode that applies the specified proc to its colors.
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    This class is not exported to java.
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkProcXfermode : public SkXfermode {
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkProcXfermode(SkXfermodeProc proc) : fProc(proc) {}
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // overrides from SkXfermode
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count,
2091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        const SkAlpha aa[]) SK_OVERRIDE;
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count,
2111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        const SkAlpha aa[]) SK_OVERRIDE;
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count,
2131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          const SkAlpha aa[]) SK_OVERRIDE;
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count,
2151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        const SkAlpha aa[]) SK_OVERRIDE;
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // overrides from SkFlattenable
2181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual Factory getFactory() SK_OVERRIDE { return CreateProc; }
2191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void    flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkProcXfermode(SkFlattenableReadBuffer&);
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // allow subclasses to update this after we unflatten
2251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setProc(SkXfermodeProc proc) {
2261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fProc = proc;
2271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkXfermodeProc  fProc;
23135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return SkNEW_ARGS(SkProcXfermode, (buffer)); }
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkXfermode INHERITED;
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
239