#![doc(hidden)]
use super::*;
#[cfg(feature = "std")]
use std::ffi::CString;
#[cfg(not(feature = "std"))]
use alloc::ffi::CString;
#[no_mangle]
pub unsafe extern "C" fn spf_free_data(data: SPFData) {
if !data.data.is_null() {
unsafe {
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(
data.data,
data.data_length as usize,
)));
}
}
}
#[no_mangle]
pub unsafe extern "C" fn spf_free_layout(layout: SPFLayout) {
unsafe {
free_character_tables(layout.character_tables, layout.character_tables_length as usize);
free_color_tables(layout.color_tables, layout.color_tables_length as usize);
free_pixmap_tables(layout.pixmap_tables, layout.pixmap_tables_length as usize);
free_font_tables(layout.font_tables, layout.font_tables_length as usize);
}
}
unsafe fn free_character_tables(ptr: *mut SPFCharacterTable, len: usize) {
if ptr.is_null() {
return;
}
unsafe {
let tables = core::slice::from_raw_parts(ptr, len);
for table in tables {
if !table.characters.is_null() {
let chars = core::slice::from_raw_parts(
table.characters,
table.characters_length as usize,
);
for ch in chars {
if !ch.grapheme_cluster.is_null() {
drop(CString::from_raw(ch.grapheme_cluster));
}
}
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(
table.characters,
table.characters_length as usize,
)));
}
if !table.pixmap_table_indexes.is_null() {
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(
table.pixmap_table_indexes,
table.pixmap_table_indexes_length as usize,
)));
}
}
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(ptr, len)));
}
}
unsafe fn free_color_tables(ptr: *mut SPFColorTable, len: usize) {
if ptr.is_null() {
return;
}
unsafe {
let tables = core::slice::from_raw_parts(ptr, len);
for table in tables {
if !table.colors.is_null() {
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(
table.colors,
table.colors_length as usize,
)));
}
}
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(ptr, len)));
}
}
unsafe fn free_pixmap_tables(ptr: *mut SPFPixmapTable, len: usize) {
if ptr.is_null() {
return;
}
unsafe {
let tables = core::slice::from_raw_parts(ptr, len);
for table in tables {
if !table.pixmaps.is_null() {
let pixmaps = core::slice::from_raw_parts(
table.pixmaps,
table.pixmaps_length as usize,
);
for pixmap in pixmaps {
if !pixmap.data.is_null() {
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(
pixmap.data,
pixmap.data_length as usize,
)));
}
}
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(
table.pixmaps,
table.pixmaps_length as usize,
)));
}
if !table.color_table_indexes.is_null() {
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(
table.color_table_indexes,
table.color_table_indexes_length as usize,
)));
}
}
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(ptr, len)));
}
}
unsafe fn free_font_tables(ptr: *mut SPFFontTable, len: usize) {
if ptr.is_null() {
return;
}
unsafe {
let tables = core::slice::from_raw_parts(ptr, len);
for table in tables {
if !table.fonts.is_null() {
let fonts = core::slice::from_raw_parts(
table.fonts,
table.fonts_length as usize,
);
for font in fonts {
if !font.name.is_null() {
drop(CString::from_raw(font.name));
}
if !font.author.is_null() {
drop(CString::from_raw(font.author));
}
if !font.character_table_indexes.is_null() {
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(
font.character_table_indexes,
font.character_tables_indexes_length as usize,
)));
}
}
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(
table.fonts,
table.fonts_length as usize,
)));
}
if !table.character_table_indexes.is_null() {
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(
table.character_table_indexes,
table.character_table_indexes_length as usize,
)));
}
}
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(ptr, len)));
}
}