blob: a074d69f63eb3a55ff68d740ada8362f0c20c0c4 [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
joshualittb0a8a372014-09-23 09:50:21 -070050 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
51 GrTexture* gamma, const GrTextureParams& gammaParams,
52 float lum, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -070053 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, gamma, gammaParams, lum,
jvanverth78f07182014-07-30 06:17:59 -070054 flags));
bsalomon55fad7a2014-07-08 07:34:20 -070055 }
jvanverth2d2a68c2014-06-10 06:42:56 -070056#else
joshualittb0a8a372014-09-23 09:50:21 -070057 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
58 uint32_t flags) {
jvanverth78f07182014-07-30 06:17:59 -070059 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, flags));
jvanverth@google.comd830d132013-11-11 20:54:09 +000060 }
bsalomon55fad7a2014-07-08 07:34:20 -070061#endif
jvanverth@google.comd830d132013-11-11 20:54:09 +000062
63 virtual ~GrDistanceFieldTextureEffect() {}
64
commit-bot@chromium.org6c89c342014-02-14 21:48:29 +000065 static const char* Name() { return "DistanceFieldTexture"; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000066
joshualitt2dd1ae02014-12-03 06:24:10 -080067 const GrAttribute* inPosition() const { return fInPosition; }
68 const GrAttribute* inColor() const { return fInColor; }
69 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -070070#ifdef SK_GAMMA_APPLY_TO_A8
71 float getLuminance() const { return fLuminance; }
72#endif
jvanverth78f07182014-07-30 06:17:59 -070073 uint32_t getFlags() const { return fFlags; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000074
joshualittb0a8a372014-09-23 09:50:21 -070075 typedef GrGLDistanceFieldTextureEffect GLProcessor;
jvanverth@google.comd830d132013-11-11 20:54:09 +000076
joshualittb0a8a372014-09-23 09:50:21 -070077 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000078
79private:
skia.committer@gmail.coma3b53272014-02-15 03:02:15 +000080 GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070081#ifdef SK_GAMMA_APPLY_TO_A8
82 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
83#endif
jvanverth78f07182014-07-30 06:17:59 -070084 uint32_t flags);
jvanverth@google.comd830d132013-11-11 20:54:09 +000085
bsalomon0e08fc12014-10-15 08:19:04 -070086 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000087
egdaniel605dd0f2014-11-12 08:35:25 -080088 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -070089
joshualitt249af152014-09-15 11:41:13 -070090 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -070091#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt249af152014-09-15 11:41:13 -070092 GrTextureAccess fGammaTextureAccess;
93 float fLuminance;
jvanverth2d2a68c2014-06-10 06:42:56 -070094#endif
joshualitt249af152014-09-15 11:41:13 -070095 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -080096 const GrAttribute* fInPosition;
97 const GrAttribute* fInColor;
98 const GrAttribute* fInTextureCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +000099
joshualittb0a8a372014-09-23 09:50:21 -0700100 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000101
jvanverthfa38a302014-10-06 05:59:05 -0700102 typedef GrGeometryProcessor INHERITED;
103};
104
105
106/**
107* The output color of this effect is a modulation of the input color and a sample from a
108* distance field texture (using a smoothed step function near 0.5).
109* It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
110* coords are a custom attribute. No gamma correct blending is applied.
111*/
112class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
113public:
114 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
115 uint32_t flags) {
116 return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (tex, params, flags));
117 }
118
119 virtual ~GrDistanceFieldNoGammaTextureEffect() {}
120
121 static const char* Name() { return "DistanceFieldTexture"; }
122
joshualitt2dd1ae02014-12-03 06:24:10 -0800123 const GrAttribute* inPosition() const { return fInPosition; }
124 const GrAttribute* inColor() const { return fInColor; }
125 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverthfa38a302014-10-06 05:59:05 -0700126 uint32_t getFlags() const { return fFlags; }
127
128 typedef GrGLDistanceFieldNoGammaTextureEffect GLProcessor;
129
130 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
131
132private:
133 GrDistanceFieldNoGammaTextureEffect(GrTexture* texture, const GrTextureParams& params,
134 uint32_t flags);
135
bsalomon0e08fc12014-10-15 08:19:04 -0700136 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700137
egdaniel605dd0f2014-11-12 08:35:25 -0800138 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700139
140 GrTextureAccess fTextureAccess;
141 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800142 const GrAttribute* fInPosition;
143 const GrAttribute* fInColor;
144 const GrAttribute* fInTextureCoords;
jvanverthfa38a302014-10-06 05:59:05 -0700145
146 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
147
148 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000149};
150
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000151/**
152 * The output color of this effect is a modulation of the input color and samples from a
153 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
154 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700155 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000156 */
joshualitt249af152014-09-15 11:41:13 -0700157class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000158public:
joshualittb0a8a372014-09-23 09:50:21 -0700159 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
160 GrTexture* gamma, const GrTextureParams& gammaParams,
161 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700162 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
jvanverth78f07182014-07-30 06:17:59 -0700163 (tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000164 }
165
166 virtual ~GrDistanceFieldLCDTextureEffect() {}
167
168 static const char* Name() { return "DistanceFieldLCDTexture"; }
169
joshualitt2dd1ae02014-12-03 06:24:10 -0800170 const GrAttribute* inPosition() const { return fInPosition; }
171 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -0700172 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700173 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000174
joshualittb0a8a372014-09-23 09:50:21 -0700175 typedef GrGLDistanceFieldLCDTextureEffect GLProcessor;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000176
joshualittb0a8a372014-09-23 09:50:21 -0700177 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000178
179private:
180 GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700181 GrTexture* gamma, const GrTextureParams& gammaParams,
182 SkColor textColor,
jvanverth78f07182014-07-30 06:17:59 -0700183 uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000184
bsalomon0e08fc12014-10-15 08:19:04 -0700185 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000186
egdaniel605dd0f2014-11-12 08:35:25 -0800187 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -0700188
joshualitt249af152014-09-15 11:41:13 -0700189 GrTextureAccess fTextureAccess;
190 GrTextureAccess fGammaTextureAccess;
191 GrColor fTextColor;
192 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800193 const GrAttribute* fInPosition;
194 const GrAttribute* fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000195
joshualittb0a8a372014-09-23 09:50:21 -0700196 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000197
jvanverthfa38a302014-10-06 05:59:05 -0700198 typedef GrGeometryProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000199};
200
jvanverth@google.comd830d132013-11-11 20:54:09 +0000201#endif