From 15882891e245df410077dd177458ef2cb2f58608 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 20 Apr 2024 13:46:10 +0800 Subject: [PATCH] use void callback for setBackgroundImage to correctly free pointer after dispatch --- ios/include/FlutterFilamentFFIApi.h | 2 +- ios/src/FlutterFilamentFFIApi.cpp | 7 +++++-- lib/filament/filament_controller_ffi.dart | 4 +++- lib/filament/generated_bindings.dart | 5 +++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ios/include/FlutterFilamentFFIApi.h b/ios/include/FlutterFilamentFFIApi.h index e4f50675..b79083ee 100644 --- a/ios/include/FlutterFilamentFFIApi.h +++ b/ios/include/FlutterFilamentFFIApi.h @@ -36,7 +36,7 @@ extern "C" FLUTTER_PLUGIN_EXPORT void update_viewport_and_camera_projection_ffi(void *const viewer, const uint32_t width, const uint32_t height, const float scaleFactor, void (*onComplete)()); FLUTTER_PLUGIN_EXPORT void set_background_color_ffi(void *const viewer, const float r, const float g, const float b, const float a); FLUTTER_PLUGIN_EXPORT void clear_background_image_ffi(void *const viewer); - FLUTTER_PLUGIN_EXPORT void set_background_image_ffi(void *const viewer, const char *path, bool fillHeight); + FLUTTER_PLUGIN_EXPORT void set_background_image_ffi(void *const viewer, const char *path, bool fillHeight, void (*onComplete)()); FLUTTER_PLUGIN_EXPORT void set_background_image_position_ffi(void *const viewer, float x, float y, bool clamp); FLUTTER_PLUGIN_EXPORT void set_tone_mapping_ffi(void *const viewer, int toneMapping); FLUTTER_PLUGIN_EXPORT void set_bloom_ffi(void *const viewer, float strength); diff --git a/ios/src/FlutterFilamentFFIApi.cpp b/ios/src/FlutterFilamentFFIApi.cpp index a3b93a01..779a10fa 100644 --- a/ios/src/FlutterFilamentFFIApi.cpp +++ b/ios/src/FlutterFilamentFFIApi.cpp @@ -307,9 +307,12 @@ FLUTTER_PLUGIN_EXPORT void clear_background_image_ffi(void *const viewer) { FLUTTER_PLUGIN_EXPORT void set_background_image_ffi(void *const viewer, const char *path, - bool fillHeight) { + bool fillHeight, void (*callback)()) { std::packaged_task lambda( - [=] { set_background_image(viewer, path, fillHeight); }); + [=] { + set_background_image(viewer, path, fillHeight); + callback(); + }); auto fut = _rl->add_task(lambda); } FLUTTER_PLUGIN_EXPORT void set_background_image_position_ffi(void *const viewer, diff --git a/lib/filament/filament_controller_ffi.dart b/lib/filament/filament_controller_ffi.dart index 2e9f946b..c6513929 100644 --- a/lib/filament/filament_controller_ffi.dart +++ b/lib/filament/filament_controller_ffi.dart @@ -531,8 +531,10 @@ class FilamentControllerFFI extends FilamentController { throw Exception("No viewer available, ignoring"); } final pathPtr = path.toNativeUtf8().cast(); + await _withVoidCallback((cb) { + set_background_image_ffi(_viewer!, pathPtr, fillHeight, cb); + }); - set_background_image_ffi(_viewer!, pathPtr, fillHeight); allocator.free(pathPtr); } diff --git a/lib/filament/generated_bindings.dart b/lib/filament/generated_bindings.dart index 306478a9..5e91552f 100644 --- a/lib/filament/generated_bindings.dart +++ b/lib/filament/generated_bindings.dart @@ -1147,13 +1147,14 @@ external void clear_background_image_ffi( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Pointer, ffi.Bool)>( + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Bool, ffi.Pointer>)>( symbol: 'set_background_image_ffi', assetId: 'flutter_filament_plugin') external void set_background_image_ffi( ffi.Pointer viewer, ffi.Pointer path, bool fillHeight, + ffi.Pointer> onComplete, ); @ffi.Native<