Add color space to picture image as a creation parameter

This gives a picture image a preferred "native" color space, which
facilitates caching and other things.

BUG=skia:

Change-Id: I95988c14d17f96d7d870b3d1c3b723c36e2c170d
Reviewed-on: https://skia-review.googlesource.com/6158
Reviewed-by: Mike Reed <reed@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/gm/image.cpp b/gm/image.cpp
index c1d3372..0bdd994 100644
--- a/gm/image.cpp
+++ b/gm/image.cpp
@@ -246,7 +246,8 @@
     SkPictureRecorder recorder;
     draw(recorder.beginRecording(SkRect::MakeIWH(info.width(), info.height())));
     return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(),
-                                    info.dimensions(), nullptr, nullptr);
+                                    info.dimensions(), nullptr, nullptr,
+                                    SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
 }
 
 static sk_sp<SkImage> make_codec(const SkImageInfo& info, GrContext*, void (*draw)(SkCanvas*)) {
@@ -343,7 +344,8 @@
     SkPictureRecorder recorder;
     draw_opaque_contents(recorder.beginRecording(SkRect::MakeIWH(info.width(), info.height())));
     sk_sp<SkPicture> pict(recorder.finishRecordingAsPicture());
-    return SkImageGenerator::NewFromPicture(info.dimensions(), pict.get(), nullptr, nullptr);
+    return SkImageGenerator::NewFromPicture(info.dimensions(), pict.get(), nullptr, nullptr,
+                                            SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
 }
 
 static SkImageGenerator* gen_png(const SkImageInfo& info) {
diff --git a/gm/image_pict.cpp b/gm/image_pict.cpp
index d2e1eba..229f3c5 100644
--- a/gm/image_pict.cpp
+++ b/gm/image_pict.cpp
@@ -62,14 +62,15 @@
 
         // extract enough just for the oval.
         const SkISize size = SkISize::Make(100, 100);
+        auto srgbColorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
 
         SkMatrix matrix;
         matrix.setTranslate(-100, -100);
-        fImage0 = SkImage::MakeFromPicture(fPicture, size, &matrix, nullptr);
+        fImage0 = SkImage::MakeFromPicture(fPicture, size, &matrix, nullptr, srgbColorSpace);
         matrix.postTranslate(-50, -50);
         matrix.postRotate(45);
         matrix.postTranslate(50, 50);
-        fImage1 = SkImage::MakeFromPicture(fPicture, size, &matrix, nullptr);
+        fImage1 = SkImage::MakeFromPicture(fPicture, size, &matrix, nullptr, srgbColorSpace);
     }
 
     void drawSet(SkCanvas* canvas) const {
@@ -107,7 +108,8 @@
 static SkImageGenerator* make_pic_generator(GrContext*, SkPicture* pic) {
     SkMatrix matrix;
     matrix.setTranslate(-100, -100);
-    return SkImageGenerator::NewFromPicture(SkISize::Make(100, 100), pic, &matrix, nullptr);
+    return SkImageGenerator::NewFromPicture(SkISize::Make(100, 100), pic, &matrix, nullptr,
+                                            SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
 }
 
 class RasterGenerator : public SkImageGenerator {
diff --git a/gm/image_shader.cpp b/gm/image_shader.cpp
index 49b1ed5..7803739 100644
--- a/gm/image_shader.cpp
+++ b/gm/image_shader.cpp
@@ -47,7 +47,8 @@
 }
 
 static sk_sp<SkImage> make_pict_gen(GrContext*, SkPicture* pic, const SkImageInfo& info) {
-    return SkImage::MakeFromPicture(sk_ref_sp(pic), info.dimensions(), nullptr, nullptr);
+    return SkImage::MakeFromPicture(sk_ref_sp(pic), info.dimensions(), nullptr, nullptr,
+                                    SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
 }
 
 static sk_sp<SkImage> make_encode_gen(GrContext* ctx, SkPicture* pic, const SkImageInfo& info) {
diff --git a/gm/pictureimagegenerator.cpp b/gm/pictureimagegenerator.cpp
index ab4c808..b247af2 100644
--- a/gm/pictureimagegenerator.cpp
+++ b/gm/pictureimagegenerator.cpp
@@ -138,6 +138,7 @@
             { SkISize::Make(200, 100), -1, -1, 0.5f },
         };
 
+        auto srgbColorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
         const unsigned kDrawsPerRow = 4;
         const SkScalar kDrawSize = 250;
 
@@ -154,10 +155,14 @@
             }
             std::unique_ptr<SkImageGenerator> gen(
                 SkImageGenerator::NewFromPicture(configs[i].size, fPicture.get(), &m,
-                                                 p.getAlpha() != 255 ? &p : nullptr));
+                                                 p.getAlpha() != 255 ? &p : nullptr,
+                                                 srgbColorSpace));
+
+            SkImageInfo bmInfo = gen->getInfo().makeColorSpace(
+                sk_ref_sp(canvas->imageInfo().colorSpace()));
+
             SkBitmap bm;
-            SkAssertResult(gen->tryGenerateBitmap(&bm, SkImageInfo::MakeN32Premul(configs[i].size),
-                                                  nullptr));
+            SkAssertResult(gen->tryGenerateBitmap(&bm, bmInfo, nullptr));
 
             const SkScalar x = kDrawSize * (i % kDrawsPerRow);
             const SkScalar y = kDrawSize * (i / kDrawsPerRow);
diff --git a/gm/verylargebitmap.cpp b/gm/verylargebitmap.cpp
index 08ca481..280d117 100644
--- a/gm/verylargebitmap.cpp
+++ b/gm/verylargebitmap.cpp
@@ -32,7 +32,8 @@
     SkPictureRecorder recorder;
     draw(recorder.beginRecording(SkRect::MakeIWH(width, height)), width, height, colors);
     return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(),
-                                    SkISize::Make(width, height), nullptr, nullptr);
+                                    SkISize::Make(width, height), nullptr, nullptr,
+                                    SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named));
 }
 
 typedef sk_sp<SkImage> (*ImageMakerProc)(int width, int height, SkColor colors[2]);