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 GrGLDistanceFieldLCDTextureEffect;
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)
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,
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.
41 class GrDistanceFieldTextureEffect : public GrGeometryProcessor {
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,
51 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
53 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, flags));
57 virtual ~GrDistanceFieldTextureEffect() {}
59 static const char* Name() { return "DistanceFieldTexture"; }
61 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
63 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
64 #ifdef SK_GAMMA_APPLY_TO_A8
65 float getLuminance() const { return fLuminance; }
67 uint32_t getFlags() const { return fFlags; }
69 typedef GrGLDistanceFieldTextureEffect GLProcessor;
71 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
74 GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
75 #ifdef SK_GAMMA_APPLY_TO_A8
76 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
80 virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE;
82 GrTextureAccess fTextureAccess;
83 #ifdef SK_GAMMA_APPLY_TO_A8
84 GrTextureAccess fGammaTextureAccess;
88 const GrShaderVar& fInTextureCoords;
90 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
92 typedef GrFragmentProcessor INHERITED;
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.
101 class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
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));
110 virtual ~GrDistanceFieldLCDTextureEffect() {}
112 static const char* Name() { return "DistanceFieldLCDTexture"; }
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; }
119 typedef GrGLDistanceFieldLCDTextureEffect GLProcessor;
121 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
124 GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
125 GrTexture* gamma, const GrTextureParams& gammaParams,
129 virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE;
131 GrTextureAccess fTextureAccess;
132 GrTextureAccess fGammaTextureAccess;
135 const GrShaderVar& fInTextureCoords;
137 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
139 typedef GrFragmentProcessor INHERITED;