blob: 6edcf988d2a1efe581aff1559b0bccbc0361bd32 [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;
egdaniel605dd0f2014-11-12 08:35:25 -080017class GrInvariantOutput;
jvanverth@google.comd830d132013-11-11 20:54:09 +000018
jvanverth78f07182014-07-30 06:17:59 -070019enum GrDistanceFieldEffectFlags {
20 kSimilarity_DistanceFieldEffectFlag = 0x01, // ctm is similarity matrix
21 kRectToRect_DistanceFieldEffectFlag = 0x02, // ctm maps rects to rects
22 kUseLCD_DistanceFieldEffectFlag = 0x04, // use lcd text
23 kBGR_DistanceFieldEffectFlag = 0x08, // lcd display has bgr order
24 kPortrait_DistanceFieldEffectFlag = 0x10, // lcd display is in portrait mode (not used yet)
joshualitt2dd1ae02014-12-03 06:24:10 -080025 kColorAttr_DistanceFieldEffectFlag = 0x20, // color vertex attribute
jvanverth6d22eca2014-10-28 11:10:48 -070026
27 kInvalid_DistanceFieldEffectFlag = 0x80, // invalid state (for initialization)
jvanverth78f07182014-07-30 06:17:59 -070028
29 kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
30 kRectToRect_DistanceFieldEffectFlag,
31 // The subset of the flags relevant to GrDistanceFieldTextureEffect
joshualitt2dd1ae02014-12-03 06:24:10 -080032 kNonLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
33 kColorAttr_DistanceFieldEffectFlag,
jvanverth78f07182014-07-30 06:17:59 -070034 // The subset of the flags relevant to GrDistanceFieldLCDTextureEffect
35 kLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
36 kRectToRect_DistanceFieldEffectFlag |
37 kUseLCD_DistanceFieldEffectFlag |
38 kBGR_DistanceFieldEffectFlag,
39};
40
jvanverth@google.comd830d132013-11-11 20:54:09 +000041/**
skia.committer@gmail.com11a253b2013-11-12 07:02:05 +000042 * 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 +000043 * distance field texture (using a smoothed step function near 0.5).
44 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -070045 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
jvanverth@google.comd830d132013-11-11 20:54:09 +000046 */
joshualitt249af152014-09-15 11:41:13 -070047class GrDistanceFieldTextureEffect : public GrGeometryProcessor {
jvanverth@google.comd830d132013-11-11 20:54:09 +000048public:
jvanverth2d2a68c2014-06-10 06:42:56 -070049#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt8059eb92014-12-29 15:10:07 -080050 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, GrTexture* tex,
51 const GrTextureParams& params,
joshualittb0a8a372014-09-23 09:50:21 -070052 GrTexture* gamma, const GrTextureParams& gammaParams,
joshualitt56995b52014-12-11 15:44:02 -080053 float lum, uint32_t flags, bool opaqueVertexColors) {
joshualitt8059eb92014-12-29 15:10:07 -080054 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (color, viewMatrix, tex, params, gamma,
55 gammaParams, lum,
joshualitt56995b52014-12-11 15:44:02 -080056 flags, opaqueVertexColors));
bsalomon55fad7a2014-07-08 07:34:20 -070057 }
jvanverth2d2a68c2014-06-10 06:42:56 -070058#else
joshualitt8059eb92014-12-29 15:10:07 -080059 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, GrTexture* tex,
60 const GrTextureParams& params,
joshualitt56995b52014-12-11 15:44:02 -080061 uint32_t flags, bool opaqueVertexColors) {
joshualitt8059eb92014-12-29 15:10:07 -080062 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (color, viewMatrix, tex, params, flags,
joshualitt56995b52014-12-11 15:44:02 -080063 opaqueVertexColors));
jvanverth@google.comd830d132013-11-11 20:54:09 +000064 }
bsalomon55fad7a2014-07-08 07:34:20 -070065#endif
jvanverth@google.comd830d132013-11-11 20:54:09 +000066
67 virtual ~GrDistanceFieldTextureEffect() {}
68
mtklein72c9faa2015-01-09 10:06:39 -080069 const char* name() const SK_OVERRIDE { return "DistanceFieldTexture"; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000070
joshualitt2dd1ae02014-12-03 06:24:10 -080071 const GrAttribute* inPosition() const { return fInPosition; }
72 const GrAttribute* inColor() const { return fInColor; }
73 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -070074#ifdef SK_GAMMA_APPLY_TO_A8
75 float getLuminance() const { return fLuminance; }
76#endif
jvanverth78f07182014-07-30 06:17:59 -070077 uint32_t getFlags() const { return fFlags; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000078
joshualitteb2a6762014-12-04 11:35:33 -080079 virtual void getGLProcessorKey(const GrBatchTracker& bt,
80 const GrGLCaps& caps,
81 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000082
mtklein72c9faa2015-01-09 10:06:39 -080083 GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000084
joshualitt9b989322014-12-15 14:16:27 -080085 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE;
86
joshualitt290c09b2014-12-19 13:45:20 -080087 bool onCanMakeEqual(const GrBatchTracker&,
88 const GrGeometryProcessor&,
89 const GrBatchTracker&) const SK_OVERRIDE;
joshualitt9b989322014-12-15 14:16:27 -080090
jvanverth@google.comd830d132013-11-11 20:54:09 +000091private:
joshualitt8059eb92014-12-29 15:10:07 -080092 GrDistanceFieldTextureEffect(GrColor, const SkMatrix& viewMatrix, GrTexture* texture,
93 const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070094#ifdef SK_GAMMA_APPLY_TO_A8
95 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
96#endif
joshualitt56995b52014-12-11 15:44:02 -080097 uint32_t flags, bool opaqueVertexColors);
jvanverth@google.comd830d132013-11-11 20:54:09 +000098
mtklein72c9faa2015-01-09 10:06:39 -080099 bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000100
mtklein72c9faa2015-01-09 10:06:39 -0800101 void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -0700102
joshualitt249af152014-09-15 11:41:13 -0700103 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -0700104#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt249af152014-09-15 11:41:13 -0700105 GrTextureAccess fGammaTextureAccess;
106 float fLuminance;
jvanverth2d2a68c2014-06-10 06:42:56 -0700107#endif
joshualitt249af152014-09-15 11:41:13 -0700108 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800109 const GrAttribute* fInPosition;
110 const GrAttribute* fInColor;
111 const GrAttribute* fInTextureCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000112
joshualittb0a8a372014-09-23 09:50:21 -0700113 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000114
jvanverthfa38a302014-10-06 05:59:05 -0700115 typedef GrGeometryProcessor INHERITED;
116};
117
118
119/**
120* The output color of this effect is a modulation of the input color and a sample from a
121* distance field texture (using a smoothed step function near 0.5).
122* It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
123* coords are a custom attribute. No gamma correct blending is applied.
124*/
125class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
126public:
joshualitt8059eb92014-12-29 15:10:07 -0800127 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, GrTexture* tex,
128 const GrTextureParams& params,
joshualitt56995b52014-12-11 15:44:02 -0800129 uint32_t flags, bool opaqueVertexColors) {
joshualitt8059eb92014-12-29 15:10:07 -0800130 return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (color, viewMatrix, tex, params,
131 flags, opaqueVertexColors));
jvanverthfa38a302014-10-06 05:59:05 -0700132 }
133
134 virtual ~GrDistanceFieldNoGammaTextureEffect() {}
135
mtklein72c9faa2015-01-09 10:06:39 -0800136 const char* name() const SK_OVERRIDE { return "DistanceFieldTexture"; }
jvanverthfa38a302014-10-06 05:59:05 -0700137
joshualitt2dd1ae02014-12-03 06:24:10 -0800138 const GrAttribute* inPosition() const { return fInPosition; }
139 const GrAttribute* inColor() const { return fInColor; }
140 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverthfa38a302014-10-06 05:59:05 -0700141 uint32_t getFlags() const { return fFlags; }
142
joshualitteb2a6762014-12-04 11:35:33 -0800143 virtual void getGLProcessorKey(const GrBatchTracker& bt,
144 const GrGLCaps& caps,
145 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700146
mtklein72c9faa2015-01-09 10:06:39 -0800147 GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700148
joshualitt9b989322014-12-15 14:16:27 -0800149 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE;
150
joshualitt290c09b2014-12-19 13:45:20 -0800151 bool onCanMakeEqual(const GrBatchTracker&,
152 const GrGeometryProcessor&,
153 const GrBatchTracker&) const SK_OVERRIDE;
joshualitt9b989322014-12-15 14:16:27 -0800154
jvanverthfa38a302014-10-06 05:59:05 -0700155private:
joshualitt8059eb92014-12-29 15:10:07 -0800156 GrDistanceFieldNoGammaTextureEffect(GrColor, const SkMatrix& viewMatrix, GrTexture* texture,
157 const GrTextureParams& params, uint32_t flags,
158 bool opaqueVertexColors);
jvanverthfa38a302014-10-06 05:59:05 -0700159
mtklein72c9faa2015-01-09 10:06:39 -0800160 bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700161
mtklein72c9faa2015-01-09 10:06:39 -0800162 void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700163
164 GrTextureAccess fTextureAccess;
165 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800166 const GrAttribute* fInPosition;
167 const GrAttribute* fInColor;
168 const GrAttribute* fInTextureCoords;
jvanverthfa38a302014-10-06 05:59:05 -0700169
170 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
171
172 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000173};
174
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000175/**
176 * The output color of this effect is a modulation of the input color and samples from a
177 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
178 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700179 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000180 */
joshualitt249af152014-09-15 11:41:13 -0700181class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000182public:
joshualitt8059eb92014-12-29 15:10:07 -0800183 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, GrTexture* tex,
184 const GrTextureParams& params, GrTexture* gamma,
185 const GrTextureParams& gammaParams,
joshualittb0a8a372014-09-23 09:50:21 -0700186 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700187 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
joshualitt8059eb92014-12-29 15:10:07 -0800188 (color, viewMatrix, tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000189 }
190
191 virtual ~GrDistanceFieldLCDTextureEffect() {}
192
mtklein72c9faa2015-01-09 10:06:39 -0800193 const char* name() const SK_OVERRIDE { return "DistanceFieldLCDTexture"; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000194
joshualitt2dd1ae02014-12-03 06:24:10 -0800195 const GrAttribute* inPosition() const { return fInPosition; }
196 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -0700197 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700198 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000199
joshualitteb2a6762014-12-04 11:35:33 -0800200 virtual void getGLProcessorKey(const GrBatchTracker& bt,
201 const GrGLCaps& caps,
202 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000203
mtklein72c9faa2015-01-09 10:06:39 -0800204 GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000205
joshualitt9b989322014-12-15 14:16:27 -0800206 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE;
207
joshualitt290c09b2014-12-19 13:45:20 -0800208 bool onCanMakeEqual(const GrBatchTracker&,
209 const GrGeometryProcessor&,
210 const GrBatchTracker&) const SK_OVERRIDE;
joshualitt9b989322014-12-15 14:16:27 -0800211
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000212private:
joshualitt8059eb92014-12-29 15:10:07 -0800213 GrDistanceFieldLCDTextureEffect(GrColor, const SkMatrix& viewMatrix, GrTexture* texture,
214 const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700215 GrTexture* gamma, const GrTextureParams& gammaParams,
joshualitt8059eb92014-12-29 15:10:07 -0800216 SkColor textColor, uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000217
mtklein72c9faa2015-01-09 10:06:39 -0800218 bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000219
mtklein72c9faa2015-01-09 10:06:39 -0800220 void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -0700221
joshualitt249af152014-09-15 11:41:13 -0700222 GrTextureAccess fTextureAccess;
223 GrTextureAccess fGammaTextureAccess;
224 GrColor fTextColor;
225 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800226 const GrAttribute* fInPosition;
227 const GrAttribute* fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000228
joshualittb0a8a372014-09-23 09:50:21 -0700229 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000230
jvanverthfa38a302014-10-06 05:59:05 -0700231 typedef GrGeometryProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000232};
233
jvanverth@google.comd830d132013-11-11 20:54:09 +0000234#endif