blob: f0f7e3b8c910d9c6e65724941e746626972a3369 [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,
52 float lum, uint32_t flags) {
joshualitt2e3b3e32014-12-09 13:31:14 -080053 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (color, 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
joshualitt2e3b3e32014-12-09 13:31:14 -080057 static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& params,
joshualittb0a8a372014-09-23 09:50:21 -070058 uint32_t flags) {
joshualitt2e3b3e32014-12-09 13:31:14 -080059 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (color, 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
joshualitteb2a6762014-12-04 11:35:33 -080065 virtual const char* name() const SK_OVERRIDE { 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
joshualitteb2a6762014-12-04 11:35:33 -080075 virtual void getGLProcessorKey(const GrBatchTracker& bt,
76 const GrGLCaps& caps,
77 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000078
joshualitteb2a6762014-12-04 11:35:33 -080079 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000080
81private:
joshualitt2e3b3e32014-12-09 13:31:14 -080082 GrDistanceFieldTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070083#ifdef SK_GAMMA_APPLY_TO_A8
84 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
85#endif
jvanverth78f07182014-07-30 06:17:59 -070086 uint32_t flags);
jvanverth@google.comd830d132013-11-11 20:54:09 +000087
bsalomon0e08fc12014-10-15 08:19:04 -070088 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000089
egdaniel605dd0f2014-11-12 08:35:25 -080090 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -070091
joshualitt249af152014-09-15 11:41:13 -070092 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -070093#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt249af152014-09-15 11:41:13 -070094 GrTextureAccess fGammaTextureAccess;
95 float fLuminance;
jvanverth2d2a68c2014-06-10 06:42:56 -070096#endif
joshualitt249af152014-09-15 11:41:13 -070097 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -080098 const GrAttribute* fInPosition;
99 const GrAttribute* fInColor;
100 const GrAttribute* fInTextureCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000101
joshualittb0a8a372014-09-23 09:50:21 -0700102 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000103
jvanverthfa38a302014-10-06 05:59:05 -0700104 typedef GrGeometryProcessor INHERITED;
105};
106
107
108/**
109* The output color of this effect is a modulation of the input color and a sample from a
110* distance field texture (using a smoothed step function near 0.5).
111* It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
112* coords are a custom attribute. No gamma correct blending is applied.
113*/
114class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
115public:
joshualitt2e3b3e32014-12-09 13:31:14 -0800116 static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& params,
jvanverthfa38a302014-10-06 05:59:05 -0700117 uint32_t flags) {
joshualitt2e3b3e32014-12-09 13:31:14 -0800118 return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (color, tex, params, flags));
jvanverthfa38a302014-10-06 05:59:05 -0700119 }
120
121 virtual ~GrDistanceFieldNoGammaTextureEffect() {}
122
joshualitteb2a6762014-12-04 11:35:33 -0800123 virtual const char* name() const SK_OVERRIDE { return "DistanceFieldTexture"; }
jvanverthfa38a302014-10-06 05:59:05 -0700124
joshualitt2dd1ae02014-12-03 06:24:10 -0800125 const GrAttribute* inPosition() const { return fInPosition; }
126 const GrAttribute* inColor() const { return fInColor; }
127 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverthfa38a302014-10-06 05:59:05 -0700128 uint32_t getFlags() const { return fFlags; }
129
joshualitteb2a6762014-12-04 11:35:33 -0800130 virtual void getGLProcessorKey(const GrBatchTracker& bt,
131 const GrGLCaps& caps,
132 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700133
joshualitteb2a6762014-12-04 11:35:33 -0800134 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700135
136private:
joshualitt2e3b3e32014-12-09 13:31:14 -0800137 GrDistanceFieldNoGammaTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
jvanverthfa38a302014-10-06 05:59:05 -0700138 uint32_t flags);
139
bsalomon0e08fc12014-10-15 08:19:04 -0700140 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700141
egdaniel605dd0f2014-11-12 08:35:25 -0800142 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700143
144 GrTextureAccess fTextureAccess;
145 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800146 const GrAttribute* fInPosition;
147 const GrAttribute* fInColor;
148 const GrAttribute* fInTextureCoords;
jvanverthfa38a302014-10-06 05:59:05 -0700149
150 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
151
152 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000153};
154
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000155/**
156 * The output color of this effect is a modulation of the input color and samples from a
157 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
158 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700159 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000160 */
joshualitt249af152014-09-15 11:41:13 -0700161class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000162public:
joshualitt2e3b3e32014-12-09 13:31:14 -0800163 static GrGeometryProcessor* Create(GrColor color, GrTexture* tex, const GrTextureParams& params,
joshualittb0a8a372014-09-23 09:50:21 -0700164 GrTexture* gamma, const GrTextureParams& gammaParams,
165 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700166 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
joshualitt2e3b3e32014-12-09 13:31:14 -0800167 (color, tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000168 }
169
170 virtual ~GrDistanceFieldLCDTextureEffect() {}
171
joshualitteb2a6762014-12-04 11:35:33 -0800172 virtual const char* name() const SK_OVERRIDE { return "DistanceFieldLCDTexture"; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000173
joshualitt2dd1ae02014-12-03 06:24:10 -0800174 const GrAttribute* inPosition() const { return fInPosition; }
175 const GrAttribute* inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -0700176 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700177 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000178
joshualitteb2a6762014-12-04 11:35:33 -0800179 virtual void getGLProcessorKey(const GrBatchTracker& bt,
180 const GrGLCaps& caps,
181 GrProcessorKeyBuilder* b) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000182
joshualitteb2a6762014-12-04 11:35:33 -0800183 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000184
185private:
joshualitt2e3b3e32014-12-09 13:31:14 -0800186 GrDistanceFieldLCDTextureEffect(GrColor, GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700187 GrTexture* gamma, const GrTextureParams& gammaParams,
188 SkColor textColor,
jvanverth78f07182014-07-30 06:17:59 -0700189 uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000190
bsalomon0e08fc12014-10-15 08:19:04 -0700191 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000192
egdaniel605dd0f2014-11-12 08:35:25 -0800193 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -0700194
joshualitt249af152014-09-15 11:41:13 -0700195 GrTextureAccess fTextureAccess;
196 GrTextureAccess fGammaTextureAccess;
197 GrColor fTextColor;
198 uint32_t fFlags;
joshualitt2dd1ae02014-12-03 06:24:10 -0800199 const GrAttribute* fInPosition;
200 const GrAttribute* fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000201
joshualittb0a8a372014-09-23 09:50:21 -0700202 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000203
jvanverthfa38a302014-10-06 05:59:05 -0700204 typedef GrGeometryProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000205};
206
jvanverth@google.comd830d132013-11-11 20:54:09 +0000207#endif