diff options
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index c4e0ebecd1..45dac336ea 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -913,9 +913,7 @@ static bool drawWithGPUMaskFilter(GrContext* context, const SkPath& path, GrClip oldClip = context->getClip(); context->setRenderTarget(dstTexture->asRenderTarget()); context->setClip(srcRect); - // FIXME: could just clear bounds context->clear(NULL, 0); - GrMatrix transM; GrPaint tempPaint; tempPaint.reset(); @@ -959,9 +957,6 @@ static bool drawWithGPUMaskFilter(GrContext* context, const SkPath& path, context->setRenderTarget(dstTexture->asRenderTarget()); SkRect dstRect(srcRect); scaleRect(&dstRect, 0.5f); - // Clear out 1 pixel border for linear filtering. - // FIXME: for now, clear everything - context->clear(NULL, 0); paint.setTexture(0, srcTexture); context->drawRectToRect(paint, dstRect, srcRect); srcRect = dstRect; @@ -972,25 +967,41 @@ static bool drawWithGPUMaskFilter(GrContext* context, const SkPath& path, float* kernel = kernelStorage.get(); buildKernel(sigma, kernel, kernelWidth); + // Clear out a halfWidth to the right of the srcRect to prevent the + // X convolution from reading garbage. + SkIRect clearRect = SkIRect::MakeXYWH( + srcRect.fRight, srcRect.fTop, halfWidth, srcRect.height()); + context->clear(&clearRect, 0x0); + context->setRenderTarget(dstTexture->asRenderTarget()); - context->clear(NULL, 0); context->convolveInX(srcTexture, srcRect, kernel, kernelWidth); SkTSwap(srcTexture, dstTexture); + // Clear out a halfWidth below the srcRect to prevent the Y + // convolution from reading garbage. + clearRect = SkIRect::MakeXYWH( + srcRect.fLeft, srcRect.fBottom, srcRect.width(), halfWidth); + context->clear(&clearRect, 0x0); + context->setRenderTarget(dstTexture->asRenderTarget()); - context->clear(NULL, 0); context->convolveInY(srcTexture, srcRect, kernel, kernelWidth); SkTSwap(srcTexture, dstTexture); + // Clear one pixel to the right and below, to accommodate bilinear + // upsampling. + clearRect = SkIRect::MakeXYWH( + srcRect.fLeft, srcRect.fBottom, srcRect.width() + 1, 1); + context->clear(&clearRect, 0x0); + clearRect = SkIRect::MakeXYWH( + srcRect.fRight, srcRect.fTop, 1, srcRect.height()); + context->clear(&clearRect, 0x0); + if (scaleFactor > 1) { // FIXME: This should be mitchell, not bilinear. paint.getTextureSampler(0)->setFilter(GrSamplerState::kBilinear_Filter); sampleM.setIDiv(srcTexture->width(), srcTexture->height()); paint.getTextureSampler(0)->setMatrix(sampleM); context->setRenderTarget(dstTexture->asRenderTarget()); - // Clear out 2 pixel border for bicubic filtering. - // FIXME: for now, clear everything - context->clear(NULL, 0); paint.setTexture(0, srcTexture); SkRect dstRect(srcRect); scaleRect(&dstRect, scaleFactor); |