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 "GrFragmentProcessor.h"
     12 #include "GrCoordTransform.h"
     13 #include "GrInvariantOutput.h"
     14 #include "SkMatrix.h"
     15 
     16 class GrTexture;
     17 
     18 /**
     19  * A base class for effects that draw a single texture with a texture matrix. This effect has no
     20  * backend implementations. One must be provided by the subclass.
     21  */
     22 class GrSingleTextureEffect : public GrFragmentProcessor {
     23 public:
     24     ~GrSingleTextureEffect() override;
     25 
     26     SkString dumpInfo() const override {
     27         SkString str;
     28         str.appendf("Texture: %d", fTextureAccess.getTexture()->getUniqueID());
     29         return str;
     30     }
     31 
     32 protected:
     33     /** unfiltered, clamp mode */
     34     GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrCoordSet = kLocal_GrCoordSet);
     35     /** clamp mode */
     36     GrSingleTextureEffect(GrTexture*, const SkMatrix&, GrTextureParams::FilterMode filterMode,
     37                           GrCoordSet = kLocal_GrCoordSet);
     38     GrSingleTextureEffect(GrTexture*,
     39                           const SkMatrix&,
     40                           const GrTextureParams&,
     41                           GrCoordSet = kLocal_GrCoordSet);
     42 
     43     /**
     44      * Can be used as a helper to implement subclass onComputeInvariantOutput(). It assumes that
     45      * the subclass output color will be a modulation of the input color with a value read from the
     46      * texture.
     47      */
     48     void updateInvariantOutputForModulation(GrInvariantOutput* inout) const {
     49         if (GrPixelConfigIsAlphaOnly(this->texture(0)->config())) {
     50             inout->mulByUnknownSingleComponent();
     51         } else if (GrPixelConfigIsOpaque(this->texture(0)->config())) {
     52             inout->mulByUnknownOpaqueFourComponents();
     53         } else {
     54             inout->mulByUnknownFourComponents();
     55         }
     56     }
     57 
     58 private:
     59     GrCoordTransform fCoordTransform;
     60     GrTextureAccess  fTextureAccess;
     61 
     62     typedef GrFragmentProcessor INHERITED;
     63 };
     64 
     65 #endif
     66