Index: src/effects/SkAlphaThresholdFilter.cpp |
diff --git a/src/effects/SkAlphaThresholdFilter.cpp b/src/effects/SkAlphaThresholdFilter.cpp |
index b6be944220d25678ce719444422b26ba82500873..6cadbc3e5185fe178890bc1613938cdf7995f62d 100644 |
--- a/src/effects/SkAlphaThresholdFilter.cpp |
+++ b/src/effects/SkAlphaThresholdFilter.cpp |
@@ -68,14 +68,26 @@ SkImageFilter* SkAlphaThresholdFilter::Create(const SkRegion& region, |
#include "glsl/GrGLSLProgramDataManager.h" |
#include "glsl/GrGLSLUniformHandler.h" |
+namespace { |
+ |
+SkMatrix make_div_and_translate_matrix(GrTexture* texture, int x, int y) { |
+ SkMatrix matrix = GrCoordTransform::MakeDivByTextureWHMatrix(texture); |
+ matrix.preTranslate(SkIntToScalar(x), SkIntToScalar(y)); |
+ return matrix; |
+} |
+ |
+}; |
+ |
class AlphaThresholdEffect : public GrFragmentProcessor { |
public: |
static GrFragmentProcessor* Create(GrTexture* texture, |
GrTexture* maskTexture, |
float innerThreshold, |
- float outerThreshold) { |
- return new AlphaThresholdEffect(texture, maskTexture, innerThreshold, outerThreshold); |
+ float outerThreshold, |
+ const SkIRect& bounds) { |
+ return new AlphaThresholdEffect(texture, maskTexture, innerThreshold, outerThreshold, |
+ bounds); |
} |
virtual ~AlphaThresholdEffect() {}; |
@@ -89,7 +101,8 @@ private: |
AlphaThresholdEffect(GrTexture* texture, |
GrTexture* maskTexture, |
float innerThreshold, |
- float outerThreshold) |
+ float outerThreshold, |
+ const SkIRect& bounds) |
: fInnerThreshold(innerThreshold) |
, fOuterThreshold(outerThreshold) |
, fImageCoordTransform(kLocal_GrCoordSet, |
@@ -97,7 +110,8 @@ private: |
GrTextureParams::kNone_FilterMode) |
, fImageTextureAccess(texture) |
, fMaskCoordTransform(kLocal_GrCoordSet, |
- GrCoordTransform::MakeDivByTextureWHMatrix(maskTexture), maskTexture, |
+ make_div_and_translate_matrix(maskTexture, -bounds.x(), -bounds.y()), |
+ maskTexture, |
GrTextureParams::kNone_FilterMode) |
, fMaskTextureAccess(maskTexture) { |
this->initClassID<AlphaThresholdEffect>(); |
@@ -205,7 +219,14 @@ const GrFragmentProcessor* AlphaThresholdEffect::TestCreate(GrProcessorTestData* |
GrTexture* maskTex = d->fTextures[GrProcessorUnitTest::kAlphaTextureIdx]; |
float innerThresh = d->fRandom->nextUScalar1(); |
float outerThresh = d->fRandom->nextUScalar1(); |
- return AlphaThresholdEffect::Create(bmpTex, maskTex, innerThresh, outerThresh); |
+ const int kMaxWidth = 1000; |
+ const int kMaxHeight = 1000; |
+ uint32_t width = d->fRandom->nextULessThan(kMaxWidth); |
+ uint32_t height = d->fRandom->nextULessThan(kMaxHeight); |
+ uint32_t x = d->fRandom->nextULessThan(kMaxWidth - width); |
+ uint32_t y = d->fRandom->nextULessThan(kMaxHeight - height); |
+ SkIRect bounds = SkIRect::MakeXYWH(x, y, width, height); |
+ return AlphaThresholdEffect::Create(bmpTex, maskTex, innerThresh, outerThresh, bounds); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -260,7 +281,7 @@ SkAlphaThresholdFilterImpl::SkAlphaThresholdFilterImpl(const SkRegion& region, |
bool SkAlphaThresholdFilterImpl::asFragmentProcessor(GrFragmentProcessor** fp, |
GrTexture* texture, |
const SkMatrix& inMatrix, |
- const SkIRect&) const { |
+ const SkIRect& bounds) const { |
if (fp) { |
GrContext* context = texture->getContext(); |
GrSurfaceDesc maskDesc; |
@@ -272,8 +293,8 @@ bool SkAlphaThresholdFilterImpl::asFragmentProcessor(GrFragmentProcessor** fp, |
maskDesc.fFlags = kRenderTarget_GrSurfaceFlag; |
// Add one pixel of border to ensure that clamp mode will be all zeros |
// the outside. |
- maskDesc.fWidth = texture->width(); |
- maskDesc.fHeight = texture->height(); |
+ maskDesc.fWidth = bounds.width(); |
+ maskDesc.fHeight = bounds.height(); |
SkAutoTUnref<GrTexture> maskTexture( |
context->textureProvider()->createApproxTexture(maskDesc)); |
if (!maskTexture) { |
@@ -288,9 +309,10 @@ bool SkAlphaThresholdFilterImpl::asFragmentProcessor(GrFragmentProcessor** fp, |
SkRegion::Iterator iter(fRegion); |
drawContext->clear(nullptr, 0x0, true); |
+ GrClip clip(SkRect::Make(SkIRect::MakeWH(bounds.width(), bounds.height()))); |
while (!iter.done()) { |
SkRect rect = SkRect::Make(iter.rect()); |
- drawContext->drawRect(GrClip::WideOpen(), grPaint, inMatrix, rect); |
+ drawContext->drawRect(clip, grPaint, inMatrix, rect); |
iter.next(); |
} |
} |
@@ -298,7 +320,8 @@ bool SkAlphaThresholdFilterImpl::asFragmentProcessor(GrFragmentProcessor** fp, |
*fp = AlphaThresholdEffect::Create(texture, |
maskTexture, |
fInnerThreshold, |
- fOuterThreshold); |
+ fOuterThreshold, |
+ bounds); |
} |
return true; |
} |