/* This Source Code Form is subject to the terms of the Mozilla Public *License,v.2.0.IfacopyoftheMPLwasnotdistributedwiththis
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/// # Safety /// `has_cms` must be true only when a display color profile is available and CMS is /// enabled; when true the decoder requests Gray/GrayAlpha output for grayscale images. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_new(metadata_only: bool, has_cms: bool) -> *mut JxlApiDecoder { Box::into_raw(Box::new(JxlApiDecoder::new(metadata_only, has_cms)))
}
/// # Safety /// `decoder` must be a valid pointer returned by `jxl_decoder_new` and must not /// have been previously destroyed. After this call, `decoder` is invalid. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_destroy(decoder: *mut JxlApiDecoder) { if !decoder.is_null() { // SAFETY: Caller guarantees `decoder` is a valid pointer from `jxl_decoder_new` // and has not been destroyed. We take ownership and drop it. let _ = unsafe { Box::from_raw(decoder) };
}
}
/// # Safety /// - `decoder` must be a valid pointer returned by `jxl_decoder_new`. /// - `data` must be a valid pointer to a `*const u8` pointer. /// - `data_len` must be a valid pointer to a `usize`. /// - `*data` must point to a valid byte slice of length `*data_len`, or be null /// when `*data_len` is 0. /// - If `output_buffer` is non-null, it must point to a valid writable buffer /// of at least `output_buffer_len` bytes. /// - If `k_buffer` is non-null, it must point to a valid writable buffer of at /// least `k_buffer_len` bytes (for CMYK K channel, 1 byte per pixel). #[no_mangle] pubunsafeextern"C"fn jxl_decoder_process_data(
decoder: *mut JxlApiDecoder,
data: *mut *const u8,
data_len: *mut usize,
output_buffer: *mut u8,
output_buffer_len: usize,
k_buffer: *mut u8,
k_buffer_len: usize,
) -> JxlDecoderStatus {
debug_assert!(!decoder.is_null() && !data.is_null() && !data_len.is_null());
// SAFETY: Caller guarantees `decoder` is a valid, non-null pointer from `jxl_decoder_new`. let decoder = unsafe { &mut *decoder };
// SAFETY: Caller guarantees `data` and `data_len` are valid pointers, and that // `*data` points to a valid byte slice of length `*data_len` (or is null when // `*data_len` is 0). letmut data_slice = ifunsafe { (*data).is_null() } {
&[]
} else { // SAFETY: See above. unsafe { slice::from_raw_parts(*data, *data_len) }
};
let output_slice = if output_buffer.is_null() {
None
} else { // SAFETY: Caller guarantees that when `output_buffer` is non-null, it points // to a valid writable buffer of at least `output_buffer_len` bytes.
Some(unsafe { slice::from_raw_parts_mut(output_buffer, output_buffer_len) })
};
let k_slice = if k_buffer.is_null() {
None
} else { // SAFETY: Caller guarantees that when `k_buffer` is non-null, it points // to a valid writable buffer of at least `k_buffer_len` bytes.
Some(unsafe { slice::from_raw_parts_mut(k_buffer, k_buffer_len) })
};
let result = decoder.process_data(&mut data_slice, output_slice, k_slice);
// SAFETY: Caller guarantees `data` and `data_len` are valid, writable pointers. // We update them to reflect how much data was consumed. unsafe {
*data = data_slice.as_ptr();
*data_len = data_slice.len();
}
match result {
Ok(true) => JxlDecoderStatus::Ok,
Ok(false) => JxlDecoderStatus::NeedMoreData,
Err(_) => JxlDecoderStatus::Error,
}
}
/// # Safety /// `decoder` must be a valid pointer returned by `jxl_decoder_new`. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_has_black_channel(decoder: *const JxlApiDecoder) -> bool {
debug_assert!(!decoder.is_null()); // SAFETY: Caller guarantees valid pointer. let decoder = unsafe { &*decoder };
decoder.has_black_channel()
}
/// # Safety /// `decoder` must be a valid pointer returned by `jxl_decoder_new`. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_get_basic_info(decoder: *const JxlApiDecoder) -> JxlBasicInfo {
debug_assert!(!decoder.is_null());
// SAFETY: Caller guarantees `decoder` is a valid, non-null pointer from `jxl_decoder_new`. let decoder = unsafe { &*decoder };
let Some(info) = decoder.get_basic_info() else { return JxlBasicInfo::default();
};
/// # Safety /// `decoder` must be a valid pointer returned by `jxl_decoder_new`. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_get_frame_info(decoder: *const JxlApiDecoder) -> JxlFrameInfo {
debug_assert!(!decoder.is_null());
// SAFETY: Caller guarantees `decoder` is a valid, non-null pointer from `jxl_decoder_new`. let decoder = unsafe { &*decoder };
match decoder.frame_duration {
Some(duration) => JxlFrameInfo {
duration_ms: duration.clamp(0.0, i32::MAX as f64) as i32,
frame_duration_valid: true,
},
None => JxlFrameInfo::default(),
}
}
/// # Safety /// `decoder` must be a valid pointer returned by `jxl_decoder_new`. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_is_frame_ready(decoder: *const JxlApiDecoder) -> bool {
debug_assert!(!decoder.is_null());
// SAFETY: Caller guarantees `decoder` is a valid, non-null pointer from `jxl_decoder_new`. let decoder = unsafe { &*decoder };
decoder.frame_ready
}
/// # Safety /// `decoder` must be a valid pointer returned by `jxl_decoder_new`. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_is_gray(decoder: *const JxlApiDecoder) -> bool {
debug_assert!(!decoder.is_null()); // SAFETY: Caller guarantees `decoder` is a valid, non-null pointer from `jxl_decoder_new`. let decoder = unsafe { &*decoder };
decoder.is_gray()
}
/// # Safety /// `decoder` must be a valid pointer returned by `jxl_decoder_new`. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_use_f16(decoder: *const JxlApiDecoder) -> bool {
debug_assert!(!decoder.is_null());
// SAFETY: Caller guarantees `decoder` is a valid, non-null pointer from `jxl_decoder_new`. let decoder = unsafe { &*decoder };
decoder.use_f16
}
/// Returns a pointer to the output color profile ICC bytes and sets `*out_len`. /// The pointer is valid for the lifetime of the decoder. Returns null with len=0 /// if the profile is not yet available (pixel format not set / frame header not parsed). /// /// # Safety /// - `decoder` must be a valid pointer returned by `jxl_decoder_new`. /// - `out_len` must be a valid writable pointer to a `usize`. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_get_icc_profile(
decoder: *mut JxlApiDecoder,
out_len: *mut usize,
) -> *const u8 {
debug_assert!(!decoder.is_null() && !out_len.is_null());
// SAFETY: Caller guarantees `decoder` is a valid, non-null pointer from `jxl_decoder_new`. let decoder = unsafe { &mut *decoder };
let icc = decoder.get_output_icc_profile();
// SAFETY: Caller guarantees `out_len` is a valid writable pointer. unsafe { *out_len = icc.len() };
if icc.is_empty() {
std::ptr::null()
} else {
icc.as_ptr()
}
}
/// # Safety /// `decoder` must be a valid pointer returned by `jxl_decoder_new`. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_has_more_frames(decoder: *const JxlApiDecoder) -> bool {
debug_assert!(!decoder.is_null());
// SAFETY: Caller guarantees `decoder` is a valid, non-null pointer from `jxl_decoder_new`. let decoder = unsafe { &*decoder };
/// # Safety /// `decoder` must be a valid pointer returned by `jxl_scanner_new` or `jxl_decoder_new`. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_get_scanned_frame_count(decoder: *const JxlApiDecoder) -> u32 {
debug_assert!(!decoder.is_null()); // SAFETY: Caller guarantees valid pointer. let decoder = unsafe { &*decoder };
decoder.scanned_frames().len() as u32
}
/// # Safety /// `decoder` must be a valid pointer returned by `jxl_scanner_new` or `jxl_decoder_new`. /// `index` must be less than the value returned by `jxl_decoder_get_scanned_frame_count`. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_get_scanned_frame_info(
decoder: *const JxlApiDecoder,
index: u32,
) -> JxlFrameInfo {
debug_assert!(!decoder.is_null()); // SAFETY: Caller guarantees valid pointer. let decoder = unsafe { &*decoder }; let frames = decoder.scanned_frames(); let i = index as usize; if i >= frames.len() { return JxlFrameInfo::default();
} let f = &frames[i];
JxlFrameInfo {
duration_ms: f.duration_ms.clamp(0.0, i32::MAX as f64) as i32,
frame_duration_valid: true,
}
}
/// Flush partially-decoded pixels into `output_buffer`. /// `k_buffer` receives the K (Black) channel (1 byte/pixel) for CMYK images; pass null otherwise. /// # Safety /// - `decoder` must be a valid pointer returned by `jxl_decoder_new`. /// - `output_buffer` must be non-null and point to a valid writable buffer of /// at least `output_buffer_len` bytes. /// - If `k_buffer` is non-null, it must point to a valid writable buffer of at /// least `k_buffer_len` bytes. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_flush_pixels(
decoder: *mut JxlApiDecoder,
output_buffer: *mut u8,
output_buffer_len: usize,
k_buffer: *mut u8,
k_buffer_len: usize,
) -> JxlDecoderStatus {
debug_assert!(!decoder.is_null() && !output_buffer.is_null()); // SAFETY: Caller guarantees valid pointers. let decoder = unsafe { &mut *decoder }; // SAFETY: Caller guarantees output_buffer is non-null and valid for output_buffer_len bytes. let buf = unsafe { slice::from_raw_parts_mut(output_buffer, output_buffer_len) }; let k_slice = if k_buffer.is_null() {
None
} else { // SAFETY: Caller guarantees k_buffer is non-null and valid for k_buffer_len bytes.
Some(unsafe { slice::from_raw_parts_mut(k_buffer, k_buffer_len) })
}; // Ok(true) means new pixels were rendered and written to the buffer since // the last flush_pixels call. // Ok(false) means nothing new was rendered since the last flush_pixels // call. match decoder.flush_pixels(buf, k_slice) {
Ok(true) => JxlDecoderStatus::Ok,
Ok(false) => JxlDecoderStatus::NeedMoreData,
Err(_) => JxlDecoderStatus::Error,
}
}
/// # Safety /// `decoder` must be a valid pointer returned by `jxl_decoder_new`. #[no_mangle] pubunsafeextern"C"fn jxl_decoder_num_completed_passes(decoder: *const JxlApiDecoder) -> u32 {
debug_assert!(!decoder.is_null()); // SAFETY: Caller guarantees valid pointer. let decoder = unsafe { &*decoder };
decoder.num_completed_passes() as u32
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-08-25)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.