Add tool to create test images with interesting color profiles
authorMatt Sarett <msarett@google.com>
Wed, 17 May 2017 14:06:32 +0000 (10:06 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Wed, 17 May 2017 18:15:20 +0000 (18:15 +0000)
Bug: skia:
Change-Id: Ia4f892368fceda4a99490f5bd29851837a7a6927
Reviewed-on: https://skia-review.googlesource.com/17212
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Matt Sarett <msarett@google.com>

BUILD.gn
resources/flutter_logo.jpg [new file with mode: 0644]
tools/create_flutter_test_images.cpp [new file with mode: 0644]

index d301924..19691ed 100644 (file)
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1290,6 +1290,16 @@ if (skia_enable_tools) {
     ]
   }
 
+  test_app("create_flutter_test_images") {
+    sources = [
+      "tools/create_flutter_test_images.cpp",
+    ]
+    deps = [
+      ":skia",
+      ":tool_utils",
+    ]
+  }
+
   test_app("get_images_from_skps") {
     sources = [
       "tools/get_images_from_skps.cpp",
diff --git a/resources/flutter_logo.jpg b/resources/flutter_logo.jpg
new file mode 100644 (file)
index 0000000..f049c22
Binary files /dev/null and b/resources/flutter_logo.jpg differ
diff --git a/tools/create_flutter_test_images.cpp b/tools/create_flutter_test_images.cpp
new file mode 100644 (file)
index 0000000..69a0d11
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkColorSpacePriv.h"
+#include "SkImage.h"
+#include "SkPngEncoder.h"
+
+#include "Resources.h"
+
+/**
+ *  Create a color space that swaps the red, green, and blue channels.
+ */
+static sk_sp<SkColorSpace> gbr_color_space() {
+    float gbr[9];
+    gbr[0] = gSRGB_toXYZD50[1];
+    gbr[1] = gSRGB_toXYZD50[2];
+    gbr[2] = gSRGB_toXYZD50[0];
+    gbr[3] = gSRGB_toXYZD50[4];
+    gbr[4] = gSRGB_toXYZD50[5];
+    gbr[5] = gSRGB_toXYZD50[3];
+    gbr[6] = gSRGB_toXYZD50[7];
+    gbr[7] = gSRGB_toXYZD50[8];
+    gbr[8] = gSRGB_toXYZD50[6];
+    SkMatrix44 toXYZD50(SkMatrix44::kUninitialized_Constructor);
+    toXYZD50.set3x3RowMajorf(gbr);
+    return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, toXYZD50);
+}
+
+/**
+ *  Create a color space with a steep transfer function.
+ */
+static sk_sp<SkColorSpace> tf_color_space() {
+    SkColorSpaceTransferFn fn;
+    fn.fA = 1.f; fn.fB = 0.f; fn.fC = 0.f; fn.fD = 0.f; fn.fE = 0.f; fn.fF = 0.f; fn.fG = 50.f;
+    return SkColorSpace::MakeRGB(fn, SkColorSpace::kSRGB_Gamut);
+}
+
+/**
+ *  Create a wide gamut color space.
+ */
+static sk_sp<SkColorSpace> wide_gamut_color_space() {
+    return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
+                                 SkColorSpace::kRec2020_Gamut);
+}
+
+int main(int argc, char** argv) {
+    sk_sp<SkImage> image = GetResourceAsImage("flutter_logo.jpg");
+    if (!image) {
+        SkDebugf("Cannot find flutter_logo.jpg in resources.\n");
+        return 1;
+    }
+
+    // Encode an image with a gbr color space.
+    SkImageInfo info = SkImageInfo::MakeN32(image->width(), image->height(), kOpaque_SkAlphaType,
+                                            gbr_color_space());
+    size_t rowBytes = info.minRowBytes();
+    SkAutoTMalloc<uint8_t> storage(rowBytes * image->height());
+    SkPixmap src(info, storage.get(), rowBytes);
+    image->readPixels(src, 0, 0, SkImage::kDisallow_CachingHint);
+    SkFILEWStream dst0("gbr.png");
+    SkPngEncoder::Options opts;
+    opts.fUnpremulBehavior = SkTransferFunctionBehavior::kIgnore; // Does not matter for opaque src
+    SkAssertResult(SkPngEncoder::Encode(&dst0, src, opts));
+
+    // Encode an image with steep transfer function.
+    src.setColorSpace(tf_color_space());
+    image->readPixels(src, 0, 0, SkImage::kDisallow_CachingHint);
+    SkFILEWStream dst1("tf.png");
+    SkAssertResult(SkPngEncoder::Encode(&dst1, src, opts));
+
+    // Encode a wide gamut image.
+    src.setColorSpace(wide_gamut_color_space());
+    image->readPixels(src, 0, 0, SkImage::kDisallow_CachingHint);
+    SkFILEWStream dst2("wide-gamut.png");
+    SkAssertResult(SkPngEncoder::Encode(&dst2, src, opts));
+
+    return 0;
+}