blob: 5a99d24fb131dd8a115e1a4823a6d30b41a8acc7 [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
joshualitt71c92602015-01-14 08:12:47 -080071 const Attribute* inPosition() const { return fInPosition; }
72 const Attribute* inColor() const { return fInColor; }
73 const Attribute* 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
joshualittabb52a12015-01-13 15:02:10 -080083 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt,
84 const GrGLCaps&) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000085
joshualitt9b989322014-12-15 14:16:27 -080086 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE;
87
joshualitt290c09b2014-12-19 13:45:20 -080088 bool onCanMakeEqual(const GrBatchTracker&,
89 const GrGeometryProcessor&,
90 const GrBatchTracker&) const SK_OVERRIDE;
joshualitt9b989322014-12-15 14:16:27 -080091
jvanverth@google.comd830d132013-11-11 20:54:09 +000092private:
joshualitt8059eb92014-12-29 15:10:07 -080093 GrDistanceFieldTextureEffect(GrColor, const SkMatrix& viewMatrix, GrTexture* texture,
94 const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070095#ifdef SK_GAMMA_APPLY_TO_A8
96 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
97#endif
joshualitt56995b52014-12-11 15:44:02 -080098 uint32_t flags, bool opaqueVertexColors);
jvanverth@google.comd830d132013-11-11 20:54:09 +000099
mtklein72c9faa2015-01-09 10:06:39 -0800100 bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000101
mtklein72c9faa2015-01-09 10:06:39 -0800102 void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -0700103
joshualitt249af152014-09-15 11:41:13 -0700104 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -0700105#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt249af152014-09-15 11:41:13 -0700106 GrTextureAccess fGammaTextureAccess;
107 float fLuminance;
jvanverth2d2a68c2014-06-10 06:42:56 -0700108#endif
joshualitt249af152014-09-15 11:41:13 -0700109 uint32_t fFlags;
joshualitt71c92602015-01-14 08:12:47 -0800110 const Attribute* fInPosition;
111 const Attribute* fInColor;
112 const Attribute* fInTextureCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000113
joshualittb0a8a372014-09-23 09:50:21 -0700114 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000115
jvanverthfa38a302014-10-06 05:59:05 -0700116 typedef GrGeometryProcessor INHERITED;
117};
118
119
120/**
121* The output color of this effect is a modulation of the input color and a sample from a
122* distance field texture (using a smoothed step function near 0.5).
123* It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
124* coords are a custom attribute. No gamma correct blending is applied.
125*/
126class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
127public:
joshualitt8059eb92014-12-29 15:10:07 -0800128 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, GrTexture* tex,
129 const GrTextureParams& params,
joshualitt56995b52014-12-11 15:44:02 -0800130 uint32_t flags, bool opaqueVertexColors) {
joshualitt8059eb92014-12-29 15:10:07 -0800131 return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (color, viewMatrix, tex, params,
132 flags, opaqueVertexColors));
jvanverthfa38a302014-10-06 05:59:05 -0700133 }
134
135 virtual ~GrDistanceFieldNoGammaTextureEffect() {}
136
mtklein72c9faa2015-01-09 10:06:39 -0800137 const char* name() const SK_OVERRIDE { return "DistanceFieldTexture"; }
jvanverthfa38a302014-10-06 05:59:05 -0700138
joshualitt71c92602015-01-14 08:12:47 -0800139 const Attribute* inPosition() const { return fInPosition; }
140 const Attribute* inColor() const { return fInColor; }
141 const Attribute* inTextureCoords() const { return fInTextureCoords; }
jvanverthfa38a302014-10-06 05:59:05 -0700142 uint32_t getFlags() const { return fFlags; }
143
joshualitteb2a6762014-12-04 11:35:33 -0800144 virtual void getGLProcessorKey(const GrBatchTracker& bt,
145 const GrGLCaps& caps,
146 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700147
joshualittabb52a12015-01-13 15:02:10 -0800148 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt,
149 const GrGLCaps&) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700150
joshualitt9b989322014-12-15 14:16:27 -0800151 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE;
152
joshualitt290c09b2014-12-19 13:45:20 -0800153 bool onCanMakeEqual(const GrBatchTracker&,
154 const GrGeometryProcessor&,
155 const GrBatchTracker&) const SK_OVERRIDE;
joshualitt9b989322014-12-15 14:16:27 -0800156
jvanverthfa38a302014-10-06 05:59:05 -0700157private:
joshualitt8059eb92014-12-29 15:10:07 -0800158 GrDistanceFieldNoGammaTextureEffect(GrColor, const SkMatrix& viewMatrix, GrTexture* texture,
159 const GrTextureParams& params, uint32_t flags,
160 bool opaqueVertexColors);
jvanverthfa38a302014-10-06 05:59:05 -0700161
mtklein72c9faa2015-01-09 10:06:39 -0800162 bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700163
mtklein72c9faa2015-01-09 10:06:39 -0800164 void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700165
166 GrTextureAccess fTextureAccess;
167 uint32_t fFlags;
joshualitt71c92602015-01-14 08:12:47 -0800168 const Attribute* fInPosition;
169 const Attribute* fInColor;
170 const Attribute* fInTextureCoords;
jvanverthfa38a302014-10-06 05:59:05 -0700171
172 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
173
174 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000175};
176
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000177/**
178 * The output color of this effect is a modulation of the input color and samples from a
179 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
180 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700181 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000182 */
joshualitt249af152014-09-15 11:41:13 -0700183class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000184public:
joshualitt8059eb92014-12-29 15:10:07 -0800185 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix, GrTexture* tex,
186 const GrTextureParams& params, GrTexture* gamma,
187 const GrTextureParams& gammaParams,
joshualittb0a8a372014-09-23 09:50:21 -0700188 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700189 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
joshualitt8059eb92014-12-29 15:10:07 -0800190 (color, viewMatrix, tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000191 }
192
193 virtual ~GrDistanceFieldLCDTextureEffect() {}
194
mtklein72c9faa2015-01-09 10:06:39 -0800195 const char* name() const SK_OVERRIDE { return "DistanceFieldLCDTexture"; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000196
joshualitt71c92602015-01-14 08:12:47 -0800197 const Attribute* inPosition() const { return fInPosition; }
198 const Attribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -0700199 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700200 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000201
joshualitteb2a6762014-12-04 11:35:33 -0800202 virtual void getGLProcessorKey(const GrBatchTracker& bt,
203 const GrGLCaps& caps,
204 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000205
joshualittabb52a12015-01-13 15:02:10 -0800206 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt,
207 const GrGLCaps&) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000208
joshualitt9b989322014-12-15 14:16:27 -0800209 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE;
210
joshualitt290c09b2014-12-19 13:45:20 -0800211 bool onCanMakeEqual(const GrBatchTracker&,
212 const GrGeometryProcessor&,
213 const GrBatchTracker&) const SK_OVERRIDE;
joshualitt9b989322014-12-15 14:16:27 -0800214
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000215private:
joshualitt8059eb92014-12-29 15:10:07 -0800216 GrDistanceFieldLCDTextureEffect(GrColor, const SkMatrix& viewMatrix, GrTexture* texture,
217 const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700218 GrTexture* gamma, const GrTextureParams& gammaParams,
joshualitt8059eb92014-12-29 15:10:07 -0800219 SkColor textColor, uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000220
mtklein72c9faa2015-01-09 10:06:39 -0800221 bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000222
mtklein72c9faa2015-01-09 10:06:39 -0800223 void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -0700224
joshualitt249af152014-09-15 11:41:13 -0700225 GrTextureAccess fTextureAccess;
226 GrTextureAccess fGammaTextureAccess;
227 GrColor fTextColor;
228 uint32_t fFlags;
joshualitt71c92602015-01-14 08:12:47 -0800229 const Attribute* fInPosition;
230 const Attribute* fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000231
joshualittb0a8a372014-09-23 09:50:21 -0700232 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000233
jvanverthfa38a302014-10-06 05:59:05 -0700234 typedef GrGeometryProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000235};
236
jvanverth@google.comd830d132013-11-11 20:54:09 +0000237#endif