blob: c24673bd27be4cbbcebfc2825eab92f2b29bdbb7 [file] [log] [blame]
jvanverth@google.comd830d132013-11-11 20:54:09 +00001/*
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
joshualittb0a8a372014-09-23 09:50:21 -070011#include "GrProcessor.h"
joshualitt249af152014-09-15 11:41:13 -070012#include "GrGeometryProcessor.h"
jvanverth@google.comd830d132013-11-11 20:54:09 +000013
14class GrGLDistanceFieldTextureEffect;
jvanverthfa38a302014-10-06 05:59:05 -070015class GrGLDistanceFieldNoGammaTextureEffect;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +000016class GrGLDistanceFieldLCDTextureEffect;
jvanverth@google.comd830d132013-11-11 20:54:09 +000017
jvanverth78f07182014-07-30 06:17:59 -070018enum 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 kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
26 kRectToRect_DistanceFieldEffectFlag,
27 // The subset of the flags relevant to GrDistanceFieldTextureEffect
28 kNonLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag,
29 // The subset of the flags relevant to GrDistanceFieldLCDTextureEffect
30 kLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
31 kRectToRect_DistanceFieldEffectFlag |
32 kUseLCD_DistanceFieldEffectFlag |
33 kBGR_DistanceFieldEffectFlag,
34};
35
jvanverth@google.comd830d132013-11-11 20:54:09 +000036/**
skia.committer@gmail.com11a253b2013-11-12 07:02:05 +000037 * The output color of this effect is a modulation of the input color and a sample from a
jvanverth@google.comd830d132013-11-11 20:54:09 +000038 * distance field texture (using a smoothed step function near 0.5).
39 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -070040 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
jvanverth@google.comd830d132013-11-11 20:54:09 +000041 */
joshualitt249af152014-09-15 11:41:13 -070042class GrDistanceFieldTextureEffect : public GrGeometryProcessor {
jvanverth@google.comd830d132013-11-11 20:54:09 +000043public:
jvanverth2d2a68c2014-06-10 06:42:56 -070044#ifdef SK_GAMMA_APPLY_TO_A8
joshualittb0a8a372014-09-23 09:50:21 -070045 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
46 GrTexture* gamma, const GrTextureParams& gammaParams,
47 float lum, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -070048 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, gamma, gammaParams, lum,
jvanverth78f07182014-07-30 06:17:59 -070049 flags));
bsalomon55fad7a2014-07-08 07:34:20 -070050 }
jvanverth2d2a68c2014-06-10 06:42:56 -070051#else
joshualittb0a8a372014-09-23 09:50:21 -070052 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
53 uint32_t flags) {
jvanverth78f07182014-07-30 06:17:59 -070054 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, flags));
jvanverth@google.comd830d132013-11-11 20:54:09 +000055 }
bsalomon55fad7a2014-07-08 07:34:20 -070056#endif
jvanverth@google.comd830d132013-11-11 20:54:09 +000057
58 virtual ~GrDistanceFieldTextureEffect() {}
59
commit-bot@chromium.org6c89c342014-02-14 21:48:29 +000060 static const char* Name() { return "DistanceFieldTexture"; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000061
joshualitt249af152014-09-15 11:41:13 -070062 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -070063#ifdef SK_GAMMA_APPLY_TO_A8
64 float getLuminance() const { return fLuminance; }
65#endif
jvanverth78f07182014-07-30 06:17:59 -070066 uint32_t getFlags() const { return fFlags; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000067
joshualittb0a8a372014-09-23 09:50:21 -070068 typedef GrGLDistanceFieldTextureEffect GLProcessor;
jvanverth@google.comd830d132013-11-11 20:54:09 +000069
joshualittb0a8a372014-09-23 09:50:21 -070070 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000071
72private:
skia.committer@gmail.coma3b53272014-02-15 03:02:15 +000073 GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070074#ifdef SK_GAMMA_APPLY_TO_A8
75 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
76#endif
jvanverth78f07182014-07-30 06:17:59 -070077 uint32_t flags);
jvanverth@google.comd830d132013-11-11 20:54:09 +000078
bsalomon0e08fc12014-10-15 08:19:04 -070079 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000080
egdaniel1a8ecdf2014-10-03 06:24:12 -070081 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
82
joshualitt249af152014-09-15 11:41:13 -070083 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -070084#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt249af152014-09-15 11:41:13 -070085 GrTextureAccess fGammaTextureAccess;
86 float fLuminance;
jvanverth2d2a68c2014-06-10 06:42:56 -070087#endif
joshualitt249af152014-09-15 11:41:13 -070088 uint32_t fFlags;
89 const GrShaderVar& fInTextureCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +000090
joshualittb0a8a372014-09-23 09:50:21 -070091 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +000092
jvanverthfa38a302014-10-06 05:59:05 -070093 typedef GrGeometryProcessor INHERITED;
94};
95
96
97/**
98* The output color of this effect is a modulation of the input color and a sample from a
99* distance field texture (using a smoothed step function near 0.5).
100* It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
101* coords are a custom attribute. No gamma correct blending is applied.
102*/
103class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
104public:
105 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
106 uint32_t flags) {
107 return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (tex, params, flags));
108 }
109
110 virtual ~GrDistanceFieldNoGammaTextureEffect() {}
111
112 static const char* Name() { return "DistanceFieldTexture"; }
113
114 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
115 uint32_t getFlags() const { return fFlags; }
116
117 typedef GrGLDistanceFieldNoGammaTextureEffect GLProcessor;
118
119 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
120
121private:
122 GrDistanceFieldNoGammaTextureEffect(GrTexture* texture, const GrTextureParams& params,
123 uint32_t flags);
124
bsalomon0e08fc12014-10-15 08:19:04 -0700125 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700126
127 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
128
129 GrTextureAccess fTextureAccess;
130 uint32_t fFlags;
131 const GrShaderVar& fInTextureCoords;
132
133 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
134
135 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000136};
137
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000138/**
139 * The output color of this effect is a modulation of the input color and samples from a
140 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
141 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700142 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000143 */
joshualitt249af152014-09-15 11:41:13 -0700144class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000145public:
joshualittb0a8a372014-09-23 09:50:21 -0700146 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
147 GrTexture* gamma, const GrTextureParams& gammaParams,
148 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700149 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
jvanverth78f07182014-07-30 06:17:59 -0700150 (tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000151 }
152
153 virtual ~GrDistanceFieldLCDTextureEffect() {}
154
155 static const char* Name() { return "DistanceFieldLCDTexture"; }
156
joshualitt249af152014-09-15 11:41:13 -0700157 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -0700158 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700159 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000160
joshualittb0a8a372014-09-23 09:50:21 -0700161 typedef GrGLDistanceFieldLCDTextureEffect GLProcessor;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000162
joshualittb0a8a372014-09-23 09:50:21 -0700163 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000164
165private:
166 GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700167 GrTexture* gamma, const GrTextureParams& gammaParams,
168 SkColor textColor,
jvanverth78f07182014-07-30 06:17:59 -0700169 uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000170
bsalomon0e08fc12014-10-15 08:19:04 -0700171 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000172
egdaniel1a8ecdf2014-10-03 06:24:12 -0700173 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
174
joshualitt249af152014-09-15 11:41:13 -0700175 GrTextureAccess fTextureAccess;
176 GrTextureAccess fGammaTextureAccess;
177 GrColor fTextColor;
178 uint32_t fFlags;
179 const GrShaderVar& fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000180
joshualittb0a8a372014-09-23 09:50:21 -0700181 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000182
jvanverthfa38a302014-10-06 05:59:05 -0700183 typedef GrGeometryProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000184};
185
jvanverth@google.comd830d132013-11-11 20:54:09 +0000186#endif