SkXfermode.h revision 30da745bbf67a0ee0f305ca7bbdb685cc8a9e686
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: 260456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com SK_DECLARE_INST_COUNT(SkXfermode) 270456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkXfermode() {} 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, 3130da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const; 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count, 3330da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const; 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count, 3530da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const; 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count, 3730da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const; 381447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 39d252db03d9650013b545ef9781fe993c07f8f314reed@android.com /** Enum of possible coefficients to describe some xfermodes 40d252db03d9650013b545ef9781fe993c07f8f314reed@android.com */ 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com enum Coeff { 42d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kZero_Coeff, /** 0 */ 43d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kOne_Coeff, /** 1 */ 44d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kSC_Coeff, /** src color */ 45d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kISC_Coeff, /** inverse src color (i.e. 1 - sc) */ 46d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kDC_Coeff, /** dst color */ 47d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kIDC_Coeff, /** inverse dst color (i.e. 1 - dc) */ 48d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kSA_Coeff, /** src alpha */ 49d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kISA_Coeff, /** inverse src alpha (i.e. 1 - sa) */ 50d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kDA_Coeff, /** dst alpha */ 51d252db03d9650013b545ef9781fe993c07f8f314reed@android.com kIDA_Coeff, /** inverse dst alpha (i.e. 1 - da) */ 521447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kCoeffCount 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 551447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 56d252db03d9650013b545ef9781fe993c07f8f314reed@android.com /** If the xfermode can be expressed as an equation using the coefficients 57d252db03d9650013b545ef9781fe993c07f8f314reed@android.com in Coeff, then asCoeff() returns true, and sets (if not null) src and 58d252db03d9650013b545ef9781fe993c07f8f314reed@android.com dst accordingly. 591447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 60d252db03d9650013b545ef9781fe993c07f8f314reed@android.com result = src_coeff * src_color + dst_coeff * dst_color; 611447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 62d252db03d9650013b545ef9781fe993c07f8f314reed@android.com As examples, here are some of the porterduff coefficients 631447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 64d252db03d9650013b545ef9781fe993c07f8f314reed@android.com MODE SRC_COEFF DST_COEFF 65d252db03d9650013b545ef9781fe993c07f8f314reed@android.com clear zero zero 66d252db03d9650013b545ef9781fe993c07f8f314reed@android.com src one zero 67d252db03d9650013b545ef9781fe993c07f8f314reed@android.com dst zero one 68d252db03d9650013b545ef9781fe993c07f8f314reed@android.com srcover one isa 69d252db03d9650013b545ef9781fe993c07f8f314reed@android.com dstover ida one 70d252db03d9650013b545ef9781fe993c07f8f314reed@android.com */ 7130da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com virtual bool asCoeff(Coeff* src, Coeff* dst) const; 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 7343c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com /** 7443c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * The same as calling xfermode->asCoeff(..), except that this also checks 7543c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * if the xfermode is NULL, and if so, treats its as kSrcOver_Mode. 7643c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com */ 7730da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool AsCoeff(const SkXfermode*, Coeff* src, Coeff* dst); 781447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 79a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** List of predefined xfermodes. 80a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com The algebra for the modes uses the following symbols: 81a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com Sa, Sc - source alpha and color 82a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com Da, Dc - destination alpha and color (before compositing) 83a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com [a, c] - Resulting (alpha, color) values 84a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com For these equations, the colors are in premultiplied state. 85a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com If no xfermode is specified, kSrcOver is assumed. 86a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 87a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com enum Mode { 88a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kClear_Mode, //!< [0, 0] 89a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrc_Mode, //!< [Sa, Sc] 90a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDst_Mode, //!< [Da, Dc] 91a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc] 92a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc] 93a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcIn_Mode, //!< [Sa * Da, Sc * Da] 94a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstIn_Mode, //!< [Sa * Da, Sa * Dc] 95a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] 96a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] 97a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] 98a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] 99a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kXor_Mode, //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] 100a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 101f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com // all remaining modes are defined in the SVG Compositing standard 102a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com // http://www.w3.org/TR/2009/WD-SVGCompositing-20090430/ 103a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kPlus_Mode, 104fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com kMultiply_Mode, 105fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 106f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com // all above modes can be expressed as pair of src/dst Coeffs 107fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com kCoeffModesCnt, 108fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 109f2d91557b2c353429e40aa0f87c523119002f41bbsalomon@google.com kScreen_Mode = kCoeffModesCnt, 110a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kOverlay_Mode, 111a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDarken_Mode, 112a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kLighten_Mode, 113a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kColorDodge_Mode, 114a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kColorBurn_Mode, 115a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kHardLight_Mode, 116a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kSoftLight_Mode, 117a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kDifference_Mode, 118a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kExclusion_Mode, 119a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 120a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kLastMode = kExclusion_Mode 121a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com }; 122a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 123c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com /** 124c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com * If the xfermode is one of the modes in the Mode enum, then asMode() 125c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com * returns true and sets (if not null) mode accordingly. Otherwise it 126c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com * returns false and ignores the mode parameter. 12748543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org */ 12830da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com virtual bool asMode(Mode* mode) const; 12948543277728fdf66b993f17421f65fba532a23a2vandebo@chromium.org 13043c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com /** 13143c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * The same as calling xfermode->asMode(mode), except that this also checks 13243c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * if the xfermode is NULL, and if so, treats its as kSrcOver_Mode. 13343c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com */ 13430da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool AsMode(const SkXfermode*, Mode* mode); 13543c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com 136e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org /** 137e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * Returns true if the xfermode claims to be the specified Mode. This works 138e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * correctly even if the xfermode is NULL (which equates to kSrcOver.) Thus 139e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * you can say this without checking for a null... 140e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * 141e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * If (SkXfermode::IsMode(paint.getXfermode(), 142e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * SkXfermode::kDstOver_Mode)) { 143e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * ... 144e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org * } 145e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org */ 14630da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool IsMode(const SkXfermode* xfer, Mode mode); 147e303fcf68d6fee2bf9ee0c4f6fb330a2c3e41a01mike@reedtribe.org 148a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** Return an SkXfermode object for the specified mode. 149a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 150a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com static SkXfermode* Create(Mode mode); 151a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 152a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** Return a function pointer to a routine that applies the specified 153a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com porter-duff transfer mode. 154a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 155a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com static SkXfermodeProc GetProc(Mode mode); 156a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 157a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com /** Return a function pointer to a routine that applies the specified 158a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com porter-duff transfer mode and srcColor to a 16bit device color. Note, 159a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com if the mode+srcColor might return a non-opaque color, then there is not 160a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 16bit proc, and this will return NULL. 161a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 162a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com static SkXfermodeProc16 GetProc16(Mode mode, SkColor srcColor); 1631447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 164c0d4aa2088a0788f9df221497945d2ba1b342f44reed@google.com /** 16543c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * If the specified mode can be represented by a pair of Coeff, then return 16643c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * true and set (if not NULL) the corresponding coeffs. If the mode is 16743c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * not representable as a pair of Coeffs, return false and ignore the 16843c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com * src and dst parameters. 169a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com */ 17043c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com static bool ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst); 171a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com 17243c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com // DEPRECATED: call AsMode(...) 17330da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com static bool IsMode(const SkXfermode* xfer, Mode* mode) { 17443c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com return AsMode(xfer, mode); 17543c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com } 1761447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 177a2ca41e3afdd8fad5e0e924dec029f33918e0a67djsollen@google.com SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkXfermode(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {} 1801447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /** The default implementation of xfer32/xfer16/xferA8 in turn call this 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com method, 1 color at a time (upscaled to a SkPMColor). The default 1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com implmentation of this method just returns dst. If performance is 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com important, your subclass should override xfer32/xfer16/xferA8 directly. 1851447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com This method will not be called directly by the client, so it need not 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com be implemented if your subclass has overridden xfer32/xfer16/xferA8 1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 18930da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst) const; 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 192a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com enum { 193a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com kModeCount = kLastMode + 1 194a0f5d1546d499ef0cd7dbfba9a866ae5a27e1541reed@android.com }; 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkFlattenable INHERITED; 1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkProcXfermode 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkProcXfermode is a xfermode that applies the specified proc to its colors. 2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com This class is not exported to java. 2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkProcXfermode : public SkXfermode { 2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkProcXfermode(SkXfermodeProc proc) : fProc(proc) {} 2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // overrides from SkXfermode 2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, 21130da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const SK_OVERRIDE; 2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count, 21330da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const SK_OVERRIDE; 2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xfer4444(uint16_t dst[], const SkPMColor src[], int count, 21530da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const SK_OVERRIDE; 2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count, 21730da745bbf67a0ee0f305ca7bbdb685cc8a9e686reed@google.com const SkAlpha aa[]) const SK_OVERRIDE; 2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 219ba28d03e94dc221d6a803bf2a84a420b9159255cdjsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcXfermode) 2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkProcXfermode(SkFlattenableReadBuffer&); 22354924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 225c34d7cfca1892babc0c3b8811da1201ef466bd03reed@google.com // allow subclasses to update this after we unflatten 226c34d7cfca1892babc0c3b8811da1201ef466bd03reed@google.com void setProc(SkXfermodeProc proc) { 227c34d7cfca1892babc0c3b8811da1201ef466bd03reed@google.com fProc = proc; 228c34d7cfca1892babc0c3b8811da1201ef466bd03reed@google.com } 229c34d7cfca1892babc0c3b8811da1201ef466bd03reed@google.com 2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkXfermodeProc fProc; 2321447c6f7f4579942b32af6ffff1eadede40b42bctomhudson@google.com 2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkXfermode INHERITED; 2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 237