blob: ea02d195b7d8de759e043fbe82e926ab4d2685a8 [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;
jvanverth@google.comd830d132013-11-11 20:54:09 +000017
jvanverth78f07182014-07-30 06:17:59 -070018enum GrDistanceFieldEffectFlags {
19 kSimilarity_DistanceFieldEffectFlag = 0x01, // ctm is similarity matrix
20 kRectToRect_DistanceFieldEffectFlag = 0x02, // ctm maps rects to rects
21 kUseLCD_DistanceFieldEffectFlag = 0x04, // use lcd text
22 kBGR_DistanceFieldEffectFlag = 0x08, // lcd display has bgr order
23 kPortrait_DistanceFieldEffectFlag = 0x10, // lcd display is in portrait mode (not used yet)
jvanverth6d22eca2014-10-28 11:10:48 -070024
25 kInvalid_DistanceFieldEffectFlag = 0x80, // invalid state (for initialization)
jvanverth78f07182014-07-30 06:17:59 -070026
27 kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
28 kRectToRect_DistanceFieldEffectFlag,
29 // The subset of the flags relevant to GrDistanceFieldTextureEffect
30 kNonLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag,
31 // The subset of the flags relevant to GrDistanceFieldLCDTextureEffect
32 kLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
33 kRectToRect_DistanceFieldEffectFlag |
34 kUseLCD_DistanceFieldEffectFlag |
35 kBGR_DistanceFieldEffectFlag,
36};
37
jvanverth@google.comd830d132013-11-11 20:54:09 +000038/**
skia.committer@gmail.com11a253b2013-11-12 07:02:05 +000039 * 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 +000040 * distance field texture (using a smoothed step function near 0.5).
41 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -070042 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
jvanverth@google.comd830d132013-11-11 20:54:09 +000043 */
joshualitt249af152014-09-15 11:41:13 -070044class GrDistanceFieldTextureEffect : public GrGeometryProcessor {
jvanverth@google.comd830d132013-11-11 20:54:09 +000045public:
jvanverth2d2a68c2014-06-10 06:42:56 -070046#ifdef SK_GAMMA_APPLY_TO_A8
joshualittb0a8a372014-09-23 09:50:21 -070047 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
48 GrTexture* gamma, const GrTextureParams& gammaParams,
49 float lum, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -070050 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, gamma, gammaParams, lum,
jvanverth78f07182014-07-30 06:17:59 -070051 flags));
bsalomon55fad7a2014-07-08 07:34:20 -070052 }
jvanverth2d2a68c2014-06-10 06:42:56 -070053#else
joshualittb0a8a372014-09-23 09:50:21 -070054 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
55 uint32_t flags) {
jvanverth78f07182014-07-30 06:17:59 -070056 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, flags));
jvanverth@google.comd830d132013-11-11 20:54:09 +000057 }
bsalomon55fad7a2014-07-08 07:34:20 -070058#endif
jvanverth@google.comd830d132013-11-11 20:54:09 +000059
60 virtual ~GrDistanceFieldTextureEffect() {}
61
commit-bot@chromium.org6c89c342014-02-14 21:48:29 +000062 static const char* Name() { return "DistanceFieldTexture"; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000063
joshualitt249af152014-09-15 11:41:13 -070064 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -070065#ifdef SK_GAMMA_APPLY_TO_A8
66 float getLuminance() const { return fLuminance; }
67#endif
jvanverth78f07182014-07-30 06:17:59 -070068 uint32_t getFlags() const { return fFlags; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000069
joshualittb0a8a372014-09-23 09:50:21 -070070 typedef GrGLDistanceFieldTextureEffect GLProcessor;
jvanverth@google.comd830d132013-11-11 20:54:09 +000071
joshualittb0a8a372014-09-23 09:50:21 -070072 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000073
74private:
skia.committer@gmail.coma3b53272014-02-15 03:02:15 +000075 GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070076#ifdef SK_GAMMA_APPLY_TO_A8
77 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
78#endif
jvanverth78f07182014-07-30 06:17:59 -070079 uint32_t flags);
jvanverth@google.comd830d132013-11-11 20:54:09 +000080
bsalomon0e08fc12014-10-15 08:19:04 -070081 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000082
egdaniel1a8ecdf2014-10-03 06:24:12 -070083 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
84
joshualitt249af152014-09-15 11:41:13 -070085 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -070086#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt249af152014-09-15 11:41:13 -070087 GrTextureAccess fGammaTextureAccess;
88 float fLuminance;
jvanverth2d2a68c2014-06-10 06:42:56 -070089#endif
joshualitt249af152014-09-15 11:41:13 -070090 uint32_t fFlags;
91 const GrShaderVar& fInTextureCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +000092
joshualittb0a8a372014-09-23 09:50:21 -070093 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +000094
jvanverthfa38a302014-10-06 05:59:05 -070095 typedef GrGeometryProcessor INHERITED;
96};
97
98
99/**
100* The output color of this effect is a modulation of the input color and a sample from a
101* distance field texture (using a smoothed step function near 0.5).
102* It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
103* coords are a custom attribute. No gamma correct blending is applied.
104*/
105class GrDistanceFieldNoGammaTextureEffect : public GrGeometryProcessor {
106public:
107 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
108 uint32_t flags) {
109 return SkNEW_ARGS(GrDistanceFieldNoGammaTextureEffect, (tex, params, flags));
110 }
111
112 virtual ~GrDistanceFieldNoGammaTextureEffect() {}
113
114 static const char* Name() { return "DistanceFieldTexture"; }
115
116 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
117 uint32_t getFlags() const { return fFlags; }
118
119 typedef GrGLDistanceFieldNoGammaTextureEffect GLProcessor;
120
121 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
122
123private:
124 GrDistanceFieldNoGammaTextureEffect(GrTexture* texture, const GrTextureParams& params,
125 uint32_t flags);
126
bsalomon0e08fc12014-10-15 08:19:04 -0700127 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
jvanverthfa38a302014-10-06 05:59:05 -0700128
129 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
130
131 GrTextureAccess fTextureAccess;
132 uint32_t fFlags;
133 const GrShaderVar& fInTextureCoords;
134
135 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
136
137 typedef GrGeometryProcessor INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +0000138};
139
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000140/**
141 * The output color of this effect is a modulation of the input color and samples from a
142 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
143 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -0700144 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000145 */
joshualitt249af152014-09-15 11:41:13 -0700146class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000147public:
joshualittb0a8a372014-09-23 09:50:21 -0700148 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
149 GrTexture* gamma, const GrTextureParams& gammaParams,
150 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700151 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
jvanverth78f07182014-07-30 06:17:59 -0700152 (tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000153 }
154
155 virtual ~GrDistanceFieldLCDTextureEffect() {}
156
157 static const char* Name() { return "DistanceFieldLCDTexture"; }
158
joshualitt249af152014-09-15 11:41:13 -0700159 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -0700160 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700161 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000162
joshualittb0a8a372014-09-23 09:50:21 -0700163 typedef GrGLDistanceFieldLCDTextureEffect GLProcessor;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000164
joshualittb0a8a372014-09-23 09:50:21 -0700165 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000166
167private:
168 GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700169 GrTexture* gamma, const GrTextureParams& gammaParams,
170 SkColor textColor,
jvanverth78f07182014-07-30 06:17:59 -0700171 uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000172
bsalomon0e08fc12014-10-15 08:19:04 -0700173 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000174
egdaniel1a8ecdf2014-10-03 06:24:12 -0700175 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
176
joshualitt249af152014-09-15 11:41:13 -0700177 GrTextureAccess fTextureAccess;
178 GrTextureAccess fGammaTextureAccess;
179 GrColor fTextColor;
180 uint32_t fFlags;
181 const GrShaderVar& fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000182
joshualittb0a8a372014-09-23 09:50:21 -0700183 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000184
jvanverthfa38a302014-10-06 05:59:05 -0700185 typedef GrGeometryProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000186};
187
jvanverth@google.comd830d132013-11-11 20:54:09 +0000188#endif