truetype 0.41.0

The package provides a parser for TrueType fonts.
Documentation
//! The [OS/2 and Windows metrics][1].
//!
//! [1]: https://learn.microsoft.com/en-us/typography/opentype/spec/os2

use crate::tag::Tag;
use crate::{Result, Tape, Value};

/// OS/2 and Windows metrics.
#[derive(Clone, Copy, Debug)]
pub enum WindowsMetrics {
    /// Version 0.
    Version0(WindowsMetrics0),
    /// Version 1.
    Version1(WindowsMetrics1),
    /// Version 2.
    Version2(WindowsMetrics2),
    /// Version 3.
    Version3(WindowsMetrics3),
    /// Version 4.
    Version4(WindowsMetrics4),
    /// Version 5.
    Version5(WindowsMetrics5),
}

table! {
    #[doc = "OS/2 and Windows metrics of version 0."]
    #[derive(Copy)]
    pub WindowsMetrics0 {
        version               (u16           ), // version
        average_char_width    (i16           ), // xAvgCharWidth
        weight_class          (u16           ), // usWeightClass
        width_class           (u16           ), // usWidthClass
        type_flags            (TypeFlags     ), // fsType
        subscript_x_size      (i16           ), // ySubscriptXSize
        subscript_y_size      (i16           ), // ySubscriptYSize
        subscript_x_offset    (i16           ), // ySubscriptXOffset
        subscript_y_offset    (i16           ), // ySubscriptYOffset
        superscript_x_size    (i16           ), // ySuperscriptXSize
        superscript_y_size    (i16           ), // ySuperscriptYSize
        superscript_x_offset  (i16           ), // ySuperscriptXOffset
        superscript_y_offset  (i16           ), // ySuperscriptYOffset
        strikeout_size        (i16           ), // yStrikeoutSize
        strikeout_position    (i16           ), // yStrikeoutPosition
        family_class          (i16           ), // sFamilyClass
        panose                ([u8; 10]      ), // panose
        unicode_range1        (u32           ), // ulUnicodeRange1
        unicode_range2        (u32           ), // ulUnicodeRange2
        unicode_range3        (u32           ), // ulUnicodeRange3
        unicode_range4        (u32           ), // ulUnicodeRange4
        vendor_id             (Tag           ), // achVendID
        selection_flags       (SelectionFlags), // fsSelection
        first_char_index      (u16           ), // usFirstCharIndex
        last_char_index       (u16           ), // usLastCharIndex
        typographic_ascender  (i16           ), // sTypoAscender
        typographic_descender (i16           ), // sTypoDescender
        typographic_line_gap  (i16           ), // sTypoLineGap
        windows_ascender      (u16           ), // usWinAscent
        windows_descender     (u16           ), // usWinDescent
    }
}

table! {
    #[doc = "OS/2 and Windows metrics of version 1."]
    #[derive(Copy)]
    pub WindowsMetrics1 {
        version               (u16           ), // version
        average_char_width    (i16           ), // xAvgCharWidth
        weight_class          (u16           ), // usWeightClass
        width_class           (u16           ), // usWidthClass
        type_flags            (TypeFlags     ), // fsType
        subscript_x_size      (i16           ), // ySubscriptXSize
        subscript_y_size      (i16           ), // ySubscriptYSize
        subscript_x_offset    (i16           ), // ySubscriptXOffset
        subscript_y_offset    (i16           ), // ySubscriptYOffset
        superscript_x_size    (i16           ), // ySuperscriptXSize
        superscript_y_size    (i16           ), // ySuperscriptYSize
        superscript_x_offset  (i16           ), // ySuperscriptXOffset
        superscript_y_offset  (i16           ), // ySuperscriptYOffset
        strikeout_size        (i16           ), // yStrikeoutSize
        strikeout_position    (i16           ), // yStrikeoutPosition
        family_class          (i16           ), // sFamilyClass
        panose                ([u8; 10]      ), // panose
        unicode_range1        (u32           ), // ulUnicodeRange1
        unicode_range2        (u32           ), // ulUnicodeRange2
        unicode_range3        (u32           ), // ulUnicodeRange3
        unicode_range4        (u32           ), // ulUnicodeRange4
        vendor_id             (Tag           ), // achVendID
        selection_flags       (SelectionFlags), // fsSelection
        first_char_index      (u16           ), // usFirstCharIndex
        last_char_index       (u16           ), // usLastCharIndex
        typographic_ascender  (i16           ), // sTypoAscender
        typographic_descender (i16           ), // sTypoDescender
        typographic_line_gap  (i16           ), // sTypoLineGap
        windows_ascender      (u16           ), // usWinAscent
        windows_descender     (u16           ), // usWinDescent
        code_page_range1      (u32           ), // ulCodePageRange1
        code_page_range2      (u32           ), // ulCodePageRange2
    }
}

table! {
    #[doc = "OS/2 and Windows metrics of version 2."]
    #[derive(Copy)]
    pub WindowsMetrics2 {
        version               (u16           ), // version
        average_char_width    (i16           ), // xAvgCharWidth
        weight_class          (u16           ), // usWeightClass
        width_class           (u16           ), // usWidthClass
        type_flags            (TypeFlags     ), // fsType
        subscript_x_size      (i16           ), // ySubscriptXSize
        subscript_y_size      (i16           ), // ySubscriptYSize
        subscript_x_offset    (i16           ), // ySubscriptXOffset
        subscript_y_offset    (i16           ), // ySubscriptYOffset
        superscript_x_size    (i16           ), // ySuperscriptXSize
        superscript_y_size    (i16           ), // ySuperscriptYSize
        superscript_x_offset  (i16           ), // ySuperscriptXOffset
        superscript_y_offset  (i16           ), // ySuperscriptYOffset
        strikeout_size        (i16           ), // yStrikeoutSize
        strikeout_position    (i16           ), // yStrikeoutPosition
        family_class          (i16           ), // sFamilyClass
        panose                ([u8; 10]      ), // panose
        unicode_range1        (u32           ), // ulUnicodeRange1
        unicode_range2        (u32           ), // ulUnicodeRange2
        unicode_range3        (u32           ), // ulUnicodeRange3
        unicode_range4        (u32           ), // ulUnicodeRange4
        vendor_id             (Tag           ), // achVendID
        selection_flags       (SelectionFlags), // fsSelection
        first_char_index      (u16           ), // usFirstCharIndex
        last_char_index       (u16           ), // usLastCharIndex
        typographic_ascender  (i16           ), // sTypoAscender
        typographic_descender (i16           ), // sTypoDescender
        typographic_line_gap  (i16           ), // sTypoLineGap
        windows_ascender      (u16           ), // usWinAscent
        windows_descender     (u16           ), // usWinDescent
        code_page_range1      (u32           ), // ulCodePageRange1
        code_page_range2      (u32           ), // ulCodePageRange2
        x_height              (i16           ), // sxHeight
        cap_height            (i16           ), // sCapHeight
        default_char          (u16           ), // usDefaultChar
        break_char            (u16           ), // usBreakChar
        max_context           (u16           ), // usMaxContext
    }
}

/// OS/2 and Windows metrics of version 3.
pub type WindowsMetrics3 = WindowsMetrics2;

/// OS/2 and Windows metrics of version 4.
pub type WindowsMetrics4 = WindowsMetrics2;

table! {
    #[doc = "OS/2 and Windows metrics of version 5."]
    #[derive(Copy)]
    pub WindowsMetrics5 {
        version                  (u16           ), // version
        average_char_width       (i16           ), // xAvgCharWidth
        weight_class             (u16           ), // usWeightClass
        width_class              (u16           ), // usWidthClass
        type_flags               (TypeFlags     ), // fsType
        subscript_x_size         (i16           ), // ySubscriptXSize
        subscript_y_size         (i16           ), // ySubscriptYSize
        subscript_x_offset       (i16           ), // ySubscriptXOffset
        subscript_y_offset       (i16           ), // ySubscriptYOffset
        superscript_x_size       (i16           ), // ySuperscriptXSize
        superscript_y_size       (i16           ), // ySuperscriptYSize
        superscript_x_offset     (i16           ), // ySuperscriptXOffset
        superscript_y_offset     (i16           ), // ySuperscriptYOffset
        strikeout_size           (i16           ), // yStrikeoutSize
        strikeout_position       (i16           ), // yStrikeoutPosition
        family_class             (i16           ), // sFamilyClass
        panose                   ([u8; 10]      ), // panose
        unicode_range1           (u32           ), // ulUnicodeRange1
        unicode_range2           (u32           ), // ulUnicodeRange2
        unicode_range3           (u32           ), // ulUnicodeRange3
        unicode_range4           (u32           ), // ulUnicodeRange4
        vendor_id                (Tag           ), // achVendID
        selection_flags          (SelectionFlags), // fsSelection
        first_char_index         (u16           ), // usFirstCharIndex
        last_char_index          (u16           ), // usLastCharIndex
        typographic_ascender     (i16           ), // sTypoAscender
        typographic_descender    (i16           ), // sTypoDescender
        typographic_line_gap     (i16           ), // sTypoLineGap
        windows_ascender         (u16           ), // usWinAscent
        windows_descender        (u16           ), // usWinDescent
        code_page_range1         (u32           ), // ulCodePageRange1
        code_page_range2         (u32           ), // ulCodePageRange2
        x_height                 (i16           ), // sxHeight
        cap_height               (i16           ), // sCapHeight
        default_char             (u16           ), // usDefaultChar
        break_char               (u16           ), // usBreakChar
        max_context              (u16           ), // usMaxContext
        lower_optical_point_size (u16           ), // usLowerOpticalPointSize
        upper_optical_point_size (u16           ), // usUpperOpticalPointSize
    }
}

flags! {
    #[doc = "Type flags."]
    pub TypeFlags(u16) {
        0b0000_0000_0000_0010 => is_restricted_license_embedding,
        0b0000_0000_0000_0100 => is_preview_print_embedding,
        0b0000_0000_0000_1000 => is_editable_embedding,
        0b0000_0001_0000_0000 => has_no_subset_embedding,
        0b0000_0010_0000_0000 => is_bitmap_embedding_only,
        0b1111_1100_1111_0001 => is_invalid,
    }
}

flags! {
    #[doc = "Font-selection flags."]
    pub SelectionFlags(u16) {
        0b0000_0000_0000_0001 => is_italic,
        0b0000_0000_0000_0010 => is_underscore,
        0b0000_0000_0000_0100 => is_negative,
        0b0000_0000_0000_1000 => is_outlined,
        0b0000_0000_0001_0000 => is_strikeout,
        0b0000_0000_0010_0000 => is_bold,
        0b0000_0000_0100_0000 => is_regular,
        0b0000_0000_1000_0000 => should_use_typographic_metrics,
        0b0000_0001_0000_0000 => is_wws,
        0b0000_0010_0000_0000 => is_oblique,
        0b1111_1100_0000_0000 => is_invalid,
    }
}

impl Value for WindowsMetrics {
    fn read<T: Tape>(tape: &mut T) -> Result<Self> {
        Ok(match tape.peek::<u16>()? {
            0 => WindowsMetrics::Version0(tape.take()?),
            1 => WindowsMetrics::Version1(tape.take()?),
            2 => WindowsMetrics::Version2(tape.take()?),
            3 => WindowsMetrics::Version3(tape.take()?),
            4 => WindowsMetrics::Version4(tape.take()?),
            5 => WindowsMetrics::Version5(tape.take()?),
            _ => raise!("found an unknown format of the OS/2 and Windows metrics"),
        })
    }
}