blob: bcc40889fd7b6f71d7982f3f321ad19d0ba575b0 [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)
jvanverth6d22eca2014-10-28 11:10:48 -070025
26 kInvalid_DistanceFieldEffectFlag = 0x80, // invalid state (for initialization)
jvanverth78f07182014-07-30 06:17:59 -070027
28 kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
29 kRectToRect_DistanceFieldEffectFlag,
30 // The subset of the flags relevant to GrDistanceFieldTextureEffect
31 kNonLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag,
32 // The subset of the flags relevant to GrDistanceFieldLCDTextureEffect
33 kLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
34 kRectToRect_DistanceFieldEffectFlag |
35 kUseLCD_DistanceFieldEffectFlag |
36 kBGR_DistanceFieldEffectFlag,
37};
38
jvanverth@google.comd830d132013-11-11 20:54:09 +000039/**
skia.committer@gmail.com11a253b2013-11-12 07:02:05 +000040 * 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 +000041 * distance field texture (using a smoothed step function near 0.5).
42 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -070043 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
jvanverth@google.comd830d132013-11-11 20:54:09 +000044 */
joshualitt249af152014-09-15 11:41:13 -070045class GrDistanceFieldTextureEffect : public GrGeometryProcessor {
jvanverth@google.comd830d132013-11-11 20:54:09 +000046public:
jvanverth2d2a68c2014-06-10 06:42:56 -070047#ifdef SK_GAMMA_APPLY_TO_A8
joshualittb0a8a372014-09-23 09:50:21 -070048 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
49 GrTexture* gamma, const GrTextureParams& gammaParams,
50 float lum, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -070051 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, gamma, gammaParams, lum,
jvanverth78f07182014-07-30 06:17:59 -070052 flags));
bsalomon55fad7a2014-07-08 07:34:20 -070053 }
jvanverth2d2a68c2014-06-10 06:42:56 -070054#else
joshualittb0a8a372014-09-23 09:50:21 -070055 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
56 uint32_t flags) {
jvanverth78f07182014-07-30 06:17:59 -070057 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, flags));
jvanverth@google.comd830d132013-11-11 20:54:09 +000058 }
bsalomon55fad7a2014-07-08 07:34:20 -070059#endif
jvanverth@google.comd830d132013-11-11 20:54:09 +000060
61 virtual ~GrDistanceFieldTextureEffect() {}
62
commit-bot@chromium.org6c89c342014-02-14 21:48:29 +000063 static const char* Name() { return "DistanceFieldTexture"; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000064
joshualitt249af152014-09-15 11:41:13 -070065 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -070066#ifdef SK_GAMMA_APPLY_TO_A8
67 float getLuminance() const { return fLuminance; }
68#endif
jvanverth78f07182014-07-30 06:17:59 -070069 uint32_t getFlags() const { return fFlags; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000070
joshualittb0a8a372014-09-23 09:50:21 -070071 typedef GrGLDistanceFieldTextureEffect GLProcessor;
jvanverth@google.comd830d132013-11-11 20:54:09 +000072
joshualittb0a8a372014-09-23 09:50:21 -070073 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000074
75private:
skia.committer@gmail.coma3b53272014-02-15 03:02:15 +000076 GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070077#ifdef SK_GAMMA_APPLY_TO_A8
78 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
79#endif
jvanverth78f07182014-07-30 06:17:59 -070080 uint32_t flags);
jvanverth@google.comd830d132013-11-11 20:54:09 +000081
bsalomon0e08fc12014-10-15 08:19:04 -070082 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000083
egdaniel605dd0f2014-11-12 08:35:25 -080084 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -070085
joshualitt249af152014-09-15 11:41:13 -070086 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -070087#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt249af152014-09-15 11:41:13 -070088 GrTextureAccess fGammaTextureAccess;
89 float fLuminance;
jvanverth2d2a68c2014-06-10 06:42:56 -070090#endif
joshualitt249af152014-09-15 11:41:13 -070091 uint32_t fFlags;
92 const GrShaderVar& fInTextureCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +000093
joshualittb0a8a372014-09-23 09:50:21 -070094 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +000095
jvanverthfa38a302014-10-06 05:59:05 -070096 typedef GrGeometryProcessor INHERITED;
97};
98
99
100/**
101* The output color of this effect is a modulation of the input color and a sample from a
102* distance field texture (using a smoothed step function near 0.5).
103* It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
104* coords are a custom attribute. No gamma correct blending is applied.
105*/
106class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
107public:
108 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
109 uint32_t flags) {
110 return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (tex, params, flags));
111 }
112
113 virtual ~GrDistanceFieldNoGammaTextureEffect() {}
114
115 static const char* Name() { return "DistanceFieldTexture"; }
116
117 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
118 uint32_t getFlags() const { return fFlags; }
119
120 typedef GrGLDistanceFieldNoGammaTextureEffect GLProcessor;
121
122 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
123
124private:
125 GrDistanceFieldNoGammaTextureEffect(GrTexture* texture, const GrTextureParams& params,
126 uint32_t flags);
127
bsalomon0e08fc12014-10-15 08:19:04 -0700128 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700129
egdaniel605dd0f2014-11-12 08:35:25 -0800130 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700131
132 GrTextureAccess fTextureAccess;
133 uint32_t fFlags;
134 const GrShaderVar& fInTextureCoords;
135
136 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
137
138 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000139};
140
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000141/**
142 * The output color of this effect is a modulation of the input color and samples from a
143 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
144 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700145 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000146 */
joshualitt249af152014-09-15 11:41:13 -0700147class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000148public:
joshualittb0a8a372014-09-23 09:50:21 -0700149 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
150 GrTexture* gamma, const GrTextureParams& gammaParams,
151 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700152 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
jvanverth78f07182014-07-30 06:17:59 -0700153 (tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000154 }
155
156 virtual ~GrDistanceFieldLCDTextureEffect() {}
157
158 static const char* Name() { return "DistanceFieldLCDTexture"; }
159
joshualitt249af152014-09-15 11:41:13 -0700160 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -0700161 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700162 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000163
joshualittb0a8a372014-09-23 09:50:21 -0700164 typedef GrGLDistanceFieldLCDTextureEffect GLProcessor;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000165
joshualittb0a8a372014-09-23 09:50:21 -0700166 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000167
168private:
169 GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700170 GrTexture* gamma, const GrTextureParams& gammaParams,
171 SkColor textColor,
jvanverth78f07182014-07-30 06:17:59 -0700172 uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000173
bsalomon0e08fc12014-10-15 08:19:04 -0700174 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000175
egdaniel605dd0f2014-11-12 08:35:25 -0800176 virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
egdaniel1a8ecdf2014-10-03 06:24:12 -0700177
joshualitt249af152014-09-15 11:41:13 -0700178 GrTextureAccess fTextureAccess;
179 GrTextureAccess fGammaTextureAccess;
180 GrColor fTextColor;
181 uint32_t fFlags;
182 const GrShaderVar& fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000183
joshualittb0a8a372014-09-23 09:50:21 -0700184 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000185
jvanverthfa38a302014-10-06 05:59:05 -0700186 typedef GrGeometryProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000187};
188
jvanverth@google.comd830d132013-11-11 20:54:09 +0000189#endif