| Index: src/effects/SkMorphologyImageFilter.cpp
|
| diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp
|
| index 8c46aae757447e97b6a0a69b9f6a98a8d0a05937..d2ec036ba79add76c51722b41c4ee30ad3e3d9d1 100644
|
| --- a/src/effects/SkMorphologyImageFilter.cpp
|
| +++ b/src/effects/SkMorphologyImageFilter.cpp
|
| @@ -563,6 +563,7 @@ namespace {
|
|
|
| void apply_morphology_rect(GrContext* context,
|
| GrRenderTarget* rt,
|
| + const GrClip& clip,
|
| GrTexture* texture,
|
| const SkIRect& srcRect,
|
| const SkIRect& dstRect,
|
| @@ -576,12 +577,13 @@ void apply_morphology_rect(GrContext* context,
|
| radius,
|
| morphType,
|
| bounds))->unref();
|
| - context->drawNonAARectToRect(rt, paint, SkMatrix::I(), SkRect::Make(dstRect),
|
| + context->drawNonAARectToRect(rt, clip, paint, SkMatrix::I(), SkRect::Make(dstRect),
|
| SkRect::Make(srcRect));
|
| }
|
|
|
| void apply_morphology_rect_no_bounds(GrContext* context,
|
| GrRenderTarget* rt,
|
| + const GrClip& clip,
|
| GrTexture* texture,
|
| const SkIRect& srcRect,
|
| const SkIRect& dstRect,
|
| @@ -593,12 +595,13 @@ void apply_morphology_rect_no_bounds(GrContext* context,
|
| direction,
|
| radius,
|
| morphType))->unref();
|
| - context->drawNonAARectToRect(rt, paint, SkMatrix::I(), SkRect::Make(dstRect),
|
| + context->drawNonAARectToRect(rt, clip, paint, SkMatrix::I(), SkRect::Make(dstRect),
|
| SkRect::Make(srcRect));
|
| }
|
|
|
| void apply_morphology_pass(GrContext* context,
|
| GrRenderTarget* rt,
|
| + const GrClip& clip,
|
| GrTexture* texture,
|
| const SkIRect& srcRect,
|
| const SkIRect& dstRect,
|
| @@ -630,16 +633,16 @@ void apply_morphology_pass(GrContext* context,
|
| }
|
| if (middleSrcRect.fLeft - middleSrcRect.fRight >= 0) {
|
| // radius covers srcRect; use bounds over entire draw
|
| - apply_morphology_rect(context, rt, texture, srcRect, dstRect, radius,
|
| + apply_morphology_rect(context, rt, clip, texture, srcRect, dstRect, radius,
|
| morphType, bounds, direction);
|
| } else {
|
| // Draw upper and lower margins with bounds; middle without.
|
| - apply_morphology_rect(context, rt,texture, lowerSrcRect, lowerDstRect, radius,
|
| + apply_morphology_rect(context, rt, clip, texture, lowerSrcRect, lowerDstRect, radius,
|
| morphType, bounds, direction);
|
| - apply_morphology_rect(context, rt, texture, upperSrcRect, upperDstRect, radius,
|
| + apply_morphology_rect(context, rt, clip, texture, upperSrcRect, upperDstRect, radius,
|
| morphType, bounds, direction);
|
| - apply_morphology_rect_no_bounds(context, rt, texture, middleSrcRect, middleDstRect, radius,
|
| - morphType, direction);
|
| + apply_morphology_rect_no_bounds(context, rt, clip, texture, middleSrcRect, middleDstRect,
|
| + radius, morphType, direction);
|
| }
|
| }
|
|
|
| @@ -652,8 +655,9 @@ bool apply_morphology(const SkBitmap& input,
|
| SkASSERT(srcTexture);
|
| GrContext* context = srcTexture->getContext();
|
|
|
| - GrContext::AutoClip acs(context, SkRect::MakeWH(SkIntToScalar(srcTexture->width()),
|
| - SkIntToScalar(srcTexture->height())));
|
| + // setup new clip
|
| + GrClip clip(SkRect::MakeWH(SkIntToScalar(srcTexture->width()),
|
| + SkIntToScalar(srcTexture->height())));
|
|
|
| SkIRect dstRect = SkIRect::MakeWH(rect.width(), rect.height());
|
| GrSurfaceDesc desc;
|
| @@ -668,8 +672,9 @@ bool apply_morphology(const SkBitmap& input,
|
| if (NULL == texture) {
|
| return false;
|
| }
|
| - apply_morphology_pass(context, texture->asRenderTarget(), srcTexture, srcRect, dstRect,
|
| - radius.fWidth, morphType, Gr1DKernelEffect::kX_Direction);
|
| + apply_morphology_pass(context, texture->asRenderTarget(), clip, srcTexture,
|
| + srcRect, dstRect, radius.fWidth, morphType,
|
| + Gr1DKernelEffect::kX_Direction);
|
| SkIRect clearRect = SkIRect::MakeXYWH(dstRect.fLeft, dstRect.fBottom,
|
| dstRect.width(), radius.fHeight);
|
| GrColor clearColor = GrMorphologyEffect::kErode_MorphologyType == morphType ?
|
| @@ -684,8 +689,9 @@ bool apply_morphology(const SkBitmap& input,
|
| if (NULL == texture) {
|
| return false;
|
| }
|
| - apply_morphology_pass(context, texture->asRenderTarget(), srcTexture, srcRect, dstRect,
|
| - radius.fHeight, morphType, Gr1DKernelEffect::kY_Direction);
|
| + apply_morphology_pass(context, texture->asRenderTarget(), clip, srcTexture,
|
| + srcRect, dstRect, radius.fHeight, morphType,
|
| + Gr1DKernelEffect::kY_Direction);
|
| srcTexture.reset(texture);
|
| }
|
| SkImageFilter::WrapTexture(srcTexture, rect.width(), rect.height(), dst);
|
|
|