• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "ColorSpaces.h"
18 
19 namespace android {
20 namespace renderengine {
21 namespace skia {
22 
23 // please keep in sync with hwui/utils/Color.cpp
toSkColorSpace(ui::Dataspace dataspace)24 sk_sp<SkColorSpace> toSkColorSpace(ui::Dataspace dataspace) {
25     skcms_Matrix3x3 gamut;
26     switch (dataspace & HAL_DATASPACE_STANDARD_MASK) {
27         case HAL_DATASPACE_STANDARD_BT709:
28             gamut = SkNamedGamut::kSRGB;
29             break;
30         case HAL_DATASPACE_STANDARD_BT2020:
31             gamut = SkNamedGamut::kRec2020;
32             break;
33         case HAL_DATASPACE_STANDARD_DCI_P3:
34             gamut = SkNamedGamut::kDisplayP3;
35             break;
36         case HAL_DATASPACE_STANDARD_ADOBE_RGB:
37             gamut = SkNamedGamut::kAdobeRGB;
38             break;
39         case HAL_DATASPACE_STANDARD_BT601_625:
40         case HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED:
41         case HAL_DATASPACE_STANDARD_BT601_525:
42         case HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED:
43         case HAL_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE:
44         case HAL_DATASPACE_STANDARD_BT470M:
45         case HAL_DATASPACE_STANDARD_FILM:
46         case HAL_DATASPACE_STANDARD_UNSPECIFIED:
47         default:
48             gamut = SkNamedGamut::kSRGB;
49             break;
50     }
51 
52     switch (dataspace & HAL_DATASPACE_TRANSFER_MASK) {
53         case HAL_DATASPACE_TRANSFER_LINEAR:
54             return SkColorSpace::MakeRGB(SkNamedTransferFn::kLinear, gamut);
55         case HAL_DATASPACE_TRANSFER_SRGB:
56             return SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, gamut);
57         case HAL_DATASPACE_TRANSFER_GAMMA2_2:
58             return SkColorSpace::MakeRGB({2.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, gamut);
59         case HAL_DATASPACE_TRANSFER_GAMMA2_6:
60             return SkColorSpace::MakeRGB({2.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, gamut);
61         case HAL_DATASPACE_TRANSFER_GAMMA2_8:
62             return SkColorSpace::MakeRGB({2.8f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, gamut);
63         case HAL_DATASPACE_TRANSFER_ST2084:
64             return SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, gamut);
65         case HAL_DATASPACE_TRANSFER_SMPTE_170M:
66             return SkColorSpace::MakeRGB(SkNamedTransferFn::kRec2020, gamut);
67         case HAL_DATASPACE_TRANSFER_HLG:
68             // return HLG transfer but scale by 1/12
69             skcms_TransferFunction hlgFn;
70             if (skcms_TransferFunction_makeScaledHLGish(&hlgFn, 1.f / 12.f, 2.f, 2.f,
71                                                         1.f / 0.17883277f, 0.28466892f,
72                                                         0.55991073f)) {
73                 return SkColorSpace::MakeRGB(hlgFn, gamut);
74             } else {
75                 return SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, gamut);
76             }
77         case HAL_DATASPACE_TRANSFER_UNSPECIFIED:
78         default:
79             return SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, gamut);
80     }
81 }
82 
83 } // namespace skia
84 } // namespace renderengine
85 } // namespace android