blob: e88255b2cde4bf5b49bd65e2fb92a1f1d53202da [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
Mike Klein5b58b7c2018-05-22 13:47:52 +000010#if defined(SK_USE_SKCMS)
Ravi Mistry113d05f2016-12-17 01:31:03 +000011
Mike Klein5b58b7c2018-05-22 13:47:52 +000012 #include "Resources.h"
13 #include "SkColorSpacePriv.h"
14 #include "SkICC.h"
15 #include "SkString.h"
16 #include "Test.h"
17 #include "skcms.h"
18
19 DEF_TEST(WriteICCProfile, r) {
20 auto adobeRGB = SkColorSpace::MakeRGB(g2Dot2_TransferFn, SkColorSpace::kAdobeRGB_Gamut);
21
22 struct {
23 SkColorSpaceTransferFn fn;
24 const float* toXYZD50;
25 const char* desc;
26 sk_sp<SkColorSpace> want;
27 } tests[] = {
28 {g2Dot2_TransferFn, gAdobeRGB_toXYZD50, "AdobeRGB", adobeRGB},
29 { gSRGB_TransferFn, gSRGB_toXYZD50, "sRGB", SkColorSpace::MakeSRGB()},
30 };
31
32 for (auto test : tests) {
33 sk_sp<SkData> profile = SkWriteICCProfile(test.fn, test.toXYZD50);
34 REPORTER_ASSERT(r, profile);
35
36 skcms_ICCProfile parsed;
37 REPORTER_ASSERT(r, skcms_Parse(profile->data(), profile->size(), &parsed));
38
39 sk_sp<SkColorSpace> got = SkColorSpace::Make(parsed);
40 REPORTER_ASSERT(r, got);
41 REPORTER_ASSERT(r, SkColorSpace::Equals(got.get(), test.want.get()));
42
43 skcms_ICCTag desc;
44 REPORTER_ASSERT(r, skcms_GetTagBySignature(&parsed,
45 SkSetFourByteTag('d','e','s','c'),
46 &desc));
47
48 // Rather than really carefully break down the 'desc' tag,
49 // just check our expected description is somewhere in there (as big-endian UTF-16).
50 uint8_t big_endian_utf16[16];
51 for (size_t i = 0; i < strlen(test.desc); i++) {
52 big_endian_utf16[2*i+0] = 0;
53 big_endian_utf16[2*i+1] = test.desc[i];
54 }
55
56 SkString haystack((const char*)desc.buf, desc.size),
57 needle ((const char*)big_endian_utf16, 2*strlen(test.desc));
58 REPORTER_ASSERT(r, haystack.contains(needle.c_str()));
Ravi Mistry113d05f2016-12-17 01:31:03 +000059 }
60 }
Ravi Mistry113d05f2016-12-17 01:31:03 +000061
Mike Klein5b58b7c2018-05-22 13:47:52 +000062 DEF_TEST(AdobeRGB, r) {
63 if (sk_sp<SkData> profile = GetResourceAsData("icc_profiles/AdobeRGB1998.icc")) {
64 skcms_ICCProfile parsed;
65 REPORTER_ASSERT(r, skcms_Parse(profile->data(), profile->size(), &parsed));
Ravi Mistry113d05f2016-12-17 01:31:03 +000066
Mike Klein5b58b7c2018-05-22 13:47:52 +000067 auto got = SkColorSpace::Make(parsed);
68 auto want = SkColorSpace::MakeRGB(g2Dot2_TransferFn, SkColorSpace::kAdobeRGB_Gamut);
69 REPORTER_ASSERT(r, SkColorSpace::Equals(got.get(), want.get()));
70 }
Matt Sarett1bfcf882016-12-19 18:37:34 -050071 }
72
Mike Klein5b58b7c2018-05-22 13:47:52 +000073#endif