Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / gpu / effects / GrDistanceFieldTextureEffect.h
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 GrGLDistanceFieldNoGammaTextureEffect;
16 class GrGLDistanceFieldLCDTextureEffect;
17
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)
24
25     kInvalid_DistanceFieldEffectFlag    = 0x80,   // invalid state (for initialization)
26     
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,
36 };
37
38 /**
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.
43  */
44 class GrDistanceFieldTextureEffect : public GrGeometryProcessor {
45 public:
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,
51                                                         flags));
52     }
53 #else
54     static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
55                                        uint32_t flags) {
56         return  SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, flags));
57     }
58 #endif
59
60     virtual ~GrDistanceFieldTextureEffect() {}
61
62     static const char* Name() { return "DistanceFieldTexture"; }
63
64     const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
65 #ifdef SK_GAMMA_APPLY_TO_A8
66     float getLuminance() const { return fLuminance; }
67 #endif
68     uint32_t getFlags() const { return fFlags; }
69
70     typedef GrGLDistanceFieldTextureEffect GLProcessor;
71
72     virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
73
74 private:
75     GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
76 #ifdef SK_GAMMA_APPLY_TO_A8
77                                  GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
78 #endif
79                                  uint32_t flags);
80
81     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
82
83     virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
84
85     GrTextureAccess    fTextureAccess;
86 #ifdef SK_GAMMA_APPLY_TO_A8
87     GrTextureAccess    fGammaTextureAccess;
88     float              fLuminance;
89 #endif
90     uint32_t           fFlags;
91     const GrShaderVar& fInTextureCoords;
92
93     GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
94
95     typedef GrGeometryProcessor INHERITED;
96 };
97
98
99 /**
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.
104 */
105 class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
106 public:
107     static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
108                                        uint32_t flags) {
109         return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (tex, params, flags));
110     }
111
112     virtual ~GrDistanceFieldNoGammaTextureEffect() {}
113
114     static const char* Name() { return "DistanceFieldTexture"; }
115
116     const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
117     uint32_t getFlags() const { return fFlags; }
118
119     typedef GrGLDistanceFieldNoGammaTextureEffect GLProcessor;
120
121     virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
122
123 private:
124     GrDistanceFieldNoGammaTextureEffect(GrTexture* texture, const GrTextureParams& params,
125                                         uint32_t flags);
126
127     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
128
129     virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
130
131     GrTextureAccess    fTextureAccess;
132     uint32_t           fFlags;
133     const GrShaderVar& fInTextureCoords;
134
135     GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
136
137     typedef GrGeometryProcessor INHERITED;
138 };
139
140 /**
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.
145  */
146 class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
147 public:
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));
153     }
154
155     virtual ~GrDistanceFieldLCDTextureEffect() {}
156
157     static const char* Name() { return "DistanceFieldLCDTexture"; }
158
159     const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
160     GrColor getTextColor() const { return fTextColor; }
161     uint32_t getFlags() const { return fFlags; }
162
163     typedef GrGLDistanceFieldLCDTextureEffect GLProcessor;
164
165     virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
166
167 private:
168     GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
169                                     GrTexture* gamma, const GrTextureParams& gammaParams,
170                                     SkColor textColor,
171                                     uint32_t flags);
172
173     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
174
175     virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
176
177     GrTextureAccess    fTextureAccess;
178     GrTextureAccess    fGammaTextureAccess;
179     GrColor            fTextColor;
180     uint32_t           fFlags;
181     const GrShaderVar& fInTextureCoords;
182
183     GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
184
185     typedef GrGeometryProcessor INHERITED;
186 };
187
188 #endif