blob: efd622ea727ef8b4c54fa1600afae54560c3508f [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;
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
joshualittb0a8a372014-09-23 09:50:21 -070044 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
45 GrTexture* gamma, const GrTextureParams& gammaParams,
46 float lum, 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
joshualittb0a8a372014-09-23 09:50:21 -070051 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
52 uint32_t flags) {
jvanverth78f07182014-07-30 06:17:59 -070053 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
joshualitt249af152014-09-15 11:41:13 -070061 const GrShaderVar& inTextureCoords() const { return fInTextureCoords; }
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
joshualittb0a8a372014-09-23 09:50:21 -070067 typedef GrGLDistanceFieldTextureEffect GLProcessor;
jvanverth@google.comd830d132013-11-11 20:54:09 +000068
joshualittb0a8a372014-09-23 09:50:21 -070069 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000070
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
joshualittb0a8a372014-09-23 09:50:21 -070078 virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE;
jvanverth@google.comd830d132013-11-11 20:54:09 +000079
egdaniel1a8ecdf2014-10-03 06:24:12 -070080 virtual void onComputeInvariantOutput(InvariantOutput* inout) 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
joshualittb0a8a372014-09-23 09:50:21 -070090 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
jvanverth@google.comd830d132013-11-11 20:54:09 +000091
joshualittb0a8a372014-09-23 09:50:21 -070092 typedef GrFragmentProcessor 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:
joshualittb0a8a372014-09-23 09:50:21 -0700103 static GrGeometryProcessor* Create(GrTexture* tex, const GrTextureParams& params,
104 GrTexture* gamma, const GrTextureParams& gammaParams,
105 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; }
jvanverth2d2a68c2014-06-10 06:42:56 -0700115 GrColor getTextColor() const { return fTextColor; }
jvanverth78f07182014-07-30 06:17:59 -0700116 uint32_t getFlags() const { return fFlags; }
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000117
joshualittb0a8a372014-09-23 09:50:21 -0700118 typedef GrGLDistanceFieldLCDTextureEffect GLProcessor;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000119
joshualittb0a8a372014-09-23 09:50:21 -0700120 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000121
122private:
123 GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
jvanverth2d2a68c2014-06-10 06:42:56 -0700124 GrTexture* gamma, const GrTextureParams& gammaParams,
125 SkColor textColor,
jvanverth78f07182014-07-30 06:17:59 -0700126 uint32_t flags);
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000127
joshualittb0a8a372014-09-23 09:50:21 -0700128 virtual bool onIsEqual(const GrProcessor& other) const SK_OVERRIDE;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000129
egdaniel1a8ecdf2014-10-03 06:24:12 -0700130 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
131
joshualitt249af152014-09-15 11:41:13 -0700132 GrTextureAccess fTextureAccess;
133 GrTextureAccess fGammaTextureAccess;
134 GrColor fTextColor;
135 uint32_t fFlags;
136 const GrShaderVar& fInTextureCoords;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000137
joshualittb0a8a372014-09-23 09:50:21 -0700138 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000139
joshualittb0a8a372014-09-23 09:50:21 -0700140 typedef GrFragmentProcessor INHERITED;
commit-bot@chromium.org609ced42014-04-03 18:25:48 +0000141};
142
jvanverth@google.comd830d132013-11-11 20:54:09 +0000143#endif