1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "third_party/blink/renderer/platform/graphics/color_space_gamut.h"
6
7 #include "third_party/blink/public/platform/web_screen_info.h"
8 #include "third_party/skia/include/third_party/skcms/skcms.h"
9
10 namespace blink {
11
12 namespace color_space_utilities {
13
GetColorSpaceGamut(const WebScreenInfo & screen_info)14 ColorSpaceGamut GetColorSpaceGamut(const WebScreenInfo& screen_info) {
15 const gfx::ColorSpace& color_space = screen_info.color_space;
16 if (!color_space.IsValid())
17 return ColorSpaceGamut::kUnknown;
18
19 // Return the gamut of the color space used for raster (this will return a
20 // wide gamut for HDR profiles).
21 sk_sp<SkColorSpace> sk_color_space =
22 color_space.GetRasterColorSpace().ToSkColorSpace();
23 if (!sk_color_space)
24 return ColorSpaceGamut::kUnknown;
25
26 skcms_ICCProfile color_profile;
27 sk_color_space->toProfile(&color_profile);
28 return GetColorSpaceGamut(&color_profile);
29 }
30
GetColorSpaceGamut(const skcms_ICCProfile * color_profile)31 ColorSpaceGamut GetColorSpaceGamut(const skcms_ICCProfile* color_profile) {
32 if (!color_profile)
33 return ColorSpaceGamut::kUnknown;
34
35 skcms_ICCProfile sc_rgb = *skcms_sRGB_profile();
36 skcms_SetTransferFunction(&sc_rgb, skcms_Identity_TransferFunction());
37
38 unsigned char in[3][3];
39 float out[3][3];
40 memset(in, 0, sizeof(in));
41 in[0][0] = 255;
42 in[1][1] = 255;
43 in[2][2] = 255;
44 bool color_converison_successful = skcms_Transform(
45 in, skcms_PixelFormat_RGB_888, skcms_AlphaFormat_Opaque, color_profile,
46 out, skcms_PixelFormat_RGB_fff, skcms_AlphaFormat_Opaque, &sc_rgb, 3);
47 DCHECK(color_converison_successful);
48 float score = out[0][0] * out[1][1] * out[2][2];
49
50 if (score < 0.9)
51 return ColorSpaceGamut::kLessThanNTSC;
52 if (score < 0.95)
53 return ColorSpaceGamut::NTSC; // actual score 0.912839
54 if (score < 1.1)
55 return ColorSpaceGamut::SRGB; // actual score 1.0
56 if (score < 1.3)
57 return ColorSpaceGamut::kAlmostP3;
58 if (score < 1.425)
59 return ColorSpaceGamut::P3; // actual score 1.401899
60 if (score < 1.5)
61 return ColorSpaceGamut::kAdobeRGB; // actual score 1.458385
62 if (score < 2.0)
63 return ColorSpaceGamut::kWide;
64 if (score < 2.2)
65 return ColorSpaceGamut::BT2020; // actual score 2.104520
66 if (score < 2.7)
67 return ColorSpaceGamut::kProPhoto; // actual score 2.913247
68 return ColorSpaceGamut::kUltraWide;
69 }
70
71 } // namespace color_space_utilities
72
73 } // namespace blink
74