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