| OLD | NEW |
| (Empty) |
| 1 /* | |
| 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 | |
| 11 #include "GrSingleTextureEffect.h" | |
| 12 | |
| 13 class GrGLTextureDomainEffect; | |
| 14 struct SkRect; | |
| 15 | |
| 16 /** | |
| 17 * 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. | |
| 22 */ | |
| 23 class GrTextureDomainEffect : public GrSingleTextureEffect { | |
| 24 | |
| 25 public: | |
| 26 /** | |
| 27 * If SkShader::kDecal_TileMode sticks then this enum could be replaced by S
kShader::TileMode. | |
| 28 * We could also consider replacing/augmenting Decal mode with Border mode w
here the color | |
| 29 * outside of the domain is user-specifiable. Decal mode currently has a har
d (non-lerped) | |
| 30 * transition between the border and the interior. | |
| 31 */ | |
| 32 enum WrapMode { | |
| 33 kClamp_WrapMode, | |
| 34 kDecal_WrapMode, | |
| 35 }; | |
| 36 | |
| 37 static GrEffectRef* Create(GrTexture*, | |
| 38 const SkMatrix&, | |
| 39 const SkRect& domain, | |
| 40 WrapMode, | |
| 41 GrTextureParams::FilterMode filterMode, | |
| 42 GrCoordSet = kLocal_GrCoordSet); | |
| 43 | |
| 44 virtual ~GrTextureDomainEffect(); | |
| 45 | |
| 46 static const char* Name() { return "TextureDomain"; } | |
| 47 | |
| 48 typedef GrGLTextureDomainEffect GLEffect; | |
| 49 | |
| 50 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; | |
| 51 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags
) const SK_OVERRIDE; | |
| 52 | |
| 53 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 } | |
| 69 | |
| 70 protected: | |
| 71 WrapMode fWrapMode; | |
| 72 SkRect fTextureDomain; | |
| 73 | |
| 74 private: | |
| 75 GrTextureDomainEffect(GrTexture*, | |
| 76 const SkMatrix&, | |
| 77 const SkRect& domain, | |
| 78 WrapMode, | |
| 79 GrTextureParams::FilterMode filterMode, | |
| 80 GrCoordSet); | |
| 81 | |
| 82 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; | |
| 83 | |
| 84 GR_DECLARE_EFFECT_TEST; | |
| 85 | |
| 86 typedef GrSingleTextureEffect INHERITED; | |
| 87 }; | |
| 88 | |
| 89 #endif | |
| OLD | NEW |