Iosevka/font-src/glyphs/auto-build/transformed.ptl

954 lines
31 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

###### Automatic builds
$$include '../../meta/macros.ptl'
import [linreg clamp mix fallback] from"../../support/utils.mjs"
import [getGrTree IsSuperscript IsSubscript] from"../../support/gr.mjs"
import [AnyCv DotlessOrNot CvDecompose MathSansSerif Texture] from"../../support/gr.mjs"
import [NumeratorForm DenominatorForm] from"../../support/gr.mjs"
import [Transform] from"../../support/geometry/transform.mjs"
extern Map
extern Set
glyph-module
glyph-block Autobuild-Transformed-Shared : begin
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives
glyph-block-export wrapName
define [wrapName groupID baseName] "\(groupID){\(baseName)}"
define [suggestName _name] : begin
local name _name
if [query-glyph name] : begin
local j 2
while [query-glyph (name + j)] : inc j
set name (name + j)
return name
glyph-block-export suggestMappedName
define [suggestMappedName map key name] : begin
if map.(key) : return map.(key)
local amended : suggestName name
set map.(key) amended
return amended
glyph-block-export extendRelatedGlyphs
define [extendRelatedGlyphs groupID records] : begin
local relatedRecords {}
local relSets {}
local targetNameMap {.}
foreach [record : items-of records] : begin
local srcName record.1
local dstName : wrapName groupID srcName
suggestMappedName targetNameMap srcName dstName
local tree : getGrTree srcName { DotlessOrNot AnyCv } query-glyph
foreach [{gr origSrcName relSrcName} : items-of tree] : if [query-glyph relSrcName] : begin
local origDstName : suggestMappedName targetNameMap origSrcName [wrapName groupID origSrcName]
local relDstName : suggestMappedName targetNameMap relSrcName [wrapName groupID relSrcName]
local relatedRecord : record.slice 0
set relatedRecord.0 null
set relatedRecord.1 relSrcName
set relatedRecord.2 true
relatedRecords.push relatedRecord
relSets.push { gr origDstName relDstName }
return { [records.concat relatedRecords] relSets targetNameMap }
glyph-block-export link-relations
define [link-relations relSets] : begin
local rs : new Set
foreach [{gr origDstName relDstName} : items-of relSets]
if [query-glyph origDstName] : begin
gr.set [query-glyph origDstName] relDstName
if [query-glyph relDstName] : begin
[query-glyph origDstName].tryBecomeMirrorOf [query-glyph relDstName] rs
glyph-block-export ToSuperscript
define [ToSuperscript div] : glyph-proc
local df : DivFrame df
include [Ungizmo] true
include [Translate (-df.middle) (-CAP)] true
include [Scale ToSuperscript.crowdAdjScale] true
include [Translate df.middle (CAP + AccentStackOffset / 2)] true
include [Regizmo] true
set ToSuperscript.crowd 3.5
set ToSuperscript.crowdAdjScale 0.7
glyph-block-export ToSubscript
define [ToSubscript div] : glyph-proc
local df : DivFrame df
include [Ungizmo] true
include [Translate (-df.middle) 0] true
include [Scale ToSubscript.crowdAdjScale] true
include [Translate df.middle (Descender / 2)] true
include [Regizmo] true
set ToSubscript.crowd 3.5
set ToSubscript.crowdAdjScale 0.7
glyph-block Autobuild-Transformed : begin
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives
glyph-block-import Recursive-Build : Fork Miniature
glyph-block-import Mark-Shared-Metrics : markMiddle
glyph-block-import Mark-Above : aboveMarkBot aboveMarkMid aboveMarkTop
glyph-block-import Mark-Below : belowMarkBot belowMarkMid belowMarkTop
glyph-block-import Autobuild-Transformed-Shared : extendRelatedGlyphs link-relations
glyph-block-import Autobuild-Transformed-Shared : ToSuperscript ToSubscript
do
createSuperscripts 'sup' null : list
list 0x00AA 'aSbRsbUnderlineBelow'
list 0x00BA 'oSbRsbUnderlineBelow'
list 0x2070 'zero.lnum'
list 0x00B9 'one.lnum'
list 0x00B2 'two.lnum'
list 0x00B3 'three.lnum'
list 0x2074 'four.lnum'
list 0x2075 'five.lnum'
list 0x2076 'six.lnum'
list 0x2077 'seven.lnum'
list 0x2078 'eight.lnum'
list 0x2079 'nine.lnum'
list 0x02B0 'h'
list 0x02B1 'hHookTop'
list 0x02B2 'j'
list 0x02B3 'r'
list 0x02B4 'turnr'
list 0x02B5 'rTurnRTail'
list 0x02B6 'invSmcpR'
list 0x02B7 'w'
list 0x02B8 'y'
list 0x02C0 'smallGlottalStop'
list 0x02C1 'smallRevGlottalStop'
list 0x02E0 'latn/gamma'
list 0x02E1 'l'
list 0x02E2 's'
list 0x02E3 'x'
list 0x02E4 'revGlottalStop'
list 0x2071 'i'
list 0x207F 'n'
list 0x1D43 'a'
list 0x1D44 'turna'
list 0x1D45 'scripta'
list 0x1D46 'turnae'
list 0x1D47 'b'
list 0x1D48 'd'
list 0x1D49 'e'
list 0x1D4A 'schwa'
list 0x1D4B 'latn/epsilon'
list 0x1D4C 'turnepsilon'
list 0x1D4D 'g'
list 0x1D4E 'turni'
list 0x1D4F 'k'
list 0x1D50 'm'
list 0x1D51 'eng'
list 0x1D52 'o'
list 0x1D53 'turnc'
list 0x1D54 'oupperhalf'
list 0x1D55 'olowerhalf'
list 0x1D56 'p'
list 0x1D57 't'
list 0x1D58 'u'
list 0x1D59 'uSideways'
list 0x1D5A 'turnm'
list 0x1D5B 'v'
list 0x1D5C 'latinAyin'
list 0x1D5D 'grek/beta'
list 0x1D5E 'grek/gamma'
list 0x1D5F 'grek/delta'
list 0x1D60 'grek/phi'
list 0x1D61 'grek/chi'
list 0x1D78 'cyrl/en'
list 0x1D9B 'turnscripta'
list 0x1D9C 'c'
list 0x1D9D 'cCurlyTail'
list 0x1D9E 'eth'
list 0x1D9F 'latn/epsilonRev'
list 0x1DA0 'f'
list 0x1DA1 'dotlessjBar'
list 0x1DA2 'gScript'
list 0x1DA3 'turnh'
list 0x1DA4 'iBarOver'
list 0x1DA5 'latn/iota'
list 0x1DA6 'smcpI'
list 0x1DA7 'smcpIBarOver'
list 0x1DA8 'jCurlyTail'
list 0x1DAB 'smcpL'
list 0x1DA9 'lRTail'
list 0x1DAA 'lPalatalHook'
list 0x1DAC 'meng'
list 0x1DAD 'turnmLeg'
list 0x1DAE 'nLTail'
list 0x1DAF 'nHookBottom'
list 0x1DB0 'smcpN'
list 0x1DB1 'obar'
list 0x1DB2 'latn/phi'
list 0x1DB3 'sRTail'
list 0x1DB4 'esh'
list 0x1DB5 'tLTail'
list 0x1DB6 'uLongBarOver'
list 0x1DB7 'latn/upsilon'
list 0x1DB8 'smcpU'
list 0x1DB9 'vHookTop'
list 0x1DBA 'turnv'
list 0x1DBC 'zRTailBR'
list 0x1DBD 'zCurlyTail'
list 0x1DBE 'ezh'
list 0x1DBF 'grek/theta'
list 0x1DBB 'z'
list 0x1D2C 'A'
list 0x1D2E 'B'
list 0x1D2F 'BBar'
list 0x1D30 'D'
list 0x1D31 'E'
list 0x1D32 'revE'
list 0x1D33 'G'
list 0x1D34 'H'
list 0x1D35 'I'
list 0x1D36 'J'
list 0x1D37 'K'
list 0x1D38 'L'
list 0x1D39 'M'
list 0x1D3A 'N'
list 0x1D3B 'NRev'
list 0x1D3C 'O'
list 0x1D3D 'OU'
list 0x1D3E 'P'
list 0x1D3F 'R'
list 0x1D40 'T'
list 0x1D41 'U'
list 0x1D42 'W'
list 0x2C7D 'V'
list 0x207A 'plus'
list 0x207B 'minus'
list 0x207C 'equal'
list 0x207D 'parenLeft'
list 0x207E 'parenRight'
list 0xA69C 'cyrl/yer'
list 0xA69D 'cyrl/yeri'
list 0xA702 'subst'
list 0xA703 'substBarNoRise'
list 0xA704 'supst'
list 0xA705 'supstBarNoRise'
list 0xA71B 'arrowUp.NWID'
list 0xA71C 'arrowDown.NWID'
list 0xA71D 'alveolarclick'
list 0xA71E 'alveolarpercussive'
list 0xA7F2 'C'
list 0xA7F3 'F'
list 0xA7F4 'Q'
list 0xA7F8 'smcpHStroke'
list 0xA7F9 'oe'
list 0xAB5C 'heng'
list 0xAB5D 'lInvLazySOver'
list 0xAB5E 'lTildeOver'
list 0xAB69 'turnw'
list 0x107AF 'tRTail'
list 0x1078B 'dHookBottom'
list 0x107A5 'q'
list 0x10792 'smcpG'
list 0x107B3 'glottalStopBar'
list 0x10795 'hBar'
list 0x10797 'hengHookTop'
list 0x107B0 'vHookRight'
list 0x107A9 'rFlap'
list 0x107A8 'rRTail'
list 0x107BA 'sCurlyTail'
list 0x10784 'smcpB'
list 0x107AA 'smcpR'
list 0x10796 'smcpH'
list 0x107B4 'revGlottalStopBar'
list 0x1079B 'lBelt'
list 0x1079E 'lyogh'
list 0x1079D 'lBeltRTail'
list 0x1079F 'lyoghRTail'
list 0x107A1 'turnyBelt'
list 0x1079C 'smcpLBelt'
list 0x107A0 'turny'
list 0x107A6 'turnrLongLeg'
list 0x107A7 'rTurnLongLetRTail'
list 0x10780 'smcpAA'
list 0x10785 'bHookTop'
list 0x1078C 'dHookTop'
list 0x1078D 'dHookTopBottom'
list 0x10798 'dotlessjBarHookTop'
list 0x10793 'gScriptHookTop'
list 0x10794 'smcpGHookTop'
list 0x107B5 'bullEye'
list 0x107B6 'dentalclick'
list 0x107B8 'palatoalveolarclick'
list 0x107B9 'retroflexClickHook'
list 0x107B7 'alveolarlateralclick'
list 0x107B2 'smcpY'
list 0x107A4 'closeomega'
list 0x107A2 'oSlash'
list 0x1078E 'eRev'
list 0x10791 'ramshorn'
list 0x1078F 'epsilonRevClosed'
list 0x10783 'ae'
list 0x107A3 'smcpOE'
list 0x10781 'triangleColon'
list 0x10782 'halfTriangleColon'
list 0x1E030 'cyrl/a'
list 0x1E031 'cyrl/be'
list 0x1E032 'cyrl/ve'
list 0x1E033 'cyrl/ghe'
list 0x1E034 'cyrl/de'
list 0x1E035 'cyrl/ie'
list 0x1E036 'cyrl/zhe'
list 0x1E037 'cyrl/ze'
list 0x1E038 'cyrl/i'
list 0x1E039 'cyrl/ka'
list 0x1E03A 'cyrl/el'
list 0x1E03B 'cyrl/em'
list 0x1E03C 'cyrl/o'
list 0x1E03D 'cyrl/pe'
list 0x1E03E 'cyrl/er'
list 0x1E03F 'cyrl/es'
list 0x1E040 'cyrl/te'
list 0x1E041 'cyrl/u'
list 0x1E042 'cyrl/ef'
list 0x1E043 'cyrl/ha'
list 0x1E044 'cyrl/tse'
list 0x1E045 'cyrl/che'
list 0x1E046 'cyrl/sha'
list 0x1E047 'cyrl/yery'
list 0x1E048 'cyrl/e'
list 0x1E049 'cyrl/yu'
list 0x1E04A 'cyrl/dzze'
list 0x1E04B 'cyrl/schwa'
list 0x1E04C 'cyrl/Ukrainiani'
list 0x1E04D 'cyrl/je'
list 0x1E04E 'cyrl/oe'
list 0x1E04F 'cyrl/ue'
list 0x1E050 'cyrl/palochka'
list 0x1E06B 'cyrl/the'
list 0x1E06C 'cyrl/yeryBack'
list 0x1E06D 'cyrl/KazakhShortu'
list null 'S' # there is no superscript S in unicode, but is is used for the SM symbol
createSuperscripts 'numerator' NumeratorForm : list
list null 'zero.onum'
list null 'one.onum'
list null 'two.onum'
list null 'three.onum'
list null 'four.onum'
list null 'five.onum'
list null 'six.onum'
list null 'seven.onum'
list null 'eight.onum'
list null 'nine.onum'
list null 'zero.lnum'
list null 'one.lnum'
list null 'two.lnum'
list null 'three.lnum'
list null 'four.lnum'
list null 'five.lnum'
list null 'six.lnum'
list null 'seven.lnum'
list null 'eight.lnum'
list null 'nine.lnum'
do "superscript AE"
define { tnmAHalf jobsAHalf } : createSuperscripts 'sup' null { { null 'AE/AHalf' } }
define { tnmEHalf jobsEHalf } : createSuperscripts 'sup' null { { null 'AE/EHalf' } }
create-glyph 'sup{AE}' 0x1D2D : glyph-proc
include [refer-glyph tnmAHalf.('AE/AHalf')] AS_BASE ALSO_METRICS
include [refer-glyph tnmEHalf.('AE/EHalf')]
CvDecompose.set currentGlyph { tnmAHalf.('AE/AHalf') tnmEHalf.('AE/EHalf') }
: where : [createSuperscripts prefix gr _records] : begin
local {records relSets targetNameMap} : extendRelatedGlyphs prefix _records
local pendingGlyphs : records.map : [record] => record.1
local miniatureFont : Miniature pendingGlyphs
crowd -- ToSuperscript.crowd
scale -- ToSuperscript.crowdAdjScale
mono -- true
sbscale -- 0.75
foreach { unicode glyphid fRelated } [items-of records]
if [not : query-glyph targetNameMap.(glyphid)] : begin
create-glyph (targetNameMap.(glyphid)) unicode : glyph-proc
if [not : miniatureFont.queryByName glyphid] : begin
throw : new Error "Cannot find glyph \(glyphid)"
local middle : [miniatureFont.queryByName glyphid].advanceWidth / 2
include [miniatureFont.queryByName glyphid] AS_BASE ALSO_METRICS
include : ToSuperscript
IsSuperscript.set currentGlyph
if ([not fRelated] && gr) : gr.set [query-glyph glyphid] (targetNameMap.(glyphid))
link-relations relSets
return { targetNameMap records }
do
createSubscripts 'sub' null : list
list 0x2080 'zero.lnum'
list 0x2081 'one.lnum'
list 0x2082 'two.lnum'
list 0x2083 'three.lnum'
list 0x2084 'four.lnum'
list 0x2085 'five.lnum'
list 0x2086 'six.lnum'
list 0x2087 'seven.lnum'
list 0x2088 'eight.lnum'
list 0x2089 'nine.lnum'
list 0x2090 'a'
list 0x2091 'e'
list 0x2092 'o'
list 0x2093 'x'
list 0x2094 'schwa'
list 0x2095 'h'
list 0x2096 'k'
list 0x2097 'l'
list 0x2098 'm'
list 0x2099 'n'
list 0x209A 'p'
list 0x209B 's'
list 0x209C 't'
list 0x1D62 'i'
list 0x1D63 'r'
list 0x1D64 'u'
list 0x1D65 'v'
list 0x1D66 'grek/beta'
list 0x1D67 'grek/gamma'
list 0x1D68 'grek/rho'
list 0x1D69 'grek/phi'
list 0x1D6A 'grek/chi'
list 0x2C7C 'j'
list 0x208A 'plus'
list 0x208B 'minus'
list 0x208C 'equal'
list 0x208D 'parenLeft'
list 0x208E 'parenRight'
list 0xA700 'subst'
list 0xA701 'substBarNoRise'
list 0xA706 'supst'
list 0xA707 'supstBarNoRise'
list 0xA71F 'alveolarpercussive'
list 0x1E051 'cyrl/a'
list 0x1E052 'cyrl/be'
list 0x1E053 'cyrl/ve'
list 0x1E054 'cyrl/ghe'
list 0x1E055 'cyrl/de'
list 0x1E056 'cyrl/ie'
list 0x1E057 'cyrl/zhe'
list 0x1E058 'cyrl/ze'
list 0x1E059 'cyrl/i'
list 0x1E05A 'cyrl/ka'
list 0x1E05B 'cyrl/el'
list 0x1E05C 'cyrl/o'
list 0x1E05D 'cyrl/pe'
list 0x1E05E 'cyrl/es'
list 0x1E05F 'cyrl/u'
list 0x1E060 'cyrl/ef'
list 0x1E061 'cyrl/ha'
list 0x1E062 'cyrl/tse'
list 0x1E063 'cyrl/che'
list 0x1E064 'cyrl/sha'
list 0x1E065 'cyrl/yer'
list 0x1E066 'cyrl/yery'
list 0x1E067 'cyrl/ge'
list 0x1E068 'cyrl/Ukrainiani'
list 0x1E069 'cyrl/dze'
list 0x1E06A 'cyrl/dzhe'
createSubscripts 'denominator' DenominatorForm : list
list null 'zero.onum'
list null 'one.onum'
list null 'two.onum'
list null 'three.onum'
list null 'four.onum'
list null 'five.onum'
list null 'six.onum'
list null 'seven.onum'
list null 'eight.onum'
list null 'nine.onum'
list null 'zero.lnum'
list null 'one.lnum'
list null 'two.lnum'
list null 'three.lnum'
list null 'four.lnum'
list null 'five.lnum'
list null 'six.lnum'
list null 'seven.lnum'
list null 'eight.lnum'
list null 'nine.lnum'
: where : [createSubscripts prefix gr _records] : begin
local {records relSets targetNameMap} : extendRelatedGlyphs prefix _records
local pendingGlyphs : records.map : [record] => record.1
local miniatureFont : Miniature pendingGlyphs
crowd -- ToSubscript.crowd
scale -- ToSubscript.crowdAdjScale
mono -- true
sbscale -- 0.75
foreach { unicode glyphid fRelated } [items-of records]
if [not : query-glyph targetNameMap.(glyphid)] : begin
create-glyph (targetNameMap.(glyphid)) unicode : glyph-proc
local middle : [miniatureFont.queryByName glyphid].advanceWidth / 2
include [miniatureFont.queryByName glyphid] AS_BASE ALSO_METRICS
include : ToSubscript
IsSubscript.set currentGlyph
if ([not fRelated] && gr) : gr.set [query-glyph glyphid] (targetNameMap.(glyphid))
link-relations relSets
do
createMedievalCombs 0 XH : list
list 0x363 'a'
list 0x364 'e'
list 0x366 'o'
list 0x367 'u'
list 0x368 'c'
list 0x369 'd'
list 0x36A 'h'
list 0x36B 'm'
list 0x36C 'r'
list 0x36E 'v'
list 0x36F 'x'
list 0x1DD4 'ae'
list 0x1DD5 'ao'
list 0x1DDB 'smcpG'
list 0x1DDE 'smcpL'
list 0x1DDF 'smcpM'
list 0x1DE0 'n'
list 0x1DE1 'smcpN'
list 0x1DE2 'smcpR'
list 0x1DE3 'rRotunda'
list 0x1DE4 's'
list 0x1DE6 'z'
list 0x1DE7 'scripta'
list 0x1DEA 'schwa'
list 0x1DED 'oWithLightCentralizationStroke'
list 0x1DF0 'uWithLightCentralizationStroke'
list 0x1DF1 'w'
list 0x1ACE 'tInsular'
list 0x20F0 'asterisk/slashBot'
list 0x2DE1 'cyrl/ve'
list 0x2DE2 'cyrl/ghe'
list 0x2DE3 'cyrl/de'
list 0x2DE4 'cyrl/zhe'
list 0x2DE5 'cyrl/ze'
list 0x2DE6 'cyrl/ka'
list 0x2DE7 'cyrl/el'
list 0x2DE8 'cyrl/em'
list 0x2DE9 'cyrl/en'
list 0x2DEA 'cyrl/o'
list 0x2DEB 'cyrl/pe'
list 0x2DED 'cyrl/es'
list 0x2DEE 'cyrl/te'
list 0x2DEF 'cyrl/ha'
list 0x2DF0 'cyrl/tse'
list 0x2DF1 'cyrl/che'
list 0x2DF2 'cyrl/sha'
list 0x2DF3 'cyrl/shcha'
list 0x2DF4 'cyrl/fita'
list 0x2DF5 'cyrl/este'
list 0x2DF6 'cyrl/a'
list 0x2DF7 'cyrl/ie'
list 0x2DF8 'cyrl/djerv'
list 0x2DF9 'cyrl/uk'
list 0x2DFB 'cyrl/yu'
list 0x2DFC 'cyrl/aIotified'
list 0x2DFD 'cyrl/smallYus'
list 0x2DFE 'cyrl/bigYus'
list 0x2DFF 'cyrl/bigYusIotified'
list 0xA674 'cyrl/ye'
list 0xA675 'cyrl/i'
list 0xA67B 'cyrl/omega'
list 0xA69F 'cyrl/eIotified'
createMedievalCombs 0 CAP : list
list 0x365 'i'
list 0x36D 't'
list 0x1AC6 'numberSign'
list 0x1DD8 'dInsular'
list 0x1DD9 'eth'
list 0x1DDC 'k'
list 0x1DDD 'l'
list 0x1DE8 'b'
list 0x1DEC 'lDblTildeOver'
list 0x1DF2 'aDieresis'
list 0x1DF3 'oDieresis'
list 0x1DF4 'uDieresis'
list 0x2DE0 'cyrl/be'
list 0x2DFA 'cyrl/yat'
list 0xA676 'cyrl/yi'
list 0xA678 'cyrl/yer'
list 0xA679 'cyrl/yery'
list 0xA67A 'cyrl/yeri'
list 0x1E08F 'cyrl/Ukrainiani'
createMedievalCombs Descender XH : list
list 0x1ACC 'gInsular'
list 0x1DDA 'g'
list 0x1DD7 'cCedilla'
list 0x1DE9 'latn/beta'
list 0x1DEE 'p'
list 0x2DEC 'cyrl/er'
list 0xA677 'cyrl/u'
createMedievalCombs Descender CAP : list
list 0x1ACD 'rInsular'
list 0x1DEB 'f'
list 0x1DE5 'longs'
list 0x1DEF 'esh'
list 0xA69E 'cyrl/ef'
: where : [createMedievalCombs defaultLow defaultHigh _records] : begin
local { records relSets targetNameMap } : extendRelatedGlyphs 'medievalAbove' _records
local pendingGlyphs : records.map : [record] => record.1
local miniatureFont : Miniature pendingGlyphs
crowd -- 7
scale -- 0.4
mono -- true
sbscale -- 1
foreach {unicode glyphid} [items-of records] : if [not : query-glyph targetNameMap.(glyphid)]
create-glyph targetNameMap.(glyphid) unicode : glyph-proc
set-width 0
local derived [miniatureFont.queryByName glyphid]
local low defaultLow
local high defaultHigh
if (derived && derived.baseAnchors.above && derived.baseAnchors.below) : begin
set low derived.baseAnchors.below.y
set high derived.baseAnchors.above.y
local middle : derived.advanceWidth / 2
include derived
include : Ungizmo
include : Translate (-middle) (-low)
include : Scale 0.4
include : Translate markMiddle aboveMarkBot
include : Regizmo
local markHeight : 0.4 * (high - low) + 0 * (aboveMarkTop - aboveMarkBot)
set-mark-anchor 'above' markMiddle XH markMiddle (aboveMarkBot + markHeight)
set-base-anchor 'aboveBraceL' markMiddle (aboveMarkBot + markHeight / 2)
set-base-anchor 'aboveBraceR' markMiddle (aboveMarkBot + markHeight / 2)
link-relations relSets
do
createMedievalBelowCombs : list
list 0x0359 'asterisk/sMid'
list 0x1ABF 'w'
list 0x1AC0 'turnw'
list 0x1DCA 'r'
: where : [createMedievalBelowCombs _records] : begin
local { records relSets targetNameMap } : extendRelatedGlyphs 'medievalBelow' _records
local pendingGlyphs : records.map : [record] => record.1
local miniatureFont : Miniature pendingGlyphs
crowd -- 7
scale -- 0.4
mono -- true
sbscale -- 1
foreach {unicode glyphid} [items-of records] : if [not : query-glyph targetNameMap.(glyphid)]
create-glyph targetNameMap.(glyphid) unicode : glyph-proc
set-width 0
local middle : [miniatureFont.queryByName glyphid].advanceWidth / 2
include [miniatureFont.queryByName glyphid]
include : Ungizmo
include : Translate (-middle) (-XH)
include : Scale 0.4
include : Translate markMiddle belowMarkTop
include : Regizmo
set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkBot
set-base-anchor 'belowBraceL' markMiddle belowMarkMid
set-base-anchor 'belowBraceR' markMiddle belowMarkMid
link-relations relSets
do
createReversed : list
list 0xA7FB 'F'
list 0xA7FC 'P'
list 0xA7FD 'turnM'
list 0x1DF01 'gScript'
list 0x1DF03 'k'
list 0x1DF07 'eng'
: where : [createReversed _records] : begin
local { records relSets targetNameMap } : extendRelatedGlyphs 'reversed' _records
local pendingGlyphs : records.map : [record] => record.1
local forkedPara : para.createFork : function p : begin
set p.shape.slopeAngle (-p.shape.slopeAngle)
local miniatureFont : Fork pendingGlyphs forkedPara
foreach {unicode glyphid} [items-of records] : if [not : query-glyph targetNameMap.(glyphid)]
create-glyph targetNameMap.(glyphid) unicode : glyph-proc
# Include the glyph built with negative slope
local g1 : miniatureFont.queryByName glyphid
include g1 AS_BASE ALSO_METRICS
# Inverse
set currentGlyph.gizmo g1.gizmo
include : Ungizmo
set currentGlyph.gizmo [Transform.Id]
include : ScaleAround (currentGlyph.advanceWidth / 2) 0 (-1) 1
include GlobalTransform
link-relations relSets
glyph-block Autobuild-Transformed-Texture : begin
if (!(para.buildTextureFeature && !para.isQuasiProportional)) : return nothing
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives
glyph-block-import Recursive-Build : Fork
glyph-block-import Autobuild-Transformed-Shared : extendRelatedGlyphs link-relations wrapName
define [createTextureDerivatives gr extL extR _records] : begin
local { records relSets targetNameMap } : extendRelatedGlyphs gr.key _records
local pendingGlyphs : records.map : [record] => record.1
local forkedPara : Object.assign {.} para
if (extL + extR > 0)
: then : forkedPara.diversityM = 1 + extL + extR
: else : begin
forkedPara.diversityF = 1 + extL + extR
forkedPara.diversityI = 1 + extL + extR
forkedPara.diversityII = 1 + extL + extR
local forked : Fork pendingGlyphs forkedPara
foreach {unicode glyphid} [items-of records] : begin
if [not : query-glyph targetNameMap.(glyphid)] : begin
define glyphT : forked.queryByName glyphid
define glyphO : glyphStore.queryByName glyphid
if (glyphT && glyphO) : begin
if (glyphT.advanceWidth != glyphO.advanceWidth) : begin
gr.set glyphO targetNameMap.(glyphid)
create-glyph targetNameMap.(glyphid) unicode : glyph-proc
include glyphT AS_BASE ALSO_METRICS
set-width Width
if extL : currentGlyph.applyTransform [Translate (-extL * Width) 0] true
link-relations relSets
define ranges : list
list 0x41 0x5A
list 0x61 0x7A
list 0xC0 0xFF
list 0x100 0x2AF
list 0x370 0x3FF
list 0x400 0x4FF
list 0x500 0x52F
define [jobs base] : list
local results {}
foreach {low high} [items-of ranges] : begin
foreach lch [range low till high] : begin
local source : glyphStore.queryNameByUnicode lch
if source : results.push { null source }
return results
define EXTENSION : 1 / 12
define SHRINK : -1 / 12
createTextureDerivatives Texture.ExtL EXTENSION 0 [jobs 0xF000]
createTextureDerivatives Texture.ExtR 0 EXTENSION [jobs 0xF100]
createTextureDerivatives Texture.ExtLR EXTENSION EXTENSION [jobs 0xF200]
createTextureDerivatives Texture.ShrL SHRINK 0 [jobs 0xF300]
createTextureDerivatives Texture.ShrR 0 SHRINK [jobs 0xF400]
createTextureDerivatives Texture.ShrLR SHRINK SHRINK [jobs 0xF500]
glyph-block Autobuild-Transformed-Mathematical : begin
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives
glyph-block-import Recursive-Build : Fork
glyph-block-import Autobuild-Transformed-Shared : extendRelatedGlyphs link-relations wrapName
define [createMathDerivedSeriesImpl groupName tfm _records] : begin
local { records relSets targetNameMap } : extendRelatedGlyphs groupName _records
local pendingGlyphs : records.map : [record] => record.1
local forkedPara : para.createFork tfm
local forked : Fork pendingGlyphs forkedPara
foreach {unicode glyphid} [items-of records] : if [not : query-glyph targetNameMap.(glyphid)]
create-glyph targetNameMap.(glyphid) unicode : glyph-proc
define glyphT : forked.queryByName glyphid
if [not glyphT] : console.log glyphid
include glyphT AS_BASE ALSO_METRICS
set currentGlyph.gizmo glyphT.gizmo
link-relations relSets
define [boldGrade g] : begin
local pGrade : (900 - g) / 100
return : 900 - 100 * (2 / 25) * pGrade * pGrade
define [tfBold a] : begin [set a.shape.weight : boldGrade a.shape.weight]
define [tfItalic a] : begin
set a.shape.slope 'italic'
set a.shape.slopeAngle : mix (para.slopeAngle || 0) 15 (94 / 150)
define [tfSans a] : begin [set a.shape.serifs 'sans']
define [tfBoldItalic a] : begin [tfBold a] [tfItalic a]
define [tfSansBold a] : begin [tfSans a] [tfBold a]
define [tfSansItalic a] : begin [tfSans a] [tfItalic a]
define [tfSansBoldItalic a] : begin [tfSans a] [tfBold a] [tfItalic a]
define [tfTypeWriter a] : begin
set a.shape.spacing 'fixed'
if (a.derivingVariants && a.derivingVariants.mathtt)
set a.variants a.derivingVariants.mathtt
define Digits : Array.from '0123456789'
define UpperLatin : Array.from 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
define LowerLatin : Array.from 'abcdefghijklmnopqrstuvwxyz'
define LowerLatin2 : Array.from 'abcdefghijklmnopqrstuvwxyzħıȷ'
define UpperGreek : Array.from 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡϴΣΤΥΦΧΨΩ∇'
define LowerGreek : Array.from 'αβγδεζηθικλμνξοπρςστυφχψω∂ϵϑϰϕϱϖ'
define Greek2 : Array.from 'Ϝϝ'
define ObliqueBlackboardBolds : Array.from '𝔻𝕕𝕖𝕚𝕛'
define [CreateMathDerivatives groupName tfm gr base letters overrides] : begin
local jobs {}
local overrideMap : new Map (overrides || {})
foreach j [range 0 letters.length] : begin
local letter letters.(j)
local source : glyphStore.queryNameByUnicode : letter.codePointAt 0
if (gr && [gr.get : query-glyph source]) : set source : gr.get : query-glyph source
local dst : base + j
if [overrideMap.has letter] : set dst [overrideMap.get letter]
if source : jobs.push { dst source }
createMathDerivedSeriesImpl groupName tfm jobs
define [CreateMathAliasableImpl groupName altGroupName tfm gr base letters overrides] : begin
local overrideMap : new Map (overrides || {})
foreach j [range 0 letters.length] : begin
local letter letters.(j)
local source : glyphStore.queryNameByUnicode : letter.codePointAt 0
if (source && altGroupName) : set source : wrapName altGroupName source
local uDst : base + j
if [overrideMap.has letter] : set uDst [overrideMap.get letter]
if source : alias [wrapName groupName source] uDst source
define [CreateMathAliasable cond groupName altGroupName tfm gr base letters overrides] : begin
if cond
CreateMathDerivatives groupName tfm gr base letters overrides
CreateMathAliasableImpl groupName altGroupName tfm gr base letters overrides
# Math bold
CreateMathDerivatives 'mathbf' tfBold null 0x1D400 UpperLatin
CreateMathDerivatives 'mathbf' tfBold null 0x1D41A LowerLatin
CreateMathDerivatives 'mathbf' tfBold null 0x1D6A8 UpperGreek
CreateMathDerivatives 'mathbf' tfBold null 0x1D6C2 LowerGreek
CreateMathDerivatives 'mathbf' tfBold null 0x1D7CE Digits
CreateMathDerivatives 'mathbf' tfBold null 0x1D7CA Greek2
# Math Italic
CreateMathDerivatives 'mathit' tfItalic null 0x1D434 UpperLatin
CreateMathDerivatives 'mathit' tfItalic null 0x1D44E LowerLatin2 : list
list 'h' 0x210E
list 'ħ' 0x210F
list 'ı' 0x1D6A4
list 'ȷ' 0x1D6A5
CreateMathDerivatives 'mathit' tfItalic null 0x1D6E2 UpperGreek
CreateMathDerivatives 'mathit' tfItalic null 0x1D6FC LowerGreek
# Math Bold Italic
CreateMathDerivatives 'mathbi' tfBoldItalic null 0x1D468 UpperLatin
CreateMathDerivatives 'mathbi' tfBoldItalic null 0x1D482 LowerLatin
CreateMathDerivatives 'mathbi' tfBoldItalic null 0x1D71C UpperGreek
CreateMathDerivatives 'mathbi' tfBoldItalic null 0x1D736 LowerGreek
# Math Sans-serif
CreateMathDerivatives 'mathss' tfSans MathSansSerif 0x1D5A0 UpperLatin
CreateMathDerivatives 'mathss' tfSans MathSansSerif 0x1D5BA LowerLatin
CreateMathDerivatives 'mathss' tfSans MathSansSerif 0x1D7E2 Digits
CreateMathDerivatives 'mathsi' tfSansItalic MathSansSerif 0x1D608 UpperLatin
CreateMathDerivatives 'mathsi' tfSansItalic MathSansSerif 0x1D622 LowerLatin
CreateMathDerivatives 'mathsb' tfSansBold MathSansSerif 0x1D5D4 UpperLatin
CreateMathDerivatives 'mathsb' tfSansBold MathSansSerif 0x1D5EE LowerLatin
CreateMathDerivatives 'mathsb' tfSansBold MathSansSerif 0x1D756 UpperGreek
CreateMathDerivatives 'mathsb' tfSansBold MathSansSerif 0x1D770 LowerGreek
CreateMathDerivatives 'mathsb' tfSansBold MathSansSerif 0x1D7EC Digits
CreateMathDerivatives 'mathsz' tfSansBoldItalic MathSansSerif 0x1D63C UpperLatin
CreateMathDerivatives 'mathsz' tfSansBoldItalic MathSansSerif 0x1D656 LowerLatin
CreateMathDerivatives 'mathsz' tfSansBoldItalic MathSansSerif 0x1D790 UpperGreek
CreateMathDerivatives 'mathsz' tfSansBoldItalic MathSansSerif 0x1D7AA LowerGreek
# Math Typewriter
local doTypewriter para.isQuasiProportional
CreateMathAliasable doTypewriter 'mathtt' null tfTypeWriter null 0x1D670 UpperLatin
CreateMathAliasable doTypewriter 'mathtt' null tfTypeWriter null 0x1D68A LowerLatin
CreateMathAliasable doTypewriter 'mathtt' null tfTypeWriter null 0x1D7F6 Digits
# Italic blackboard bold
CreateMathDerivatives 'mathit' tfItalic null 0x2145 ObliqueBlackboardBolds
glyph-block Autobuild-Rhotic : begin
glyph-block-import Mark-Shared-Metrics : markFine markstroke
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives
glyph-block-import Recursive-Build : Widen
glyph-block-import Letter-Latin-Rhotic : ErTail
glyph-block-import Autobuild-Transformed-Shared : extendRelatedGlyphs link-relations
glyph-block-import Letter-Shared-Shapes : RetroflexHook
define [ErTailAttachment y] : ErTail (Width * 0.85 - SB - [HSwToV : 1.25 * markFine]) y (XH * 0.2)
define [RhoticTailAttachment] : RetroflexHook.r
x -- [mix RightSB Width 0.5]
y -- 0
yAttach -- (XH / 2 - HalfStroke)
xLink -- (Width * 0.85 - SB - [HSwToV : 1.25 * markFine])
refSw -- [AdviceStroke 4]
define [createRhotics groupName tail _records] : begin
local {records relSets targetNameMap} : extendRelatedGlyphs "rhotic_\(groupName)" _records
local pendingGlyphs : records.map : [record] => record.1
local thinFont : Widen pendingGlyphs 0.85 1
foreach {unicode glyphid pri} [items-of records]
if [not : query-glyph targetNameMap.(glyphid)]
create-glyph (targetNameMap.(glyphid)) unicode : glyph-proc
if [not : thinFont.queryByName glyphid] : begin
throw : new Error "Cannot find glyph \(glyphid)"
include : MarkSet.e
include : thinFont.queryByName glyphid
include tail
link-relations relSets
return { targetNameMap records }
createRhotics 'er' [ErTailAttachment (XH / 2)]
list { 0x25A 'schwa' }
createRhotics 'rhotic' [RhoticTailAttachment]
list { 0x1D95 'schwa' }
createRhotics 'revLatinEpsilonEr' [ErTailAttachment (XH * [mix 0.65 1 0.5])]
list { 0x25D 'latn/epsilonRev' }
glyph-block Autobuild-Rotated : begin
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives
glyph-block-import Recursive-Build : Miniature
glyph-block-import Symbol-Math-APL : LinkAplFormForNwidWwid
for-width-kinds WideWidth1 : do
local s : (RightSB - SB - O * 4 + (MosaicWidth - Width) * 0.5) / CAP
local df : Miniature {'eight.lnum.crossing' 'rotatedPropto' 'revS.serifless'}
crowd -- (4 / [Math.sqrt MosaicWidthScalar])
scale -- s
forceUpright -- true
define [InftyLikeShape gn u gns] : begin
create-glyph [MangleName gn] [MangleUnicode u] : glyph-proc
set-width MosaicWidth
if [not : df.queryByName gns] : throw : new Error "Cannot find glyph \(gns)"
include : df.queryByName gns
include : Translate (-(Width / 2)) (-CAP / 2)
include : Rotate (Math.PI / 2)
include : Scale s
include : Translate (MosaicWidth / 2) SymbolMid
include : Italify
InftyLikeShape 'propto' 0x221D 'rotatedPropto'
InftyLikeShape 'infty' 0x221E 'eight.lnum.crossing'
InftyLikeShape 'invLazyS' 0x223E 'revS.serifless'
# Link APLF for BQN
LinkAplFormForNwidWwid 'infty'
LinkAplFormForNwidWwid 'invLazyS'