Upstream version 10.39.225.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 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