blob: 46ee2a6506689d7d7e48841b470eef501281133f [file] [log] [blame]
tomhudson@google.com2f68e762012-07-17 18:43:21 +00001/*
2 * Copyright 2012 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 GrTextureDomainEffect_DEFINED
9#define GrTextureDomainEffect_DEFINED
10
tomhudson@google.com2f68e762012-07-17 18:43:21 +000011#include "GrSingleTextureEffect.h"
tomhudson@google.com2f68e762012-07-17 18:43:21 +000012
13class GrGLTextureDomainEffect;
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +000014struct SkRect;
tomhudson@google.com2f68e762012-07-17 18:43:21 +000015
16/**
bsalomon@google.com7b7cdd12012-11-07 16:17:24 +000017 * Limits a texture's lookup coordinates to a domain. Samples outside the domain are either clamped
18 * the edge of the domain or result in a vec4 of zeros. The domain is clipped to normalized texture
19 * coords ([0,1]x[0,1] square). Bilinear filtering can cause texels outside the domain to affect the
20 * read value unless the caller considers this when calculating the domain. TODO: This should be a
21 * helper that can assist an effect rather than effect unto itself.
tomhudson@google.com2f68e762012-07-17 18:43:21 +000022 */
23class GrTextureDomainEffect : public GrSingleTextureEffect {
24
25public:
bsalomon@google.com7b7cdd12012-11-07 16:17:24 +000026 /**
27 * If SkShader::kDecal_TileMode sticks then this enum could be replaced by SkShader::TileMode.
28 * We could also consider replacing/augmenting Decal mode with Border mode where the color
29 * outside of the domain is user-specifiable. Decal mode currently has a hard (non-lerped)
30 * transition between the border and the interior.
31 */
32 enum WrapMode {
33 kClamp_WrapMode,
34 kDecal_WrapMode,
35 };
tomhudson@google.com2f68e762012-07-17 18:43:21 +000036
bsalomon@google.com0ac6af42013-01-16 15:16:18 +000037 static GrEffectRef* Create(GrTexture*,
38 const SkMatrix&,
39 const SkRect& domain,
40 WrapMode,
humper@google.comb86add12013-07-25 18:49:07 +000041 GrTextureParams::FilterMode filterMode,
bsalomon@google.com77af6802013-10-02 13:04:56 +000042 GrCoordSet = kLocal_GrCoordSet);
bsalomon@google.com1ce49fc2012-09-18 14:14:49 +000043
tomhudson@google.com2f68e762012-07-17 18:43:21 +000044 virtual ~GrTextureDomainEffect();
45
46 static const char* Name() { return "TextureDomain"; }
47
bsalomon@google.com422e81a2012-10-25 14:11:03 +000048 typedef GrGLTextureDomainEffect GLEffect;
tomhudson@google.com2f68e762012-07-17 18:43:21 +000049
bsalomon@google.com396e61f2012-10-25 19:00:29 +000050 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
bsalomon@google.com68b58c92013-01-17 16:50:08 +000051 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
tomhudson@google.com2f68e762012-07-17 18:43:21 +000052
bsalomon@google.com7b7cdd12012-11-07 16:17:24 +000053 const SkRect& domain() const { return fTextureDomain; }
54 WrapMode wrapMode() const { return fWrapMode; }
55
56 /* Computes a domain that bounds all the texels in texelRect. Note that with bilerp enabled
57 texels neighboring the domain may be read. */
58 static const SkRect MakeTexelDomain(const GrTexture* texture, const SkIRect& texelRect) {
59 SkScalar wInv = SK_Scalar1 / texture->width();
60 SkScalar hInv = SK_Scalar1 / texture->height();
61 SkRect result = {
62 texelRect.fLeft * wInv,
63 texelRect.fTop * hInv,
64 texelRect.fRight * wInv,
65 texelRect.fBottom * hInv
66 };
67 return result;
68 }
tomhudson@google.com2f68e762012-07-17 18:43:21 +000069
70protected:
bsalomon@google.com7b7cdd12012-11-07 16:17:24 +000071 WrapMode fWrapMode;
72 SkRect fTextureDomain;
tomhudson@google.com2f68e762012-07-17 18:43:21 +000073
74private:
bsalomon@google.com7b7cdd12012-11-07 16:17:24 +000075 GrTextureDomainEffect(GrTexture*,
76 const SkMatrix&,
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +000077 const SkRect& domain,
bsalomon@google.com7b7cdd12012-11-07 16:17:24 +000078 WrapMode,
humper@google.comb86add12013-07-25 18:49:07 +000079 GrTextureParams::FilterMode filterMode,
bsalomon@google.com77af6802013-10-02 13:04:56 +000080 GrCoordSet);
bsalomon@google.com7b7cdd12012-11-07 16:17:24 +000081
bsalomon@google.com8a252f72013-01-22 20:35:13 +000082 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE;
bsalomon@google.com68b58c92013-01-17 16:50:08 +000083
bsalomon@google.comf271cc72012-10-24 19:35:13 +000084 GR_DECLARE_EFFECT_TEST;
tomhudson@google.com2f68e762012-07-17 18:43:21 +000085
86 typedef GrSingleTextureEffect INHERITED;
87};
88
89#endif