| Index: src/effects/SkBlurImageFilter.cpp
|
| diff --git a/src/effects/SkBlurImageFilter.cpp b/src/effects/SkBlurImageFilter.cpp
|
| index 10c8a0b17b183bafd23cd36bf5fb7ac83c9352d1..4442b7e3463cfa4be076977ded647bae2309332f 100644
|
| --- a/src/effects/SkBlurImageFilter.cpp
|
| +++ b/src/effects/SkBlurImageFilter.cpp
|
| @@ -95,7 +95,11 @@ sk_sp<SkSpecialImage> SkBlurImageFilter::onFilterImage(SkSpecialImage* source,
|
| const SkVector sigma = map_sigma(fSigma, ctx.ctm());
|
|
|
| #if SK_SUPPORT_GPU
|
| - if (input->peekTexture() && input->peekTexture()->getContext()) {
|
| + if (source->isTextureBacked()) {
|
| + GrContext* context = source->getContext();
|
| + GrTexture* inputTexture = input->asTextureRef(context);
|
| + SkASSERT(inputTexture);
|
| +
|
| if (0 == sigma.x() && 0 == sigma.y()) {
|
| offset->fX = inputBounds.x();
|
| offset->fY = inputBounds.y();
|
| @@ -103,14 +107,12 @@ sk_sp<SkSpecialImage> SkBlurImageFilter::onFilterImage(SkSpecialImage* source,
|
| -inputOffset.y()));
|
| }
|
|
|
| - GrTexture* inputTexture = input->peekTexture();
|
| -
|
| offset->fX = dstBounds.fLeft;
|
| offset->fY = dstBounds.fTop;
|
| inputBounds.offset(-inputOffset);
|
| dstBounds.offset(-inputOffset);
|
| SkRect inputBoundsF(SkRect::Make(inputBounds));
|
| - SkAutoTUnref<GrTexture> tex(SkGpuBlurUtils::GaussianBlur(inputTexture->getContext(),
|
| + SkAutoTUnref<GrTexture> tex(SkGpuBlurUtils::GaussianBlur(context,
|
| inputTexture,
|
| false,
|
| source->props().allowSRGBInputs(),
|
| @@ -145,39 +147,39 @@ sk_sp<SkSpecialImage> SkBlurImageFilter::onFilterImage(SkSpecialImage* source,
|
| -inputOffset.y()));
|
| }
|
|
|
| - SkPixmap inputPixmap;
|
| + SkBitmap inputBM;
|
|
|
| - if (!input->peekPixels(&inputPixmap)) {
|
| + if (!input->getROPixels(&inputBM)) {
|
| return nullptr;
|
| }
|
|
|
| - if (inputPixmap.colorType() != kN32_SkColorType) {
|
| + if (inputBM.colorType() != kN32_SkColorType) {
|
| return nullptr;
|
| }
|
|
|
| SkImageInfo info = SkImageInfo::Make(dstBounds.width(), dstBounds.height(),
|
| - inputPixmap.colorType(), inputPixmap.alphaType());
|
| + inputBM.colorType(), inputBM.alphaType());
|
|
|
| SkBitmap tmp, dst;
|
| if (!tmp.tryAllocPixels(info) || !dst.tryAllocPixels(info)) {
|
| return nullptr;
|
| }
|
|
|
| - SkAutoLockPixels tmpLock(tmp), dstLock(dst);
|
| + SkAutoLockPixels inputLock(inputBM), tmpLock(tmp), dstLock(dst);
|
|
|
| offset->fX = dstBounds.fLeft;
|
| offset->fY = dstBounds.fTop;
|
| SkPMColor* t = tmp.getAddr32(0, 0);
|
| SkPMColor* d = dst.getAddr32(0, 0);
|
| int w = dstBounds.width(), h = dstBounds.height();
|
| - const SkPMColor* s = inputPixmap.addr32(inputBounds.x() - inputOffset.x(),
|
| - inputBounds.y() - inputOffset.y());
|
| + const SkPMColor* s = inputBM.getAddr32(inputBounds.x() - inputOffset.x(),
|
| + inputBounds.y() - inputOffset.y());
|
| inputBounds.offset(-dstBounds.x(), -dstBounds.y());
|
| dstBounds.offset(-dstBounds.x(), -dstBounds.y());
|
| SkIRect inputBoundsT = SkIRect::MakeLTRB(inputBounds.top(), inputBounds.left(),
|
| inputBounds.bottom(), inputBounds.right());
|
| SkIRect dstBoundsT = SkIRect::MakeWH(dstBounds.height(), dstBounds.width());
|
| - int sw = int(inputPixmap.rowBytes() >> 2);
|
| + int sw = int(inputBM.rowBytes() >> 2);
|
|
|
| /**
|
| *
|
|
|