/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrSingleTextureEffect_DEFINED #define GrSingleTextureEffect_DEFINED #include "GrFragmentProcessor.h" #include "GrColorSpaceXform.h" #include "GrCoordTransform.h" #include "GrInvariantOutput.h" #include "SkMatrix.h" class GrTexture; /** * A base class for effects that draw a single texture with a texture matrix. This effect has no * backend implementations. One must be provided by the subclass. */ class GrSingleTextureEffect : public GrFragmentProcessor { public: ~GrSingleTextureEffect() override; SkString dumpInfo() const override { SkString str; str.appendf("Texture: %d", fTextureSampler.texture()->uniqueID().asUInt()); return str; } GrColorSpaceXform* colorSpaceXform() const { return fColorSpaceXform.get(); } protected: /** unfiltered, clamp mode */ GrSingleTextureEffect(GrTexture*, sk_sp, const SkMatrix&); /** clamp mode */ GrSingleTextureEffect(GrTexture*, sk_sp, const SkMatrix&, GrSamplerParams::FilterMode filterMode); GrSingleTextureEffect(GrTexture*, sk_sp, const SkMatrix&, const GrSamplerParams&); /** * Can be used as a helper to implement subclass onComputeInvariantOutput(). It assumes that * the subclass output color will be a modulation of the input color with a value read from the * texture. */ void updateInvariantOutputForModulation(GrInvariantOutput* inout) const { GrPixelConfig config = this->textureSampler(0).texture()->config(); if (GrPixelConfigIsAlphaOnly(config)) { inout->mulByUnknownSingleComponent(); } else if (GrPixelConfigIsOpaque(config)) { inout->mulByUnknownOpaqueFourComponents(); } else { inout->mulByUnknownFourComponents(); } } private: GrCoordTransform fCoordTransform; TextureSampler fTextureSampler; sk_sp fColorSpaceXform; typedef GrFragmentProcessor INHERITED; }; #endif