xx pseudo-go func (f *CTFont) RegistryWidth32() float32 { metadata visual descriptors { "med", float32as(0.000000, 0x0) }, { "cond", float32as(-0.200000, 0xbe4ccccd) }, { "ext", float32as(0.200000, 0x3e4ccccd) }, style dictionary { "Extra Compressed", float32as(-0.700000, 0xbf333333) }, { "Ultra Compressed", float32as(-0.700000, 0xbf333333) }, { "Ultra Condensed", float32as(-0.700000, 0xbf333333) }, { "Extra Condensed", float32as(-0.500000, 0xbf000000) }, { "Extra Extended", float32as(0.400000, 0x3ecccccd) }, { "Ext Compressed", float32as(-0.700000, 0xbf333333) }, { "Ultra Expanded", float32as(0.800000, 0x3f4ccccd) }, { "Ultra Extended", float32as(0.800000, 0x3f4ccccd) }, { "Extra Expanded", float32as(0.400000, 0x3ecccccd) }, xx TODO this is weird, but correct... { "Semi Condensed", float32as(-0.700000, 0xbf333333) }, { "Semi Condensed", float32as(-0.100000, 0xbdcccccd) }, xx end TODO { "Ext Condensed", float32as(-0.500000, 0xbf000000) }, { "SemiCondensed", float32as(-0.100000, 0xbdcccccd) }, { "ExtraExpanded", float32as(0.400000, 0x3ecccccd) }, { "Semi Expanded", float32as(0.100000, 0x3dcccccd) }, { "Semi Extended", float32as(0.100000, 0x3dcccccd) }, { "Ext Expanded", float32as(0.400000, 0x3ecccccd) }, { "Ext Extended", float32as(0.400000, 0x3ecccccd) }, { "SemiExpanded", float32as(0.100000, 0x3dcccccd) }, { "Extra Narrow", float32as(-0.500000, 0xbf000000) }, { "ExtraNarrow", float32as(-0.500000, 0xbf000000) }, { "Extra Wide", float32as(0.800000, 0x3f4ccccd) }, { "Ultra Cond", float32as(-0.700000, 0xbf333333) }, { "Compressed", float32as(-0.500000, 0xbf000000) }, { "Extra Cond", float32as(-0.500000, 0xbf000000) }, { "Semi Cond", float32as(-0.100000, 0xbdcccccd) }, { "Condensed", float32as(-0.200000, 0xbe4ccccd) }, { "ExtraWide", float32as(0.800000, 0x3f4ccccd) }, { "Extended", float32as(0.200000, 0x3e4ccccd) }, { "Expanded", float32as(0.200000, 0x3e4ccccd) }, { "Ext Cond", float32as(-0.500000, 0xbf000000) }, { "Narrow", float32as(-0.400000 , 0xbecccccd) }, { "Compact", float32as(-0.400000, 0xbecccccd) }, { "Cond", float32as(-0.200000, 0xbe4ccccd) }, { "Wide", float32as(0.600000, 0x3f19999a) }, { "Thin", float32as(-0.700000, 0xbf333333) }, get os2 table if os2table.Len() >= 78 { usWidthClass := uint16be(b[6:8]) - 1 xx this handles the case where the original usWidthClass == 0 if usWidthClass > 8 { panose := b[0x23] - 2 if panose > 6 { xx TODO } else { switch panose { case 0, 1, 2: width = float32as(0.000000, 0x0) case 3: width = float32as(0.200000, 0x3e4ccccd) case 4: width = float32as(-0.200000, 0xbe4ccccd) case 5: width = float32as(0.400000, 0x3ecccccd) case 6: width = float32as(-0.400000, 0xbecccccd) } } } switch usWidthClass { case 0: width = float32as(-0.700000, 0xbf333333) case 1: width = float32as(-0.500000, 0xbf000000) case 2: width = float32as(-0.200000, 0xbe4ccccd) case 3: width = float32as(-0.100000, 0xbdcccccd) case 4: width = float32as(0.000000, 0x0) case 5: width = float32as(0.100000, 0x3dcccccd) case 6: width = float32as(0.400000, 0x3ecccccd) case 7: width = float32as(0.600000, 0x3f19999a) case 8: width = float32as(0.800000, 0x3f4ccccd) } } headtable := f.CopyTable('head') if headtable != nil { if headtable.Len() >= 54 { x := b[0x2d] if (x & 0x20) != 0 { width = float32as(-0.200000, 0xbe4ccccd) } else if (x & 0x40) != 0 { width = float32as(0.200000, 0x3e4ccccd) } } } xx and if all else fails return float32as(0.000000, 0x0) } func (f *CTFont) Width() float64 { if f.IsRegistered() { return f.RegistryWidth() } width := 0.0 hasWidth := false if there is an OS2 table { var usWidthClass uint16 valid := false if it's 78 bytes or more { usWidthClass = uint16be(table[6:8]) if usWeightClass <= 10 { valid = true } else { valid = false } } else { usWidthClass = 0 valid = true } if valid { ten := float64as(10.000000, 0x4024000000000000) negPointFive := float64as(-0.500000, 0xbfe0000000000000) width = (float64(usWidthClass) div ten) + negPointFive hasWidth = true } } then there's the style glossary strings comparison: { "semi condensed", float32as(-0.100000, 0xbdcccccd) }, { "extra expanded", float32as(0.400000, 0x3ecccccd) }, { "semicondensed", float32as(-0.100000, 0xbdcccccd) }, { "extraexpanded", float32as(0.400000, 0x3ecccccd) }, { "semi expanded", float32as(0.100000, 0x3dcccccd) }, { "semiexpanded", float32as(0.100000, 0x3dcccccd) }, { "extra narrow", float32as(-0.500000, 0xbf000000) }, { "extranarrow", float32as(-0.500000, 0xbf000000) }, { "extra wide", float32as(0.800000, 0x3f4ccccd) }, { "condensed", float32as(-0.200000, 0xbe4ccccd) }, { "extrawide", float32as(0.800000, 0x3f4ccccd) }, { "extended", float32as(0.200000, 0x3e4ccccd) }, { "expanded", float32as(0.200000, 0x3e4ccccd) }, { "narrow", float32as(-0.400000, 0xbecccccd) }, { "wide", float32as(0.600000, 0x3f19999a) }, { "thin", float32as(-0.700000, 0xbf333333) }, otherwise just return float64as(0.000000, 0x0) }