blob: f82bfa4f8ee6859521770c418968006f3ac2ec23 [file] [log] [blame]
Ravi Mistry113d05f2016-12-17 01:31:03 +00001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Klein5b58b7c2018-05-22 13:47:52 +00008#include "SkTypes.h"
Ravi Mistry113d05f2016-12-17 01:31:03 +00009
Brian Osman8dc68c62018-05-30 12:57:45 -040010#include "Resources.h"
11#include "SkColorSpacePriv.h"
12#include "SkICC.h"
13#include "SkString.h"
14#include "Test.h"
Hal Canary8a001442018-09-19 11:31:27 -040015
Brian Osman8dc68c62018-05-30 12:57:45 -040016#include "../third_party/skcms/skcms.h"
Ravi Mistry113d05f2016-12-17 01:31:03 +000017
Brian Osman8dc68c62018-05-30 12:57:45 -040018DEF_TEST(WriteICCProfile, r) {
19 auto adobeRGB = SkColorSpace::MakeRGB(g2Dot2_TransferFn, SkColorSpace::kAdobeRGB_Gamut);
Mike Klein5b58b7c2018-05-22 13:47:52 +000020
Brian Osman8dc68c62018-05-30 12:57:45 -040021 struct {
22 SkColorSpaceTransferFn fn;
23 const float* toXYZD50;
24 const char* desc;
25 sk_sp<SkColorSpace> want;
26 } tests[] = {
27 {g2Dot2_TransferFn, gAdobeRGB_toXYZD50, "AdobeRGB", adobeRGB},
28 { gSRGB_TransferFn, gSRGB_toXYZD50, "sRGB", SkColorSpace::MakeSRGB()},
29 };
Mike Klein5b58b7c2018-05-22 13:47:52 +000030
Brian Osman8dc68c62018-05-30 12:57:45 -040031 for (auto test : tests) {
32 sk_sp<SkData> profile = SkWriteICCProfile(test.fn, test.toXYZD50);
33 REPORTER_ASSERT(r, profile);
Mike Klein5b58b7c2018-05-22 13:47:52 +000034
Brian Osman8dc68c62018-05-30 12:57:45 -040035 skcms_ICCProfile parsed;
36 REPORTER_ASSERT(r, skcms_Parse(profile->data(), profile->size(), &parsed));
Mike Klein5b58b7c2018-05-22 13:47:52 +000037
Brian Osman8dc68c62018-05-30 12:57:45 -040038 sk_sp<SkColorSpace> got = SkColorSpace::Make(parsed);
39 REPORTER_ASSERT(r, got);
40 REPORTER_ASSERT(r, SkColorSpace::Equals(got.get(), test.want.get()));
Mike Klein5b58b7c2018-05-22 13:47:52 +000041
Brian Osman8dc68c62018-05-30 12:57:45 -040042 skcms_ICCTag desc;
43 REPORTER_ASSERT(r, skcms_GetTagBySignature(&parsed,
44 SkSetFourByteTag('d','e','s','c'),
45 &desc));
Mike Klein5b58b7c2018-05-22 13:47:52 +000046
Brian Osman8dc68c62018-05-30 12:57:45 -040047 // Rather than really carefully break down the 'desc' tag,
48 // just check our expected description is somewhere in there (as big-endian UTF-16).
49 uint8_t big_endian_utf16[16];
50 for (size_t i = 0; i < strlen(test.desc); i++) {
51 big_endian_utf16[2*i+0] = 0;
52 big_endian_utf16[2*i+1] = test.desc[i];
Ravi Mistry113d05f2016-12-17 01:31:03 +000053 }
Brian Osman8dc68c62018-05-30 12:57:45 -040054
55 SkString haystack((const char*)desc.buf, desc.size),
56 needle ((const char*)big_endian_utf16, 2*strlen(test.desc));
57 REPORTER_ASSERT(r, haystack.contains(needle.c_str()));
Ravi Mistry113d05f2016-12-17 01:31:03 +000058 }
Brian Osman8dc68c62018-05-30 12:57:45 -040059}
Ravi Mistry113d05f2016-12-17 01:31:03 +000060
Brian Osman8dc68c62018-05-30 12:57:45 -040061DEF_TEST(AdobeRGB, r) {
62 if (sk_sp<SkData> profile = GetResourceAsData("icc_profiles/AdobeRGB1998.icc")) {
63 skcms_ICCProfile parsed;
64 REPORTER_ASSERT(r, skcms_Parse(profile->data(), profile->size(), &parsed));
Ravi Mistry113d05f2016-12-17 01:31:03 +000065
Brian Osman8dc68c62018-05-30 12:57:45 -040066 auto got = SkColorSpace::Make(parsed);
67 auto want = SkColorSpace::MakeRGB(g2Dot2_TransferFn, SkColorSpace::kAdobeRGB_Gamut);
68 REPORTER_ASSERT(r, SkColorSpace::Equals(got.get(), want.get()));
Matt Sarett1bfcf882016-12-19 18:37:34 -050069 }
Brian Osman8dc68c62018-05-30 12:57:45 -040070}