Skip to content

Commit 9388d26

Browse files
committed
Fix C API unsetting callbacks
1 parent 85e13f7 commit 9388d26

4 files changed

Lines changed: 47 additions & 6 deletions

File tree

‎imagequant-sys/Cargo.toml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "imagequant-sys"
3-
version = "4.2.0"
3+
version = "4.5.0"
44
description = "Convert 24/32-bit images to 8-bit palette with alpha channel.\nC API/FFI libimagequant that powers pngquant lossy PNG compressor.\n\nDual-licensed like pngquant. See https://pngquant.org for details."
55
authors = ["Kornel Lesiński <kornel@pngquant.org>"]
66
license = "GPL-3.0-or-later"
@@ -14,7 +14,7 @@ readme = "README.md"
1414
edition = "2021"
1515
links = "imagequant"
1616
build = "build.rs"
17-
rust-version = "1.64"
17+
rust-version = "1.65"
1818

1919
[features]
2020
default = ["imagequant/default"]

‎imagequant-sys/src/ffi.rs‎

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,16 +182,24 @@ unsafe impl Sync for AnySyncSendPtr {}
182182

183183
#[no_mangle]
184184
#[inline(never)]
185-
pub unsafe extern "C" fn liq_attr_set_progress_callback(attr: &mut liq_attr, callback: liq_progress_callback_function, user_info: AnySyncSendPtr) {
185+
pub unsafe extern "C" fn liq_attr_set_progress_callback(attr: &mut liq_attr, callback: Option<liq_progress_callback_function>, user_info: AnySyncSendPtr) {
186186
if bad_object!(attr, LIQ_ATTR_MAGIC) { return; }
187+
let Some(callback) = callback else {
188+
attr.inner.clear_progress_callback();
189+
return;
190+
};
187191
let cb = move |f| if callback(f, user_info) == 0 { ControlFlow::Break} else { ControlFlow::Continue};
188192
attr.inner.set_progress_callback(cb);
189193
}
190194

191195
#[no_mangle]
192196
#[inline(never)]
193-
pub unsafe extern "C" fn liq_result_set_progress_callback(result: &mut liq_result, callback: liq_progress_callback_function, user_info: AnySyncSendPtr) {
197+
pub unsafe extern "C" fn liq_result_set_progress_callback(result: &mut liq_result, callback: Option<liq_progress_callback_function>, user_info: AnySyncSendPtr) {
194198
if bad_object!(result, LIQ_RESULT_MAGIC) { return; }
199+
let Some(callback) = callback else {
200+
result.inner.clear_progress_callback();
201+
return;
202+
};
195203
result.inner.set_progress_callback(move |f| if callback(f, user_info) == 0 { ControlFlow::Break} else { ControlFlow::Continue});
196204
}
197205

@@ -206,8 +214,12 @@ unsafe fn attr_to_liq_attr_ptr(ptr: &Attributes) -> &liq_attr {
206214

207215
#[no_mangle]
208216
#[inline(never)]
209-
pub unsafe extern "C" fn liq_set_log_callback(attr: &mut liq_attr, callback: liq_log_callback_function, user_info: AnySyncSendPtr) {
217+
pub unsafe extern "C" fn liq_set_log_callback(attr: &mut liq_attr, callback: Option<liq_log_callback_function>, user_info: AnySyncSendPtr) {
210218
if bad_object!(attr, LIQ_ATTR_MAGIC) { return; }
219+
let Some(callback) = callback else {
220+
attr.inner.clear_log_callback();
221+
return;
222+
};
211223
attr.inner.set_log_callback(move |attr, msg| {
212224
if let Ok(tmp) = CString::new(msg) {
213225
callback(attr_to_liq_attr_ptr(attr), tmp.as_ptr(), user_info);
@@ -217,8 +229,12 @@ pub unsafe extern "C" fn liq_set_log_callback(attr: &mut liq_attr, callback: liq
217229

218230
#[no_mangle]
219231
#[inline(never)]
220-
pub unsafe extern "C" fn liq_set_log_flush_callback(attr: &mut liq_attr, callback: liq_log_flush_callback_function, user_info: AnySyncSendPtr) {
232+
pub unsafe extern "C" fn liq_set_log_flush_callback(attr: &mut liq_attr, callback: Option<liq_log_flush_callback_function>, user_info: AnySyncSendPtr) {
221233
if bad_object!(attr, LIQ_ATTR_MAGIC) { return; }
234+
let Some(callback) = callback else {
235+
attr.inner.clear_log_flush_callback();
236+
return;
237+
};
222238
attr.inner.set_log_flush_callback(move |attr| callback(attr_to_liq_attr_ptr(attr), user_info));
223239
}
224240

‎src/attr.rs‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,25 @@ impl Attributes {
225225
self.log_callback = Some(Arc::new(callback));
226226
}
227227

228+
/// Drop callback from `set_log_callback`
229+
pub fn clear_log_callback(&mut self) {
230+
self.log_callback = None;
231+
}
232+
228233
/// Callback for flushing output (if you buffer messages, that's the time to flush those buffers)
229234
#[inline]
230235
pub fn set_log_flush_callback<F: Fn(&Self) + Send + Sync + 'static>(&mut self, callback: F) {
231236
self.verbose_printf_flush();
232237
self.log_flush_callback = Some(Arc::new(callback));
233238
}
234239

240+
/// Drop callback from `set_log_flush_callback`
241+
#[inline]
242+
pub fn clear_log_flush_callback(&mut self) {
243+
self.verbose_printf_flush();
244+
self.log_flush_callback = None;
245+
}
246+
235247
/// Set callback function to be called every time the library makes a progress.
236248
/// It can be used to cancel operation early.
237249
///
@@ -241,6 +253,11 @@ impl Attributes {
241253
self.progress_callback = Some(Arc::new(callback));
242254
}
243255

256+
/// Drop callback from `set_progress_callback`
257+
pub fn clear_progress_callback(&mut self) {
258+
self.progress_callback = None;
259+
}
260+
244261
/// Move transparent color to the last entry in the palette
245262
///
246263
/// This is less efficient for PNG, but required by some broken software

‎src/quant.rs‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,14 @@ impl QuantizationResult {
224224
self.progress_callback = Some(Box::new(callback));
225225
}
226226

227+
/// Drop callback from `set_progress_callback`
228+
#[inline(always)]
229+
pub fn clear_progress_callback(&mut self) {
230+
self.progress_callback = None;
231+
}
232+
233+
234+
227235
// true == abort
228236
pub(crate) fn remap_progress(&self, percent: f32) -> bool {
229237
self.progress_callback.as_ref().map_or(false, |cb| cb(percent) == ControlFlow::Break)

0 commit comments

Comments
 (0)