From 7710296b8df15ca05320bb2b317276be8be79eeb Mon Sep 17 00:00:00 2001 From: Eunki Hong Date: Mon, 10 Mar 2025 15:58:05 +0900 Subject: [PATCH] Bind AsyncImageLoader ImageLoadedSignal connect-disconnect DevNote : Since C++ -> C#'s Dali::BaseHandle communication has dependenc of IntrusivePtr's copy operation, we should send independent PixelBuffer per each arguments instead of PixelBuffer*. Change-Id: I845d25ea3c655cec01797b1faa3609b99f356e5c Signed-off-by: Eunki Hong --- .../dali-toolkit/async-image-loader-wrap.cpp | 282 ++++++++++++++++++ .../dali-toolkit/dali-toolkit-wrap.cpp | 231 -------------- dali-csharp-binder/file.list | 1 + 3 files changed, 283 insertions(+), 231 deletions(-) create mode 100644 dali-csharp-binder/dali-toolkit/async-image-loader-wrap.cpp diff --git a/dali-csharp-binder/dali-toolkit/async-image-loader-wrap.cpp b/dali-csharp-binder/dali-toolkit/async-image-loader-wrap.cpp new file mode 100644 index 00000000..fb6d6c93 --- /dev/null +++ b/dali-csharp-binder/dali-toolkit/async-image-loader-wrap.cpp @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// EXTERNAL INCLUDES +#include + +#include +#include +#include +#include + +#include +#include + +// INTERNAL INCLUDES +#include + +extern SWIG_CSharpStringHelperCallback SWIG_csharp_string_callback; + +using namespace Dali; +using namespace Dali::Toolkit; + +namespace +{ + +// Since we only support communicate C#-C++ by pointer, +// We should connect new signal here, who use reference, and emit signal to C# by pointer. +// Note : Since Devel::PixelBuffer* didn't works well, (IntrusivePtr<> copy operation not be called) we should make BaseHandle as parameters +typedef void (SWIGSTDCALL* SWIG_PixelBufferLoadedSignal)(uint32_t, uint32_t, Devel::PixelBuffer, Devel::PixelBuffer, Devel::PixelBuffer); + +class AsyncImageLoaderCallbackConverter : public Dali::ConnectionTracker +{ +public: + AsyncImageLoaderCallbackConverter() = default; + ~AsyncImageLoaderCallbackConverter() = default; + +public: + void SetHandler(SWIG_PixelBufferLoadedSignal handler) + { + mHandler = handler; + } + SWIG_PixelBufferLoadedSignal GetHandler() const + { + return mHandler; + } + +public: /// Callbacks from AsyncImageLoader + void OnPixelBufferLoadedSignal(uint32_t id, std::vector& pixelBuffers) + { + if(mHandler) + { + static Devel::PixelBuffer sEmptyPixelBuffer; + mHandler(id, static_cast(pixelBuffers.size()) + , 0u < pixelBuffers.size() ? pixelBuffers[0] : sEmptyPixelBuffer + , 1u < pixelBuffers.size() ? pixelBuffers[1] : sEmptyPixelBuffer + , 2u < pixelBuffers.size() ? pixelBuffers[2] : sEmptyPixelBuffer); + } + } + +private: + SWIG_PixelBufferLoadedSignal mHandler{nullptr}; +}; + +using AsyncImageLoaderCallbackConverterPtr = std::shared_ptr; + +// Register callback converter, and destroy at delete. +std::unordered_map swig_asyncImageLoaderCallbackConverterMapper; + +inline void CreateCallbackConverter(const Dali::Toolkit::AsyncImageLoader* asyncImageLoader) +{ + if(swig_asyncImageLoaderCallbackConverterMapper.find(asyncImageLoader) == swig_asyncImageLoaderCallbackConverterMapper.end()) + { + swig_asyncImageLoaderCallbackConverterMapper[asyncImageLoader] = std::make_shared(); + } +} + +inline AsyncImageLoaderCallbackConverterPtr GetCallbackConverter(const Dali::Toolkit::AsyncImageLoader* asyncImageLoader) +{ + return swig_asyncImageLoaderCallbackConverterMapper[asyncImageLoader]; +} + +inline void DestroyCallbackConverter(const Dali::Toolkit::AsyncImageLoader* asyncImageLoader) +{ + swig_asyncImageLoaderCallbackConverterMapper.erase(asyncImageLoader); +} + +} + +#ifdef __cplusplus +extern "C" { +#endif + +SWIGEXPORT void SWIGSTDCALL CSharp_Dali_delete_AsyncImageLoader(void * jarg1) { + Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; + + arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; + { + try { + DestroyCallbackConverter(arg1); + delete arg1; + } CALL_CATCH_EXCEPTION(); + } +} + +SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_AsyncImageLoader_New() { + void * jresult ; + Dali::Toolkit::AsyncImageLoader result; + + { + try { + result = Dali::Toolkit::AsyncImageLoader::New(); + } CALL_CATCH_EXCEPTION(0); + } + + jresult = new Dali::Toolkit::AsyncImageLoader((const Dali::Toolkit::AsyncImageLoader &)result); + CreateCallbackConverter(static_cast(jresult)); + return jresult; +} + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Dali_AsyncImageLoader_Load__SWIG_0(void * jarg1, const char * jarg2) { + unsigned int jresult ; + Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; + uint32_t result; + + GUARD_ON_NULL_RET0(jarg1); + GUARD_ON_NULL_RET0(jarg2); + + arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; + std::string arg2(jarg2); + { + try { + result = (arg1)->Load((std::string const &)arg2); + } CALL_CATCH_EXCEPTION(0); + } + + jresult = result; + + return jresult; +} + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Dali_AsyncImageLoader_Load__SWIG_1(void * jarg1, const char * jarg2, void * jarg3) { + unsigned int jresult ; + Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; + Dali::ImageDimensions arg3 ; + uint32_t result; + + GUARD_ON_NULL_RET0(jarg1); + GUARD_ON_NULL_RET0(jarg2); + GUARD_ON_NULL_RET0(jarg3); + + arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; + std::string arg2(jarg2); + arg3 = *(Dali::ImageDimensions *)jarg3; + { + try { + result = (arg1)->Load((std::string const &)arg2, arg3); + } CALL_CATCH_EXCEPTION(0); + } + + jresult = result; + + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Dali_AsyncImageLoader_Load__SWIG_2(void * jarg1, const char * jarg2, void * jarg3, int jarg4, int jarg5, bool jarg6) { + unsigned int jresult ; + Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; + Dali::ImageDimensions arg3 ; + Dali::FittingMode::Type arg4 ; + Dali::SamplingMode::Type arg5 ; + bool arg6 ; + uint32_t result; + + GUARD_ON_NULL_RET0(jarg1); + GUARD_ON_NULL_RET0(jarg2); + GUARD_ON_NULL_RET0(jarg3); + + arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; + std::string arg2(jarg2); + arg3 = *(Dali::ImageDimensions *)jarg3; + arg4 = (Dali::FittingMode::Type)jarg4; + arg5 = (Dali::SamplingMode::Type)jarg5; + arg6 = jarg6 ? true : false; + { + try { + result = (arg1)->Load((std::string const &)arg2, arg3, arg4, arg5, arg6); + } CALL_CATCH_EXCEPTION(0); + } + + jresult = result; + + //argout typemap for const std::string& + + return jresult; +} + + +SWIGEXPORT bool SWIGSTDCALL CSharp_Dali_AsyncImageLoader_Cancel(void * jarg1, unsigned int jarg2) { + bool jresult ; + Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; + uint32_t arg2 ; + bool result; + + arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; + arg2 = (uint32_t)jarg2; + { + try { + result = (bool)(arg1)->Cancel(arg2); + } CALL_CATCH_EXCEPTION(0); + } + + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Dali_AsyncImageLoader_CancelAll(void * jarg1) { + Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; + + arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; + { + try { + (arg1)->CancelAll(); + } CALL_CATCH_EXCEPTION(); + } + +} + +// AsyncImageLoader Signals +GENERATE_SIGNAL(Dali::Toolkit::AsyncImageLoader*, void(*)(uint32_t, Dali::PixelData), Dali_AsyncImageLoader, ImageLoadedSignal); +// CSharp_Dali_AsyncImageLoader_ImageLoadedSignal_Connect +// CSharp_Dali_AsyncImageLoader_ImageLoadedSignal_Disconnect + +SWIGEXPORT void SWIGSTDCALL CSharp_Dali_AsyncImageLoader_PixelBufferLoadedSignal_Connect(void* caller, void* handler) +{ + GUARD_ON_NULL_RET(caller); + + try + { + Dali::Toolkit::AsyncImageLoader* asyncImageLoader = (Dali::Toolkit::AsyncImageLoader*)caller; + auto callbackConverter = GetCallbackConverter(asyncImageLoader); + DALI_ASSERT_ALWAYS(callbackConverter.get() && "Try to connect invalid AsyncImageLoader!"); + callbackConverter->SetHandler((SWIG_PixelBufferLoadedSignal)handler); + Dali::Toolkit::DevelAsyncImageLoader::PixelBufferLoadedSignal(*asyncImageLoader).Connect(callbackConverter.get(), &AsyncImageLoaderCallbackConverter::OnPixelBufferLoadedSignal); + } + CALL_CATCH_EXCEPTION(); +} + +SWIGEXPORT void SWIGSTDCALL CSharp_Dali_AsyncImageLoader_PixelBufferLoadedSignal_Disconnect(void* caller, void* handler) +{ + GUARD_ON_NULL_RET(caller); + + try + { + Dali::Toolkit::AsyncImageLoader* asyncImageLoader = (Dali::Toolkit::AsyncImageLoader*)caller; + auto callbackConverter = GetCallbackConverter(asyncImageLoader); + DALI_ASSERT_ALWAYS(callbackConverter.get() && "Try to disconnect invalid AsyncImageLoader!"); + DALI_ASSERT_ALWAYS(callbackConverter->GetHandler() == (SWIG_PixelBufferLoadedSignal)handler && "Try to disconnect unmatched handler!"); + Dali::Toolkit::DevelAsyncImageLoader::PixelBufferLoadedSignal(*asyncImageLoader).Disconnect(callbackConverter.get(), &AsyncImageLoaderCallbackConverter::OnPixelBufferLoadedSignal); + callbackConverter->SetHandler((SWIG_PixelBufferLoadedSignal)nullptr); + } + CALL_CATCH_EXCEPTION(); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/dali-csharp-binder/dali-toolkit/dali-toolkit-wrap.cpp b/dali-csharp-binder/dali-toolkit/dali-toolkit-wrap.cpp index f88c943d..7964ba35 100644 --- a/dali-csharp-binder/dali-toolkit/dali-toolkit-wrap.cpp +++ b/dali-csharp-binder/dali-toolkit/dali-toolkit-wrap.cpp @@ -11254,237 +11254,6 @@ SWIGEXPORT void SWIGSTDCALL CSharp_Dali_VisualFactory_UsePreCompiledShader(void* CALL_CATCH_EXCEPTION(); } -SWIGEXPORT void SWIGSTDCALL CSharp_Dali_delete_AsyncImageLoader(void * jarg1) { - Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; - - arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; - { - try { - delete arg1; - } CALL_CATCH_EXCEPTION(); - } - -} - - -SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_new_AsyncImageLoader__SWIG_1(void * jarg1) { - void * jresult ; - Dali::Toolkit::AsyncImageLoader *arg1 = 0 ; - Dali::Toolkit::AsyncImageLoader *result = 0 ; - - arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; - if (!arg1) { - SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Dali::Toolkit::AsyncImageLoader const & type is null", 0); - return 0; - } - { - try { - result = (Dali::Toolkit::AsyncImageLoader *)new Dali::Toolkit::AsyncImageLoader((Dali::Toolkit::AsyncImageLoader const &)*arg1); - } CALL_CATCH_EXCEPTION(0); - } - - jresult = (void *)result; - return jresult; -} - - -SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_AsyncImageLoader_Assign(void * jarg1, void * jarg2) { - void * jresult ; - Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; - Dali::Toolkit::AsyncImageLoader *arg2 = 0 ; - Dali::Toolkit::AsyncImageLoader *result = 0 ; - - arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; - arg2 = (Dali::Toolkit::AsyncImageLoader *)jarg2; - if (!arg2) { - SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Dali::Toolkit::AsyncImageLoader const & type is null", 0); - return 0; - } - { - try { - result = (Dali::Toolkit::AsyncImageLoader *) &(arg1)->operator =((Dali::Toolkit::AsyncImageLoader const &)*arg2); - } CALL_CATCH_EXCEPTION(0); - } - - jresult = (void *)result; - return jresult; -} - - -SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_AsyncImageLoader_New() { - void * jresult ; - Dali::Toolkit::AsyncImageLoader result; - - { - try { - result = Dali::Toolkit::AsyncImageLoader::New(); - } CALL_CATCH_EXCEPTION(0); - } - - jresult = new Dali::Toolkit::AsyncImageLoader((const Dali::Toolkit::AsyncImageLoader &)result); - return jresult; -} - - - - -SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Dali_AsyncImageLoader_Load__SWIG_0(void * jarg1, char * jarg2) { - unsigned int jresult ; - Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; - std::string *arg2 = 0 ; - uint32_t result; - - arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; - if (!jarg2) { - SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); - return 0; - } - std::string arg2_str(jarg2); - arg2 = &arg2_str; - { - try { - result = (arg1)->Load((std::string const &)*arg2); - } CALL_CATCH_EXCEPTION(0); - } - - jresult = result; - - //argout typemap for const std::string& - - return jresult; -} - - -SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Dali_AsyncImageLoader_Load__SWIG_1(void * jarg1, char * jarg2, void * jarg3) { - unsigned int jresult ; - Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; - std::string *arg2 = 0 ; - Dali::ImageDimensions arg3 ; - Dali::ImageDimensions *argp3 ; - uint32_t result; - - arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; - if (!jarg2) { - SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); - return 0; - } - std::string arg2_str(jarg2); - arg2 = &arg2_str; - argp3 = (Dali::ImageDimensions *)jarg3; - if (!argp3) { - SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::ImageDimensions", 0); - return 0; - } - arg3 = *argp3; - { - try { - result = (arg1)->Load((std::string const &)*arg2,arg3); - } CALL_CATCH_EXCEPTION(0); - } - - jresult = result; - - //argout typemap for const std::string& - - return jresult; -} - - -SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Dali_AsyncImageLoader_Load__SWIG_2(void * jarg1, char * jarg2, void * jarg3, int jarg4, int jarg5, bool jarg6) { - unsigned int jresult ; - Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; - std::string *arg2 = 0 ; - Dali::ImageDimensions arg3 ; - Dali::FittingMode::Type arg4 ; - Dali::SamplingMode::Type arg5 ; - bool arg6 ; - Dali::ImageDimensions *argp3 ; - uint32_t result; - - arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; - if (!jarg2) { - SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); - return 0; - } - std::string arg2_str(jarg2); - arg2 = &arg2_str; - argp3 = (Dali::ImageDimensions *)jarg3; - if (!argp3) { - SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::ImageDimensions", 0); - return 0; - } - arg3 = *argp3; - arg4 = (Dali::FittingMode::Type)jarg4; - arg5 = (Dali::SamplingMode::Type)jarg5; - arg6 = jarg6 ? true : false; - { - try { - result = (arg1)->Load((std::string const &)*arg2,arg3,arg4,arg5,arg6); - } CALL_CATCH_EXCEPTION(0); - } - - jresult = result; - - //argout typemap for const std::string& - - return jresult; -} - - -SWIGEXPORT bool SWIGSTDCALL CSharp_Dali_AsyncImageLoader_Cancel(void * jarg1, unsigned int jarg2) { - bool jresult ; - Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; - uint32_t arg2 ; - bool result; - - arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; - arg2 = (uint32_t)jarg2; - { - try { - result = (bool)(arg1)->Cancel(arg2); - } CALL_CATCH_EXCEPTION(0); - } - - jresult = result; - return jresult; -} - - -SWIGEXPORT void SWIGSTDCALL CSharp_Dali_AsyncImageLoader_CancelAll(void * jarg1) { - Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; - - arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; - { - try { - (arg1)->CancelAll(); - } CALL_CATCH_EXCEPTION(); - } - -} - - -SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_AsyncImageLoader_ImageLoadedSignal(void * jarg1) { - void * jresult ; - Dali::Toolkit::AsyncImageLoader *arg1 = (Dali::Toolkit::AsyncImageLoader *) 0 ; - Dali::Toolkit::AsyncImageLoader::ImageLoadedSignalType *result = 0 ; - - arg1 = (Dali::Toolkit::AsyncImageLoader *)jarg1; - { - try { - result = (Dali::Toolkit::AsyncImageLoader::ImageLoadedSignalType *) &(arg1)->ImageLoadedSignal(); - } CALL_CATCH_EXCEPTION(0); - } - - jresult = (void *)result; - return jresult; -} - - - - - - - SWIGEXPORT void SWIGSTDCALL CSharp_Dali_delete_CustomAlgorithmInterface(void * jarg1) { Dali::Toolkit::DevelKeyboardFocusManager::CustomAlgorithmInterface *arg1 = (Dali::Toolkit::DevelKeyboardFocusManager::CustomAlgorithmInterface *) 0 ; diff --git a/dali-csharp-binder/file.list b/dali-csharp-binder/file.list index c495298f..c52419e8 100755 --- a/dali-csharp-binder/file.list +++ b/dali-csharp-binder/file.list @@ -56,6 +56,7 @@ SET( dali_csharp_binder_common_src_files ${dali_csharp_binder_dir}/dali-adaptor/window-wrap.cpp ${dali_csharp_binder_dir}/dali-toolkit/dali-toolkit-wrap.cpp + ${dali_csharp_binder_dir}/dali-toolkit/async-image-loader-wrap.cpp ${dali_csharp_binder_dir}/dali-toolkit/canvas-view-wrap.cpp ${dali_csharp_binder_dir}/dali-toolkit/control-devel-wrap.cpp ${dali_csharp_binder_dir}/dali-toolkit/devel-property-wrap.cpp -- 2.34.1