blob: 288da5c7608cf7d61f9b96c1f909d2c698d2f77b [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
82private:
joshualitt2e3b3e32014-12-09 13:31:14 -080083 GrDistanceFieldTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070084#ifdef SK_GAMMA_APPLY_TO_A8
85 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
86#endif
joshualitt56995b52014-12-11 15:44:02 -080087 uint32_t flags, bool opaqueVertexColors);
jvanverth@google.comd830d132013-11-11 20:54:09 +000088
bsalomon0e08fc12014-10-15 08:19:04 -070089 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000090
joshualitt56995b52014-12-11 15:44:02 -080091 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -070092
joshualitt249af152014-09-15 11:41:13 -070093 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -070094#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt249af152014-09-15 11:41:13 -070095 GrTextureAccess fGammaTextureAccess;
96 float fLuminance;
jvanverth2d2a68c2014-06-10 06:42:56 -070097#endif
joshualitt249af152014-09-15 11:41:13 -070098 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -080099 const GrAttribute* fInPosition;
100 const GrAttribute* fInColor;
101 const GrAttribute* fInTextureCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000102
joshualittb0a8a372014-09-23 09:50:21 -0700103 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000104
jvanverthfa38a302014-10-06 05:59:05 -0700105 typedef GrGeometryProcessor INHERITED;
106};
107
108
109/**
110* The output color of this effect is a modulation of the input color and a sample from a
111* distance field texture (using a smoothed step function near 0.5).
112* It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
113* coords are a custom attribute. No gamma correct blending is applied.
114*/
115class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
116public:
joshualitt2e3b3e32014-12-09 13:31:14 -0800117 static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& params,
joshualitt56995b52014-12-11 15:44:02 -0800118 uint32_t flags, bool opaqueVertexColors) {
119 return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (color, tex, params, flags,
120 opaqueVertexColors));
jvanverthfa38a302014-10-06 05:59:05 -0700121 }
122
123 virtual ~GrDistanceFieldNoGammaTextureEffect() {}
124
joshualitteb2a6762014-12-04 11:35:33 -0800125 virtual const char* name() const SK_OVERRIDE { return "DistanceFieldTexture"; }
jvanverthfa38a302014-10-06 05:59:05 -0700126
joshualitt2dd1ae02014-12-03 06:24:10 -0800127 const GrAttribute* inPosition() const { return fInPosition; }
128 const GrAttribute* inColor() const { return fInColor; }
129 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverthfa38a302014-10-06 05:59:05 -0700130 uint32_t getFlags() const { return fFlags; }
131
joshualitteb2a6762014-12-04 11:35:33 -0800132 virtual void getGLProcessorKey(const GrBatchTracker& bt,
133 const GrGLCaps& caps,
134 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700135
joshualitteb2a6762014-12-04 11:35:33 -0800136 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700137
138private:
joshualitt2e3b3e32014-12-09 13:31:14 -0800139 GrDistanceFieldNoGammaTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
joshualitt56995b52014-12-11 15:44:02 -0800140 uint32_t flags, bool opaqueVertexColors);
jvanverthfa38a302014-10-06 05:59:05 -0700141
bsalomon0e08fc12014-10-15 08:19:04 -0700142 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700143
joshualitt56995b52014-12-11 15:44:02 -0800144 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700145
146 GrTextureAccess fTextureAccess;
147 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800148 const GrAttribute* fInPosition;
149 const GrAttribute* fInColor;
150 const GrAttribute* fInTextureCoords;
jvanverthfa38a302014-10-06 05:59:05 -0700151
152 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
153
154 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000155};
156
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000157/**
158 * The output color of this effect is a modulation of the input color and samples from a
159 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
160 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700161 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000162 */
joshualitt249af152014-09-15 11:41:13 -0700163class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000164public:
joshualitt2e3b3e32014-12-09 13:31:14 -0800165 static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& params,
joshualittb0a8a372014-09-23 09:50:21 -0700166 GrTexture* gamma, const GrTextureParams& gammaParams,
167 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700168 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
joshualitt2e3b3e32014-12-09 13:31:14 -0800169 (color, tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000170 }
171
172 virtual ~GrDistanceFieldLCDTextureEffect() {}
173
joshualitteb2a6762014-12-04 11:35:33 -0800174 virtual const char* name() const SK_OVERRIDE { return "DistanceFieldLCDTexture"; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000175
joshualitt2dd1ae02014-12-03 06:24:10 -0800176 const GrAttribute* inPosition() const { return fInPosition; }
177 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -0700178 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700179 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000180
joshualitteb2a6762014-12-04 11:35:33 -0800181 virtual void getGLProcessorKey(const GrBatchTracker& bt,
182 const GrGLCaps& caps,
183 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000184
joshualitteb2a6762014-12-04 11:35:33 -0800185 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000186
187private:
joshualitt2e3b3e32014-12-09 13:31:14 -0800188 GrDistanceFieldLCDTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700189 GrTexture* gamma, const GrTextureParams& gammaParams,
190 SkColor textColor,
jvanverth78f07182014-07-30 06:17:59 -0700191 uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000192
bsalomon0e08fc12014-10-15 08:19:04 -0700193 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000194
joshualitt56995b52014-12-11 15:44:02 -0800195 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -0700196
joshualitt249af152014-09-15 11:41:13 -0700197 GrTextureAccess fTextureAccess;
198 GrTextureAccess fGammaTextureAccess;
199 GrColor fTextColor;
200 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800201 const GrAttribute* fInPosition;
202 const GrAttribute* fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000203
joshualittb0a8a372014-09-23 09:50:21 -0700204 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000205
jvanverthfa38a302014-10-06 05:59:05 -0700206 typedef GrGeometryProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000207};
208
jvanverth@google.comd830d132013-11-11 20:54:09 +0000209#endif