180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef GrPaint_DEFINED 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define GrPaint_DEFINED 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrColor.h" 14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "GrEffectStage.h" 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkXfermode.h" 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * The paint describes how color and coverage are computed at each pixel by GrContext draw 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * functions and the how color is blended with the destination pixel. 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * The paint allows installation of custom color and coverage stages. New types of stages are 23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * created by subclassing GrEffect. 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * The primitive color computation starts with the color specified by setColor(). This color is the 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * input to the first color stage. Each color stage feeds its output to the next color stage. The 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * final color stage's output color is input to the color filter specified by 28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * setXfermodeColorFilter which produces the final source color, S. 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Fractional pixel coverage follows a similar flow. The coverage is initially the value specified 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * by setCoverage(). This is input to the first coverage stage. Coverage stages are chained 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * together in the same manner as color stages. The output of the last stage is modulated by any 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * fractional coverage produced by anti-aliasing. This last step produces the final coverage, C. 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * setBlendFunc() specifies blending coefficients for S (described above) and D, the initial value 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * of the destination pixel, labeled Bs and Bd respectively. The final value of the destination 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * pixel is then D' = (1-C)*D + C*(Bd*D + Bs*S). 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Note that the coverage is applied after the blend. This is why they are computed as distinct 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * values. 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * TODO: Encapsulate setXfermodeColorFilter in a GrEffect and remove from GrPaint. 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrPaint { 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrPaint() { this->reset(); } 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrPaint(const GrPaint& paint) { *this = paint; } 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ~GrPaint() {} 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Sets the blending coefficients to use to blend the final primitive color with the 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * destination color. Defaults to kOne for src and kZero for dst (i.e. src mode). 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setBlendFunc(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) { 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fSrcBlendCoeff = srcCoeff; 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fDstBlendCoeff = dstCoeff; 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrBlendCoeff getSrcBlendCoeff() const { return fSrcBlendCoeff; } 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrBlendCoeff getDstBlendCoeff() const { return fDstBlendCoeff; } 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * The initial color of the drawn primitive. Defaults to solid white. 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setColor(GrColor color) { fColor = color; } 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrColor getColor() const { return fColor; } 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Applies fractional coverage to the entire drawn primitive. Defaults to 0xff. 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setCoverage(uint8_t coverage) { fCoverage = coverage; } 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru uint8_t getCoverage() const { return fCoverage; } 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Should primitives be anti-aliased or not. Defaults to false. 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setAntiAlias(bool aa) { fAntiAlias = aa; } 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool isAntiAlias() const { return fAntiAlias; } 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Should dithering be applied. Defaults to false. 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setDither(bool dither) { fDither = dither; } 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool isDither() const { return fDither; } 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Appends an additional color effect to the color computation. 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger const GrEffectRef* addColorEffect(const GrEffectRef* effect, int attr0 = -1, int attr1 = -1) { 910a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(NULL != effect); 920a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger if (!(*effect)->willUseInputColor()) { 930a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fColorStages.reset(); 940a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger } 9558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkNEW_APPEND_TO_TARRAY(&fColorStages, GrEffectStage, (effect, attr0, attr1)); 9658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return effect; 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 10058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Appends an additional coverage effect to the coverage computation. 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 10258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger const GrEffectRef* addCoverageEffect(const GrEffectRef* effect, int attr0 = -1, int attr1 = -1) { 1030a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(NULL != effect); 1040a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger if (!(*effect)->willUseInputColor()) { 1050a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fCoverageStages.reset(); 1060a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger } 10758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrEffectStage, (effect, attr0, attr1)); 10858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return effect; 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger /** 11258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * Helpers for adding color or coverage effects that sample a texture. The matrix is applied 11358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * to the src space position to compute texture coordinates. 11458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 11558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger void addColorTextureEffect(GrTexture* texture, const SkMatrix& matrix); 11658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger void addCoverageTextureEffect(GrTexture* texture, const SkMatrix& matrix); 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger void addColorTextureEffect(GrTexture* texture, 11958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger const SkMatrix& matrix, 12058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger const GrTextureParams& params); 12158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger void addCoverageTextureEffect(GrTexture* texture, 12258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger const SkMatrix& matrix, 12358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger const GrTextureParams& params); 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger int numColorStages() const { return fColorStages.count(); } 12658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger int numCoverageStages() const { return fCoverageStages.count(); } 12758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger int numTotalStages() const { return this->numColorStages() + this->numCoverageStages(); } 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger const GrEffectStage& getColorStage(int s) const { return fColorStages[s]; } 13058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger const GrEffectStage& getCoverageStage(int s) const { return fCoverageStages[s]; } 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrPaint& operator=(const GrPaint& paint) { 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fSrcBlendCoeff = paint.fSrcBlendCoeff; 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fDstBlendCoeff = paint.fDstBlendCoeff; 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAntiAlias = paint.fAntiAlias; 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fDither = paint.fDither; 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fColor = paint.fColor; 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fCoverage = paint.fCoverage; 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fColorStages = paint.fColorStages; 14258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fCoverageStages = paint.fCoverageStages; 14358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return *this; 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Resets the paint to the defaults. 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void reset() { 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->resetBlend(); 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->resetOptions(); 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->resetColor(); 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->resetCoverage(); 155363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger this->resetStages(); 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger /** 1590a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * Determines whether the drawing with this paint is opaque with respect to both color blending 1600a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * and fractional coverage. It does not consider whether AA has been enabled on the paint or 1610a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * not. Depending upon whether multisampling or coverage-based AA is in use, AA may make the 1620a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * result only apply to the interior of primitives. 1630a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * 1640a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger */ 1650a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool isOpaque() const; 1660a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 1670a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger /** 1680a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * Returns true if isOpaque would return true and the paint represents a solid constant color 1690a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * draw. If the result is true, constantColor will be updated to contain the constant color. 1700a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger */ 1710a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool isOpaqueAndConstantColor(GrColor* constantColor) const; 1720a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 1740a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 1750a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger /** 1760a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * Helper for isOpaque and isOpaqueAndConstantColor. 1770a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger */ 1780a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool getOpaqueAndKnownColor(GrColor* solidColor, uint32_t* solidColorKnownComponents) const; 1790a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 180e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger /** 181e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * Called when the source coord system from which geometry is rendered changes. It ensures that 182e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * the local coordinates seen by effects remains unchanged. oldToNew gives the transformation 183e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * from the previous coord system to the new coord system. 184e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger */ 185e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger void localCoordChange(const SkMatrix& oldToNew) { 18658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger for (int i = 0; i < fColorStages.count(); ++i) { 18758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fColorStages[i].localCoordChange(oldToNew); 188e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger } 18958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger for (int i = 0; i < fCoverageStages.count(); ++i) { 19058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fCoverageStages[i].localCoordChange(oldToNew); 191e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger } 192e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger } 193e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger 194e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger bool localCoordChangeInverse(const SkMatrix& newToOld) { 195e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger SkMatrix oldToNew; 196e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger bool computed = false; 19758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger for (int i = 0; i < fColorStages.count(); ++i) { 19858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (!computed && !newToOld.invert(&oldToNew)) { 19958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return false; 20058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } else { 20158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger computed = true; 202e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger } 20358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fColorStages[i].localCoordChange(oldToNew); 204e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger } 20558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger for (int i = 0; i < fCoverageStages.count(); ++i) { 20658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (!computed && !newToOld.invert(&oldToNew)) { 20758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return false; 20858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } else { 20958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger computed = true; 210e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger } 21158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fCoverageStages[i].localCoordChange(oldToNew); 212e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger } 213e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger return true; 214e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger } 215e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger 216e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger friend class GrContext; // To access above two functions 21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkSTArray<4, GrEffectStage> fColorStages; 21958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkSTArray<2, GrEffectStage> fCoverageStages; 22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrBlendCoeff fSrcBlendCoeff; 22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrBlendCoeff fDstBlendCoeff; 22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool fAntiAlias; 22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool fDither; 22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrColor fColor; 22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru uint8_t fCoverage; 22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void resetBlend() { 23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fSrcBlendCoeff = kOne_GrBlendCoeff; 23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fDstBlendCoeff = kZero_GrBlendCoeff; 23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void resetOptions() { 23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAntiAlias = false; 23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fDither = false; 23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void resetColor() { 24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fColor = GrColorPackRGBA(0xff, 0xff, 0xff, 0xff); 24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void resetCoverage() { 24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fCoverage = 0xff; 24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 247363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger void resetStages() { 24858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fColorStages.reset(); 24958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fCoverageStages.reset(); 25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 254