diff --git a/frameworks/kits/js/common/pixel_map_napi.cpp b/frameworks/kits/js/common/pixel_map_napi.cpp index 2689456884fe39ed5fdeb1d049530fe8e50374fc..6c695c8656bc3536c2508f2156beaa70c6d43aa7 100644 --- a/frameworks/kits/js/common/pixel_map_napi.cpp +++ b/frameworks/kits/js/common/pixel_map_napi.cpp @@ -1792,6 +1792,23 @@ napi_value PixelMapNapi::CreatePixelMap(napi_env env, std::shared_ptr return result; } +extern "C" { +napi_value GetPixelMapNapi(napi_env env, std::shared_ptr pixelMap) +{ + return PixelMapNapi::CreatePixelMap(env, pixelMap); +} + +bool GetNativePixelMap(void* pixelMapNapi, std::shared_ptr &pixelMap) +{ + if (pixelMapNapi == nullptr) { + IMAGE_LOGE("%{public}s pixelMapNapi is nullptr", __func__); + return false; + } + pixelMap = reinterpret_cast(pixelMapNapi)->GetPixelNapiInner(); + return true; +} +} + STATIC_EXEC_FUNC(Unmarshalling) { #if !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) diff --git a/frameworks/kits/taihe/idl/ohos.multimedia.image.image.taihe b/frameworks/kits/taihe/idl/ohos.multimedia.image.image.taihe index 023cd71b5c0aa2b76eb020bef067b1bd593f4f0f..cc802b456448346d85a46cf549c09bb13600eec1 100644 --- a/frameworks/kits/taihe/idl/ohos.multimedia.image.image.taihe +++ b/frameworks/kits/taihe/idl/ohos.multimedia.image.image.taihe @@ -899,6 +899,9 @@ function ImageReceiverTransferDynamicImpl(input: ImageReceiver): @sts_type("Any" function ImageCreatorTransferStaticImpl(input: @sts_type("ESValue") Opaque): ImageCreator; function ImageCreatorTransferDynamicImpl(input: ImageCreator): @sts_type("Any") Opaque; +function PixelMapTransferStaticImpl(input: @sts_type("ESValue") Opaque): PixelMap; +function PixelMapTransferDynamicImpl(input: PixelMap): @sts_type("Any") Opaque; + @!sts_inject(""" export function imageSourceTransferStatic(input: Any): Object { return imageSourceTransferStaticImpl(ESValue.wrap(input)); @@ -941,6 +944,13 @@ export function imageCreatorTransferStatic(input: Any): Object { export function imageCreatorTransferDynamic(input: Object): Any { return imageCreatorTransferDynamicImpl(input as ImageCreator); } + +export function pixelMapTransferStatic(input: Any): Object { + return pixelMapTransferStaticImpl(ESValue.wrap(input)); +} +export function pixelMapTransferDynamic(input: Object): Any { + return pixelMapTransferDynamicImpl(input as PixelMap); +} """) // global functions diff --git a/frameworks/kits/taihe/include/transfer_taihe.h b/frameworks/kits/taihe/include/transfer_taihe.h index bf5159267f32a9a2e6bf902380da8894aa68feaf..83e6b660ecf8feb90878b958fcd2fa2a38ec7e3b 100644 --- a/frameworks/kits/taihe/include/transfer_taihe.h +++ b/frameworks/kits/taihe/include/transfer_taihe.h @@ -43,6 +43,9 @@ uintptr_t ImageReceiverTransferDynamicImpl(ImageReceiver input); ImageCreator ImageCreatorTransferStaticImpl(uintptr_t input); uintptr_t ImageCreatorTransferDynamicImpl(ImageCreator input); + +PixelMap PixelMapTransferStaticImpl(uintptr_t input); +uintptr_t PixelMapTransferDynamicImpl(weak::PixelMap input); } // namespace ANI::Image #endif // FRAMEWORKS_KITS_TAIHE_INCLUDE_TRANSFER_TAIHE_H \ No newline at end of file diff --git a/frameworks/kits/taihe/src/pixel_map_taihe.cpp b/frameworks/kits/taihe/src/pixel_map_taihe.cpp index b1615ba7cbb81b0cd650de58f072ce5c93b88c6d..cba0ec887ef3d8eba736be471f8fe720b909c295 100644 --- a/frameworks/kits/taihe/src/pixel_map_taihe.cpp +++ b/frameworks/kits/taihe/src/pixel_map_taihe.cpp @@ -232,7 +232,7 @@ PixelMapImpl::~PixelMapImpl() int64_t PixelMapImpl::GetImplPtr() { - return reinterpret_cast(this); + return static_cast(reinterpret_cast(this)); } std::shared_ptr PixelMapImpl::GetNativePtr() diff --git a/frameworks/kits/taihe/src/transfer_taihe.cpp b/frameworks/kits/taihe/src/transfer_taihe.cpp index 3786d568349d6d0b1bf83eddab0492e11fa5b468..556084d2a1bd75aa73d67770da16e469a4537594 100644 --- a/frameworks/kits/taihe/src/transfer_taihe.cpp +++ b/frameworks/kits/taihe/src/transfer_taihe.cpp @@ -24,6 +24,7 @@ #include "interop_js/arkts_esvalue.h" #include "interop_js/arkts_interop_js_api.h" #include "picture_taihe.h" +#include "pixel_map_taihe.h" #include "transfer_taihe.h" using namespace ANI::Image; @@ -38,6 +39,7 @@ using GetPictureNapiFn = napi_value (*)(napi_env, std::shared_ptr); using GetImageReceiverNapiFn = napi_value (*)(napi_env, std::shared_ptr); using GetImageCreatorNapiFn = napi_value (*)(napi_env, std::shared_ptr); +using GetPixelMapNapiFn = napi_value (*)(napi_env, std::shared_ptr); using GetNativeImageSourceFn = bool (*)(void*, std::shared_ptr&); using GetNativeImagePackerFn = bool (*)(void*, std::shared_ptr&); @@ -45,6 +47,7 @@ using GetNativePictureFn = bool (*)(void*, std::shared_ptr using GetNativeAuxiliaryPictureFn = bool (*)(void*, std::shared_ptr&); using GetNativeImageReceiverFn = bool (*)(void*, std::shared_ptr&); using GetNativeImageCreatorFn = bool (*)(void*, std::shared_ptr&); +using GetNativePixelMapFn = bool (*)(void*, std::shared_ptr&); // custom deleter for handle to auto dlclose struct DlHandleDeleter { @@ -476,6 +479,71 @@ uintptr_t ImageCreatorTransferDynamicImpl(ImageCreator input) IMAGE_LOGD("[%{public}s] OUT", __func__); return ref; } + +PixelMap PixelMapTransferStaticImpl(uintptr_t input) +{ + IMAGE_LOGD("[%{public}s] IN", __func__); + ani_object esValue = reinterpret_cast(input); + + void* nativePtr = nullptr; + if (!arkts_esvalue_unwrap(get_env(), esValue, &nativePtr) || nativePtr == nullptr) { + IMAGE_LOGE("%{public}s unwrap esValue failed", __func__); + return make_holder(); + } + + void* napiFunc = GetNapiFunction("GetNativePixelMap"); + if (napiFunc == nullptr) { + IMAGE_LOGE("%{public}s GetNapiFunction failed", __func__); + return make_holder(); + } + + std::shared_ptr nativePixelMap = nullptr; + bool ret = (*reinterpret_cast(napiFunc))(nativePtr, nativePixelMap); + if (!ret || nativePixelMap == nullptr) { + IMAGE_LOGE("%{public}s GetNativePixelMap failed", __func__); + return make_holder(); + } + IMAGE_LOGD("[%{public}s] OUT", __func__); + return make_holder(nativePixelMap); +} + +uintptr_t PixelMapTransferDynamicImpl(weak::PixelMap input) +{ + IMAGE_LOGD("[%{public}s] IN", __func__); + if (input.is_error()) { + IMAGE_LOGE("%{public}s input is error", __func__); + return 0; + } + PixelMapImpl* thisPtr = reinterpret_cast(input->GetImplPtr()); + if (thisPtr == nullptr) { + IMAGE_LOGE("%{public}s thisPtr is nullptr", __func__); + return 0; + } + + napi_env jsEnv; + if (!arkts_napi_scope_open(get_env(), &jsEnv)) { + IMAGE_LOGE("%{public}s arkts_napi_scope_open failed", __func__); + return 0; + } + + void* napiFunc = GetNapiFunction("GetPixelMapNapi"); + if (napiFunc == nullptr) { + IMAGE_LOGE("%{public}s GetNapiFunction failed", __func__); + arkts_napi_scope_close_n(jsEnv, 0, nullptr, nullptr); + return 0; + } + napi_value result = (*reinterpret_cast(napiFunc))(jsEnv, thisPtr->GetNativePtr()); + if (result == nullptr) { + IMAGE_LOGE("%{public}s GetPixelMapNapi failed, result is nullptr", __func__); + arkts_napi_scope_close_n(jsEnv, 0, nullptr, nullptr); + return 0; + } + + uintptr_t ref = 0; + arkts_napi_scope_close_n(jsEnv, 1, &result, reinterpret_cast(&ref)); + IMAGE_LOGD("[%{public}s] OUT", __func__); + return ref; +} } // namespace ANI::Image TH_EXPORT_CPP_API_ImageSourceTransferStaticImpl(ImageSourceTransferStaticImpl); @@ -489,4 +557,6 @@ TH_EXPORT_CPP_API_AuxiliaryPictureTransferDynamicImpl(AuxiliaryPictureTransferDy TH_EXPORT_CPP_API_ImageReceiverTransferStaticImpl(ImageReceiverTransferStaticImpl); TH_EXPORT_CPP_API_ImageReceiverTransferDynamicImpl(ImageReceiverTransferDynamicImpl); TH_EXPORT_CPP_API_ImageCreatorTransferStaticImpl(ImageCreatorTransferStaticImpl); -TH_EXPORT_CPP_API_ImageCreatorTransferDynamicImpl(ImageCreatorTransferDynamicImpl); \ No newline at end of file +TH_EXPORT_CPP_API_ImageCreatorTransferDynamicImpl(ImageCreatorTransferDynamicImpl); +TH_EXPORT_CPP_API_PixelMapTransferStaticImpl(PixelMapTransferStaticImpl); +TH_EXPORT_CPP_API_PixelMapTransferDynamicImpl(PixelMapTransferDynamicImpl); \ No newline at end of file diff --git a/interfaces/kits/js/common/include/pixel_map_napi.h b/interfaces/kits/js/common/include/pixel_map_napi.h index f7088dd13fddbb33de57c95055459ae0b3d4a720..a93e55fb0a09da29403bd943a756f924f3fe1fb9 100644 --- a/interfaces/kits/js/common/include/pixel_map_napi.h +++ b/interfaces/kits/js/common/include/pixel_map_napi.h @@ -229,6 +229,11 @@ private: std::shared_mutex mutex_; std::map> map_; }; + +extern "C" { + napi_value GetPixelMapNapi(napi_env env, std::shared_ptr pixelMap); + bool GetNativePixelMap(void* pixelMapNapi, std::shared_ptr &pixelMap); +} } // namespace Media } // namespace OHOS #endif // INTERFACES_KITS_JS_COMMON_INCLUDE_PIXEL_MAP_NAPI_H