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