Iosevka/font.patel
Belleve Invis dbbd3c785a added h.
2015-07-20 06:28:51 +08:00

1257 lines
No EOL
38 KiB
Text

define font [require './empty.json']
define glyphList font.glyf
define glyphs (.'.notdef' glyphList.0)
define Glyph [require './support/glyph'].Glyph
define Stroke [require './support/stroke'].Stroke
define para_regular (
.width 500
.stroke 80
.dotsize 125
.sb 50
.cap 771
.xheight 560
.hook 145
.ahook 135
.shook 100
.smooth 192
.smallsmooth 242
.smoothadjust 100
.o [-8]
.oxhook 0
.descender [-178]
.kappa 0.515
.italicangle 0
.barpos 0.44
.gbarpos 0.37
.longserif 175
.accent 175
)
define para_bold : Object.create para_regular
para_bold.stroke = 120
para_bold.dotsize = 150
para_bold.barpos = 0.42
para_bold.hook = 150
para_bold.ahook = 100
para_bold.oxhook = 0
para_bold.kappa_hook = 0.7
para_bold.kappa_ahook = 0.60
define para_italic : Object.create para_regular
para_italic.italicangle = 10
define para_bolditalic : Object.create para_bold
para_bolditalic.italicangle = 10
para = para_italic
define variantSelector (
.zero 'slashed'
)
define globalTransform (
.xx 1
.yx [Math.tan [para.italicangle / 180 * Math.PI]]
.xy 0
.yy 1
.x 0
.y 0
)
define UPWARD (.x [-1] .y 0)
define DOWNWARD (.x 1 .y 0)
define RIGHTWARD (.x globalTransform.yx .y 1)
define LEFTWARD (.x [- globalTransform.yx] .y [-1])
# metrics
define DESCENDER para.descender
define WIDTH para.width
define CAP para.cap
define XH para.xheight
define O para.o
define OXHOOK para.oxhook
define SB para.sb
define HOOK para.hook
define AHOOK para.ahook
define SHOOK para.shook
define SMOOTH para.smooth
define SMALLSMOOTH para.smallsmooth
define STROKE para.stroke
define DOTSIZE para.dotsize
define BARPOS para.barpos
define GBARPOS para.gbarpos
define LONGSERIF para.longserif
define ACCENT para.accent
# derived metrics
define XO : XH - O
define CAPO : CAP - O
define HALFSTROKE : STROKE / 2
define RIGHTSB : WIDTH - SB
define MIDDLE : WIDTH / 2
define CAPMIDDLE : CAP / 2
define CAP_SMOOTH : CAP - SMOOTH
define DOTRADIUS : para.dotsize / 2
define SMOOTHA : SMOOTH - globalTransform.yx * para.smoothadjust
define SMOOTHB : SMOOTH + globalTransform.yx * para.smoothadjust
define SMALLSMOOTHA : SMALLSMOOTH - globalTransform.yx * para.smoothadjust
define SMALLSMOOTHB : SMALLSMOOTH + globalTransform.yx * para.smoothadjust
define ITALICCORS : STROKE * globalTransform.yx
# style parameters
define KAPPA para.kappa
define COKAPPA : 1 - KAPPA
define BKAPPA : KAPPA + 0.1
define COBKAPPA : 1 - BKAPPA
define KAPPA_HOOK : para.kappa_hook || 0.7
define KAPPA_AHOOK : para.kappa_ahook || KAPPA_HOOK
define TAILADJX : WIDTH * 0.2
define TAILADJY : XH * 0.5
Stroke.bindParameters para
### Useful shapes
define [Ring u d l r] : begin {
local my [[u + d] / 2]
local mx [[l + r] / 2]
local s : new Stroke
:.set-transform globalTransform
:.start-from mx d
:.cubic-to [mx + [l - mx] * BKAPPA] d l [my + [d - my] * BKAPPA] l my
:.cubic-to l [my + [u - my] * BKAPPA] [mx + [l - mx] * BKAPPA] u mx u
:.cubic-to [mx + [r - mx] * BKAPPA] u r [my + [u - my] * BKAPPA] r my
:.cubic-to r [my + [d - my] * BKAPPA] [mx + [r - mx] * BKAPPA] d mx d
return s.points
}
define [ORing u d l r smooth] : begin {
local myu [u - smooth]
local myd [d + smooth]
local mx [[l + r] / 2]
local s : new Stroke
:.set-transform globalTransform
:.start-from mx d
:.cubic-to [mx + [l - mx] * BKAPPA] d l [myd + [d - myd] * BKAPPA] l myd
:.line-to l myu
:.cubic-to l [myu + [u - myu] * BKAPPA] [mx + [l - mx] * BKAPPA] u mx u
:.cubic-to [mx + [r - mx] * BKAPPA] u r [myu + [u - myu] * BKAPPA] r myu
:.line-to r myd
:.cubic-to r [myd + [d - myd] * BKAPPA] [mx + [r - mx] * BKAPPA] d mx d
return s.points
}
define [leftwardTopSerif x y length] : begin {
return : new Stroke
:.set-transform globalTransform
:.start-from [x + HALFSTROKE] y
:.pen-direction LEFTWARD
:.set-width STROKE 0
:.line-to [x - length - globalTransform.yx * STROKE] y
:.form-stroke
}
define [leftwardBottomSerif x y length] : begin {
return : new Stroke
:.set-transform globalTransform
:.start-from [x + HALFSTROKE] y
:.pen-direction LEFTWARD
:.set-width 0 STROKE
:.line-to [x - length + globalTransform.yx * STROKE] y
:.form-stroke
}
define [rightwardTopSerif x y length] : begin {
return : new Stroke
:.set-transform globalTransform
:.start-from [x - HALFSTROKE] y
:.pen-direction RIGHTWARD
:.set-width 0 STROKE
:.line-to [x + length - globalTransform.yx * STROKE] y
:.form-stroke
}
define [rightwardBottomSerif x y length] : begin {
return : new Stroke
:.set-transform globalTransform
:.start-from [x - HALFSTROKE] y
:.pen-direction RIGHTWARD
:.set-width STROKE 0
:.line-to [x + length + globalTransform.yx * STROKE] y
:.form-stroke
}
define-macro glyph-construction : syntax-rules {
@`[glyph-construction @::steps] ('.syntactic-closure' @`[lambda [] [begin {
local set-width : this.set-width.bind this
local assign-unicode : this.assign-unicode.bind this
local start-from : this.start-from.bind this
local line-to : this.line-to.bind this
local curve-to : this.curve-to.bind this
local cubic-to : this.cubic-to.bind this
local put-shapes : this.put-shapes.bind this
local reverse-last : this.reverse-last.bind this
local include-glyph : this.include-glyph.bind this
local create-stroke : this.create-stroke.bind this
this.gizmo = globalTransform
this.set-width WIDTH
begin @::[steps.map formOf]
return nothing
}]] env)
}
define [create-glyph name actions] : begin {
define glyphObject [new Glyph name]
glyphList.push glyphObject
glyphs`name = glyphObject
actions.call glyphObject
return glyphObject
}
###### SYMBOLS
create-glyph 'space' : glyph-construction {
set-width WIDTH
assign-unicode ' '
}
create-glyph 'bar' : glyph-construction {
set-width WIDTH
assign-unicode '|'
put-shapes : create-stroke :.start-from MIDDLE [DESCENDER / 2]
:.set-width [STROKE / 2] [STROKE / 2]
:.line-to MIDDLE [CAP - DESCENDER / 2]
:.form-stroke
}
###### UPPER CASE
### A X Y : Capital letters with curly stands
create-glyph 'A' : glyph-construction {
set-width WIDTH
assign-unicode 'A'
local TURN [XH * 0.1]
local leftbar : create-stroke
leftbar.start-from SB 0
:.pen-direction UPWARD
:.set-width 0 STROKE
:.line-to SB TURN
:.pen-direction UPWARD
:.curve-to SB [TURN + 0.27 * [CAP - TURN]] [MIDDLE - STROKE / 2] CAP
:.set-width 0 [STROKE * 0.8]
local rightbar : create-stroke
rightbar.start-from RIGHTSB 0
:.pen-direction UPWARD
:.set-width STROKE 0
:.line-to RIGHTSB TURN
:.pen-direction UPWARD
:.curve-to RIGHTSB [TURN + 0.27 * [CAP - TURN]] [MIDDLE + STROKE / 2] CAP
:.set-width [STROKE * 0.8] 0
local hbar : create-stroke
:.start-from [SB + STROKE] [XH / 2]
:.pen-direction RIGHTWARD
:.set-width 0 STROKE
:.line-to [RIGHTSB - STROKE] [XH / 2]
:.pen-direction RIGHTWARD
put-shapes : leftbar.form-stroke
put-shapes : hbar.form-stroke
put-shapes : rightbar.form-stroke
#top cap
start-from [MIDDLE - STROKE / 2] CAP
line-to [MIDDLE + STROKE / 2] CAP
line-to MIDDLE [CAP - STROKE]
}
create-glyph 'X' : glyph-construction {
set-width WIDTH
assign-unicode 'X'
local TURN [XH * 0.05]
local straight 0.6
local strench 0.125
local barone : create-stroke
:.start-from [SB + HALFSTROKE] 0
:.set-width HALFSTROKE HALFSTROKE
:.pen-direction UPWARD
:.line-to [SB + HALFSTROKE] TURN
:.curve-to [SB + HALFSTROKE] [TURN + strench * [CAP - TURN]] [MIDDLE + straight * [SB + HALFSTROKE - MIDDLE]] [CAPMIDDLE + straight * [TURN + strench * [CAP - TURN] - CAPMIDDLE]]
:.line-to [MIDDLE + straight * [RIGHTSB - HALFSTROKE - MIDDLE]] [CAPMIDDLE + straight * [CAP - TURN - strench * [CAP - TURN] - CAPMIDDLE]]
:.curve-to [RIGHTSB - HALFSTROKE] [CAP - TURN - strench * [CAP - TURN]] [RIGHTSB - HALFSTROKE] [CAP - TURN]
:.line-to [RIGHTSB - HALFSTROKE] CAP
:.pen-direction UPWARD
local bartwo : create-stroke
:.start-from [RIGHTSB - HALFSTROKE] 0
:.set-width HALFSTROKE HALFSTROKE
:.pen-direction UPWARD
:.line-to [RIGHTSB - HALFSTROKE] TURN
:.curve-to [RIGHTSB - HALFSTROKE] [TURN + strench * [CAP - TURN]] [MIDDLE + straight * [RIGHTSB - HALFSTROKE - MIDDLE]] [CAPMIDDLE + straight * [TURN + strench * [CAP - TURN] - CAPMIDDLE]]
:.line-to [MIDDLE + straight * [SB + HALFSTROKE - MIDDLE]] [CAPMIDDLE + straight * [CAP - TURN - strench * [CAP - TURN] - CAPMIDDLE]]
:.curve-to [SB + HALFSTROKE] [CAP - TURN - strench * [CAP - TURN]] [SB + HALFSTROKE] [CAP - TURN]
:.line-to [SB + HALFSTROKE] CAP
:.pen-direction UPWARD
put-shapes : barone.form-stroke
put-shapes : bartwo.form-stroke
}
create-glyph 'Y' : glyph-construction {
set-width WIDTH
assign-unicode 'Y'
local TURN [XH * 0.05]
local straight 0.6
local strench 0.15
local cross [CAP * 0.4]
local barone : create-stroke
:.start-from MIDDLE cross
:.set-width HALFSTROKE HALFSTROKE
:.line-to [MIDDLE + straight * [RIGHTSB - HALFSTROKE - MIDDLE]] [cross + straight * [CAP - TURN - strench * [CAP - TURN] - cross]]
:.curve-to [RIGHTSB - HALFSTROKE] [CAP - TURN - strench * [CAP - TURN]] [RIGHTSB - HALFSTROKE] [CAP - TURN]
:.line-to [RIGHTSB - HALFSTROKE] CAP
:.pen-direction UPWARD
local bartwo : create-stroke
:.start-from MIDDLE cross
:.set-width HALFSTROKE HALFSTROKE
:.line-to [MIDDLE + straight * [SB + HALFSTROKE - MIDDLE]] [cross + straight * [CAP - TURN - strench * [CAP - TURN] - cross]]
:.curve-to [SB + HALFSTROKE] [CAP - TURN - strench * [CAP - TURN]] [SB + HALFSTROKE] [CAP - TURN]
:.line-to [SB + HALFSTROKE] CAP
:.pen-direction UPWARD
put-shapes : barone.form-stroke
put-shapes : bartwo.form-stroke
put-shapes : create-stroke
:.start-from MIDDLE 0
:.set-width HALFSTROKE HALFSTROKE
:.pen-direction UPWARD
:.line-to MIDDLE [cross + HALFSTROKE]
:.pen-direction UPWARD
:.form-stroke
}
### B D P R
create-glyph 'B' : glyph-construction {
set-width WIDTH
assign-unicode 'B'
local bowl 451
local tkappa [COKAPPA - 0.22]
local bkappa [COKAPPA - 0.2]
local turntop : [CAP + [bowl - STROKE]] / 2
local turnbottom : bowl / 2
local topbowl : create-stroke
topbowl.start-from SB CAP
:.pen-direction RIGHTWARD
:.line-to [RIGHTSB - SB * 0.5 - turnbottom] CAP
:.cubic-to [RIGHTSB - SB * 0.5 - tkappa * turnbottom] CAP [RIGHTSB - SB * 0.5] [turntop + [CAP - turntop] * KAPPA] [RIGHTSB - SB * 0.5] turntop
:.cubic-to [RIGHTSB - SB * 0.5] [turntop + KAPPA * [bowl - STROKE - turntop]] [RIGHTSB - SB * 0.5 - tkappa * turnbottom] [bowl - STROKE] [RIGHTSB - SB * 0.5 - turnbottom] [bowl - STROKE]
:.line-to SB [bowl - STROKE]
:.pen-direction LEFTWARD
local bottombowl : create-stroke
bottombowl.start-from SB 0
:.pen-direction RIGHTWARD
:.line-to [RIGHTSB - turnbottom] 0
:.cubic-to [RIGHTSB - bkappa * turnbottom] 0 RIGHTSB [turnbottom * KAPPA] RIGHTSB turnbottom
:.cubic-to RIGHTSB [turnbottom + KAPPA * [bowl - turnbottom]] [RIGHTSB - bkappa * turnbottom] bowl [RIGHTSB - turnbottom] bowl
:.line-to SB bowl
:.pen-direction LEFTWARD
local leftbar : create-stroke
:.start-from SB 0
:.pen-direction UPWARD
:.line-to SB CAP
:.pen-direction UPWARD
put-shapes : topbowl.form-stroke 0 STROKE
put-shapes : bottombowl.form-stroke STROKE 0
put-shapes : leftbar.form-stroke 0 STROKE
}
create-glyph 'D' : glyph-construction {
set-width WIDTH
assign-unicode 'D'
local dsmooth [SMOOTH * 1.55]
local bsmooth [SMOOTH * 1.3]
local bkappa [COKAPPA - 0.2]
local leftbar : create-stroke
:.start-from SB 0
:.pen-direction UPWARD
:.line-to SB CAP
:.pen-direction UPWARD
local bowl : create-stroke
bowl.start-from SB 0
:.pen-direction RIGHTWARD
:.line-to [RIGHTSB - bsmooth] 0
:.cubic-to [RIGHTSB - bkappa * bsmooth] 0 RIGHTSB [COBKAPPA * dsmooth] RIGHTSB dsmooth
:.line-to RIGHTSB [CAP - dsmooth]
:.cubic-to RIGHTSB [CAP - COBKAPPA * dsmooth] [RIGHTSB - bkappa * bsmooth] CAP [RIGHTSB - bsmooth] CAP
:.line-to SB CAP
:.pen-direction LEFTWARD
put-shapes : bowl.form-stroke STROKE 0
put-shapes : leftbar.form-stroke 0 STROKE
}
create-glyph 'P' : glyph-construction {
set-width WIDTH
assign-unicode 'P'
local bowl CAPMIDDLE
local bkappa [COKAPPA - 0.2]
local turntop : [CAP + [bowl - HALFSTROKE]] / 2
local turnbottom : bowl / 2
local topbowl : create-stroke
:.start-from [SB * 1.25] CAP
:.pen-direction RIGHTWARD
:.line-to [RIGHTSB - turnbottom] CAP
:.arc-hv-to [RIGHTSB - O] turntop
:.arc-vh-to [RIGHTSB - turnbottom] [bowl - HALFSTROKE]
:.line-to [SB * 1.25] [bowl - HALFSTROKE]
:.pen-direction LEFTWARD
local leftbar : create-stroke
:.start-from [SB * 1.25] 0 :.pen-direction UPWARD
:.line-to [SB * 1.25] CAP :.pen-direction UPWARD
put-shapes : topbowl.form-stroke 0 STROKE
put-shapes : leftbar.form-stroke 0 STROKE
}
create-glyph 'R' : glyph-construction {
set-width WIDTH
assign-unicode 'R'
include-glyph glyphs.P
local TURN [XH * 0.1]
local right [RIGHTSB - O]
put-shapes : create-stroke
:.start-from [right - HALFSTROKE] 0
:.pen-direction UPWARD
:.set-width HALFSTROKE HALFSTROKE
:.curve-to [right - HALFSTROKE] [TURN + 0.2 * [XH - TURN]] MIDDLE CAPMIDDLE
:.form-stroke
}
### C G O zero Q U
create-glyph 'C' : glyph-construction {
set-width WIDTH
assign-unicode 'C'
local outline : create-stroke
outline.start-from [RIGHTSB - OXHOOK] [CAP - HOOK]
:.curve-to [MIDDLE + KAPPA_HOOK * [MIDDLE - para.sb]] CAPO MIDDLE CAPO
:.pen-direction LEFTWARD
:.arc-hv-to SB [CAP - SMOOTHA]
:.line-to SB SMOOTHB
:.arc-vh-to MIDDLE O
:.pen-direction RIGHTWARD
:.curve-to [MIDDLE + ITALICCORS + KAPPA_HOOK * [MIDDLE - SB]] O [RIGHTSB - OXHOOK] HOOK
put-shapes : outline.form-stroke STROKE 0
}
create-glyph 'G' : glyph-construction {
set-width WIDTH
assign-unicode 'G'
local outline : create-stroke
outline.start-from [RIGHTSB - OXHOOK] [CAP - HOOK]
:.curve-to [MIDDLE + KAPPA_HOOK * [MIDDLE - para.sb]] CAPO MIDDLE CAPO
:.pen-direction LEFTWARD
:.arc-hv-to SB [CAP - SMOOTHA]
:.line-to SB SMOOTHB
:.arc-vh-to MIDDLE O
:.pen-direction RIGHTWARD
:.arc-hv-to RIGHTSB SMOOTHA
:.line-to RIGHTSB [CAP / 2 + STROKE / 2]
:.pen-direction UPWARD
put-shapes : outline.form-stroke STROKE 0
local bar : create-stroke
:.start-from MIDDLE [CAP / 2 + STROKE / 2]
:.line-to RIGHTSB [CAP / 2 + STROKE / 2]
:.pen-direction RIGHTWARD
put-shapes : bar.form-stroke 0 STROKE
}
create-glyph 'O' : glyph-construction {
set-width WIDTH
assign-unicode 'O'
local outline : create-stroke
outline.start-from MIDDLE CAPO
:.pen-direction LEFTWARD
:.arc-hv-to SB [CAP - SMOOTHA]
:.line-to SB SMOOTHB
:.arc-vh-to MIDDLE O
:.pen-direction RIGHTWARD
:.arc-hv-to RIGHTSB SMOOTHA
:.line-to RIGHTSB [CAP - SMOOTHB]
:.arc-vh-to MIDDLE CAPO
:.pen-direction LEFTWARD
put-shapes : outline.form-stroke STROKE 0
}
create-glyph 'zero.slashed' : glyph-construction {
set-width WIDTH
put-shapes glyphs.O.contours
local bar : create-stroke :.start-from [SB + STROKE / 2] [CAP * [1 - 0.65]] :.line-to [RIGHTSB - STROKE / 2] [CAP * 0.65]
put-shapes : bar.form-stroke [STROKE / 2] [STROKE / 2]
}
create-glyph 'zero.unslashed' : glyph-construction {
include-glyph glyphs.O
}
create-glyph 'zero.dotted' : glyph-construction {
include-glyph glyphs.O
put-shapes : list {
Ring [CAPMIDDLE + DOTRADIUS] [CAPMIDDLE - DOTRADIUS] [MIDDLE + DOTRADIUS] [MIDDLE - DOTRADIUS]
}
}
create-glyph 'zero' : glyph-construction {
set-width WIDTH
assign-unicode '0'
include-glyph glyphs.[match variantSelector.zero {
'slashed' 'zero.slashed'
'dotted' 'zero.dotted'
'unslahsed' 'zero.unslashed'
otherwise 'zero.slashed'
}]
}
create-glyph 'Q' : glyph-construction {
set-width WIDTH
assign-unicode 'Q'
put-shapes glyphs.O.contours
start-from MIDDLE 0
line-to [MIDDLE + STROKE / 2] [-CAP * 0.2]
line-to [MIDDLE + STROKE / 2 + STROKE] [-CAP * 0.2]
line-to [MIDDLE + STROKE] 0
line-to [MIDDLE + STROKE * [1 - 0.5 / 3]] [STROKE * 0.5]
reverse-last
}
create-glyph 'U' : glyph-construction {
set-width WIDTH
assign-unicode 'U'
local outline : create-stroke
outline.start-from SB CAP
:.pen-direction DOWNWARD
:.line-to SB SMOOTHB
:.arc-vh-to MIDDLE O
:.pen-direction RIGHTWARD
:.arc-hv-to RIGHTSB SMOOTHA
:.line-to RIGHTSB CAP
:.pen-direction UPWARD
put-shapes : outline.form-stroke STROKE 0
}
### F E H L I
create-glyph 'F' : glyph-construction {
set-width WIDTH
assign-unicode 'F'
put-shapes : create-stroke :.start-from [SB * 1.5] 0 :.pen-direction UPWARD :.set-width 0 STROKE
:.line-to [SB * 1.5] CAP :.pen-direction UPWARD :.form-stroke
put-shapes : create-stroke :.start-from [SB * 1.5] CAP :.set-width 0 STROKE :.pen-direction RIGHTWARD
:.line-to RIGHTSB CAP :.pen-direction RIGHTWARD :.form-stroke
put-shapes : create-stroke :.start-from [SB * 1.5] CAPMIDDLE :.set-width HALFSTROKE HALFSTROKE :.pen-direction RIGHTWARD
:.line-to [RIGHTSB - HALFSTROKE] CAPMIDDLE :.pen-direction RIGHTWARD :.form-stroke
}
create-glyph 'E' : glyph-construction {
set-width WIDTH
assign-unicode 'E'
include-glyph glyphs.F
put-shapes : create-stroke :.start-from [SB * 1.5] 0 :.set-width STROKE 0 :.pen-direction RIGHTWARD
:.line-to RIGHTSB 0 :.pen-direction RIGHTWARD :.form-stroke
}
create-glyph 'H' : glyph-construction {
set-width WIDTH
assign-unicode 'H'
put-shapes : create-stroke :.start-from SB 0 :.pen-direction UPWARD :.set-width 0 STROKE
:.line-to SB CAP :.pen-direction UPWARD :.form-stroke
put-shapes : create-stroke :.start-from RIGHTSB 0 :.pen-direction UPWARD :.set-width STROKE 0
:.line-to RIGHTSB CAP :.pen-direction UPWARD :.form-stroke
put-shapes : create-stroke :.start-from SB [CAP / 2] :.set-width HALFSTROKE HALFSTROKE :.pen-direction RIGHTWARD
:.line-to RIGHTSB [CAP / 2] :.pen-direction RIGHTWARD :.form-stroke
}
create-glyph 'L' : glyph-construction {
set-width WIDTH
assign-unicode 'L'
put-shapes : create-stroke
:.start-from [SB * 1.5] CAP
:.set-width STROKE 0
:.pen-direction DOWNWARD
:.line-to [SB * 1.5] 0
:.pen-direction DOWNWARD
:.form-stroke
put-shapes : create-stroke
:.start-from [SB * 1.5] 0
:.set-width STROKE 0
:.pen-direction RIGHTWARD
:.line-to RIGHTSB 0
:.pen-direction RIGHTWARD
:.form-stroke
}
create-glyph 'dotlessI.straight' : glyph-construction {
put-shapes : create-stroke
:.start-from MIDDLE 0
:.pen-direction UPWARD
:.set-width HALFSTROKE HALFSTROKE
:.line-to MIDDLE CAP
:.pen-direction UPWARD
:.form-stroke
}
create-glyph 'dotlessI.symmetric' : glyph-construction {
include-glyph glyphs.'dotlessI.straight'
# Top serif
put-shapes : create-stroke
:.start-from [MIDDLE - WIDTH * 0.26 - STROKE * globalTransform.yx] CAP
:.set-width 0 STROKE
:.line-to [MIDDLE + WIDTH * 0.26 - STROKE * globalTransform.yx] CAP
:.form-stroke
# Bottom serif
put-shapes : create-stroke
:.start-from [MIDDLE - WIDTH * 0.26 + STROKE * globalTransform.yx] 0
:.set-width STROKE 0
:.line-to [MIDDLE + WIDTH * 0.26 + STROKE * globalTransform.yx] 0
:.form-stroke
}
create-glyph 'I' : glyph-construction {
set-width WIDTH
assign-unicode 'I'
include-glyph glyphs.'dotlessI.symmetric'
}
### J
create-glyph 'J.straight' : glyph-construction {
set-width WIDTH
local slope [STROKE * 0.00092]
local expand 0.35
local coexpand [[1 - expand] / 2]
local kappa KAPPA_HOOK
local smooth : HOOK + 0.75 * STROKE
put-shapes : create-stroke
:.start-from RIGHTSB CAP :.set-width 0 STROKE :.pen-direction DOWNWARD
:.line-to RIGHTSB smooth
:.arc-vh-to [MIDDLE - SB * 0.25] O :.pen-direction LEFTWARD
:.curve-to [MIDDLE - kappa * [MIDDLE - SB] - SB * 0.5] O [0.5 * SB + OXHOOK] HOOK
:.form-stroke
}
create-glyph 'J.serifed' : glyph-construction {
set-width WIDTH; assign-unicode 'J'
include-glyph glyphs.'J.straight'
put-shapes : leftwardTopSerif [RIGHTSB - HALFSTROKE] CAP LONGSERIF
}
### M N
create-glyph 'N' : glyph-construction {
set-width WIDTH
assign-unicode 'N'
local topstroke : Math.min STROKE [[WIDTH - SB * 2] * 0.24]
local halftopstroke : topstroke / 2
put-shapes : create-stroke
:.start-from SB 0 :.pen-direction UPWARD :.set-width 0 STROKE
:.line-to SB [CAP * 0.4] :.pen-direction UPWARD
:.line-to SB CAP :.pen-direction UPWARD :.set-width 0 topstroke
:.form-stroke
put-shapes : create-stroke
:.start-from RIGHTSB 0 :.pen-direction UPWARD :.set-width topstroke 0
:.line-to RIGHTSB [CAP * 0.6] :.pen-direction UPWARD :.set-width STROKE 0
:.line-to RIGHTSB CAP :.pen-direction UPWARD
:.form-stroke
put-shapes : create-stroke
:.start-from [SB + halftopstroke] CAP :.pen-direction DOWNWARD :.set-width topstroke 0
:.line-to [RIGHTSB - topstroke - halftopstroke] 0 :.pen-direction DOWNWARD
:.form-stroke
}
create-glyph 'M' : glyph-construction {
set-width WIDTH
assign-unicode 'M'
local topstroke : Math.min STROKE [[WIDTH - SB * 2] * 0.175]
local halftopstroke : topstroke / 2
put-shapes : create-stroke
:.start-from SB 0 :.pen-direction UPWARD :.set-width 0 STROKE
:.line-to SB [CAP * 0.2] :.pen-direction UPWARD
:.line-to SB CAP :.pen-direction UPWARD :.set-width 0 topstroke
:.form-stroke
put-shapes : create-stroke
:.start-from RIGHTSB 0 :.pen-direction UPWARD :.set-width STROKE 0
:.line-to RIGHTSB [CAP * 0.2] :.pen-direction UPWARD
:.line-to RIGHTSB CAP :.pen-direction UPWARD :.set-width topstroke 0
:.form-stroke
put-shapes : create-stroke
:.start-from [SB + halftopstroke] CAP :.pen-direction DOWNWARD :.set-width topstroke 0
:.line-to [MIDDLE - halftopstroke] [CAP * 0.3] :.pen-direction DOWNWARD
:.form-stroke
put-shapes : create-stroke
:.start-from [MIDDLE + halftopstroke] [CAP * 0.3] :.pen-direction UPWARD :.set-width topstroke 0
:.line-to [RIGHTSB - halftopstroke] CAP :.pen-direction UPWARD
:.form-stroke
}
### S
create-glyph 'S' : glyph-construction {
set-width WIDTH; assign-unicode 'S'
local slope [STROKE * 0.00092]
local expand 0.35
local coexpand [[1 - expand] / 2]
local ssmootha SMOOTHA
local bowltop : create-stroke
bowltop.start-from [RIGHTSB - OXHOOK] [CAP - HOOK]
:.set-width STROKE 0
:.curve-to [MIDDLE + KAPPA_HOOK * [MIDDLE - para.sb]] CAPO MIDDLE CAPO
:.pen-direction LEFTWARD
:.arc-hv-to SB [CAP - ssmootha]
local strokemiddle : create-stroke
strokemiddle.start-from [SB + STROKE / 2] [CAP - ssmootha]
:.set-width [STROKE / 2] [STROKE / 2]
:.curve-to [SB + STROKE / 2] [[0.5 + slope] * CAP + [2 * slope * CAP] / [expand * WIDTH] * [coexpand * WIDTH - SB - STROKE / 2]] [coexpand * WIDTH] [[0.5 + slope] * CAP]
:.line-to [[1 - coexpand] * WIDTH] [[0.5 - slope] * CAP]
:.curve-to [RIGHTSB - STROKE / 2] [[0.5 - slope] * CAP - [2 * slope * CAP] / [expand * WIDTH] * [coexpand * WIDTH - SB - STROKE / 2]] [RIGHTSB - STROKE / 2] ssmootha
local bowlbottom : create-stroke
bowlbottom.start-from RIGHTSB ssmootha :.set-width 0 STROKE
:.arc-vh-to MIDDLE O
:.pen-direction LEFTWARD
:.curve-to [MIDDLE - KAPPA_HOOK * [MIDDLE - para.sb]] O [SB + OXHOOK] HOOK
put-shapes : bowltop.form-stroke
put-shapes : strokemiddle.form-stroke
put-shapes : bowlbottom.form-stroke
}
create-glyph 'dollar' : glyph-construction {
set-width WIDTH; assign-unicode '$'
put-shapes glyphs.S.contours
put-shapes : create-stroke
:.start-from MIDDLE [CAP - HALFSTROKE]
:.set-width HALFSTROKE HALFSTROKE
:.line-to MIDDLE [CAP - DESCENDER / 2]
:.form-stroke
put-shapes : create-stroke
:.start-from MIDDLE [DESCENDER / 2]
:.set-width HALFSTROKE HALFSTROKE
:.line-to MIDDLE HALFSTROKE
:.form-stroke
}
###### LOWER CASE
### o b d p q g
create-glyph 'o' : glyph-construction {
set-width WIDTH
assign-unicode 'o'
local outline : create-stroke
:.start-from MIDDLE XO
:.set-width STROKE 0
:.pen-direction LEFTWARD
:.arc-hv-to [SB + O] [XH - SMALLSMOOTHA]
:.line-to [SB + O] SMALLSMOOTHB
:.arc-vh-to MIDDLE O
:.pen-direction RIGHTWARD
:.arc-hv-to [RIGHTSB - O] SMALLSMOOTHA
:.line-to [RIGHTSB - O] [XH - SMALLSMOOTHB]
:.arc-vh-to MIDDLE XO
:.pen-direction LEFTWARD
put-shapes : outline.form-stroke
}
create-glyph 'o.left' : glyph-construction {
set-width WIDTH
# right half
put-shapes : create-stroke
:.start-from MIDDLE XO
:.pen-direction RIGHTWARD
:.set-width 0 STROKE
:.arc-hv-to [RIGHTSB - O] [XH - SMALLSMOOTHB]
:.line-to [RIGHTSB - O] SMALLSMOOTHA
:.arc-vh-to MIDDLE O
:.pen-direction LEFTWARD
:.form-stroke
# left half
put-shapes : create-stroke
:.start-from MIDDLE [O + STROKE]
:.pen-direction LEFTWARD
:.set-width STROKE 0
:.arc-hv-to [SB + STROKE] [SMALLSMOOTHB - STROKE * 0.05]
:.set-width HALFSTROKE 0
:.line-to [SB + STROKE] [XH - SMALLSMOOTHA + STROKE * 0.05]
:.set-width HALFSTROKE 0
:.arc-vh-to MIDDLE [XO - STROKE]
:.set-width STROKE 0
:.pen-direction RIGHTWARD
:.form-stroke
}
create-glyph 'o.right' : glyph-construction {
set-width WIDTH
# left half
put-shapes : create-stroke
:.start-from MIDDLE XO
:.pen-direction LEFTWARD
:.set-width STROKE 0
:.arc-hv-to [SB + O] [XH - SMALLSMOOTHA]
:.line-to [SB + O] SMALLSMOOTHB
:.arc-vh-to MIDDLE O
:.pen-direction RIGHTWARD
:.form-stroke
# right half
put-shapes : create-stroke
:.start-from MIDDLE [O + STROKE]
:.pen-direction RIGHTWARD
:.set-width 0 STROKE
:.arc-hv-to [RIGHTSB - STROKE] [SMALLSMOOTHA - STROKE * 0.05]
:.set-width 0 HALFSTROKE
:.line-to [RIGHTSB - STROKE] [XH - SMALLSMOOTHB + STROKE * 0.05]
:.set-width 0 HALFSTROKE
:.arc-vh-to MIDDLE [XO - STROKE]
:.set-width 0 STROKE
:.pen-direction LEFTWARD
:.form-stroke
}
create-glyph 'p' : glyph-construction {
set-width WIDTH
assign-unicode 'p'
include-glyph glyphs.'o.left'
put-shapes : create-stroke
:.start-from SB XH
:.pen-direction DOWNWARD
:.set-width STROKE 0
:.line-to SB DESCENDER
:.pen-direction DOWNWARD
:.form-stroke
}
create-glyph 'b' : glyph-construction {
set-width WIDTH
assign-unicode 'b'
put-shapes glyphs.'o.left'.contours
put-shapes : create-stroke
:.start-from SB 0
:.pen-direction UPWARD
:.set-width 0 STROKE
:.line-to SB CAP
:.pen-direction UPWARD
:.form-stroke
}
create-glyph 'q' : glyph-construction {
set-width WIDTH
assign-unicode 'q'
put-shapes glyphs.'o.right'.contours
put-shapes : create-stroke
:.start-from RIGHTSB XH
:.pen-direction DOWNWARD
:.set-width 0 STROKE
:.line-to RIGHTSB DESCENDER
:.pen-direction DOWNWARD
:.form-stroke
}
create-glyph 'd' : glyph-construction {
set-width WIDTH
assign-unicode 'd'
put-shapes glyphs.'o.right'.contours
put-shapes : create-stroke
:.start-from RIGHTSB 0
:.pen-direction UPWARD
:.set-width STROKE 0
:.line-to RIGHTSB CAP
:.pen-direction UPWARD
:.form-stroke
}
create-glyph 'g' : glyph-construction {
set-width WIDTH
assign-unicode 'g'
put-shapes : list {
Ring XO [XH * GBARPOS] [SB * 1.25] [RIGHTSB - 0.25 * SB] SMALLSMOOTH
Ring [XO - STROKE] [[XH * GBARPOS] + STROKE] [SB * 1.25 + STROKE] [[RIGHTSB - 0.25 * SB] - STROKE] [SMALLSMOOTH - STROKE]
}
reverse-last
put-shapes : create-stroke
:.start-from MIDDLE [XH * GBARPOS]
:.set-width 0 [STROKE * 0.75]
:.arc-hv-to [SB * 1.5 + STROKE] [[O - DESCENDER * 0.85 + XH * GBARPOS] * 0.47]
:.set-width 0 STROKE
:.arc-vh-to [MIDDLE + DESCENDER * 0.15] [O - DESCENDER * 0.85]
:.line-to [MIDDLE - DESCENDER * 0.15] [O - DESCENDER * 0.85]
:.arc-hv-to [RIGHTSB - O * 2] [[-STROKE] * globalTransform.yx * 2]
:.arc-vh-to MIDDLE [DESCENDER + O]
:.arc-hv-to SB [DESCENDER * 0.1]
:.arc-vh-to [MIDDLE + DESCENDER * 0.15] [O - DESCENDER * 0.85]
:.form-stroke
start-from [RIGHTSB + 0.5 * SB] XH
line-to [RIGHTSB + 0.5 * SB] [XH - STROKE]
line-to MIDDLE [XH - STROKE - O]
line-to MIDDLE XH
}
### c e
create-glyph 'c' : glyph-construction {
set-width WIDTH
assign-unicode 'c'
local outline : create-stroke
outline.start-from [RIGHTSB - OXHOOK] [XH - HOOK]
:.curve-to [MIDDLE + KAPPA_HOOK * [MIDDLE - para.sb]] XO MIDDLE XO
:.pen-direction LEFTWARD
:.arc-hv-to [SB + O] [XH - SMALLSMOOTHA]
:.line-to [SB + O] SMALLSMOOTHB
:.arc-vh-to MIDDLE O
:.pen-direction RIGHTWARD
:.curve-to [MIDDLE + KAPPA_HOOK * [MIDDLE - SB]] O [RIGHTSB - OXHOOK + TAILADJX * globalTransform.yx] [HOOK - TAILADJY * globalTransform.yx]
put-shapes : outline.form-stroke STROKE 0
}
create-glyph 'e' : glyph-construction {
set-width WIDTH
assign-unicode 'e'
local barbottom [XH * BARPOS]
local outline : create-stroke
:.start-from [RIGHTSB - O] barbottom
:.pen-direction UPWARD
:.set-width STROKE 0
:.line-to [RIGHTSB - O] [XH - SMALLSMOOTHB]
:.arc-vh-to MIDDLE XO
:.pen-direction LEFTWARD
:.arc-hv-to [SB + O] [XH - SMALLSMOOTHA]
:.line-to [SB + O] SMALLSMOOTHB
:.arc-vh-to MIDDLE O
:.pen-direction RIGHTWARD
:.curve-to [MIDDLE + KAPPA_HOOK * [MIDDLE - SB]] O [RIGHTSB - OXHOOK + TAILADJX * globalTransform.yx] [HOOK - TAILADJY * globalTransform.yx]
local bar : create-stroke
:.start-from [SB + HALFSTROKE] barbottom
:.set-width STROKE 0
:.pen-direction RIGHTWARD
:.line-to [RIGHTSB - HALFSTROKE] barbottom
:.pen-direction RIGHTWARD
put-shapes : outline.form-stroke
put-shapes : bar.form-stroke
}
### a u
create-glyph 'a.upright' : glyph-construction {
set-width WIDTH
local bartop [XH * BARPOS + STROKE]
put-shapes : create-stroke
:.start-from RIGHTSB 0
:.pen-direction UPWARD
:.set-width STROKE 0
:.line-to RIGHTSB [XH - SMOOTHA]
:.arc-vh-to MIDDLE XO
:.pen-direction LEFTWARD
:.curve-to [MIDDLE - KAPPA_AHOOK * [MIDDLE - SB]] XO [SB + OXHOOK] [XH - AHOOK]
:.form-stroke
put-shapes : create-stroke
:.start-from [WIDTH * 0.47] O
:.set-width 0 STROKE
:.pen-direction LEFTWARD
:.arc-hv-to [SB + O] [bartop * 0.45]
:.arc-vh-to [WIDTH * 0.6] bartop
:.line-to RIGHTSB bartop
:.pen-direction RIGHTWARD
:.form-stroke
put-shapes : create-stroke
:.start-from [WIDTH * 0.47] [O + STROKE]
:.set-width 0 STROKE
:.pen-direction RIGHTWARD
:.arc-hv-to [RIGHTSB - STROKE] [SMALLSMOOTHA * 0.65]
:.pen-direction UPWARD
:.set-width 0 [STROKE * 0.4]
:.form-stroke
}
create-glyph 'a.italic' : glyph-construction {
set-width WIDTH
include-glyph glyphs.'o.right'
put-shapes : create-stroke
:.start-from RIGHTSB 0
:.pen-direction UPWARD
:.set-width STROKE 0
:.line-to RIGHTSB XH
:.pen-direction UPWARD
:.form-stroke
}
create-glyph 'a' : glyph-construction {
set-width WIDTH
assign-unicode 'a'
if [para.italicangle > 0] {
then : include-glyph glyphs.'a.italic'
else : include-glyph glyphs.'a.upright'
}
}
create-glyph 'u' : glyph-construction {
set-width WIDTH
assign-unicode 'u'
put-shapes : create-stroke
:.start-from SB XH
:.pen-direction DOWNWARD
:.set-width STROKE 0
:.line-to SB SMALLSMOOTHA
:.arc-vh-to MIDDLE O
:.pen-direction RIGHTWARD
:.form-stroke
put-shapes : create-stroke
:.start-from MIDDLE [O + STROKE]
:.set-width 0 STROKE
:.pen-direction RIGHTWARD
:.arc-hv-to [RIGHTSB - STROKE] SMALLSMOOTHA
:.pen-direction UPWARD
:.set-width 0 [STROKE * 0.4]
:.form-stroke
put-shapes : create-stroke
:.start-from RIGHTSB 0
:.pen-direction UPWARD
:.set-width STROKE 0
:.line-to RIGHTSB XH
:.pen-direction UPWARD
:.form-stroke
}
### n h m
create-glyph 'nbowl' : glyph-construction {
put-shapes : create-stroke
:.start-from RIGHTSB 0
:.pen-direction UPWARD
:.set-width STROKE 0
:.line-to RIGHTSB [XH - SMALLSMOOTHB]
:.arc-vh-to MIDDLE XO
:.pen-direction LEFTWARD
:.form-stroke
put-shapes : create-stroke
:.start-from MIDDLE [XO - STROKE]
:.set-width 0 STROKE
:.pen-direction LEFTWARD
:.arc-hv-to [SB + STROKE] [XH - SMALLSMOOTHA]
:.pen-direction DOWNWARD
:.set-width 0 [STROKE * 0.4]
:.form-stroke
}
create-glyph 'n' : glyph-construction {
set-width WIDTH
assign-unicode 'n'
include-glyph glyphs.nbowl
put-shapes : create-stroke
:.start-from SB 0
:.pen-direction UPWARD
:.set-width 0 STROKE
:.line-to SB XH
:.pen-direction UPWARD
:.form-stroke
}
create-glyph 'h' : glyph-construction {
set-width WIDTH
assign-unicode 'h'
include-glyph glyphs.nbowl
put-shapes : create-stroke
:.start-from SB 0
:.pen-direction UPWARD
:.set-width 0 STROKE
:.line-to SB CAP
:.pen-direction UPWARD
:.form-stroke
}
create-glyph 'm' : glyph-construction {
set-width WIDTH
assign-unicode 'm'
local sw : Math.min STROKE [[WIDTH - SB * 2] * 0.24]
local m1 : [MIDDLE + SB + sw * 0.25] / 2
local m2 : m1 + [MIDDLE - sw / 2 - SB]
put-shapes : create-stroke
:.start-from [MIDDLE - sw / 2] 0
:.set-width 0 sw :.pen-direction UPWARD
:.line-to [MIDDLE - sw / 2] [XH - SMALLSMOOTHA]
:.arc-vh-to m1 [XO - STROKE]
:.set-width 0 STROKE
:.pen-direction LEFTWARD
:.arc-hv-to [SB + sw * 0.75] [XH - SMALLSMOOTHA]
:.pen-direction DOWNWARD
:.set-width 0 [sw * 0.4]
:.form-stroke
put-shapes : create-stroke
:.start-from [RIGHTSB - sw] 0
:.set-width 0 sw :.pen-direction UPWARD
:.line-to [RIGHTSB - sw] [XH - SMALLSMOOTHA]
:.arc-vh-to m2 [XO - STROKE]
:.set-width 0 STROKE
:.pen-direction LEFTWARD
:.arc-hv-to [MIDDLE + sw * 0.25] [XH - SMALLSMOOTHA]
:.pen-direction DOWNWARD
:.set-width 0 [sw * 0.4]
:.form-stroke
put-shapes : create-stroke
:.start-from SB 0
:.pen-direction UPWARD
:.set-width 0 sw
:.line-to SB XH
:.pen-direction UPWARD
:.form-stroke
}
### i l
create-glyph 'dotlessi.straight' : glyph-construction {
put-shapes : create-stroke
:.start-from MIDDLE 0
:.pen-direction UPWARD
:.set-width HALFSTROKE HALFSTROKE
:.line-to MIDDLE XH
:.pen-direction UPWARD
:.form-stroke
}
create-glyph 'dotlessi.hooky' : glyph-construction {
include-glyph glyphs.'dotlessi.straight'
put-shapes : leftwardTopSerif MIDDLE XH LONGSERIF
}
create-glyph 'dotlessi.zshaped' : glyph-construction {
include-glyph glyphs.'dotlessi.hooky'
put-shapes : rightwardBottomSerif MIDDLE 0 LONGSERIF
}
create-glyph 'dotlessi.serifed' : glyph-construction {
include-glyph glyphs.'dotlessi.zshaped'
put-shapes : leftwardBottomSerif MIDDLE 0 LONGSERIF
}
create-glyph 'dotlessi' : glyph-construction {
set-width WIDTH
assign-unicode 0x131
include-glyph glyphs.[match variantSelector.zero {
'straight' 'dotlessi.straight'
'hooky' 'dotlessi.hooky'
'zshaped' 'dotlessi.zshaped'
'serifed' 'dotlessi.serifed'
otherwise 'dotlessi.serifed'
}]
}
create-glyph 'dotaccent' : glyph-construction {
set-width WIDTH
put-shapes : list {
Ring [XH + ACCENT + DOTRADIUS] [XH + ACCENT - DOTRADIUS] [MIDDLE - DOTRADIUS] [MIDDLE + DOTRADIUS]
}
}
create-glyph 'i' : glyph-construction {
set-width WIDTH
assign-unicode 'i'
include-glyph glyphs.dotlessi
include-glyph glyphs.dotaccent
}
create-glyph 'l.straight' : glyph-construction {
put-shapes : create-stroke
:.start-from MIDDLE 0
:.pen-direction UPWARD
:.set-width HALFSTROKE HALFSTROKE
:.line-to MIDDLE CAP
:.pen-direction UPWARD
:.form-stroke
}
create-glyph 'l.hooky' : glyph-construction {
include-glyph glyphs.'l.straight'
put-shapes : leftwardTopSerif MIDDLE CAP LONGSERIF
}
create-glyph 'l.zshaped' : glyph-construction {
include-glyph glyphs.'l.hooky'
put-shapes : rightwardBottomSerif MIDDLE 0 LONGSERIF
}
create-glyph 'l.serifed' : glyph-construction {
include-glyph glyphs.'l.zshaped'
put-shapes : leftwardBottomSerif MIDDLE 0 LONGSERIF
}
create-glyph 'l' : glyph-construction {
set-width WIDTH
assign-unicode 'l'
include-glyph glyphs.[match variantSelector.zero {
'straight' 'l.straight'
'hooky' 'l.hooky'
'zshaped' 'l.zshaped'
'serifed' 'l.serifed'
otherwise 'l.serifed'
}]
}
### x
create-glyph 'x' : glyph-construction {
set-width WIDTH
assign-unicode 'x'
local TURN [XH * 0.1]
local barone : create-stroke
:.start-from [SB + HALFSTROKE + O] 0
:.pen-direction UPWARD
:.set-width HALFSTROKE HALFSTROKE
:.cubic-to [SB + HALFSTROKE + O] [TURN + 0.17 * [XH - TURN]] [RIGHTSB - HALFSTROKE - O] [XH - TURN - 0.17 * [XH - TURN]] [RIGHTSB - HALFSTROKE - O] XH
:.pen-direction UPWARD
local bartwo : create-stroke
:.start-from [RIGHTSB - HALFSTROKE - O] 0
:.pen-direction UPWARD
:.set-width HALFSTROKE HALFSTROKE
:.cubic-to [RIGHTSB - HALFSTROKE - O] [TURN + 0.17 * [XH - TURN]] [SB + HALFSTROKE + O] [XH - TURN - 0.17 * [XH - TURN]] [SB + HALFSTROKE + O] XH
:.pen-direction UPWARD
put-shapes : barone.form-stroke
put-shapes : bartwo.form-stroke
}
### s
create-glyph 's' : glyph-construction {
set-width WIDTH; assign-unicode 's'
local slope 0.015
local expand 0.175
local coexpand [[1 - expand] / 2]
local ssmootha [SMOOTHA * 0.87]
local bowltop : create-stroke
bowltop.start-from [RIGHTSB - OXHOOK] [XH - SHOOK]
:.set-width STROKE 0
:.curve-to [MIDDLE + KAPPA_AHOOK * [MIDDLE - para.sb]] XO MIDDLE XO
:.pen-direction LEFTWARD
:.arc-hv-to SB [XH - ssmootha]
local strokemiddle : create-stroke
strokemiddle.start-from [SB + STROKE / 2] [XH - ssmootha]
:.set-width [STROKE / 2] [STROKE / 2]
:.curve-to [SB + STROKE / 2] [[0.5 + slope] * XH + [2 * slope * XH] / [expand * WIDTH] * [coexpand * WIDTH - SB - STROKE / 2]] [coexpand * WIDTH] [[0.5 + slope] * XH]
:.line-to [[1 - coexpand] * WIDTH] [[0.5 - slope] * XH]
:.curve-to [RIGHTSB - STROKE / 2] [[0.5 - slope] * XH - [2 * slope * XH] / [expand * WIDTH] * [coexpand * WIDTH - SB - STROKE / 2]] [RIGHTSB - STROKE / 2] ssmootha
local bowlbottom : create-stroke
bowlbottom.start-from RIGHTSB ssmootha :.set-width 0 STROKE
:.arc-vh-to MIDDLE O
:.pen-direction LEFTWARD
:.curve-to [MIDDLE - KAPPA_AHOOK * [MIDDLE - para.sb]] O [SB + OXHOOK] SHOOK
put-shapes : bowltop.form-stroke
put-shapes : strokemiddle.form-stroke
put-shapes : bowlbottom.form-stroke
}
exports.font = font