Index: src/effects/SkMorphologyImageFilter.cpp |
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp |
index 5eccb0db233828351ee828617264f4fbba97b807..ca39083cfcffe2aa9dd2c421544a71de33a1d7f1 100644 |
--- a/src/effects/SkMorphologyImageFilter.cpp |
+++ b/src/effects/SkMorphologyImageFilter.cpp |
@@ -667,18 +667,21 @@ bool apply_morphology(const SkBitmap& input, |
desc.fConfig = kSkia8888_GrPixelConfig; |
SkIRect srcRect = rect; |
- GrDrawContext* drawContext = context->drawContext(); |
- if (!drawContext) { |
- return false; |
- } |
+ GrDrawContext* srcDrawContext = NULL; |
if (radius.fWidth > 0) { |
- GrTexture* texture = context->textureProvider()->refScratchTexture( |
+ GrTexture* dst = context->textureProvider()->refScratchTexture( |
desc, GrTextureProvider::kApprox_ScratchTexMatch); |
- if (NULL == texture) { |
+ if (NULL == dst) { |
+ return false; |
+ } |
+ GrDrawContext* dstDrawContext = context->drawContext(dst->asRenderTarget()); |
+ if (!dstDrawContext) { |
return false; |
} |
- apply_morphology_pass(drawContext, texture->asRenderTarget(), clip, srcTexture, |
+ dstDrawContext->uses(srcTexture); |
+ |
+ apply_morphology_pass(dstDrawContext, dst->asRenderTarget(), clip, srcTexture, |
srcRect, dstRect, radius.fWidth, morphType, |
Gr1DKernelEffect::kX_Direction); |
SkIRect clearRect = SkIRect::MakeXYWH(dstRect.fLeft, dstRect.fBottom, |
@@ -686,20 +689,34 @@ bool apply_morphology(const SkBitmap& input, |
GrColor clearColor = GrMorphologyEffect::kErode_MorphologyType == morphType ? |
SK_ColorWHITE : |
SK_ColorTRANSPARENT; |
- drawContext->clear(texture->asRenderTarget(), &clearRect, clearColor, false); |
- srcTexture.reset(texture); |
+ dstDrawContext->clear(dst->asRenderTarget(), &clearRect, clearColor, false); |
+ |
+ srcDrawContext = dstDrawContext; |
+ srcTexture.reset(dst); |
srcRect = dstRect; |
} |
if (radius.fHeight > 0) { |
- GrTexture* texture = context->textureProvider()->refScratchTexture(desc, |
+ GrTexture* dst = context->textureProvider()->refScratchTexture(desc, |
GrTextureProvider::kApprox_ScratchTexMatch); |
- if (NULL == texture) { |
+ if (NULL == dst) { |
return false; |
} |
- apply_morphology_pass(drawContext, texture->asRenderTarget(), clip, srcTexture, |
+ GrDrawContext* dstDrawContext = context->drawContext(dst->asRenderTarget()); |
+ if (!dstDrawContext) { |
+ return false; |
+ } |
+ if (srcDrawContext) { |
+ dstDrawContext->uses(srcDrawContext); |
+ } else { |
+ dstDrawContext->uses(srcTexture); |
+ } |
+ |
+ apply_morphology_pass(dstDrawContext, dst->asRenderTarget(), clip, srcTexture, |
srcRect, dstRect, radius.fHeight, morphType, |
Gr1DKernelEffect::kY_Direction); |
- srcTexture.reset(texture); |
+ |
+ srcDrawContext = dstDrawContext; |
+ srcTexture.reset(dst); |
} |
SkImageFilter::WrapTexture(srcTexture, rect.width(), rect.height(), dst); |
return true; |
@@ -715,7 +732,8 @@ bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate, |
SkIPoint* offset) const { |
SkBitmap input = src; |
SkIPoint srcOffset = SkIPoint::Make(0, 0); |
- if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctx, &input, &srcOffset)) { |
+ if (this->getInput(0) && |
+ !this->getInput(0)->getInputResultGPU(proxy, src, ctx, &input, &srcOffset)) { |
return false; |
} |
SkIRect bounds; |
@@ -741,9 +759,9 @@ bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate, |
return true; |
} |
- GrMorphologyEffect::MorphologyType type = dilate ? GrMorphologyEffect::kDilate_MorphologyType : GrMorphologyEffect::kErode_MorphologyType; |
- if (!apply_morphology(input, srcBounds, type, |
- SkISize::Make(width, height), result)) { |
+ GrMorphologyEffect::MorphologyType type = dilate ? GrMorphologyEffect::kDilate_MorphologyType |
+ : GrMorphologyEffect::kErode_MorphologyType; |
+ if (!apply_morphology(input, srcBounds, type, SkISize::Make(width, height), result)) { |
return false; |
} |
offset->fX = bounds.left(); |