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