From 319f5b24119a22c882e0dd71b461f33edd36eba4 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Tue, 4 Mar 2025 21:51:02 +0800 Subject: [PATCH] fix: memory leak in some blend mode (#1015) * fix: memory leak in some blend mode By add correct drop handle for SkPicture * fmt --------- Co-authored-by: LISPCoC --- skia-c/skia_c.cpp | 5 +++++ skia-c/skia_c.hpp | 1 + src/sk.rs | 9 +++++++++ 3 files changed, 15 insertions(+) diff --git a/skia-c/skia_c.cpp b/skia-c/skia_c.cpp index 70ca0c40..9486ce98 100644 --- a/skia-c/skia_c.cpp +++ b/skia-c/skia_c.cpp @@ -848,6 +848,11 @@ extern "C" return reinterpret_cast(new_path); } + void skiac_picture_destroy(skiac_picture *c_picture) + { + reinterpret_cast(c_picture)->unref(); + } + // SkPictureRecorder skiac_picture_recorder *skiac_picture_recorder_create() { return reinterpret_cast(new SkPictureRecorder()); diff --git a/skia-c/skia_c.hpp b/skia-c/skia_c.hpp index bd9f0ac2..f97d8c89 100644 --- a/skia-c/skia_c.hpp +++ b/skia-c/skia_c.hpp @@ -544,6 +544,7 @@ extern "C" void skiac_svg_text_to_path(const uint8_t *data, size_t length, skiac_font_collection *c_collection, skiac_sk_data *output_data); // SkPictureRecorder + void skiac_picture_destroy(skiac_picture *c_picture); skiac_picture_recorder *skiac_picture_recorder_create(); void skiac_picture_recorder_begin_recording(skiac_picture_recorder *c_picture_recorder, float x, float y, float width, float height); skiac_canvas *skiac_picture_recorder_get_recording_canvas(skiac_picture_recorder *c_picture_recorder); diff --git a/src/sk.rs b/src/sk.rs index c8f84ccc..53b98290 100644 --- a/src/sk.rs +++ b/src/sk.rs @@ -859,6 +859,7 @@ pub mod ffi { ) -> *mut skiac_shader; pub fn skiac_bitmap_destroy(c_bitmap: *mut skiac_bitmap); + pub fn skiac_picture_destroy(c_picture: *mut skiac_picture); // SkString pub fn skiac_delete_sk_string(c_sk_string: *mut skiac_sk_string); @@ -3773,6 +3774,14 @@ impl Drop for SkWMemoryStream { #[derive(Debug)] pub struct SkPicture(*mut ffi::skiac_picture); +impl Drop for SkPicture { + fn drop(&mut self) { + unsafe { + ffi::skiac_picture_destroy(self.0); + } + } +} + #[derive(Debug)] pub struct SkPictureRecorder(pub(crate) *mut ffi::skiac_picture_recorder);