180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef GrSingleTextureEffect_DEFINED 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define GrSingleTextureEffect_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "GrEffect.h" 12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkMatrix.h" 130a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "GrCoordTransform.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerclass GrTexture; 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 18e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * A base class for effects that draw a single texture with a texture matrix. This effect has no 19e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger * backend implementations. One must be provided by the subclass. 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrSingleTextureEffect : public GrEffect { 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~GrSingleTextureEffect(); 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 25d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerprotected: 26e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger /** unfiltered, clamp mode */ 270a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrCoordSet = kLocal_GrCoordSet); 28e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger /** clamp mode */ 29e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrTextureParams::FilterMode filterMode, 300a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrCoordSet = kLocal_GrCoordSet); 31e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger GrSingleTextureEffect(GrTexture*, 32e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger const SkMatrix&, 33e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger const GrTextureParams&, 340a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrCoordSet = kLocal_GrCoordSet); 35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 36d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger /** 37d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * Helper for subclass onIsEqual() functions. 38d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger */ 390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool hasSameTextureParamsMatrixAndSourceCoords(const GrSingleTextureEffect& other) const { 40d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger // We don't have to check the accesses' swizzles because they are inferred from the texture. 410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger return fTextureAccess == other.fTextureAccess && 420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fCoordTransform.getMatrix().cheapEqualTo(other.fCoordTransform.getMatrix()) && 430a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger fCoordTransform.sourceCoords() == other.fCoordTransform.sourceCoords(); 44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 46d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger /** 47d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * Can be used as a helper to implement subclass getConstantColorComponents(). It assumes that 48d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * the subclass output color will be a modulation of the input color with a value read from the 49d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * texture. 50d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger */ 51d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger void updateConstantColorComponentsForModulation(GrColor* color, uint32_t* validFlags) const { 527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color) && 53d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger GrPixelConfigIsOpaque(this->texture(0)->config())) { 547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *validFlags = kA_GrColorComponentFlag; 55d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } else { 56d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger *validFlags = 0; 57d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 610a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrCoordTransform fCoordTransform; 620a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrTextureAccess fTextureAccess; 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger typedef GrEffect INHERITED; 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 68