use crate::{q32, Result};
table! {
@write
#[derive(Copy)]
pub FontHeader {
major_version (u16) = { 1 },
minor_version (u16) |_, tape| { if cfg!(feature = "ignore-invalid-font-header-versions") {
tape.take()
} else {
Ok(table! { @read FontHeader, this.minor_version, tape [] [u16] [{ 0 }] })
}
},
revision (q32 ), checksum_adjustment (u32 ), magic_number (u32 ) = { 0x5F0F3CF5 }, flags (Flags ), units_per_em (u16 ), created (i64 ), modified (i64 ), min_x (i16 ), min_y (i16 ), max_x (i16 ), max_y (i16 ), macintosh_flags (MacintoshFlags), lowest_ppem (u16 ), direction_hint (i16 ), glyph_mapping_format (i16 ), glyph_data_format (i16 ), }
}
flags! {
pub Flags(u16) {
0b0000_0000_0000_0001 => is_baseline_at_0,
0b0000_0000_0000_0010 => is_left_side_bearing_at_0,
0b1000_0000_0000_0000 => is_invalid,
}
}
flags! {
pub MacintoshFlags(u16) {
0b0000_0000_0000_0001 => is_bold,
0b0000_0000_0000_0010 => is_italic,
0b0000_0000_0000_0100 => is_underline,
0b0000_0000_0000_1000 => is_outline,
0b0000_0000_0001_0000 => is_shadow,
0b0000_0000_0010_0000 => is_condensed,
0b0000_0000_0100_0000 => is_extended,
0b1111_1111_1000_0000 => is_invalid,
}
}
impl FontHeader {
pub const CHECKSUM_ADJUSTMENT: u32 = 0xB1B0AFBA;
pub fn checksum<T: crate::tape::Read>(tape: &mut T) -> Result<u32> {
let mut data = vec![];
tape.read_to_end(&mut data)?;
if data.len() % 4 != 0 {
raise!("found a malformed table layout");
}
let sum = data
.chunks_exact(4)
.map(TryInto::try_into)
.map(std::result::Result::unwrap)
.map(u32::from_be_bytes)
.fold(0u32, |sum, value| sum.wrapping_add(value));
Ok(Self::CHECKSUM_ADJUSTMENT.wrapping_sub(sum))
}
}