1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "color_manager_common.h"
17 #include "native_color_space_manager.h"
18 #include "ndk_color_space.h"
19 #include "platform/common/rs_log.h"
20 
21 namespace {
22     const std::map<ColorSpaceName, OHOS::ColorManager::ColorSpaceName> OH_TO_NATIVE_COLOR_SPACE_NAME_MAP {
23         { ColorSpaceName::NONE, OHOS::ColorManager::ColorSpaceName::NONE },
24         { ColorSpaceName::ADOBE_RGB, OHOS::ColorManager::ColorSpaceName::ADOBE_RGB },
25         { ColorSpaceName::DCI_P3, OHOS::ColorManager::ColorSpaceName::DCI_P3 },
26         { ColorSpaceName::DISPLAY_P3, OHOS::ColorManager::ColorSpaceName::DISPLAY_P3 },
27         { ColorSpaceName::SRGB, OHOS::ColorManager::ColorSpaceName::SRGB },
28         { ColorSpaceName::BT709, OHOS::ColorManager::ColorSpaceName::BT709 },
29         { ColorSpaceName::BT601_EBU, OHOS::ColorManager::ColorSpaceName::BT601_EBU },
30         { ColorSpaceName::BT601_SMPTE_C, OHOS::ColorManager::ColorSpaceName::BT601_SMPTE_C },
31         { ColorSpaceName::BT2020_HLG, OHOS::ColorManager::ColorSpaceName::BT2020_HLG },
32         { ColorSpaceName::BT2020_PQ, OHOS::ColorManager::ColorSpaceName::BT2020_PQ },
33         { ColorSpaceName::P3_HLG, OHOS::ColorManager::ColorSpaceName::P3_HLG },
34         { ColorSpaceName::P3_PQ, OHOS::ColorManager::ColorSpaceName::P3_PQ },
35         { ColorSpaceName::ADOBE_RGB_LIMIT, OHOS::ColorManager::ColorSpaceName::ADOBE_RGB_LIMIT },
36         { ColorSpaceName::DISPLAY_P3_LIMIT, OHOS::ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT },
37         { ColorSpaceName::SRGB_LIMIT, OHOS::ColorManager::ColorSpaceName::SRGB_LIMIT },
38         { ColorSpaceName::BT709_LIMIT, OHOS::ColorManager::ColorSpaceName::BT709_LIMIT },
39         { ColorSpaceName::BT601_EBU_LIMIT, OHOS::ColorManager::ColorSpaceName::BT601_EBU_LIMIT },
40         { ColorSpaceName::BT601_SMPTE_C_LIMIT, OHOS::ColorManager::ColorSpaceName::BT601_SMPTE_C_LIMIT },
41         { ColorSpaceName::BT2020_HLG_LIMIT, OHOS::ColorManager::ColorSpaceName::BT2020_HLG_LIMIT },
42         { ColorSpaceName::BT2020_PQ_LIMIT, OHOS::ColorManager::ColorSpaceName::BT2020_PQ_LIMIT },
43         { ColorSpaceName::P3_HLG_LIMIT, OHOS::ColorManager::ColorSpaceName::P3_HLG_LIMIT },
44         { ColorSpaceName::P3_PQ_LIMIT, OHOS::ColorManager::ColorSpaceName::P3_PQ_LIMIT },
45         { ColorSpaceName::LINEAR_P3, OHOS::ColorManager::ColorSpaceName::LINEAR_P3 },
46         { ColorSpaceName::LINEAR_SRGB, OHOS::ColorManager::ColorSpaceName::LINEAR_SRGB },
47         { ColorSpaceName::LINEAR_BT709, OHOS::ColorManager::ColorSpaceName::LINEAR_BT709 },
48         { ColorSpaceName::LINEAR_BT2020, OHOS::ColorManager::ColorSpaceName::LINEAR_BT2020 },
49         { ColorSpaceName::DISPLAY_SRGB, OHOS::ColorManager::ColorSpaceName::DISPLAY_SRGB },
50         { ColorSpaceName::DISPLAY_P3_SRGB, OHOS::ColorManager::ColorSpaceName::DISPLAY_P3_SRGB },
51         { ColorSpaceName::DISPLAY_P3_HLG, OHOS::ColorManager::ColorSpaceName::DISPLAY_P3_HLG },
52         { ColorSpaceName::DISPLAY_P3_PQ, OHOS::ColorManager::ColorSpaceName::DISPLAY_P3_PQ },
53         { ColorSpaceName::CUSTOM, OHOS::ColorManager::ColorSpaceName::CUSTOM },
54     };
55 
OHPrimariesToColorSpacePrimaries(const ColorSpacePrimaries & primaries,OHOS::ColorManager::ColorSpacePrimaries & csPrimaries)56     void OHPrimariesToColorSpacePrimaries(
57         const ColorSpacePrimaries& primaries, OHOS::ColorManager::ColorSpacePrimaries& csPrimaries)
58     {
59         csPrimaries.rX = primaries.rX;
60         csPrimaries.rY = primaries.rY;
61         csPrimaries.gX = primaries.gX;
62         csPrimaries.gY = primaries.gY;
63         csPrimaries.bX = primaries.bX;
64         csPrimaries.bY = primaries.bY;
65         csPrimaries.wX = primaries.wX;
66         csPrimaries.wY = primaries.wY;
67     }
68 }
69 
OHNativeColorSpaceManagerToNativeColorSpaceManager(OH_NativeColorSpaceManager * nativeColorSpaceManager)70 static NativeColorSpaceManager* OHNativeColorSpaceManagerToNativeColorSpaceManager(
71     OH_NativeColorSpaceManager* nativeColorSpaceManager)
72 {
73     return reinterpret_cast<NativeColorSpaceManager*>(nativeColorSpaceManager);
74 }
75 
NativeColorSpaceManagerToOHNativeColorSpaceManager(NativeColorSpaceManager * nativeColorSpaceManager)76 static OH_NativeColorSpaceManager* NativeColorSpaceManagerToOHNativeColorSpaceManager(
77     NativeColorSpaceManager* nativeColorSpaceManager)
78 {
79     return reinterpret_cast<OH_NativeColorSpaceManager*>(nativeColorSpaceManager);
80 }
81 
OH_NativeColorSpaceManager_CreateFromName(ColorSpaceName colorSpaceName)82 OH_NativeColorSpaceManager* OH_NativeColorSpaceManager_CreateFromName(
83     ColorSpaceName colorSpaceName)
84 {
85     if (colorSpaceName > ColorSpaceName::LINEAR_BT2020 || colorSpaceName < ColorSpaceName::NONE) {
86         RS_LOGE("ColorSpaceName is invalid: %{public}d", OHOS::ColorManager::CMErrorCode::CM_ERROR_INVALID_PARAM);
87         return nullptr;
88     }
89     if (colorSpaceName == ColorSpaceName::NONE || colorSpaceName == ColorSpaceName::CUSTOM) {
90         RS_LOGE("ColorSpaceName is invalid: %{public}d",
91             OHOS::ColorManager::CMErrorCode::CM_ERROR_ABNORMAL_PARAM_VALUE);
92         return nullptr;
93     }
94     auto csName = OH_TO_NATIVE_COLOR_SPACE_NAME_MAP.at(colorSpaceName);
95     NativeColorSpaceManager* nativeColorSpaceManager = new(std::nothrow) NativeColorSpaceManager(csName);
96     if (!nativeColorSpaceManager) {
97         RS_LOGE("create colorspace error");
98         return nullptr;
99     }
100     return NativeColorSpaceManagerToOHNativeColorSpaceManager(nativeColorSpaceManager);
101 }
102 
OH_NativeColorSpaceManager_CreateFromPrimariesAndGamma(ColorSpacePrimaries primaries,float gamma)103 OH_NativeColorSpaceManager* OH_NativeColorSpaceManager_CreateFromPrimariesAndGamma(
104     ColorSpacePrimaries primaries, float gamma)
105 {
106     OHOS::ColorManager::ColorSpacePrimaries csPrimaries;
107     OHPrimariesToColorSpacePrimaries(primaries, csPrimaries);
108     NativeColorSpaceManager* nativeColorSpaceManager = new(std::nothrow) NativeColorSpaceManager(csPrimaries, gamma);
109     if (!nativeColorSpaceManager) {
110         RS_LOGE("create colorspace error");
111         return nullptr;
112     }
113     return NativeColorSpaceManagerToOHNativeColorSpaceManager(nativeColorSpaceManager);
114 }
115 
OH_NativeColorSpaceManager_Destroy(OH_NativeColorSpaceManager * nativeColorSpaceManager)116 void OH_NativeColorSpaceManager_Destroy(OH_NativeColorSpaceManager* nativeColorSpaceManager)
117 {
118     if (!nativeColorSpaceManager) {
119         RS_LOGE("Parameter is nullptr, please check");
120         return;
121     }
122     delete OHNativeColorSpaceManagerToNativeColorSpaceManager(nativeColorSpaceManager);
123 }
124 
OH_NativeColorSpaceManager_GetColorSpaceName(OH_NativeColorSpaceManager * nativeColorSpaceManager)125 int OH_NativeColorSpaceManager_GetColorSpaceName(
126     OH_NativeColorSpaceManager* nativeColorSpaceManager)
127 {
128     NativeColorSpaceManager* nativeCPM = OHNativeColorSpaceManagerToNativeColorSpaceManager(
129         nativeColorSpaceManager);
130     if (!nativeCPM) {
131         RS_LOGE("Parameter is nullptr, please check: %{public}d",
132             OHOS::ColorManager::CMErrorCode::CM_ERROR_INVALID_PARAM);
133         return 0;
134     }
135     return nativeCPM->GetInnerColorSpace().GetColorSpaceName();
136 }
137 
OH_NativeColorSpaceManager_GetWhitePoint(OH_NativeColorSpaceManager * nativeColorSpaceManager)138 WhitePointArray OH_NativeColorSpaceManager_GetWhitePoint(
139     OH_NativeColorSpaceManager* nativeColorSpaceManager)
140 {
141     NativeColorSpaceManager* nativeCPM = OHNativeColorSpaceManagerToNativeColorSpaceManager(
142         nativeColorSpaceManager);
143     if (!nativeCPM) {
144         RS_LOGE("Parameter is nullptr, please check: %{public}d",
145             OHOS::ColorManager::CMErrorCode::CM_ERROR_INVALID_PARAM);
146         return WhitePointArray();
147     }
148     WhitePointArray whitePointArray;
149     whitePointArray.arr[0] = nativeCPM->GetInnerColorSpace().GetWhitePoint()[0];
150     whitePointArray.arr[1] = nativeCPM->GetInnerColorSpace().GetWhitePoint()[1];
151     return whitePointArray;
152 }
153 
OH_NativeColorSpaceManager_GetGamma(OH_NativeColorSpaceManager * nativeColorSpaceManager)154 float OH_NativeColorSpaceManager_GetGamma(
155     OH_NativeColorSpaceManager* nativeColorSpaceManager)
156 {
157     NativeColorSpaceManager* nativeCPM = OHNativeColorSpaceManagerToNativeColorSpaceManager(
158         nativeColorSpaceManager);
159     if (!nativeCPM) {
160         RS_LOGE("Parameter is nullptr, please check: %{public}d",
161             OHOS::ColorManager::CMErrorCode::CM_ERROR_INVALID_PARAM);
162         return 0.f;
163     }
164     return nativeCPM->GetInnerColorSpace().GetGamma();
165 }