static void TestBitmapSerialization(const SkBitmap& validBitmap, const SkBitmap& invalidBitmap, bool shouldSucceed, skiatest::Reporter* reporter) { sk_sp<SkImage> validImage(SkImage::MakeFromBitmap(validBitmap)); sk_sp<SkImageFilter> validBitmapSource(SkImageSource::Make(std::move(validImage))); sk_sp<SkImage> invalidImage(SkImage::MakeFromBitmap(invalidBitmap)); sk_sp<SkImageFilter> invalidBitmapSource(SkImageSource::Make(std::move(invalidImage))); sk_sp<SkImageFilter> xfermodeImageFilter( SkXfermodeImageFilter::Make(SkBlendMode::kSrcOver, std::move(invalidBitmapSource), std::move(validBitmapSource), nullptr)); sk_sp<SkImageFilter> deserializedFilter( TestFlattenableSerialization<SkImageFilter>( xfermodeImageFilter.get(), shouldSucceed, reporter)); // Try to render a small bitmap using the invalid deserialized filter // to make sure we don't crash while trying to render it if (shouldSucceed) { SkBitmap bitmap; bitmap.allocN32Pixels(24, 24); SkCanvas canvas(bitmap); canvas.clear(0x00000000); SkPaint paint; paint.setImageFilter(deserializedFilter); canvas.clipRect(SkRect::MakeXYWH(0, 0, SkIntToScalar(24), SkIntToScalar(24))); canvas.drawBitmap(bitmap, 0, 0, &paint); } }
static void TestBitmapSerialization(const SkBitmap& validBitmap, const SkBitmap& invalidBitmap, bool shouldSucceed, skiatest::Reporter* reporter) { SkBitmapSource validBitmapSource(validBitmap); SkBitmapSource invalidBitmapSource(invalidBitmap); SkAutoTUnref<SkXfermode> mode(SkXfermode::Create(SkXfermode::kSrcOver_Mode)); SkXfermodeImageFilter xfermodeImageFilter(mode, &invalidBitmapSource, &validBitmapSource); SkAutoTUnref<SkImageFilter> deserializedFilter( TestFlattenableSerialization<SkImageFilter>( &xfermodeImageFilter, shouldSucceed, reporter)); // Try to render a small bitmap using the invalid deserialized filter // to make sure we don't crash while trying to render it if (shouldSucceed) { SkBitmap bitmap; bitmap.setConfig(SkBitmap::kARGB_8888_Config, 24, 24); bitmap.allocPixels(); SkBitmapDevice device(bitmap); SkCanvas canvas(&device); canvas.clear(0x00000000); SkPaint paint; paint.setImageFilter(deserializedFilter); canvas.clipRect(SkRect::MakeXYWH(0, 0, SkIntToScalar(24), SkIntToScalar(24))); canvas.drawBitmap(bitmap, 0, 0, &paint); } }