diff --git a/font-codegen/src/format_group.rs b/font-codegen/src/format_group.rs index a0483e667..49289d179 100644 --- a/font-codegen/src/format_group.rs +++ b/font-codegen/src/format_group.rs @@ -24,6 +24,7 @@ pub(crate) fn generate(item: &TableFormat, items: &Items) -> syn::Result syn::Result FontRead<'a> for #name<'a> { + #read_inline fn read_with_args(data: FontData<'a>, _: ()) -> Result { let format: #format = data.read_at(#format_offset)?; #maybe_allow_lint diff --git a/font-codegen/src/parsing.rs b/font-codegen/src/parsing.rs index 17893cb18..a75f5e900 100644 --- a/font-codegen/src/parsing.rs +++ b/font-codegen/src/parsing.rs @@ -830,6 +830,14 @@ mod tests { ); } + #[test] + fn parse_format_group_with_read_inline() { + let parsed = + parse_format_group("#[read_inline]\nformat u16 MyThing { FormatOne(SomeTable), }") + .unwrap(); + assert!(parsed.attrs.read_inline.is_some()); + } + #[test] #[should_panic(expected = "must be an unsigned")] fn parse_format_group_with_negative_format_offset() { diff --git a/font-codegen/src/parsing/attrs.rs b/font-codegen/src/parsing/attrs.rs index 41cf368b0..a1d3753e4 100644 --- a/font-codegen/src/parsing/attrs.rs +++ b/font-codegen/src/parsing/attrs.rs @@ -52,6 +52,7 @@ impl ToTokens for Attr { #[derive(Debug, Default, Clone)] pub(crate) struct TableAttrs { pub(crate) docs: Vec, + pub(crate) read_inline: Option, pub(crate) skip_font_write: Option, pub(crate) skip_from_obj: Option, pub(crate) skip_constructor: Option, @@ -280,6 +281,7 @@ static WRITE_FONTS_ONLY: &str = "write_fonts_only"; static SKIP_FROM_OBJ: &str = "skip_from_obj"; static SKIP_FONT_WRITE: &str = "skip_font_write"; static SKIP_CONSTRUCTOR: &str = "skip_constructor"; +static READ_INLINE: &str = "read_inline"; static READ_ARGS: &str = "read_args"; static GENERIC_OFFSET: &str = "generic_offset"; static TAG: &str = "tag"; @@ -367,6 +369,8 @@ impl Parse for TableAttrs { })?; if ident == DOC { this.docs.push(attr); + } else if ident == READ_INLINE { + this.read_inline = Some(attr.path().clone()); } else if ident == SKIP_FROM_OBJ { this.skip_from_obj = Some(attr.path().clone()); } else if ident == SKIP_FONT_WRITE { diff --git a/read-fonts/generated/generated_aat.rs b/read-fonts/generated/generated_aat.rs index 246c3426b..bb558f89e 100644 --- a/read-fonts/generated/generated_aat.rs +++ b/read-fonts/generated/generated_aat.rs @@ -54,6 +54,7 @@ impl ReadArgs for Lookup<'_> { } impl<'a> FontRead<'a> for Lookup<'a> { + #[inline] fn read_with_args(data: FontData<'a>, _: ()) -> Result { let format: u16 = data.read_at(0usize)?; match format { diff --git a/resources/codegen_inputs/aat.rs b/resources/codegen_inputs/aat.rs index d3bb1a01e..82e1fcc0f 100644 --- a/resources/codegen_inputs/aat.rs +++ b/resources/codegen_inputs/aat.rs @@ -2,6 +2,7 @@ /// Lookup tables provide a way of looking up information about a glyph index. /// The different cmap subtable formats. +#[read_inline] format u16 Lookup { Format0(Lookup0), Format2(Lookup2), @@ -181,4 +182,4 @@ table StxHeader { table RawWords { #[count(..)] data: [u16] -} \ No newline at end of file +}