161 lines
5.0 KiB
Plaintext
161 lines
5.0 KiB
Plaintext
|
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)
|
||
|
}
|