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