2 * Copyright 2013 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #ifndef GrDistanceFieldTextureEffect_DEFINED
9 #define GrDistanceFieldTextureEffect_DEFINED
11 #include "GrProcessor.h"
12 #include "GrGeometryProcessor.h"
14 class GrGLDistanceFieldTextureEffect;
15 class GrGLDistanceFieldNoGammaTextureEffect;
16 class GrGLDistanceFieldLCDTextureEffect;
18 enum GrDistanceFieldEffectFlags {
19 kSimilarity_DistanceFieldEffectFlag = 0x01, // ctm is similarity matrix
20 kRectToRect_DistanceFieldEffectFlag = 0x02, // ctm maps rects to rects
21 kUseLCD_DistanceFieldEffectFlag = 0x04, // use lcd text
22 kBGR_DistanceFieldEffectFlag = 0x08, // lcd display has bgr order
23 kPortrait_DistanceFieldEffectFlag = 0x10, // lcd display is in portrait mode (not used yet)
25 kInvalid_DistanceFieldEffectFlag = 0x80, // invalid state (for initialization)
27 kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
28 kRectToRect_DistanceFieldEffectFlag,
29 // The subset of the flags relevant to GrDistanceFieldTextureEffect
30 kNonLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag,
31 // The subset of the flags relevant to GrDistanceFieldLCDTextureEffect
32 kLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
33 kRectToRect_DistanceFieldEffectFlag |
34 kUseLCD_DistanceFieldEffectFlag |
35 kBGR_DistanceFieldEffectFlag,
39 * The output color of this effect is a modulation of the input color and a sample from a
40 * distance field texture (using a smoothed step function near 0.5).
41 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
42 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
44 class GrDistanceFieldTextureEffect : public GrGeometryProcessor {
46 #ifdef SK_GAMMA_APPLY_TO_A8
47 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
48 GrTexture* gamma, const GrTextureParams& gammaParams,
49 float lum, uint32_t flags) {
50 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, gamma, gammaParams, lum,
54 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
56 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, flags));
60 virtual ~GrDistanceFieldTextureEffect() {}
62 static const char* Name() { return "DistanceFieldTexture"; }
64 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
65 #ifdef SK_GAMMA_APPLY_TO_A8
66 float getLuminance() const { return fLuminance; }
68 uint32_t getFlags() const { return fFlags; }
70 typedef GrGLDistanceFieldTextureEffect GLProcessor;
72 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
75 GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
76 #ifdef SK_GAMMA_APPLY_TO_A8
77 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
81 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
83 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
85 GrTextureAccess fTextureAccess;
86 #ifdef SK_GAMMA_APPLY_TO_A8
87 GrTextureAccess fGammaTextureAccess;
91 const GrShaderVar& fInTextureCoords;
93 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
95 typedef GrGeometryProcessor INHERITED;
100 * The output color of this effect is a modulation of the input color and a sample from a
101 * distance field texture (using a smoothed step function near 0.5).
102 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
103 * coords are a custom attribute. No gamma correct blending is applied.
105 class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
107 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
109 return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (tex, params, flags));
112 virtual ~GrDistanceFieldNoGammaTextureEffect() {}
114 static const char* Name() { return "DistanceFieldTexture"; }
116 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
117 uint32_t getFlags() const { return fFlags; }
119 typedef GrGLDistanceFieldNoGammaTextureEffect GLProcessor;
121 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
124 GrDistanceFieldNoGammaTextureEffect(GrTexture* texture, const GrTextureParams& params,
127 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
129 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
131 GrTextureAccess fTextureAccess;
133 const GrShaderVar& fInTextureCoords;
135 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
137 typedef GrGeometryProcessor INHERITED;
141 * The output color of this effect is a modulation of the input color and samples from a
142 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
143 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
144 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
146 class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
148 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
149 GrTexture* gamma, const GrTextureParams& gammaParams,
150 SkColor textColor, uint32_t flags) {
151 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
152 (tex, params, gamma, gammaParams, textColor, flags));
155 virtual ~GrDistanceFieldLCDTextureEffect() {}
157 static const char* Name() { return "DistanceFieldLCDTexture"; }
159 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
160 GrColor getTextColor() const { return fTextColor; }
161 uint32_t getFlags() const { return fFlags; }
163 typedef GrGLDistanceFieldLCDTextureEffect GLProcessor;
165 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
168 GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
169 GrTexture* gamma, const GrTextureParams& gammaParams,
173 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
175 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
177 GrTextureAccess fTextureAccess;
178 GrTextureAccess fGammaTextureAccess;
181 const GrShaderVar& fInTextureCoords;
183 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
185 typedef GrGeometryProcessor INHERITED;