blob: dca1949c506faf89acb68d6e95c0691d3a72fff2 [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"
12#include "GrVertexEffect.h"
13
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 */
41class GrDistanceFieldTextureEffect : public GrVertexEffect {
42public:
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;
jvanverth2d2a68c2014-06-10 06:42:56 -070062#ifdef SK_GAMMA_APPLY_TO_A8
63 float getLuminance() const { return fLuminance; }
64#endif
jvanverth78f07182014-07-30 06:17:59 -070065 uint32_t getFlags() const { return fFlags; }
jvanverth@google.comd830d132013-11-11 20:54:09 +000066
67 typedef GrGLDistanceFieldTextureEffect GLEffect;
68
69 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
70
71private:
skia.committer@gmail.coma3b53272014-02-15 03:02:15 +000072 GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -070073#ifdef SK_GAMMA_APPLY_TO_A8
74 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
75#endif
jvanverth78f07182014-07-30 06:17:59 -070076 uint32_t flags);
jvanverth@google.comd830d132013-11-11 20:54:09 +000077
78 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE;
79
80 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -070081#ifdef SK_GAMMA_APPLY_TO_A8
82 GrTextureAccess fGammaTextureAccess;
83 float fLuminance;
84#endif
jvanverth78f07182014-07-30 06:17:59 -070085 uint32_t fFlags;
jvanverth@google.comd830d132013-11-11 20:54:09 +000086
87 GR_DECLARE_EFFECT_TEST;
88
joshualitt30ba4362014-08-21 20:18:45 -070089 typedef GrEffect INHERITED;
jvanverth@google.comd830d132013-11-11 20:54:09 +000090};
91
commit-bot@chromium.org609ced42014-04-03 18:25:48 +000092/**
93 * The output color of this effect is a modulation of the input color and samples from a
94 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
95 * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
jvanverth2d2a68c2014-06-10 06:42:56 -070096 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
commit-bot@chromium.org609ced42014-04-03 18:25:48 +000097 */
98class GrDistanceFieldLCDTextureEffect : public GrVertexEffect {
99public:
bsalomon83d081a2014-07-08 09:56:10 -0700100 static GrEffect* Create(GrTexture* tex, const GrTextureParams& params,
101 GrTexture* gamma, const GrTextureParams& gammaParams,
jvanverth78f07182014-07-30 06:17:59 -0700102 SkColor textColor, uint32_t flags) {
bsalomon55fad7a2014-07-08 07:34:20 -0700103 return SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
jvanverth78f07182014-07-30 06:17:59 -0700104 (tex, params, gamma, gammaParams, textColor, flags));
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000105 }
106
107 virtual ~GrDistanceFieldLCDTextureEffect() {}
108
109 static const char* Name() { return "DistanceFieldLCDTexture"; }
110
111 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
jvanverth2d2a68c2014-06-10 06:42:56 -0700112 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700113 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000114
115 typedef GrGLDistanceFieldLCDTextureEffect GLEffect;
116
117 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
118
119private:
120 GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700121 GrTexture* gamma, const GrTextureParams& gammaParams,
122 SkColor textColor,
jvanverth78f07182014-07-30 06:17:59 -0700123 uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000124
125 virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE;
126
127 GrTextureAccess fTextureAccess;
jvanverth2d2a68c2014-06-10 06:42:56 -0700128 GrTextureAccess fGammaTextureAccess;
129 GrColor fTextColor;
jvanverth78f07182014-07-30 06:17:59 -0700130 uint32_t fFlags;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000131
132 GR_DECLARE_EFFECT_TEST;
133
joshualitt30ba4362014-08-21 20:18:45 -0700134 typedef GrEffect INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000135};
136
jvanverth@google.comd830d132013-11-11 20:54:09 +0000137#endif