Home | History | Annotate | Download | only in effects
      1 /*
      2  * Copyright 2013 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 GrDistanceFieldTextureEffect_DEFINED
      9 #define GrDistanceFieldTextureEffect_DEFINED
     10 
     11 #include "GrProcessor.h"
     12 #include "GrGeometryProcessor.h"
     13 
     14 class GrGLDistanceFieldTextureEffect;
     15 class GrGLDistanceFieldLCDTextureEffect;
     16 
     17 enum GrDistanceFieldEffectFlags {
     18     kSimilarity_DistanceFieldEffectFlag = 0x01,   // ctm is similarity matrix
     19     kRectToRect_DistanceFieldEffectFlag = 0x02,   // ctm maps rects to rects
     20     kUseLCD_DistanceFieldEffectFlag     = 0x04,   // use lcd text
     21     kBGR_DistanceFieldEffectFlag        = 0x08,   // lcd display has bgr order
     22     kPortrait_DistanceFieldEffectFlag   = 0x10,   // lcd display is in portrait mode (not used yet)
     23 
     24     kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
     25                                             kRectToRect_DistanceFieldEffectFlag,
     26     // The subset of the flags relevant to GrDistanceFieldTextureEffect
     27     kNonLCD_DistanceFieldEffectMask       = kSimilarity_DistanceFieldEffectFlag,
     28     // The subset of the flags relevant to GrDistanceFieldLCDTextureEffect
     29     kLCD_DistanceFieldEffectMask          = kSimilarity_DistanceFieldEffectFlag |
     30                                             kRectToRect_DistanceFieldEffectFlag |
     31                                             kUseLCD_DistanceFieldEffectFlag |
     32                                             kBGR_DistanceFieldEffectFlag,
     33 };
     34 
     35 /**
     36  * The output color of this effect is a modulation of the input color and a sample from a
     37  * distance field texture (using a smoothed step function near 0.5).
     38  * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
     39  * coords are a custom attribute. Gamma correction is handled via a texture LUT.
     40  */
     41 class GrDistanceFieldTextureEffect : public GrGeometryProcessor {
     42 public:
     43 #ifdef SK_GAMMA_APPLY_TO_A8
     44     static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
     45                                        GrTexture* gamma, const GrTextureParams& gammaParams,
     46                                        float lum, uint32_t flags) {
     47        return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, gamma, gammaParams, lum,
     48                                                         flags));
     49     }
     50 #else
     51     static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
     52                                        uint32_t flags) {
     53         return  SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, flags));
     54     }
     55 #endif
     56 
     57     virtual ~GrDistanceFieldTextureEffect() {}
     58 
     59     static const char* Name() { return "DistanceFieldTexture"; }
     60 
     61     virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
     62 
     63     const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
     64 #ifdef SK_GAMMA_APPLY_TO_A8
     65     float getLuminance() const { return fLuminance; }
     66 #endif
     67     uint32_t getFlags() const { return fFlags; }
     68 
     69     typedef GrGLDistanceFieldTextureEffect GLProcessor;
     70 
     71     virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
     72 
     73 private:
     74     GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
     75 #ifdef SK_GAMMA_APPLY_TO_A8
     76                                  GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
     77 #endif
     78                                  uint32_t flags);
     79 
     80     virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE;
     81 
     82     GrTextureAccess    fTextureAccess;
     83 #ifdef SK_GAMMA_APPLY_TO_A8
     84     GrTextureAccess    fGammaTextureAccess;
     85     float              fLuminance;
     86 #endif
     87     uint32_t           fFlags;
     88     const GrShaderVar& fInTextureCoords;
     89 
     90     GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
     91 
     92     typedef GrFragmentProcessor INHERITED;
     93 };
     94 
     95 /**
     96  * The output color of this effect is a modulation of the input color and samples from a
     97  * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
     98  * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
     99  * coords are a custom attribute. Gamma correction is handled via a texture LUT.
    100  */
    101 class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
    102 public:
    103     static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
    104                                        GrTexture* gamma, const GrTextureParams& gammaParams,
    105                                        SkColor textColor, uint32_t flags) {
    106         return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
    107                           (tex, params, gamma, gammaParams, textColor, flags));
    108     }
    109 
    110     virtual ~GrDistanceFieldLCDTextureEffect() {}
    111 
    112     static const char* Name() { return "DistanceFieldLCDTexture"; }
    113 
    114     const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
    115     virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
    116     GrColor getTextColor() const { return fTextColor; }
    117     uint32_t getFlags() const { return fFlags; }
    118 
    119     typedef GrGLDistanceFieldLCDTextureEffect GLProcessor;
    120 
    121     virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
    122 
    123 private:
    124     GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
    125                                     GrTexture* gamma, const GrTextureParams& gammaParams,
    126                                     SkColor textColor,
    127                                     uint32_t flags);
    128 
    129     virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE;
    130 
    131     GrTextureAccess    fTextureAccess;
    132     GrTextureAccess    fGammaTextureAccess;
    133     GrColor            fTextColor;
    134     uint32_t           fFlags;
    135     const GrShaderVar& fInTextureCoords;
    136 
    137     GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
    138 
    139     typedef GrFragmentProcessor INHERITED;
    140 };
    141 
    142 #endif
    143