#[allow(unused_imports)]
use crate::codegen_prelude::*;
impl<'a> MinByteRange<'a> for OtKern<'a> {
fn min_byte_range(&self) -> Range<usize> {
0..self.subtable_data_byte_range().end
}
fn min_table_bytes(&self) -> &'a [u8] {
let range = self.min_byte_range();
self.offset_data().as_bytes().get(range).unwrap_or_default()
}
}
impl ReadArgs for OtKern<'_> {
type Args = ();
}
impl<'a> FontRead<'a> for OtKern<'a> {
fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
#[allow(clippy::absurd_extreme_comparisons)]
if data.len() < Self::MIN_SIZE {
return Err(ReadError::OutOfBounds);
}
let Some(data) = TableDataRef::new(data.as_bytes()) else {
return Err(ReadError::OutOfBounds);
};
Ok(Self { data })
}
}
#[derive(Clone, Copy, bytemuck :: AnyBitPattern)]
#[repr(C, packed)]
#[doc(hidden)]
pub struct OtKernFixedHeader {
pub version: BigEndian<u16>,
pub n_tables: BigEndian<u16>,
}
#[allow(clippy::absurd_extreme_comparisons)]
const _: () = assert!(std::mem::size_of::<OtKernFixedHeader>() <= OtKern::MIN_SIZE);
#[derive(Clone)]
pub struct OtKern<'a> {
data: TableDataRef<'a, OtKernFixedHeader>,
}
#[allow(clippy::needless_lifetimes)]
impl<'a> OtKern<'a> {
pub const MIN_SIZE: usize = (u16::RAW_BYTE_LEN + u16::RAW_BYTE_LEN);
basic_table_impls!(impl_the_methods);
pub fn version(&self) -> u16 {
self.data.header().version.get()
}
pub fn n_tables(&self) -> u16 {
self.data.header().n_tables.get()
}
pub fn subtable_data(&self) -> &'a [u8] {
let range = self.subtable_data_byte_range();
self.offset_data()
.read_array(range)
.ok()
.unwrap_or_default()
}
pub fn version_byte_range(&self) -> Range<usize> {
let start = 0;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn n_tables_byte_range(&self) -> Range<usize> {
let start = self.version_byte_range().end;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn subtable_data_byte_range(&self) -> Range<usize> {
let start = self.n_tables_byte_range().end;
let end = start
+ self.offset_data().len().saturating_sub(start) / u8::RAW_BYTE_LEN * u8::RAW_BYTE_LEN;
start..end
}
}
const _: () = assert!(FontData::default_data_long_enough(OtKern::MIN_SIZE));
impl Default for OtKern<'_> {
fn default() -> Self {
Self {
data: TableDataRef::new(FontData::default_table_data().as_bytes())
.unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
}
}
}
impl<'a> MinByteRange<'a> for AatKern<'a> {
fn min_byte_range(&self) -> Range<usize> {
0..self.subtable_data_byte_range().end
}
fn min_table_bytes(&self) -> &'a [u8] {
let range = self.min_byte_range();
self.offset_data().as_bytes().get(range).unwrap_or_default()
}
}
impl ReadArgs for AatKern<'_> {
type Args = ();
}
impl<'a> FontRead<'a> for AatKern<'a> {
fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
#[allow(clippy::absurd_extreme_comparisons)]
if data.len() < Self::MIN_SIZE {
return Err(ReadError::OutOfBounds);
}
let Some(data) = TableDataRef::new(data.as_bytes()) else {
return Err(ReadError::OutOfBounds);
};
Ok(Self { data })
}
}
#[derive(Clone, Copy, bytemuck :: AnyBitPattern)]
#[repr(C, packed)]
#[doc(hidden)]
pub struct AatKernFixedHeader {
pub version: BigEndian<MajorMinor>,
pub n_tables: BigEndian<u32>,
}
#[allow(clippy::absurd_extreme_comparisons)]
const _: () = assert!(std::mem::size_of::<AatKernFixedHeader>() <= AatKern::MIN_SIZE);
#[derive(Clone)]
pub struct AatKern<'a> {
data: TableDataRef<'a, AatKernFixedHeader>,
}
#[allow(clippy::needless_lifetimes)]
impl<'a> AatKern<'a> {
pub const MIN_SIZE: usize = (MajorMinor::RAW_BYTE_LEN + u32::RAW_BYTE_LEN);
basic_table_impls!(impl_the_methods);
pub fn version(&self) -> MajorMinor {
self.data.header().version.get()
}
pub fn n_tables(&self) -> u32 {
self.data.header().n_tables.get()
}
pub fn subtable_data(&self) -> &'a [u8] {
let range = self.subtable_data_byte_range();
self.offset_data()
.read_array(range)
.ok()
.unwrap_or_default()
}
pub fn version_byte_range(&self) -> Range<usize> {
let start = 0;
let end = start + MajorMinor::RAW_BYTE_LEN;
start..end
}
pub fn n_tables_byte_range(&self) -> Range<usize> {
let start = self.version_byte_range().end;
let end = start + u32::RAW_BYTE_LEN;
start..end
}
pub fn subtable_data_byte_range(&self) -> Range<usize> {
let start = self.n_tables_byte_range().end;
let end = start
+ self.offset_data().len().saturating_sub(start) / u8::RAW_BYTE_LEN * u8::RAW_BYTE_LEN;
start..end
}
}
const _: () = assert!(FontData::default_data_long_enough(AatKern::MIN_SIZE));
impl Default for AatKern<'_> {
fn default() -> Self {
Self {
data: TableDataRef::new(FontData::default_table_data().as_bytes())
.unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
}
}
}
impl<'a> MinByteRange<'a> for OtSubtable<'a> {
fn min_byte_range(&self) -> Range<usize> {
0..self.data_byte_range().end
}
fn min_table_bytes(&self) -> &'a [u8] {
let range = self.min_byte_range();
self.offset_data().as_bytes().get(range).unwrap_or_default()
}
}
impl ReadArgs for OtSubtable<'_> {
type Args = ();
}
impl<'a> FontRead<'a> for OtSubtable<'a> {
fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
#[allow(clippy::absurd_extreme_comparisons)]
if data.len() < Self::MIN_SIZE {
return Err(ReadError::OutOfBounds);
}
let Some(data) = TableDataRef::new(data.as_bytes()) else {
return Err(ReadError::OutOfBounds);
};
Ok(Self { data })
}
}
#[derive(Clone, Copy, bytemuck :: AnyBitPattern)]
#[repr(C, packed)]
#[doc(hidden)]
pub struct OtSubtableFixedHeader {
pub version: BigEndian<u16>,
pub length: BigEndian<u16>,
pub coverage: BigEndian<u16>,
}
#[allow(clippy::absurd_extreme_comparisons)]
const _: () = assert!(std::mem::size_of::<OtSubtableFixedHeader>() <= OtSubtable::MIN_SIZE);
#[derive(Clone)]
pub struct OtSubtable<'a> {
data: TableDataRef<'a, OtSubtableFixedHeader>,
}
#[allow(clippy::needless_lifetimes)]
impl<'a> OtSubtable<'a> {
pub const MIN_SIZE: usize = (u16::RAW_BYTE_LEN + u16::RAW_BYTE_LEN + u16::RAW_BYTE_LEN);
basic_table_impls!(impl_the_methods);
pub fn version(&self) -> u16 {
self.data.header().version.get()
}
pub fn length(&self) -> u16 {
self.data.header().length.get()
}
pub fn coverage(&self) -> u16 {
self.data.header().coverage.get()
}
pub fn data(&self) -> &'a [u8] {
let range = self.data_byte_range();
self.offset_data()
.read_array(range)
.ok()
.unwrap_or_default()
}
pub fn version_byte_range(&self) -> Range<usize> {
let start = 0;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn length_byte_range(&self) -> Range<usize> {
let start = self.version_byte_range().end;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn coverage_byte_range(&self) -> Range<usize> {
let start = self.length_byte_range().end;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn data_byte_range(&self) -> Range<usize> {
let start = self.coverage_byte_range().end;
let end = start
+ self.offset_data().len().saturating_sub(start) / u8::RAW_BYTE_LEN * u8::RAW_BYTE_LEN;
start..end
}
}
const _: () = assert!(FontData::default_data_long_enough(OtSubtable::MIN_SIZE));
impl Default for OtSubtable<'_> {
fn default() -> Self {
Self {
data: TableDataRef::new(FontData::default_table_data().as_bytes())
.unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
}
}
}
impl<'a> MinByteRange<'a> for AatSubtable<'a> {
fn min_byte_range(&self) -> Range<usize> {
0..self.data_byte_range().end
}
fn min_table_bytes(&self) -> &'a [u8] {
let range = self.min_byte_range();
self.offset_data().as_bytes().get(range).unwrap_or_default()
}
}
impl ReadArgs for AatSubtable<'_> {
type Args = ();
}
impl<'a> FontRead<'a> for AatSubtable<'a> {
fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
#[allow(clippy::absurd_extreme_comparisons)]
if data.len() < Self::MIN_SIZE {
return Err(ReadError::OutOfBounds);
}
let Some(data) = TableDataRef::new(data.as_bytes()) else {
return Err(ReadError::OutOfBounds);
};
Ok(Self { data })
}
}
#[derive(Clone, Copy, bytemuck :: AnyBitPattern)]
#[repr(C, packed)]
#[doc(hidden)]
pub struct AatSubtableFixedHeader {
pub length: BigEndian<u32>,
pub coverage: BigEndian<u16>,
pub tuple_index: BigEndian<u16>,
}
#[allow(clippy::absurd_extreme_comparisons)]
const _: () = assert!(std::mem::size_of::<AatSubtableFixedHeader>() <= AatSubtable::MIN_SIZE);
#[derive(Clone)]
pub struct AatSubtable<'a> {
data: TableDataRef<'a, AatSubtableFixedHeader>,
}
#[allow(clippy::needless_lifetimes)]
impl<'a> AatSubtable<'a> {
pub const MIN_SIZE: usize = (u32::RAW_BYTE_LEN + u16::RAW_BYTE_LEN + u16::RAW_BYTE_LEN);
basic_table_impls!(impl_the_methods);
pub fn length(&self) -> u32 {
self.data.header().length.get()
}
pub fn coverage(&self) -> u16 {
self.data.header().coverage.get()
}
pub fn tuple_index(&self) -> u16 {
self.data.header().tuple_index.get()
}
pub fn data(&self) -> &'a [u8] {
let range = self.data_byte_range();
self.offset_data()
.read_array(range)
.ok()
.unwrap_or_default()
}
pub fn length_byte_range(&self) -> Range<usize> {
let start = 0;
let end = start + u32::RAW_BYTE_LEN;
start..end
}
pub fn coverage_byte_range(&self) -> Range<usize> {
let start = self.length_byte_range().end;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn tuple_index_byte_range(&self) -> Range<usize> {
let start = self.coverage_byte_range().end;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn data_byte_range(&self) -> Range<usize> {
let start = self.tuple_index_byte_range().end;
let end = start
+ self.offset_data().len().saturating_sub(start) / u8::RAW_BYTE_LEN * u8::RAW_BYTE_LEN;
start..end
}
}
const _: () = assert!(FontData::default_data_long_enough(AatSubtable::MIN_SIZE));
impl Default for AatSubtable<'_> {
fn default() -> Self {
Self {
data: TableDataRef::new(FontData::default_table_data().as_bytes())
.unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
}
}
}
impl<'a> MinByteRange<'a> for Subtable0<'a> {
fn min_byte_range(&self) -> Range<usize> {
0..self.pairs_byte_range().end
}
fn min_table_bytes(&self) -> &'a [u8] {
let range = self.min_byte_range();
self.offset_data().as_bytes().get(range).unwrap_or_default()
}
}
impl ReadArgs for Subtable0<'_> {
type Args = ();
}
impl<'a> FontRead<'a> for Subtable0<'a> {
fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
#[allow(clippy::absurd_extreme_comparisons)]
if data.len() < Self::MIN_SIZE {
return Err(ReadError::OutOfBounds);
}
let Some(data) = TableDataRef::new(data.as_bytes()) else {
return Err(ReadError::OutOfBounds);
};
Ok(Self { data })
}
}
#[derive(Clone, Copy, bytemuck :: AnyBitPattern)]
#[repr(C, packed)]
#[doc(hidden)]
pub struct Subtable0FixedHeader {
pub n_pairs: BigEndian<u16>,
pub search_range: BigEndian<u16>,
pub entry_selector: BigEndian<u16>,
pub range_shift: BigEndian<u16>,
}
#[allow(clippy::absurd_extreme_comparisons)]
const _: () = assert!(std::mem::size_of::<Subtable0FixedHeader>() <= Subtable0::MIN_SIZE);
#[derive(Clone)]
pub struct Subtable0<'a> {
data: TableDataRef<'a, Subtable0FixedHeader>,
}
#[allow(clippy::needless_lifetimes)]
impl<'a> Subtable0<'a> {
pub const MIN_SIZE: usize =
(u16::RAW_BYTE_LEN + u16::RAW_BYTE_LEN + u16::RAW_BYTE_LEN + u16::RAW_BYTE_LEN);
basic_table_impls!(impl_the_methods);
pub fn n_pairs(&self) -> u16 {
self.data.header().n_pairs.get()
}
pub fn search_range(&self) -> u16 {
self.data.header().search_range.get()
}
pub fn entry_selector(&self) -> u16 {
self.data.header().entry_selector.get()
}
pub fn range_shift(&self) -> u16 {
self.data.header().range_shift.get()
}
pub fn pairs(&self) -> &'a [Subtable0Pair] {
let range = self.pairs_byte_range();
self.offset_data()
.read_array(range)
.ok()
.unwrap_or_default()
}
pub fn n_pairs_byte_range(&self) -> Range<usize> {
let start = 0;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn search_range_byte_range(&self) -> Range<usize> {
let start = self.n_pairs_byte_range().end;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn entry_selector_byte_range(&self) -> Range<usize> {
let start = self.search_range_byte_range().end;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn range_shift_byte_range(&self) -> Range<usize> {
let start = self.entry_selector_byte_range().end;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn pairs_byte_range(&self) -> Range<usize> {
let n_pairs = self.n_pairs();
let start = self.range_shift_byte_range().end;
let end =
start + (transforms::to_usize(n_pairs)).saturating_mul(Subtable0Pair::RAW_BYTE_LEN);
start..end
}
}
const _: () = assert!(FontData::default_data_long_enough(Subtable0::MIN_SIZE));
impl Default for Subtable0<'_> {
fn default() -> Self {
Self {
data: TableDataRef::new(FontData::default_table_data().as_bytes())
.unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
}
}
}
impl<'a> MinByteRange<'a> for Subtable2ClassTable<'a> {
fn min_byte_range(&self) -> Range<usize> {
0..self.offsets_byte_range().end
}
fn min_table_bytes(&self) -> &'a [u8] {
let range = self.min_byte_range();
self.offset_data().as_bytes().get(range).unwrap_or_default()
}
}
impl ReadArgs for Subtable2ClassTable<'_> {
type Args = ();
}
impl<'a> FontRead<'a> for Subtable2ClassTable<'a> {
fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
#[allow(clippy::absurd_extreme_comparisons)]
if data.len() < Self::MIN_SIZE {
return Err(ReadError::OutOfBounds);
}
let Some(data) = TableDataRef::new(data.as_bytes()) else {
return Err(ReadError::OutOfBounds);
};
Ok(Self { data })
}
}
#[derive(Clone, Copy, bytemuck :: AnyBitPattern)]
#[repr(C, packed)]
#[doc(hidden)]
pub struct Subtable2ClassTableFixedHeader {
pub first_glyph: BigEndian<GlyphId16>,
pub n_glyphs: BigEndian<u16>,
}
#[allow(clippy::absurd_extreme_comparisons)]
const _: () =
assert!(std::mem::size_of::<Subtable2ClassTableFixedHeader>() <= Subtable2ClassTable::MIN_SIZE);
#[derive(Clone)]
pub struct Subtable2ClassTable<'a> {
data: TableDataRef<'a, Subtable2ClassTableFixedHeader>,
}
#[allow(clippy::needless_lifetimes)]
impl<'a> Subtable2ClassTable<'a> {
pub const MIN_SIZE: usize = (GlyphId16::RAW_BYTE_LEN + u16::RAW_BYTE_LEN);
basic_table_impls!(impl_the_methods);
pub fn first_glyph(&self) -> GlyphId16 {
self.data.header().first_glyph.get()
}
pub fn n_glyphs(&self) -> u16 {
self.data.header().n_glyphs.get()
}
pub fn offsets(&self) -> &'a [BigEndian<u16>] {
let range = self.offsets_byte_range();
self.offset_data()
.read_array(range)
.ok()
.unwrap_or_default()
}
pub fn first_glyph_byte_range(&self) -> Range<usize> {
let start = 0;
let end = start + GlyphId16::RAW_BYTE_LEN;
start..end
}
pub fn n_glyphs_byte_range(&self) -> Range<usize> {
let start = self.first_glyph_byte_range().end;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn offsets_byte_range(&self) -> Range<usize> {
let n_glyphs = self.n_glyphs();
let start = self.n_glyphs_byte_range().end;
let end = start + (transforms::to_usize(n_glyphs)).saturating_mul(u16::RAW_BYTE_LEN);
start..end
}
}
const _: () = assert!(FontData::default_data_long_enough(
Subtable2ClassTable::MIN_SIZE
));
impl Default for Subtable2ClassTable<'_> {
fn default() -> Self {
Self {
data: TableDataRef::new(FontData::default_table_data().as_bytes())
.unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
}
}
}
impl<'a> MinByteRange<'a> for Subtable3<'a> {
fn min_byte_range(&self) -> Range<usize> {
0..self.kern_index_byte_range().end
}
fn min_table_bytes(&self) -> &'a [u8] {
let range = self.min_byte_range();
self.offset_data().as_bytes().get(range).unwrap_or_default()
}
}
impl ReadArgs for Subtable3<'_> {
type Args = ();
}
impl<'a> FontRead<'a> for Subtable3<'a> {
fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
#[allow(clippy::absurd_extreme_comparisons)]
if data.len() < Self::MIN_SIZE {
return Err(ReadError::OutOfBounds);
}
let Some(data) = TableDataRef::new(data.as_bytes()) else {
return Err(ReadError::OutOfBounds);
};
Ok(Self { data })
}
}
#[derive(Clone, Copy, bytemuck :: AnyBitPattern)]
#[repr(C, packed)]
#[doc(hidden)]
pub struct Subtable3FixedHeader {
pub glyph_count: BigEndian<u16>,
pub kern_value_count: u8,
pub left_class_count: u8,
pub right_class_count: u8,
pub flags: u8,
}
#[allow(clippy::absurd_extreme_comparisons)]
const _: () = assert!(std::mem::size_of::<Subtable3FixedHeader>() <= Subtable3::MIN_SIZE);
#[derive(Clone)]
pub struct Subtable3<'a> {
data: TableDataRef<'a, Subtable3FixedHeader>,
}
#[allow(clippy::needless_lifetimes)]
impl<'a> Subtable3<'a> {
pub const MIN_SIZE: usize = (u16::RAW_BYTE_LEN
+ u8::RAW_BYTE_LEN
+ u8::RAW_BYTE_LEN
+ u8::RAW_BYTE_LEN
+ u8::RAW_BYTE_LEN);
basic_table_impls!(impl_the_methods);
pub fn glyph_count(&self) -> u16 {
self.data.header().glyph_count.get()
}
pub fn kern_value_count(&self) -> u8 {
self.data.header().kern_value_count
}
pub fn left_class_count(&self) -> u8 {
self.data.header().left_class_count
}
pub fn right_class_count(&self) -> u8 {
self.data.header().right_class_count
}
pub fn flags(&self) -> u8 {
self.data.header().flags
}
pub fn kern_value(&self) -> &'a [BigEndian<i16>] {
let range = self.kern_value_byte_range();
self.offset_data()
.read_array(range)
.ok()
.unwrap_or_default()
}
pub fn left_class(&self) -> &'a [u8] {
let range = self.left_class_byte_range();
self.offset_data()
.read_array(range)
.ok()
.unwrap_or_default()
}
pub fn right_class(&self) -> &'a [u8] {
let range = self.right_class_byte_range();
self.offset_data()
.read_array(range)
.ok()
.unwrap_or_default()
}
pub fn kern_index(&self) -> &'a [u8] {
let range = self.kern_index_byte_range();
self.offset_data()
.read_array(range)
.ok()
.unwrap_or_default()
}
pub fn glyph_count_byte_range(&self) -> Range<usize> {
let start = 0;
let end = start + u16::RAW_BYTE_LEN;
start..end
}
pub fn kern_value_count_byte_range(&self) -> Range<usize> {
let start = self.glyph_count_byte_range().end;
let end = start + u8::RAW_BYTE_LEN;
start..end
}
pub fn left_class_count_byte_range(&self) -> Range<usize> {
let start = self.kern_value_count_byte_range().end;
let end = start + u8::RAW_BYTE_LEN;
start..end
}
pub fn right_class_count_byte_range(&self) -> Range<usize> {
let start = self.left_class_count_byte_range().end;
let end = start + u8::RAW_BYTE_LEN;
start..end
}
pub fn flags_byte_range(&self) -> Range<usize> {
let start = self.right_class_count_byte_range().end;
let end = start + u8::RAW_BYTE_LEN;
start..end
}
pub fn kern_value_byte_range(&self) -> Range<usize> {
let kern_value_count = self.kern_value_count();
let start = self.flags_byte_range().end;
let end =
start + (transforms::to_usize(kern_value_count)).saturating_mul(i16::RAW_BYTE_LEN);
start..end
}
pub fn left_class_byte_range(&self) -> Range<usize> {
let glyph_count = self.glyph_count();
let start = self.kern_value_byte_range().end;
let end = start + (transforms::to_usize(glyph_count)).saturating_mul(u8::RAW_BYTE_LEN);
start..end
}
pub fn right_class_byte_range(&self) -> Range<usize> {
let glyph_count = self.glyph_count();
let start = self.left_class_byte_range().end;
let end = start + (transforms::to_usize(glyph_count)).saturating_mul(u8::RAW_BYTE_LEN);
start..end
}
pub fn kern_index_byte_range(&self) -> Range<usize> {
let left_class_count = self.left_class_count();
let right_class_count = self.right_class_count();
let start = self.right_class_byte_range().end;
let end = start
+ (transforms::add_multiply(left_class_count, 0_usize, right_class_count))
.saturating_mul(u8::RAW_BYTE_LEN);
start..end
}
}
const _: () = assert!(FontData::default_data_long_enough(Subtable3::MIN_SIZE));
impl Default for Subtable3<'_> {
fn default() -> Self {
Self {
data: TableDataRef::new(FontData::default_table_data().as_bytes())
.unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
}
}
}