Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1198)

Unified Diff: src/effects/SkAlphaThresholdFilter.cpp

Issue 1609573002: Fix SkAlphaThresholdFilter bounds handling. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix nits Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gm/imagealphathreshold.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « gm/imagealphathreshold.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698