#[allow(unused_imports)]
use crate::codegen_prelude::*;
impl<'a> MinByteRange<'a> for Cvar<'a> {
fn min_byte_range(&self) -> Range<usize> {
0..self.tuple_variation_headers_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 TopLevelTable for Cvar<'_> {
const TAG: Tag = Tag::new(b"cvar");
}
impl ReadArgs for Cvar<'_> {
type Args = ();
}
impl<'a> FontRead<'a> for Cvar<'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 CvarFixedHeader {
pub version: BigEndian<MajorMinor>,
pub tuple_variation_count: BigEndian<TupleVariationCount>,
pub data_offset: BigEndian<Offset16>,
}
#[allow(clippy::absurd_extreme_comparisons)]
const _: () = assert!(std::mem::size_of::<CvarFixedHeader>() <= Cvar::MIN_SIZE);
#[derive(Clone)]
pub struct Cvar<'a> {
data: TableDataRef<'a, CvarFixedHeader>,
}
#[allow(clippy::needless_lifetimes)]
impl<'a> Cvar<'a> {
pub const MIN_SIZE: usize =
(MajorMinor::RAW_BYTE_LEN + TupleVariationCount::RAW_BYTE_LEN + Offset16::RAW_BYTE_LEN);
basic_table_impls!(impl_the_methods);
pub fn version(&self) -> MajorMinor {
self.data.header().version.get()
}
pub fn tuple_variation_count(&self) -> TupleVariationCount {
self.data.header().tuple_variation_count.get()
}
pub fn data_offset(&self) -> Offset16 {
self.data.header().data_offset.get()
}
pub fn data(&self) -> Result<FontData<'a>, ReadError> {
let data = self.offset_data();
self.data_offset().resolve(data)
}
pub fn tuple_variation_headers(&self) -> VarLenArray<'a, TupleVariationHeader<'a>> {
let range = self.tuple_variation_headers_byte_range();
self.offset_data()
.split_off(range.start)
.and_then(|d| VarLenArray::read(d).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 tuple_variation_count_byte_range(&self) -> Range<usize> {
let start = self.version_byte_range().end;
let end = start + TupleVariationCount::RAW_BYTE_LEN;
start..end
}
pub fn data_offset_byte_range(&self) -> Range<usize> {
let start = self.tuple_variation_count_byte_range().end;
let end = start + Offset16::RAW_BYTE_LEN;
start..end
}
pub fn tuple_variation_headers_byte_range(&self) -> Range<usize> {
let start = self.data_offset_byte_range().end;
let end = start + self.offset_data().len().saturating_sub(start);
start..end
}
}
const _: () = assert!(FontData::default_data_long_enough(Cvar::MIN_SIZE));
impl Default for Cvar<'_> {
fn default() -> Self {
Self {
data: TableDataRef::new(FontData::default_table_data().as_bytes())
.unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
}
}
}