blob: 5b42b8d891087ca4233b2a2d659772f80dc2f2f2 [file] [log] [blame] [edit]
//! Subset arrays of offsets
use crate::{offset::SerializeSubset, Plan, SerializeErrorFlags, Serializer, SubsetTable};
use write_fonts::{
read::{ArrayOfNullableOffsets, ArrayOfOffsets, FontReadWithArgs, Offset, ReadArgs},
types::{FixedSize, Scalar},
};
pub(crate) trait SubsetOffsetArray<'a, T: SubsetTable<'a>> {
fn subset_offset(
&self,
idx: usize,
s: &mut Serializer,
plan: &Plan,
args: T::ArgsForSubset,
) -> Result<(), SerializeErrorFlags>;
}
impl<'a, T, O> SubsetOffsetArray<'a, T> for ArrayOfOffsets<'a, T, O>
where
O: Scalar + Offset + FixedSize + SerializeSubset,
T: ReadArgs + FontReadWithArgs<'a> + SubsetTable<'a>,
T::Args: Copy + 'static,
{
fn subset_offset(
&self,
idx: usize,
s: &mut Serializer,
plan: &Plan,
args: T::ArgsForSubset,
) -> Result<(), SerializeErrorFlags> {
let t = self
.get(idx)
.map_err(|_| SerializeErrorFlags::SERIALIZE_ERROR_READ_ERROR)?;
let snap = s.snapshot();
let offset_pos = s.allocate_size(O::RAW_BYTE_LEN, true)?;
if let Err(e) = O::serialize_subset(&t, s, plan, args, offset_pos) {
s.revert_snapshot(snap);
return Err(e);
}
Ok(())
}
}
impl<'a, T, O> SubsetOffsetArray<'a, T> for ArrayOfNullableOffsets<'a, T, O>
where
O: Scalar + Offset + FixedSize + SerializeSubset,
T: ReadArgs + FontReadWithArgs<'a> + SubsetTable<'a>,
T::Args: Copy + 'static,
{
fn subset_offset(
&self,
idx: usize,
s: &mut Serializer,
plan: &Plan,
args: T::ArgsForSubset,
) -> Result<(), SerializeErrorFlags> {
match self.get(idx) {
Some(Ok(t)) => {
let snap = s.snapshot();
let offset_pos = s.allocate_size(O::RAW_BYTE_LEN, true)?;
match O::serialize_subset(&t, s, plan, args, offset_pos) {
Ok(_) => Ok(()),
Err(e) => {
s.revert_snapshot(snap);
Err(e)
}
}
}
None => Err(SerializeErrorFlags::SERIALIZE_ERROR_EMPTY),
Some(Err(_)) => Err(SerializeErrorFlags::SERIALIZE_ERROR_READ_ERROR),
}
}
}