aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/SkGpuDevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/SkGpuDevice.cpp')
-rw-r--r--src/gpu/SkGpuDevice.cpp31
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);