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')