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 GrDistanceFieldGeoProc_DEFINED
      9 #define GrDistanceFieldGeoProc_DEFINED
     10 
     11 #include "GrProcessor.h"
     12 #include "GrGeometryProcessor.h"
     13 
     14 class GrGLDistanceFieldA8TextGeoProc;
     15 class GrGLDistanceFieldPathGeoProc;
     16 class GrGLDistanceFieldLCDTextGeoProc;
     17 class GrInvariantOutput;
     18 
     19 enum GrDistanceFieldEffectFlags {
     20     kSimilarity_DistanceFieldEffectFlag   = 0x01, // ctm is similarity matrix
     21     kScaleOnly_DistanceFieldEffectFlag    = 0x02, // ctm has only scale and translate
     22     kUseLCD_DistanceFieldEffectFlag       = 0x04, // use lcd text
     23     kBGR_DistanceFieldEffectFlag          = 0x08, // lcd display has bgr order
     24     kPortrait_DistanceFieldEffectFlag     = 0x10, // lcd display is in portrait mode (not used yet)
     25     kGammaCorrect_DistanceFieldEffectFlag = 0x20, // assume gamma-correct output (linear blending)
     26 
     27     kInvalid_DistanceFieldEffectFlag    = 0x80,   // invalid state (for initialization)
     28 
     29     kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
     30                                             kScaleOnly_DistanceFieldEffectFlag,
     31     // The subset of the flags relevant to GrDistanceFieldA8TextGeoProc
     32     kNonLCD_DistanceFieldEffectMask       = kSimilarity_DistanceFieldEffectFlag |
     33                                             kScaleOnly_DistanceFieldEffectFlag |
     34                                             kGammaCorrect_DistanceFieldEffectFlag,
     35     // The subset of the flags relevant to GrDistanceFieldLCDTextGeoProc
     36     kLCD_DistanceFieldEffectMask          = kSimilarity_DistanceFieldEffectFlag |
     37                                             kScaleOnly_DistanceFieldEffectFlag |
     38                                             kUseLCD_DistanceFieldEffectFlag |
     39                                             kBGR_DistanceFieldEffectFlag |
     40                                             kGammaCorrect_DistanceFieldEffectFlag,
     41 };
     42 
     43 /**
     44  * The output color of this effect is a modulation of the input color and a sample from a
     45  * distance field texture (using a smoothed step function near 0.5).
     46  * It allows explicit specification of the filtering and wrap modes (GrSamplerParams). The input
     47  * coords are a custom attribute. Gamma correction is handled via a texture LUT.
     48  */
     49 class GrDistanceFieldA8TextGeoProc : public GrGeometryProcessor {
     50 public:
     51 #ifdef SK_GAMMA_APPLY_TO_A8
     52     static sk_sp<GrGeometryProcessor> Make(GrResourceProvider* resourceProvider,
     53                                            GrColor color, const SkMatrix& viewMatrix,
     54                                            sk_sp<GrTextureProxy> proxy,
     55                                            const GrSamplerParams& params,
     56                                            float lum, uint32_t flags, bool usesLocalCoords) {
     57         return sk_sp<GrGeometryProcessor>(
     58             new GrDistanceFieldA8TextGeoProc(resourceProvider, color, viewMatrix, std::move(proxy),
     59                                              params, lum, flags, usesLocalCoords));
     60     }
     61 #else
     62     static sk_sp<GrGeometryProcessor> Make(GrResourceProvider* resourceProvider,
     63                                            GrColor color, const SkMatrix& viewMatrix,
     64                                            sk_sp<GrTextureProxy> proxy,
     65                                            const GrSamplerParams& params,
     66                                            uint32_t flags, bool usesLocalCoords) {
     67         return sk_sp<GrGeometryProcessor>(
     68             new GrDistanceFieldA8TextGeoProc(resourceProvider, color, viewMatrix, std::move(proxy),
     69                                              params, flags, usesLocalCoords));
     70     }
     71 #endif
     72 
     73     ~GrDistanceFieldA8TextGeoProc() override {}
     74 
     75     const char* name() const override { return "DistanceFieldA8Text"; }
     76 
     77     const Attribute* inPosition() const { return fInPosition; }
     78     const Attribute* inColor() const { return fInColor; }
     79     const Attribute* inTextureCoords() const { return fInTextureCoords; }
     80     GrColor color() const { return fColor; }
     81     const SkMatrix& viewMatrix() const { return fViewMatrix; }
     82     bool usesLocalCoords() const { return fUsesLocalCoords; }
     83 #ifdef SK_GAMMA_APPLY_TO_A8
     84     float getDistanceAdjust() const { return fDistanceAdjust; }
     85 #endif
     86     uint32_t getFlags() const { return fFlags; }
     87 
     88     void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
     89 
     90     GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
     91 
     92 private:
     93     GrDistanceFieldA8TextGeoProc(GrResourceProvider*, GrColor, const SkMatrix& viewMatrix,
     94                                  sk_sp<GrTextureProxy> proxy, const GrSamplerParams& params,
     95 #ifdef SK_GAMMA_APPLY_TO_A8
     96                                  float distanceAdjust,
     97 #endif
     98                                  uint32_t flags, bool usesLocalCoords);
     99 
    100     GrColor          fColor;
    101     SkMatrix         fViewMatrix;
    102     TextureSampler   fTextureSampler;
    103 #ifdef SK_GAMMA_APPLY_TO_A8
    104     float            fDistanceAdjust;
    105 #endif
    106     uint32_t         fFlags;
    107     const Attribute* fInPosition;
    108     const Attribute* fInColor;
    109     const Attribute* fInTextureCoords;
    110     bool             fUsesLocalCoords;
    111 
    112     GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
    113 
    114     typedef GrGeometryProcessor INHERITED;
    115 };
    116 
    117 
    118 /**
    119 * The output color of this effect is a modulation of the input color and a sample from a
    120 * distance field texture (using a smoothed step function near 0.5).
    121 * It allows explicit specification of the filtering and wrap modes (GrSamplerParams). The input
    122 * coords are a custom attribute. No gamma correct blending is applied. Used for paths only.
    123 */
    124 class GrDistanceFieldPathGeoProc : public GrGeometryProcessor {
    125 public:
    126     static sk_sp<GrGeometryProcessor> Make(GrResourceProvider* resourceProvider, GrColor color,
    127                                            const SkMatrix& viewMatrix, sk_sp<GrTextureProxy> proxy,
    128                                            const GrSamplerParams& params,
    129                                            uint32_t flags, bool usesLocalCoords) {
    130         return sk_sp<GrGeometryProcessor>(
    131             new GrDistanceFieldPathGeoProc(resourceProvider, color, viewMatrix, std::move(proxy),
    132                                            params, flags, usesLocalCoords));
    133     }
    134 
    135     ~GrDistanceFieldPathGeoProc() override {}
    136 
    137     const char* name() const override { return "DistanceFieldPath"; }
    138 
    139     const Attribute* inPosition() const { return fInPosition; }
    140     const Attribute* inColor() const { return fInColor; }
    141     const Attribute* inTextureCoords() const { return fInTextureCoords; }
    142     GrColor color() const { return fColor; }
    143     const SkMatrix& viewMatrix() const { return fViewMatrix; }
    144     uint32_t getFlags() const { return fFlags; }
    145     bool usesLocalCoords() const { return fUsesLocalCoords; }
    146 
    147     void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
    148 
    149     GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
    150 
    151 private:
    152     GrDistanceFieldPathGeoProc(GrResourceProvider*, GrColor, const SkMatrix& viewMatrix,
    153                                sk_sp<GrTextureProxy>, const GrSamplerParams&, uint32_t flags,
    154                                bool usesLocalCoords);
    155 
    156     GrColor          fColor;
    157     SkMatrix         fViewMatrix;
    158     TextureSampler   fTextureSampler;
    159     uint32_t         fFlags;
    160     const Attribute* fInPosition;
    161     const Attribute* fInColor;
    162     const Attribute* fInTextureCoords;
    163     bool             fUsesLocalCoords;
    164 
    165     GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
    166 
    167     typedef GrGeometryProcessor INHERITED;
    168 };
    169 
    170 /**
    171  * The output color of this effect is a modulation of the input color and samples from a
    172  * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
    173  * It allows explicit specification of the filtering and wrap modes (GrSamplerParams). The input
    174  * coords are a custom attribute. Gamma correction is handled via a texture LUT.
    175  */
    176 class GrDistanceFieldLCDTextGeoProc : public GrGeometryProcessor {
    177 public:
    178     struct DistanceAdjust {
    179         SkScalar fR, fG, fB;
    180         static DistanceAdjust Make(SkScalar r, SkScalar g, SkScalar b) {
    181             DistanceAdjust result;
    182             result.fR = r; result.fG = g; result.fB = b;
    183             return result;
    184         }
    185         bool operator==(const DistanceAdjust& wa) const {
    186             return (fR == wa.fR && fG == wa.fG && fB == wa.fB);
    187         }
    188         bool operator!=(const DistanceAdjust& wa) const {
    189             return !(*this == wa);
    190         }
    191     };
    192 
    193     static sk_sp<GrGeometryProcessor> Make(GrResourceProvider* resourceProvider, GrColor color,
    194                                            const SkMatrix& viewMatrix,
    195                                            sk_sp<GrTextureProxy> proxy,
    196                                            const GrSamplerParams& params,
    197                                            DistanceAdjust distanceAdjust, uint32_t flags,
    198                                            bool usesLocalCoords) {
    199         return sk_sp<GrGeometryProcessor>(
    200             new GrDistanceFieldLCDTextGeoProc(resourceProvider, color, viewMatrix, std::move(proxy),
    201                                               params, distanceAdjust,
    202                                               flags, usesLocalCoords));
    203     }
    204 
    205     ~GrDistanceFieldLCDTextGeoProc() override {}
    206 
    207     const char* name() const override { return "DistanceFieldLCDText"; }
    208 
    209     const Attribute* inPosition() const { return fInPosition; }
    210     const Attribute* inColor() const { return fInColor; }
    211     const Attribute* inTextureCoords() const { return fInTextureCoords; }
    212     DistanceAdjust getDistanceAdjust() const { return fDistanceAdjust; }
    213     GrColor color() const { return fColor; }
    214     const SkMatrix& viewMatrix() const { return fViewMatrix; }
    215     uint32_t getFlags() const { return fFlags; }
    216     bool usesLocalCoords() const { return fUsesLocalCoords; }
    217 
    218     void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
    219 
    220     GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
    221 
    222 private:
    223     GrDistanceFieldLCDTextGeoProc(GrResourceProvider*, GrColor, const SkMatrix& viewMatrix,
    224                                   sk_sp<GrTextureProxy> proxy, const GrSamplerParams& params,
    225                                   DistanceAdjust wa, uint32_t flags,
    226                                   bool usesLocalCoords);
    227 
    228     GrColor          fColor;
    229     SkMatrix         fViewMatrix;
    230     TextureSampler   fTextureSampler;
    231     DistanceAdjust   fDistanceAdjust;
    232     uint32_t         fFlags;
    233     const Attribute* fInPosition;
    234     const Attribute* fInColor;
    235     const Attribute* fInTextureCoords;
    236     bool             fUsesLocalCoords;
    237 
    238     GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
    239 
    240     typedef GrGeometryProcessor INHERITED;
    241 };
    242 
    243 #endif
    244