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
14class GrGLDistanceFieldTextureEffect;
15class GrGLDistanceFieldLCDTextureEffect;
16
17enum 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 */
41class GrDistanceFieldTextureEffect : public GrGeometryProcessor {
42public:
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
73private:
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 */
101class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
102public:
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
123private:
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
143