@@ -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]
545574fn 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