use super::*;
impl TryFrom<CharacterTable> for SPFCharacterTable {
type Error = ConversionError;
fn try_from(table: CharacterTable) -> Result<Self, Self::Error> {
let (pixmap_table_indexes_ptr, pixmap_table_indexes_len) =
option_vec_to_raw!(table.pixmap_table_indexes);
let (characters_ptr, characters_len) =
vec_to_raw_with_conversion!(table.characters, SPFCharacter);
Ok(SPFCharacterTable {
modifier_flags: table.modifier_flags.bits(),
configuration_flags: table.configuration_flags.bits(),
has_constant_code_point_count: table.constant_code_point_count.is_some() as c_uchar,
constant_code_point_count: table.constant_code_point_count.unwrap_or(0) as c_uchar,
link_flags: table.link_flags.bits(),
has_pixmap_table_indexes: table.pixmap_table_indexes.is_some() as c_uchar,
pixmap_table_indexes: pixmap_table_indexes_ptr,
pixmap_table_indexes_length: pixmap_table_indexes_len as c_ulong,
characters: characters_ptr,
characters_length: characters_len as c_ulong,
})
}
}
impl TryInto<CharacterTable> for &SPFCharacterTable {
type Error = ConversionError;
fn try_into(self) -> Result<CharacterTable, Self::Error> {
unsafe {
let pixmap_table_indexes = if self.pixmap_table_indexes.is_null() {
Vec::new()
} else {
slice::from_raw_parts(
self.pixmap_table_indexes,
self.pixmap_table_indexes_length as usize,
)
.to_vec()
};
let characters = vec_from_raw_with_conversion!(self.characters, self.characters_length);
let constant_code_point_count = ffi_to_option!(
self.has_constant_code_point_count,
self.constant_code_point_count
);
let pixmap_table_indexes =
ffi_to_option!(self.has_pixmap_table_indexes, pixmap_table_indexes);
Ok(CharacterTable {
modifier_flags: CharacterTableModifierFlags::from_bits_retain(self.modifier_flags),
configuration_flags: CharacterTableConfigurationFlags::from_bits_retain(self.configuration_flags),
constant_code_point_count,
link_flags: CharacterTableLinkFlags::from_bits_retain(self.link_flags),
pixmap_table_indexes,
characters,
})
}
}
}