otspec/
lib.rs

1//! This library is used by the fonttools crate. No user-serviceable parts inside.
2#![allow(non_snake_case, non_camel_case_types, clippy::upper_case_acronyms)]
3#[macro_use]
4extern crate shrinkwraprs;
5use crate::types::*;
6use std::convert::TryInto;
7use std::mem;
8pub mod types;
9
10#[derive(Debug)]
11pub struct SerializationError(pub String);
12#[derive(Debug)]
13pub struct DeserializationError(pub String);
14
15pub struct ReaderContext {
16    pub input: Vec<u8>,
17    pub ptr: usize,
18    top_of_table_stack: Vec<usize>,
19}
20
21impl ReaderContext {
22    pub fn new(input: Vec<u8>) -> Self {
23        ReaderContext {
24            input,
25            ptr: 0,
26            top_of_table_stack: vec![0],
27        }
28    }
29
30    fn consume_or_peek(
31        &mut self,
32        bytes: usize,
33        consume: bool,
34    ) -> Result<&[u8], DeserializationError> {
35        if self.ptr + bytes > self.input.len() {
36            Err(DeserializationError("End of file".to_string()))
37        } else {
38            let subslice = &self.input[self.ptr..self.ptr + bytes];
39            if consume {
40                self.ptr += bytes;
41            }
42            Ok(subslice)
43        }
44    }
45
46    fn consume(&mut self, bytes: usize) -> Result<&[u8], DeserializationError> {
47        self.consume_or_peek(bytes, true)
48    }
49
50    pub fn peek(&mut self, bytes: usize) -> Result<&[u8], DeserializationError> {
51        self.consume_or_peek(bytes, false)
52    }
53
54    pub fn push(&mut self) {
55        self.top_of_table_stack.push(self.ptr);
56    }
57    pub fn pop(&mut self) {
58        self.top_of_table_stack
59            .pop()
60            .expect("pop with no matching push");
61    }
62    pub fn top_of_table(&self) -> usize {
63        *self.top_of_table_stack.last().expect("not in a struct")
64    }
65    pub fn skip(&mut self, bytes: usize) {
66        self.ptr += bytes;
67    }
68}
69
70pub trait Serializer<T>
71where
72    T: Serialize,
73{
74    fn put(&mut self, data: T) -> Result<(), SerializationError>;
75}
76
77impl<T> Serializer<T> for Vec<u8>
78where
79    T: Serialize,
80{
81    fn put(&mut self, data: T) -> Result<(), SerializationError> {
82        data.to_bytes(self)
83    }
84}
85
86pub trait Deserializer<T>
87where
88    T: Deserialize,
89{
90    fn de(&mut self) -> Result<T, DeserializationError>;
91    fn de_counted(&mut self, s: usize) -> Result<Vec<T>, DeserializationError>;
92}
93
94impl<T> Deserializer<T> for ReaderContext
95where
96    T: Deserialize,
97{
98    fn de(&mut self) -> Result<T, DeserializationError> {
99        T::from_bytes(self)
100    }
101    fn de_counted(&mut self, s: usize) -> Result<Vec<T>, DeserializationError> {
102        (0..s)
103            .map(|_| {
104                let c: Result<T, DeserializationError> = self.de();
105                c
106            })
107            .collect()
108    }
109}
110
111impl std::fmt::Display for SerializationError {
112    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
113        write!(f, "Serialization error {:}", self.0)
114    }
115}
116
117impl std::fmt::Display for DeserializationError {
118    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
119        write!(f, "Deserialization error {:}", self.0)
120    }
121}
122
123impl std::error::Error for SerializationError {}
124impl std::error::Error for DeserializationError {}
125
126pub trait Serialize {
127    fn to_bytes(&self, data: &mut Vec<u8>) -> Result<(), SerializationError>;
128}
129
130pub trait Deserialize {
131    fn from_bytes(c: &mut ReaderContext) -> Result<Self, DeserializationError>
132    where
133        Self: std::marker::Sized;
134}
135
136macro_rules! serde_primitive {
137    ($t: ty) => {
138        impl Serialize for $t {
139            fn to_bytes(&self, data: &mut Vec<u8>) -> Result<(), SerializationError> {
140                data.extend_from_slice(&self.to_be_bytes());
141                Ok(())
142            }
143        }
144
145        impl Deserialize for $t {
146            fn from_bytes(c: &mut ReaderContext) -> Result<Self, DeserializationError> {
147                let bytes: &[u8] = c.consume(mem::size_of::<$t>())?;
148                let bytes_array: [u8; mem::size_of::<$t>()] = bytes
149                    .try_into()
150                    .map_err(|_| DeserializationError("Slice with incorrect length".to_string()))?;
151                Ok(<$t>::from_be_bytes(bytes_array))
152            }
153        }
154    };
155}
156
157serde_primitive!(i8);
158serde_primitive!(u8);
159serde_primitive!(u16);
160serde_primitive!(u32);
161serde_primitive!(i16);
162serde_primitive!(i32);
163serde_primitive!(i64);
164
165impl<T> Serialize for Vec<T>
166where
167    T: Serialize,
168{
169    fn to_bytes(&self, data: &mut Vec<u8>) -> Result<(), SerializationError> {
170        for el in self {
171            el.to_bytes(data)?
172        }
173        Ok(())
174    }
175}
176
177impl<T> Deserialize for Vec<T>
178where
179    T: Deserialize,
180{
181    fn from_bytes(c: &mut ReaderContext) -> Result<Self, DeserializationError> {
182        let mut res: Vec<T> = vec![];
183        loop {
184            let maybe: Result<T, DeserializationError> = c.de();
185            if let Ok(x) = maybe {
186                res.push(x);
187            } else {
188                break;
189            }
190        }
191        Ok(res)
192    }
193}
194
195#[derive(Shrinkwrap, Debug, PartialEq)]
196pub struct Counted<T>(pub Vec<T>);
197
198impl<T> Serialize for Counted<T>
199where
200    T: Serialize,
201{
202    fn to_bytes(&self, data: &mut Vec<u8>) -> Result<(), SerializationError> {
203        (self.len() as uint16).to_bytes(data)?;
204        self.0.to_bytes(data)?;
205        Ok(())
206    }
207}
208
209impl<T> Deserialize for Counted<T>
210where
211    T: Deserialize,
212{
213    fn from_bytes(c: &mut ReaderContext) -> Result<Self, DeserializationError> {
214        let len: uint16 = c.de()?;
215        let mut res: Vec<T> = vec![];
216        for _ in 0..len {
217            res.push(c.de()?)
218        }
219        Ok(Counted(res))
220    }
221}
222
223impl<T> From<Vec<T>> for Counted<T> {
224    fn from(v: Vec<T>) -> Self {
225        Counted(v)
226    }
227}
228
229impl<T> From<Counted<T>> for Vec<T> {
230    fn from(v: Counted<T>) -> Self {
231        v.0
232    }
233}
234
235impl<T> PartialEq<Vec<T>> for Counted<T>
236where
237    T: PartialEq,
238{
239    fn eq(&self, other: &std::vec::Vec<T>) -> bool {
240        &self.0 == other
241    }
242}
243
244impl<T> Serialize for &T
245where
246    T: Serialize,
247{
248    fn to_bytes(
249        &self,
250        data: &mut std::vec::Vec<u8>,
251    ) -> std::result::Result<(), SerializationError> {
252        (*self).to_bytes(data)
253    }
254}
255
256/* Provide a serde-style interface */
257pub mod ser {
258    use crate::SerializationError;
259    use crate::Serialize;
260    use crate::Serializer;
261
262    pub fn to_bytes<T: Serialize>(data: &T) -> Result<Vec<u8>, SerializationError> {
263        let mut out = vec![];
264        out.put(data)?;
265        Ok(out)
266    }
267}
268pub mod de {
269    pub use crate::{DeserializationError, Deserialize, Deserializer, ReaderContext};
270    pub fn from_bytes<T: Deserialize>(data: &[u8]) -> Result<T, DeserializationError> {
271        let mut rc = ReaderContext::new(data.to_vec());
272        rc.de()
273    }
274}
275
276#[cfg(test)]
277mod tests {
278    use super::*;
279
280    #[test]
281    fn ser_primitive() {
282        let mut out = vec![];
283        out.put(1_u16).unwrap();
284        out.put(2_u16).unwrap();
285        out.put(4_u32).unwrap();
286        assert_eq!(out, [0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04]);
287    }
288
289    #[test]
290    fn de_primitive() {
291        let mut rc = ReaderContext::new(vec![0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04]);
292        let first: u16 = rc.de().unwrap();
293        let second: u16 = rc.de().unwrap();
294        let third: u32 = rc.de().unwrap();
295        assert_eq!(first, 1);
296        assert_eq!(second, 2);
297        assert_eq!(third, 4);
298    }
299
300    #[test]
301    fn ser_vec() {
302        let mut out = vec![];
303        let t: Vec<u16> = vec![1, 2, 3];
304        out.put(t).unwrap();
305        assert_eq!(out, [0x00, 0x01, 0x00, 0x02, 0x00, 0x03]);
306    }
307
308    #[test]
309    fn ser_counted() {
310        let mut out = vec![];
311        let t: Counted<u16> = vec![10, 11].into();
312        out.put(t).unwrap();
313        assert_eq!(out, [0x00, 0x02, 0x00, 0x0a, 0x00, 0x0b]);
314    }
315
316    #[test]
317    fn de_counted() {
318        let mut rc = ReaderContext::new(vec![0x00, 0x02, 0x00, 0x0a, 0x00, 0x0b]);
319        let t: Counted<u16> = rc.de().unwrap();
320        assert_eq!(t[0], 10);
321        assert_eq!(t, vec![10, 11]);
322    }
323
324    #[test]
325    fn ser_tag() {
326        let t = tag("GSUB");
327        let mut out = vec![];
328        out.put(t).unwrap();
329        assert_eq!(out, [0x47, 0x53, 0x55, 0x42]);
330    }
331
332    #[test]
333    fn de_tag() {
334        let mut rc = ReaderContext::new(vec![0x47, 0x53, 0x55, 0x42]);
335        let t: Tag = rc.de().unwrap();
336        assert_eq!(t, tag("GSUB"));
337    }
338
339    // use otspec_macros::{Deserialize, Serialize};
340
341    // #[derive(Serialize, Deserialize, Debug, PartialEq)]
342    // struct TestStruct {
343    //     test1: uint16,
344    //     test2: uint16,
345    // }
346
347    // #[test]
348    // fn ser_struct() {
349    //     let mut out = vec![];
350    //     let t = TestStruct {
351    //         test1: 10,
352    //         test2: 11,
353    //     };
354    //     out.put(t).unwrap();
355    //     assert_eq!(out, [0x00, 0x0a, 0x00, 0x0b]);
356    // }
357
358    // #[test]
359    // fn de_struct() {
360    //     let mut rc = ReaderContext::new(vec![0x00, 0x0a, 0x00, 0x0b]);
361    //     let t: TestStruct = rc.de().unwrap();
362    //     assert_eq!(
363    //         t,
364    //         TestStruct {
365    //             test1: 10,
366    //             test2: 11
367    //         }
368    //     );
369    // }
370
371    // #[derive(Serialize, Deserialize, Debug, PartialEq)]
372    // struct TestCounted {
373    //     t: Counted<u16>,
374    // }
375
376    // #[derive(Serialize, Deserialize, Debug, PartialEq)]
377    // struct TestCounted2 {
378    //     t0: u32,
379    //     t1: Counted<u16>,
380    //     t2: u16,
381    //     t3: Counted<TestCounted>,
382    // }
383
384    // #[test]
385    // fn serde_interface() {
386    //     let c1a = TestCounted {
387    //         t: vec![0xaa, 0xbb, 0xcc].into(),
388    //     };
389    //     let c1b = TestCounted {
390    //         t: vec![0xdd, 0xee].into(),
391    //     };
392    //     let c2 = TestCounted2 {
393    //         t0: 0x01020304,
394    //         t1: vec![0x10, 0x20].into(),
395    //         t2: 0x1,
396    //         t3: vec![c1a, c1b].into(),
397    //     };
398    //     let binary_c2 = vec![
399    //         0x01, 0x02, 0x03, 0x04, /* t0 */
400    //         0x00, 0x02, /* count */
401    //         0x00, 0x10, 0x00, 0x20, /* t1 */
402    //         0x00, 0x01, /* t2 */
403    //         0x00, 0x02, /* count */
404    //         0x00, 0x03, /* c1a count */
405    //         0x00, 0xaa, 0x00, 0xbb, 0x00, 0xcc, /* c1a */
406    //         0x00, 0x02, /* c1b count */
407    //         0x00, 0xdd, 0x00, 0x0ee, /* c1b*/
408    //     ];
409    //     assert_eq!(ser::to_bytes(&c2).unwrap(), binary_c2);
410    //     assert_eq!(de::from_bytes::<TestCounted2>(&binary_c2).unwrap(), c2);
411    // }
412
413    // use otspec_macros::tables;
414    // tables!(hhea {
415    //     uint16 majorVersion
416    //     uint16 minorVersion
417    //     FWORD ascender
418    //     FWORD descender
419    //     FWORD lineGap
420    //     UFWORD  advanceWidthMax
421    //     FWORD   minLeftSideBearing
422    //     FWORD   minRightSideBearing
423    //     FWORD   xMaxExtent
424    //     int16   caretSlopeRise
425    //     int16   caretSlopeRun
426    //     int16   caretOffset
427    //     int16   reserved0
428    //     int16   reserved1
429    //     int16   reserved2
430    //     int16   reserved3
431    //     int16   metricDataFormat
432    //     uint16  numberOfHMetrics
433    // });
434    // #[test]
435    // fn hhea_ser() {
436    //     let fhhea = hhea {
437    //         majorVersion: 1,
438    //         minorVersion: 0,
439    //         ascender: 705,
440    //         descender: -180,
441    //         lineGap: 0,
442    //         advanceWidthMax: 1311,
443    //         minLeftSideBearing: -382,
444    //         minRightSideBearing: -382,
445    //         xMaxExtent: 1245,
446    //         caretSlopeRise: 1,
447    //         caretSlopeRun: 0,
448    //         caretOffset: 0,
449    //         reserved0: 0,
450    //         reserved1: 0,
451    //         reserved2: 0,
452    //         reserved3: 0,
453    //         metricDataFormat: 0,
454    //         numberOfHMetrics: 1117,
455    //     };
456    //     let binary_hhea = vec![
457    //         0x00, 0x01, 0x00, 0x00, 0x02, 0xc1, 0xff, 0x4c, 0x00, 0x00, 0x05, 0x1f, 0xfe, 0x82,
458    //         0xfe, 0x82, 0x04, 0xdd, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
459    //         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x5d,
460    //     ];
461    //     assert_eq!(ser::to_bytes(&fhhea).unwrap(), binary_hhea);
462    // }
463
464    // #[test]
465    // fn hhea_de() {
466    //     let fhhea = hhea {
467    //         majorVersion: 1,
468    //         minorVersion: 0,
469    //         ascender: 705,
470    //         descender: -180,
471    //         lineGap: 0,
472    //         advanceWidthMax: 1311,
473    //         minLeftSideBearing: -382,
474    //         minRightSideBearing: -382,
475    //         xMaxExtent: 1245,
476    //         caretSlopeRise: 1,
477    //         caretSlopeRun: 0,
478    //         caretOffset: 0,
479    //         reserved0: 0,
480    //         reserved1: 0,
481    //         reserved2: 0,
482    //         reserved3: 0,
483    //         metricDataFormat: 0,
484    //         numberOfHMetrics: 1117,
485    //     };
486    //     let binary_hhea = vec![
487    //         0x00, 0x01, 0x00, 0x00, 0x02, 0xc1, 0xff, 0x4c, 0x00, 0x00, 0x05, 0x1f, 0xfe, 0x82,
488    //         0xfe, 0x82, 0x04, 0xdd, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489    //         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x5d,
490    //     ];
491    //     let deserialized: hhea = de::from_bytes(&binary_hhea).unwrap();
492    //     assert_eq!(deserialized, fhhea);
493    // }
494}