blob: 7acd279d6c4a39d9e684ba4075d2e0a14ea69e59 [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
joshualitt2e3b3e32014-12-09 13:31:14 -080050 static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& params,
joshualittb0a8a372014-09-23 09:50:21 -070051 GrTexture* gamma, const GrTextureParams& gammaParams,
joshualitt56995b52014-12-11 15:44:02 -080052 float lum, uint32_t flags, bool opaqueVertexColors) {
joshualitt2e3b3e32014-12-09 13:31:14 -080053 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (color, tex, params, gamma, gammaParams, lum,
joshualitt56995b52014-12-11 15:44:02 -080054 flags, opaqueVertexColors));
bsalomon55fad7a2014-07-08 07:34:20 -070055 }
jvanverth2d2a68c2014-06-10 06:42:56 -070056#else
joshualitt2e3b3e32014-12-09 13:31:14 -080057 static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& params,
joshualitt56995b52014-12-11 15:44:02 -080058 uint32_t flags, bool opaqueVertexColors) {
59 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (color, tex, params, flags,
60 opaqueVertexColors));
jvanverth@google.comd830d132013-11-11 20:54:09 +000061 }
bsalomon55fad7a2014-07-08 07:34:20 -070062#endif
jvanverth@google.comd830d132013-11-11 20:54:09 +000063
64 virtual ~GrDistanceFieldTextureEffect() {}
65
joshualitteb2a6762014-12-04 11:35:33 -080066 virtual const char* name() const SK_OVERRIDE { return "DistanceFieldTexture"; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000067
joshualitt2dd1ae02014-12-03 06:24:10 -080068 const GrAttribute* inPosition() const { return fInPosition; }
69 const GrAttribute* inColor() const { return fInColor; }
70 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -070071#ifdef SK_GAMMA_APPLY_TO_A8
72 float getLuminance() const { return fLuminance; }
73#endif
jvanverth78f07182014-07-30 06:17:59 -070074 uint32_t getFlags() const { return fFlags; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000075
joshualitteb2a6762014-12-04 11:35:33 -080076 virtual void getGLProcessorKey(const GrBatchTracker& bt,
77 const GrGLCaps& caps,
78 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000079
joshualitteb2a6762014-12-04 11:35:33 -080080 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000081
joshualitt9b989322014-12-15 14:16:27 -080082 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE;
83
joshualitt290c09b2014-12-19 13:45:20 -080084 bool onCanMakeEqual(const GrBatchTracker&,
85 const GrGeometryProcessor&,
86 const GrBatchTracker&) const SK_OVERRIDE;
joshualitt9b989322014-12-15 14:16:27 -080087
jvanverth@google.comd830d132013-11-11 20:54:09 +000088private:
joshualitt2e3b3e32014-12-09 13:31:14 -080089 GrDistanceFieldTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070090#ifdef SK_GAMMA_APPLY_TO_A8
91 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
92#endif
joshualitt56995b52014-12-11 15:44:02 -080093 uint32_t flags, bool opaqueVertexColors);
jvanverth@google.comd830d132013-11-11 20:54:09 +000094
bsalomon0e08fc12014-10-15 08:19:04 -070095 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000096
joshualitt56995b52014-12-11 15:44:02 -080097 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -070098
joshualitt249af152014-09-15 11:41:13 -070099 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -0700100#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt249af152014-09-15 11:41:13 -0700101 GrTextureAccess fGammaTextureAccess;
102 float fLuminance;
jvanverth2d2a68c2014-06-10 06:42:56 -0700103#endif
joshualitt249af152014-09-15 11:41:13 -0700104 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800105 const GrAttribute* fInPosition;
106 const GrAttribute* fInColor;
107 const GrAttribute* fInTextureCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000108
joshualittb0a8a372014-09-23 09:50:21 -0700109 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000110
jvanverthfa38a302014-10-06 05:59:05 -0700111 typedef GrGeometryProcessor INHERITED;
112};
113
114
115/**
116* The output color of this effect is a modulation of the input color and a sample from a
117* distance field texture (using a smoothed step function near 0.5).
118* It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
119* coords are a custom attribute. No gamma correct blending is applied.
120*/
121class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
122public:
joshualitt2e3b3e32014-12-09 13:31:14 -0800123 static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& params,
joshualitt56995b52014-12-11 15:44:02 -0800124 uint32_t flags, bool opaqueVertexColors) {
125 return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (color, tex, params, flags,
126 opaqueVertexColors));
jvanverthfa38a302014-10-06 05:59:05 -0700127 }
128
129 virtual ~GrDistanceFieldNoGammaTextureEffect() {}
130
joshualitteb2a6762014-12-04 11:35:33 -0800131 virtual const char* name() const SK_OVERRIDE { return "DistanceFieldTexture"; }
jvanverthfa38a302014-10-06 05:59:05 -0700132
joshualitt2dd1ae02014-12-03 06:24:10 -0800133 const GrAttribute* inPosition() const { return fInPosition; }
134 const GrAttribute* inColor() const { return fInColor; }
135 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverthfa38a302014-10-06 05:59:05 -0700136 uint32_t getFlags() const { return fFlags; }
137
joshualitteb2a6762014-12-04 11:35:33 -0800138 virtual void getGLProcessorKey(const GrBatchTracker& bt,
139 const GrGLCaps& caps,
140 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700141
joshualitteb2a6762014-12-04 11:35:33 -0800142 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700143
joshualitt9b989322014-12-15 14:16:27 -0800144 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE;
145
joshualitt290c09b2014-12-19 13:45:20 -0800146 bool onCanMakeEqual(const GrBatchTracker&,
147 const GrGeometryProcessor&,
148 const GrBatchTracker&) const SK_OVERRIDE;
joshualitt9b989322014-12-15 14:16:27 -0800149
jvanverthfa38a302014-10-06 05:59:05 -0700150private:
joshualitt2e3b3e32014-12-09 13:31:14 -0800151 GrDistanceFieldNoGammaTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
joshualitt56995b52014-12-11 15:44:02 -0800152 uint32_t flags, bool opaqueVertexColors);
jvanverthfa38a302014-10-06 05:59:05 -0700153
bsalomon0e08fc12014-10-15 08:19:04 -0700154 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700155
joshualitt56995b52014-12-11 15:44:02 -0800156 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700157
158 GrTextureAccess fTextureAccess;
159 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800160 const GrAttribute* fInPosition;
161 const GrAttribute* fInColor;
162 const GrAttribute* fInTextureCoords;
jvanverthfa38a302014-10-06 05:59:05 -0700163
164 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
165
166 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000167};
168
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000169/**
170 * The output color of this effect is a modulation of the input color and samples from a
171 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
172 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700173 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000174 */
joshualitt249af152014-09-15 11:41:13 -0700175class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000176public:
joshualitt2e3b3e32014-12-09 13:31:14 -0800177 static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& params,
joshualittb0a8a372014-09-23 09:50:21 -0700178 GrTexture* gamma, const GrTextureParams& gammaParams,
179 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700180 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
joshualitt2e3b3e32014-12-09 13:31:14 -0800181 (color, tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000182 }
183
184 virtual ~GrDistanceFieldLCDTextureEffect() {}
185
joshualitteb2a6762014-12-04 11:35:33 -0800186 virtual const char* name() const SK_OVERRIDE { return "DistanceFieldLCDTexture"; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000187
joshualitt2dd1ae02014-12-03 06:24:10 -0800188 const GrAttribute* inPosition() const { return fInPosition; }
189 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -0700190 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700191 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000192
joshualitteb2a6762014-12-04 11:35:33 -0800193 virtual void getGLProcessorKey(const GrBatchTracker& bt,
194 const GrGLCaps& caps,
195 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000196
joshualitteb2a6762014-12-04 11:35:33 -0800197 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000198
joshualitt9b989322014-12-15 14:16:27 -0800199 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE;
200
joshualitt290c09b2014-12-19 13:45:20 -0800201 bool onCanMakeEqual(const GrBatchTracker&,
202 const GrGeometryProcessor&,
203 const GrBatchTracker&) const SK_OVERRIDE;
joshualitt9b989322014-12-15 14:16:27 -0800204
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000205private:
joshualitt2e3b3e32014-12-09 13:31:14 -0800206 GrDistanceFieldLCDTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700207 GrTexture* gamma, const GrTextureParams& gammaParams,
208 SkColor textColor,
jvanverth78f07182014-07-30 06:17:59 -0700209 uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000210
bsalomon0e08fc12014-10-15 08:19:04 -0700211 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000212
joshualitt56995b52014-12-11 15:44:02 -0800213 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -0700214
joshualitt249af152014-09-15 11:41:13 -0700215 GrTextureAccess fTextureAccess;
216 GrTextureAccess fGammaTextureAccess;
217 GrColor fTextColor;
218 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800219 const GrAttribute* fInPosition;
220 const GrAttribute* fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000221
joshualittb0a8a372014-09-23 09:50:21 -0700222 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000223
jvanverthfa38a302014-10-06 05:59:05 -0700224 typedef GrGeometryProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000225};
226
jvanverth@google.comd830d132013-11-11 20:54:09 +0000227#endif