blob: 5f08edaa7952c98e7a9af7557207b9047fce9cbc [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
11#include "GrEffect.h"
joshualitt249af152014-09-15 11:41:13 -070012#include "GrGeometryProcessor.h"
jvanverth@google.comd830d132013-11-11 20:54:09 +000013
14class GrGLDistanceFieldTextureEffect;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +000015class GrGLDistanceFieldLCDTextureEffect;
jvanverth@google.comd830d132013-11-11 20:54:09 +000016
jvanverth78f07182014-07-30 06:17:59 -070017enum GrDistanceFieldEffectFlags {
18 kSimilarity_DistanceFieldEffectFlag = 0x01, // ctm is similarity matrix
19 kRectToRect_DistanceFieldEffectFlag = 0x02, // ctm maps rects to rects
20 kUseLCD_DistanceFieldEffectFlag = 0x04, // use lcd text
21 kBGR_DistanceFieldEffectFlag = 0x08, // lcd display has bgr order
22 kPortrait_DistanceFieldEffectFlag = 0x10, // lcd display is in portrait mode (not used yet)
23
24 kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
25 kRectToRect_DistanceFieldEffectFlag,
26 // The subset of the flags relevant to GrDistanceFieldTextureEffect
27 kNonLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag,
28 // The subset of the flags relevant to GrDistanceFieldLCDTextureEffect
29 kLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag |
30 kRectToRect_DistanceFieldEffectFlag |
31 kUseLCD_DistanceFieldEffectFlag |
32 kBGR_DistanceFieldEffectFlag,
33};
34
jvanverth@google.comd830d132013-11-11 20:54:09 +000035/**
skia.committer@gmail.com11a253b2013-11-12 07:02:05 +000036 * 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 +000037 * distance field texture (using a smoothed step function near 0.5).
38 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -070039 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
jvanverth@google.comd830d132013-11-11 20:54:09 +000040 */
joshualitt249af152014-09-15 11:41:13 -070041class GrDistanceFieldTextureEffect : public GrGeometryProcessor {
jvanverth@google.comd830d132013-11-11 20:54:09 +000042public:
jvanverth2d2a68c2014-06-10 06:42:56 -070043#ifdef SK_GAMMA_APPLY_TO_A8
bsalomon83d081a2014-07-08 09:56:10 -070044 static GrEffect* Create(GrTexture* tex, const GrTextureParams& params,
45 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
jvanverth78f07182014-07-30 06:17:59 -070046 uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -070047 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, gamma, gammaParams, lum,
jvanverth78f07182014-07-30 06:17:59 -070048 flags));
bsalomon55fad7a2014-07-08 07:34:20 -070049 }
jvanverth2d2a68c2014-06-10 06:42:56 -070050#else
bsalomon83d081a2014-07-08 09:56:10 -070051 static GrEffect* Create(GrTexture* tex, const GrTextureParams& params,
jvanverth78f07182014-07-30 06:17:59 -070052 uint32_t flags) {
53 return SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params, flags));
jvanverth@google.comd830d132013-11-11 20:54:09 +000054 }
bsalomon55fad7a2014-07-08 07:34:20 -070055#endif
jvanverth@google.comd830d132013-11-11 20:54:09 +000056
57 virtual ~GrDistanceFieldTextureEffect() {}
58
commit-bot@chromium.org6c89c342014-02-14 21:48:29 +000059 static const char* Name() { return "DistanceFieldTexture"; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000060
61 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
joshualitt249af152014-09-15 11:41:13 -070062
63 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
jvanverth2d2a68c2014-06-10 06:42:56 -070064#ifdef SK_GAMMA_APPLY_TO_A8
65 float getLuminance() const { return fLuminance; }
66#endif
jvanverth78f07182014-07-30 06:17:59 -070067 uint32_t getFlags() const { return fFlags; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000068
69 typedef GrGLDistanceFieldTextureEffect GLEffect;
70
71 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
72
73private:
skia.committer@gmail.coma3b53272014-02-15 03:02:15 +000074 GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070075#ifdef SK_GAMMA_APPLY_TO_A8
76 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
77#endif
jvanverth78f07182014-07-30 06:17:59 -070078 uint32_t flags);
jvanverth@google.comd830d132013-11-11 20:54:09 +000079
80 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE;
81
joshualitt249af152014-09-15 11:41:13 -070082 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -070083#ifdef SK_GAMMA_APPLY_TO_A8
joshualitt249af152014-09-15 11:41:13 -070084 GrTextureAccess fGammaTextureAccess;
85 float fLuminance;
jvanverth2d2a68c2014-06-10 06:42:56 -070086#endif
joshualitt249af152014-09-15 11:41:13 -070087 uint32_t fFlags;
88 const GrShaderVar& fInTextureCoords;
jvanverth@google.comd830d132013-11-11 20:54:09 +000089
90 GR_DECLARE_EFFECT_TEST;
91
joshualitt30ba4362014-08-21 20:18:45 -070092 typedef GrEffect INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +000093};
94
commit-bot@chromium.org609ced42014-04-03 18:25:48 +000095/**
96 * The output color of this effect is a modulation of the input color and samples from a
97 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
98 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -070099 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000100 */
joshualitt249af152014-09-15 11:41:13 -0700101class GrDistanceFieldLCDTextureEffect : public GrGeometryProcessor {
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000102public:
bsalomon83d081a2014-07-08 09:56:10 -0700103 static GrEffect* Create(GrTexture* tex, const GrTextureParams& params,
104 GrTexture* gamma, const GrTextureParams& gammaParams,
jvanverth78f07182014-07-30 06:17:59 -0700105 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700106 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
jvanverth78f07182014-07-30 06:17:59 -0700107 (tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000108 }
109
110 virtual ~GrDistanceFieldLCDTextureEffect() {}
111
112 static const char* Name() { return "DistanceFieldLCDTexture"; }
113
joshualitt249af152014-09-15 11:41:13 -0700114 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000115 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
jvanverth2d2a68c2014-06-10 06:42:56 -0700116 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700117 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000118
119 typedef GrGLDistanceFieldLCDTextureEffect GLEffect;
120
121 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
122
123private:
124 GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700125 GrTexture* gamma, const GrTextureParams& gammaParams,
126 SkColor textColor,
jvanverth78f07182014-07-30 06:17:59 -0700127 uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000128
129 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE;
130
joshualitt249af152014-09-15 11:41:13 -0700131 GrTextureAccess fTextureAccess;
132 GrTextureAccess fGammaTextureAccess;
133 GrColor fTextColor;
134 uint32_t fFlags;
135 const GrShaderVar& fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000136
137 GR_DECLARE_EFFECT_TEST;
138
joshualitt30ba4362014-08-21 20:18:45 -0700139 typedef GrEffect INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000140};
141
jvanverth@google.comd830d132013-11-11 20:54:09 +0000142#endif