Add raw pixel serialization fallback for SkImages that cannot be encoded.
This fixes serialize-8888 for 2 GMs on Mac that I'm now unblacklisting.
I think another was already fixed, and two more were Windows-only.
Seems safe to use encoded_size=1 as another sentinel here (like we already
use =0); I can't imagine any encoded image format that can encode an image
in a single byte.
I suspect this is the root of the referenced bug too,
but this is a good idea even if not.
BUG=chromium:601851
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2039813007
CQ_EXTRA_TRYBOTS=client.skia:Test-Win-MSVC-GCE-CPU-AVX2-x86_64-Release-Trybot,Test-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release-Trybot;client.skia.android:Test-Android-GCC-Nexus5-CPU-NEON-Arm7-Release-Trybot,Test-Android-GCC-Nexus9-CPU-Denver-Arm64-Release-Trybot
Review-Url: https://codereview.chromium.org/2039813007
diff --git a/src/core/SkReadBuffer.cpp b/src/core/SkReadBuffer.cpp
index f55a5b0..54f684a 100644
--- a/src/core/SkReadBuffer.cpp
+++ b/src/core/SkReadBuffer.cpp
@@ -276,12 +276,29 @@
return nullptr;
}
- sk_sp<SkData> encoded(this->readByteArrayAsData());
- if (encoded->size() == 0) {
- // The image could not be encoded at serialization time - return an empty placeholder.
+ auto placeholder = [=] {
return SkImage::MakeFromGenerator(
new EmptyImageGenerator(SkImageInfo::MakeN32Premul(width, height))).release();
+ };
+
+ uint32_t encoded_size = this->getArrayCount();
+ if (encoded_size == 0) {
+ // The image could not be encoded at serialization time - return an empty placeholder.
+ (void)this->readUInt(); // Swallow that encoded_size == 0 sentinel.
+ return placeholder();
}
+ if (encoded_size == 1) {
+ // We had to encode the image as raw pixels via SkBitmap.
+ (void)this->readUInt(); // Swallow that encoded_size == 1 sentinel.
+ SkBitmap bm;
+ if (SkBitmap::ReadRawPixels(this, &bm)) {
+ return SkImage::MakeFromBitmap(bm).release();
+ }
+ return placeholder();
+ }
+
+ // The SkImage encoded itself.
+ sk_sp<SkData> encoded(this->readByteArrayAsData());
int originX = this->read32();
int originY = this->read32();
diff --git a/src/core/SkWriteBuffer.cpp b/src/core/SkWriteBuffer.cpp
index 060bd43..ccf1f37 100644
--- a/src/core/SkWriteBuffer.cpp
+++ b/src/core/SkWriteBuffer.cpp
@@ -182,6 +182,13 @@
return;
}
+ SkBitmap bm;
+ if (image->asLegacyBitmap(&bm, SkImage::kRO_LegacyBitmapMode)) {
+ this->writeUInt(1); // signal raw pixels.
+ SkBitmap::WriteRawPixels(this, bm);
+ return;
+ }
+
this->writeUInt(0); // signal no pixels (in place of the size of the encoded data)
}
diff --git a/tools/dm_flags.json b/tools/dm_flags.json
index 9f04b97..66ebb5f 100644
--- a/tools/dm_flags.json
+++ b/tools/dm_flags.json
@@ -77,22 +77,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -129,11 +117,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -229,22 +217,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -281,11 +257,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -478,22 +454,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -530,11 +494,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -725,22 +689,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -777,11 +729,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -975,22 +927,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -1027,11 +967,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -1218,22 +1158,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -1270,11 +1198,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -1463,22 +1391,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -1515,11 +1431,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -1704,22 +1620,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -1756,11 +1660,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -1892,22 +1796,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -1941,14 +1833,6 @@
"gm",
"_",
"fontmgr_iter",
- "serialize-8888",
- "gm",
- "_",
- "verylargebitmap",
- "serialize-8888",
- "gm",
- "_",
- "verylarge_picture_image",
"sp-8888",
"gm",
"_",
@@ -2165,22 +2049,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -2214,14 +2086,6 @@
"gm",
"_",
"fontmgr_iter",
- "serialize-8888",
- "gm",
- "_",
- "verylargebitmap",
- "serialize-8888",
- "gm",
- "_",
- "verylarge_picture_image",
"sp-8888",
"gm",
"_",
@@ -2442,22 +2306,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -2491,14 +2343,6 @@
"gm",
"_",
"fontmgr_iter",
- "serialize-8888",
- "gm",
- "_",
- "verylargebitmap",
- "serialize-8888",
- "gm",
- "_",
- "verylarge_picture_image",
"sp-8888",
"gm",
"_",
@@ -2599,22 +2443,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -2651,11 +2483,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -2759,22 +2591,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -2811,11 +2631,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -2938,22 +2758,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -2990,11 +2798,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -3114,22 +2922,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -3166,11 +2962,11 @@
"serialize-8888",
"gm",
"_",
- "verylargebitmap",
+ "bleed_alpha_image",
"serialize-8888",
"gm",
"_",
- "verylarge_picture_image",
+ "bleed_alpha_image_shader",
"sp-8888",
"gm",
"_",
@@ -3413,22 +3209,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -3465,6 +3249,14 @@
"serialize-8888",
"gm",
"_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "serialize-8888",
+ "gm",
+ "_",
"verylargebitmap",
"serialize-8888",
"gm",
@@ -3602,22 +3394,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -3654,6 +3434,14 @@
"serialize-8888",
"gm",
"_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "serialize-8888",
+ "gm",
+ "_",
"verylargebitmap",
"serialize-8888",
"gm",
@@ -3902,22 +3690,10 @@
"serialize-8888",
"gm",
"_",
- "not_native32_bitmap_config",
- "serialize-8888",
- "gm",
- "_",
"bleed_image",
"serialize-8888",
"gm",
"_",
- "bleed_alpha_image",
- "serialize-8888",
- "gm",
- "_",
- "bleed_alpha_image_shader",
- "serialize-8888",
- "gm",
- "_",
"c_gms",
"serialize-8888",
"gm",
@@ -3954,6 +3730,14 @@
"serialize-8888",
"gm",
"_",
+ "bleed_alpha_image",
+ "serialize-8888",
+ "gm",
+ "_",
+ "bleed_alpha_image_shader",
+ "serialize-8888",
+ "gm",
+ "_",
"verylargebitmap",
"serialize-8888",
"gm",
diff --git a/tools/dm_flags.py b/tools/dm_flags.py
index baed46d..de81f2f 100755
--- a/tools/dm_flags.py
+++ b/tools/dm_flags.py
@@ -163,10 +163,7 @@
blacklist.extend('_ gm _ composeshader_bitmap'.split(' '))
# skia:4095
- for test in ['not_native32_bitmap_config',
- 'bleed_image',
- 'bleed_alpha_image',
- 'bleed_alpha_image_shader',
+ for test in ['bleed_image',
'c_gms',
'colortype',
'colortype_xfermodes',
@@ -175,10 +172,15 @@
'fontmgr_bounds_1_-0.25',
'fontmgr_bounds',
'fontmgr_match',
- 'fontmgr_iter',
- 'verylargebitmap', # Windows only.
- 'verylarge_picture_image']: # Windows only.
+ 'fontmgr_iter']:
blacklist.extend(['serialize-8888', 'gm', '_', test])
+ if 'Mac' not in bot:
+ for test in ['bleed_alpha_image', 'bleed_alpha_image_shader']:
+ blacklist.extend(['serialize-8888', 'gm', '_', test])
+ if 'Win' in bot:
+ for test in ['verylargebitmap', 'verylarge_picture_image']:
+ blacklist.extend(['serialize-8888', 'gm', '_', test])
+
# skia:4769
for test in ['drawfilter']:
blacklist.extend([ 'sp-8888', 'gm', '_', test])
@@ -238,7 +240,7 @@
match.extend(['~Once', '~Shared']) # Not sure what's up with these tests.
if 'TSAN' in bot:
- match.extend(['~ReadWriteAlpha']) # Flaky on TSAN-covered on nvidia bots.
+ match.extend(['~ReadWriteAlpha']) # Flaky on TSAN-covered on nvidia bots.
if blacklist:
args.append('--blacklist')