radicals.py (4996B)
1 #!/usr/bin/env python3 2 3 from utils import mathfont 4 import fontforge 5 6 7 radicalCodePoint = 0x221a 8 9 10 def createStretchyRadical(aFont, codePoint=radicalCodePoint, width=mathfont.em, suffix=""): 11 g = aFont.createChar(codePoint, "radical%s" % suffix) 12 mathfont.drawRectangleGlyph(g, width, mathfont.em, 0) 13 for size in (0, 1, 2, 3): 14 g = aFont.createChar(-1, "size%d%s" % (size, suffix)) 15 mathfont.drawRectangleGlyph(g, width, (size + 1) * mathfont.em, 0) 16 aFont[codePoint].verticalVariants = "radical%s size1%s size2%s size3%s" % ((suffix,) * 4) 17 # Part: (glyphName, isExtender, startConnector, endConnector, fullAdvance) 18 aFont.math.MinConnectorOverlap = 0 19 aFont[codePoint].verticalComponents = \ 20 (("size2%s" % suffix, False, 0, width, 3 * mathfont.em), 21 ("size1%s" % suffix, True, mathfont.em, width, 2 * mathfont.em)) 22 23 24 v1 = 25 25 v2 = 1 * mathfont.em 26 f = mathfont.create("radical-degreebottomraisepercent%d-rulethickness%d" % (v1, v2), 27 "Copyright (c) 2016 MathML Association") 28 createStretchyRadical(f) 29 f.math.RadicalDegreeBottomRaisePercent = v1 30 f.math.RadicalDisplayStyleVerticalGap = 0 31 f.math.RadicalExtraAscender = 0 32 f.math.RadicalKernAfterDegree = 0 33 f.math.RadicalKernBeforeDegree = 0 34 f.math.RadicalRuleThickness = v2 35 f.math.RadicalVerticalGap = 0 36 mathfont.save(f) 37 38 v1 = 7 * mathfont.em 39 v2 = 1 * mathfont.em 40 f = mathfont.create("radical-displaystyleverticalgap%d-rulethickness%d" % (v1, v2), 41 "Copyright (c) 2016 MathML Association") 42 createStretchyRadical(f) 43 f.math.RadicalDegreeBottomRaisePercent = 0 44 f.math.RadicalDisplayStyleVerticalGap = v1 45 f.math.RadicalExtraAscender = 0 46 f.math.RadicalKernAfterDegree = 0 47 f.math.RadicalKernBeforeDegree = 0 48 f.math.RadicalRuleThickness = v2 49 f.math.RadicalVerticalGap = 0 50 mathfont.save(f) 51 52 v1 = 3 * mathfont.em 53 v2 = 1 * mathfont.em 54 f = mathfont.create("radical-extraascender%d-rulethickness%d" % (v1, v2), 55 "Copyright (c) 2016 MathML Association") 56 createStretchyRadical(f) 57 f.math.RadicalDegreeBottomRaisePercent = 0 58 f.math.RadicalDisplayStyleVerticalGap = 0 59 f.math.RadicalExtraAscender = v1 60 f.math.RadicalKernAfterDegree = 0 61 f.math.RadicalKernBeforeDegree = 0 62 f.math.RadicalRuleThickness = v2 63 f.math.RadicalVerticalGap = 0 64 mathfont.save(f) 65 66 v1 = 5 * mathfont.em 67 v2 = 1 * mathfont.em 68 f = mathfont.create("radical-kernafterdegreeminus%d-rulethickness%d" % (v1, v2), 69 "Copyright (c) 2016 MathML Association") 70 createStretchyRadical(f) 71 f.math.RadicalDegreeBottomRaisePercent = 0 72 f.math.RadicalDisplayStyleVerticalGap = 0 73 f.math.RadicalExtraAscender = 0 74 f.math.RadicalKernAfterDegree = -v1 75 f.math.RadicalKernBeforeDegree = 0 76 f.math.RadicalRuleThickness = v2 77 f.math.RadicalVerticalGap = 0 78 mathfont.save(f) 79 80 v1 = 4 * mathfont.em 81 v2 = 1 * mathfont.em 82 f = mathfont.create("radical-kernbeforedegree%d-rulethickness%d" % (v1, v2), 83 "Copyright (c) 2016 MathML Association") 84 createStretchyRadical(f) 85 f.math.RadicalDegreeBottomRaisePercent = 0 86 f.math.RadicalDisplayStyleVerticalGap = 0 87 f.math.RadicalExtraAscender = 0 88 f.math.RadicalKernAfterDegree = 0 89 f.math.RadicalKernBeforeDegree = v1 90 f.math.RadicalRuleThickness = v2 91 f.math.RadicalVerticalGap = 0 92 mathfont.save(f) 93 94 v = 8 * mathfont.em 95 f = mathfont.create("radical-rulethickness%d" % v, 96 "Copyright (c) 2016 MathML Association") 97 createStretchyRadical(f) 98 f.math.RadicalDegreeBottomRaisePercent = 0 99 f.math.RadicalDisplayStyleVerticalGap = 0 100 f.math.RadicalExtraAscender = 0 101 f.math.RadicalKernAfterDegree = 0 102 f.math.RadicalKernBeforeDegree = 0 103 f.math.RadicalRuleThickness = v 104 f.math.RadicalVerticalGap = 0 105 mathfont.save(f) 106 107 v1 = 6 * mathfont.em 108 v2 = 1 * mathfont.em 109 f = mathfont.create("radical-verticalgap%d-rulethickness%d" % (v1, v2), 110 "Copyright (c) 2016 MathML Association") 111 createStretchyRadical(f) 112 f.math.RadicalDegreeBottomRaisePercent = 0 113 f.math.RadicalDisplayStyleVerticalGap = 0 114 f.math.RadicalExtraAscender = 0 115 f.math.RadicalKernAfterDegree = 0 116 f.math.RadicalKernBeforeDegree = 0 117 f.math.RadicalRuleThickness = v2 118 f.math.RadicalVerticalGap = v1 119 mathfont.save(f) 120 121 v1 = 1 * mathfont.em 122 v2 = 1 * mathfont.em 123 f = mathfont.create("radical-negativekernbeforedegree%d-rulethickness%d" % 124 (v1, v2), "Copyright (c) 2020 Igalia S.L.") 125 createStretchyRadical(f) 126 f.math.RadicalDegreeBottomRaisePercent = 0 127 f.math.RadicalDisplayStyleVerticalGap = 0 128 f.math.RadicalExtraAscender = 0 129 f.math.RadicalKernAfterDegree = 0 130 f.math.RadicalKernBeforeDegree = -v1 131 f.math.RadicalRuleThickness = v2 132 f.math.RadicalVerticalGap = 0 133 mathfont.save(f) 134 135 v1 = 4 * mathfont.em 136 v2 = 1 * mathfont.em 137 f = mathfont.create("radical-rtlm", "Copyright (c) 2025 Igalia S.L.") 138 f.addLookup("gsub", "gsub_single", (), (("rtlm", (("latn", ("dflt")),)),)) 139 f.addLookupSubtable("gsub", "gsub_n") 140 createStretchyRadical(f, radicalCodePoint, v1) 141 createStretchyRadical(f, 0xE000, v2, ".rtlm") 142 f[radicalCodePoint].addPosSub("gsub_n", "radical.rtlm") 143 mathfont.save(f)