1#[allow(unused_imports)]
6use crate::codegen_prelude::*;
7
8pub use read_fonts::tables::varc::VarcFlags;
9
10#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
14#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15pub struct Varc {
16 pub coverage: OffsetMarker<CoverageTable, WIDTH_32>,
17 pub multi_var_store: NullableOffsetMarker<MultiItemVariationStore, WIDTH_32>,
18 pub condition_list: NullableOffsetMarker<ConditionList, WIDTH_32>,
19 pub axis_indices_list: NullableOffsetMarker<Index2, WIDTH_32>,
20 pub var_composite_glyphs: OffsetMarker<Index2, WIDTH_32>,
21}
22
23impl Varc {
24 pub fn new(
26 coverage: CoverageTable,
27 multi_var_store: Option<MultiItemVariationStore>,
28 condition_list: Option<ConditionList>,
29 axis_indices_list: Option<Index2>,
30 var_composite_glyphs: Index2,
31 ) -> Self {
32 Self {
33 coverage: coverage.into(),
34 multi_var_store: multi_var_store.into(),
35 condition_list: condition_list.into(),
36 axis_indices_list: axis_indices_list.into(),
37 var_composite_glyphs: var_composite_glyphs.into(),
38 }
39 }
40}
41
42impl FontWrite for Varc {
43 #[allow(clippy::unnecessary_cast)]
44 fn write_into(&self, writer: &mut TableWriter) {
45 (MajorMinor::VERSION_1_0 as MajorMinor).write_into(writer);
46 self.coverage.write_into(writer);
47 self.multi_var_store.write_into(writer);
48 self.condition_list.write_into(writer);
49 self.axis_indices_list.write_into(writer);
50 self.var_composite_glyphs.write_into(writer);
51 }
52 fn table_type(&self) -> TableType {
53 TableType::TopLevel(Varc::TAG)
54 }
55}
56
57impl Validate for Varc {
58 fn validate_impl(&self, ctx: &mut ValidationCtx) {
59 ctx.in_table("Varc", |ctx| {
60 ctx.in_field("coverage", |ctx| {
61 self.coverage.validate_impl(ctx);
62 });
63 ctx.in_field("multi_var_store", |ctx| {
64 self.multi_var_store.validate_impl(ctx);
65 });
66 ctx.in_field("condition_list", |ctx| {
67 self.condition_list.validate_impl(ctx);
68 });
69 ctx.in_field("axis_indices_list", |ctx| {
70 self.axis_indices_list.validate_impl(ctx);
71 });
72 ctx.in_field("var_composite_glyphs", |ctx| {
73 self.var_composite_glyphs.validate_impl(ctx);
74 });
75 })
76 }
77}
78
79impl TopLevelTable for Varc {
80 const TAG: Tag = Tag::new(b"VARC");
81}
82
83impl<'a> FromObjRef<read_fonts::tables::varc::Varc<'a>> for Varc {
84 fn from_obj_ref(obj: &read_fonts::tables::varc::Varc<'a>, _: FontData) -> Self {
85 Varc {
86 coverage: obj.coverage().to_owned_table(),
87 multi_var_store: obj.multi_var_store().to_owned_table(),
88 condition_list: obj.condition_list().to_owned_table(),
89 axis_indices_list: obj.axis_indices_list().to_owned_table(),
90 var_composite_glyphs: obj.var_composite_glyphs().to_owned_table(),
91 }
92 }
93}
94
95#[allow(clippy::needless_lifetimes)]
96impl<'a> FromTableRef<read_fonts::tables::varc::Varc<'a>> for Varc {}
97
98impl ReadArgs for Varc {
99 type Args = ();
100}
101
102impl<'a> FontRead<'a> for Varc {
103 fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
104 <read_fonts::tables::varc::Varc as FontRead>::read(data).map(|x| x.to_owned_table())
105 }
106}
107
108#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
111#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
112pub struct MultiItemVariationStore {
113 pub region_list: OffsetMarker<SparseVariationRegionList, WIDTH_32>,
114 pub variation_data_count: u16,
115 pub variation_data: Vec<OffsetMarker<MultiItemVariationData, WIDTH_32>>,
116}
117
118impl MultiItemVariationStore {
119 pub fn new(
121 region_list: SparseVariationRegionList,
122 variation_data_count: u16,
123 variation_data: Vec<MultiItemVariationData>,
124 ) -> Self {
125 Self {
126 region_list: region_list.into(),
127 variation_data_count,
128 variation_data: variation_data.into_iter().map(Into::into).collect(),
129 }
130 }
131}
132
133impl FontWrite for MultiItemVariationStore {
134 #[allow(clippy::unnecessary_cast)]
135 fn write_into(&self, writer: &mut TableWriter) {
136 (1 as u16).write_into(writer);
137 self.region_list.write_into(writer);
138 self.variation_data_count.write_into(writer);
139 self.variation_data.write_into(writer);
140 }
141 fn table_type(&self) -> TableType {
142 TableType::Named("MultiItemVariationStore")
143 }
144}
145
146impl Validate for MultiItemVariationStore {
147 fn validate_impl(&self, ctx: &mut ValidationCtx) {
148 ctx.in_table("MultiItemVariationStore", |ctx| {
149 ctx.in_field("region_list", |ctx| {
150 self.region_list.validate_impl(ctx);
151 });
152 ctx.in_field("variation_data", |ctx| {
153 if self.variation_data.len() > to_usize(u16::MAX) {
154 ctx.report("array exceeds max length");
155 }
156 self.variation_data.validate_impl(ctx);
157 });
158 })
159 }
160}
161
162impl<'a> FromObjRef<read_fonts::tables::varc::MultiItemVariationStore<'a>>
163 for MultiItemVariationStore
164{
165 fn from_obj_ref(
166 obj: &read_fonts::tables::varc::MultiItemVariationStore<'a>,
167 _: FontData,
168 ) -> Self {
169 MultiItemVariationStore {
170 region_list: obj.region_list().to_owned_table(),
171 variation_data_count: obj.variation_data_count(),
172 variation_data: obj.variation_data().to_owned_table(),
173 }
174 }
175}
176
177#[allow(clippy::needless_lifetimes)]
178impl<'a> FromTableRef<read_fonts::tables::varc::MultiItemVariationStore<'a>>
179 for MultiItemVariationStore
180{
181}
182
183impl ReadArgs for MultiItemVariationStore {
184 type Args = ();
185}
186
187impl<'a> FontRead<'a> for MultiItemVariationStore {
188 fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
189 <read_fonts::tables::varc::MultiItemVariationStore as FontRead>::read(data)
190 .map(|x| x.to_owned_table())
191 }
192}
193
194#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
195#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
196pub struct SparseVariationRegionList {
197 pub region_count: u16,
198 pub regions: Vec<OffsetMarker<SparseVariationRegion, WIDTH_32>>,
199}
200
201impl SparseVariationRegionList {
202 pub fn new(region_count: u16, regions: Vec<SparseVariationRegion>) -> Self {
204 Self {
205 region_count,
206 regions: regions.into_iter().map(Into::into).collect(),
207 }
208 }
209}
210
211impl FontWrite for SparseVariationRegionList {
212 fn write_into(&self, writer: &mut TableWriter) {
213 self.region_count.write_into(writer);
214 self.regions.write_into(writer);
215 }
216 fn table_type(&self) -> TableType {
217 TableType::Named("SparseVariationRegionList")
218 }
219}
220
221impl Validate for SparseVariationRegionList {
222 fn validate_impl(&self, ctx: &mut ValidationCtx) {
223 ctx.in_table("SparseVariationRegionList", |ctx| {
224 ctx.in_field("regions", |ctx| {
225 if self.regions.len() > to_usize(u16::MAX) {
226 ctx.report("array exceeds max length");
227 }
228 self.regions.validate_impl(ctx);
229 });
230 })
231 }
232}
233
234impl<'a> FromObjRef<read_fonts::tables::varc::SparseVariationRegionList<'a>>
235 for SparseVariationRegionList
236{
237 fn from_obj_ref(
238 obj: &read_fonts::tables::varc::SparseVariationRegionList<'a>,
239 _: FontData,
240 ) -> Self {
241 SparseVariationRegionList {
242 region_count: obj.region_count(),
243 regions: obj.regions().to_owned_table(),
244 }
245 }
246}
247
248#[allow(clippy::needless_lifetimes)]
249impl<'a> FromTableRef<read_fonts::tables::varc::SparseVariationRegionList<'a>>
250 for SparseVariationRegionList
251{
252}
253
254impl ReadArgs for SparseVariationRegionList {
255 type Args = ();
256}
257
258impl<'a> FontRead<'a> for SparseVariationRegionList {
259 fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
260 <read_fonts::tables::varc::SparseVariationRegionList as FontRead>::read(data)
261 .map(|x| x.to_owned_table())
262 }
263}
264
265#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
266#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
267pub struct SparseVariationRegion {
268 pub region_axis_count: u16,
269 pub region_axes: Vec<SparseRegionAxisCoordinates>,
270}
271
272impl SparseVariationRegion {
273 pub fn new(region_axis_count: u16, region_axes: Vec<SparseRegionAxisCoordinates>) -> Self {
275 Self {
276 region_axis_count,
277 region_axes,
278 }
279 }
280}
281
282impl FontWrite for SparseVariationRegion {
283 fn write_into(&self, writer: &mut TableWriter) {
284 self.region_axis_count.write_into(writer);
285 self.region_axes.write_into(writer);
286 }
287 fn table_type(&self) -> TableType {
288 TableType::Named("SparseVariationRegion")
289 }
290}
291
292impl Validate for SparseVariationRegion {
293 fn validate_impl(&self, ctx: &mut ValidationCtx) {
294 ctx.in_table("SparseVariationRegion", |ctx| {
295 ctx.in_field("region_axes", |ctx| {
296 if self.region_axes.len() > to_usize(u16::MAX) {
297 ctx.report("array exceeds max length");
298 }
299 self.region_axes.validate_impl(ctx);
300 });
301 })
302 }
303}
304
305impl<'a> FromObjRef<read_fonts::tables::varc::SparseVariationRegion<'a>> for SparseVariationRegion {
306 fn from_obj_ref(
307 obj: &read_fonts::tables::varc::SparseVariationRegion<'a>,
308 _: FontData,
309 ) -> Self {
310 let offset_data = obj.offset_data();
311 SparseVariationRegion {
312 region_axis_count: obj.region_axis_count(),
313 region_axes: obj.region_axes().to_owned_obj(offset_data),
314 }
315 }
316}
317
318#[allow(clippy::needless_lifetimes)]
319impl<'a> FromTableRef<read_fonts::tables::varc::SparseVariationRegion<'a>>
320 for SparseVariationRegion
321{
322}
323
324impl ReadArgs for SparseVariationRegion {
325 type Args = ();
326}
327
328impl<'a> FontRead<'a> for SparseVariationRegion {
329 fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
330 <read_fonts::tables::varc::SparseVariationRegion as FontRead>::read(data)
331 .map(|x| x.to_owned_table())
332 }
333}
334
335#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
336#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
337pub struct SparseRegionAxisCoordinates {
338 pub axis_index: u16,
339 pub start: F2Dot14,
340 pub peak: F2Dot14,
341 pub end: F2Dot14,
342}
343
344impl SparseRegionAxisCoordinates {
345 pub fn new(axis_index: u16, start: F2Dot14, peak: F2Dot14, end: F2Dot14) -> Self {
347 Self {
348 axis_index,
349 start,
350 peak,
351 end,
352 }
353 }
354}
355
356impl FontWrite for SparseRegionAxisCoordinates {
357 fn write_into(&self, writer: &mut TableWriter) {
358 self.axis_index.write_into(writer);
359 self.start.write_into(writer);
360 self.peak.write_into(writer);
361 self.end.write_into(writer);
362 }
363 fn table_type(&self) -> TableType {
364 TableType::Named("SparseRegionAxisCoordinates")
365 }
366}
367
368impl Validate for SparseRegionAxisCoordinates {
369 fn validate_impl(&self, _ctx: &mut ValidationCtx) {}
370}
371
372impl FromObjRef<read_fonts::tables::varc::SparseRegionAxisCoordinates>
373 for SparseRegionAxisCoordinates
374{
375 fn from_obj_ref(
376 obj: &read_fonts::tables::varc::SparseRegionAxisCoordinates,
377 _: FontData,
378 ) -> Self {
379 SparseRegionAxisCoordinates {
380 axis_index: obj.axis_index(),
381 start: obj.start(),
382 peak: obj.peak(),
383 end: obj.end(),
384 }
385 }
386}
387
388#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
389#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
390pub struct MultiItemVariationData {
391 pub region_index_count: u16,
392 pub region_indices: Vec<u16>,
393 pub raw_delta_sets: Vec<u8>,
394}
395
396impl MultiItemVariationData {
397 pub fn new(region_index_count: u16, region_indices: Vec<u16>, raw_delta_sets: Vec<u8>) -> Self {
399 Self {
400 region_index_count,
401 region_indices,
402 raw_delta_sets,
403 }
404 }
405}
406
407impl FontWrite for MultiItemVariationData {
408 #[allow(clippy::unnecessary_cast)]
409 fn write_into(&self, writer: &mut TableWriter) {
410 (1 as u8).write_into(writer);
411 self.region_index_count.write_into(writer);
412 self.region_indices.write_into(writer);
413 self.raw_delta_sets.write_into(writer);
414 }
415 fn table_type(&self) -> TableType {
416 TableType::Named("MultiItemVariationData")
417 }
418}
419
420impl Validate for MultiItemVariationData {
421 fn validate_impl(&self, ctx: &mut ValidationCtx) {
422 ctx.in_table("MultiItemVariationData", |ctx| {
423 ctx.in_field("region_indices", |ctx| {
424 if self.region_indices.len() > to_usize(u16::MAX) {
425 ctx.report("array exceeds max length");
426 }
427 });
428 })
429 }
430}
431
432impl<'a> FromObjRef<read_fonts::tables::varc::MultiItemVariationData<'a>>
433 for MultiItemVariationData
434{
435 fn from_obj_ref(
436 obj: &read_fonts::tables::varc::MultiItemVariationData<'a>,
437 _: FontData,
438 ) -> Self {
439 let offset_data = obj.offset_data();
440 MultiItemVariationData {
441 region_index_count: obj.region_index_count(),
442 region_indices: obj.region_indices().to_owned_obj(offset_data),
443 raw_delta_sets: obj.raw_delta_sets().to_owned_obj(offset_data),
444 }
445 }
446}
447
448#[allow(clippy::needless_lifetimes)]
449impl<'a> FromTableRef<read_fonts::tables::varc::MultiItemVariationData<'a>>
450 for MultiItemVariationData
451{
452}
453
454impl ReadArgs for MultiItemVariationData {
455 type Args = ();
456}
457
458impl<'a> FontRead<'a> for MultiItemVariationData {
459 fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
460 <read_fonts::tables::varc::MultiItemVariationData as FontRead>::read(data)
461 .map(|x| x.to_owned_table())
462 }
463}
464
465#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
466#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
467pub struct ConditionList {
468 pub condition_count: u32,
469 pub conditions: Vec<OffsetMarker<Condition, WIDTH_32>>,
470}
471
472impl ConditionList {
473 pub fn new(condition_count: u32, conditions: Vec<Condition>) -> Self {
475 Self {
476 condition_count,
477 conditions: conditions.into_iter().map(Into::into).collect(),
478 }
479 }
480}
481
482impl FontWrite for ConditionList {
483 fn write_into(&self, writer: &mut TableWriter) {
484 self.condition_count.write_into(writer);
485 self.conditions.write_into(writer);
486 }
487 fn table_type(&self) -> TableType {
488 TableType::Named("ConditionList")
489 }
490}
491
492impl Validate for ConditionList {
493 fn validate_impl(&self, ctx: &mut ValidationCtx) {
494 ctx.in_table("ConditionList", |ctx| {
495 ctx.in_field("conditions", |ctx| {
496 if self.conditions.len() > to_usize(u32::MAX) {
497 ctx.report("array exceeds max length");
498 }
499 self.conditions.validate_impl(ctx);
500 });
501 })
502 }
503}
504
505impl<'a> FromObjRef<read_fonts::tables::varc::ConditionList<'a>> for ConditionList {
506 fn from_obj_ref(obj: &read_fonts::tables::varc::ConditionList<'a>, _: FontData) -> Self {
507 ConditionList {
508 condition_count: obj.condition_count(),
509 conditions: obj.conditions().to_owned_table(),
510 }
511 }
512}
513
514#[allow(clippy::needless_lifetimes)]
515impl<'a> FromTableRef<read_fonts::tables::varc::ConditionList<'a>> for ConditionList {}
516
517impl ReadArgs for ConditionList {
518 type Args = ();
519}
520
521impl<'a> FontRead<'a> for ConditionList {
522 fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
523 <read_fonts::tables::varc::ConditionList as FontRead>::read(data)
524 .map(|x| x.to_owned_table())
525 }
526}
527
528impl FontWrite for VarcFlags {
529 fn write_into(&self, writer: &mut TableWriter) {
530 writer.write_slice(&self.bits().to_be_bytes())
531 }
532}