blob: cf5d5f9debd10363eaf98912a8fec851c661812a [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
jvanverth502286d2015-04-08 12:37:51 -07008#ifndef GrDistanceFieldGeoProc_DEFINED
9#define GrDistanceFieldGeoProc_DEFINED
jvanverth@google.comd830d132013-11-11 20:54:09 +000010
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
jvanverth502286d2015-04-08 12:37:51 -070014class GrGLDistanceFieldA8TextGeoProc;
15class GrGLDistanceFieldPathGeoProc;
16class GrGLDistanceFieldLCDTextGeoProc;
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 {
brianosmanb461d342016-04-13 13:10:14 -070020 kSimilarity_DistanceFieldEffectFlag = 0x01, // ctm is similarity matrix
21 kScaleOnly_DistanceFieldEffectFlag = 0x02, // ctm has only scale and translate
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)
25 kGammaCorrect_DistanceFieldEffectFlag = 0x20, // assume gamma-correct output (linear blending)
jvanverth6d22eca2014-10-28 11:10:48 -070026
27 kInvalid_DistanceFieldEffectFlag = 0x80, // invalid state (for initialization)
halcanary9d524f22016-03-29 09:03:52 -070028
jvanverth78f07182014-07-30 06:17:59 -070029 kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
jvanverthcf371bb2016-03-10 11:10:43 -080030 kScaleOnly_DistanceFieldEffectFlag,
jvanverth502286d2015-04-08 12:37:51 -070031 // The subset of the flags relevant to GrDistanceFieldA8TextGeoProc
jvanverthcf371bb2016-03-10 11:10:43 -080032 kNonLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
brianosman0586f5c2016-04-12 12:48:21 -070033 kScaleOnly_DistanceFieldEffectFlag |
brianosmanb461d342016-04-13 13:10:14 -070034 kGammaCorrect_DistanceFieldEffectFlag,
jvanverth502286d2015-04-08 12:37:51 -070035 // The subset of the flags relevant to GrDistanceFieldLCDTextGeoProc
jvanverth78f07182014-07-30 06:17:59 -070036 kLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
jvanverthcf371bb2016-03-10 11:10:43 -080037 kScaleOnly_DistanceFieldEffectFlag |
jvanverth78f07182014-07-30 06:17:59 -070038 kUseLCD_DistanceFieldEffectFlag |
brianosman0586f5c2016-04-12 12:48:21 -070039 kBGR_DistanceFieldEffectFlag |
brianosmanb461d342016-04-13 13:10:14 -070040 kGammaCorrect_DistanceFieldEffectFlag,
jvanverth78f07182014-07-30 06:17:59 -070041};
42
jvanverth@google.comd830d132013-11-11 20:54:09 +000043/**
skia.committer@gmail.com11a253b2013-11-12 07:02:05 +000044 * 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 +000045 * distance field texture (using a smoothed step function near 0.5).
Brian Salomon514baff2016-11-17 15:17:07 -050046 * It allows explicit specification of the filtering and wrap modes (GrSamplerParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -070047 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
jvanverth@google.comd830d132013-11-11 20:54:09 +000048 */
jvanverth502286d2015-04-08 12:37:51 -070049class GrDistanceFieldA8TextGeoProc : public GrGeometryProcessor {
jvanverth@google.comd830d132013-11-11 20:54:09 +000050public:
jvanverth2d2a68c2014-06-10 06:42:56 -070051#ifdef SK_GAMMA_APPLY_TO_A8
Robert Phillips296b1cc2017-03-15 10:42:12 -040052 static sk_sp<GrGeometryProcessor> Make(GrResourceProvider* resourceProvider,
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -050053 GrColor color, const SkMatrix& viewMatrix,
54 sk_sp<GrTextureProxy> proxy,
55 const GrSamplerParams& params,
56 float lum, uint32_t flags, bool usesLocalCoords) {
57 return sk_sp<GrGeometryProcessor>(
Robert Phillips296b1cc2017-03-15 10:42:12 -040058 new GrDistanceFieldA8TextGeoProc(resourceProvider, color, viewMatrix, std::move(proxy),
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -050059 params, lum, flags, usesLocalCoords));
60 }
jvanverth2d2a68c2014-06-10 06:42:56 -070061#else
Robert Phillips296b1cc2017-03-15 10:42:12 -040062 static sk_sp<GrGeometryProcessor> Make(GrResourceProvider* resourceProvider,
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -050063 GrColor color, const SkMatrix& viewMatrix,
64 sk_sp<GrTextureProxy> proxy,
65 const GrSamplerParams& params,
66 uint32_t flags, bool usesLocalCoords) {
67 return sk_sp<GrGeometryProcessor>(
Robert Phillips296b1cc2017-03-15 10:42:12 -040068 new GrDistanceFieldA8TextGeoProc(resourceProvider, color, viewMatrix, std::move(proxy),
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -050069 params, flags, usesLocalCoords));
70 }
bsalomon55fad7a2014-07-08 07:34:20 -070071#endif
jvanverth@google.comd830d132013-11-11 20:54:09 +000072
jvanverth502286d2015-04-08 12:37:51 -070073 virtual ~GrDistanceFieldA8TextGeoProc() {}
jvanverth@google.comd830d132013-11-11 20:54:09 +000074
bsalomon32d1e952016-09-15 07:29:52 -070075 const char* name() const override { return "DistanceFieldA8Text"; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000076
joshualitt71c92602015-01-14 08:12:47 -080077 const Attribute* inPosition() const { return fInPosition; }
78 const Attribute* inColor() const { return fInColor; }
79 const Attribute* inTextureCoords() const { return fInTextureCoords; }
joshualitt88c23fc2015-05-13 14:18:07 -070080 GrColor color() const { return fColor; }
joshualitte578a952015-05-14 10:09:13 -070081 const SkMatrix& viewMatrix() const { return fViewMatrix; }
joshualittb8c241a2015-05-19 08:23:30 -070082 bool usesLocalCoords() const { return fUsesLocalCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -070083#ifdef SK_GAMMA_APPLY_TO_A8
jvanverth21deace2015-04-01 12:43:48 -070084 float getDistanceAdjust() const { return fDistanceAdjust; }
jvanverth2d2a68c2014-06-10 06:42:56 -070085#endif
jvanverth78f07182014-07-30 06:17:59 -070086 uint32_t getFlags() const { return fFlags; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000087
Brian Salomon94efbf52016-11-29 13:43:05 -050088 void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
jvanverth@google.comd830d132013-11-11 20:54:09 +000089
Brian Salomon94efbf52016-11-29 13:43:05 -050090 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
jvanverth@google.comd830d132013-11-11 20:54:09 +000091
92private:
Robert Phillips296b1cc2017-03-15 10:42:12 -040093 GrDistanceFieldA8TextGeoProc(GrResourceProvider*, GrColor, const SkMatrix& viewMatrix,
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -050094 sk_sp<GrTextureProxy> proxy, const GrSamplerParams& params,
95#ifdef SK_GAMMA_APPLY_TO_A8
96 float distanceAdjust,
97#endif
98 uint32_t flags, bool usesLocalCoords);
99
joshualitt88c23fc2015-05-13 14:18:07 -0700100 GrColor fColor;
joshualitte578a952015-05-14 10:09:13 -0700101 SkMatrix fViewMatrix;
Brian Salomon0bbecb22016-11-17 11:38:22 -0500102 TextureSampler fTextureSampler;
jvanverth2d2a68c2014-06-10 06:42:56 -0700103#ifdef SK_GAMMA_APPLY_TO_A8
jvanverth21deace2015-04-01 12:43:48 -0700104 float fDistanceAdjust;
jvanverth2d2a68c2014-06-10 06:42:56 -0700105#endif
jvanverth21deace2015-04-01 12:43:48 -0700106 uint32_t fFlags;
joshualitt71c92602015-01-14 08:12:47 -0800107 const Attribute* fInPosition;
108 const Attribute* fInColor;
109 const Attribute* fInTextureCoords;
joshualittb8c241a2015-05-19 08:23:30 -0700110 bool fUsesLocalCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000111
joshualittb0a8a372014-09-23 09:50:21 -0700112 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000113
jvanverthfa38a302014-10-06 05:59:05 -0700114 typedef GrGeometryProcessor INHERITED;
115};
116
117
118/**
119* The output color of this effect is a modulation of the input color and a sample from a
120* distance field texture (using a smoothed step function near 0.5).
Brian Salomon514baff2016-11-17 15:17:07 -0500121* It allows explicit specification of the filtering and wrap modes (GrSamplerParams). The input
jvanverth502286d2015-04-08 12:37:51 -0700122* coords are a custom attribute. No gamma correct blending is applied. Used for paths only.
jvanverthfa38a302014-10-06 05:59:05 -0700123*/
jvanverth502286d2015-04-08 12:37:51 -0700124class GrDistanceFieldPathGeoProc : public GrGeometryProcessor {
jvanverthfa38a302014-10-06 05:59:05 -0700125public:
Robert Phillips296b1cc2017-03-15 10:42:12 -0400126 static sk_sp<GrGeometryProcessor> Make(GrResourceProvider* resourceProvider, GrColor color,
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500127 const SkMatrix& viewMatrix, sk_sp<GrTextureProxy> proxy,
128 const GrSamplerParams& params,
129 uint32_t flags, bool usesLocalCoords) {
130 return sk_sp<GrGeometryProcessor>(
Robert Phillips296b1cc2017-03-15 10:42:12 -0400131 new GrDistanceFieldPathGeoProc(resourceProvider, color, viewMatrix, std::move(proxy),
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500132 params, flags, usesLocalCoords));
133 }
134
135 ~GrDistanceFieldPathGeoProc() override {}
jvanverthfa38a302014-10-06 05:59:05 -0700136
bsalomon32d1e952016-09-15 07:29:52 -0700137 const char* name() const override { return "DistanceFieldPath"; }
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; }
joshualitt88c23fc2015-05-13 14:18:07 -0700142 GrColor color() const { return fColor; }
joshualitte578a952015-05-14 10:09:13 -0700143 const SkMatrix& viewMatrix() const { return fViewMatrix; }
jvanverthfa38a302014-10-06 05:59:05 -0700144 uint32_t getFlags() const { return fFlags; }
joshualittb8c241a2015-05-19 08:23:30 -0700145 bool usesLocalCoords() const { return fUsesLocalCoords; }
jvanverthfa38a302014-10-06 05:59:05 -0700146
Brian Salomon94efbf52016-11-29 13:43:05 -0500147 void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
jvanverthfa38a302014-10-06 05:59:05 -0700148
Brian Salomon94efbf52016-11-29 13:43:05 -0500149 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
jvanverthfa38a302014-10-06 05:59:05 -0700150
151private:
Robert Phillips296b1cc2017-03-15 10:42:12 -0400152 GrDistanceFieldPathGeoProc(GrResourceProvider*, GrColor, const SkMatrix& viewMatrix,
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500153 sk_sp<GrTextureProxy>, const GrSamplerParams&, uint32_t flags,
154 bool usesLocalCoords);
155
joshualitt88c23fc2015-05-13 14:18:07 -0700156 GrColor fColor;
joshualitte578a952015-05-14 10:09:13 -0700157 SkMatrix fViewMatrix;
Brian Salomon0bbecb22016-11-17 11:38:22 -0500158 TextureSampler fTextureSampler;
joshualitt88c23fc2015-05-13 14:18:07 -0700159 uint32_t fFlags;
joshualitt71c92602015-01-14 08:12:47 -0800160 const Attribute* fInPosition;
161 const Attribute* fInColor;
162 const Attribute* fInTextureCoords;
joshualittb8c241a2015-05-19 08:23:30 -0700163 bool fUsesLocalCoords;
jvanverthfa38a302014-10-06 05:59:05 -0700164
165 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
166
167 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000168};
169
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000170/**
171 * The output color of this effect is a modulation of the input color and samples from a
172 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
Brian Salomon514baff2016-11-17 15:17:07 -0500173 * It allows explicit specification of the filtering and wrap modes (GrSamplerParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700174 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000175 */
jvanverth502286d2015-04-08 12:37:51 -0700176class GrDistanceFieldLCDTextGeoProc : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000177public:
jvanverth21deace2015-04-01 12:43:48 -0700178 struct DistanceAdjust {
179 SkScalar fR, fG, fB;
180 static DistanceAdjust Make(SkScalar r, SkScalar g, SkScalar b) {
181 DistanceAdjust result;
182 result.fR = r; result.fG = g; result.fB = b;
183 return result;
184 }
185 bool operator==(const DistanceAdjust& wa) const {
186 return (fR == wa.fR && fG == wa.fG && fB == wa.fB);
187 }
188 bool operator!=(const DistanceAdjust& wa) const {
189 return !(*this == wa);
190 }
191 };
192
Robert Phillips296b1cc2017-03-15 10:42:12 -0400193 static sk_sp<GrGeometryProcessor> Make(GrResourceProvider* resourceProvider, GrColor color,
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500194 const SkMatrix& viewMatrix,
195 sk_sp<GrTextureProxy> proxy,
196 const GrSamplerParams& params,
197 DistanceAdjust distanceAdjust, uint32_t flags,
198 bool usesLocalCoords) {
199 return sk_sp<GrGeometryProcessor>(
Robert Phillips296b1cc2017-03-15 10:42:12 -0400200 new GrDistanceFieldLCDTextGeoProc(resourceProvider, color, viewMatrix, std::move(proxy),
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500201 params, distanceAdjust,
202 flags, usesLocalCoords));
203 }
204
205 ~GrDistanceFieldLCDTextGeoProc() override {}
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000206
bsalomon32d1e952016-09-15 07:29:52 -0700207 const char* name() const override { return "DistanceFieldLCDText"; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000208
joshualitt71c92602015-01-14 08:12:47 -0800209 const Attribute* inPosition() const { return fInPosition; }
joshualittd9d30f72015-12-08 10:47:55 -0800210 const Attribute* inColor() const { return fInColor; }
joshualitt71c92602015-01-14 08:12:47 -0800211 const Attribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth21deace2015-04-01 12:43:48 -0700212 DistanceAdjust getDistanceAdjust() const { return fDistanceAdjust; }
joshualitt88c23fc2015-05-13 14:18:07 -0700213 GrColor color() const { return fColor; }
joshualitte578a952015-05-14 10:09:13 -0700214 const SkMatrix& viewMatrix() const { return fViewMatrix; }
jvanverth78f07182014-07-30 06:17:59 -0700215 uint32_t getFlags() const { return fFlags; }
joshualittb8c241a2015-05-19 08:23:30 -0700216 bool usesLocalCoords() const { return fUsesLocalCoords; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000217
Brian Salomon94efbf52016-11-29 13:43:05 -0500218 void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000219
Brian Salomon94efbf52016-11-29 13:43:05 -0500220 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000221
222private:
Robert Phillips296b1cc2017-03-15 10:42:12 -0400223 GrDistanceFieldLCDTextGeoProc(GrResourceProvider*, GrColor, const SkMatrix& viewMatrix,
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500224 sk_sp<GrTextureProxy> proxy, const GrSamplerParams& params,
225 DistanceAdjust wa, uint32_t flags,
226 bool usesLocalCoords);
227
joshualitt88c23fc2015-05-13 14:18:07 -0700228 GrColor fColor;
joshualitte578a952015-05-14 10:09:13 -0700229 SkMatrix fViewMatrix;
Brian Salomon0bbecb22016-11-17 11:38:22 -0500230 TextureSampler fTextureSampler;
jvanverth21deace2015-04-01 12:43:48 -0700231 DistanceAdjust fDistanceAdjust;
232 uint32_t fFlags;
joshualitt71c92602015-01-14 08:12:47 -0800233 const Attribute* fInPosition;
joshualittd9d30f72015-12-08 10:47:55 -0800234 const Attribute* fInColor;
joshualitt71c92602015-01-14 08:12:47 -0800235 const Attribute* fInTextureCoords;
joshualittb8c241a2015-05-19 08:23:30 -0700236 bool fUsesLocalCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000237
joshualittb0a8a372014-09-23 09:50:21 -0700238 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000239
jvanverthfa38a302014-10-06 05:59:05 -0700240 typedef GrGeometryProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000241};
242
jvanverth@google.comd830d132013-11-11 20:54:09 +0000243#endif