1d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com/*
2d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com * Copyright 2013 Google Inc.
3d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com *
4d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com * Use of this source code is governed by a BSD-style license that can be
5d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com * found in the LICENSE file.
6d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com */
7d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
8d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#ifndef GrDistanceFieldTextureEffect_DEFINED
9d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#define GrDistanceFieldTextureEffect_DEFINED
10d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
11d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#include "GrEffect.h"
12d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#include "GrVertexEffect.h"
13d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
14d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.comclass GrGLDistanceFieldTextureEffect;
15609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.orgclass GrGLDistanceFieldLCDTextureEffect;
16d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
17d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com/**
1811a253b686d2f6e9def2de8a4507591fcadfe987skia.committer@gmail.com * The output color of this effect is a modulation of the input color and a sample from a
19d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com * distance field texture (using a smoothed step function near 0.5).
20d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
212d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth * coords are a custom attribute. Gamma correction is handled via a texture LUT.
22d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com */
23d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.comclass GrDistanceFieldTextureEffect : public GrVertexEffect {
24d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.compublic:
252d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth#ifdef SK_GAMMA_APPLY_TO_A8
262d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth    static GrEffectRef* Create(GrTexture* tex, const GrTextureParams& params,
272d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                               GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
282d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                               bool similarity) {
292d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth        AutoEffectUnref effect(SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params,
302d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                                                                         gamma, gammaParams, lum,
312d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                                                                         similarity)));
322d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth#else
332d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth    static GrEffectRef* Create(GrTexture* tex, const GrTextureParams& params,
342d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                               bool similarity) {
352d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth        AutoEffectUnref effect(SkNEW_ARGS(GrDistanceFieldTextureEffect, (tex, params,
362d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                                                                         similarity)));
372d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth#endif
38d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        return CreateEffectRef(effect);
39d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    }
40d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
41d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    virtual ~GrDistanceFieldTextureEffect() {}
42d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
436c89c34614573797ce63e429229b6f7848df0bb7commit-bot@chromium.org    static const char* Name() { return "DistanceFieldTexture"; }
44d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
45d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
462d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth#ifdef SK_GAMMA_APPLY_TO_A8
472d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth    float getLuminance() const { return fLuminance; }
482d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth#endif
49609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    bool isSimilarity() const { return fIsSimilarity; }
50d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
51d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    typedef GrGLDistanceFieldTextureEffect GLEffect;
52d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
53d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
54d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
55d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.comprivate:
56a3b532743dbb1d54a4c17a2574083ef93c949d50skia.committer@gmail.com    GrDistanceFieldTextureEffect(GrTexture* texture, const GrTextureParams& params,
572d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth#ifdef SK_GAMMA_APPLY_TO_A8
582d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                                 GrTexture* gamma, const GrTextureParams& gammaParams, float lum,
592d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth#endif
604362a38563a958083aca2b456aaaa9f756f6f4e1commit-bot@chromium.org                                 bool uniformScale);
61d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
62d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE;
63d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
64d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    GrTextureAccess fTextureAccess;
652d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth#ifdef SK_GAMMA_APPLY_TO_A8
662d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth    GrTextureAccess fGammaTextureAccess;
672d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth    float           fLuminance;
682d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth#endif
69609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    bool            fIsSimilarity;
70609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org
71609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    GR_DECLARE_EFFECT_TEST;
72609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org
73609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    typedef GrVertexEffect INHERITED;
74609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org};
75609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org
76609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org/**
77609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org * The output color of this effect is a modulation of the input color and samples from a
78609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
79609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org * It allows explicit specification of the filtering and wrap modes (GrTextureParams). The input
802d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth * coords are a custom attribute. Gamma correction is handled via a texture LUT.
81609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org */
82609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.orgclass GrDistanceFieldLCDTextureEffect : public GrVertexEffect {
83609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.orgpublic:
84609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    static GrEffectRef* Create(GrTexture* tex, const GrTextureParams& params,
852d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                               GrTexture* gamma, const GrTextureParams& gammaParams,
862d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                               SkColor textColor,
87609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org                               bool uniformScale, bool useBGR) {
88609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org        AutoEffectUnref effect(SkNEW_ARGS(GrDistanceFieldLCDTextureEffect,
892d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                                          (tex, params, gamma, gammaParams, textColor, uniformScale,
902d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                                           useBGR)));
91609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org        return CreateEffectRef(effect);
92609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    }
93609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org
94609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    virtual ~GrDistanceFieldLCDTextureEffect() {}
95609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org
96609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    static const char* Name() { return "DistanceFieldLCDTexture"; }
97609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org
98609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
992d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth    GrColor getTextColor() const { return fTextColor; }
100609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    bool isUniformScale() const { return fUniformScale; }
101609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    bool useBGR() const { return fUseBGR; }
102609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org
103609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    typedef GrGLDistanceFieldLCDTextureEffect GLEffect;
104609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org
105609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
106609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org
107609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.orgprivate:
108609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    GrDistanceFieldLCDTextureEffect(GrTexture* texture, const GrTextureParams& params,
1092d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                                    GrTexture* gamma, const GrTextureParams& gammaParams,
1102d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth                                    SkColor textColor,
111609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org                                    bool uniformScale, bool useBGR);
112609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org
113609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE;
114609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org
115609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    GrTextureAccess fTextureAccess;
1162d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth    GrTextureAccess fGammaTextureAccess;
1172d2a68c51b4a71bd60760510bf2b2e58bc9890b2jvanverth    GrColor         fTextColor;
1184362a38563a958083aca2b456aaaa9f756f6f4e1commit-bot@chromium.org    bool            fUniformScale;
119609ced42e7cebef533cf9c1622280f5cdda1faaecommit-bot@chromium.org    bool            fUseBGR;
120d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
121d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    GR_DECLARE_EFFECT_TEST;
122d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
123d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    typedef GrVertexEffect INHERITED;
124d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com};
125d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
126d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#endif
127