registered font, preexisting metadata weight "reg": float32as(0.000000, 0x0) "semi": float32as(0.300000, 0x3e99999a) "bold": float32as(0.400000, 0x3ecccccd) "light": float32as(-0.400000, 0xbecccccd) "med": float32as(0.230000, 0x3e6b851f) "heavy": float32as(0.560000, 0x3f0f5c29) "black": float32as(0.620000, 0x3f1eb852) "thin": float32as(-0.600000, 0xbf19999a) "ulight": float32as(-0.800000, 0xbf4ccccd) registered font, postscript name (probably only for TrueType and OpenType) special cases, overrides the above "LucidaGrande": float32as(0.000000, 0x0) ".LucidaGrandeUI": float32as(0.000000, 0x0) ".Keyboard": float32as(0.000000, 0x0) "STHeiti": float32as(0.240000, 0x3e75c28f) "STXihei": float32as(-0.100000, 0xbdcccccd) "TimesNewRomanPSMT": float32as(0.000000, 0x0) registered font, style glossary strings, tried in this order (possibly TrueType and OpenType only): preferred subfamily, subfamily, full name, preferred family, family; case-insensitive search, reverse search, "nonliteral" (kCFCompareNonliteral) "Ultra Light": float32as(-0.800000, 0xbf4ccccd) "Ultra Black": float32as(0.750000, 0x3f400000) "Extra Light": float32as(-0.500000, 0xbf000000) "UltraBlack": float32as(0.750000, 0x3f400000) "ExtraBlack": float32as(0.800000, 0x3f4ccccd) "UltraLight": float32as(-0.800000, 0xbf4ccccd) "ExtraLight": float32as(-0.500000, 0xbf000000) "Ultra Thin": float32as(-0.800000, 0xbf4ccccd) "Extra Thin": float32as(-0.800000, 0xbf4ccccd) "Heavy Face": float32as(0.560000, 0x3f0f5c29) "Semi Light": float32as(-0.200000, 0xbe4ccccd) "Extra Bold": float32as(0.500000, 0x3f000000) "Ultra Bold": float32as(0.700000, 0x3f333333) "HeavyFace": float32as(0.560000, 0x3f0f5c29) "ExtraBold": float32as(0.500000, 0x3f000000) "UltraBold": float32as(0.700000, 0x3f333333) "Ext Black": float32as(0.800000, 0x3f4ccccd) "SemiLight": float32as(-0.200000, 0xbe4ccccd) "Demi Bold": float32as(0.250000, 0x3e800000) "Semi Bold": float32as(0.300000, 0x3e99999a) "Ext Light": float32as(-0.500000, 0xbf000000) "Ext Bold": float32as(0.500000, 0x3f000000) "DemiBold": float32as(0.250000, 0x3e800000) "SemiBold": float32as(0.300000, 0x3e99999a) "HairLine": float32as(-0.800000, 0xbf4ccccd) "Ext Thin": float32as(-0.800000, 0xbf4ccccd) "Medium": float32as(0.230000, 0x3e6b851f) "Poster": float32as(0.800000, 0x3f4ccccd) "Light": float32as(-0.400000, 0xbecccccd) "Ultra": float32as(0.500000, 0x3f000000) "Heavy": float32as(0.560000, 0x3f0f5c29) "Extra": float32as(0.500000, 0x3f000000) "Black": float32as(0.620000, 0x3f1eb852) "Super": float32as(0.620000, 0x3f1eb852) "Obese": float32as(0.850000, 0x3f59999a) "Lite": float32as(-0.400000, 0xbecccccd) "Book": float32as(-0.230000, 0xbe6b851f) "Demi": float32as(0.250000, 0x3e800000) "Semi": float32as(0.300000, 0x3e99999a) "Thin": float32as(-0.500000, 0xbf000000) "Bold": float32as(0.400000, 0x3ecccccd) "Nord": float32as(0.800000, 0x3f4ccccd) "Fat": float32as(0.750000, 0x3f400000) "W1": float32as(-0.230000, 0xbe6b851f) "W2": float32as(-0.500000, 0xbf000000) "W3": float32as(-0.230000, 0xbe6b851f) "W4": float32as(0.000000, 0x0) "W5": float32as(0.230000, 0x3e6b851f) "W6": float32as(0.300000, 0x3e99999a) "W7": float32as(0.440000, 0x3ee147ae) "W8": float32as(0.540000, 0x3f0a3d71) "W9": float32as(0.620000, 0x3f1eb852) registered font, OS2 weights; table length >= 78 1, 10 - 100: float32as(-0.800000, 0xbf4ccccd) 2, 101 - 200: float32as(-0.500000, 0xbf000000) 3, 201 - 300: float32as(-0.400000, 0xbecccccd) 4, 301 - 400: float32as(0.000000, 0x0) 5, 401 - 500: float32as(0.230000, 0x3e6b851) 6, 501 - 600: float32as(0.250000, 0x3e800000) 7, 601 - 700: float32as(0.400000, 0x3ecccccd) 8, 701 - 800: float32as(0.500000, 0x3f000000) 9, 801 - 900: float32as(0.620000, 0x3f1eb852) 901 - 950: float32as(0.750000, 0x3f400000) 951 - 999: float32as(0.800000, 0x3f4ccccd) 0, 1000: panose panose 2: float32as(-0.500000, 0xbf000000) panose 3: float32as(-0.400000, 0xbecccccd) panose 4: !!!! see note should be float32as(-0.300000, 0xbe99999a) but is treated as invalid instead due to returning false instead of true panose 5: float32as(-0.230000, 0xbe6b851f) panose 6: float32as(0.230000, 0x3e6b851f) panose 7: float32as(0.250000, 0x3e800000) panose 8: float32as(0.400000, 0x3ecccccd) panose 9: float32as(0.560000, 0x3f0f5c29) panose 10: float32as(0.620000, 0x3f1eb852) panose 11: float32as(0.800000, 0x3f4ccccd) registered font, head table, low bit of byte 0x2D 'head'[0x2D] & 1: float32as(0.400000, 0x3ecccccd) registered font, abbreviated weight glossary, checks for (possibly in TrueType and OpenType only) in order: preferred subfamily, family; case-insensitive strict comparison "EL": float32as(-0.200000, 0xbe4ccccd) "EB": float32as(0.500000, 0x3f000000) "SB": float32as(0.300000, 0x3e99999a) "UH": float32as(0.800000, 0x3f4ccccd) "U": float32as(0.700000, 0x3f333333) "L": float32as(-0.400000, 0xbecccccd) "H": float32as(0.560000, 0x3f0f5c29) "B": float32as(0.400000, 0x3ecccccd) "M": float32as(0.230000, 0x3e6b851f) "R": float32as(0.000000, 0x0) registered font default: float32as(0.000000, 0x0) // based on CoreText dylib's __Z13WeightOfClasst — WeightOfClass(unsigned short) func CoreText_WeightOfClass(usWeightClass uint16) float64 { if usWeightClass >= 11 { // do nothing; we are preserving the original asm comparisons // and yes, this one is 11, but the one above is 10 } else { usWeightClass *= 100 } // figure out what two floats our weight will be between i := usWeightClass / 100 j := i + 1 if j > 10 { j = 10 } b := float64(i * 100) c := float64(j * 100) a := float64(0) if b != c { a = float64(usWeightClass) a -= b c -= b a /= c } scales := []float32{ float32as(-1.000000, 0xbf800000), float32as(-0.700000, 0xbf333333), float32as(-0.500000, 0xbf000000), float32as(-0.230000, 0xbe6b851f), float32as(0.000000, 0x0), float32as(0.200000, 0x3e4ccccd), float32as(0.300000, 0x3e99999a), float32as(0.400000, 0x3ecccccd), float32as(0.600000, 0x3f19999a), float32as(0.800000, 0x3f4ccccd), float32as(1.000000, 0x3f800000), } c = float64(scale[i]) b = float64[scale[j]) return fma(a, b, c) } unregistered font: kCTFontPostScriptNameKey defaults "LucidaGrande": float64as(0.000000, 0x0) ".LucidaGrandeUI": float64as(0.000000, 0x0) "STHeiti": float64as(0.240000, 0x3fceb851eb851eb8) "STXihei": float64as(-0.100000, 0xbfb999999999999a) "TimesNewRomanPSMT": float64as(0.000000, 0x0) os2table := f.Table('OS/2') if os2table != nil { if !hasWeight { var usWeightClass uint16 valid := false if os2table.Len() > 77 { b := os2table.Bytes() usWeightClass = uint16be(b[4:6]) if usWeightClass > 1000 { weight = 0 hasWeight = false } else { valid = true } } else { usWeightClass = 0 valid = true } if valid { weight = CoreText_WeightOfClass(usWeightClass) hasWeight = true } } } unregistered font, style glossary, checks against kCTFontSubFamilyNameKey, kCTFontFullNameKey, kCTFontFamilyNameKey; case-insensitive (folded by Unicode rules) strstr() "ultra light": float32as(-0.800000, 0xbf4ccccd) "ultra black": float32as(0.750000, 0x3f400000) "extra light": float32as(-0.500000, 0xbf000000) "ultralight": float32as(-0.800000, 0xbf4ccccd) "ultrablack": float32as(0.750000, 0x3f400000) "extrablack": float32as(0.800000, 0x3f4ccccd) "extralight": float32as(-0.500000, 0xbf000000) "heavy face": float32as(0.560000, 0x3f0f5c29) "semi light": float32as(-0.200000, 0xbe4ccccd) "extra bold": float32as(0.500000, 0x3f000000) "ultra bold": float32as(0.700000, 0x3f333333) "heavyface": float32as(0.560000, 0x3f0f5c29) "extrabold": float32as(0.500000, 0x3f000000) "ultrabold": float32as(0.700000, 0x3f333333) "semilight": float32as(-0.200000, 0xbe4ccccd) "demi bold": float32as(0.250000, 0x3e800000) "semi bold": float32as(0.300000, 0x3e99999a) "demibold": float32as(0.250000, 0x3e800000) "semibold": float32as(0.300000, 0x3e99999a) "hairline": float32as(-0.700000, 0xbf333333) "medium": float32as(0.230000, 0x3e6b851f) "poster": float32as(0.800000, 0x3f4ccccd) "light": float32as(-0.400000, 0xbecccccd) "heavy": float32as(0.560000, 0x3f0f5c29) "extra": float32as(0.500000, 0x3f000000) "black": float32as(0.620000, 0x3f1eb852) "super": float32as(0.620000, 0x3f1eb852) "obese": float32as(0.850000, 0x3f59999a) "lite": float32as(-0.400000, 0xbecccccd) "book": float32as(-0.230000, 0xbe6b851f) "demi": float32as(0.250000, 0x3e800000) "semi": float32as(0.300000, 0x3e99999a) "thin": float32as(-0.500000, 0xbf000000) "bold": float32as(0.400000, 0x3ecccccd) "nord": float32as(0.800000, 0x3f4ccccd) "fat": float32as(0.750000, 0x3f400000) "w1": float32as(-0.700000, 0xbf333333) "w2": float32as(-0.500000, 0xbf000000) "w3": float32as(-0.230000, 0xbe6b851f) "w4": float32as(0.000000, 0x0) "w5": float32as(0.230000, 0x3e6b851f) "w6": float32as(0.300000, 0x3e99999a) "w7": float32as(0.440000, 0x3ee147ae) "w8": float32as(0.540000, 0x3f0a3d71) "w9": float32as(0.620000, 0x3f1eb852) func (f *Font) ShouldEnableBoldSymbolicTrait() bool { if f.IsRegistered() { return f.ShouldEnableBoldSymbolicTraitFromRegistry() } no := f.Weight() <= float64as(0.239000, 0x3fce978d4fdf3b64) return !no }