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