blob: 5650cfc70a1f8eaffdbdb08db0b26128f58e3a6f [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
84 bool onCanMakeEqual(const GrBatchTracker&, const GrBatchTracker&) const SK_OVERRIDE;
85
jvanverth@google.comd830d132013-11-11 20:54:09 +000086private:
joshualitt2e3b3e32014-12-09 13:31:14 -080087 GrDistanceFieldTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070088#ifdef SK_GAMMA_APPLY_TO_A8
89 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
90#endif
joshualitt56995b52014-12-11 15:44:02 -080091 uint32_t flags, bool opaqueVertexColors);
jvanverth@google.comd830d132013-11-11 20:54:09 +000092
bsalomon0e08fc12014-10-15 08:19:04 -070093 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000094
joshualitt56995b52014-12-11 15:44:02 -080095 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -070096
joshualitt249af152014-09-15 11:41:13 -070097 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -070098#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt249af152014-09-15 11:41:13 -070099 GrTextureAccess fGammaTextureAccess;
100 float fLuminance;
jvanverth2d2a68c2014-06-10 06:42:56 -0700101#endif
joshualitt249af152014-09-15 11:41:13 -0700102 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800103 const GrAttribute* fInPosition;
104 const GrAttribute* fInColor;
105 const GrAttribute* fInTextureCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000106
joshualittb0a8a372014-09-23 09:50:21 -0700107 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000108
jvanverthfa38a302014-10-06 05:59:05 -0700109 typedef GrGeometryProcessor INHERITED;
110};
111
112
113/**
114* The output color of this effect is a modulation of the input color and a sample from a
115* distance field texture (using a smoothed step function near 0.5).
116* It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
117* coords are a custom attribute. No gamma correct blending is applied.
118*/
119class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
120public:
joshualitt2e3b3e32014-12-09 13:31:14 -0800121 static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& params,
joshualitt56995b52014-12-11 15:44:02 -0800122 uint32_t flags, bool opaqueVertexColors) {
123 return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (color, tex, params, flags,
124 opaqueVertexColors));
jvanverthfa38a302014-10-06 05:59:05 -0700125 }
126
127 virtual ~GrDistanceFieldNoGammaTextureEffect() {}
128
joshualitteb2a6762014-12-04 11:35:33 -0800129 virtual const char* name() const SK_OVERRIDE { return "DistanceFieldTexture"; }
jvanverthfa38a302014-10-06 05:59:05 -0700130
joshualitt2dd1ae02014-12-03 06:24:10 -0800131 const GrAttribute* inPosition() const { return fInPosition; }
132 const GrAttribute* inColor() const { return fInColor; }
133 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverthfa38a302014-10-06 05:59:05 -0700134 uint32_t getFlags() const { return fFlags; }
135
joshualitteb2a6762014-12-04 11:35:33 -0800136 virtual void getGLProcessorKey(const GrBatchTracker& bt,
137 const GrGLCaps& caps,
138 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700139
joshualitteb2a6762014-12-04 11:35:33 -0800140 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700141
joshualitt9b989322014-12-15 14:16:27 -0800142 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE;
143
144 bool onCanMakeEqual(const GrBatchTracker&, const GrBatchTracker&) const SK_OVERRIDE;
145
jvanverthfa38a302014-10-06 05:59:05 -0700146private:
joshualitt2e3b3e32014-12-09 13:31:14 -0800147 GrDistanceFieldNoGammaTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
joshualitt56995b52014-12-11 15:44:02 -0800148 uint32_t flags, bool opaqueVertexColors);
jvanverthfa38a302014-10-06 05:59:05 -0700149
bsalomon0e08fc12014-10-15 08:19:04 -0700150 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700151
joshualitt56995b52014-12-11 15:44:02 -0800152 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700153
154 GrTextureAccess fTextureAccess;
155 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800156 const GrAttribute* fInPosition;
157 const GrAttribute* fInColor;
158 const GrAttribute* fInTextureCoords;
jvanverthfa38a302014-10-06 05:59:05 -0700159
160 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
161
162 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000163};
164
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000165/**
166 * The output color of this effect is a modulation of the input color and samples from a
167 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
168 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700169 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000170 */
joshualitt249af152014-09-15 11:41:13 -0700171class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000172public:
joshualitt2e3b3e32014-12-09 13:31:14 -0800173 static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& params,
joshualittb0a8a372014-09-23 09:50:21 -0700174 GrTexture* gamma, const GrTextureParams& gammaParams,
175 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700176 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
joshualitt2e3b3e32014-12-09 13:31:14 -0800177 (color, tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000178 }
179
180 virtual ~GrDistanceFieldLCDTextureEffect() {}
181
joshualitteb2a6762014-12-04 11:35:33 -0800182 virtual const char* name() const SK_OVERRIDE { return "DistanceFieldLCDTexture"; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000183
joshualitt2dd1ae02014-12-03 06:24:10 -0800184 const GrAttribute* inPosition() const { return fInPosition; }
185 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -0700186 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700187 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000188
joshualitteb2a6762014-12-04 11:35:33 -0800189 virtual void getGLProcessorKey(const GrBatchTracker& bt,
190 const GrGLCaps& caps,
191 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000192
joshualitteb2a6762014-12-04 11:35:33 -0800193 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000194
joshualitt9b989322014-12-15 14:16:27 -0800195 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERRIDE;
196
197 bool onCanMakeEqual(const GrBatchTracker&, const GrBatchTracker&) const SK_OVERRIDE;
198
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000199private:
joshualitt2e3b3e32014-12-09 13:31:14 -0800200 GrDistanceFieldLCDTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700201 GrTexture* gamma, const GrTextureParams& gammaParams,
202 SkColor textColor,
jvanverth78f07182014-07-30 06:17:59 -0700203 uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000204
bsalomon0e08fc12014-10-15 08:19:04 -0700205 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000206
joshualitt56995b52014-12-11 15:44:02 -0800207 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -0700208
joshualitt249af152014-09-15 11:41:13 -0700209 GrTextureAccess fTextureAccess;
210 GrTextureAccess fGammaTextureAccess;
211 GrColor fTextColor;
212 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800213 const GrAttribute* fInPosition;
214 const GrAttribute* fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000215
joshualittb0a8a372014-09-23 09:50:21 -0700216 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000217
jvanverthfa38a302014-10-06 05:59:05 -0700218 typedef GrGeometryProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000219};
220
jvanverth@google.comd830d132013-11-11 20:54:09 +0000221#endif