add savelayer flag to promote the later to half-float

Bug: skia:9256
Change-Id: Ifd7846349f83854e860306bd475cfba0adeddcb5
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/227066
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
diff --git a/gm/savelayer.cpp b/gm/savelayer.cpp
index 5a6a8df..c948ca9 100644
--- a/gm/savelayer.cpp
+++ b/gm/savelayer.cpp
@@ -440,3 +440,32 @@
         canvas->translate(430, 0);
     }
 }
+
+#include "include/effects/SkGradientShader.h"
+
+DEF_SIMPLE_GM(savelayer_f16, canvas, 900, 300) {
+    int n = 15;
+    SkRect r{0, 0, 300, 300};
+    SkPaint paint;
+
+    const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorRED };
+    paint.setShader(SkGradientShader::MakeSweep(r.centerX(), r.centerY(),
+                                                colors, nullptr, SK_ARRAY_COUNT(colors)));
+
+    canvas->drawOval(r, paint);
+
+    paint.setAlphaf(1.0f/n);
+    paint.setBlendMode(SkBlendMode::kPlus);
+
+    for (auto flags : {0, (int)SkCanvas::kF16ColorType}) {
+        canvas->translate(r.width(), 0);
+
+        SkCanvas::SaveLayerRec rec;
+        rec.fSaveLayerFlags = flags;
+        canvas->saveLayer(rec);
+        for (int i = 0; i < n; ++i) {
+            canvas->drawOval(r, paint);
+        }
+        canvas->restore();
+    }
+}
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
index 8129b02..1e92ac7 100644
--- a/include/core/SkCanvas.h
+++ b/include/core/SkCanvas.h
@@ -578,7 +578,8 @@
         kInitWithPrevious_SaveLayerFlag = 1 << 2, //!< initializes with previous contents
         kMaskAgainstCoverage_EXPERIMENTAL_DONT_USE_SaveLayerFlag =
                                           1 << 3, //!< experimental: do not use
-
+        // instead of matching previous layer's colortype, use F16
+        kF16ColorType                   = 1 << 4,
 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG
         kDontClipToLayer_Legacy_SaveLayerFlag =
            kDontClipToLayer_PrivateSaveLayerFlag, //!< deprecated
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 195a800..b6e9d19 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1079,6 +1079,9 @@
     }
 
     SkImageInfo info = make_layer_info(priorDevice->imageInfo(), ir.width(), ir.height(), paint);
+    if (rec.fSaveLayerFlags & kF16ColorType) {
+        info = info.makeColorType(kRGBA_F16_SkColorType);
+    }
 
     sk_sp<SkBaseDevice> newDevice;
     {