diff options
Diffstat (limited to 'src/effects/SkMorphologyImageFilter.cpp')
-rw-r--r-- | src/effects/SkMorphologyImageFilter.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp index 4e08d9dd73..546e6f5d93 100644 --- a/src/effects/SkMorphologyImageFilter.cpp +++ b/src/effects/SkMorphologyImageFilter.cpp @@ -547,7 +547,8 @@ bool apply_morphology(const SkBitmap& input, const SkIRect& rect, GrMorphologyEffect::MorphologyType morphType, SkISize radius, - SkBitmap* dst) { + SkBitmap* dst, + GrTextureProvider::SizeConstraint constraint) { SkAutoTUnref<GrTexture> srcTexture(SkRef(input.getTexture())); SkASSERT(srcTexture); GrContext* context = srcTexture->getContext(); @@ -565,7 +566,14 @@ bool apply_morphology(const SkBitmap& input, SkIRect srcRect = rect; if (radius.fWidth > 0) { - GrTexture* scratch = context->textureProvider()->createApproxTexture(desc); + GrTextureProvider::SizeConstraint horiConstraint = constraint; + if (radius.fHeight > 0) { + // Optimization: we will fall through and allocate the "real" texture after this one + // so ours can be approximate (likely faster to allocate) + horiConstraint = GrTextureProvider::kApprox_SizeConstraint; + } + + GrTexture* scratch = context->textureProvider()->createTexture(desc, horiConstraint); if (nullptr == scratch) { return false; } @@ -589,7 +597,7 @@ bool apply_morphology(const SkBitmap& input, srcRect = dstRect; } if (radius.fHeight > 0) { - GrTexture* scratch = context->textureProvider()->createApproxTexture(desc); + GrTexture* scratch = context->textureProvider()->createTexture(desc, constraint); if (nullptr == scratch) { return false; } @@ -647,7 +655,8 @@ bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate, GrMorphologyEffect::MorphologyType type = dilate ? GrMorphologyEffect::kDilate_MorphologyType : GrMorphologyEffect::kErode_MorphologyType; - if (!apply_morphology(input, srcBounds, type, SkISize::Make(width, height), result)) { + if (!apply_morphology(input, srcBounds, type, SkISize::Make(width, height), result, + GrTextureProvider::FromImageFilter(ctx.sizeConstraint()))) { return false; } offset->fX = bounds.left(); |