Coverage Report

Created: 2026-05-24 07:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/fontations/skera/src/offset_array.rs
Line
Count
Source
1
//! Subset arrays of offsets
2
use crate::{offset::SerializeSubset, Plan, SerializeErrorFlags, Serializer, SubsetTable};
3
use write_fonts::{
4
    read::{ArrayOfNullableOffsets, ArrayOfOffsets, FontReadWithArgs, Offset, ReadArgs, ReadError},
5
    types::{FixedSize, Scalar},
6
};
7
8
pub(crate) trait SubsetOffsetArray<'a, T: SubsetTable<'a>> {
9
    fn subset_offset(
10
        &self,
11
        idx: usize,
12
        s: &mut Serializer,
13
        plan: &Plan,
14
        args: T::ArgsForSubset,
15
    ) -> Result<(), SerializeErrorFlags>;
16
}
17
18
impl<'a, T, O> SubsetOffsetArray<'a, T> for ArrayOfOffsets<'a, T, O>
19
where
20
    O: Scalar + Offset + FixedSize + SerializeSubset,
21
    T: ReadArgs + FontReadWithArgs<'a> + SubsetTable<'a>,
22
    T::Args: Copy + 'static,
23
{
24
0
    fn subset_offset(
25
0
        &self,
26
0
        idx: usize,
27
0
        s: &mut Serializer,
28
0
        plan: &Plan,
29
0
        args: T::ArgsForSubset,
30
0
    ) -> Result<(), SerializeErrorFlags> {
31
0
        let t = match self.get(idx) {
32
0
            Err(ReadError::NullOffset) => return Err(SerializeErrorFlags::SERIALIZE_ERROR_EMPTY),
33
0
            Ok(table) => table,
34
0
            Err(_) => return Err(s.set_err(SerializeErrorFlags::SERIALIZE_ERROR_READ_ERROR)),
35
        };
36
0
        let snap = s.snapshot();
37
0
        let offset_pos = s.allocate_size(O::RAW_BYTE_LEN, true)?;
38
39
0
        if let Err(e) = O::serialize_subset(&t, s, plan, args, offset_pos) {
40
0
            s.revert_snapshot(snap);
41
0
            return Err(e);
42
0
        }
43
44
0
        Ok(())
45
0
    }
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::colr::Paint, font_types::offset::Offset32> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::colr::Paint>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gdef::AttachPoint> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::gdef::AttachPoint>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gdef::LigGlyph> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::gdef::LigGlyph>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gpos::LigatureAttach> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::gpos::LigatureAttach>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gpos::PositionLookup> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::gpos::PositionLookup>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gpos::PairSet> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::gpos::PairSet>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gsub::LigatureSet> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::gsub::LigatureSet>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gsub::AlternateSet> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::gsub::AlternateSet>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gsub::SubstitutionLookup> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::gsub::SubstitutionLookup>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gsub::Sequence> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::gsub::Sequence>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::CoverageTable, font_types::offset::Offset32> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::layout::CoverageTable>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::Condition, font_types::offset::Offset32> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::layout::Condition>>::subset_offset
46
}
47
48
impl<'a, T, O> SubsetOffsetArray<'a, T> for ArrayOfNullableOffsets<'a, T, O>
49
where
50
    O: Scalar + Offset + FixedSize + SerializeSubset,
51
    T: ReadArgs + FontReadWithArgs<'a> + SubsetTable<'a>,
52
    T::Args: Copy + 'static,
53
{
54
0
    fn subset_offset(
55
0
        &self,
56
0
        idx: usize,
57
0
        s: &mut Serializer,
58
0
        plan: &Plan,
59
0
        args: T::ArgsForSubset,
60
0
    ) -> Result<(), SerializeErrorFlags> {
61
0
        match self.get(idx) {
62
0
            Some(Ok(t)) => {
63
0
                let snap = s.snapshot();
64
0
                let offset_pos = s.allocate_size(O::RAW_BYTE_LEN, true)?;
65
66
0
                match O::serialize_subset(&t, s, plan, args, offset_pos) {
67
0
                    Ok(_) => Ok(()),
68
0
                    Err(e) => {
69
0
                        s.revert_snapshot(snap);
70
0
                        Err(e)
71
                    }
72
                }
73
            }
74
0
            None => Err(SerializeErrorFlags::SERIALIZE_ERROR_EMPTY),
75
0
            Some(Err(_)) => Err(s.set_err(SerializeErrorFlags::SERIALIZE_ERROR_READ_ERROR)),
76
        }
77
0
    }
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfNullableOffsets<read_fonts::tables::layout::SequenceRuleSet> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::layout::SequenceRuleSet>>::subset_offset
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfNullableOffsets<read_fonts::tables::layout::ChainedSequenceRuleSet> as skera::offset_array::SubsetOffsetArray<read_fonts::tables::layout::ChainedSequenceRuleSet>>::subset_offset
78
}
79
80
pub(crate) trait IterNullableHelper<'a, T> {
81
    fn iter_as_nullable(&self) -> impl Iterator<Item = Option<Result<T, ReadError>>> + 'a;
82
}
83
84
impl<'a, T, O> IterNullableHelper<'a, T> for ArrayOfOffsets<'a, T, O>
85
// these bounds have to match what is in the read-fonts impl block that has the normal `iter` method
86
where
87
    O: Scalar + Offset,
88
    T: ReadArgs + FontReadWithArgs<'a>,
89
    T::Args: Copy + 'static,
90
{
91
0
    fn iter_as_nullable(&self) -> impl Iterator<Item = Option<Result<T, ReadError>>> + 'a {
92
0
        self.iter().map(|off| match off {
93
0
            Err(ReadError::NullOffset) => None,
94
0
            other => Some(other),
95
0
        })
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::base::BaseCoord> as skera::offset_array::IterNullableHelper<read_fonts::tables::base::BaseCoord>>::iter_as_nullable::{closure#0}
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gdef::CaretValue> as skera::offset_array::IterNullableHelper<read_fonts::tables::gdef::CaretValue>>::iter_as_nullable::{closure#0}
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gdef::LigGlyph> as skera::offset_array::IterNullableHelper<read_fonts::tables::gdef::LigGlyph>>::iter_as_nullable::{closure#0}
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gsub::Ligature> as skera::offset_array::IterNullableHelper<read_fonts::tables::gsub::Ligature>>::iter_as_nullable::{closure#0}
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::SequenceRule> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::SequenceRule>>::iter_as_nullable::{closure#0}
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::CoverageTable> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::CoverageTable>>::iter_as_nullable::{closure#0}
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::CoverageTable, font_types::offset::Offset32> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::CoverageTable>>::iter_as_nullable::{closure#0}
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::ClassSequenceRule> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::ClassSequenceRule>>::iter_as_nullable::{closure#0}
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::ChainedSequenceRule> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::ChainedSequenceRule>>::iter_as_nullable::{closure#0}
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::ChainedClassSequenceRule> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::ChainedClassSequenceRule>>::iter_as_nullable::{closure#0}
96
0
    }
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::base::BaseCoord> as skera::offset_array::IterNullableHelper<read_fonts::tables::base::BaseCoord>>::iter_as_nullable
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gdef::CaretValue> as skera::offset_array::IterNullableHelper<read_fonts::tables::gdef::CaretValue>>::iter_as_nullable
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gdef::LigGlyph> as skera::offset_array::IterNullableHelper<read_fonts::tables::gdef::LigGlyph>>::iter_as_nullable
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::gsub::Ligature> as skera::offset_array::IterNullableHelper<read_fonts::tables::gsub::Ligature>>::iter_as_nullable
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::SequenceRule> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::SequenceRule>>::iter_as_nullable
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::CoverageTable> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::CoverageTable>>::iter_as_nullable
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::CoverageTable, font_types::offset::Offset32> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::CoverageTable>>::iter_as_nullable
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::ClassSequenceRule> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::ClassSequenceRule>>::iter_as_nullable
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::ChainedSequenceRule> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::ChainedSequenceRule>>::iter_as_nullable
Unexecuted instantiation: <read_fonts::offset_array::ArrayOfOffsets<read_fonts::tables::layout::ChainedClassSequenceRule> as skera::offset_array::IterNullableHelper<read_fonts::tables::layout::ChainedClassSequenceRule>>::iter_as_nullable
97
}