aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bsalomon <bsalomon@google.com>2016-01-05 08:39:28 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-01-05 08:39:28 -0800
commit45eefcfec26ee48c0b2ee1d316aae3c3dc529145 (patch)
treefddf92b7f2c5ed98eadbd83eda48642bb1d5381c
parent014f06b726267dff5ca1ce094affd605e041fac3 (diff)
Add null check for bmp->tex result in SkImageFilter::filterInputGpu
-rw-r--r--src/core/SkImageFilter.cpp5
-rw-r--r--tests/ImageFilterTest.cpp54
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