diff options
author | bsalomon <bsalomon@google.com> | 2016-01-05 08:39:28 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-05 08:39:28 -0800 |
commit | 45eefcfec26ee48c0b2ee1d316aae3c3dc529145 (patch) | |
tree | fddf92b7f2c5ed98eadbd83eda48642bb1d5381c | |
parent | 014f06b726267dff5ca1ce094affd605e041fac3 (diff) |
Add null check for bmp->tex result in SkImageFilter::filterInputGpu
BUG=chromium:570479
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1555333002
Review URL: https://codereview.chromium.org/1555333002
-rw-r--r-- | src/core/SkImageFilter.cpp | 5 | ||||
-rw-r--r-- | tests/ImageFilterTest.cpp | 54 |
2 files changed, 58 insertions, 1 deletions
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp index eec6d3a7e8..95988f844c 100644 --- a/src/core/SkImageFilter.cpp +++ b/src/core/SkImageFilter.cpp @@ -544,7 +544,10 @@ bool SkImageFilter::filterInputGPU(int index, SkImageFilter::Proxy* proxy, return false; } SkAutoTUnref<GrTexture> resultTex( - GrRefCachedBitmapTexture(context, *result,GrTextureParams::ClampNoFilter())); + GrRefCachedBitmapTexture(context, *result, GrTextureParams::ClampNoFilter())); + if (!resultTex) { + return false; + } result->setPixelRef(new SkGrPixelRef(info, resultTex))->unref(); } return true; diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp index 1bf8cbdb73..fa1569d89a 100644 --- a/tests/ImageFilterTest.cpp +++ b/tests/ImageFilterTest.cpp @@ -1261,6 +1261,53 @@ DEF_TEST(ImageFilterImageSourceSerialization, reporter) { REPORTER_ASSERT(reporter, *bm.getAddr32(0, 0) == SkPreMultiplyColor(SK_ColorGREEN)); } +static void test_large_blur_input(skiatest::Reporter* reporter, SkCanvas* canvas) { + SkBitmap largeBmp; + int largeW = 5000; + int largeH = 5000; +#if SK_SUPPORT_GPU + // If we're GPU-backed make the bitmap too large to be converted into a texture. + if (GrContext* ctx = canvas->getGrContext()) { + largeW = ctx->caps()->maxTextureSize() + 1; + } +#endif + + largeBmp.allocN32Pixels(largeW, largeH); + if (!largeBmp.getPixels()) { + ERRORF(reporter, "Failed to allocate large bmp."); + return; + } + + SkAutoTUnref<SkImage> largeImage(SkImage::NewFromBitmap(largeBmp)); + if (!largeImage) { + ERRORF(reporter, "Failed to create large image."); + return; + } + + SkAutoTUnref<SkImageFilter> largeSource(SkImageSource::Create(largeImage)); + if (!largeSource) { + ERRORF(reporter, "Failed to create large SkImageSource."); + return; + } + + SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(10.f, 10.f, largeSource)); + if (!blur) { + ERRORF(reporter, "Failed to create SkBlurImageFilter."); + return; + } + + SkPaint paint; + paint.setImageFilter(blur); + + // This should not crash (http://crbug.com/570479). + canvas->drawRect(SkRect::MakeIWH(largeW, largeH), paint); +} + +DEF_TEST(BlurLargeImage, reporter) { + SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(SkImageInfo::MakeN32Premul(100, 100))); + test_large_blur_input(reporter, surface->getCanvas()); +} + #if SK_SUPPORT_GPU DEF_GPUTEST_FOR_NATIVE_CONTEXT(ImageFilterCropRect_Gpu, reporter, context) { @@ -1318,4 +1365,11 @@ DEF_GPUTEST_FOR_NATIVE_CONTEXT(TestNegativeBlurSigma_Gpu, reporter, context) { test_negative_blur_sigma(&proxy, reporter); } + +DEF_GPUTEST_FOR_ALL_CONTEXTS(BlurLargeImage_Gpu, reporter, context) { + SkAutoTUnref<SkSurface> surface( + SkSurface::NewRenderTarget(context, SkSurface::kYes_Budgeted, + SkImageInfo::MakeN32Premul(100, 100))); + test_large_blur_input(reporter, surface->getCanvas()); +} #endif |