• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     kAliased_DistanceFieldEffectFlag      = 0x40, // monochrome output
27 
28     kInvalid_DistanceFieldEffectFlag    = 0x80,   // invalid state (for initialization)
29 
30     kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
31                                             kScaleOnly_DistanceFieldEffectFlag,
32     // The subset of the flags relevant to GrDistanceFieldA8TextGeoProc
33     kNonLCD_DistanceFieldEffectMask       = kSimilarity_DistanceFieldEffectFlag |
34                                             kScaleOnly_DistanceFieldEffectFlag |
35                                             kGammaCorrect_DistanceFieldEffectFlag |
36                                             kAliased_DistanceFieldEffectFlag,
37     // The subset of the flags relevant to GrDistanceFieldLCDTextGeoProc
38     kLCD_DistanceFieldEffectMask          = kSimilarity_DistanceFieldEffectFlag |
39                                             kScaleOnly_DistanceFieldEffectFlag |
40                                             kUseLCD_DistanceFieldEffectFlag |
41                                             kBGR_DistanceFieldEffectFlag |
42                                             kGammaCorrect_DistanceFieldEffectFlag,
43 };
44 
45 /**
46  * The output color of this effect is a modulation of the input color and a sample from a
47  * distance field texture (using a smoothed step function near 0.5).
48  * It allows explicit specification of the filtering and wrap modes (GrSamplerParams). The input
49  * coords are a custom attribute. Gamma correction is handled via a texture LUT.
50  */
51 class GrDistanceFieldA8TextGeoProc : public GrGeometryProcessor {
52 public:
53 #ifdef SK_GAMMA_APPLY_TO_A8
Make(GrColor color,const SkMatrix & viewMatrix,sk_sp<GrTextureProxy> proxy,const GrSamplerParams & params,float lum,uint32_t flags,bool usesLocalCoords)54     static sk_sp<GrGeometryProcessor> Make(GrColor color, const SkMatrix& viewMatrix,
55                                            sk_sp<GrTextureProxy> proxy,
56                                            const GrSamplerParams& params,
57                                            float lum, uint32_t flags, bool usesLocalCoords) {
58         return sk_sp<GrGeometryProcessor>(
59             new GrDistanceFieldA8TextGeoProc(color, viewMatrix, std::move(proxy),
60                                              params, lum, flags, usesLocalCoords));
61     }
62 #else
63     static sk_sp<GrGeometryProcessor> Make(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(color, viewMatrix, std::move(proxy),
69                                              params, flags, usesLocalCoords));
70     }
71 #endif
72 
~GrDistanceFieldA8TextGeoProc()73     ~GrDistanceFieldA8TextGeoProc() override {}
74 
name()75     const char* name() const override { return "DistanceFieldA8Text"; }
76 
inPosition()77     const Attribute* inPosition() const { return fInPosition; }
inColor()78     const Attribute* inColor() const { return fInColor; }
inTextureCoords()79     const Attribute* inTextureCoords() const { return fInTextureCoords; }
color()80     GrColor color() const { return fColor; }
viewMatrix()81     const SkMatrix& viewMatrix() const { return fViewMatrix; }
usesLocalCoords()82     bool usesLocalCoords() const { return fUsesLocalCoords; }
83 #ifdef SK_GAMMA_APPLY_TO_A8
getDistanceAdjust()84     float getDistanceAdjust() const { return fDistanceAdjust; }
85 #endif
getFlags()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(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:
Make(GrColor color,const SkMatrix & viewMatrix,sk_sp<GrTextureProxy> proxy,const GrSamplerParams & params,uint32_t flags,bool usesLocalCoords)126     static sk_sp<GrGeometryProcessor> Make(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(color, viewMatrix, std::move(proxy),
132                                            params, flags, usesLocalCoords));
133     }
134 
~GrDistanceFieldPathGeoProc()135     ~GrDistanceFieldPathGeoProc() override {}
136 
name()137     const char* name() const override { return "DistanceFieldPath"; }
138 
inPosition()139     const Attribute* inPosition() const { return fInPosition; }
inColor()140     const Attribute* inColor() const { return fInColor; }
inTextureCoords()141     const Attribute* inTextureCoords() const { return fInTextureCoords; }
color()142     GrColor color() const { return fColor; }
viewMatrix()143     const SkMatrix& viewMatrix() const { return fViewMatrix; }
getFlags()144     uint32_t getFlags() const { return fFlags; }
usesLocalCoords()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(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;
MakeDistanceAdjust180         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 
Make(GrColor color,const SkMatrix & viewMatrix,sk_sp<GrTextureProxy> proxy,const GrSamplerParams & params,DistanceAdjust distanceAdjust,uint32_t flags,bool usesLocalCoords)193     static sk_sp<GrGeometryProcessor> Make(GrColor color,
194                                            const SkMatrix& viewMatrix,
195                                            sk_sp<GrTextureProxy> proxy,
196                                            const GrSamplerParams& params,
197                                            DistanceAdjust distanceAdjust,
198                                            uint32_t flags,
199                                            bool usesLocalCoords) {
200         return sk_sp<GrGeometryProcessor>(
201             new GrDistanceFieldLCDTextGeoProc(color, viewMatrix, std::move(proxy),
202                                               params, distanceAdjust,
203                                               flags, usesLocalCoords));
204     }
205 
~GrDistanceFieldLCDTextGeoProc()206     ~GrDistanceFieldLCDTextGeoProc() override {}
207 
name()208     const char* name() const override { return "DistanceFieldLCDText"; }
209 
inPosition()210     const Attribute* inPosition() const { return fInPosition; }
inColor()211     const Attribute* inColor() const { return fInColor; }
inTextureCoords()212     const Attribute* inTextureCoords() const { return fInTextureCoords; }
getDistanceAdjust()213     DistanceAdjust getDistanceAdjust() const { return fDistanceAdjust; }
color()214     GrColor color() const { return fColor; }
viewMatrix()215     const SkMatrix& viewMatrix() const { return fViewMatrix; }
getFlags()216     uint32_t getFlags() const { return fFlags; }
usesLocalCoords()217     bool usesLocalCoords() const { return fUsesLocalCoords; }
218 
219     void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
220 
221     GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
222 
223 private:
224     GrDistanceFieldLCDTextGeoProc(GrColor, const SkMatrix& viewMatrix,
225                                   sk_sp<GrTextureProxy> proxy, const GrSamplerParams& params,
226                                   DistanceAdjust wa, uint32_t flags,
227                                   bool usesLocalCoords);
228 
229     GrColor          fColor;
230     SkMatrix         fViewMatrix;
231     TextureSampler   fTextureSampler;
232     DistanceAdjust   fDistanceAdjust;
233     uint32_t         fFlags;
234     const Attribute* fInPosition;
235     const Attribute* fInColor;
236     const Attribute* fInTextureCoords;
237     bool             fUsesLocalCoords;
238 
239     GR_DECLARE_GEOMETRY_PROCESSOR_TEST
240 
241     typedef GrGeometryProcessor INHERITED;
242 };
243 
244 #endif
245