blob: aefb9631022c49a983785399892e6c0745d01ca2 [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
Brian Salomon5c6ac642017-12-19 11:09:32 -050022 kPerspective_DistanceFieldEffectFlag = 0x04, // ctm has perspective (and positions are x,y,w)
23 kUseLCD_DistanceFieldEffectFlag = 0x08, // use lcd text
24 kBGR_DistanceFieldEffectFlag = 0x10, // lcd display has bgr order
25 kPortrait_DistanceFieldEffectFlag = 0x20, // lcd display is in portrait mode (not used yet)
26 kGammaCorrect_DistanceFieldEffectFlag = 0x40, // assume gamma-correct output (linear blending)
27 kAliased_DistanceFieldEffectFlag = 0x80, // monochrome output
jvanverth6d22eca2014-10-28 11:10:48 -070028
Brian Salomon5c6ac642017-12-19 11:09:32 -050029 kInvalid_DistanceFieldEffectFlag = 0x100, // invalid state (for initialization)
halcanary9d524f22016-03-29 09:03:52 -070030
jvanverth78f07182014-07-30 06:17:59 -070031 kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
jvanverthcf371bb2016-03-10 11:10:43 -080032 kScaleOnly_DistanceFieldEffectFlag,
jvanverth502286d2015-04-08 12:37:51 -070033 // The subset of the flags relevant to GrDistanceFieldA8TextGeoProc
jvanverthcf371bb2016-03-10 11:10:43 -080034 kNonLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
brianosman0586f5c2016-04-12 12:48:21 -070035 kScaleOnly_DistanceFieldEffectFlag |
Brian Salomon5c6ac642017-12-19 11:09:32 -050036 kPerspective_DistanceFieldEffectFlag |
Jim Van Verth90e89b32017-07-06 16:36:55 -040037 kGammaCorrect_DistanceFieldEffectFlag |
38 kAliased_DistanceFieldEffectFlag,
jvanverth502286d2015-04-08 12:37:51 -070039 // The subset of the flags relevant to GrDistanceFieldLCDTextGeoProc
jvanverth78f07182014-07-30 06:17:59 -070040 kLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
jvanverthcf371bb2016-03-10 11:10:43 -080041 kScaleOnly_DistanceFieldEffectFlag |
Brian Salomon5c6ac642017-12-19 11:09:32 -050042 kPerspective_DistanceFieldEffectFlag |
jvanverth78f07182014-07-30 06:17:59 -070043 kUseLCD_DistanceFieldEffectFlag |
brianosman0586f5c2016-04-12 12:48:21 -070044 kBGR_DistanceFieldEffectFlag |
brianosmanb461d342016-04-13 13:10:14 -070045 kGammaCorrect_DistanceFieldEffectFlag,
jvanverth78f07182014-07-30 06:17:59 -070046};
47
jvanverth@google.comd830d132013-11-11 20:54:09 +000048/**
skia.committer@gmail.com11a253b2013-11-12 07:02:05 +000049 * 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 +000050 * distance field texture (using a smoothed step function near 0.5).
Brian Salomon2bbdcc42017-09-07 12:36:34 -040051 * It allows explicit specification of the filtering and wrap modes (GrSamplerState). The input
jvanverth2d2a68c2014-06-10 06:42:56 -070052 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
jvanverth@google.comd830d132013-11-11 20:54:09 +000053 */
jvanverth502286d2015-04-08 12:37:51 -070054class GrDistanceFieldA8TextGeoProc : public GrGeometryProcessor {
jvanverth@google.comd830d132013-11-11 20:54:09 +000055public:
Jim Van Vertha950b632017-09-12 11:54:11 -040056 static constexpr int kMaxTextures = 4;
57
Brian Salomon5c6ac642017-12-19 11:09:32 -050058 /** The local matrix should be identity if local coords are not required by the GrPipeline. */
jvanverth2d2a68c2014-06-10 06:42:56 -070059#ifdef SK_GAMMA_APPLY_TO_A8
Brian Osman09068252018-01-03 09:57:29 -050060 static sk_sp<GrGeometryProcessor> Make(const sk_sp<GrTextureProxy> proxies[kMaxTextures],
Brian Salomon2bbdcc42017-09-07 12:36:34 -040061 const GrSamplerState& params, float lum, uint32_t flags,
Brian Salomon5c6ac642017-12-19 11:09:32 -050062 const SkMatrix& localMatrixIfUsesLocalCoords) {
63 return sk_sp<GrGeometryProcessor>(new GrDistanceFieldA8TextGeoProc(
Brian Osman09068252018-01-03 09:57:29 -050064 proxies, params, lum, flags, localMatrixIfUsesLocalCoords));
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -050065 }
jvanverth2d2a68c2014-06-10 06:42:56 -070066#else
Brian Osman09068252018-01-03 09:57:29 -050067 static sk_sp<GrGeometryProcessor> Make(const sk_sp<GrTextureProxy> proxies[kMaxTextures],
Brian Salomon2bbdcc42017-09-07 12:36:34 -040068 const GrSamplerState& params, uint32_t flags,
Brian Salomon5c6ac642017-12-19 11:09:32 -050069 const SkMatrix& localMatrixIfUsesLocalCoords) {
70 return sk_sp<GrGeometryProcessor>(new GrDistanceFieldA8TextGeoProc(
Brian Osman09068252018-01-03 09:57:29 -050071 proxies, params, flags, localMatrixIfUsesLocalCoords));
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -050072 }
bsalomon55fad7a2014-07-08 07:34:20 -070073#endif
jvanverth@google.comd830d132013-11-11 20:54:09 +000074
Brian Salomond3b65972017-03-22 12:05:03 -040075 ~GrDistanceFieldA8TextGeoProc() override {}
jvanverth@google.comd830d132013-11-11 20:54:09 +000076
bsalomon32d1e952016-09-15 07:29:52 -070077 const char* name() const override { return "DistanceFieldA8Text"; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000078
joshualitt71c92602015-01-14 08:12:47 -080079 const Attribute* inPosition() const { return fInPosition; }
80 const Attribute* inColor() const { return fInColor; }
81 const Attribute* inTextureCoords() const { return fInTextureCoords; }
Brian Salomon5c6ac642017-12-19 11:09:32 -050082 const SkMatrix& localMatrix() const { return fLocalMatrix; }
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
Jim Van Vertheafa64b2017-09-18 10:05:00 -040088 void addNewProxies(const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& p);
89
Brian Salomon94efbf52016-11-29 13:43:05 -050090 void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
jvanverth@google.comd830d132013-11-11 20:54:09 +000091
Brian Salomon94efbf52016-11-29 13:43:05 -050092 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
jvanverth@google.comd830d132013-11-11 20:54:09 +000093
94private:
Brian Osman09068252018-01-03 09:57:29 -050095 GrDistanceFieldA8TextGeoProc(const sk_sp<GrTextureProxy> proxies[kMaxTextures],
Brian Salomon2bbdcc42017-09-07 12:36:34 -040096 const GrSamplerState& params,
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -050097#ifdef SK_GAMMA_APPLY_TO_A8
98 float distanceAdjust,
99#endif
Brian Salomon5c6ac642017-12-19 11:09:32 -0500100 uint32_t flags, const SkMatrix& localMatrix);
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500101
Jim Van Vertha950b632017-09-12 11:54:11 -0400102 TextureSampler fTextureSamplers[kMaxTextures];
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;
Brian Salomon5c6ac642017-12-19 11:09:32 -0500110 SkMatrix fLocalMatrix;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000111
Brian Salomon0c26a9d2017-07-06 10:09:38 -0400112 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
jvanverthfa38a302014-10-06 05:59:05 -0700117/**
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400118 * The output color of this effect is a modulation of the input color and a sample from a
119 * distance field texture (using a smoothed step function near 0.5).
120 * It allows explicit specification of the filtering and wrap modes (GrSamplerState). The input
121 * coords are a custom attribute. No gamma correct blending is applied. Used for paths only.
122 */
jvanverth502286d2015-04-08 12:37:51 -0700123class GrDistanceFieldPathGeoProc : public GrGeometryProcessor {
jvanverthfa38a302014-10-06 05:59:05 -0700124public:
Jim Van Vertha950b632017-09-12 11:54:11 -0400125 static constexpr int kMaxTextures = 4;
126
Brian Salomon5c6ac642017-12-19 11:09:32 -0500127 /** The local matrix should be identity if local coords are not required by the GrPipeline. */
Brian Osman09068252018-01-03 09:57:29 -0500128 static sk_sp<GrGeometryProcessor> Make(const SkMatrix& matrix,
Jim Van Vertha950b632017-09-12 11:54:11 -0400129 const sk_sp<GrTextureProxy> proxies[kMaxTextures],
Jim Van Verth5698c8a2017-10-12 10:18:44 -0400130 const GrSamplerState& params, uint32_t flags) {
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500131 return sk_sp<GrGeometryProcessor>(
Brian Osman09068252018-01-03 09:57:29 -0500132 new GrDistanceFieldPathGeoProc(matrix, proxies, params, flags));
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500133 }
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; }
Jim Van Verth5698c8a2017-10-12 10:18:44 -0400142 const SkMatrix& matrix() const { return fMatrix; }
jvanverthfa38a302014-10-06 05:59:05 -0700143 uint32_t getFlags() const { return fFlags; }
144
Jim Van Vertheafa64b2017-09-18 10:05:00 -0400145 void addNewProxies(const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& p);
146
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:
Brian Osman09068252018-01-03 09:57:29 -0500152 GrDistanceFieldPathGeoProc(const SkMatrix& matrix,
Jim Van Vertha950b632017-09-12 11:54:11 -0400153 const sk_sp<GrTextureProxy> proxies[kMaxTextures],
Jim Van Verth5698c8a2017-10-12 10:18:44 -0400154 const GrSamplerState&, uint32_t flags);
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500155
Jim Van Verth5698c8a2017-10-12 10:18:44 -0400156 SkMatrix fMatrix; // view matrix if perspective, local matrix otherwise
Jim Van Vertha950b632017-09-12 11:54:11 -0400157 TextureSampler fTextureSamplers[kMaxTextures];
joshualitt88c23fc2015-05-13 14:18:07 -0700158 uint32_t fFlags;
joshualitt71c92602015-01-14 08:12:47 -0800159 const Attribute* fInPosition;
160 const Attribute* fInColor;
161 const Attribute* fInTextureCoords;
jvanverthfa38a302014-10-06 05:59:05 -0700162
Brian Salomon0c26a9d2017-07-06 10:09:38 -0400163 GR_DECLARE_GEOMETRY_PROCESSOR_TEST
jvanverthfa38a302014-10-06 05:59:05 -0700164
165 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000166};
167
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000168/**
169 * The output color of this effect is a modulation of the input color and samples from a
170 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400171 * It allows explicit specification of the filtering and wrap modes (GrSamplerState). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700172 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000173 */
jvanverth502286d2015-04-08 12:37:51 -0700174class GrDistanceFieldLCDTextGeoProc : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000175public:
jvanverth21deace2015-04-01 12:43:48 -0700176 struct DistanceAdjust {
177 SkScalar fR, fG, fB;
178 static DistanceAdjust Make(SkScalar r, SkScalar g, SkScalar b) {
179 DistanceAdjust result;
180 result.fR = r; result.fG = g; result.fB = b;
181 return result;
182 }
183 bool operator==(const DistanceAdjust& wa) const {
184 return (fR == wa.fR && fG == wa.fG && fB == wa.fB);
185 }
186 bool operator!=(const DistanceAdjust& wa) const {
187 return !(*this == wa);
188 }
189 };
190
Jim Van Vertha950b632017-09-12 11:54:11 -0400191 static constexpr int kMaxTextures = 4;
192
Brian Osman09068252018-01-03 09:57:29 -0500193 static sk_sp<GrGeometryProcessor> Make(const sk_sp<GrTextureProxy> proxies[kMaxTextures],
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400194 const GrSamplerState& params,
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400195 DistanceAdjust distanceAdjust,
196 uint32_t flags,
Brian Salomon5c6ac642017-12-19 11:09:32 -0500197 const SkMatrix& localMatrixIfUsesLocalCoords) {
198 return sk_sp<GrGeometryProcessor>(new GrDistanceFieldLCDTextGeoProc(
Brian Osman09068252018-01-03 09:57:29 -0500199 proxies, params, distanceAdjust, flags, localMatrixIfUsesLocalCoords));
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500200 }
201
202 ~GrDistanceFieldLCDTextGeoProc() override {}
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000203
bsalomon32d1e952016-09-15 07:29:52 -0700204 const char* name() const override { return "DistanceFieldLCDText"; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000205
joshualitt71c92602015-01-14 08:12:47 -0800206 const Attribute* inPosition() const { return fInPosition; }
joshualittd9d30f72015-12-08 10:47:55 -0800207 const Attribute* inColor() const { return fInColor; }
joshualitt71c92602015-01-14 08:12:47 -0800208 const Attribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth21deace2015-04-01 12:43:48 -0700209 DistanceAdjust getDistanceAdjust() const { return fDistanceAdjust; }
jvanverth78f07182014-07-30 06:17:59 -0700210 uint32_t getFlags() const { return fFlags; }
Brian Salomon5c6ac642017-12-19 11:09:32 -0500211 const SkMatrix& localMatrix() const { return fLocalMatrix; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000212
Jim Van Vertheafa64b2017-09-18 10:05:00 -0400213 void addNewProxies(const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& p);
214
Brian Salomon94efbf52016-11-29 13:43:05 -0500215 void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000216
Brian Salomon94efbf52016-11-29 13:43:05 -0500217 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000218
219private:
Brian Osman09068252018-01-03 09:57:29 -0500220 GrDistanceFieldLCDTextGeoProc(const sk_sp<GrTextureProxy> proxies[kMaxTextures],
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400221 const GrSamplerState& params, DistanceAdjust wa, uint32_t flags,
Brian Salomon5c6ac642017-12-19 11:09:32 -0500222 const SkMatrix& localMatrix);
Robert Phillipsdbc8eeb2017-02-21 10:04:31 -0500223
Jim Van Vertha950b632017-09-12 11:54:11 -0400224 TextureSampler fTextureSamplers[kMaxTextures];
jvanverth21deace2015-04-01 12:43:48 -0700225 DistanceAdjust fDistanceAdjust;
226 uint32_t fFlags;
joshualitt71c92602015-01-14 08:12:47 -0800227 const Attribute* fInPosition;
joshualittd9d30f72015-12-08 10:47:55 -0800228 const Attribute* fInColor;
joshualitt71c92602015-01-14 08:12:47 -0800229 const Attribute* fInTextureCoords;
Brian Salomon5c6ac642017-12-19 11:09:32 -0500230 const SkMatrix fLocalMatrix;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000231
Brian Salomon0c26a9d2017-07-06 10:09:38 -0400232 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