///|
/// Parse OS/2 table
pub fn parse_os2(reader : BinaryReader, offset : Int) -> OS2Table {
let version = reader.peek_uint16_at(offset)
// xAvgCharWidth(2) + usWeightClass(2) + usWidthClass(2)
let us_weight_class = reader.peek_uint16_at(offset + 4)
let us_width_class = reader.peek_uint16_at(offset + 6)
let fs_type = reader.peek_uint16_at(offset + 8)
// PANOSE: 10 bytes at offset+32
let panose : FixedArray[Int] = FixedArray::make(10, 0)
for i in 0..<10 {
panose[i] = reader.data[offset + 32 + i].to_int()
}
// ulUnicodeRange1..4 at offset+42..57 (each 4 bytes)
let ul_unicode_range1 = reader.peek_uint32_at(offset + 42)
let ul_unicode_range2 = reader.peek_uint32_at(offset + 46)
let ul_unicode_range3 = reader.peek_uint32_at(offset + 50)
let ul_unicode_range4 = reader.peek_uint32_at(offset + 54)
// fsSelection at offset+62
let fs_selection = reader.peek_uint16_at(offset + 62)
// sTypoAscender/Descender/LineGap at offset+68..72
let s_typo_ascender = reader.peek_int16_at(offset + 68)
let s_typo_descender = reader.peek_int16_at(offset + 70)
let s_typo_line_gap = reader.peek_int16_at(offset + 72)
// usWinAscent/Descent at offset+74..77
let us_win_ascent = reader.peek_uint16_at(offset + 74)
let us_win_descent = reader.peek_uint16_at(offset + 76)
// sxHeight and sCapHeight: v2+ only (offset+86..89)
let sx_height = if version >= 2 {
reader.peek_int16_at(offset + 86)
} else {
0
}
let s_cap_height = if version >= 2 {
reader.peek_int16_at(offset + 88)
} else {
0
}
{
version,
us_weight_class,
us_width_class,
fs_type,
panose,
ul_unicode_range1,
ul_unicode_range2,
ul_unicode_range3,
ul_unicode_range4,
fs_selection,
s_typo_ascender,
s_typo_descender,
s_typo_line_gap,
us_win_ascent,
us_win_descent,
sx_height,
s_cap_height,
}
}