Skip to content

Commit 029f0af

Browse files
KurtBoehmkornelski
authored andcommitted
Add liq_result_from_palette to the C interface
1 parent c156bf9 commit 029f0af

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

imagequant-sys/libimagequant.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ LIQ_EXPORT void liq_image_destroy(liq_image *img) LIQ_NONNULL;
121121

122122
LIQ_EXPORT LIQ_USERESULT liq_error liq_histogram_quantize(liq_histogram *const input_hist, liq_attr *const options, liq_result **result_output) LIQ_NONNULL;
123123
LIQ_EXPORT LIQ_USERESULT liq_error liq_image_quantize(liq_image *const input_image, liq_attr *const options, liq_result **result_output) LIQ_NONNULL;
124+
LIQ_EXPORT LIQ_USERESULT liq_error liq_result_from_palette(const liq_attr *options, const liq_color *palette, unsigned int palette_size, double gamma, liq_result **result_output) LIQ_NONNULL;
124125

125126
LIQ_EXPORT liq_error liq_set_dithering_level(liq_result *res, float dither_level) LIQ_NONNULL;
126127
LIQ_EXPORT liq_error liq_set_output_gamma(liq_result* res, double gamma) LIQ_NONNULL;

imagequant-sys/src/ffi.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,35 @@ pub extern "C" fn liq_histogram_quantize(hist: &mut liq_histogram, attr: &liq_at
541541
store_boxed_result(res, write_only_output)
542542
}
543543

544+
#[no_mangle]
545+
#[inline(never)]
546+
pub unsafe extern "C" fn liq_result_from_palette(
547+
attr: &liq_attr,
548+
palette: *const RGBA,
549+
palette_size: c_uint,
550+
gamma: f64,
551+
write_only_output: &mut MaybeUninit<Option<Box<liq_result>>>,
552+
) -> liq_error {
553+
if bad_object!(attr, LIQ_ATTR_MAGIC) {
554+
return Error::InvalidPointer;
555+
}
556+
let Ok(palette_size) = palette_size.try_into() else {
557+
return Error::ValueOutOfRange;
558+
};
559+
if liq_received_invalid_pointer(palette.cast()) {
560+
return Error::InvalidPointer;
561+
}
562+
563+
let attr = &attr.inner;
564+
let palette = std::slice::from_raw_parts(palette, palette_size);
565+
566+
let res = QuantizationResult::from_palette(attr, palette, gamma).map(|inner| liq_result {
567+
magic_header: LIQ_RESULT_MAGIC,
568+
inner,
569+
});
570+
store_boxed_result(res, write_only_output)
571+
}
572+
544573
#[inline]
545574
fn store_boxed_result<T>(res: Result<T, liq_error>, out: &mut MaybeUninit<Option<Box<T>>>) -> liq_error {
546575
match res {
@@ -710,6 +739,7 @@ fn link_every_symbol() {
710739
+ liq_quantize_image as *const c_void as usize
711740
+ liq_histogram_quantize as *const c_void as usize
712741
+ liq_image_quantize as *const c_void as usize
742+
+ liq_result_from_palette as *const c_void as usize
713743
+ liq_set_dithering_level as *const c_void as usize
714744
+ liq_set_output_gamma as *const c_void as usize
715745
+ liq_get_output_gamma as *const c_void as usize

0 commit comments

Comments
 (0)