Home | History | Annotate | Download | only in effects
      1 /*
      2  * Copyright 2012 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef GrSingleTextureEffect_DEFINED
      9 #define GrSingleTextureEffect_DEFINED
     10 
     11 #include "GrProcessor.h"
     12 #include "SkMatrix.h"
     13 #include "GrCoordTransform.h"
     14 
     15 class GrTexture;
     16 
     17 /**
     18  * A base class for effects that draw a single texture with a texture matrix. This effect has no
     19  * backend implementations. One must be provided by the subclass.
     20  */
     21 class GrSingleTextureEffect : public GrFragmentProcessor {
     22 public:
     23     virtual ~GrSingleTextureEffect();
     24 
     25 protected:
     26     /** unfiltered, clamp mode */
     27     GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrCoordSet = kLocal_GrCoordSet);
     28     /** clamp mode */
     29     GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrTextureParams::FilterMode filterMode,
     30                           GrCoordSet = kLocal_GrCoordSet);
     31     GrSingleTextureEffect(GrTexture*,
     32                           const SkMatrix&,
     33                           const GrTextureParams&,
     34                           GrCoordSet = kLocal_GrCoordSet);
     35 
     36     /**
     37      * Helper for subclass onIsEqual() functions.
     38      */
     39     bool hasSameTextureParamsMatrixAndSourceCoords(const GrSingleTextureEffect& other) const {
     40         // We don't have to check the accesses' swizzles because they are inferred from the texture.
     41         return fTextureAccess == other.fTextureAccess &&
     42                fCoordTransform.getMatrix().cheapEqualTo(other.fCoordTransform.getMatrix()) &&
     43                fCoordTransform.sourceCoords() == other.fCoordTransform.sourceCoords();
     44     }
     45 
     46     /**
     47      * Can be used as a helper to implement subclass getConstantColorComponents(). It assumes that
     48      * the subclass output color will be a modulation of the input color with a value read from the
     49      * texture.
     50      */
     51     void updateConstantColorComponentsForModulation(GrColor* color, uint32_t* validFlags) const {
     52         if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color) &&
     53             GrPixelConfigIsOpaque(this->texture(0)->config())) {
     54             *validFlags = kA_GrColorComponentFlag;
     55         } else {
     56             *validFlags = 0;
     57         }
     58     }
     59 
     60 private:
     61     GrCoordTransform fCoordTransform;
     62     GrTextureAccess  fTextureAccess;
     63 
     64     typedef GrFragmentProcessor INHERITED;
     65 };
     66 
     67 #endif
     68