15bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com 2f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com/* 35bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Copyright 2006 The Android Open Source Project 4f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com * 55bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * Use of this source code is governed by a BSD-style license that can be 65bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com * found in the LICENSE file. 7f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com */ 8f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 95bb6825f10d64834ad1d1d967f590aebae285360epoger@google.com 10f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#ifndef SkXfermode_DEFINED 11f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#define SkXfermode_DEFINED 12f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 13f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#include "SkFlattenable.h" 14f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#include "SkColor.h" 15f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 168bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.comclass GrEffectRef; 17c96186de18e0a7714079dcef811114d22c7e056csenorblanco@chromium.orgclass GrTexture; 18157df59c19760346cd2301d4623a541a63f5ec13robertphillips@google.comclass SkString; 19157df59c19760346cd2301d4623a541a63f5ec13robertphillips@google.com 20f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com/** \class SkXfermode 219b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com * 229b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com * SkXfermode is the base class for objects that are called to implement custom 239b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com * "transfer-modes" in the drawing pipeline. The static function Create(Modes) 249b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com * can be called to return an instance of any of the predefined subclasses as 259b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com * specified in the Modes enum. When an SkXfermode is assigned to an SkPaint, 269b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com * then objects drawn with that paint have the xfermode applied. 279b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com * 289b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com * All subclasses are required to be reentrant-safe : it must be legal to share 299b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com * the same instance between several threads. 309b5d5911a0d048f3380cdd839c9df808f6fe9789reed@google.com */ 312083387d719b933797044ad07efd3bb67f99a5c5ctguil@chromium.orgclass SK_API SkXfermode : public SkFlattenable { 32f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.compublic: 334f0673f27c2dbb98a7cfebb87d1a5cf3ab5924derobertphillips@google.com SK_DECLARE_INST_COUNT(SkXfermode) 344f0673f27c2dbb98a7cfebb87d1a5cf3ab5924derobertphillips@google.com 35f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com SkXfermode() {} 36f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 37f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, 38b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com const SkAlpha aa[]) const; 39f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count, 40b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com const SkAlpha aa[]) const; 41f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count, 42b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com const SkAlpha aa[]) const; 43718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 44d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com /** Enum of possible coefficients to describe some xfermodes 45d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com */ 46f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com enum Coeff { 47d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com kZero_Coeff, /** 0 */ 48d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com kOne_Coeff, /** 1 */ 49d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com kSC_Coeff, /** src color */ 50d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com kISC_Coeff, /** inverse src color (i.e. 1 - sc) */ 51d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com kDC_Coeff, /** dst color */ 52d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com kIDC_Coeff, /** inverse dst color (i.e. 1 - dc) */ 53d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com kSA_Coeff, /** src alpha */ 54d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com kISA_Coeff, /** inverse src alpha (i.e. 1 - sa) */ 55d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com kDA_Coeff, /** dst alpha */ 56d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com kIDA_Coeff, /** inverse dst alpha (i.e. 1 - da) */ 57718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 58f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com kCoeffCount 59f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com }; 60718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 61d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com /** If the xfermode can be expressed as an equation using the coefficients 62d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com in Coeff, then asCoeff() returns true, and sets (if not null) src and 63d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com dst accordingly. 64718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 65d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com result = src_coeff * src_color + dst_coeff * dst_color; 66718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 67d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com As examples, here are some of the porterduff coefficients 68718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 69d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com MODE SRC_COEFF DST_COEFF 70d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com clear zero zero 71d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com src one zero 72d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com dst zero one 73d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com srcover one isa 74d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com dstover ida one 75d6f792a6e07471995cafe046bf226af7d65dc3d5reed@android.com */ 76b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com virtual bool asCoeff(Coeff* src, Coeff* dst) const; 77f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 7814bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com /** 7914bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com * The same as calling xfermode->asCoeff(..), except that this also checks 808bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com * if the xfermode is NULL, and if so, treats it as kSrcOver_Mode. 8114bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com */ 82b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com static bool AsCoeff(const SkXfermode*, Coeff* src, Coeff* dst); 83718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 84802256ce934549e12ead45ea28f00f15784c45bbreed@android.com /** List of predefined xfermodes. 85802256ce934549e12ead45ea28f00f15784c45bbreed@android.com The algebra for the modes uses the following symbols: 86802256ce934549e12ead45ea28f00f15784c45bbreed@android.com Sa, Sc - source alpha and color 87802256ce934549e12ead45ea28f00f15784c45bbreed@android.com Da, Dc - destination alpha and color (before compositing) 88802256ce934549e12ead45ea28f00f15784c45bbreed@android.com [a, c] - Resulting (alpha, color) values 89802256ce934549e12ead45ea28f00f15784c45bbreed@android.com For these equations, the colors are in premultiplied state. 90802256ce934549e12ead45ea28f00f15784c45bbreed@android.com If no xfermode is specified, kSrcOver is assumed. 911d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com The modes are ordered by those that can be expressed as a pair of Coeffs, followed by those 921d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com that aren't Coeffs but have separable r,g,b computations, and finally 931d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com those that are not separable. 94802256ce934549e12ead45ea28f00f15784c45bbreed@android.com */ 95802256ce934549e12ead45ea28f00f15784c45bbreed@android.com enum Mode { 96802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kClear_Mode, //!< [0, 0] 97802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kSrc_Mode, //!< [Sa, Sc] 98802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kDst_Mode, //!< [Da, Dc] 99802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc] 100802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kDstOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc] 101802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kSrcIn_Mode, //!< [Sa * Da, Sc * Da] 102802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kDstIn_Mode, //!< [Sa * Da, Sa * Dc] 103802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] 104802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] 105802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] 106802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] 107802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kXor_Mode, //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] 108d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org kPlus_Mode, //!< [Sa + Da, Sc + Dc] 1099d94a06c9b2e291c720f27f920554be39d7e08careed@google.com kModulate_Mode, // multiplies all components (= alpha and color) 1101fde19f3b72345b473a1a9bd64729237a388813frmistry@google.com 1115efd372d4459416a9f33318bd60f41a8a6b9c5cfskia.committer@gmail.com // Following blend modes are defined in the CSS Compositing standard: 112d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org // https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blending 113140ba0d3509b8eda54f8a25c7d01be6a3e00a541bsalomon@google.com kScreen_Mode, 1141d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com kLastCoeffMode = kScreen_Mode, 1151d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com 1161d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com kOverlay_Mode, 117802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kDarken_Mode, 118802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kLighten_Mode, 119802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kColorDodge_Mode, 120802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kColorBurn_Mode, 121802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kHardLight_Mode, 122802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kSoftLight_Mode, 123802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kDifference_Mode, 124802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kExclusion_Mode, 125cc109174848be71c2fcfa2f3f9f8bbe81a15276creed@google.com kMultiply_Mode, 1261d56fda1b1f358e488f6e43f74f10d7aa1e4d9e1bsalomon@google.com kLastSeparableMode = kMultiply_Mode, 127802256ce934549e12ead45ea28f00f15784c45bbreed@android.com 128d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org kHue_Mode, 129d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org kSaturation_Mode, 130d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org kColor_Mode, 131d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org kLuminosity_Mode, 132d89a4946030401199c6cbbebfd522ccadea9656bcommit-bot@chromium.org kLastMode = kLuminosity_Mode 133802256ce934549e12ead45ea28f00f15784c45bbreed@android.com }; 134117e2610daa4ac90cfaf9e973bfa59dca238c7afskia.committer@gmail.com 13547d7275abb0b94655bc59f0a31e5b82694c27fd7commit-bot@chromium.org /** 13647d7275abb0b94655bc59f0a31e5b82694c27fd7commit-bot@chromium.org * Gets the name of the Mode as a string. 13747d7275abb0b94655bc59f0a31e5b82694c27fd7commit-bot@chromium.org */ 13847d7275abb0b94655bc59f0a31e5b82694c27fd7commit-bot@chromium.org static const char* ModeName(Mode); 139802256ce934549e12ead45ea28f00f15784c45bbreed@android.com 1404922e5674b2a45a06355dcdd50512aa49acbbcbfreed@google.com /** 1414922e5674b2a45a06355dcdd50512aa49acbbcbfreed@google.com * If the xfermode is one of the modes in the Mode enum, then asMode() 1424922e5674b2a45a06355dcdd50512aa49acbbcbfreed@google.com * returns true and sets (if not null) mode accordingly. Otherwise it 1434922e5674b2a45a06355dcdd50512aa49acbbcbfreed@google.com * returns false and ignores the mode parameter. 1446ed4aff9594bacd7036ebbb3f19054abc54cf6abvandebo@chromium.org */ 145b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com virtual bool asMode(Mode* mode) const; 1466ed4aff9594bacd7036ebbb3f19054abc54cf6abvandebo@chromium.org 14714bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com /** 14814bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com * The same as calling xfermode->asMode(mode), except that this also checks 1498bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com * if the xfermode is NULL, and if so, treats it as kSrcOver_Mode. 15014bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com */ 151b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com static bool AsMode(const SkXfermode*, Mode* mode); 15214bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com 153d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org /** 154d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org * Returns true if the xfermode claims to be the specified Mode. This works 155d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org * correctly even if the xfermode is NULL (which equates to kSrcOver.) Thus 156d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org * you can say this without checking for a null... 157d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org * 158d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org * If (SkXfermode::IsMode(paint.getXfermode(), 159d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org * SkXfermode::kDstOver_Mode)) { 160d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org * ... 161d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org * } 162d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org */ 163b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com static bool IsMode(const SkXfermode* xfer, Mode mode); 164d947cabf4deb039d922b92028af80a01f8351a84mike@reedtribe.org 165802256ce934549e12ead45ea28f00f15784c45bbreed@android.com /** Return an SkXfermode object for the specified mode. 166802256ce934549e12ead45ea28f00f15784c45bbreed@android.com */ 167802256ce934549e12ead45ea28f00f15784c45bbreed@android.com static SkXfermode* Create(Mode mode); 168802256ce934549e12ead45ea28f00f15784c45bbreed@android.com 169802256ce934549e12ead45ea28f00f15784c45bbreed@android.com /** Return a function pointer to a routine that applies the specified 170802256ce934549e12ead45ea28f00f15784c45bbreed@android.com porter-duff transfer mode. 171802256ce934549e12ead45ea28f00f15784c45bbreed@android.com */ 172802256ce934549e12ead45ea28f00f15784c45bbreed@android.com static SkXfermodeProc GetProc(Mode mode); 173802256ce934549e12ead45ea28f00f15784c45bbreed@android.com 174802256ce934549e12ead45ea28f00f15784c45bbreed@android.com /** Return a function pointer to a routine that applies the specified 175802256ce934549e12ead45ea28f00f15784c45bbreed@android.com porter-duff transfer mode and srcColor to a 16bit device color. Note, 176802256ce934549e12ead45ea28f00f15784c45bbreed@android.com if the mode+srcColor might return a non-opaque color, then there is not 177802256ce934549e12ead45ea28f00f15784c45bbreed@android.com 16bit proc, and this will return NULL. 178802256ce934549e12ead45ea28f00f15784c45bbreed@android.com */ 179802256ce934549e12ead45ea28f00f15784c45bbreed@android.com static SkXfermodeProc16 GetProc16(Mode mode, SkColor srcColor); 180718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 1814922e5674b2a45a06355dcdd50512aa49acbbcbfreed@google.com /** 18214bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com * If the specified mode can be represented by a pair of Coeff, then return 18314bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com * true and set (if not NULL) the corresponding coeffs. If the mode is 18414bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com * not representable as a pair of Coeffs, return false and ignore the 18514bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com * src and dst parameters. 186802256ce934549e12ead45ea28f00f15784c45bbreed@android.com */ 18714bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com static bool ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst); 188802256ce934549e12ead45ea28f00f15784c45bbreed@android.com 18983f9f7e836c0cf22241d9a9cb80deafb526993e0reed@google.com SK_ATTR_DEPRECATED("use AsMode(...)") 190b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com static bool IsMode(const SkXfermode* xfer, Mode* mode) { 19114bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com return AsMode(xfer, mode); 19214bb452a725bc26e24d101ce127b21de6e1ee209reed@google.com } 193718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 1948bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com /** A subclass may implement this factory function to work with the GPU backend. It is legal 195e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org to call this with all params NULL to simply test the return value. If effect is non-NULL 196e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org then the xfermode may optionally allocate an effect to return and the caller as *effect. 197e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org The caller will install it and own a ref to it. Since the xfermode may or may not assign 198e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org *effect, the caller should set *effect to NULL beforehand. background specifies the 199e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org texture to use as the background for compositing, and should be accessed in the effect's 200e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org fragment shader. If NULL, the effect should request access to destination color 201e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org (setWillReadDstColor()), and use that in the fragment shader (builder->dstColor()). 2028bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com */ 203e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org virtual bool asNewEffect(GrEffectRef** effect, GrTexture* background = NULL) const; 2048bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com 205e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org /** Returns true if the xfermode can be expressed as coeffs (src, dst), or as an effect 206e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org (effect). This helper calls the asCoeff() and asNewEffect() virtuals. If the xfermode is 207e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org NULL, it is treated as kSrcOver_Mode. It is legal to call this with all params NULL to 208e742ef9400de0321f43c92f2e46d684c0789999csenorblanco@chromium.org simply test the return value. effect, src, and dst must all be NULL or all non-NULL. 2098bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com */ 210d9ac5ced77d4e34bec616bfa033762cfd6768df2bsalomon@google.com static bool AsNewEffectOrCoeff(SkXfermode*, 211d9ac5ced77d4e34bec616bfa033762cfd6768df2bsalomon@google.com GrEffectRef** effect, 212d9ac5ced77d4e34bec616bfa033762cfd6768df2bsalomon@google.com Coeff* src, 213c96186de18e0a7714079dcef811114d22c7e056csenorblanco@chromium.org Coeff* dst, 214c96186de18e0a7714079dcef811114d22c7e056csenorblanco@chromium.org GrTexture* background = NULL); 2158bcaf1761975e8001c28b60ac138c2d0ce5af8acbsalomon@google.com 216157df59c19760346cd2301d4623a541a63f5ec13robertphillips@google.com SkDEVCODE(virtual void toString(SkString* str) const = 0;) 2179b9da23a5235e15f735e0838b6ca7c62345169e3djsollen@google.com SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() 2184035169372231efab50ead6ca20b4f4156146373commit-bot@chromium.org SK_DEFINE_FLATTENABLE_TYPE(SkXfermode) 2194035169372231efab50ead6ca20b4f4156146373commit-bot@chromium.org 220f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comprotected: 221f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com SkXfermode(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {} 222718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 223f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com /** The default implementation of xfer32/xfer16/xferA8 in turn call this 224f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com method, 1 color at a time (upscaled to a SkPMColor). The default 225f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com implmentation of this method just returns dst. If performance is 226f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com important, your subclass should override xfer32/xfer16/xferA8 directly. 227718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 228f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com This method will not be called directly by the client, so it need not 229f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com be implemented if your subclass has overridden xfer32/xfer16/xferA8 230f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com */ 231b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com virtual SkPMColor xferColor(SkPMColor src, SkPMColor dst) const; 232f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 233f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comprivate: 234802256ce934549e12ead45ea28f00f15784c45bbreed@android.com enum { 235802256ce934549e12ead45ea28f00f15784c45bbreed@android.com kModeCount = kLastMode + 1 236802256ce934549e12ead45ea28f00f15784c45bbreed@android.com }; 2379c0dc41ca51ae17c54b14a804c6089cf5b0240c7commit-bot@chromium.org 2389c0dc41ca51ae17c54b14a804c6089cf5b0240c7commit-bot@chromium.org friend class SkGraphics; 2399c0dc41ca51ae17c54b14a804c6089cf5b0240c7commit-bot@chromium.org static void Term(); 2409c0dc41ca51ae17c54b14a804c6089cf5b0240c7commit-bot@chromium.org 241f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com typedef SkFlattenable INHERITED; 242f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com}; 243f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 244f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com/////////////////////////////////////////////////////////////////////////////// 245f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 246f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com/** \class SkProcXfermode 247f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 248f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com SkProcXfermode is a xfermode that applies the specified proc to its colors. 249f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com This class is not exported to java. 250f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com*/ 251f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comclass SkProcXfermode : public SkXfermode { 252f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.compublic: 253f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com SkProcXfermode(SkXfermodeProc proc) : fProc(proc) {} 254f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 255f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com // overrides from SkXfermode 256f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com virtual void xfer32(SkPMColor dst[], const SkPMColor src[], int count, 257b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com const SkAlpha aa[]) const SK_OVERRIDE; 258f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com virtual void xfer16(uint16_t dst[], const SkPMColor src[], int count, 259b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com const SkAlpha aa[]) const SK_OVERRIDE; 260f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com virtual void xferA8(SkAlpha dst[], const SkPMColor src[], int count, 261b5d69cc87f52bfc0b39e36e717e5bb898d8ad8dcreed@google.com const SkAlpha aa[]) const SK_OVERRIDE; 262f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 263157df59c19760346cd2301d4623a541a63f5ec13robertphillips@google.com SK_DEVELOPER_TO_STRING() 26414f592f823cedde633bf7d468c3a14b02ee56674djsollen@google.com SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcXfermode) 265f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 266f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comprotected: 267f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com SkProcXfermode(SkFlattenableReadBuffer&); 268e133d6ad314603114c7ef80423391f65cbb599d7djsollen@google.com virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 269f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 270f7d014f9f8e26c75ca398d98cbd580afdd5ca15dreed@google.com // allow subclasses to update this after we unflatten 271f7d014f9f8e26c75ca398d98cbd580afdd5ca15dreed@google.com void setProc(SkXfermodeProc proc) { 272f7d014f9f8e26c75ca398d98cbd580afdd5ca15dreed@google.com fProc = proc; 273f7d014f9f8e26c75ca398d98cbd580afdd5ca15dreed@google.com } 274f7d014f9f8e26c75ca398d98cbd580afdd5ca15dreed@google.com 27597a3f754ead7c227355ff7183f87c971803a3194commit-bot@chromium.org SkXfermodeProc getProc() const { 27697a3f754ead7c227355ff7183f87c971803a3194commit-bot@chromium.org return fProc; 27797a3f754ead7c227355ff7183f87c971803a3194commit-bot@chromium.org } 27897a3f754ead7c227355ff7183f87c971803a3194commit-bot@chromium.org 279f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.comprivate: 280f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com SkXfermodeProc fProc; 281718c2c29e99f7c9b6177847dd353298284dba964tomhudson@google.com 282f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com typedef SkXfermode INHERITED; 283f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com}; 284f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com 285f0d6bf5df07d5ce620678074da0c05aacc28e44reed@android.com#endif 286