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