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