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
This commit is contained in:
parent
014f06b726
commit
45eefcfec2
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user