Upstream version 9.38.198.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 "GrEffect.h"
12 #include "GrVertexEffect.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 GrVertexEffect {
42 public:
43 #ifdef SK_GAMMA_APPLY_TO_A8
44     static GrEffect* Create(GrTexture* tex, const GrTextureParams& params,
45                             GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
46                             uint32_t flags) {
47        return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, gamma, gammaParams, lum,
48                                                         flags));
49     }
50 #else
51     static GrEffect* 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 #ifdef SK_GAMMA_APPLY_TO_A8
63     float getLuminance() const { return fLuminance; }
64 #endif
65     uint32_t getFlags() const { return fFlags; }
66
67     typedef GrGLDistanceFieldTextureEffect GLEffect;
68
69     virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
70
71 private:
72     GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
73 #ifdef SK_GAMMA_APPLY_TO_A8
74                                  GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
75 #endif
76                                  uint32_t flags);
77
78     virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE;
79
80     GrTextureAccess fTextureAccess;
81 #ifdef SK_GAMMA_APPLY_TO_A8
82     GrTextureAccess fGammaTextureAccess;
83     float           fLuminance;
84 #endif
85     uint32_t        fFlags;
86
87     GR_DECLARE_EFFECT_TEST;
88
89     typedef GrVertexEffect INHERITED;
90 };
91
92 /**
93  * The output color of this effect is a modulation of the input color and samples from a
94  * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
95  * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
96  * coords are a custom attribute. Gamma correction is handled via a texture LUT.
97  */
98 class GrDistanceFieldLCDTextureEffect : public GrVertexEffect {
99 public:
100     static GrEffect* Create(GrTexture* tex, const GrTextureParams& params,
101                             GrTexture* gamma, const GrTextureParams& gammaParams, 
102                             SkColor textColor, uint32_t flags) {
103         return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
104                           (tex, params, gamma, gammaParams, textColor, flags));
105     }
106
107     virtual ~GrDistanceFieldLCDTextureEffect() {}
108
109     static const char* Name() { return "DistanceFieldLCDTexture"; }
110
111     virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
112     GrColor getTextColor() const { return fTextColor; }
113     uint32_t getFlags() const { return fFlags; }
114
115     typedef GrGLDistanceFieldLCDTextureEffect GLEffect;
116
117     virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
118
119 private:
120     GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
121                                     GrTexture* gamma, const GrTextureParams& gammaParams,
122                                     SkColor textColor,
123                                     uint32_t flags);
124
125     virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE;
126
127     GrTextureAccess fTextureAccess;
128     GrTextureAccess fGammaTextureAccess;
129     GrColor         fTextColor;
130     uint32_t        fFlags;
131
132     GR_DECLARE_EFFECT_TEST;
133
134     typedef GrVertexEffect INHERITED;
135 };
136
137 #endif