From 9f1c403362d8de6038328c7238b6ac56be552324 Mon Sep 17 00:00:00 2001 From: Matt Sarett Date: Wed, 17 May 2017 10:06:32 -0400 Subject: [PATCH] Add tool to create test images with interesting color profiles Bug: skia: Change-Id: Ia4f892368fceda4a99490f5bd29851837a7a6927 Reviewed-on: https://skia-review.googlesource.com/17212 Reviewed-by: Brian Osman Commit-Queue: Matt Sarett --- BUILD.gn | 10 +++++ resources/flutter_logo.jpg | Bin 0 -> 12302 bytes tools/create_flutter_test_images.cpp | 82 +++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 resources/flutter_logo.jpg create mode 100644 tools/create_flutter_test_images.cpp diff --git a/BUILD.gn b/BUILD.gn index d301924..19691ed 100644 --- 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 index 0000000000000000000000000000000000000000..f049c22506c40e2aaca25d5f494c422f844104df GIT binary patch literal 12302 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 N8whM5@c#{g{{R4-)1m+X literal 0 HcmV?d00001 diff --git a/tools/create_flutter_test_images.cpp b/tools/create_flutter_test_images.cpp new file mode 100644 index 0000000..69a0d11 --- /dev/null +++ b/tools/create_flutter_test_images.cpp @@ -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 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 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 wide_gamut_color_space() { + return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, + SkColorSpace::kRec2020_Gamut); +} + +int main(int argc, char** argv) { + sk_sp 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 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; +} -- 2.7.4