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 }