1 /*
2 * Copyright (C) 2022 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 "pixelmap_native.h"
17
18 #include "common_utils.h"
19 #include "image_type.h"
20 #include "image_pixel_map_napi_kits.h"
21 #include "pixel_map_napi.h"
22 #include "pixelmap_native_impl.h"
23 #include "image_format_convert.h"
24 #include "surface_buffer.h"
25
26 #include "vpe_utils.h"
27 #include "refbase.h"
28 #include "securec.h"
29 #include "color_utils.h"
30 #include "media_errors.h"
31 #include "memory.h"
32 #include "image_log.h"
33
34 #include "native_color_space_manager.h"
35 #include "ndk_color_space.h"
36
37 using namespace OHOS::Media;
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41
42 constexpr int32_t IMAGE_BASE = 62980096;
43 static constexpr int32_t IMAGE_BASE_19 = 19;
44 static constexpr int32_t IMAGE_BASE_16 = 16;
45 static constexpr int32_t IMAGE_BASE_17 = 17;
46 static constexpr int32_t IMAGE_BASE_26 = 26;
47 static constexpr int32_t IMAGE_BASE_31 = 31;
48 static constexpr int32_t IMAGE_BASE_152 = 152;
49 static constexpr int32_t IMAGE_BASE_27 = 27;
50 static constexpr int32_t IMAGE_BASE_12 = 12;
51 static constexpr int32_t IMAGE_BASE_13 = 13;
52 static constexpr int32_t IMAGE_BASE_6 = 6;
53 static constexpr int32_t IMAGE_BASE_14 = 14;
54 static constexpr int32_t IMAGE_BASE_4 = 4;
55 static constexpr int32_t IMAGE_BASE_9 = 9;
56 static constexpr int32_t IMAGE_BASE_20 = 20;
57 static constexpr int32_t IMAGE_BASE_22 = 22;
58 static constexpr int32_t IMAGE_BASE_23 = 23;
59
60 struct OH_Pixelmap_InitializationOptions {
61 uint32_t width;
62 uint32_t height;
63 PIXEL_FORMAT srcPixelFormat = PIXEL_FORMAT::PIXEL_FORMAT_BGRA_8888;
64 PIXEL_FORMAT pixelFormat = PIXEL_FORMAT::PIXEL_FORMAT_UNKNOWN;
65 bool editable = true;
66 PIXELMAP_ALPHA_TYPE alphaType = PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_UNKNOWN;
67 int32_t srcRowStride = 0;
68 };
69
70 struct OH_Pixelmap_ImageInfo {
71 uint32_t width;
72 uint32_t height;
73 uint32_t rowStride;
74 int32_t pixelFormat = PIXEL_FORMAT::PIXEL_FORMAT_UNKNOWN;
75 PIXELMAP_ALPHA_TYPE alphaType = PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_UNKNOWN;
76 bool isHdr = false;
77 Image_MimeType mimeType;
78 };
79
ParsePixelForamt(int32_t val)80 static PIXEL_FORMAT ParsePixelForamt(int32_t val)
81 {
82 if (val <= static_cast<int32_t>(PIXEL_FORMAT::PIXEL_FORMAT_YCRCB_P010)) {
83 return PIXEL_FORMAT(val);
84 }
85
86 return PIXEL_FORMAT::PIXEL_FORMAT_UNKNOWN;
87 }
88
ParseAlphaType(int32_t val)89 static PIXELMAP_ALPHA_TYPE ParseAlphaType(int32_t val)
90 {
91 if (val <= static_cast<int32_t>(PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_UNPREMULTIPLIED)) {
92 return PIXELMAP_ALPHA_TYPE(val);
93 }
94
95 return PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_UNKNOWN;
96 }
97
ToNewErrorCode(int code)98 static Image_ErrorCode ToNewErrorCode(int code)
99 {
100 switch (code) {
101 case 0:
102 return IMAGE_SUCCESS;
103 case IMAGE_BASE + IMAGE_BASE_19:
104 return IMAGE_BAD_PARAMETER;
105 case IMAGE_BASE + IMAGE_BASE_16:
106 case IMAGE_BASE + IMAGE_BASE_17:
107 case IMAGE_BASE + IMAGE_BASE_26:
108 return IMAGE_UNKNOWN_MIME_TYPE;
109 case IMAGE_BASE + IMAGE_BASE_31:
110 return IMAGE_TOO_LARGE;
111 case IMAGE_BASE + IMAGE_BASE_152:
112 return IMAGE_UNSUPPORTED_OPERATION;
113 case IMAGE_BASE + IMAGE_BASE_27:
114 return IMAGE_UNSUPPORTED_METADATA;
115 case IMAGE_BASE + IMAGE_BASE_12:
116 return IMAGE_UNSUPPORTED_CONVERSION;
117 case IMAGE_BASE + IMAGE_BASE_13:
118 return IMAGE_INVALID_REGION;
119 case IMAGE_BASE + IMAGE_BASE_6:
120 return IMAGE_ALLOC_FAILED;
121 case IMAGE_BASE + IMAGE_BASE_14:
122 return IMAGE_BAD_SOURCE;
123 case IMAGE_BASE + IMAGE_BASE_4:
124 case IMAGE_BASE + IMAGE_BASE_9:
125 case IMAGE_BASE + IMAGE_BASE_20:
126 case IMAGE_BASE + IMAGE_BASE_22:
127 return IMAGE_DECODE_FAILED;
128 case IMAGE_BASE + IMAGE_BASE_23:
129 return IMAGE_ENCODE_FAILED;
130 default:
131 return IMAGE_UNKNOWN_ERROR;
132 }
133 };
134
IsMatchType(IMAGE_FORMAT type,PixelFormat format)135 static bool IsMatchType(IMAGE_FORMAT type, PixelFormat format)
136 {
137 if (type == IMAGE_FORMAT::IMAGE_FORMAT_YUV_TYPE) {
138 switch (format) {
139 case PixelFormat::NV12:
140 case PixelFormat::NV21:{
141 return true;
142 }
143 default:{
144 return false;
145 }
146 }
147 } else if (type == IMAGE_FORMAT::IMAGE_FORMAT_RGB_TYPE) {
148 switch (format) {
149 case PixelFormat::RGB_565:
150 case PixelFormat::RGBA_8888:
151 case PixelFormat::BGRA_8888:
152 case PixelFormat::RGB_888:
153 case PixelFormat::RGBA_F16:{
154 return true;
155 }
156 default:{
157 return false;
158 }
159 }
160 } else {
161 return false;
162 }
163 }
164
releaseMimeType(Image_MimeType * mimeType)165 static void releaseMimeType(Image_MimeType *mimeType)
166 {
167 if (mimeType->data != nullptr) {
168 free(mimeType->data);
169 mimeType->data = nullptr;
170 }
171 mimeType->size = 0;
172 }
173
174 MIDK_EXPORT
OH_PixelmapInitializationOptions_Create(OH_Pixelmap_InitializationOptions ** ops)175 Image_ErrorCode OH_PixelmapInitializationOptions_Create(OH_Pixelmap_InitializationOptions **ops)
176 {
177 if (ops == nullptr) {
178 return IMAGE_BAD_PARAMETER;
179 }
180 *ops = new OH_Pixelmap_InitializationOptions();
181 if (*ops == nullptr) {
182 return IMAGE_BAD_PARAMETER;
183 }
184 return IMAGE_SUCCESS;
185 }
186
187 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetWidth(OH_Pixelmap_InitializationOptions * ops,uint32_t * width)188 Image_ErrorCode OH_PixelmapInitializationOptions_GetWidth(OH_Pixelmap_InitializationOptions *ops,
189 uint32_t *width)
190 {
191 if (ops == nullptr || width == nullptr) {
192 return IMAGE_BAD_PARAMETER;
193 }
194 *width = ops->width;
195 return IMAGE_SUCCESS;
196 }
197
198 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetWidth(OH_Pixelmap_InitializationOptions * ops,uint32_t width)199 Image_ErrorCode OH_PixelmapInitializationOptions_SetWidth(OH_Pixelmap_InitializationOptions *ops,
200 uint32_t width)
201 {
202 if (ops == nullptr) {
203 return IMAGE_BAD_PARAMETER;
204 }
205 ops->width = width;
206 return IMAGE_SUCCESS;
207 }
208
209 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetHeight(OH_Pixelmap_InitializationOptions * ops,uint32_t * height)210 Image_ErrorCode OH_PixelmapInitializationOptions_GetHeight(OH_Pixelmap_InitializationOptions *ops,
211 uint32_t *height)
212 {
213 if (ops == nullptr || height == nullptr) {
214 return IMAGE_BAD_PARAMETER;
215 }
216 *height = ops->height;
217 return IMAGE_SUCCESS;
218 }
219
220 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetHeight(OH_Pixelmap_InitializationOptions * ops,uint32_t height)221 Image_ErrorCode OH_PixelmapInitializationOptions_SetHeight(OH_Pixelmap_InitializationOptions *ops,
222 uint32_t height)
223 {
224 if (ops == nullptr) {
225 return IMAGE_BAD_PARAMETER;
226 }
227 ops->height = height;
228 return IMAGE_SUCCESS;
229 }
230
231 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetPixelFormat(OH_Pixelmap_InitializationOptions * ops,int32_t * pixelFormat)232 Image_ErrorCode OH_PixelmapInitializationOptions_GetPixelFormat(OH_Pixelmap_InitializationOptions *ops,
233 int32_t *pixelFormat)
234 {
235 if (ops == nullptr || pixelFormat == nullptr) {
236 return IMAGE_BAD_PARAMETER;
237 }
238 *pixelFormat = static_cast<int32_t>(ops->pixelFormat);
239 return IMAGE_SUCCESS;
240 }
241
242 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetPixelFormat(OH_Pixelmap_InitializationOptions * ops,int32_t pixelFormat)243 Image_ErrorCode OH_PixelmapInitializationOptions_SetPixelFormat(OH_Pixelmap_InitializationOptions *ops,
244 int32_t pixelFormat)
245 {
246 if (ops == nullptr) {
247 return IMAGE_BAD_PARAMETER;
248 }
249 ops->pixelFormat = ParsePixelForamt(pixelFormat);
250 return IMAGE_SUCCESS;
251 }
252
253 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetSrcPixelFormat(OH_Pixelmap_InitializationOptions * ops,int32_t * srcpixelFormat)254 Image_ErrorCode OH_PixelmapInitializationOptions_GetSrcPixelFormat(OH_Pixelmap_InitializationOptions *ops,
255 int32_t *srcpixelFormat)
256 {
257 if (ops == nullptr || srcpixelFormat == nullptr) {
258 return IMAGE_BAD_PARAMETER;
259 }
260 *srcpixelFormat = static_cast<int32_t>(ops->srcPixelFormat);
261 return IMAGE_SUCCESS;
262 }
263
264 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetSrcPixelFormat(OH_Pixelmap_InitializationOptions * ops,int32_t srcpixelFormat)265 Image_ErrorCode OH_PixelmapInitializationOptions_SetSrcPixelFormat(OH_Pixelmap_InitializationOptions *ops,
266 int32_t srcpixelFormat)
267 {
268 if (ops == nullptr) {
269 return IMAGE_BAD_PARAMETER;
270 }
271 ops->srcPixelFormat = ParsePixelForamt(srcpixelFormat);
272 return IMAGE_SUCCESS;
273 }
274
275 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetAlphaType(OH_Pixelmap_InitializationOptions * ops,int32_t * alphaType)276 Image_ErrorCode OH_PixelmapInitializationOptions_GetAlphaType(OH_Pixelmap_InitializationOptions *ops,
277 int32_t *alphaType)
278 {
279 if (ops == nullptr || alphaType == nullptr) {
280 return IMAGE_BAD_PARAMETER;
281 }
282 *alphaType = static_cast<int32_t>(ops->alphaType);
283 return IMAGE_SUCCESS;
284 }
285
286 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetAlphaType(OH_Pixelmap_InitializationOptions * ops,int32_t alphaType)287 Image_ErrorCode OH_PixelmapInitializationOptions_SetAlphaType(OH_Pixelmap_InitializationOptions *ops,
288 int32_t alphaType)
289 {
290 if (ops == nullptr) {
291 return IMAGE_BAD_PARAMETER;
292 }
293 ops->alphaType = ParseAlphaType(alphaType);
294 return IMAGE_SUCCESS;
295 }
296
297 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetEditable(OH_Pixelmap_InitializationOptions * options,bool * editable)298 Image_ErrorCode OH_PixelmapInitializationOptions_GetEditable(OH_Pixelmap_InitializationOptions *options,
299 bool *editable)
300 {
301 if (options == nullptr || editable == nullptr) {
302 return IMAGE_BAD_PARAMETER;
303 }
304 *editable = options->editable;
305 return IMAGE_SUCCESS;
306 }
307
308 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetEditable(OH_Pixelmap_InitializationOptions * options,bool editable)309 Image_ErrorCode OH_PixelmapInitializationOptions_SetEditable(OH_Pixelmap_InitializationOptions *options,
310 bool editable)
311 {
312 if (options == nullptr) {
313 return IMAGE_BAD_PARAMETER;
314 }
315 options->editable = editable;
316 return IMAGE_SUCCESS;
317 }
318
319 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetRowStride(OH_Pixelmap_InitializationOptions * options,int32_t * rowStride)320 Image_ErrorCode OH_PixelmapInitializationOptions_GetRowStride(OH_Pixelmap_InitializationOptions *options,
321 int32_t *rowStride)
322 {
323 if (options == nullptr || rowStride == nullptr) {
324 return IMAGE_BAD_PARAMETER;
325 }
326 *rowStride = options->srcRowStride;
327 return IMAGE_SUCCESS;
328 }
329
330 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetRowStride(OH_Pixelmap_InitializationOptions * options,int32_t rowStride)331 Image_ErrorCode OH_PixelmapInitializationOptions_SetRowStride(OH_Pixelmap_InitializationOptions *options,
332 int32_t rowStride)
333 {
334 if (options == nullptr) {
335 return IMAGE_BAD_PARAMETER;
336 }
337 options->srcRowStride = rowStride;
338 return IMAGE_SUCCESS;
339 }
340
341 MIDK_EXPORT
OH_PixelmapInitializationOptions_Release(OH_Pixelmap_InitializationOptions * ops)342 Image_ErrorCode OH_PixelmapInitializationOptions_Release(OH_Pixelmap_InitializationOptions *ops)
343 {
344 if (ops == nullptr) {
345 return IMAGE_BAD_PARAMETER;
346 }
347 delete ops;
348 ops = nullptr;
349 return IMAGE_SUCCESS;
350 }
351
352 MIDK_EXPORT
OH_PixelmapImageInfo_Create(OH_Pixelmap_ImageInfo ** info)353 Image_ErrorCode OH_PixelmapImageInfo_Create(OH_Pixelmap_ImageInfo **info)
354 {
355 if (info == nullptr) {
356 return IMAGE_BAD_PARAMETER;
357 }
358 *info = new OH_Pixelmap_ImageInfo();
359 if (*info == nullptr) {
360 return IMAGE_BAD_PARAMETER;
361 }
362 return IMAGE_SUCCESS;
363 }
364
365 MIDK_EXPORT
OH_PixelmapImageInfo_GetWidth(OH_Pixelmap_ImageInfo * info,uint32_t * width)366 Image_ErrorCode OH_PixelmapImageInfo_GetWidth(OH_Pixelmap_ImageInfo *info, uint32_t *width)
367 {
368 if (info == nullptr || width == nullptr) {
369 return IMAGE_BAD_PARAMETER;
370 }
371 *width = info->width;
372 return IMAGE_SUCCESS;
373 }
374
375 MIDK_EXPORT
OH_PixelmapImageInfo_GetHeight(OH_Pixelmap_ImageInfo * info,uint32_t * height)376 Image_ErrorCode OH_PixelmapImageInfo_GetHeight(OH_Pixelmap_ImageInfo *info, uint32_t *height)
377 {
378 if (info == nullptr || height == nullptr) {
379 return IMAGE_BAD_PARAMETER;
380 }
381 *height = info->height;
382 return IMAGE_SUCCESS;
383 }
384
385 MIDK_EXPORT
OH_PixelmapImageInfo_GetRowStride(OH_Pixelmap_ImageInfo * info,uint32_t * rowStride)386 Image_ErrorCode OH_PixelmapImageInfo_GetRowStride(OH_Pixelmap_ImageInfo *info, uint32_t *rowStride)
387 {
388 if (info == nullptr || rowStride == nullptr) {
389 return IMAGE_BAD_PARAMETER;
390 }
391 *rowStride = info->rowStride;
392 return IMAGE_SUCCESS;
393 }
394
395 MIDK_EXPORT
OH_PixelmapImageInfo_GetPixelFormat(OH_Pixelmap_ImageInfo * info,int32_t * pixelFormat)396 Image_ErrorCode OH_PixelmapImageInfo_GetPixelFormat(OH_Pixelmap_ImageInfo *info, int32_t *pixelFormat)
397 {
398 if (info == nullptr || pixelFormat == nullptr) {
399 return IMAGE_BAD_PARAMETER;
400 }
401 *pixelFormat = info->pixelFormat;
402 return IMAGE_SUCCESS;
403 }
404
405 MIDK_EXPORT
OH_PixelmapImageInfo_GetAlphaType(OH_Pixelmap_ImageInfo * info,int32_t * alphaType)406 Image_ErrorCode OH_PixelmapImageInfo_GetAlphaType(OH_Pixelmap_ImageInfo *info, int32_t *alphaType)
407 {
408 if (info == nullptr || alphaType == nullptr) {
409 return IMAGE_BAD_PARAMETER;
410 }
411 *alphaType = static_cast<int32_t>(info->alphaType);
412 return IMAGE_SUCCESS;
413 }
414
415 MIDK_EXPORT
OH_PixelmapImageInfo_GetDynamicRange(OH_Pixelmap_ImageInfo * info,bool * isHdr)416 Image_ErrorCode OH_PixelmapImageInfo_GetDynamicRange(OH_Pixelmap_ImageInfo *info, bool *isHdr)
417 {
418 if (info == nullptr || isHdr == nullptr) {
419 return IMAGE_BAD_PARAMETER;
420 }
421 *isHdr = info->isHdr;
422 return IMAGE_SUCCESS;
423 }
424
425 MIDK_EXPORT
OH_PixelmapImageInfo_GetMimeType(OH_Pixelmap_ImageInfo * info,Image_MimeType * mimeType)426 Image_ErrorCode OH_PixelmapImageInfo_GetMimeType(OH_Pixelmap_ImageInfo *info, Image_MimeType *mimeType)
427 {
428 if (info == nullptr || mimeType == nullptr) {
429 return IMAGE_BAD_PARAMETER;
430 }
431 if (info->mimeType.data == nullptr || info->mimeType.size == 0) {
432 return IMAGE_UNKNOWN_MIME_TYPE;
433 }
434 *mimeType = info->mimeType;
435 return IMAGE_SUCCESS;
436 }
437
438 MIDK_EXPORT
OH_PixelmapImageInfo_Release(OH_Pixelmap_ImageInfo * info)439 Image_ErrorCode OH_PixelmapImageInfo_Release(OH_Pixelmap_ImageInfo *info)
440 {
441 if (info == nullptr) {
442 return IMAGE_BAD_PARAMETER;
443 }
444 releaseMimeType(&info->mimeType);
445 delete info;
446 info = nullptr;
447 return IMAGE_SUCCESS;
448 }
449
450 MIDK_EXPORT
OH_PixelmapNative_CreatePixelmap(uint8_t * data,size_t dataLength,OH_Pixelmap_InitializationOptions * options,OH_PixelmapNative ** pixelmap)451 Image_ErrorCode OH_PixelmapNative_CreatePixelmap(uint8_t *data, size_t dataLength,
452 OH_Pixelmap_InitializationOptions *options, OH_PixelmapNative **pixelmap)
453 {
454 if (data == nullptr || options == nullptr || pixelmap == nullptr) {
455 return IMAGE_BAD_PARAMETER;
456 }
457 InitializationOptions info;
458 info.editable = options->editable;
459 info.alphaType = static_cast<AlphaType>(options->alphaType);
460 info.srcPixelFormat = static_cast<PixelFormat>(options->srcPixelFormat);
461 info.pixelFormat = static_cast<PixelFormat>(options->pixelFormat);
462 info.srcRowStride = options->srcRowStride;
463 info.size.height = static_cast<int32_t>(options->height);
464 info.size.width = static_cast<int32_t>(options->width);
465
466 auto pixelmap2 = new OH_PixelmapNative(reinterpret_cast<uint32_t*>(data), static_cast<uint32_t>(dataLength), info);
467 if (pixelmap2 == nullptr || pixelmap2->GetInnerPixelmap() == nullptr) {
468 if (pixelmap2) {
469 delete pixelmap2;
470 }
471 return IMAGE_BAD_PARAMETER;
472 }
473 *pixelmap = pixelmap2;
474 return IMAGE_SUCCESS;
475 }
476
477 MIDK_EXPORT
OH_PixelmapNative_CreateEmptyPixelmap(OH_Pixelmap_InitializationOptions * options,OH_PixelmapNative ** pixelmap)478 Image_ErrorCode OH_PixelmapNative_CreateEmptyPixelmap(
479 OH_Pixelmap_InitializationOptions *options, OH_PixelmapNative **pixelmap)
480 {
481 if (options == nullptr) {
482 return IMAGE_BAD_PARAMETER;
483 }
484 InitializationOptions info;
485 info.editable = options->editable;
486 info.alphaType = static_cast<AlphaType>(options->alphaType);
487 info.srcPixelFormat = static_cast<PixelFormat>(options->srcPixelFormat);
488 info.pixelFormat = static_cast<PixelFormat>(options->pixelFormat);
489 info.size.height = options->height;
490 info.size.width = options->width;
491
492 auto pixelmap2 = new OH_PixelmapNative(info);
493 if (pixelmap2 == nullptr || pixelmap2->GetInnerPixelmap() == nullptr) {
494 if (pixelmap2) {
495 delete pixelmap2;
496 }
497 return IMAGE_BAD_PARAMETER;
498 }
499 *pixelmap = pixelmap2;
500 return IMAGE_SUCCESS;
501 }
502
503 MIDK_EXPORT
OH_PixelmapNative_ConvertPixelmapNativeToNapi(napi_env env,OH_PixelmapNative * pixelmapNative,napi_value * pixelmapNapi)504 Image_ErrorCode OH_PixelmapNative_ConvertPixelmapNativeToNapi(napi_env env, OH_PixelmapNative *pixelmapNative,
505 napi_value *pixelmapNapi)
506 {
507 if (pixelmapNative == nullptr || pixelmapNative->GetInnerPixelmap() == nullptr) {
508 return IMAGE_BAD_PARAMETER;
509 }
510 std::shared_ptr<OHOS::Media::PixelMap> pixelMap = pixelmapNative->GetInnerPixelmap();
511 *pixelmapNapi = PixelMapNapi::CreatePixelMap(env, pixelMap);
512 napi_valuetype valueType = napi_undefined;
513 napi_typeof(env, *pixelmapNapi, &valueType);
514 return (valueType == napi_undefined) ? IMAGE_BAD_PARAMETER : IMAGE_SUCCESS;
515 }
516
517 MIDK_EXPORT
OH_PixelmapNative_ConvertPixelmapNativeFromNapi(napi_env env,napi_value pixelmapNapi,OH_PixelmapNative ** pixelmapNative)518 Image_ErrorCode OH_PixelmapNative_ConvertPixelmapNativeFromNapi(napi_env env, napi_value pixelmapNapi,
519 OH_PixelmapNative **pixelmapNative)
520 {
521 PixelMapNapi* napi = PixelMapNapi_Unwrap(env, pixelmapNapi);
522 if (napi == nullptr || napi->GetPixelNapiInner() == nullptr) {
523 return IMAGE_BAD_PARAMETER;
524 }
525 auto pixelmap = new OH_PixelmapNative(napi->GetPixelNapiInner());
526 if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr) {
527 if (pixelmap) {
528 delete pixelmap;
529 }
530 return IMAGE_ALLOC_FAILED;
531 }
532 *pixelmapNative = pixelmap;
533 return IMAGE_SUCCESS;
534 }
535
536 MIDK_EXPORT
OH_PixelmapNative_ReadPixels(OH_PixelmapNative * pixelmap,uint8_t * destination,size_t * bufferSize)537 Image_ErrorCode OH_PixelmapNative_ReadPixels(OH_PixelmapNative *pixelmap, uint8_t *destination, size_t *bufferSize)
538 {
539 if (pixelmap == nullptr || destination == nullptr || bufferSize == nullptr || !pixelmap->GetInnerPixelmap()) {
540 return IMAGE_BAD_PARAMETER;
541 }
542 return ToNewErrorCode(pixelmap->GetInnerPixelmap()->ReadPixels(*bufferSize, destination));
543 }
544
545 MIDK_EXPORT
OH_PixelmapNative_WritePixels(OH_PixelmapNative * pixelmap,uint8_t * source,size_t bufferSize)546 Image_ErrorCode OH_PixelmapNative_WritePixels(OH_PixelmapNative *pixelmap, uint8_t *source, size_t bufferSize)
547 {
548 if (pixelmap == nullptr || source == nullptr || !pixelmap->GetInnerPixelmap()) {
549 return IMAGE_BAD_PARAMETER;
550 }
551 return ToNewErrorCode(pixelmap->GetInnerPixelmap()->WritePixels(source, bufferSize));
552 }
553
554 MIDK_EXPORT
OH_PixelmapNative_GetArgbPixels(OH_PixelmapNative * pixelmap,uint8_t * destination,size_t * bufferSize)555 Image_ErrorCode OH_PixelmapNative_GetArgbPixels(OH_PixelmapNative *pixelmap, uint8_t *destination, size_t *bufferSize)
556 {
557 if (pixelmap == nullptr || destination == nullptr || bufferSize == nullptr || !pixelmap->GetInnerPixelmap()) {
558 return IMAGE_BAD_PARAMETER;
559 }
560 return ToNewErrorCode(pixelmap->GetInnerPixelmap()->ReadARGBPixels(*bufferSize, destination));
561 }
562
563 MIDK_EXPORT
OH_PixelmapNative_ToSdr(OH_PixelmapNative * pixelmap)564 Image_ErrorCode OH_PixelmapNative_ToSdr(OH_PixelmapNative *pixelmap)
565 {
566 if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
567 return IMAGE_BAD_PARAMETER;
568 }
569 if (pixelmap->GetInnerPixelmap()->ToSdr() != IMAGE_SUCCESS) {
570 return IMAGE_UNSUPPORTED_OPERATION;
571 }
572 return IMAGE_SUCCESS;
573 }
574
575 MIDK_EXPORT
OH_PixelmapNative_GetImageInfo(OH_PixelmapNative * pixelmap,OH_Pixelmap_ImageInfo * imageInfo)576 Image_ErrorCode OH_PixelmapNative_GetImageInfo(OH_PixelmapNative *pixelmap, OH_Pixelmap_ImageInfo *imageInfo)
577 {
578 if (pixelmap == nullptr || imageInfo == nullptr || !pixelmap->GetInnerPixelmap()) {
579 return IMAGE_BAD_PARAMETER;
580 }
581 ImageInfo srcInfo;
582 pixelmap->GetInnerPixelmap()->GetImageInfo(srcInfo);
583 imageInfo->width = static_cast<uint32_t>(srcInfo.size.width);
584 imageInfo->height = static_cast<uint32_t>(srcInfo.size.height);
585 imageInfo->rowStride = static_cast<uint32_t>(pixelmap->GetInnerPixelmap()->GetRowStride());
586 imageInfo->pixelFormat = static_cast<int32_t>(srcInfo.pixelFormat);
587 imageInfo->isHdr = pixelmap->GetInnerPixelmap()->IsHdr();
588
589 if (!srcInfo.encodedFormat.empty() && imageInfo->mimeType.data == nullptr) {
590 imageInfo->mimeType.size = srcInfo.encodedFormat.size();
591 imageInfo->mimeType.data = static_cast<char *>(malloc(imageInfo->mimeType.size));
592 if (memcpy_s(imageInfo->mimeType.data, imageInfo->mimeType.size, srcInfo.encodedFormat.c_str(),
593 srcInfo.encodedFormat.size()) != 0) {
594 releaseMimeType(&imageInfo->mimeType);
595 }
596 }
597
598 return IMAGE_SUCCESS;
599 }
600
601 MIDK_EXPORT
OH_PixelmapNative_Opacity(OH_PixelmapNative * pixelmap,float rate)602 Image_ErrorCode OH_PixelmapNative_Opacity(OH_PixelmapNative *pixelmap, float rate)
603 {
604 if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
605 return IMAGE_BAD_PARAMETER;
606 }
607 pixelmap->GetInnerPixelmap()->SetAlpha(rate);
608 return IMAGE_SUCCESS;
609 }
610
611 MIDK_EXPORT
OH_PixelmapNative_Scale(OH_PixelmapNative * pixelmap,float scaleX,float scaleY)612 Image_ErrorCode OH_PixelmapNative_Scale(OH_PixelmapNative *pixelmap, float scaleX, float scaleY)
613 {
614 if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
615 return IMAGE_BAD_PARAMETER;
616 }
617 pixelmap->GetInnerPixelmap()->scale(scaleX, scaleY);
618 return IMAGE_SUCCESS;
619 }
620
621 MIDK_EXPORT
OH_PixelmapNative_ScaleWithAntiAliasing(OH_PixelmapNative * pixelmap,float scaleX,float scaleY,OH_PixelmapNative_AntiAliasingLevel level)622 Image_ErrorCode OH_PixelmapNative_ScaleWithAntiAliasing(OH_PixelmapNative *pixelmap, float scaleX, float scaleY,
623 OH_PixelmapNative_AntiAliasingLevel level)
624 {
625 if (pixelmap == nullptr) {
626 return IMAGE_BAD_PARAMETER;
627 }
628 pixelmap->GetInnerPixelmap()->scale(scaleX, scaleY, static_cast<AntiAliasingOption>(level));
629 return IMAGE_SUCCESS;
630 }
631
632 MIDK_EXPORT
OH_PixelmapNative_CreateScaledPixelMap(OH_PixelmapNative * srcPixelmap,OH_PixelmapNative ** dstPixelmap,float scaleX,float scaleY)633 Image_ErrorCode OH_PixelmapNative_CreateScaledPixelMap(OH_PixelmapNative *srcPixelmap, OH_PixelmapNative **dstPixelmap,
634 float scaleX, float scaleY)
635 {
636 if (srcPixelmap == nullptr || !srcPixelmap->GetInnerPixelmap() || dstPixelmap == nullptr) {
637 return IMAGE_BAD_PARAMETER;
638 }
639 InitializationOptions opts;
640 std::unique_ptr<PixelMap> clonePixelmap = PixelMap::Create(*(srcPixelmap->GetInnerPixelmap()), opts);
641 if (clonePixelmap == nullptr) {
642 return IMAGE_BAD_PARAMETER;
643 }
644 clonePixelmap->scale(scaleX, scaleY);
645 *dstPixelmap = new(std::nothrow) OH_PixelmapNative(std::move(clonePixelmap));
646 return IMAGE_SUCCESS;
647 }
648
649 MIDK_EXPORT
OH_PixelmapNative_CreateScaledPixelMapWithAntiAliasing(OH_PixelmapNative * srcPixelmap,OH_PixelmapNative ** dstPixelmap,float scaleX,float scaleY,OH_PixelmapNative_AntiAliasingLevel level)650 Image_ErrorCode OH_PixelmapNative_CreateScaledPixelMapWithAntiAliasing(OH_PixelmapNative *srcPixelmap,
651 OH_PixelmapNative **dstPixelmap, float scaleX, float scaleY, OH_PixelmapNative_AntiAliasingLevel level)
652 {
653 if (srcPixelmap == nullptr || !srcPixelmap->GetInnerPixelmap() || dstPixelmap == nullptr) {
654 return IMAGE_BAD_PARAMETER;
655 }
656 InitializationOptions opts;
657 std::unique_ptr<PixelMap> clonePixelmap = PixelMap::Create(*(srcPixelmap->GetInnerPixelmap()), opts);
658 if (clonePixelmap == nullptr) {
659 return IMAGE_BAD_PARAMETER;
660 }
661 clonePixelmap->scale(scaleX, scaleY, static_cast<AntiAliasingOption>(level));
662 *dstPixelmap = new(std::nothrow) OH_PixelmapNative(std::move(clonePixelmap));
663 return IMAGE_SUCCESS;
664 }
665
666 MIDK_EXPORT
OH_PixelmapNative_Translate(OH_PixelmapNative * pixelmap,float x,float y)667 Image_ErrorCode OH_PixelmapNative_Translate(OH_PixelmapNative *pixelmap, float x, float y)
668 {
669 if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
670 return IMAGE_BAD_PARAMETER;
671 }
672 pixelmap->GetInnerPixelmap()->translate(x, y);
673 return IMAGE_SUCCESS;
674 }
675
676 MIDK_EXPORT
OH_PixelmapNative_Rotate(OH_PixelmapNative * pixelmap,float angle)677 Image_ErrorCode OH_PixelmapNative_Rotate(OH_PixelmapNative *pixelmap, float angle)
678 {
679 if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
680 return IMAGE_BAD_PARAMETER;
681 }
682 pixelmap->GetInnerPixelmap()->rotate(angle);
683 return IMAGE_SUCCESS;
684 }
685
686 MIDK_EXPORT
OH_PixelmapNative_Flip(OH_PixelmapNative * pixelmap,bool shouldFilpHorizontally,bool shouldFilpVertically)687 Image_ErrorCode OH_PixelmapNative_Flip(OH_PixelmapNative *pixelmap, bool shouldFilpHorizontally,
688 bool shouldFilpVertically)
689 {
690 if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
691 return IMAGE_BAD_PARAMETER;
692 }
693 pixelmap->GetInnerPixelmap()->flip(shouldFilpHorizontally, shouldFilpVertically);
694 return IMAGE_SUCCESS;
695 }
696
697 MIDK_EXPORT
OH_PixelmapNative_Crop(OH_PixelmapNative * pixelmap,Image_Region * region)698 Image_ErrorCode OH_PixelmapNative_Crop(OH_PixelmapNative *pixelmap, Image_Region *region)
699 {
700 if (pixelmap == nullptr || region == nullptr || !pixelmap->GetInnerPixelmap()) {
701 return IMAGE_BAD_PARAMETER;
702 }
703 OHOS::Media::Rect rect;
704 rect.left = static_cast<int32_t>(region->x);
705 rect.top = static_cast<int32_t>(region->y);
706 rect.width = static_cast<int32_t>(region->width);
707 rect.height = static_cast<int32_t>(region->height);
708 pixelmap->GetInnerPixelmap()->crop(rect);
709 return IMAGE_SUCCESS;
710 }
711
712 MIDK_EXPORT
OH_PixelmapNative_Release(OH_PixelmapNative * pixelmap)713 Image_ErrorCode OH_PixelmapNative_Release(OH_PixelmapNative *pixelmap)
714 {
715 if (pixelmap == nullptr || (pixelmap->GetInnerPixelmap() != nullptr &&
716 !pixelmap->GetInnerPixelmap()->IsModifiable())) {
717 return IMAGE_BAD_PARAMETER;
718 }
719 pixelmap->~OH_PixelmapNative();
720 return IMAGE_SUCCESS;
721 }
722
723 MIDK_EXPORT
OH_PixelmapNative_Destroy(OH_PixelmapNative ** pixelmap)724 Image_ErrorCode OH_PixelmapNative_Destroy(OH_PixelmapNative **pixelmap)
725 {
726 if (pixelmap == nullptr || *pixelmap == nullptr) {
727 return IMAGE_BAD_PARAMETER;
728 }
729 delete *pixelmap;
730 *pixelmap = nullptr;
731 return IMAGE_SUCCESS;
732 }
733
734 MIDK_EXPORT
OH_PixelmapNative_ConvertAlphaFormat(OH_PixelmapNative * srcpixelmap,OH_PixelmapNative * dstpixelmap,const bool isPremul)735 Image_ErrorCode OH_PixelmapNative_ConvertAlphaFormat(OH_PixelmapNative* srcpixelmap,
736 OH_PixelmapNative* dstpixelmap, const bool isPremul)
737 {
738 if (srcpixelmap == nullptr || dstpixelmap == nullptr ||
739 !srcpixelmap->GetInnerPixelmap() || !dstpixelmap->GetInnerPixelmap()) {
740 return IMAGE_BAD_PARAMETER;
741 }
742 srcpixelmap->GetInnerPixelmap()->ConvertAlphaFormat(*(dstpixelmap->GetInnerPixelmap()), isPremul);
743 return IMAGE_SUCCESS;
744 }
745
ImageConvert_YuvToRgb(OH_PixelmapNative * srcPixelMap,OH_PixelmapNative ** destPixelMap,int32_t destPixelFormat)746 static uint32_t ImageConvert_YuvToRgb(OH_PixelmapNative *srcPixelMap, OH_PixelmapNative **destPixelMap,
747 int32_t destPixelFormat)
748 {
749 if (srcPixelMap == nullptr) {
750 return IMAGE_BAD_PARAMETER;
751 }
752 PixelFormat srcPixelFormat = srcPixelMap->GetInnerPixelmap()->GetPixelFormat();
753 PixelFormat destFormat = static_cast<PixelFormat>(destPixelFormat);
754 if (!IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_YUV_TYPE, srcPixelFormat) ||
755 !IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_RGB_TYPE, destFormat)) {
756 return IMAGE_BAD_PARAMETER;
757 }
758
759 std::shared_ptr<OHOS::Media::PixelMap> innerPixelMap = srcPixelMap->GetInnerPixelmap();
760 std::shared_ptr<PixelMap> pixelMap = std::static_pointer_cast<PixelMap>(innerPixelMap);
761 uint32_t ret = ImageFormatConvert::ConvertImageFormat(pixelMap, destFormat);
762 *destPixelMap = new OH_PixelmapNative(pixelMap);
763
764 return ret;
765 }
766
ImageConvert_RgbToYuv(OH_PixelmapNative * srcPixelMap,OH_PixelmapNative ** destPixelMap,int32_t destPixelFormat)767 static uint32_t ImageConvert_RgbToYuv(OH_PixelmapNative *srcPixelMap, OH_PixelmapNative **destPixelMap,
768 int32_t destPixelFormat)
769 {
770 if (srcPixelMap == nullptr) {
771 return IMAGE_BAD_PARAMETER;
772 }
773
774 PixelFormat srcPixelFormat = srcPixelMap->GetInnerPixelmap()->GetPixelFormat();
775 PixelFormat destFormat = static_cast<PixelFormat>(destPixelFormat);
776 if (!IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_RGB_TYPE, srcPixelFormat) ||
777 !IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_YUV_TYPE, destFormat)) {
778 return IMAGE_BAD_PARAMETER;
779 }
780
781 std::shared_ptr<OHOS::Media::PixelMap> innerPixelMap = srcPixelMap->GetInnerPixelmap();
782 std::shared_ptr<PixelMap> pixelMap = std::static_pointer_cast<PixelMap>(innerPixelMap);
783 uint32_t ret = ImageFormatConvert::ConvertImageFormat(pixelMap, destFormat);
784 *destPixelMap = new OH_PixelmapNative(pixelMap);
785 return ret;
786 }
787
788 MIDK_EXPORT
OH_PixelMapNative_ConvertPixelFormat(OH_PixelmapNative * srcPixelMap,OH_PixelmapNative ** destPixelMap,int32_t destPixelFormat)789 Image_ErrorCode OH_PixelMapNative_ConvertPixelFormat(OH_PixelmapNative *srcPixelMap, OH_PixelmapNative **destPixelMap,
790 int32_t destPixelFormat)
791 {
792 if (srcPixelMap == nullptr) {
793 return IMAGE_BAD_PARAMETER;
794 }
795
796 PixelFormat srcPixelFormat = srcPixelMap->GetInnerPixelmap()->GetPixelFormat();
797 const uint32_t SUCCESS = 0;
798 if (IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_YUV_TYPE, srcPixelFormat)) {
799 if (ImageConvert_YuvToRgb(srcPixelMap, destPixelMap, destPixelFormat) != SUCCESS) {
800 return IMAGE_BAD_PARAMETER;
801 }
802 } else if (IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_RGB_TYPE, srcPixelFormat)) {
803 if (ImageConvert_RgbToYuv(srcPixelMap, destPixelMap, destPixelFormat) != SUCCESS) {
804 return IMAGE_BAD_PARAMETER;
805 }
806 } else {
807 return IMAGE_BAD_PARAMETER;
808 }
809 return IMAGE_SUCCESS;
810 }
811 constexpr uint8_t INDEX_ZERO = 0;
812 constexpr uint8_t INDEX_ONE = 1;
813 constexpr uint8_t INDEX_TWO = 2;
814 static std::map<OH_Pixelmap_HdrMetadataType, const CM_HDR_Metadata_Type> NdkMetadataTypeMap = {
815 {HDR_METADATA_TYPE_NONE, CM_METADATA_NONE},
816 {HDR_METADATA_TYPE_BASE, CM_IMAGE_HDR_VIVID_DUAL},
817 {HDR_METADATA_TYPE_GAINMAP, CM_METADATA_NONE},
818 {HDR_METADATA_TYPE_ALTERNATE, CM_IMAGE_HDR_VIVID_SINGLE},
819 };
820
821 static std::map<CM_HDR_Metadata_Type, OH_Pixelmap_HdrMetadataType> MetadataNdkTypeMap = {
822 {CM_METADATA_NONE, HDR_METADATA_TYPE_NONE},
823 {CM_IMAGE_HDR_VIVID_DUAL, HDR_METADATA_TYPE_BASE},
824 {CM_METADATA_NONE, HDR_METADATA_TYPE_GAINMAP},
825 {CM_IMAGE_HDR_VIVID_SINGLE, HDR_METADATA_TYPE_ALTERNATE},
826 };
827
ConvertStaticMetadata(const OH_Pixelmap_HdrStaticMetadata & metadata,std::vector<uint8_t> & staticMetadataVec)828 static bool ConvertStaticMetadata(const OH_Pixelmap_HdrStaticMetadata &metadata,
829 std::vector<uint8_t> &staticMetadataVec)
830 {
831 #if defined(_WIN32) || defined(_APPLE) || defined(IOS_PLATFORM) || defined(ANDROID_PLATFORM)
832 return {};
833 #else
834 HDI::Display::Graphic::Common::V1_0::HdrStaticMetadata staticMetadata{};
835 staticMetadata.smpte2086.displayPrimaryRed.x = metadata.displayPrimariesX[INDEX_ZERO];
836 staticMetadata.smpte2086.displayPrimaryRed.y = metadata.displayPrimariesY[INDEX_ZERO];
837 staticMetadata.smpte2086.displayPrimaryGreen.x = metadata.displayPrimariesX[INDEX_ONE];
838 staticMetadata.smpte2086.displayPrimaryGreen.y = metadata.displayPrimariesY[INDEX_ONE];
839 staticMetadata.smpte2086.displayPrimaryBlue.x = metadata.displayPrimariesX[INDEX_TWO];
840 staticMetadata.smpte2086.displayPrimaryBlue.y = metadata.displayPrimariesY[INDEX_TWO];
841 staticMetadata.smpte2086.whitePoint.x = metadata.whitePointX;
842 staticMetadata.smpte2086.whitePoint.y = metadata.whitePointY;
843 staticMetadata.smpte2086.maxLuminance = metadata.maxLuminance;
844 staticMetadata.smpte2086.minLuminance = metadata.minLuminance;
845 staticMetadata.cta861.maxContentLightLevel = metadata.maxContentLightLevel;
846 staticMetadata.cta861.maxFrameAverageLightLevel = metadata.maxFrameAverageLightLevel;
847 uint32_t vecSize = sizeof(HDI::Display::Graphic::Common::V1_0::HdrStaticMetadata);
848 if (memcpy_s(staticMetadataVec.data(), vecSize, &staticMetadata, vecSize) != EOK) {
849 return false;
850 }
851 return true;
852 #endif
853 }
854
ConvertGainmapMetadata(OH_Pixelmap_HdrGainmapMetadata & metadata,HDRVividExtendMetadata & extendMetadata)855 static void ConvertGainmapMetadata(OH_Pixelmap_HdrGainmapMetadata &metadata, HDRVividExtendMetadata &extendMetadata)
856 {
857 extendMetadata.metaISO.writeVersion = metadata.writerVersion;
858 extendMetadata.metaISO.miniVersion = metadata.minVersion;
859 extendMetadata.metaISO.gainmapChannelNum = metadata.gainmapChannelNum;
860 extendMetadata.metaISO.useBaseColorFlag = metadata.useBaseColorFlag;
861 extendMetadata.metaISO.baseHeadroom = metadata.baseHdrHeadroom;
862 extendMetadata.metaISO.alternateHeadroom = metadata.alternateHdrHeadroom;
863
864 extendMetadata.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_ZERO] = metadata.gainmapMax[INDEX_ZERO];
865 extendMetadata.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_ONE] = metadata.gainmapMax[INDEX_ONE];
866 extendMetadata.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_TWO] = metadata.gainmapMax[INDEX_TWO];
867
868 extendMetadata.metaISO.enhanceClippedThreholdMinGainmap[INDEX_ZERO] = metadata.gainmapMin[INDEX_ZERO];
869 extendMetadata.metaISO.enhanceClippedThreholdMinGainmap[INDEX_ONE] = metadata.gainmapMin[INDEX_ONE];
870 extendMetadata.metaISO.enhanceClippedThreholdMinGainmap[INDEX_TWO] = metadata.gainmapMin[INDEX_TWO];
871
872 extendMetadata.metaISO.enhanceMappingGamma[INDEX_ZERO] = metadata.gamma[INDEX_ZERO];
873 extendMetadata.metaISO.enhanceMappingGamma[INDEX_ONE] = metadata.gamma[INDEX_ONE];
874 extendMetadata.metaISO.enhanceMappingGamma[INDEX_TWO] = metadata.gamma[INDEX_TWO];
875
876 extendMetadata.metaISO.enhanceMappingBaselineOffset[INDEX_ZERO] = metadata.baselineOffset[INDEX_ZERO];
877 extendMetadata.metaISO.enhanceMappingBaselineOffset[INDEX_ONE] = metadata.baselineOffset[INDEX_ONE];
878 extendMetadata.metaISO.enhanceMappingBaselineOffset[INDEX_TWO] = metadata.baselineOffset[INDEX_TWO];
879
880 extendMetadata.metaISO.enhanceMappingAlternateOffset[INDEX_ZERO] = metadata.alternateOffset[INDEX_ZERO];
881 extendMetadata.metaISO.enhanceMappingAlternateOffset[INDEX_ONE] = metadata.alternateOffset[INDEX_ONE];
882 extendMetadata.metaISO.enhanceMappingAlternateOffset[INDEX_TWO] = metadata.alternateOffset[INDEX_TWO];
883 }
884
BuildGainmapMetadata(OHOS::Media::PixelMap & pixelmap,OH_Pixelmap_HdrGainmapMetadata & metadata,std::vector<uint8_t> & extendMetadataVec)885 static bool BuildGainmapMetadata(OHOS::Media::PixelMap &pixelmap, OH_Pixelmap_HdrGainmapMetadata &metadata,
886 std::vector<uint8_t> &extendMetadataVec)
887 {
888 HDRVividExtendMetadata extendMetadata;
889 #ifdef IMAGE_COLORSPACE_FLAG
890 OHOS::ColorManager::ColorSpace colorSpace = pixelmap.InnerGetGrColorSpace();
891 uint16_t SS = ColorUtils::GetPrimaries(colorSpace.GetColorSpaceName());
892 #else
893 uint16_t SS = 0;
894 #endif
895 extendMetadata.baseColorMeta.baseColorPrimary = SS;
896 extendMetadata.gainmapColorMeta.combineColorPrimary = metadata.useBaseColorFlag ? SS: (uint8_t)CM_BT2020_HLG_FULL;
897 extendMetadata.gainmapColorMeta.enhanceDataColorModel = metadata.useBaseColorFlag ? SS: (uint8_t)CM_BT2020_HLG_FULL;
898 extendMetadata.gainmapColorMeta.alternateColorPrimary = (uint8_t)CM_BT2020_HLG_FULL;
899 ConvertGainmapMetadata(metadata, extendMetadata);
900 uint32_t vecSize = sizeof(HDRVividExtendMetadata);
901 if (memcpy_s(extendMetadataVec.data(), vecSize, &extendMetadata, vecSize) != EOK) {
902 return false;
903 }
904 return true;
905 }
906
SetHdrMetadata(OHOS::Media::PixelMap & pixelmap,OHOS::sptr<OHOS::SurfaceBuffer> & buffer,OH_Pixelmap_HdrMetadataKey key,OH_Pixelmap_HdrMetadataValue & value)907 static bool SetHdrMetadata(OHOS::Media::PixelMap &pixelmap, OHOS::sptr<OHOS::SurfaceBuffer> &buffer,
908 OH_Pixelmap_HdrMetadataKey key, OH_Pixelmap_HdrMetadataValue &value)
909 {
910 switch (key) {
911 case OH_Pixelmap_HdrMetadataKey::HDR_METADATA_TYPE:
912 if (NdkMetadataTypeMap.find(value.type) != NdkMetadataTypeMap.end()) {
913 VpeUtils::SetSbMetadataType(buffer, NdkMetadataTypeMap[value.type]);
914 }
915 break;
916 case OH_Pixelmap_HdrMetadataKey::HDR_STATIC_METADATA:
917 {
918 OH_Pixelmap_HdrStaticMetadata &staticMetadata = value.staticMetadata;
919 uint32_t vecSize = sizeof(HDI::Display::Graphic::Common::V1_0::HdrStaticMetadata);
920 std::vector<uint8_t> metadataVec(vecSize);
921 if (!ConvertStaticMetadata(staticMetadata, metadataVec)) {
922 return false;
923 }
924 if (!VpeUtils::SetSbStaticMetadata(buffer, metadataVec)) {
925 return false;
926 }
927 }
928 break;
929 case OH_Pixelmap_HdrMetadataKey::HDR_DYNAMIC_METADATA:
930 {
931 std::vector<uint8_t> metadataVec(value.dynamicMetadata.length);
932 if (memcpy_s(metadataVec.data(), value.dynamicMetadata.length, value.dynamicMetadata.data,
933 value.dynamicMetadata.length) != EOK) {
934 return false;
935 }
936 if (!VpeUtils::SetSbDynamicMetadata(buffer, metadataVec)) {
937 return false;
938 }
939 }
940 break;
941 case OH_Pixelmap_HdrMetadataKey::HDR_GAINMAP_METADATA:
942 {
943 std::vector<uint8_t> extendMetadataVec(sizeof(HDRVividExtendMetadata));
944 if (!BuildGainmapMetadata(pixelmap, value.gainmapMetadata, extendMetadataVec)) {
945 return false;
946 }
947 if (!VpeUtils::SetSbDynamicMetadata(buffer, extendMetadataVec)) {
948 return false;
949 }
950 }
951 break;
952 default:
953 break;
954 }
955
956 return true;
957 }
958
959 MIDK_EXPORT
OH_PixelmapNative_SetMetadata(OH_PixelmapNative * pixelmap,OH_Pixelmap_HdrMetadataKey key,OH_Pixelmap_HdrMetadataValue * value)960 Image_ErrorCode OH_PixelmapNative_SetMetadata(OH_PixelmapNative *pixelmap, OH_Pixelmap_HdrMetadataKey key,
961 OH_Pixelmap_HdrMetadataValue *value)
962 {
963 if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || value == nullptr) {
964 return IMAGE_BAD_PARAMETER;
965 }
966
967 if (pixelmap->GetInnerPixelmap()->GetAllocatorType() != AllocatorType::DMA_ALLOC) {
968 return IMAGE_DMA_NOT_EXIST;
969 }
970
971 OHOS::sptr<OHOS::SurfaceBuffer> surfaceBuffer(
972 reinterpret_cast<OHOS::SurfaceBuffer*>(pixelmap->GetInnerPixelmap()->GetFd()));
973 if (!SetHdrMetadata(*(pixelmap->GetInnerPixelmap().get()), surfaceBuffer, key, *value)) {
974 return IMAGE_COPY_FAILED;
975 }
976
977 return IMAGE_SUCCESS;
978 }
979
ConvertToOHGainmapMetadata(HDRVividExtendMetadata & src,OH_Pixelmap_HdrGainmapMetadata & dst)980 static void ConvertToOHGainmapMetadata(HDRVividExtendMetadata &src, OH_Pixelmap_HdrGainmapMetadata &dst)
981 {
982 dst.writerVersion = src.metaISO.writeVersion;
983 dst.minVersion = src.metaISO.miniVersion;
984 dst.gainmapChannelNum = src.metaISO.gainmapChannelNum;
985 dst.useBaseColorFlag = src.metaISO.useBaseColorFlag;
986 dst.baseHdrHeadroom = src.metaISO.baseHeadroom;
987 dst.alternateHdrHeadroom = src.metaISO.alternateHeadroom;
988
989 dst.gainmapMax[INDEX_ZERO] = src.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_ZERO];
990 dst.gainmapMax[INDEX_ONE] = src.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_ONE];
991 dst.gainmapMax[INDEX_TWO] = src.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_TWO];
992
993 dst.gainmapMin[INDEX_ZERO] = src.metaISO.enhanceClippedThreholdMinGainmap[INDEX_ZERO];
994 dst.gainmapMin[INDEX_ONE] = src.metaISO.enhanceClippedThreholdMinGainmap[INDEX_ONE];
995 dst.gainmapMin[INDEX_TWO] = src.metaISO.enhanceClippedThreholdMinGainmap[INDEX_TWO];
996
997 dst.gamma[INDEX_ZERO] = src.metaISO.enhanceMappingGamma[INDEX_ZERO];
998 dst.gamma[INDEX_ONE] = src.metaISO.enhanceMappingGamma[INDEX_ONE];
999 dst.gamma[INDEX_TWO] = src.metaISO.enhanceMappingGamma[INDEX_TWO];
1000
1001 dst.baselineOffset[INDEX_ZERO] = src.metaISO.enhanceMappingBaselineOffset[INDEX_ZERO];
1002 dst.baselineOffset[INDEX_ONE] = src.metaISO.enhanceMappingBaselineOffset[INDEX_ONE];
1003 dst.baselineOffset[INDEX_TWO] = src.metaISO.enhanceMappingBaselineOffset[INDEX_TWO];
1004
1005 dst.alternateOffset[INDEX_ZERO] = src.metaISO.enhanceMappingAlternateOffset[INDEX_ZERO];
1006 dst.alternateOffset[INDEX_ONE] = src.metaISO.enhanceMappingAlternateOffset[INDEX_ONE];
1007 dst.alternateOffset[INDEX_TWO] = src.metaISO.enhanceMappingAlternateOffset[INDEX_TWO];
1008 }
1009
ConvertTONdkStaticMetadata(HdrStaticMetadata & src,OH_Pixelmap_HdrStaticMetadata & dst)1010 static bool ConvertTONdkStaticMetadata(HdrStaticMetadata &src,
1011 OH_Pixelmap_HdrStaticMetadata &dst)
1012 {
1013 dst.displayPrimariesX[INDEX_ZERO] = src.smpte2086.displayPrimaryRed.x;
1014 dst.displayPrimariesY[INDEX_ZERO] = src.smpte2086.displayPrimaryRed.y;
1015 dst.displayPrimariesX[INDEX_ONE] = src.smpte2086.displayPrimaryGreen.x;
1016 dst.displayPrimariesY[INDEX_ONE] = src.smpte2086.displayPrimaryGreen.y;
1017 dst.displayPrimariesX[INDEX_TWO] = src.smpte2086.displayPrimaryBlue.x;
1018 dst.displayPrimariesY[INDEX_TWO] = src.smpte2086.displayPrimaryBlue.y;
1019 dst.whitePointX = src.smpte2086.whitePoint.x;
1020 dst.whitePointY = src.smpte2086.whitePoint.y;
1021 dst.maxLuminance = src.smpte2086.maxLuminance;
1022 dst.minLuminance = src.smpte2086.minLuminance;
1023 dst.maxContentLightLevel = src.cta861.maxContentLightLevel;
1024 dst.maxFrameAverageLightLevel = src.cta861.maxFrameAverageLightLevel;
1025 return true;
1026 }
1027
GetStaticMetadata(const OHOS::sptr<OHOS::SurfaceBuffer> & buffer,OH_Pixelmap_HdrMetadataValue * metadataValue)1028 static bool GetStaticMetadata(const OHOS::sptr<OHOS::SurfaceBuffer> &buffer,
1029 OH_Pixelmap_HdrMetadataValue *metadataValue)
1030 {
1031 std::vector<uint8_t> staticData;
1032 uint32_t vecSize = sizeof(HDI::Display::Graphic::Common::V1_0::HdrStaticMetadata);
1033 if (VpeUtils::GetSbStaticMetadata(buffer, staticData) &&
1034 (staticData.size() == vecSize)) {
1035 OH_Pixelmap_HdrStaticMetadata &dst = metadataValue->staticMetadata;
1036 HdrStaticMetadata &src = *(reinterpret_cast<HdrStaticMetadata*>(staticData.data()));
1037 return ConvertTONdkStaticMetadata(src, dst);
1038 }
1039 return false;
1040 }
1041
GetHdrMetadata(const OHOS::sptr<OHOS::SurfaceBuffer> & buffer,OH_Pixelmap_HdrMetadataKey key,OH_Pixelmap_HdrMetadataValue * metadataValue)1042 static bool GetHdrMetadata(const OHOS::sptr<OHOS::SurfaceBuffer> &buffer,
1043 OH_Pixelmap_HdrMetadataKey key, OH_Pixelmap_HdrMetadataValue *metadataValue)
1044 {
1045 if (buffer == nullptr || metadataValue == nullptr) {
1046 IMAGE_LOGE("GetHdrMetadata buffer is nullptr");
1047 return false;
1048 }
1049 switch (key) {
1050 case OH_Pixelmap_HdrMetadataKey::HDR_METADATA_TYPE:
1051 {
1052 CM_HDR_Metadata_Type type;
1053 VpeUtils::GetSbMetadataType(buffer, type);
1054 if (MetadataNdkTypeMap.find(type) != MetadataNdkTypeMap.end()) {
1055 metadataValue->type = MetadataNdkTypeMap[type];
1056 return true;
1057 }
1058 }
1059 break;
1060 case OH_Pixelmap_HdrMetadataKey::HDR_STATIC_METADATA:
1061 return GetStaticMetadata(buffer, metadataValue);
1062 break;
1063 case OH_Pixelmap_HdrMetadataKey::HDR_DYNAMIC_METADATA:
1064 {
1065 std::vector<uint8_t> dynamicData;
1066 if (VpeUtils::GetSbDynamicMetadata(buffer, dynamicData) && (dynamicData.size() > 0)) {
1067 metadataValue->dynamicMetadata.data = (uint8_t*)malloc(dynamicData.size());
1068 if (metadataValue->dynamicMetadata.data == nullptr || memcpy_s(metadataValue->dynamicMetadata.data,
1069 dynamicData.size(), dynamicData.data(), dynamicData.size()) != EOK) {
1070 return false;
1071 }
1072 metadataValue->dynamicMetadata.length = dynamicData.size();
1073 return true;
1074 }
1075 }
1076 break;
1077 case OH_Pixelmap_HdrMetadataKey::HDR_GAINMAP_METADATA:
1078 {
1079 std::vector<uint8_t> gainmapData;
1080 if (VpeUtils::GetSbDynamicMetadata(buffer, gainmapData) &&
1081 (gainmapData.size() == sizeof(HDRVividExtendMetadata))) {
1082 OH_Pixelmap_HdrGainmapMetadata &dst = metadataValue->gainmapMetadata;
1083 HDRVividExtendMetadata &src = *(reinterpret_cast<HDRVividExtendMetadata*>(gainmapData.data()));
1084 ConvertToOHGainmapMetadata(src, dst);
1085 return true;
1086 }
1087 }
1088 break;
1089 default:
1090 break;
1091 }
1092
1093 return false;
1094 }
1095
1096 MIDK_EXPORT
OH_PixelmapNative_GetMetadata(OH_PixelmapNative * pixelmap,OH_Pixelmap_HdrMetadataKey key,OH_Pixelmap_HdrMetadataValue ** value)1097 Image_ErrorCode OH_PixelmapNative_GetMetadata(OH_PixelmapNative *pixelmap, OH_Pixelmap_HdrMetadataKey key,
1098 OH_Pixelmap_HdrMetadataValue **value)
1099 {
1100 if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || value == nullptr || *value == nullptr) {
1101 return IMAGE_BAD_PARAMETER;
1102 }
1103
1104 if (pixelmap->GetInnerPixelmap()->GetAllocatorType() != AllocatorType::DMA_ALLOC) {
1105 return IMAGE_DMA_NOT_EXIST;
1106 }
1107
1108 OHOS::sptr<OHOS::SurfaceBuffer> sourceSurfaceBuffer(
1109 reinterpret_cast<OHOS::SurfaceBuffer*>(pixelmap->GetInnerPixelmap()->GetFd()));
1110 if (!GetHdrMetadata(sourceSurfaceBuffer, key, *value)) {
1111 return IMAGE_COPY_FAILED;
1112 }
1113 return IMAGE_SUCCESS;
1114 }
1115
1116 MIDK_EXPORT
OH_PixelmapNative_GetNativeBuffer(OH_PixelmapNative * pixelmap,OH_NativeBuffer ** nativeBuffer)1117 Image_ErrorCode OH_PixelmapNative_GetNativeBuffer(OH_PixelmapNative *pixelmap, OH_NativeBuffer **nativeBuffer)
1118 {
1119 if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || nativeBuffer == nullptr) {
1120 return IMAGE_BAD_PARAMETER;
1121 }
1122
1123 if (pixelmap->GetInnerPixelmap()->GetAllocatorType() != AllocatorType::DMA_ALLOC) {
1124 return IMAGE_DMA_NOT_EXIST;
1125 }
1126
1127 OHOS::SurfaceBuffer *buffer = reinterpret_cast<OHOS::SurfaceBuffer*>(pixelmap->GetInnerPixelmap()->GetFd());
1128 if (buffer == nullptr) {
1129 return IMAGE_BAD_PARAMETER;
1130 }
1131 *nativeBuffer = buffer->SurfaceBufferToNativeBuffer();
1132 int32_t err = OH_NativeBuffer_Reference(*nativeBuffer);
1133 if (err != OHOS::SURFACE_ERROR_OK) {
1134 return IMAGE_DMA_OPERATION_FAILED;
1135 }
1136 return IMAGE_SUCCESS;
1137 }
1138
1139 MIDK_EXPORT
OH_PixelmapNative_GetColorSpaceNative(OH_PixelmapNative * pixelmap,OH_NativeColorSpaceManager ** colorSpaceNative)1140 Image_ErrorCode OH_PixelmapNative_GetColorSpaceNative(OH_PixelmapNative *pixelmap,
1141 OH_NativeColorSpaceManager **colorSpaceNative)
1142 {
1143 if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || colorSpaceNative == nullptr) {
1144 return IMAGE_BAD_PARAMETER;
1145 }
1146
1147 if (pixelmap->GetInnerPixelmap()->InnerGetGrColorSpacePtr() == nullptr) {
1148 return IMAGE_BAD_PARAMETER;
1149 }
1150
1151 std::shared_ptr<OHOS::ColorManager::ColorSpace> colorSpace =
1152 pixelmap->GetInnerPixelmap()->InnerGetGrColorSpacePtr();
1153 NativeColorSpaceManager* nativeColorspace = new NativeColorSpaceManager(*(colorSpace.get()));
1154
1155 *colorSpaceNative = reinterpret_cast<OH_NativeColorSpaceManager*>(nativeColorspace);
1156 return IMAGE_SUCCESS;
1157 }
1158
1159 MIDK_EXPORT
OH_PixelmapNative_SetColorSpaceNative(OH_PixelmapNative * pixelmap,OH_NativeColorSpaceManager * colorSpaceNative)1160 Image_ErrorCode OH_PixelmapNative_SetColorSpaceNative(OH_PixelmapNative *pixelmap,
1161 OH_NativeColorSpaceManager *colorSpaceNative)
1162 {
1163 if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || colorSpaceNative == nullptr) {
1164 return IMAGE_BAD_PARAMETER;
1165 }
1166
1167 ColorManager::ColorSpace nativeColorspace =
1168 reinterpret_cast<NativeColorSpaceManager*>(colorSpaceNative)->GetInnerColorSpace();
1169
1170 pixelmap->GetInnerPixelmap()->InnerSetColorSpace(nativeColorspace, true);
1171 return IMAGE_SUCCESS;
1172 }
1173
1174 MIDK_EXPORT
OH_PixelmapNative_SetMemoryName(OH_PixelmapNative * pixelmap,char * name,size_t * size)1175 Image_ErrorCode OH_PixelmapNative_SetMemoryName(OH_PixelmapNative *pixelmap, char *name, size_t *size)
1176 {
1177 if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || name == nullptr || size == nullptr) {
1178 return IMAGE_BAD_PARAMETER;
1179 }
1180 uint32_t ret = pixelmap->GetInnerPixelmap()->SetMemoryName(std::string(name, *size));
1181 if (ret == SUCCESS) {
1182 return IMAGE_SUCCESS;
1183 } else if (ret == COMMON_ERR_INVALID_PARAMETER) {
1184 return IMAGE_BAD_PARAMETER;
1185 } else if (ret == ERR_MEMORY_NOT_SUPPORT) {
1186 return IMAGE_UNSUPPORTED_MEMORY_FORMAT;
1187 }
1188 return IMAGE_SUCCESS;
1189 }
1190
1191 MIDK_EXPORT
OH_PixelmapNative_GetByteCount(OH_PixelmapNative * pixelmap,uint32_t * byteCount)1192 Image_ErrorCode OH_PixelmapNative_GetByteCount(OH_PixelmapNative *pixelmap, uint32_t *byteCount)
1193 {
1194 if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || byteCount == nullptr) {
1195 return IMAGE_BAD_PARAMETER;
1196 }
1197 int32_t rawByteCount = pixelmap->GetInnerPixelmap()->GetByteCount();
1198 if (rawByteCount <= 0) {
1199 return IMAGE_BAD_PARAMETER;
1200 }
1201 *byteCount = static_cast<uint32_t>(rawByteCount);
1202 return IMAGE_SUCCESS;
1203 }
1204
1205 MIDK_EXPORT
OH_PixelmapNative_GetAllocationByteCount(OH_PixelmapNative * pixelmap,uint32_t * allocationByteCount)1206 Image_ErrorCode OH_PixelmapNative_GetAllocationByteCount(OH_PixelmapNative *pixelmap, uint32_t *allocationByteCount)
1207 {
1208 if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || allocationByteCount == nullptr) {
1209 return IMAGE_BAD_PARAMETER;
1210 }
1211 uint32_t rawByteCount = pixelmap->GetInnerPixelmap()->GetAllocationByteCount();
1212 if (rawByteCount == 0) {
1213 return IMAGE_BAD_PARAMETER;
1214 }
1215 *allocationByteCount = rawByteCount;
1216 return IMAGE_SUCCESS;
1217 }
1218
1219 MIDK_EXPORT
OH_PixelmapNative_AccessPixels(OH_PixelmapNative * pixelmap,void ** addr)1220 Image_ErrorCode OH_PixelmapNative_AccessPixels(OH_PixelmapNative *pixelmap, void **addr)
1221 {
1222 if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || addr == nullptr) {
1223 return IMAGE_BAD_PARAMETER;
1224 }
1225 pixelmap->GetInnerPixelmap()->SetModifiable(false);
1226 *addr = pixelmap->GetInnerPixelmap()->GetWritablePixels();
1227 return IMAGE_SUCCESS;
1228 }
1229
1230 MIDK_EXPORT
OH_PixelmapNative_UnaccessPixels(OH_PixelmapNative * pixelmap)1231 Image_ErrorCode OH_PixelmapNative_UnaccessPixels(OH_PixelmapNative *pixelmap)
1232 {
1233 if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr) {
1234 return IMAGE_BAD_PARAMETER;
1235 }
1236 pixelmap->GetInnerPixelmap()->SetModifiable(true);
1237 return IMAGE_SUCCESS;
1238 }
1239
1240 #ifdef __cplusplus
1241 };
1242 #endif