Files
Iosevka/glyphs/letters-unified-basic.ptl
T

4399 lines
139 KiB
Plaintext

###########################################################################################
# UNIFIED LETTERFORMS : LATIN ORIGINALS
###########################################################################################
$$include '../meta/macros.ptl'
import '../support/transform' as : Transform && [object [transformPoint tp] [untransform utp] inverse]
import [mix linreg clamp fallback] from '../support/utils'
import [designParameters] from '../meta/aesthetics'
export : define [apply] : begin
glyph-module-entry commonShapes overmarks
### I
define { ISerifShape } : do "I and related ===================================================="
sketch # I.straight
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.capital
include : VBar df.middle 0 CAP
set currentGlyph.cmpPriority (-2)
save 'I.straight'
sketch # I.line
local df : DivFrame para.diversityII
set-width df.width
include df.markSet.capital
include : VBar df.middle 0 CAP
set currentGlyph.cmpPriority (-2)
save 'I.line'
define [ISerifShape top] : glyph-construction
local df : DivFrame para.diversityI
include : VBar df.middle 0 top
include : CenterBottomSerif df.middle 0 (LONGJUT * df.div)
include : CenterTopSerif df.middle top (LONGJUT * df.div)
sketch # I.serifed
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.capital
include : ISerifShape CAP
save 'I.serifed'
select-variant 'I' 'I'
alias 'Iota' 0x399 'I'
alias 'cyrUkrainianI' 0x406 'I'
alias 'Palochka' 0x4C0 'I'
sketch # smcpI
local df : DivFrame para.diversityI
include df.markSet.e
set-width df.width
include : ISerifShape XH
save 'smcpI' 0x26A
list ISerifShape
### dotless i, i and iota
# iota
define { IotaShape TailedIShape } : do "i and related ========================================="
define [IotaShape top] : glyph-construction
local df : DivFrame para.diversityI
local middle df.middle
set-anchor 'above' BASE middle top
include : tagged 'serifLT' : LeftwardTopSerif middle top (LONGJUT * df.div)
include : dispiro
widths.center
flat middle top [heading DOWNWARD]
curl middle HOOK
arcvh
flat (middle + HOOK - HALFSTROKE) HALFSTROKE
curl (middle + [Math.max HOOKX (LONGJUT * 1.05 * df.div)]) HALFSTROKE [heading RIGHTWARD]
sketch # iota
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.e
include : IotaShape XH
save 'iota' 0x3B9
save 'latiniota' 0x269
sketch # latinIota
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.capital
include : IotaShape CAP
save 'latinIota' 0x196
sketch # dotlessi.straight
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.e
include : VBar (df.middle) 0 XH
set currentGlyph.cmpPriority (-2)
save 'dotlessi.straight'
sketch # dotlessi.hooky
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.e
local balance : IBALANCE2 * df.div * df.div
include : VBar (df.middle + balance) 0 XH
include : LeftwardTopSerif (df.middle + balance) XH (LONGJUT * df.div)
save 'dotlessi.hooky'
sketch # dotlessi.zshaped
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.e
include : VBar (df.middle) 0 XH
include : LeftwardTopSerif (df.middle) XH (LONGJUT * df.div)
include : RightwardBottomSerif df.middle 0 (LONGJUT * df.div)
save 'dotlessi.zshaped'
sketch # dotlessi.line
local df : DivFrame para.diversityII
set-width df.width
include df.markSet.e
include : VBar (df.middle) 0 XH
save 'dotlessi.line'
sketch # dotlessi.serifed
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.e
local balance : IBALANCE * df.div * df.div
include : VBar (df.middle + balance) 0 XH
include : LeftwardTopSerif (df.middle + balance) XH (LONGJUT * df.div - balance)
include : RightwardBottomSerif df.middle 0 (LONGJUT * df.div)
include : LeftwardBottomSerif df.middle 0 (LONGJUT * df.div)
save 'dotlessi.serifed'
sketch # dotlessi.italic
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.e
if para.isItalic
: then : begin
local shift : (1 - df.div) * 0.2
local left : [mix SB df.rightSB ([linreg 18 0.42 126 0.46 STROKE] - shift)] - HALFSTROKE * HVCONTRAST
local right : mix SB df.rightSB (1.1 - shift)
local rightTerm : Math.max right (left + HOOKX + STROKE)
local middle : mix left right (0.55 * df.div)
include : dispiro
widths.lhs
flat left XH [heading DOWNWARD]
curl left (SMALLSMOOTHB * 0.8)
hookend O
g4 rightTerm (HOOK * [linreg 18 0.85 126 1 STROKE] * df.div)
include : dispiro
flat (left - (LONGJUT * df.div) + HALFSTROKE * HVCONTRAST) XH [widths 0 STROKE]
curl left XH
set-anchor 'above' BASE (left + HALFSTROKE * HVCONTRAST + [linreg 18 0.25 126 0 STROKE] * TANSLANT * df.width) XH
set-anchor 'below' BASE middle 0
: else : begin
include : IotaShape XH
save 'dotlessi.italic'
define [TailedIShape df top] : glyph-construction
local middle : df.middle - LBALANCE2
local x0 : HALFSTROKE + (HOOK - STROKE + 1) * 0.85 * df.div + LBALANCE2
local x1 : [Math.max (HOOK - HALFSTROKE + 1) (LONGJUT * df.div)] + LBALANCE2
include : dispiro
widths.center
flat middle top [heading DOWNWARD]
curl middle HOOK
arcvh
g4.right.mid (middle + x0) (HALFSTROKE + O) [heading RIGHTWARD]
g4 (middle + x1) (HALFSTROKE - O) [heading RIGHTWARD]
set-anchor 'above' BASE middle top
set-anchor 'below' BASE middle 0
set-anchor 'overlay' BASE middle (top * OVERLAYPOS)
set-anchor 'topright' BASE (middle + RIGHTSB - MIDDLE) top
sketch # dotlessi.tailed
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.b
include : TailedIShape df XH
save 'dotlessi.tailed'
select-variant 'dotlessi' 0x131
sketch # iogonek.dotless
include glyphs.dotlessi AS_BASE
include glyphs.ogonekBelow
save 'iogonek.dotless'
composite 'i' glyphs.dotlessi glyphs.dotAbove [into-unicode 'i']
if (glyphs.i && glyphs.dotlessi) : begin
local fs : queryFeatureSelector 'dotlessi' para
local fs_i : queryFeatureSelector 'dotlessi' para 'i'
foreach [{k gid} : pairs-of fs] : begin
composite fs_i.(k) glyphs.(gid) glyphs.dotAbove
set glyphs.i.featureSelector fs_i
alias 'cyrUkrainiani' 0x456 'i'
turned nothing 0x1D09 'i' (MIDDLE * para.diversityI) (XH / 2) markset.p
list IotaShape TailedIShape
### J
do "J and related ============================================================================="
sketch # J.straight
set-width WIDTH
include markset.capital
set-anchor 'above' BASE (RIGHTSB - STROKE * HVCONTRAST * 0.75 - JBALANCE2) CAP
set-anchor 'overlay' BASE (RIGHTSB - STROKE * HVCONTRAST * 0.75 - JBALANCE2) (CAP * OVERLAYPOS)
local slope (STROKE * 0.00092)
local expand 0.35
local coexpand ((1 - expand) / 2)
local hookx (0.75 * SB)
include : dispiro
widths.rhs
flat (RIGHTSB - JBALANCE2) CAP [heading DOWNWARD]
curl (RIGHTSB - JBALANCE2) SMOOTH
hookend O
g4 hookx HOOK
save 'J.straight'
sketch # J.shorthook
set-width WIDTH
include markset.capital
local slope (STROKE * 0.00092)
local expand 0.35
local coexpand ((1 - expand) / 2)
local smooth : HOOK + 0.75 * STROKE
local hookx (0.5 * SB)
include : dispiro
widths.rhs
flat (RIGHTSB - JBALANCE2) CAP [heading DOWNWARD]
curl (RIGHTSB - JBALANCE2) smooth
straight.left.end [mix SB RIGHTSB 0.3] O [heading LEFTWARD]
save 'J.shorthook'
sketch # J.serifed
set-width WIDTH
include glyphs.'J.straight' AS_BASE
include : LeftwardTopSerif (RIGHTSB - HALFSTROKE * HVCONTRAST - JBALANCE2) CAP LONGJUT
save 'J.serifed'
select-variant 'J' 'J'
alias 'cyrJe' 0x408 'J'
alias 'grkJ' 0x37F 'J'
### j and dotless j
do "j and related ============================================================================="
sketch # dotlessj.straight
include markset.p
local center : MIDDLE + JBALANCE + HALFSTROKE * HVCONTRAST
set-anchor 'above' BASE (center - HVCONTRAST * HALFSTROKE) XH
set-anchor 'overlay' BASE (center - HVCONTRAST * HALFSTROKE) (XH / 2)
local hookx : center - (WIDTH * 0.5) - STROKE * HVCONTRAST + OXHOOK
local turn : [mix center hookx 0.5] + CORRECTION_OMIDS
include : dispiro
widths.rhs
flat center XH [heading DOWNWARD]
curl center (DESCENDER + SMOOTHA)
hookend (DESCENDER + O)
g4 hookx (DESCENDER + JHOOK)
save 'dotlessj.straight'
sketch # dotlessj.line
include markset.p
include : VBar MIDDLE DESCENDER XH
save 'dotlessj.line'
sketch # dotlessj.serifed
include markset.p
include glyphs.'dotlessj.straight' AS_BASE
include : LeftwardTopSerif (MIDDLE + JBALANCE) XH LONGJUT
set-anchor 'above' BASE (MIDDLE + JBALANCE - STROKE * 0.166 * HVCONTRAST) XH
set-anchor 'overlay' BASE (MIDDLE + JBALANCE - STROKE * 0.166 * HVCONTRAST) (XH / 2)
save 'dotlessj.serifed'
sketch # dotlessj.narrow
local df : DivFrame para.diversityII
set-width df.width
include df.markSet.p
local crossLeft : mix 0 SB (1 / 2)
local crossRight : mix df.width df.rightSB (1 / 2)
local terminal : crossLeft - OX * 2
local bar : df.middle + HALFSTROKE * HVCONTRAST
local tTurn : Math.max (HOOK * 0.9) (STROKE * 1.5) : Math.min HOOK (STROKE * 1.75)
include : dispiro
widths.lhs
flat [Math.min terminal (bar - tTurn - [Math.max (STROKE / 3) (df.width / 6)])] DESCENDER
curl (bar - tTurn) DESCENDER
archv
flat bar (DESCENDER + tTurn)
curl bar XH [heading UPWARD]
set-anchor 'above' BASE (df.middle) XH
set-anchor 'overlay' BASE (df.middle) (XH / 2)
save 'dotlessj.narrow'
sketch # dotlessj.narrow-serifed
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.p
local crossLeft : mix 0 SB (1 / 2)
local crossRight : mix df.width df.rightSB (1 / 2)
local terminal : crossLeft - OX * 2
local barCenter : df.middle + JBALANCE * df.div
local bar : barCenter + HALFSTROKE * HVCONTRAST
local tTurn : Math.max (HOOK * 0.9) (STROKE * 1.5) : Math.min HOOK (STROKE * 1.75)
include : LeftwardTopSerif barCenter XH (LONGJUT * df.div)
include : dispiro
widths.lhs
flat [Math.min terminal (bar - tTurn - [Math.max (STROKE / 3) (df.width / 6)])] DESCENDER
curl (bar - tTurn) DESCENDER
archv
flat bar (DESCENDER + tTurn)
curl bar XH [heading UPWARD]
set-anchor 'above' BASE barCenter XH
set-anchor 'overlay' BASE barCenter (XH / 2)
save 'dotlessj.narrow-serifed'
select-variant 'dotlessj' 0x237
composite 'j' glyphs.dotlessj glyphs.dotAbove [into-unicode 'j']
if (glyphs.j && glyphs.dotlessj) : begin
local fs : queryFeatureSelector 'dotlessj' para
local fs_j : queryFeatureSelector 'dotlessj' para 'j'
foreach [{k gid} : pairs-of fs] : begin
composite fs_j.(k) glyphs.(gid) glyphs.dotAbove
set glyphs.j.featureSelector fs_j
alias "grkj" 0x3F3 'j'
alias "cyrje" 0x458 'j'
sketch # jcurlytail
include markset.p
set-anchor 'above' BASE (MIDDLE + JBALANCE) XH
local fine : adviceBlackness 3.5
local rinner : LONGJUT / 2 - fine / 2
local m1 : MIDDLE - HALFSTROKE * HVCONTRAST + JBALANCE
local x2 : mix RIGHTSB m1 0.25
local y2 : DESCENDER + O
include : LeftwardTopSerif (MIDDLE + JBALANCE) XH LONGJUT
include : dispiro
widths.lhs
flat m1 XH [heading DOWNWARD]
curl m1 (DESCENDER + fine + rinner * 2)
CurlyTail fine rinner m1 DESCENDER (m1 - LONGJUT) x2 y2
include glyphs.dotAbove
save 'jcurlytail' 0x29D
### L
define { LShape } : do "l and related ========================================================="
define [LShape top] : glyph-construction
include : VBarLeft (SB * 1.5) 0 top
include : HBarBottom (SB * 1.5 - O) (RIGHTSB - OX) 0
if SLAB : begin
include : LeftwardBottomSerif (SB * 1.5) 0 SIDEJUT
include : CenterTopSerif (SB * 1.5 + HVCONTRAST * HALFSTROKE) top JUT
include : UpwardRightSerif (RIGHTSB - OX) 0 VJUT
sketch # L
set-width WIDTH
include markset.capital
include : LShape CAP
save 'L' 'L'
turned 'turnL' 0xA780 'L' MIDDLE (CAP / 2)
sketch # Lcaron
include glyphs.commaAbove
apply-transform : Translate (WIDTH + (RIGHTSB - SB) * 0.375) 0
include glyphs.L AS_BASE
save 'Lcaron' 0x13D
sketch # Lslash
include glyphs.L AS_BASE
local fine : 0.5 * OVERLAYSTROKE
local middle : mix STROKE CAP 0.5
include : dispiro
flat [mix 0 SB 0.5] (middle - LONGJUT * 0.4) [widths fine fine]
curl (1.6 * LONGJUT + [mix 0 SB 0.5]) (middle + LONGJUT * 0.4)
save 'Lslash' 0x141
sketch # Ldot
include glyphs.L AS_BASE
include : Ring ([mix STROKE CAP 0.5] + DOTRADIUS) ([mix STROKE CAP 0.5] - DOTRADIUS) ([mix SB RIGHTSB 0.65] - DOTRADIUS) ([mix SB RIGHTSB 0.65] + DOTRADIUS)
save 'Ldot' 0x13F
sketch # Lbar
include glyphs.L AS_BASE
include : HOverlayBar (SB * 0.3) [mix (SB + STROKE) (RIGHTSB - STROKE) 0.55] (CAP * OVERLAYPOS)
save 'Lbar' 0x23D
sketch # smcpL
include markset.e
include : LShape XH
save 'smcpL' 0x29F
list LShape
### l
do "l and related ============================================================================="
sketch # l.hooky
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.b
local balance : LBALANCE2 * df.div * df.div
local middle : df.middle + balance
set-anchor 'above' BASE middle CAP
set-anchor 'below' BASE middle 0
set-anchor 'overlay' BASE middle (CAP * OVERLAYPOS)
set-anchor 'topright' BASE (df.middle + RIGHTSB - MIDDLE) CAP
include : VBar (df.middle + balance) 0 (CAP - STROKE)
include : LeftwardTopSerif (df.middle + balance) CAP (LONGJUT * df.div)
save 'l.hooky'
sketch # l.zshaped
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.b
include : VBar (df.middle) 0 (CAP - STROKE)
include : tagged 'serifLT' : LeftwardTopSerif (df.middle) CAP (LONGJUT * df.div)
include : tagged 'serifRB' : RightwardBottomSerif (df.middle) 0 (LONGJUT * df.div)
set-anchor 'topright' BASE (df.middle + RIGHTSB - MIDDLE) CAP
save 'l.zshaped'
sketch # l.line
local df : DivFrame para.diversityII
set-width df.width
include df.markSet.b
include : VBar (df.middle) 0 (CAP * 0.6)
include : VBar (df.middle) (CAP * 0.4) CAP
set-anchor 'topright' BASE (df.middle + RIGHTSB - MIDDLE) CAP
save 'l.line'
sketch # l.serifed
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.b
local balance : LBALANCE * df.div * df.div
include : VBar (df.middle + balance) 0 CAP
include : LeftwardTopSerif (df.middle + balance) CAP ((LONGJUT * df.div) - balance)
include : CenterBottomSerif df.middle 0 (LONGJUT * df.div)
set-anchor 'overlay' BASE (df.middle + balance / 2) (CAP * OVERLAYPOS)
set-anchor 'topright' BASE (df.middle + RIGHTSB - MIDDLE) CAP
save 'l.serifed'
sketch # l.italic
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.b
if para.isItalic
: then : begin
local shift : (1 - df.div) * 0.4
local left : mix SB df.rightSB (0.3 - shift)
local right : mix SB df.rightSB (1.1 - shift)
local rightTerm : Math.max right (left + HOOKX + STROKE)
local middle : mix left right (0.54 * df.div)
include : dispiro
widths.lhs
flat left CAP [heading DOWNWARD]
curl left (SMALLSMOOTHB * 0.85)
hookend O
g4 rightTerm (HOOK * [linreg 18 0.85 126 1 STROKE] * df.div)
include : tagged 'serifLT': dispiro
flat (left - (LONGJUT * df.div) + HALFSTROKE * HVCONTRAST) CAP [widths 0 STROKE]
curl left CAP
set-anchor 'above' BASE (left + HALFSTROKE) CAP
set-anchor 'below' BASE middle 0
set-anchor 'overlay' BASE (left + HALFSTROKE) (CAP * OVERLAYPOS)
set-anchor 'topright' BASE (left + HALFSTROKE + RIGHTSB - MIDDLE) CAP
: else : begin
include : IotaShape CAP
set-anchor 'topright' BASE (df.middle + RIGHTSB - MIDDLE) CAP
save 'l.italic'
sketch # l.tailed
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.b
include : TailedIShape df CAP
save 'l.tailed'
sketch # l.hookybottom
local df : DivFrame para.diversityI
set-width df.width
include df.markSet.b
local middle : df.middle - LBALANCE2
set-anchor 'above' BASE middle CAP
set-anchor 'below' BASE middle 0
set-anchor 'overlay' BASE middle (CAP * OVERLAYPOS)
set-anchor 'topright' BASE (middle + RIGHTSB - MIDDLE) CAP
include : VBar middle 0 CAP
include : RightwardBottomSerif middle 0 (LONGJUT * df.div)
save 'l.hookybottom'
select-variant 'l' 'l'
alias 'palochka' 0x4CF 'l'
turned 'turnl' 0xA781 'l' MIDDLE (XH / 2) markset.p
sketch # ldot
include glyphs.l AS_BASE
apply-transform : Translate (-DOTRADIUS / 2) 0
include : Ring ([mix STROKE CAP 0.5] + DOTRADIUS) ([mix STROKE CAP 0.5] - DOTRADIUS) ([mix SB RIGHTSB 1] - DOTSIZE) [mix SB RIGHTSB 1]
save 'ldot' 0x140
sketch # lrtail
local df : DivFrame para.diversityI
include glyphs.rtailBR
apply-transform : Translate (df.middle + LBALANCE2 + HALFSTROKE * HVCONTRAST) 0
include glyphs.'l.hooky'
include df.markSet.if
save 'lrtail' 0x26D
sketch # lcurlytail
include markset.b
local fine : adviceBlackness 3.5
local rinner : LONGJUT / 2 - fine / 2
local m1 : MIDDLE + HALFSTROKE * HVCONTRAST
local x2 : mix SB m1 0.25
local y2 : - fine
include : LeftwardTopSerif MIDDLE CAP LONGJUT
include : dispiro
widths.rhs
flat m1 CAP [heading DOWNWARD]
curl m1 (fine + rinner * 2)
CurlyTail fine rinner m1 0 (m1 + LONGJUT) x2 y2
save 'lcurlytail' 0x234
sketch # ltildeover
local df : DivFrame para.diversityI
include glyphs.'l.serifed' AS_BASE ALSO_METRICS
include : create-glyph : glyph-construction
include glyphs.tildeAbove
apply-transform : Upright
apply-transform : Translate (df.middle - markMiddle) (CAP * 0.525 - [mix aboveMarkBot aboveMarkTop 0.5])
apply-transform : Italify
save 'ltildeover' 0x26B
define [Belt middle] : glyph-construction
local fine : adviceBlackness 4.5
local r : XH * 0.05
include : dispiro
widths.rhs fine
flat middle (CAPMIDDLE + r) [heading LEFTWARD]
curl (middle - HALFSTROKE - r * 1.5) (CAPMIDDLE + r)
archv
g4.down.mid (middle - HALFSTROKE - r * 2.5) CAPMIDDLE [heading DOWNWARD]
arcvh
flat (middle - HALFSTROKE - r * 1.5) (CAPMIDDLE - r)
curl (middle + HALFSTROKE + r * 1.5 + fine) (CAPMIDDLE - r)
sketch # lbelt
local df : DivFrame para.diversityI
include glyphs.'l.serifed' AS_BASE ALSO_METRICS
include : Belt df.middle
save 'lbelt' 0x26C
sketch # lbeltrtail
local df : DivFrame para.diversityI
include glyphs.lrtail AS_BASE ALSO_METRICS
include : Belt df.middle
save 'lbeltrtail' 0xA78E
sketch # looprevesh
include markset.if
local fine : adviceBlackness 4
include : dispiro
widths.center fine
g4.down.start MIDDLE (CAP - fine * 1.5) [heading DOWNWARD]
arcvh
g4 (MIDDLE - fine * 1) (CAP - fine * 2.5) [heading LEFTWARD]
archv
g4 (MIDDLE - fine * 2) (CAP - fine * 1.5) [heading UPWARD]
arcvh
g4 (MIDDLE - fine * 1) (CAP - fine * 0.5) [heading RIGHTWARD]
archv
flat MIDDLE (CAP - fine * 1.5) [widths.heading HALFSTROKE HALFSTROKE DOWNWARD]
curl MIDDLE 0 [heading DOWNWARD]
arcvh
straight.right.end (MIDDLE + HOOKX) (-HOOK)
save 'looprevesh' 0x1AA
### V and v
define { VShape VShapeOutline } : do "V, v and related ========================================"
define cornerdist : HALFSTROKE * HVCONTRAST * 1.15
define vcurviness : if (SLAB && !para.isItalic) 0.15 0.3
define VShapeFine : STROKE * [fallback para.vtipfine : if SLAB 0.9 0.8]
define VShapeFineStraight : Math.max [adviceBlackness 7] [STROKE * 0.66]
define VShapeMiddleWidth : adviceBlackness 3
define pInktrap 0.5
define [VShapeOutline] : params [top [sw STROKE] barStraight div] : glyph-construction
local df : DivFrame div
local fine : [if barStraight VShapeFineStraight VShapeFine] * sw / STROKE
local sbCor : (CAP / top) * OX
local dgCor : diagCor top (WIDTH / 2) 0 (sw * 2)
local clearance : 0 - OX
if barStraight : begin
local vxStartL : df.leftSB + sbCor + clearance
local vxEndL : df.middle - cornerdist + clearance
local vxStartR : df.rightSB - sbCor - clearance
local vxEndR : df.middle + cornerdist - clearance
include : spiro-outline
flat [mix vxStartL vxEndL 0] [mix top 0 0]
curl [mix vxStartL vxEndL pInktrap] [mix top 0 pInktrap]
corner [mix vxStartL vxEndL 1] [mix top 0 1]
corner [mix vxStartR vxEndR 1] [mix top 0 1]
flat [mix vxStartR vxEndR pInktrap] [mix top 0 pInktrap]
curl [mix vxStartR vxEndR 0] [mix top 0 0]
: else : begin
local vxStartL : df.leftSB + clearance
local vxEndL : df.middle - cornerdist + clearance
local vxStartR : df.rightSB - clearance
local vxEndR : df.middle + cornerdist - clearance
include : spiro-outline
flat vxStartL top
curl vxStartL (top * 0.9)
quadcontrols 0 vcurviness 9 unimportant
corner vxEndL 0
corner vxEndR 0
quadcontrols 1 (1 - vcurviness) 9 unimportant
flat vxStartR (top * 0.9)
curl vxStartR top
define [VShape] : params [top [sw STROKE] barStraight div] : glyph-construction
local df : DivFrame div
local fine : Math.min sw : if barStraight VShapeFineStraight VShapeFine
local sbCor : (CAP / top) * OX
local dgCor : diagCor top (WIDTH / 2) 0 (sw * 2)
if barStraight : begin
local vxStartL : SB + sbCor
local vxEndL : df.middle - cornerdist
local vxStartR : df.rightSB - sbCor
local vxEndR : df.middle + cornerdist
local midSW : VShapeMiddleWidth / STROKE * sw
include : dispiro
widths.lhs (sw * dgCor)
flat [mix vxStartL vxEndL 0] [mix top 0 0] [heading DOWNWARD]
curl [mix vxStartL vxEndL pInktrap] [mix top 0 pInktrap] [widths.lhs midSW]
g4 [mix vxStartL vxEndL 1] [mix top 0 1] [widths.lhs fine]
include : dispiro
widths.rhs (sw * dgCor)
flat [mix vxStartR vxEndR 0] [mix top 0 0] [heading DOWNWARD]
curl [mix vxStartR vxEndR pInktrap] [mix top 0 pInktrap] [widths.rhs midSW]
g4 [mix vxStartR vxEndR 1] [mix top 0 1] [widths.rhs fine]
tag-contour 'strokeUp'
: else : begin
include : dispiro
widths.lhs sw
flat df.leftSB top [heading DOWNWARD]
curl df.leftSB (top * 0.9) [heading DOWNWARD]
quadcontrols 0 vcurviness 9 unimportant
g4 (df.middle - cornerdist) 0 [widths.lhs fine]
include : dispiro
widths.rhs sw
flat df.rightSB top [heading DOWNWARD]
curl df.rightSB (top * 0.9) [heading DOWNWARD]
quadcontrols 0 vcurviness 9 unimportant
g4 (df.middle + cornerdist) 0 [widths.rhs fine]
tag-contour 'strokeUp'
#bottom cap
start-from (df.middle + cornerdist) 0
line-to (df.middle - cornerdist) 0
line-to df.middle fine
include : AIVSerifs top
sketch # V
set-width WIDTH
include markset.capital
branch
include : VShape CAP STROKE true
save 'V.straight'
branch
include : VShape CAP STROKE false
save 'V.curly'
sketch # v
include markset.e
branch
include : VShape XH STROKE true
save 'v.straight'
branch
include : VShape XH STROKE false
save 'v.curly'
define [VHooktopShape top _stroke barStraight] : glyph-construction
include : VShape top [fallback _stroke STROKE] barStraight
eject-contour 'serifRT'
eject-contour 'strokeUp'
include : dispiro
widths.rhs
straight.left.start (RIGHTSB + HOOKX / 3) (top - STROKE)
g4 (RIGHTSB - HOOKX / 3) (top - HALFSTROKE - HOOK)
quadcontrols 0.4 0.75 64 unimportant
g4 (MIDDLE + cornerdist) 0 [widths.rhs VShapeFine]
sketch # vhooktop
include markset.e
branch
include : VHooktopShape XH STROKE true
save 'vhooktop.straight'
save 'cyrizhitsa.straight'
branch
include : VHooktopShape XH STROKE false
save 'vhooktop.curly'
save 'cyrizhitsa.curly'
sketch # cyrIzhitsa
include markset.capital
branch
include : VHooktopShape CAP STROKE true
save 'cyrIzhitsa.straight'
branch
include : VHooktopShape CAP STROKE false
save 'cyrIzhitsa.curly'
select-variant 'V' 'V'
select-variant 'v' 'v'
select-variant 'vhooktop' 0x2C71 (follow -- 'v')
select-variant 'cyrizhitsa' 0x475 (follow -- 'v')
select-variant 'cyrIzhitsa' 0x474 (follow -- 'V')
turned 'turnv.straight' nothing 'v.straight' MIDDLE (XH / 2)
turned 'turnv.curly' nothing 'v.curly' MIDDLE (XH / 2)
select-variant 'turnv' 0x474 (follow -- 'Lambda')
sketch # nu
include markset.e
local xmid : MIDDLE + HALFSTROKE * 0.75
include : dispiro
g4 (SB + 0.4 * STROKE * HVCONTRAST) (XH - O) [widths.rhs]
bezcontrols 0.33 0.2 1 0.76 6 important
g4.down.end xmid 0 [heading DOWNWARD]
include : dispiro
widths.rhs
flat RIGHTSB XH [heading DOWNWARD]
curl RIGHTSB (XH * 0.9) [heading DOWNWARD]
quadcontrols 0 0.3 6
g4 xmid 0
save 'nu' 0x3BD
list VShape VShapeOutline
### A
define { LambdaShape AMaskShape DeltaShape } : do "A and related =============================="
define [AMaskShape top sw barStraight div] : create-glyph : glyph-construction
include : VShapeOutline top sw barStraight div
include : FlipAround ([DivFrame div].width / 2) (top / 2)
sketch # A
set-width WIDTH
include markset.capital
set-anchor 'trailing' BASE (RIGHTSB - markHalfStroke) 0
branch
include : VShape CAP STROKE true
include : FlipAround MIDDLE (CAP / 2)
include : intersection
HBarTop 0 WIDTH (XH / 2)
AMaskShape CAP STROKE true 1
# include : AMaskShape CAP STROKE true 1
save 'A.straight'
save 'Alpha.straight'
save 'cyrA.straight'
branch
include : VShape CAP STROKE false
include : FlipAround MIDDLE (CAP / 2)
include : intersection
HBarTop 0 WIDTH (XH / 2)
AMaskShape CAP STROKE false 1
save 'A.curly'
save 'Alpha.curly'
save 'cyrA.curly'
select-variant 'A' 'A'
select-variant 'Alpha' 0x391 (follow -- 'A')
select-variant 'cyrA' 0x410 (follow -- 'A')
turned 'turnA.straight' nothing 'A.straight' MIDDLE (CAP / 2)
turned 'turnA.curly' nothing 'A.curly' MIDDLE (CAP / 2)
select-variant 'turnA' 0x2C6F (follow -- 'A')
# Lambda
define [LambdaShape top sw barStraight div] : glyph-construction
local df : DivFrame [fallback div 1]
include : VShape top sw barStraight div
include : FlipAround df.middle (top / 2)
if SLAB : begin
include : CenterBottomSerif (SB + sw / 2 * HVCONTRAST) 0 JUT
tag-contour 'serif'
include : CenterBottomSerif (RIGHTSB - sw / 2 * HVCONTRAST) 0 JUT
tag-contour 'serif'
sketch # Lambda
include markset.capital
branch
include : LambdaShape CAP STROKE true
save 'Lambda.straight'
save 'latinLambda.straight'
branch
include : LambdaShape CAP STROKE false
save 'Lambda.curly'
save 'latinLambda.curly'
select-variant 'Lambda' 0x39B
select-variant 'latinLambda' 0x245 (follow -- 'Lambda')
# Delta
define [DeltaShape top sw barStraight div] : glyph-construction
include : LambdaShape top sw barStraight div
eject-contour 'serif'
include : intersection
HBarBottom 0 WIDTH 0 sw
AMaskShape top sw barStraight div
sketch # Delta
include markset.capital
branch
include : DeltaShape CAP STROKE true
save 'Delta.straight'
branch
include : DeltaShape CAP STROKE false
save 'Delta.curly'
select-variant 'Delta' 0x394
list LambdaShape AMaskShape DeltaShape
### a
do "a and related ============================================================================="
sketch # a.doublestorey
set-width WIDTH
include markset.e
set-anchor 'trailing' BASE (RIGHTSB - markHalfStroke) 0
local stroke : adviceBlackness2 2.875 2 XH
local bartop (XH * OVERLAYPOS * 1.02 + stroke / 2)
local lowslope : shoulderMidSlope SHOULDERFINE nothing (-1)
local lowmiddle : [mix (SB + OX) (RIGHTSB - stroke / 2 * HVCONTRAST) [linreg 72 0.51 126 0.58 stroke]] + CORRECTION_OMIDS * 0.5
local barsmooth : mix SB RIGHTSB 0.55
include : dispiro
widths.lhs stroke
flat RIGHTSB 0 [heading UPWARD]
curl RIGHTSB (XH - SMOOTHB * [linreg 18 0.9 126 0.81 stroke])
hookend XO
g4 (SB - OXHOOK / 2) (XH - AHOOK)
include : dispiro
widths.lhs stroke
flat (RIGHTSB + O) bartop [heading LEFTWARD]
curl barsmooth bartop
archv
g4 (SB + OX) (bartop * 0.95 * (SMALLSMOOTHB / (SMALLSMOOTHA + SMALLSMOOTHB)))
arcvh
g4 (lowmiddle + (-lowslope) * stroke) O [heading {.y 1 .x lowslope}]
archv 16
straight.up.end (RIGHTSB - stroke * HVCONTRAST + SHOULDERFINE * HVCONTRAST) (SMALLSMOOTHB * 0.9) [widths.lhs SHOULDERFINE]
if SLAB : begin
include : tagged 'serifRB' : RightwardBottomSerif RIGHTSB 0 SIDEJUT
save 'a.doublestorey'
sketch # a.singlestorey
set-width WIDTH
include markset.e
set-anchor 'trailing' BASE (RIGHTSB - markHalfStroke) 0
include : OBarRightShape
if SLAB
: then : begin
include : VBarRight RIGHTSB 0 XH
include : RightwardBottomSerif RIGHTSB 0 SIDEJUT
tag-contour 'serifRB'
: else : begin
include : dispiro
widths.rhs
flat RIGHTSB XH [heading DOWNWARD]
curl RIGHTSB SMOOTHA [heading DOWNWARD]
g4 [mix SB RIGHTSB (1 + 0.4 * TANSLANT)] 0 [heading DOWNWARD]
set-anchor 'bottomright' BASE [mix SB RIGHTSB 1.075] 0
save 'a.singlestorey'
select-variant 'a' 'a'
alias 'cyra' 0x430 'a'
sketch # turnlargescripta
include markset.capital
include : OBarRightShape CAP
start-from RIGHTSB 0
line-to (RIGHTSB - STROKE * HVCONTRAST) 0
line-to (RIGHTSB - STROKE * HVCONTRAST) (CAP - STROKE / 2)
line-to RIGHTSB (CAP - O)
save 'largescripta' 0x2C6D
include : FlipAround MIDDLE (CAP / 2)
save 'turnlargescripta' 0x2C70
sketch # scripta
include markset.e
include : OBarRightShape
start-from RIGHTSB 0
line-to (RIGHTSB - STROKE * HVCONTRAST) 0
line-to (RIGHTSB - STROKE * HVCONTRAST) (XH - STROKE / 2)
line-to RIGHTSB (XH - O)
if SLAB : begin
include : RightwardBottomSerif RIGHTSB 0 SIDEJUT
tag-contour 'serifRB'
save 'scripta' 0x0251
turned 'turna' 0x250 'a.doublestorey' MIDDLE (XH / 2)
turned nothing 0x252 'scripta' MIDDLE (XH / 2)
sketch # artail
include glyphs.'a.doublestorey' AS_BASE
eject-contour 'serifRB'
include glyphs.rtailBR
save 'artail' 0x1D8F
### W and w
do "W, w and related ========================================================================="
define [WShape top barStraight df] : glyph-construction
local fineOuter : if barStraight
adviceBlackness WShape.fineSOuter [Math.sqrt df.div]
adviceBlackness WShape.fineOuter df.div
local fineInner : if barStraight
adviceBlackness WShape.fineSInner [Math.sqrt df.div]
adviceBlackness WShape.fineInner df.div
local fineHeight : (fineOuter + fineInner) / 2
local hwCO : if barStraight
(1 / 2) * [adviceBlackness WShape.hwCOS df.div]
(1 / 2) * [adviceBlackness WShape.hwCO df.div]
local delimBias : hwCO * HVCONTRAST
local fineOffsetOuter : hwCO * HVCONTRAST
local fineOffsetInner : hwCO * HVCONTRAST
local m1 : [mix (df.leftSB + delimBias) (df.rightSB - delimBias) : if barStraight WShape.m1S WShape.m1] + [if barStraight O 0]
local m2 : [mix (df.leftSB + delimBias) (df.rightSB - delimBias) : if barStraight WShape.m2S WShape.m2] - [if barStraight O 0]
local wMidHeight : if barStraight (top * [Math.min 1 (df.div * 0.9)]) (top * 0.6)
if barStraight : begin
include : dispiro
widths.lhs
flat (df.leftSB + O * 2) top [heading DOWNWARD]
g4 (m1 - fineOffsetOuter) 0 [widths.lhs fineOuter]
: else : begin
include : dispiro
widths.lhs
flat df.leftSB top [heading DOWNWARD]
curl df.leftSB (top * 0.75) [heading DOWNWARD]
quadcontrols 0 0.3 6 unimportant
g4 (m1 - fineOffsetOuter) 0 [widths.lhs fineOuter]
# bottom cap 1
define [InnerShapes] : union
spiro-outline
corner (m1 + fineOffsetInner) 0
corner (m1 - fineOffsetOuter) 0
corner m1 fineHeight
spiro-outline
corner (df.middle + fineOffsetInner) wMidHeight
corner df.middle (wMidHeight - fineHeight)
corner (df.middle - fineOffsetInner) wMidHeight
spiro-outline
corner (m2 + fineOffsetOuter) 0
corner (m2 - fineOffsetInner) 0
corner m2 fineHeight
dispiro
widths.lhs fineInner
flat (df.middle - fineOffsetInner) wMidHeight
curl (m1 + fineOffsetInner) 0 [widths.rhs fineInner]
dispiro
widths.rhs fineInner
flat (df.middle + fineOffsetInner) wMidHeight
curl (m2 - fineOffsetInner) 0 [widths.lhs fineInner]
define [InnerStrokeMask] : union
spiro-outline
corner 0 0
corner df.width 0
corner df.width (-df.width)
corner 0 (-df.width)
spiro-outline
corner 0 wMidHeight
corner df.width wMidHeight
corner df.width (wMidHeight + df.width)
corner 0 (wMidHeight + df.width)
include : difference [InnerShapes] [InnerStrokeMask]
if barStraight : begin
include : dispiro
widths.rhs
flat (df.rightSB - O * 2) top [heading DOWNWARD]
g4 (m2 + fineOffsetOuter) 0 [widths.rhs fineOuter]
: else : begin
include : dispiro
widths.rhs
flat df.rightSB top [heading DOWNWARD]
curl df.rightSB (top * 0.75) [heading DOWNWARD]
quadcontrols 0 0.3 6 unimportant
g4 (m2 + fineOffsetOuter) 0 [widths.rhs fineOuter]
include : AIVSerifs top df.leftSB df.rightSB
set WShape.fineOuter 5
set WShape.fineInner 6
set WShape.fineSOuter 5.5
set WShape.fineSInner 5.5
set WShape.hwCO 5
set WShape.hwCOS 3.5
set WShape.m1 0.25
set WShape.m2 : 1 - WShape.m1
set WShape.m1S 0.235
set WShape.m2S : 1 - WShape.m1S
sketch # W
local df : DivFrame para.diversityM 3
set-width df.width
include df.markSet.capital
branch
include : WShape CAP true df
save 'W.straight'
save 'cyrWe.straight'
branch
include : WShape CAP false df
save 'W.curly'
save 'cyrWe.curly'
sketch # w
local df : DivFrame para.diversityM 3
set-width df.width
include df.markSet.e
branch
include : WShape XH true df
save 'w.straight'
save 'cyrwe.straight'
branch
include : WShape XH false df
save 'w.curly'
save 'cyrwe.curly'
define [WHooktopShape top barStraight df] : glyph-construction
local fineOuter : if barStraight
adviceBlackness WShape.fineSOuter [Math.sqrt df.div]
adviceBlackness WShape.fineOuter df.div
local hwCO : if barStraight
(1 / 2) * [adviceBlackness WShape.hwCOS df.div]
(1 / 2) * [adviceBlackness WShape.hwCO df.div]
local delimBias : hwCO * HVCONTRAST
local fineOffsetOuter : hwCO * HVCONTRAST
local fineOffsetInner : hwCO * HVCONTRAST
local m2 : [mix (df.leftSB + delimBias) (df.rightSB - delimBias) : if barStraight WShape.m2S WShape.m2] - [if barStraight O 0]
include : WShape top barStraight df
# Eject unnecessary contours
this.contours.pop
if SLAB : begin
local s : this.contours.pop
this.contours.pop
this.contours.push s
include : dispiro
widths.rhs
straight.down.start df.rightSB (top - HOOK) [heading DOWNWARD]
quadcontrols 0 0.3 6 unimportant g2
g4 (m2 + fineOffsetOuter) 0 [widths.rhs fineOuter]
include : VerticalHook (df.rightSB - HALFSTROKE * HVCONTRAST) (top - HOOK) (HOOKX * 0.65) (-HOOK + HALFSTROKE)
sketch # Whooktop
local df : DivFrame para.diversityM 3
set-width df.width
include df.markSet.capital
branch
include : WHooktopShape CAP true df
save 'Whooktop.straight'
branch
include : WHooktopShape CAP false df
save 'Whooktop.curly'
sketch # whooktop
local df : DivFrame para.diversityM 3
set-width df.width
include df.markSet.e
branch
include : WHooktopShape XH true df
save 'whooktop.straight'
branch
include : WHooktopShape XH false df
save 'whooktop.curly'
define [LowerWWShape df straightBar] : glyph-construction
include : WShape (CAP / 2) straightBar df
apply-transform : Upright
apply-transform : Translate 0 (CAP / 2)
apply-transform : Italify
include : WShape (CAP / 2) straightBar df
sketch # ww
local df : DivFrame 1 3
set-width df.width
include df.markSet.capital
branch
include : LowerWWShape df true
save 'ww.straight'
branch
include : LowerWWShape df false
save 'ww.curly'
select-variant 'W' 'W'
select-variant 'cyrWe' 0x51C (follow -- 'W')
select-variant 'Whooktop' 0x2C72 (follow -- 'W')
select-variant 'w' 'w'
select-variant 'cyrwe' 0x51D (follow -- 'w')
select-variant 'ww' 0x2AC (follow -- 'w')
select-variant 'whooktop' 0x2C73 (follow -- 'w')
turned 'turnw.straight' nothing 'w.straight' (MIDDLE * para.diversityM) (XH / 2)
turned 'turnw.curly' nothing 'w.curly' (MIDDLE * para.diversityM) (XH / 2)
select-variant 'turnw' 0x28D (follow -- 'w')
### X and x
do "X, x and related =========================================================================="
sketch # X
set-width WIDTH
include markset.capital
branch
include : xStrand true SB 0 RIGHTSB CAP 0.1 0.4 0.28
include : xStrand true SB CAP RIGHTSB 0 0.1 0.4 0.28
include : AIHSerifs CAP
save 'X.straight' 'X'
save 'Chi.straight' 0x3A7
save 'cyrHa.straight' 0x425
branch
include : CyrDescender RIGHTSB
save 'cyrHadescender.straight'
branch
include : xStrand false SB 0 RIGHTSB CAP 0.1 0.4 0.28
include : xStrand false SB CAP RIGHTSB 0 0.1 0.4 0.28
include : AIHSerifs CAP
save 'X.curly' 'X'
save 'Chi.curly' 0x3A7
save 'cyrHa.curly' 0x425
branch
include : CyrDescender RIGHTSB
save 'cyrHadescender.curly'
sketch # x
include markset.e
local TURN (XH * 0.1)
branch
include : xStrand true SB 0 RIGHTSB XH 0.02 0.4 0.14
include : xStrand true SB XH RIGHTSB 0 0.02 0.4 0.14
include : AIHSerifs XH
save 'x.straight' 'x'
save 'cyrha.straight' 0x445
branch
include : CyrDescender RIGHTSB
save 'cyrhadescender.straight'
branch
include : xStrand false SB 0 RIGHTSB XH 0.02 0.4 0.14
include : xStrand false SB XH RIGHTSB 0 0.02 0.4 0.14
include : AIHSerifs XH
save 'x.curly' 'x'
save 'cyrha.curly' 0x445
branch
include : CyrDescender RIGHTSB
save 'cyrhadescender.curly'
sketch # chi
set-width WIDTH
include markset.p
branch
include : xStrand true SB DESCENDER RIGHTSB XH 0.05 0.4 0.11
include : xStrand true SB XH RIGHTSB DESCENDER 0.05 0.4 0.11
save 'chi.straight' 0x3C7
save 'latinchi.straight' 0xAB53
branch
include : xStrand false SB DESCENDER RIGHTSB XH 0.05 0.4 0.11
include : xStrand false SB XH RIGHTSB DESCENDER 0.05 0.4 0.11
save 'chi.curly' 0x3C7
save 'latinchi.curly' 0xAB53
select-variant 'X' 'X'
select-variant 'Chi' 0x3A7 (follow -- 'X')
select-variant 'cyrHa' 0x425 (follow -- 'X')
select-variant 'cyrHadescender' 0x4B2 (follow -- 'X')
select-variant 'x' 'x'
select-variant 'cyrha' 0x445 (follow -- 'x')
select-variant 'chi' 0x3C7 (follow -- 'x')
select-variant 'latinchi' 0xAB53 (follow -- 'x')
select-variant 'cyrhadescender' 0x4B3 (follow -- 'x')
### Y
do "Y and related ============================================================================"
define [YShape straightBar top bot] : glyph-construction
local cross : mix [fallback bot 0] top 0.4
include : halfXStrand straightBar SB top MIDDLE cross 0.1 0.4 0.28
include : halfXStrand straightBar RIGHTSB top MIDDLE cross 0.1 0.4 0.28
tag-contour 'strokeRT'
include : VBar MIDDLE [fallback bot 0] (cross + HALFSTROKE)
set-anchor 'overlay' BASE MIDDLE cross
if SLAB : begin
include : AIVSerifs top
include : CenterBottomSerif MIDDLE [fallback bot 0] JUT
sketch # Y
include markset.capital
branch
include : YShape true CAP
save 'Y.straight'
save 'Upsilon.straight'
save 'cyrUe.straight'
branch
include : YShape false CAP
save 'Y.curly'
save 'Upsilon.curly'
save 'cyrUe.curly'
define [YHookTopShape straightBar] : glyph-construction
include : YShape straightBar CAP
eject-contour 'strokeRT'
eject-contour 'serifRT'
local cross (CAP * 0.4)
include : dispiro
widths.rhs
straight.left.start (RIGHTSB + HOOKX / 3) (CAP - STROKE)
g4 (RIGHTSB - HOOKX / 3) (CAP - HOOK)
quadcontrols 0.55 0.7 32 unimportant
g4 (MIDDLE + STROKE / 2 * HVCONTRAST) cross
end [function : set this.loose true]
sketch # Yhooktop
include markset.capital
branch
include : YHookTopShape true
save 'Yhooktop.straight'
branch
include : YHookTopShape false
save 'Yhooktop.curly'
sketch # cyrue
include markset.p
branch
include : YShape true XH DESCENDER
save 'cyrue.straight'
branch
include : YShape false XH DESCENDER
save 'cyrue.curly'
sketch # smcpY
include markset.e
branch
include : YShape true XH
save 'smcpY.straight'
branch
include : YShape true XH
save 'smcpY.curly'
select-variant 'Y' 'Y'
select-variant 'Yhooktop' 0x1B3 (follow -- 'Y')
select-variant 'smcpY' 0x28F (follow -- 'Y')
select-variant 'Upsilon' 0x3A5 (follow -- 'Y')
select-variant 'cyrUe' 0x4AE (follow -- 'Y')
select-variant 'cyrue' 0x4AF (follow -- 'Y')
### y
do "y and related ============================================================================"
define [GenSmallYShape straightBar] : begin
local useCurlyBottom : para.isItalic || SLAB || straightBar
local px1 0.84
local py1 : linreg 18 0.8 126 0.76 STROKE
local px2 0.95
local py20 0.88
local py2 : if useCurlyBottom 0.97 py20
local pds 0.05
local pds2 0.01
local dpy1 : (1 - [linreg (1 - px2) (1 - py2) px1 py1 1]) / (1 - py1)
local dpy20 : (1 - [linreg (1 - px1) (1 - py1) px2 py20 1]) / (1 - py20)
local dpy2 : (1 - [linreg (1 - px1) (1 - py1) px2 py2 1]) / (1 - py2)
local yrstrokel0 : MIDDLE - WIDTH * 0.1
local yrstrokel : MIDDLE - WIDTH * 0.1 + (STROKE * HVCONTRAST * [if useCurlyBottom (2 / 3) (1 / 3)])
local ySbCor : (XH / CAP) * (OX * [if SLAB 1 4])
local yrstroker : RIGHTSB - [if straightBar ySbCor 0]
local yshrink : [linreg 18 1 126 0.85 STROKE] * [if straightBar ([adviceBlackness 3.25] / STROKE) 1]
local slabysize : JUT * (WIDTH / UPM) + STROKE
local slabyvx 0.7
define [CalcDS top bottom] : begin
local ds : (top - bottom) * pds
local ds2 : (top - bottom) * pds2 + [if useCurlyBottom (slabysize * slabyvx) 0]
return {ds ds2}
define [yTopKnots x top ds dir dx dy] : begin
local hs : HALFSTROKE * [diagCor dy dx 0 (STROKE * 2)]
local hl : hs - hs * dir
local hr : hs + hs * dir
if straightBar : return : list
flat x top [widths.heading hl hr DOWNWARD]
: else : return : list
flat x top [widths.heading hl hr DOWNWARD]
curl x (top - ds) [widths.heading hl hr DOWNWARD]
quadcontrols 0 dpy1 16
define [yBaseKnots top bottom shrink hooktop] : begin
local {ds ds2} : CalcDS top bottom
return : list
if (straightBar && (! hooktop))
then : list
else : list
flat
mix yrstrokel yrstroker px1
mix (bottom + ds2) (top - ds) py1
curl
mix yrstrokel yrstroker (1 - px2)
mix (bottom + ds2) (top - ds) (1 - py2)
widths.rhs : STROKE * [if useCurlyBottom shrink 1]
if useCurlyBottom
then : list
flat (yrstrokel - slabysize) bottom [widths.rhs]
curl
Math.min (yrstrokel - slabysize - 0.1) (yrstrokel - STROKE - JUT)
begin bottom
else : list
quadcontrols 1 (1 - dpy2) 16
flat yrstrokel (bottom + ds2) [widths.heading 0 STROKE DOWNWARD]
curl yrstrokel bottom [widths.heading 0 STROKE DOWNWARD]
define [yJoinProportion hooktop x] : linreg
1 - px2
1 - py2
if (straightBar && !hooktop) 1 px1
if (straightBar && !hooktop) 1 py1
(x - yrstrokel) / (yrstroker - yrstrokel)
define [yJoinHeight ds ds2 top bottom hooktop] : begin
return : mix (bottom + ds2) (top - ds) [yJoinProportion hooktop MIDDLE]
define [yJoinKnots ds ds2 top bottom hooktop] : begin
return : list
if straightBar : then : list
: else : list
flat
mix (WIDTH - yrstrokel) (WIDTH - yrstroker) px1
mix (bottom + ds2) (top - ds) py1
curl MIDDLE
yJoinHeight ds ds2 top bottom hooktop
widths.lhs (STROKE * yshrink)
define [SmallYStrokeSplitMask top bottom hooktop dir elev] : begin
local {ds ds2} : CalcDS top bottom
local jp0 : yJoinProportion hooktop (WIDTH / 2 - WIDTH / 2 * dir)
local jp1 : yJoinProportion hooktop (WIDTH / 2 + WIDTH / 2 * dir)
local hs : 0.75 * STROKE
local yLeft : [mix (bottom + ds2) (top - ds) jp1] + hs - [fallback elev 0]
local yRight : [mix (bottom + ds2) (top - ds) jp0] + hs - [fallback elev 0]
local yMin : Math.min bottom yLeft yRight
return : spiro-outline
corner WIDTH yMin
corner WIDTH yRight
corner 0 yLeft
corner 0 yMin
define [SmallYShape top bottom] : glyph-construction
local {ds ds2} : CalcDS top bottom
include : intersection
SmallYStrokeSplitMask top bottom false 1
dispiro
yTopKnots yrstroker top ds 1 WIDTH (top - bottom)
yBaseKnots top bottom 1
include : difference
dispiro
yTopKnots yrstroker top ds 1 WIDTH (top - bottom)
yBaseKnots top bottom yshrink
SmallYStrokeSplitMask top bottom false 1 1
include : difference
dispiro
yTopKnots (WIDTH - yrstroker) top ds (-1) WIDTH (top - bottom)
yJoinKnots ds ds2 top bottom
SmallYStrokeSplitMask top bottom false (-1)
if SLAB : begin
include : AIVSerifs top
define [SmallYHookTopShape top bottom] : glyph-construction
local ds : (top - bottom) * pds
local ds2 : (top - bottom) * pds2 + [if useCurlyBottom (slabysize * slabyvx) 0]
local joinHeight : yJoinHeight ds ds2 top bottom true
include : intersection
SmallYStrokeSplitMask top bottom true 1
dispiro
widths.rhs
straight.left.start ([mix yrstrokel yrstroker px1] - HALFSTROKE + HOOKX) (XH - STROKE)
yBaseKnots top bottom 1 true
include : difference
dispiro
widths.rhs
straight.left.start ([mix yrstrokel yrstroker px1] - HALFSTROKE + HOOKX) (XH - STROKE)
yBaseKnots top bottom yshrink true
SmallYStrokeSplitMask top bottom true 1 1
include : difference
dispiro
widths.center
yTopKnots (WIDTH - yrstroker) top ds (-1) WIDTH (top - bottom)
yJoinKnots ds ds2 top bottom true
SmallYStrokeSplitMask top bottom true (-1)
if SLAB : begin
include : AIVSerifs top
eject-contour 'serifRT'
define [SmallLambdaShape top bottom] : glyph-construction
local ds : (top - bottom) * pds
local ds2 : (top - bottom) * pds2
local left yrstrokel0
local right : yrstroker - HALFSTROKE * HVCONTRAST
include : dispiro
widths.center
flat right bottom [heading UPWARD]
curl right (bottom + ds) [heading UPWARD]
quadcontrols 0 dpy1 16
flat [mix right left (1 - px1)] [mix (top - ds2) (bottom + ds) py1]
curl [mix right left px2] [mix (top - ds2) (bottom + ds) (1 - py20)]
quadcontrols 1 (1 - dpy20) 16
flat left (top - ds2) [heading UPWARD]
curl left top [heading UPWARD]
include : dispiro
widths.center
flat (WIDTH - right) bottom [heading UPWARD]
curl (WIDTH - right) (bottom + ds) [heading UPWARD]
quadcontrols 0 dpy1 16
flat [mix (WIDTH - left) (WIDTH - right) px1] [mix (top - ds2) (bottom + ds) py1]
curl MIDDLE [mix (top - ds2) (bottom + ds) [linreg (1 - px2) (1 - py20) px1 py1 ((MIDDLE - left) / (right - left))]]
return : object SmallYShape SmallYHookTopShape SmallLambdaShape
sketch # y.straight
include markset.p
branch
include : [GenSmallYShape true].SmallYShape XH DESCENDER
save 'y.straight'
save 'cyru.straight'
branch
include : [GenSmallYShape false].SmallYShape XH DESCENDER
save 'y.curly'
save 'cyru.curly'
sketch # y.curly
include markset.p
include : nShoulder
left -- (SB + STROKE * HVCONTRAST)
right -- RIGHTSB
fine -- SHOULDERFINE
include : FlipAround MIDDLE (XH / 2)
include : dispiro
widths.rhs
flat RIGHTSB XH [heading DOWNWARD]
curl RIGHTSB (DESCENDER + SMALLSMOOTHA)
hookend (DESCENDER + O)
g4 SB (DESCENDER + SHOOK)
if SLAB : begin
include : LeftwardTopSerif SB XH SIDEJUT
save 'y.cursive'
save 'cyru.cursive'
select-variant 'y' 'y'
select-variant 'cyru' 0x443 (follow -- 'y')
sketch # yhooktop
include markset.p
branch
include : [GenSmallYShape true].SmallYHookTopShape XH DESCENDER
save 'yhooktop.straight'
branch
include : [GenSmallYShape false].SmallYHookTopShape XH DESCENDER
save 'yhooktop.curly'
sketch # cyrU
include markset.capital
branch
include : [GenSmallYShape true].SmallYShape CAP 0
save 'cyrU.straight'
branch
include : [GenSmallYShape false].SmallYShape CAP 0
save 'cyrU.curly'
select-variant 'yhooktop' 0x1B4
select-variant 'cyrU' 0x423 (follow -- 'yhooktop')
turned 'turny.straight' nothing 'y.straight' MIDDLE (XH / 2) markset.b
turned 'turny.curly' nothing 'y.curly' MIDDLE (XH / 2) markset.b
select-variant 'turny' 0x28E (follow -- 'yhooktop')
sketch # lambda
include markset.b
include : [GenSmallYShape false].SmallLambdaShape CAP 0
save 'lambda' 0x3BB
sketch # lambdaslash
include glyphs.lambda AS_BASE
include : FlatSlashShape ([tp [Upright] glyphs.('l.serifed').anchors.above].x / para.diversityI) [mix 0 CAP 0.7] (OVERLAYSTROKE / 2)
save 'lambdaslash' 0x19B
### K and k
do "k and related ============================================================================"
local [KBalance straightBar] : if SLAB (WIDTH / 16) : if straightBar (WIDTH / 32) 0
local [KBalanceRight straightBar] : if SLAB (-WIDTH / 32) : if straightBar (WIDTH / 32) 0
local [KBalanceRightCursive straightBar] : if SLAB (WIDTH / 16) : if straightBar (WIDTH / 32) 0
define [KLegShape top straightBar] : glyph-construction
local turn (top * 0.99)
local fine : adviceBlackness 3.5
local Ok 0
local OkSerif 0
local kshLeft : SB + [KBalance straightBar]
local kshRight : RIGHTSB + [KBalanceRight straightBar]
if straightBar : do
local attach (top * 0.42 - STROKE)
local attach2 (top * 0.72 + STROKE)
set Ok : ([if SLAB (0) (-4)] * OX - STROKE / 3) * (XH / top)
set OkSerif : if SLAB 0 Ok
include : intersection
Rect top 0 0 UPM
dispiro
widths.rhs
flat (kshRight - Ok) top
curl (kshLeft + STROKE) attach [widths 0 fine]
include : intersection
spiro-outline
corner (kshLeft + STROKE) 0
corner (kshLeft + STROKE) (attach + 1)
corner (kshRight - Ok - 1) top
corner (kshRight - Ok) top
corner (kshRight - Ok) 0
dispiro
widths.lhs
flat (kshRight - Ok) 0
curl (kshLeft + STROKE) attach2
: else : do
local attach (top * [if SLAB 0.325 0.375])
local attach2 [if SLAB [mix kshLeft kshRight 0.48] MIDDLE]
include : dispiro
g4.down.start (kshRight) top [widths.heading 0 (STROKE * [if SLAB 1.15 1.05] * (WIDTH * 2 / UPM)) DOWNWARD]
bezcontrols 0 0.2 0.5 0.65 8
g4 (kshLeft + STROKE) attach [widths 0 fine]
include : dispiro
widths.center
g4.up.start (kshRight - O - HALFSTROKE * HVCONTRAST) 0 [heading UPWARD]
quadcontrols 0 0.25 8
g4 attach2 (top * 0.61) [widths.center fine]
if SLAB : do
local topSerifX : kshRight - OkSerif - (STROKE * [if SLAB 1.15 1.05] * (WIDTH * 2 / UPM) / 2 - HALFSTROKE) * HVCONTRAST * [if para.isItalic 1 0] - HALFSTROKE * 0.5 * HVCONTRAST
local bottomSerifX : kshRight - OkSerif - O * [if para.isItalic 1 0]
include : RightwardTopSerif topSerifX top (SIDEJUT + HALFSTROKE * 0.5 * HVCONTRAST)
include : RightwardBottomSerif bottomSerifX 0 SIDEJUT
define [KCurlyLoopAndLegShape top straightBar] : glyph-construction
define kshLeft : SB + [KBalance straightBar]
define kshRight : RIGHTSB + [KBalanceRightCursive straightBar] + 0.2 * STROKE
define Ok 0
define arcFine SHOULDERFINE
define arcStroke : adviceBlackness2 2 3 top
define arcTerminalFine : adviceBlackness2 3 4 top
define st : shoulderMidSlope arcFine arcStroke 1
define arcMaxPropX : 0.8 + 2 * (arcStroke / WIDTH)
define startPropY : 0.46 + 0.1 * (arcStroke / WIDTH)
define arcTopPropX : 0.56 + 0.2 * (arcStroke / WIDTH)
define arcMaxXPropY : 0.6 - 1 * (arcStroke / WIDTH)
define arcEndPropX : 0.15 - 0.5 * (arcStroke / WIDTH)
define arcEndPropY : 0.45 + 0.2 * (arcStroke / WIDTH)
define arcStartX : kshLeft + HVCONTRAST * (STROKE - arcFine)
define arcMaxX : kshRight * 0.9 - Ok
define arcTopY : top - O
define arcTerminalX : mix arcStartX kshRight arcEndPropX
define arcTerminalY : mix 0 top arcEndPropY
define barEndX : kshRight - Ok
include : difference
dispiro
g2.up.start arcStartX (top * startPropY) [widths.heading 0 arcFine UPWARD]
arcvh
g2.right.mid [mix arcStartX arcMaxX arcTopPropX] arcTopY [widths.heading 0 arcStroke {.y (+1) .x (+st)}]
archv
g2.down.mid arcMaxX [mix arcTerminalY top arcMaxXPropY] [heading DOWNWARD]
quadcontrols 0 0.7
g2 arcTerminalX arcTerminalY [widths arcTerminalFine 0]
spiro-outline
corner 0 0
corner 0 arcTerminalY
corner arcTerminalX arcTerminalY
corner barEndX 0
include : intersection
Rect [mix 0 top arcEndPropY] 0 0 UPM
dispiro
flat arcTerminalX arcTerminalY [widths.lhs]
curl barEndX 0 [widths.rhs]
define [KShape straightBar] : glyph-construction
include : VBarLeft (SB + [KBalance straightBar]) 0 CAP
include : KLegShape CAP straightBar
if SLAB : begin
include : CenterTopSerif (SB + [KBalance straightBar] + HALFSTROKE * HVCONTRAST) CAP JUT
include : CenterBottomSerif (SB + [KBalance straightBar] + HALFSTROKE * HVCONTRAST) 0 JUT
sketch # K
set-width WIDTH
include markset.capital
include : KShape true
branch
save 'K.straight'
save 'Kappa.straight'
save 'cyrKa.straight'
branch
include : CyrDescender (RIGHTSB - O)
save 'cyrKaDescender.straight'
sketch # K
set-width WIDTH
include markset.capital
include : KShape false
branch
save 'K.curly'
save 'Kappa.curly'
save 'cyrKa.curly'
branch
include : CyrDescender (RIGHTSB - O)
save 'cyrKaDescender.curly'
select-variant 'K' 'K'
select-variant 'Kappa' 0x39A (follow -- 'K')
select-variant 'cyrKa' 0x41A (follow -- 'K')
select-variant 'cyrKaDescender' 0x49A (follow -- 'K')
define [LowerKShape straightBar] : glyph-construction
include : VBarLeft (SB + [KBalance straightBar]) 0 CAP
include : KLegShape XH straightBar
if SLAB : begin
include : LeftwardTopSerif (SB + [KBalance straightBar]) CAP SIDEJUT
if (!para.isItalic) : begin
include : CenterBottomSerif (SB + [KBalance straightBar] + HALFSTROKE * HVCONTRAST) 0 JUT
tag-contour 'serifLB'
define [LowerKCursiveShape straightBar] : glyph-construction
include : VBarLeft (SB + [KBalance straightBar]) 0 CAP
include : KCurlyLoopAndLegShape XH straightBar
if SLAB : begin
include : LeftwardTopSerif (SB + [KBalance straightBar]) CAP SIDEJUT
sketch # k.straight
set-width WIDTH
include markset.b
include : LowerKShape true
save 'k.straight'
sketch # k.curly
set-width WIDTH
include markset.b
include : LowerKShape false
save 'k.curly'
sketch # k
set-width WIDTH
include markset.b
include : LowerKCursiveShape true
save 'k.cursive'
select-variant 'k' 'k'
define [LowerKappaShape straightBar] : glyph-construction
include : VBarLeft (SB + [KBalance straightBar]) 0 XH
include : KLegShape XH straightBar
if SLAB : begin
include : LeftwardTopSerif (SB + [KBalance straightBar]) XH SIDEJUT
sketch # kappa
set-width WIDTH
include markset.e
include : LowerKappaShape true
save 'kappa.straight'
sketch # kappa
set-width WIDTH
include markset.e
include : LowerKappaShape false
save 'kappa.curly'
select-variant 'kappa' 0x3BA (follow -- 'K')
define [LowerCyrKaShape straightBar] : glyph-construction
include : VBarLeft (SB + [KBalance straightBar]) 0 XH
include : KLegShape XH straightBar
if SLAB : begin
include : CenterBottomSerif (SB + [KBalance straightBar] + HALFSTROKE * HVCONTRAST) 0 JUT
include : CenterTopSerif (SB + [KBalance straightBar] + HALFSTROKE * HVCONTRAST) XH JUT
sketch # cyrka
set-width WIDTH
include markset.e
include : LowerCyrKaShape true
branch
save 'cyrka.straight'
save 'latinkappa.straight'
branch
include : CyrDescender (RIGHTSB - O)
save 'cyrkaDescender.straight'
sketch # cyrka
set-width WIDTH
include markset.e
include : LowerCyrKaShape false
branch
save 'cyrka.curly'
save 'latinkappa.curly'
branch
include : CyrDescender (RIGHTSB - O)
save 'cyrkaDescender.curly'
select-variant 'cyrka' 0x43A (follow -- 'K')
select-variant 'latinkappa' 0x138 (follow -- 'K')
select-variant 'cyrkaDescender' 0x49B (follow -- 'K')
define [KHookTopShape straightBar] : glyph-construction
include : KLegShape CAP straightBar
include : VBarLeft (SB + [KBalance straightBar]) 0 (CAP - HOOK - HALFSTROKE)
include : VerticalHook (SB + [KBalance straightBar] + HALFSTROKE * HVCONTRAST) (CAP - HOOK - HALFSTROKE) HOOKX (-HOOK)
sketch # Khooktop
include markset.capital
include : KHookTopShape true
save 'Khooktop.straight'
sketch # Khooktop
include markset.capital
include : KHookTopShape false
save 'Khooktop.curly'
select-variant 'Khooktop' 0x198 (follow -- 'K')
define [LowerKHookTopShape straightBar] : glyph-construction
include : KLegShape XH straightBar
include : VBarLeft (SB + [KBalance straightBar]) 0 (CAP - HOOK - HALFSTROKE)
include : VerticalHook (SB + [KBalance straightBar] + HALFSTROKE * HVCONTRAST) (CAP - HOOK - HALFSTROKE) HOOKX (-HOOK)
sketch # khooktop.straight
include markset.b
include : LowerKHookTopShape true
save 'khooktop.straight'
sketch # khooktop.curly
include markset.b
include : LowerKHookTopShape true
save 'khooktop.curly'
select-variant 'khooktop' 0x199 (follow -- 'K')
turned 'turnK.straight' nothing 'K.straight' MIDDLE (CAP / 2)
turned 'turnK.curly' nothing 'K.curly' MIDDLE (CAP / 2)
select-variant 'turnK' 0xA7B0 (follow -- 'K')
turned 'turnk.straight' nothing 'k.straight' MIDDLE (XH / 2) markset.p
turned 'turnk.curly' nothing 'k.curly' MIDDLE (XH / 2) markset.p
turned 'turnk.cursive' nothing 'k.cursive' MIDDLE (XH / 2) markset.p
select-variant 'turnk' 0x29E (follow -- 'k')
### B
do "B and related ============================================================================="
define [BShape top] : glyph-construction
local stroke : adviceBlackness2 2.875 2 XH
local bowl : top * 0.52 + stroke / 2
local barleft SB
local curvleft : RIGHTSB - SB * 0.5 - (top - (bowl - stroke)) * 0.45
local curvleftTop : Math.min curvleft (RIGHTSB - SB * 0.5 - OX - stroke * 1.375)
local fine : stroke * CTHIN
include : dispiro
widths.rhs stroke
flat (barleft - O) top [heading RIGHTWARD]
curl (curvleftTop - CORRECTION_OMIDS) top
archv
g4 (RIGHTSB - SB * 0.5 - OX * 2) [mix top (bowl - stroke) (SMOOTHB / (SMOOTHA + SMOOTHB))]
arcvh
flat (curvleftTop + CORRECTION_OMIDS) (bowl - fine) [widths.rhs fine]
curl (barleft - O) (bowl - fine) [heading LEFTWARD]
include : dispiro
widths.rhs fine
flat (barleft - O) (bowl - stroke + fine) [heading RIGHTWARD]
curl (curvleft - CORRECTION_OMIDS) (bowl - stroke + fine)
archv
g4 (RIGHTSB - OX * 2) [mix bowl 0 (SMOOTHB / (SMOOTHA + SMOOTHB))] [widths.rhs stroke]
arcvh
flat (curvleft + CORRECTION_OMIDS) 0
curl (barleft - O) 0 [heading LEFTWARD]
include : VBarLeft barleft 0 top stroke
if SLAB : begin
include : LeftwardTopSerif barleft top SIDEJUT
tag-contour 'serifLT'
include : LeftwardBottomSerif barleft 0 SIDEJUT
tag-contour 'serifLB'
sketch # B
set-width WIDTH
include markset.capital
include : BShape CAP
save 'B' 'B'
save 'Beta' 0x392
save 'cyrVe' 0x412
sketch # Bhookleft
include glyphs.B AS_BASE
eject-contour "serifLT"
include : LeftHook SB CAP
save 'Bhookleft' 0x181
define [ItalicCyrveShape top] : glyph-construction
local stroke : adviceBlackness2 2.875 2 top
local mid : mix RIGHTSB SB 0.65
local midy : top * BARPOS
local smb : top - [mix (midy + stroke / 2) (top - O - stroke) (SMOOTHA / (SMOOTHA + SMOOTHB))] + TANSLANT * HVCONTRAST * stroke
local sma : [mix (stroke + O) (midy - stroke / 2) (SMOOTHA / (SMOOTHA + SMOOTHB))] - TANSLANT * HVCONTRAST * stroke
include : dispiro
widths.lhs
flat mid (midy - stroke / 2) [heading RIGHTWARD]
curl MIDDLE (midy - stroke / 2)
archv
g4 (RIGHTSB + O) (top - smb)
arcvh
g4 (MIDDLE - CORRECTION_OMIDS) (top - O)
archv
flat.ai (SB + O) (top - SMALLSMOOTHA)
curl.ai (SB + O) SMALLSMOOTHB
arcvh
g4 (MIDDLE + CORRECTION_OMIDS) O
archv
g4 (RIGHTSB - O) (sma)
arcvh
flat MIDDLE (midy + stroke / 2)
curl mid (midy + stroke / 2) [heading LEFTWARD]
sketch # cyrve.italic
include markset.e
include : ItalicCyrveShape XH
save 'cyrve.italic'
save 'closeturnepsilon' 0x25E
sketch # cyrve.BGR
include markset.e
include : ItalicCyrveShape CAP
save 'cyrve.BGR'
sketch # cyrve.upright
include markset.e
include : BShape XH
save 'cyrve.upright'
save 'smcpB' 0x299
italic-variant 'cyrve' 0x432
sketch # Bbar
include glyphs.B AS_BASE
include : HOverlayBar [mix SB 0 0.7] [mix SB RIGHTSB 0.5] [mix 0 CAP 0.3] [Math.min ((CAP - STROKE * 3) / 4) OVERLAYSTROKE]
save 'Bbar' 0x243
sketch # beta
include markset.if
local ymiddle : [mix 0 CAP 0.55] - HALFSTROKE
local fine : STROKE * CTHIN
include : dispiro
widths.rhs
flat SB DESCENDER [heading UPWARD]
curl SB (CAP - SMALLSMOOTHA)
arcvh
g4 ([mix SB (RIGHTSB - OX + O * 3) 0.5] - CORRECTION_OMIDS) CAPO
archv
g4 (RIGHTSB - OX + O * 3) [mix CAP ymiddle 0.5]
arcvh
flat [mix SB (RIGHTSB - OX + O * 3) 0.5] (ymiddle + STROKE - fine) [widths.rhs fine]
curl [mix SB RIGHTSB 0.3] (ymiddle + STROKE - fine)
include : dispiro
widths.rhs fine
flat ([mix SB RIGHTSB 0.3] - (2 * fine - STROKE) * TANSLANT) (ymiddle + fine)
curl (RIGHTSB - ymiddle / 2 - HALFSTROKE) (ymiddle + fine)
archv
g4 (RIGHTSB - OX) [mix 0 (ymiddle + STROKE) 0.5] [widths.rhs]
arcvh
flat (RIGHTSB - ymiddle / 2 - HALFSTROKE) 0
curl (SB + HALFSTROKE) 0 [heading LEFTWARD]
save 'beta' 0x3B2
### b
do "b and related ============================================================================="
sketch # b
set-width WIDTH
include markset.b
include : OBarLeftShape
include : VBarLeft SB 0 CAP
if SLAB : begin
include : LeftwardTopSerif SB CAP SIDEJUT
tag-contour 'serifLT'
include : LeftwardBottomSerif SB 0 SIDEJUT
tag-contour 'serifLB'
save 'b' 'b'
sketch # bhooktop
include markset.b
include : OBarLeftShape
include : HooktopLeftBar
if SLAB : begin
include : LeftwardBottomSerif SB 0 SIDEJUT
tag-contour 'serifLB'
save 'bhooktop' 0x253
sketch # bbar
include glyphs.b AS_BASE
include : HOverlayBar [mix SB 0 0.7] [mix SB RIGHTSB 0.5] [mix XH CAP 0.45]
save 'bbar' 0x180
sketch # bdot
include glyphs.dotAbove
apply-transform : Translate (WIDTH + HALFSTROKE) 0
include glyphs.b AS_BASE
save 'bdot' 0x1E03
sketch # latinbe
include glyphs.b AS_BASE
include : HBarTop (SB - O) [mix SB RIGHTSB 0.9] CAP
if SLAB : begin
include : DownwardRightSerif [mix SB RIGHTSB 0.9] CAP VJUT
save 'latinbe' 0x183
sketch # zhuangtonesix
include glyphs.b AS_BASE
eject-contour 'serifLT'
local s : Math.max (XH * 0.1) STROKE
start-from (SB - O) CAP
line-to SB CAP
line-to (SB - s) (CAP - s)
line-to SB (CAP - s * 2)
line-to (SB - O) (CAP - s * 2)
reverse-last
save 'zhuangtonesix' 0x185
### D
do "D and related ============================================================================="
sketch # D
set-width WIDTH
include markset.capital
local dsmooth : Math.min (CAP * 0.499) (SMOOTH * 1.35)
local bsmooth : Math.min ((WIDTH - SB * 2) * 0.75) (SMOOTH * 1.1)
local barleft SB
include : VBarLeft barleft 0 CAP
include : dispiro
widths.rhs
flat (barleft - O) CAP [heading RIGHTWARD]
curl (RIGHTSB - bsmooth) CAP
archv
flat (RIGHTSB - OX) (CAP - dsmooth - (SMOOTHB - SMOOTH))
curl (RIGHTSB - OX) (dsmooth + (SMOOTHA - SMOOTH))
arcvh
flat (RIGHTSB - bsmooth) 0
curl (barleft - O) 0 [heading LEFTWARD]
if SLAB : begin
include : LeftwardTopSerif barleft CAP SIDEJUT
tag-contour 'serifLT'
include : LeftwardBottomSerif barleft 0 SIDEJUT
tag-contour 'serifLB'
save 'D' 'D'
sketch # arficanD
include glyphs.D AS_BASE
include : HOverlayBar (SB * 0.3) [mix (SB + STROKE) (RIGHTSB - STROKE) 0.55] (CAP * OVERLAYPOS)
save 'Eth' 0xD0
save 'Dcroat' 0x110
save 'arficanD' 0x189
sketch # Dhookleft
include glyphs.D AS_BASE
eject-contour "serifLT"
include : LeftHook SB CAP
save 'Dhookleft' 0x18A
### d
do "d and related ============================================================================="
sketch # d
set-width WIDTH
include markset.b
include : OBarRightShape
include : VBarRight RIGHTSB 0 CAP
if SLAB : begin
include : RightwardBottomSerif RIGHTSB 0 SIDEJUT
tag-contour 'serifRB'
include : LeftwardTopSerif (RIGHTSB - STROKE * HVCONTRAST) CAP SIDEJUT
save 'd' 'd'
sketch # dcroat
include glyphs.d AS_BASE
include : HBar [mix (SB + STROKE) (RIGHTSB - STROKE) 0.5] [mix RIGHTSB WIDTH 0.7] [mix XH CAP 0.45] OVERLAYSTROKE
save 'dcroat' 0x111
sketch # dcaron
include glyphs.commaAbove
apply-transform : Translate (WIDTH + (RIGHTSB - SB) / 2 + markExtend / 2) 0
local f : Widen {'d'} 0.95 1
include f.d
include markset.b
save 'dcaron' 0x10F
sketch # dcurlytail
local fine : adviceBlackness 4
local rinner : clamp (WIDTH * 0.065) (XH * 0.05) (fine * 0.35)
local wide STROKE
local m1 : Math.min RIGHTSB (WIDTH - rinner * 2 - fine - OX)
local x2 : mix SB m1 0.5
local y2 : 0 - fine - rinner * 1.25
include markset.e
include : OBarRightShape XH m1
include : dispiro
widths.rhs
flat m1 CAP [heading DOWNWARD]
curl m1 (rinner * 2 + fine)
CurlyTail fine rinner m1 0 (m1 + rinner * 2 + fine) x2 y2
if SLAB : begin
include : LeftwardTopSerif (m1 - STROKE * HVCONTRAST) CAP SIDEJUT
save 'dcurlytail' 0x221
sketch # dhooktop
include markset.b
include : OBarRightShape
include : VBarRight RIGHTSB 0 XH
include : RightwardBottomSerif RIGHTSB 0 SIDEJUT
tag-contour 'serifRB'
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST) XH HOOKX (-HOOK)
save 'dhooktop' 0x257
sketch # ddot
include glyphs.dotAbove
apply-transform : Translate (WIDTH - HALFSTROKE) 0
include glyphs.d AS_BASE
save 'ddot' 0x1E0B
sketch # latinde
include glyphs.d AS_BASE
include : HBarTop [mix RIGHTSB SB 0.9] (RIGHTSB + O) CAP
if SLAB : begin
include : DownwardLeftSerif [mix RIGHTSB SB 0.9] CAP VJUT
save 'latinde' 0x18C
### P
define { PShape PShapeOutline } : do "P and related =========================================="
define [PShapeOutlineKnots top mul bp overshoot sw offset] : begin
local bowlTop (top * 1 - offset)
local bowlBottom ((top - sw) * bp - sw / 2 + offset)
local turn : mix bowlTop bowlBottom (SMOOTHB / (SMOOTHA + SMOOTHB))
local turnRadius : (bowlTop - bowlBottom) * 0.45
local right : RIGHTSB - offset
list
flat (SB * mul - O) bowlTop [heading RIGHTWARD]
curl (right - turnRadius - CORRECTION_OMIDS) bowlTop
archv
g4 (right - overshoot) turn
arcvh
flat (right - turnRadius + CORRECTION_OMIDS) bowlBottom
curl (SB * mul - O) bowlBottom [heading LEFTWARD]
define [PShapeOutline] : params [top [mul PShape.defaultMul] [bp BARPOS] [overshoot PShape.defaultOvershoot] [sw STROKE] [offset 0]] : glyph-construction
include : spiro-outline
PShapeOutlineKnots top mul bp overshoot sw offset
define [PShape] : params [top [mul PShape.defaultMul] [bp BARPOS] [overshoot PShape.defaultOvershoot] [sw STROKE] [slab SLAB]] : glyph-construction
include : dispiro
widths.rhs sw
PShapeOutlineKnots top mul bp overshoot sw 0
include : VBarLeft (SB * mul) 0 top sw
tag-contour 'strokeL'
if slab : begin
include : LeftwardTopSerif (SB * mul) top SIDEJUT sw
tag-contour 'serifLT'
include : CenterBottomSerif (SB * mul + HALFSTROKE * HVCONTRAST) 0 JUT sw
set PShape.defaultMul 1.25
set PShape.defaultOvershoot (OX * 2)
sketch # P
set-width WIDTH
include markset.capital
include : PShape CAP
save 'P' 'P'
save 'Rho' 0x3A1
save 'cyrEr' 0x420
sketch # Phookleft
include glyphs.P AS_BASE
eject-contour "serifLT"
include : LeftHook (SB * 1.25) CAP
save 'Phookleft' 0x1A4
list PShape PShapeOutline
### p
do "p and related ============================================================================="
sketch # p
set-width WIDTH
include markset.p
include : tagged 'bowl' : OBarLeftShape
include : VBarLeft SB DESCENDER XH
if SLAB : begin
include : LeftwardTopSerif SB XH SIDEJUT
tag-contour 'serifLT'
include : CenterBottomSerif (SB + HALFSTROKE * HVCONTRAST) DESCENDER JUT
tag-contour 'serifLB'
set-anchor 'overlay' BASE MIDDLE (XH / 2)
save 'p' 'p'
save 'cyrer' 0x440
sketch # phooktop
include markset.if
include : OBarLeftShape
include : HooktopLeftBar nothing DESCENDER
if SLAB : begin
include : CenterBottomSerif (SB + HALFSTROKE * HVCONTRAST) DESCENDER JUT
tag-contour 'serifLB'
save 'phooktop' 0x1A5
### rho
sketch # rho
include markset.p
include : OShape XH 0 (SB - OX + O) RIGHTSB
include : VBar (SB + HALFSTROKE * HVCONTRAST + O) DESCENDER SMALLSMOOTHB
save 'rho' 0x3C1
### R and CyrYa
define { RLegShape RLegTerminalX } : do "R and related ====================================="
define [RLegTerminalX straight right sw] : right - [if straight (OX * 2) 0] - sw / 2 * HVCONTRAST
define [RLegShape right bottom top charTop slab straight sw extraShift] : glyph-construction
local xRightBottom : RLegTerminalX straight right sw
if straight : do
local shift : if slab (-JUT / 2 + 0.25 * sw * HVCONTRAST) 0
include : dispiro
widths.center (sw * [diagCor charTop (WIDTH - extraShift * 2) 0 (sw * 2)])
corner (MIDDLE + extraShift + shift / 2) top [heading DOWNWARD]
corner (xRightBottom + shift) bottom [heading DOWNWARD]
if slab : begin
include : RightwardBottomSerif (xRightBottom + shift + 0.25 * sw * HVCONTRAST) bottom (SIDEJUT + JUT / 8)
: else : begin
include : dispiro
widths.center sw
g4.up.start xRightBottom bottom [heading UPWARD]
quadcontrols 0 [if slab 0.3 0.4] 8
g4 MIDDLE top
if slab : begin
include : RightwardBottomSerif right bottom (SIDEJUT + JUT / 8)
define [RShape] : params [straightBar top [slab SLAB]] : glyph-construction
local m : if slab (0.5 + HALFSTROKE / CAP) PBARPOS
include : PShape top (mul -- 1) (bp -- m) (overshoot -- O) (slab -- slab)
local right (RIGHTSB - O - [if SLAB (JUT / 8) 0])
include : RLegShape right 0 ((top - STROKE) * m) top SLAB straightBar STROKE 0
sketch # R
include markset.capital
branch
include : RShape true CAP
set-anchor 'overlay' BASE (SB + STROKE * HVCONTRAST) (CAP * PBARPOS - HALFSTROKE)
save 'R.straight'
branch
include : RShape true CAP (slab -- false)
set-anchor 'overlay' BASE (SB + STROKE * HVCONTRAST) (CAP * PBARPOS - HALFSTROKE)
eject-contour 'strokeL'
save 'Rrotunda.straight'
branch
include : RShape false CAP
set-anchor 'overlay' BASE (SB + STROKE * HVCONTRAST) (CAP * PBARPOS - HALFSTROKE)
save 'R.curly'
branch
include : RShape false CAP (slab -- false)
set-anchor 'overlay' BASE (SB + STROKE * HVCONTRAST) (CAP * PBARPOS - HALFSTROKE)
eject-contour 'strokeL'
save 'Rrotunda.curly'
sketch # smcpR
include markset.e
branch
include : RShape true XH
save 'smcpR.straight'
branch
include : RShape true XH (slab -- false)
eject-contour 'strokeL'
save 'rrotunda.straight'
branch
include : RShape false XH
save 'smcpR.curly'
branch
include : RShape false XH (slab -- false)
eject-contour 'strokeL'
save 'rrotunda.curly'
select-variant 'R' 'R'
select-variant 'Rrotunda' 0xA75A (follow -- 'R')
select-variant 'smcpR' 0x280 (follow -- 'R')
select-variant 'rrotunda' 0xA75B (follow -- 'R')
sketch # Yr
include markset.if
local top : CAP * 0.85
local bp 0.45
include : PShape top (mul -- 1) (bp -- bp)
include : VBarLeft SB (top - 1) CAP
local right (RIGHTSB - O - [if SLAB (JUT / 8) 0])
branch
include : RLegShape right DESCENDER ((top - STROKE) * bp) (top - DESCENDER) SLAB true STROKE 0
save 'Yr.straight'
branch
include : RLegShape right DESCENDER ((top - STROKE) * bp) (top - DESCENDER) SLAB false STROKE 0
save 'Yr.curly'
select-variant 'Yr' 0x1A6 (follow -- 'R')
define [CyrYaShape straightBar top] : glyph-construction
local bowlTop (top * 1)
local m : if SLAB (0.5 + HALFSTROKE / CAP) PBARPOS
local bowlBottom ((top - STROKE) * m - HALFSTROKE)
local turn : mix bowlTop bowlBottom (SMOOTHA / (SMOOTHA + SMOOTHB))
local turnRadius : (bowlTop - bowlBottom) * 0.45
local barright : WIDTH - SB * 1.25
include : dispiro
widths.lhs
flat (barright - HALFSTROKE * 0.1) bowlTop [heading LEFTWARD]
curl (SB + turnRadius - CORRECTION_OMIDS) bowlTop
archv
g4 (SB + O) turn
arcvh
flat (SB + turnRadius + CORRECTION_OMIDS) bowlBottom
curl (barright - HALFSTROKE * 0.1) bowlBottom [heading RIGHTWARD]
include : VBarRight barright 0 top
local left (SB + O + [if SLAB (JUT / 8) 0])
if straightBar : then : include : dispiro
widths.center (STROKE * [diagCor top (WIDTH - STROKE * 2)])
corner MIDDLE ((top - STROKE) * m) [heading DOWNWARD]
corner (left + OX * 2 + HALFSTROKE * HVCONTRAST) 0 [heading DOWNWARD]
: else : include : dispiro
widths.center
g4.up.start (left + HALFSTROKE * HVCONTRAST) 0 [heading UPWARD]
quadcontrols 0 [if SLAB 0.3 0.4] 8
g4 MIDDLE ((top - STROKE) * m)
if SLAB : begin
include : RightwardTopSerif barright top SIDEJUT
include : CenterBottomSerif (barright - HALFSTROKE * HVCONTRAST) 0 JUT
include : LeftwardBottomSerif (SB + JUT / 8) 0 (SIDEJUT + JUT / 8)
sketch # cyrYa
include markset.capital
branch
include : CyrYaShape true CAP
save 'cyrYa.straight'
branch
include : CyrYaShape false CAP
save 'cyrYa.curly'
sketch # cyrya
include markset.e
branch
include : CyrYaShape true XH
save 'cyrya.straight'
branch
include : CyrYaShape false XH
save 'cyrya.curly'
select-variant 'cyrYa' 0x42F (follow -- 'R')
select-variant 'cyrya' 0x44F (follow -- 'R')
turned 'invsmcpR.straight' nothing 'cyrya.straight' MIDDLE (XH / 2)
turned 'invsmcpR.curly' nothing 'cyrya.curly' MIDDLE (XH / 2)
select-variant 'invsmcpR' 0x281 (follow -- 'R')
list RLegShape RLegTerminalX
### r
do "r and related ============================================================================="
local dfR : DivFrame para.diversityF
local rStraight 0
local rSerifed 1
local rNarrow 2
define [RDim mode] : begin
local rBalanceMultiplier : match mode [0 1] [1 (4 / 3)] [2 (1 / 2)]
local rHookMultiplier : match mode [0 1] [1 (2 / 3)] [2 1]
local rHookSwMultiplier : match mode [0 0] [1 (1 / 4)] [2 0]
local rSerifLeftExtender : match mode [0 0] [1 (1 / 3)] [2 0]
local hookSuperness : match mode [0 2.35] [1 2.75] [2 2.35]
local rbar : SB + RBALANCE * rBalanceMultiplier + STROKE * HVCONTRAST
local rSerifX : rbar - HALFSTROKE * HVCONTRAST
local rSerifLeftJut : SIDEJUT + RBALANCE * (0.3 + rSerifLeftExtender)
local rSerifRightJut : rSerifLeftJut * 1.20
local [rBottomSerif y] : tagged 'serifLB' : union
LeftwardBottomSerif rSerifX y (rSerifLeftJut + HALFSTROKE * HVCONTRAST)
RightwardBottomSerif rSerifX y (rSerifRightJut + HALFSTROKE * HVCONTRAST)
local [rTopSerif y] : tagged 'serifLT'
LeftwardTopSerif rSerifX y (rSerifLeftJut + HALFSTROKE * HVCONTRAST)
local fine : SHOULDERFINE * CTHIN
local rHookX (dfR.rightSB + RBALANCE2 * rBalanceMultiplier - OXE)
local rmiddle : match mode
0 : mix (rbar - fine) rHookX (0.54 + 2 * TANSLANT * STROKE / WIDTH)
1 : mix (rbar - fine) rHookX (0.59 + 2 * TANSLANT * STROKE / WIDTH)
2 : mix rHookX dfR.width (3 / 8)
local mixpin : match mode
0 : 0.65 + 4 * TANSLANT * STROKE / WIDTH
1 : 0.65 + 0.25 * STROKE / WIDTH + 4 * TANSLANT * STROKE / WIDTH
2 : 0.65 + 4 * TANSLANT * STROKE / WIDTH
local rmiddlein : [mix rbar (rHookX - STROKE * HVCONTRAST * 1.05) mixpin] - CORRECTION_OMIDS
local skew : Math.max 0 : (rmiddle - rmiddlein) / STROKE
local rHookY : RHOOK * rHookMultiplier + STROKE * rHookSwMultiplier
return : object rbar rBottomSerif rTopSerif fine rmiddle skew rHookX rHookY hookSuperness
define [StandardLowerRShape df md doTopSerif doBottomSerif] : glyph-construction
define [object rbar rBottomSerif rTopSerif fine rmiddle skew rHookX rHookY hookSuperness] : RDim md
include : dispiro
widths.lhs
g4.up.start rHookX (XH - rHookY - STROKE * 0.5) [heading UPWARD]
arcvh nothing hookSuperness
g4.left.mid (rmiddle - CORRECTION_OMIDS * [linreg 72 0.75 108 1 STROKE]) XO [widths.heading STROKE 0 {.y (-1) .x (-skew)}]
archv
straight.down.end (rbar - fine * HVCONTRAST) (XH * 0.53 + (SMALLSMOOTH - SMALLSMOOTHA)) [widths.heading fine 0 DOWNWARD]
include : VBarRight rbar 0 XH
set-anchor 'overlay' BASE (rbar - STROKE * 0.25) (XH * 0.5)
if doBottomSerif : include : rBottomSerif 0
if doTopSerif : include : rTopSerif XH
define [NarrowLowerRshape df md doTopSerif doBottomSerif] : glyph-construction
define [object rbar fine rmiddle] : RDim rNarrow
include : dispiro
widths.lhs
g4.left.mid (rmiddle - CORRECTION_OMIDS * [linreg 72 0.75 108 1 STROKE]) XO
archv
straight.down.end (rbar - fine * HVCONTRAST) (XH * 0.53 + (SMALLSMOOTH - SMALLSMOOTHA)) [widths.heading fine 0 DOWNWARD]
include : VBarRight rbar 0 XH
set-anchor 'overlay' BASE (rbar - STROKE * 0.25) (XH * 0.5)
sketch
set-width dfR.width
include dfR.markSet.e
branch
include : StandardLowerRShape dfR rStraight 0 0
save "r.straight"
branch
include : StandardLowerRShape dfR rSerifed 1 1
save "r.serifed"
branch
include : StandardLowerRShape dfR rSerifed 1 0
save "r.top-serifed"
sketch # r.narrow
set-width dfR.width
include dfR.markSet.e
include : NarrowLowerRshape dfR rNarrow 0 0
save 'r.narrow'
select-variant 'r' 'r'
do
define [marks] : compsiteMarkSet dfR.markSet.e {.anchors {.bottomright {.type BASE .x dfR.rightSB - RBALANCE .y 0}}}
turned 'turnr.straight' nothing 'r.straight' dfR.middle (XH / 2) [marks]
turned 'turnr.serifed' nothing 'r.serifed' dfR.middle (XH / 2) [marks]
turned 'turnr.top-serifed' nothing 'r.top-serifed' dfR.middle (XH / 2) [marks]
turned 'turnr.narrow' nothing 'r.narrow' dfR.middle (XH / 2) [marks]
select-variant 'turnr' 0x279 (follow -- 'r')
do
define [SmallRLongLegShape F mode doTopSerif] : glyph-construction
define [object rbar rBottomSerif] : RDim mode
include : F dfR mode doTopSerif 0
eject-contour 'serifLB'
include : VBarRight rbar DESCENDER 0
if SLAB : include : rBottomSerif DESCENDER
sketch # rlongleg.standard
set-width dfR.width
include dfR.markSet.p
branch
include : SmallRLongLegShape StandardLowerRShape rStraight 0
save 'rlongleg.straight'
branch
include : SmallRLongLegShape StandardLowerRShape rSerifed 1
save 'rlongleg.serifed'
branch
include : SmallRLongLegShape StandardLowerRShape rSerifed 1
save 'rlongleg.top-serifed'
branch
include : SmallRLongLegShape NarrowLowerRshape rNarrow 0
save 'rlongleg.narrow'
select-variant 'rlongleg' 0x27C (follow -- 'r')
do
local [marks] : compsiteMarkSet dfR.markSet.b {.anchors {.bottomright {.type BASE .x dfR.rightSB - RBALANCE .y 0}}}
turned 'turnrlongleg.straight' nothing 'rlongleg.straight' dfR.middle (XH / 2) [marks]
turned 'turnrlongleg.serifed' nothing 'rlongleg.serifed' dfR.middle (XH / 2) [marks]
turned 'turnrlongleg.top-serifed' nothing 'rlongleg.top-serifed' dfR.middle (XH / 2) [marks]
turned 'turnrlongleg.narrow' nothing 'rlongleg.narrow' dfR.middle (XH / 2) [marks]
select-variant 'turnrlongleg' 0x27A (follow -- 'r')
do
define [SmallRRTailShape F mode doTopSerif] : glyph-construction
define [object rbar] : RDim mode
include : F dfR mode doTopSerif 0
eject-contour 'serifLB'
include : create-glyph : glyph-construction
include glyphs.rtailBR
apply-transform : Upright
apply-transform : Translate rbar 0
apply-transform : Italify
sketch # rrtail
set-width dfR.width
include dfR.markSet.p
branch
include : SmallRRTailShape StandardLowerRShape rStraight 0
save 'rrtail.straight'
branch
include : SmallRRTailShape StandardLowerRShape rSerifed 1
save 'rrtail.serifed'
branch
include : SmallRRTailShape StandardLowerRShape rSerifed 1
save 'rrtail.top-serifed'
branch
include : SmallRRTailShape NarrowLowerRshape rNarrow 0
save 'rrtail.narrow'
select-variant 'rrtail' 0x27D (follow -- 'r')
do
turned 'smallLetterTurnedRWithTail.straight' nothing 'rrtail.straight' dfR.middle (XH / 2)
turned 'smallLetterTurnedRWithTail.serifed' nothing 'rrtail.serifed' dfR.middle (XH / 2)
turned 'smallLetterTurnedRWithTail.top-serifed' nothing 'rrtail.top-serifed' dfR.middle (XH / 2)
turned 'smallLetterTurnedRWithTail.narrow' nothing 'rrtail.narrow' dfR.middle (XH / 2)
select-variant 'smallLetterTurnedRWithTail' 0x2C79 (follow -- 'r')
do
define [TurnRRTailShape F mode] : glyph-construction
define [object rbar] : RDim mode
include : F dfR mode 0 0
eject-contour 'serifLT'
include : FlipAround dfR.middle (XH / 2)
include : create-glyph : glyph-construction
include glyphs.rtailBR
apply-transform : Upright
apply-transform : Translate (dfR.rightSB - rbar + dfR.leftSB + STROKE * HVCONTRAST) 0
apply-transform : Italify
sketch # turnrrtail
set-width dfR.width
include dfR.markSet.p
branch
include : TurnRRTailShape StandardLowerRShape rStraight
save 'turnrrtail.straight'
branch
include : TurnRRTailShape StandardLowerRShape rSerifed
save 'turnrrtail.serifed'
branch
include : TurnRRTailShape StandardLowerRShape rSerifed
save 'turnrrtail.top-serifed'
branch
include : TurnRRTailShape NarrowLowerRshape rNarrow
save 'turnrrtail.narrow'
select-variant 'turnrrtail' 0x27B (follow -- 'r')
sketch # rflap
set-width dfR.width
include dfR.markSet.e
define [object rbar rBottomSerif rHookY] : RDim rStraight
local rHookX (RIGHTSB + RBALANCE2 - OXE)
local rmiddle : [mix rbar (rHookX - HALFSTROKE) 0.5] - CORRECTION_OMIDS
include : dispiro
widths.lhs
g4 rHookX (XH - rHookY)
hookstart XO
flat (rbar - STROKE * HVCONTRAST) (XH - SMALLSMOOTHA)
curl (rbar - STROKE * HVCONTRAST) 0 [heading DOWNWARD]
branch
save 'rflap.straight'
save 'rflap.top-serifed'
branch
include : rBottomSerif 0
save 'rflap.serifed'
sketch # rflap.narrow
set-width dfR.width
include dfR.markSet.e
define [object rbar rBottomSerif rmiddle] : RDim rNarrow
include : dispiro
widths.lhs
g4.left.start (rmiddle - CORRECTION_OMIDS * [linreg 72 0.75 108 1 STROKE]) XO
archv
flat (rbar - STROKE * HVCONTRAST) (XH - SMALLSMOOTHA)
curl (rbar - STROKE * HVCONTRAST) 0 [heading DOWNWARD]
if SLAB : include : rBottomSerif 0
save 'rflap.narrow'
select-variant 'rflap' 0x27E (follow -- 'r')
### C and c, also cyre
define {CShape CShapeOutline} : do "C, c nad related ========================================"
define [CShape top bot sw] : glyph-construction
include : dispiro
widths.lhs sw
g4 RIGHTSB (top - HOOK)
hookstart (top - O)
flat (SB + OX) (top - SMOOTHA)
curl (SB + OX) (bot + SMOOTHB)
hookend (bot + O)
g4 RIGHTSB (bot + HOOK)
define [CShapeOutline top bot _offset] : glyph-construction
define offset : fallback _offset 1
include : spiro-outline
g4 RIGHTSB (top - HOOK)
hookstart (top - O - offset)
flat (SB + OX + offset) (top - SMOOTHA)
curl (SB + OX + offset) (bot + SMOOTHB)
hookend (bot + O + offset)
g4 RIGHTSB (bot + HOOK)
sketch # C
set-width WIDTH
include markset.capital
include : CShape CAP 0
save 'C' 'C'
save 'cyrEs' 0x421
save 'lunateSigma' 0x3F9
sketch # c
set-width WIDTH
include markset.e
include : dispiro
widths.lhs
g4 RIGHTSB (XH - HOOK)
hookstart XO
flat.ai (SB + OX) (XH - SMALLSMOOTHA)
curl.ai (SB + OX) (0 + SMALLSMOOTHB)
hookend O
g4 RIGHTSB HOOK
save 'c' 'c'
save 'cyres' 0x441
save 'lunatesigma' 0x3F2
turned 'turnC' 0x186 'C' MIDDLE (CAP / 2)
turned 'turnc' 0x254 'c' MIDDLE (XH / 2)
composite glyphs.turnc [into-unicode 0x037B]
composite glyphs.turnC [into-unicode 0x03FD]
composite glyphs.c [DotAt (MIDDLE + HALFSTROKE / 4) (XH/2) DOTRADIUS] [into-unicode 0x037C]
composite glyphs.turnc [DotAt (MIDDLE - HALFSTROKE / 4) (XH/2) DOTRADIUS] [into-unicode 0x037D]
composite glyphs.C [DotAt (MIDDLE + HALFSTROKE / 4) (CAP/2) DOTRADIUS] [into-unicode 0x03FE]
composite glyphs.turnC [DotAt (MIDDLE - HALFSTROKE / 4) (CAP/2) DOTRADIUS] [into-unicode 0x03FF]
sketch # strenchedC
set-width WIDTH
include markset.p
include : CShape XH DESCENDER
save 'strenchedC' 0x297
sketch # Chooktop
include glyphs.C AS_BASE
include : VBarRight (RIGHTSB - OXHOOK) (CAP - HOOK) CAP
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST - OXHOOK) CAP HOOKX (-HOOK)
save 'Chooktop' 0x187
sketch # chooktop
include glyphs.c AS_BASE
include : VBarRight (RIGHTSB - OXHOOK) (XH - HOOK) XH
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST - OXHOOK) XH HOOKX (-HOOK)
save 'chooktop' 0x188
sketch # Cbar
include glyphs.C AS_BASE
include : HOverlayBar (SB * 0.3) [mix (SB + STROKE) (RIGHTSB - STROKE) 0.55] (CAP * OVERLAYPOS)
save 'Cbar' 0xA792
sketch # cbar
include glyphs.c AS_BASE
include : HOverlayBar (SB * 0.3) [mix (SB + STROKE) (RIGHTSB - STROKE) 0.55] (XH * OVERLAYPOS)
save 'cbar' 0xA793
sketch # ccurlytail
include markset.e
local stroke : adviceBlackness2 2.875 2 XH
local fine : adviceBlackness 3
local rinner : ((XH * 0.45) - fine * 1.5) / 2
local m1 : SB + O + stroke * HVCONTRAST
local x2 : SB + stroke * 0.3
local y2 : -XH * 0.05
include : dispiro
widths.lhs stroke
g4 RIGHTSB (XH - HOOK)
hookstart XH
flat.ai (SB + OX) (XH - SMALLSMOOTHA)
curl.ai (SB + OX) SMALLSMOOTHB
arcvh
CurlyTail fine rinner m1 0 RIGHTSB x2 y2
linreg 500 (0.5) 375 (-0.25) : Math.min WIDTH 500
begin nothing
linreg 500 (0) 375 (1) : Math.min WIDTH 500
save 'ccurlytail' 0x255
sketch # cyrE
include markset.capital
include glyphs.C
include : FlipAround MIDDLE (CAP / 2)
include : HBar [mix SB RIGHTSB 0.25] RIGHTSB (CAP / 2)
save 'cyrE' 0x42D
sketch # cyre
include markset.e
include glyphs.c
include : FlipAround MIDDLE (XH / 2)
include : HBar [mix SB RIGHTSB 0.25] RIGHTSB (XH / 2)
save 'cyre' 0x44D
sketch # cyrYe
include markset.capital
include glyphs.C
include : HBar SB [mix RIGHTSB SB 0.25] (CAP / 2) [adviceBlackness2 4 2 CAP]
save 'cyrYe' 0x404
sketch # cyrye
include markset.e
include glyphs.c
include : HBar SB [mix RIGHTSB SB 0.25] (XH / 2) [adviceBlackness2 4 2 XH]
save 'cyrye' 0x454
sketch # sigma
include markset.e
start-from (RIGHTSB + 0.25 * SB) XH
line-to (RIGHTSB + 0.25 * SB) (XH - STROKE)
line-to MIDDLE (XH - STROKE - O * 1.5)
line-to MIDDLE (XH - O)
include : dispiro
widths.lhs
flat (MIDDLE + 1) (XH - O)
curl MIDDLE (XH - O)
archv
flat.ai (SB + OX) (XH - SMALLSMOOTHA)
curl.ai (SB + OX) SMALLSMOOTHB
arcvh
g4 (MIDDLE + CORRECTION_OMIDS) O
archv
flat.ai (RIGHTSB - OX * 0.5) SMALLSMOOTHA
curl.ai (RIGHTSB - OX * 0.5) (XH - SMALLSMOOTHB)
arcvh
flat MIDDLE (XH - HALFSTROKE - O) [widths HALFSTROKE 0]
curl (MIDDLE - 1) (XH - HALFSTROKE - O)
save 'sigma' 0x3C3
sketch # sigmafinal
include markset.p
include : dispiro
widths.lhs
g4 RIGHTSB (XH - HOOK)
hookstart XH
flat.ai (SB + OX) (XH - SMALLSMOOTHA)
curl.ai (SB + OX) SMALLSMOOTHB
arcvh
g4 (MIDDLE + CORRECTION_OMIDS) 0
alsothru 0.5 0.1353
g4.down.mid (RIGHTSB - STROKE * HVCONTRAST + OX) [mix DESCENDER STROKE [linreg 18 0.5 126 0.49 STROKE]] [heading DOWNWARD]
arcvh
flat (RIGHTSB - HOOKX + OX) (DESCENDER + STROKE) [heading LEFTWARD]
curl [Math.min (RIGHTSB - STROKE * HVCONTRAST * 1.5) (RIGHTSB - HOOKX + OX - 1)] (DESCENDER + STROKE) [heading LEFTWARD]
save 'sigmafinal' 0x3C2
begin { CShape CShapeOutline }
### G
do "G and related ============================================================================="
define [GShape top sma smb] : glyph-construction
local yBar : top * 0.52 + STROKE * 0.25
local fine SHOULDERFINE
local sb : shoulderMidSlope fine nothing (-1)
include : dispiro
widths.lhs
g4 RIGHTSB (top - HOOK)
hookstart (top - O)
flat (SB + OX) (top - sma)
curl (SB + OX) smb
arcvh
g4.right.mid (MIDDLE + (CORRECTION_OMIDX - sb) * STROKE) O [widths.heading STROKE 0 {.y (1) .x (sb)}]
archv
straight.up.end (RIGHTSB - (STROKE - fine) * HVCONTRAST) sma [widths.heading fine 0 UPWARD]
include : HBarTop MIDDLE RIGHTSB yBar
include : VBarRight RIGHTSB sma yBar
include : VBarRight RIGHTSB sma 0 (STROKE - fine / 2)
sketch # G
set-width WIDTH
include markset.capital
include : GShape CAP SMOOTHA SMOOTHB
save 'G' 'G'
sketch # smcpG
include markset.e
include : GShape XH SMOOTHA SMOOTHB
save 'smcpG' 0x262
sketch # Ghooktop
include glyphs.G AS_BASE
include : VBarRight (RIGHTSB - OXHOOK) (CAP - HOOK) CAP
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST - OXHOOK) CAP HOOKX (-HOOK) nothing O
save 'Ghooktop' 0x193
sketch # smcpGhooktop
include glyphs.smcpG AS_BASE
include : VBarRight (RIGHTSB - OXHOOK) (XH - HOOK) XH
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST - OXHOOK) XH HOOKX (-HOOK) nothing O
save 'smcpGhooktop' 0x29B
sketch # Gbar
include glyphs.G AS_BASE
include : HOverlayBar [mix SB RIGHTSB 0.5] [mix RIGHTSB WIDTH 0.7] [mix 0 CAPMIDDLE 0.55]
save 'Gbar' 0x1E4
### g
do "g and related ============================================================================="
sketch # g.doublestorey
include markset.p
local obot : XH * GBARPOS - O - STROKE * 0.4
include : OShape XH obot SB (RIGHTSB - 0.3 * SB)
local gleftx ([mix 0 SB 0.85] + OX)
local grightx ([mix WIDTH RIGHTSB 0.825] - OX)
local groundy : Math.round : [mix DESCENDER (XH * GBARPOS) 0.64] + HALFSTROKE
local gtipy : [mix groundy (obot + STROKE + O) 1.005] - STROKE * CTHIN
include : dispiro
g4.left.start [mix SB RIGHTSB 0.4] gtipy [widths 0 (STROKE * CTHIN)]
g4 ([mix SB RIGHTSB 0.0575] + STROKE * 0.85) [mix groundy gtipy 0.5] [widths.rhs (STROKE * [mix CTHIN 1 0.5])]
flat [mix SB RIGHTSB 0.435] groundy [widths 0 STROKE]
curl [mix RIGHTSB SB 0.435] groundy
archv 4
g4 grightx [mix (DESCENDER + O) groundy (1.06 * SMALLSMOOTHA / (SMALLSMOOTHA + SMALLSMOOTHB))]
arcvh
g4 (MIDDLE + CORRECTION_OMIDS) (DESCENDER + O)
archv
g4 gleftx [mix (DESCENDER + O) groundy (1.06 * SMALLSMOOTHB / (SMALLSMOOTHA + SMALLSMOOTHB))]
arcvh
g4 [mix SB RIGHTSB 0.435] groundy [heading RIGHTWARD]
local gm : mix SB (RIGHTSB - 0.3 * SB) 0.5
start-from (RIGHTSB + 0.25 * SB - OX) XH
line-to (RIGHTSB + 0.25 * SB - OX) (XH - STROKE)
line-to gm (XH - STROKE - O)
line-to gm XH
set-anchor 'overlay' BASE MIDDLE [mix (DESCENDER + O) groundy 0.5]
save 'g.doublestorey'
sketch # g.opendoublestorey
include markset.p
local obot : XH * GBARPOS - O - STROKE * 0.4
include : OShape XH obot SB (RIGHTSB - 0.3 * SB)
local gleftx ([mix 0 SB 0.85] + OX)
local grightx ([mix WIDTH RIGHTSB 0.825] - OX)
local groundy : Math.round : [mix DESCENDER (XH * GBARPOS) 0.64] + HALFSTROKE
local gtipy : [mix groundy (obot + STROKE + O) 1.005] - STROKE * CTHIN
include : dispiro
g4.left.start [mix SB RIGHTSB 0.4] gtipy [widths 0 (STROKE * CTHIN)]
g4 ([mix SB RIGHTSB 0.0575] + STROKE * 0.85) [mix groundy gtipy 0.5] [widths.rhs (STROKE * [mix CTHIN 1 0.5])]
flat [mix SB RIGHTSB 0.435] groundy [widths 0 STROKE]
curl [mix RIGHTSB SB 0.435] groundy
archv 4
g4 grightx [mix (DESCENDER + O) groundy (1.06 * SMALLSMOOTHA / (SMALLSMOOTHA + SMALLSMOOTHB))]
hookend (DESCENDER + O)
g4 gleftx [mix (DESCENDER + O) groundy (1.06 * SMALLSMOOTHB / (SMALLSMOOTHA + SMALLSMOOTHB))]
local gm : mix SB (RIGHTSB - 0.3 * SB) 0.5
start-from (RIGHTSB + 0.25 * SB - OX) XH
line-to (RIGHTSB + 0.25 * SB - OX) (XH - STROKE)
line-to gm (XH - STROKE - O)
line-to gm XH
set-anchor 'overlay' BASE MIDDLE [mix (DESCENDER + O) groundy 0.5]
save 'g.opendoublestorey'
sketch # g.singlestorey
include markset.p
include : OBarRightShape
include : dispiro
widths.rhs
flat RIGHTSB XH [heading DOWNWARD]
curl RIGHTSB (DESCENDER + SMALLSMOOTHA)
hookend (DESCENDER + O)
g4 SB (DESCENDER + SHOOK)
if SLAB : begin
include : RightwardTopSerif RIGHTSB XH SIDEJUT
tag-contour 'serifRT'
set-anchor "overlay" BASE MIDDLE (XH / 2)
save 'g.singlestorey'
save 'scriptg' 0x261
save 'cyrde.SRB'
select-variant 'g' 'g'
turned nothing 0x1D77 'g' MIDDLE [mix DESCENDER XH 0.5]
sketch # scriptghooktop
include glyphs.scriptg AS_BASE
eject-contour 'serifRT'
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST) XH HOOKX (-HOOK) nothing O
save 'scriptghooktop' 0x260
do
define l : mix 0 SB 0.3
define r : mix WIDTH RIGHTSB 0.3
define bwDoubleStorey : Math.min [adviceBlackness 5] (0.5 / 3 * (CAP - STROKE * 4))
define bwSingleStorey : adviceBlackness2 4 2 XH
sketch # gbar.doublestorey
include glyphs."g.doublestorey" AS_BASE
include : HBar l r glyphs."g.doublestorey".anchors.overlay.y bwDoubleStorey
save 'gbar.doublestorey'
sketch # gbar.opendoublestorey
include glyphs."g.opendoublestorey" AS_BASE
include : HBar l r glyphs."g.opendoublestorey".anchors.overlay.y bwDoubleStorey
save 'gbar.opendoublestorey'
sketch # gbar.singlestorey
include glyphs."g.singlestorey" AS_BASE
include : HBar l r glyphs."g.singlestorey".anchors.overlay.y bwSingleStorey
save 'gbar.singlestorey'
select-variant "gbar" 0x1E5 (follow -- 'g')
### O and o
do "O and o ==================================================================================="
sketch
include markset.capital
include : OShape CAP 0 SB RIGHTSB nothing SMOOTHA SMOOTHB
save 'O' 'O'
save 'Omicron' 0x39F
save 'cyrO' 0x41E
sketch # o
set-width WIDTH
include markset.e
include : OShape XH 0 SB RIGHTSB nothing nothing nothing true
save 'o' 'o'
save 'omicron' 0x3BF
save 'cyro' 0x43e
sketch
include markset.capital
include : HornBaseAnchor RIGHTSB CAP (WIDTH / 2) (SMOOTHB) (-1)
include : difference
HornShape RIGHTSB CAP (WIDTH / 2) (SMOOTHB) (-1)
OShapeOutline (CAP + O) (0 - O) (SB - O) (RIGHTSB + O) nothing SMOOTHA SMOOTHB
include glyphs.O
save 'OHorn' 0x01A0
sketch
include markset.e
include : HornBaseAnchor RIGHTSB XH (WIDTH / 2) (SMOOTHB) (-1)
include : difference
HornShape RIGHTSB XH (WIDTH / 2) (SMOOTHB) (-1)
OShapeOutline (XH + O) (0 - O) (SB - O) (RIGHTSB + O) nothing nothing nothing true
include glyphs.o
save 'oHorn' 0x01A1
sketch # Oslash
local fine : 0.5 * OVERLAYSTROKE
include glyphs.O AS_BASE
include : dispiro
flat (SB + O + fine) [mix CAP 0 1.05] [widths fine fine]
curl (RIGHTSB - O - fine) [mix 0 CAP 1.05]
save 'Oslash' 0xD8
sketch # oslash
local fine : 0.5 * OVERLAYSTROKE
include glyphs.o AS_BASE
include : dispiro
flat (SB + O + fine) [mix XH 0 1.05] [widths fine fine]
curl (RIGHTSB - O - fine) [mix 0 XH 1.05]
save 'oslash' 0xF8
sketch # Obar
include glyphs.O AS_BASE
include : HBar (SB + OX + 1) (RIGHTSB - OX - 1) (CAP * 0.5) OVERLAYSTROKE
save 'Obar' 0x19F
save 'cyrOe' 0x4E8
save 'capSymbolTheta' 0x3F4
sketch # obar
include glyphs.o AS_BASE
include : HBar (SB + OX + 1) (RIGHTSB - OX - 1) (XH * 0.5) OVERLAYSTROKE
save 'obar' 0x275
save 'cyroe' 0x4E9
sketch # bulleye
include glyphs.O AS_BASE
local radius : Math.min DOTRADIUS ((RIGHTSB - SB - STROKE * 2) / 4)
include : Ring (CAPMIDDLE + radius) (CAPMIDDLE - radius) (MIDDLE + radius) (MIDDLE - radius)
save 'bulleye' 0x298
sketch # oupperhalf
include markset.e
include : dispiro
widths.rhs
flat (SB + OX) (XH / 2) [heading UPWARD]
curl (SB + OX) (XH - [Math.min (XH / 2 - 0.1) SMALLSMOOTHA])
arcvh
g4 (MIDDLE - CORRECTION_OMIDS) (XH - O)
archv
flat (RIGHTSB - OX) (XH - [Math.min (XH / 2 - 0.1) SMALLSMOOTHB])
curl (RIGHTSB - OX) (XH / 2) [heading DOWNWARD]
save 'oupperhalf' 0x1D16
sketch # olowerhalf
include markset.e
include : dispiro
widths.lhs
flat (SB + OX) (XH / 2) [heading DOWNWARD]
curl (SB + OX) [Math.min (XH / 2 - 0.1) SMALLSMOOTHB]
arcvh
g4 (MIDDLE + CORRECTION_OMIDS) O
archv
flat (RIGHTSB - OX) [Math.min (XH / 2 - 0.1) SMALLSMOOTHA]
curl (RIGHTSB - OX) (XH / 2) [heading UPWARD]
save 'olowerhalf' 0x1D17
### Q
do "Q and related ============================================================================="
sketch # Q.straight
set-width WIDTH
include glyphs.O AS_BASE
local shift : linreg 18 0 126 0.25 STROKE
include : dispiro
widths.rhs
flat (MIDDLE + WIDTH * 0.075 - STROKE * HVCONTRAST * shift) (-CAP * 0.2) [heading UPWARD]
curl (MIDDLE - STROKE * HVCONTRAST * shift) 0
save 'Q.straight'
sketch # Q.taily
set-width WIDTH
include glyphs.O AS_BASE
local shift : linreg 18 0.5 126 0.6 STROKE
local startx : MIDDLE + (STROKE * shift) * HVCONTRAST
local terminalx : MIDDLE + HOOKX
include : dispiro
widths.rhs
flat startx HALFSTROKE [heading DOWNWARD]
curl startx 0 [heading DOWNWARD]
arcvh
flat [Math.min (terminalx - 1) (startx + HOOK - STROKE)] (STROKE - HOOK)
curl terminalx (STROKE - HOOK)
save 'Q.taily'
select-variant 'Q' 'Q'
alias 'cyrQa' 0x51A 'Q'
### q
do "q and related ============================================================================="
sketch # q
set-width WIDTH
include markset.p
include : OBarRightShape
include : VBarRight RIGHTSB DESCENDER XH
if SLAB : begin
include : RightwardTopSerif RIGHTSB XH SIDEJUT
tag-contour 'serifRT'
include : CenterBottomSerif (RIGHTSB - HALFSTROKE * HVCONTRAST) DESCENDER JUT
save 'q' 'q'
save 'cyrqa' 0x51B
sketch # Qrtail
include markset.capital
include : OBarRightShape CAP
include : VBarRight RIGHTSB 0 CAP
include : create-glyph : glyph-construction
include glyphs.rtailBR
apply-transform : Upright
apply-transform : Translate RIGHTSB 0
apply-transform : Italify
if SLAB : begin
include : RightwardTopSerif RIGHTSB CAP SIDEJUT
tag-contour 'serifRT'
save 'Qrtail' 0x24A
sketch # qrtail
include markset.e
include : OBarRightShape
include : VBarRight RIGHTSB 0 XH
include : create-glyph : glyph-construction
include glyphs.rtailBR
apply-transform : Upright
apply-transform : Translate RIGHTSB 0
apply-transform : Italify
if SLAB : begin
include : RightwardTopSerif RIGHTSB XH SIDEJUT
tag-contour 'serifRT'
save 'qrtail' 0x24B
sketch # qhooktop
include markset.p
include glyphs.q
eject-contour 'serifRT'
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST) XH HOOKX (-HOOK)
save 'qhooktop' 0x2A0
### N
define { NShape } : do "N and related"
define [NShape top left right coward diagcoward xn] : glyph-construction
local topstroke : adviceBlackness [fallback diagcoward 4]
local stroke : adviceBlackness [fallback coward 1]
local halftopstroke : topstroke / 2
include : dispiro
flat left 0 [widths.heading 0 stroke UPWARD]
curl left (top * 0.4) [heading UPWARD]
straight.up.end left top [widths.heading 0 topstroke UPWARD]
include : dispiro
flat right top [widths.heading 0 stroke DOWNWARD]
curl right (top * 0.6) [heading DOWNWARD]
straight.down.end right 0 [widths.heading 0 topstroke DOWNWARD]
include : dispiro
flat (left + halftopstroke) top [widths.heading topstroke 0 DOWNWARD]
curl (right - halftopstroke) 0 [widths.heading 0 topstroke DOWNWARD]
include : AINSerifs top left right stroke xn
sketch # N
set-width WIDTH
include markset.capital
include : NShape CAP SB RIGHTSB
save 'N' 'N'
save 'Nu' 0x39D
sketch # smcpN
include markset.e
include : NShape XH SB RIGHTSB 3 3.5
save 'smcpN' 0x274
sketch # Nltail
include glyphs.N AS_BASE
eject-contour 'serifLB'
include : VerticalHook (SB + HALFSTROKE * HVCONTRAST) 0 (-HOOKX) HOOK
save 'Nltail' 0x19D
list NShape
### n
do "n and related"
sketch # n
set-width WIDTH
include markset.e
include : nShoulder
left -- (SB + STROKE * HVCONTRAST)
right -- RIGHTSB
fine -- SHOULDERFINE
include : VBarLeft SB 0 XH
if SLAB : begin
include : LeftwardTopSerif SB XH SIDEJUT
tag-contour 'serifLT'
if (para.isItalic)
: then : include : tagged 'serifRB' : RightwardBottomSerif RIGHTSB 0 SIDEJUT
: else : include : tagged 'serifRB' : CenterBottomSerif (RIGHTSB - HALFSTROKE * HVCONTRAST) 0 JUT
if (!para.isItalic) : begin
include : tagged 'serifLB' : CenterBottomSerif (SB + HALFSTROKE * HVCONTRAST) 0 JUT
save 'n' 'n'
save 'cyrpe.italic'
sketch # napostrophe
include glyphs.commaAbove
apply-transform : Translate (WIDTH + SB - MIDDLE) 0
include glyphs.n AS_BASE
save 'napostrophe' 0x149
sketch # eng
include markset.p
include glyphs.n false
eject-contour 'serifRB'
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST) 0 (-HOOKX) HOOK
save 'eng' 0x14B
sketch # Eng
include markset.capital
include : nShoulder
left -- (SB + STROKE)
right -- RIGHTSB
top -- CAP
bottom -- (HOOK + HALFSTROKE + O)
sma -- SMOOTHA
smb -- SMOOTHB
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST) (HOOK + HALFSTROKE + O) [Math.max ((SB - RIGHTSB) / 2 + HALFSTROKE) (-HOOKX)] HOOK
include : VBar (SB + HALFSTROKE * HVCONTRAST) 0 CAP
save 'Eng' 0x14A
sketch # nltail
include glyphs.n AS_BASE
eject-contour 'serifLB'
include : VerticalHook (SB + HALFSTROKE * HVCONTRAST) 0 (-HOOKX) HOOK
save 'nltail' 0x272
sketch # ncurlytail
local fine : adviceBlackness 4
local rinner : clamp (WIDTH * 0.065) (XH * 0.05) (fine * 0.35)
local wide : adviceBlackness 3
local m1 : Math.min RIGHTSB (WIDTH - rinner * 2 - fine - OX)
local x2 : mix SB m1 0.5
local y2 : -fine
include markset.e
include : VBarLeft SB 0 XH wide
include : dispiro
nShoulderKnots
left -- (SB + wide * HVCONTRAST)
right -- m1
fine -- SHOULDERFINE
bottom -- (rinner * 2 + fine)
stroke -- wide
CurlyTail fine rinner m1 0 (m1 + rinner * 2 + fine) x2 y2
if SLAB : begin
include : LeftwardTopSerif SB XH SIDEJUT
tag-contour 'serifLT'
if (!para.isItalic) : begin
include : CenterBottomSerif (SB + HALFSTROKE * HVCONTRAST) 0 JUT
tag-contour 'serifLB'
save 'ncurlytail' 0x235
# eta
sketch # eta
include markset.p
set-anchor 'lf' BASE (SB + HALFSTROKE) 0
include : nShoulder
left -- (SB + STROKE * HVCONTRAST)
right -- RIGHTSB
bottom -- DESCENDER
include : VBarLeft SB 0 XH
if SLAB : begin
include : LeftwardTopSerif SB XH SIDEJUT
tag-contour 'serifLT'
save 'eta' 0x3B7
sketch # latinEta
include markset.if
set-anchor 'lf' BASE (SB + HALFSTROKE) 0
include : nShoulder
left -- (SB + STROKE * HVCONTRAST)
right -- RIGHTSB
top -- CAP
bottom -- DESCENDER
include : VBar (SB + HALFSTROKE * HVCONTRAST) 0 CAP
if SLAB : begin
include : LeftwardTopSerif SB CAP SIDEJUT
tag-contour 'serifLT'
if (para.isItalic)
: then : include : tagged 'serifRB' : RightwardBottomSerif RIGHTSB DESCENDER SIDEJUT
: else : include : tagged 'serifRB' : CenterBottomSerif (RIGHTSB - HALFSTROKE * HVCONTRAST) DESCENDER JUT
if (!para.isItalic) : begin
include : CenterBottomSerif (SB + HALFSTROKE * HVCONTRAST) 0 JUT
tag-contour 'serifLB'
save 'latinEta' 0x220
sketch # latineta
include markset.p
set-anchor 'lf' BASE (SB + HALFSTROKE) 0
include : nShoulder
left -- (SB + STROKE * HVCONTRAST)
right -- RIGHTSB
bottom -- DESCENDER
include : VBarLeft SB 0 XH
if SLAB : begin
include : LeftwardTopSerif SB XH SIDEJUT
tag-contour 'serifLT'
if (para.isItalic)
: then : include : tagged 'serifRB' : RightwardBottomSerif RIGHTSB DESCENDER SIDEJUT
: else : include : tagged 'serifRB' : CenterBottomSerif (RIGHTSB - HALFSTROKE * HVCONTRAST) DESCENDER JUT
if (!para.isItalic) : begin
include : CenterBottomSerif (SB + HALFSTROKE * HVCONTRAST) 0 JUT
tag-contour 'serifLB'
save 'latineta' 0x19E
### U
define { UShape } : do "U and related"
define [UShape top bottom stroke oper] : glyph-construction
include : dispiro
widths.lhs stroke
flat SB top [heading DOWNWARD]
curl SB (bottom + SMOOTHB)
arcvh
g4 (MIDDLE + CORRECTION_OMIDS) (bottom + O)
archv
flat RIGHTSB (bottom + SMOOTHA)
curl RIGHTSB top [heading UPWARD]
if [not oper] : include : AIVSerifs top
sketch # U
set-width WIDTH
include markset.capital
include : UShape CAP 0
save 'U' 'U'
sketch # smcpU
include markset.e
include : UShape XH 0
save 'smcpU' 0x1D1C
list UShape
### u
do "u and related"
sketch # u
set-width WIDTH
include markset.e
set-anchor 'trailing' BASE (RIGHTSB - markHalfStroke) 0
include glyphs.n
eject-contour 'serifRB'
eject-contour 'serifLB'
retag-contour 'serifLT' 'serifRB'
include : FlipAround MIDDLE (XH / 2)
if SLAB : begin
include : LeftwardTopSerif (RIGHTSB - STROKE * HVCONTRAST) XH SIDEJUT
include : LeftwardTopSerif SB XH SIDEJUT
save 'u' 'u'
# upsilon
sketch # upsilon
include markset.e
include : dispiro
widths.lhs
flat (SB + OX - O) XH [heading DOWNWARD]
curl (SB + OX - O) SMALLSMOOTHB
arcvh
g4 (MIDDLE + CORRECTION_OMIDS) O
archv
flat (RIGHTSB - OX + O) SMALLSMOOTHA
curl (RIGHTSB - OX + O) XH [heading UPWARD]
save 'upsilon' 0x3C5
define [LatinUpsilon2Shape top sma smb] : glyph-construction
include : dispiro
widths.lhs
flat SB top [heading DOWNWARD]
curl SB smb
arcvh
g4 (MIDDLE + CORRECTION_OMIDS) O
archv
flat RIGHTSB sma
curl RIGHTSB (top - HOOK - HALFSTROKE) [heading UPWARD]
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST) (top - HOOK - HALFSTROKE) (-(RIGHTSB - HALFSTROKE * HVCONTRAST - MIDDLE)) (-HOOK)
sketch # latinUpsilon2
include markset.e
include : LatinUpsilon2Shape CAP SMOOTHA SMOOTHB
save 'latinUpsilon2' 0x1B2
sketch # latinupsilon2
include markset.e
include : LatinUpsilon2Shape XH SMALLSMOOTHA SMALLSMOOTHB
save 'latinupsilon2' 0x28B
### M
do "M and related"
define [MShape top _div] : glyph-construction
local div : fallback _div 1
local df : DivFrame div 3
local topstroke : adviceBlackness 5 div
local halftopstroke : topstroke / 2
local middleY : top * 0.3 / div
include : dispiro
flat df.leftSB 0 [widths.heading 0 STROKE UPWARD]
curl df.leftSB (top * 0.2) [heading UPWARD]
straight.up.end df.leftSB top [widths.heading 0 topstroke UPWARD]
include : dispiro
flat df.rightSB 0 [widths.heading STROKE 0 UPWARD]
curl df.rightSB (top * 0.2) [heading UPWARD]
straight.up.end df.rightSB top [widths.heading topstroke 0 UPWARD]
include : dispiro
flat (df.leftSB + halftopstroke) top [widths.heading topstroke 0 DOWNWARD]
curl df.middle middleY [widths.heading (topstroke / 2) (topstroke / 2) DOWNWARD]
include : dispiro
flat (df.rightSB - halftopstroke) top [widths.heading 0 topstroke DOWNWARD]
curl df.middle middleY [widths.heading (topstroke / 2) (topstroke / 2) DOWNWARD]
include : AIMSerifs top df.leftSB df.rightSB
sketch # M
local df : DivFrame para.diversityM
include df.markSet.capital
set-width df.width
include : MShape CAP df.div
save 'M' 'M'
save 'Mu' 0x39C
save 'cyrEm' 0x41C
sketch # cyrem
local df : DivFrame para.diversityM
include df.markSet.e
set-width df.width
include : MShape XH df.div
save 'cyrem' 0x43C
### m
do "m and related ============================================================================"
define [dfM] : DivFrame para.diversityM 3
define [SmallMShape top bot mbot df] : glyph-construction
local m1 : mix df.leftSB (df.middle + df.mvs / 2 * HVCONTRAST) 0.5
local m2 : mix df.rightSB (df.middle - df.mvs / 2 * HVCONTRAST) 0.5
include : mShoulderSpiro
left -- (df.leftSB + df.mvs * HVCONTRAST)
right -- (df.middle + df.mvs / 2 * HVCONTRAST)
top -- top
bottom -- mbot
width -- df.mvs
fine -- (df.mvs * SHOULDERFINE / STROKE)
diversity -- df.div
include : mShoulderSpiro
left -- (df.middle + df.mvs * 0.5 * HVCONTRAST)
right -- df.rightSB
top -- top
bottom -- bot
width -- df.mvs
fine -- (df.mvs * SHOULDERFINE / STROKE)
diversity -- df.div
include : VBarLeft df.leftSB bot top df.mvs
if SLAB : begin
local jut : JUT * df.mvs / STROKE + O
if (df.width > jut * 7) : begin
include : intersection
CenterTopSerif (df.leftSB + 0.5 * df.mvs * HVCONTRAST) top jut df.mvs
spiro-outline
corner SB bot
corner SB top
corner 0 top
corner 0 bot
tag-contour 'serifLT'
if (!para.isItalic) : begin
include : CenterBottomSerif (df.leftSB + 0.5 * df.mvs * HVCONTRAST) bot jut df.mvs
tag-contour 'serifLB'
include : CenterBottomSerif df.middle bot jut df.mvs
tag-contour 'serifMB'
include : CenterBottomSerif (df.rightSB - 0.5 * df.mvs * HVCONTRAST) bot jut df.mvs
tag-contour 'serifRB'
: else : begin
include : intersection
RightwardBottomSerif (df.rightSB + O) bot (jut / 2) df.mvs
spiro-outline
corner (df.rightSB + O) bot
corner (df.rightSB + O) top
corner df.width top
corner df.width bot
tag-contour 'serifRB'
: else : begin
include : LeftwardTopSerif df.leftSB top SIDEJUT df.mvs
tag-contour 'serifLT'
if (!para.isItalic) : include : LeftwardBottomSerif df.leftSB bot SIDEJUT df.mvs
include : RightwardBottomSerif df.rightSB bot SIDEJUT df.mvs
tag-contour 'serifRB'
sketch # m.normal
local df : dfM
set-width df.width
include df.markSet.e
include : SmallMShape XH 0 0 df
save 'm.normal'
save 'cyrte.italic'
sketch # m.shortleg
local df : dfM
set-width df.width
include df.markSet.e
include : SmallMShape XH 0 [XH * 0.2] df
eject-contour 'serifMB'
save 'm.shortleg'
select-variant 'm' 'm'
composite 'cyrtedescender.italic' glyphs.'cyrte.italic' [CyrDescender (WIDTH * para.diversityM - SB)] markset.e
sketch # mltail
local df : dfM
include df.markSet.p
include glyphs.m
eject-contour 'serifRB'
include : VerticalHook (df.rightSB - df.mvs / 2 * HVCONTRAST) 0 (-HOOKX) HOOK df.mvs
save 'mltail' 0x271
turned nothing 0x26F 'm' [dfM].middle (XH / 2)
sketch # capitalTurnm
local df : dfM
set-width df.width
include df.markSet.capital
include : SmallMShape CAP 0 0 df
include : FlipAround df.middle (CAP / 2)
save 'capitalTurnm' 0x19C
sketch # turnmleg
local df : dfM
set-width df.width
include df.markSet.p
include glyphs.m
eject-contour 'serifLT'
include : FlipAround df.middle (XH / 2)
include : VBarRight df.rightSB DESCENDER 0 df.mvs
save 'turnmleg' 0x270
### H
do "H and related"
define [HShape top] : glyph-construction
include : VBarLeft SB 0 top
include : VBarRight RIGHTSB 0 top
include : HBar (SB - O) (RIGHTSB + O) (top * BARPOS)
include : AIHSerifs top
sketch # H
set-width WIDTH
include markset.capital
include : HShape CAP
save 'H' 'H'
save 'Eta' 0x397
save 'cyrEn' 0x41D
composite glyphs.cyrEn [CyrDescender RIGHTSB] [into-unicode 0x4A2]
sketch # cyren
include markset.e
include : HShape XH
save 'cyren' 0x43D
save 'smcpH' 0x29C
composite glyphs.cyren [CyrDescender RIGHTSB] [into-unicode 0x4A3]
sketch # Hbar
include glyphs.H AS_BASE
include : HOverlayBar [mix SB 0 0.7] [mix RIGHTSB WIDTH 0.7] [mix CAPMIDDLE CAP 0.45]
save 'Hbar' 0x126
### h
do "h and related"
sketch # h
set-width WIDTH
include markset.b
include : nShoulder
left -- (SB + STROKE * HVCONTRAST)
right -- RIGHTSB
include : VBarLeft SB 0 CAP
if SLAB : begin
include : LeftwardTopSerif SB CAP SIDEJUT
if (para.isItalic)
: then : include : RightwardBottomSerif RIGHTSB 0 SIDEJUT
: else : include : CenterBottomSerif (RIGHTSB - HALFSTROKE * HVCONTRAST) 0 JUT
tag-contour 'serifRB'
if (!para.isItalic) : begin
include : CenterBottomSerif (SB + HALFSTROKE * HVCONTRAST) 0 JUT
tag-contour 'serifLB'
save 'h' 'h'
save 'cyrshha' 0x4BB
sketch # hhooktop
include markset.b
include : nShoulder
left -- (SB + STROKE * HVCONTRAST)
right -- RIGHTSB
include : HooktopLeftBar
if SLAB : begin
if (para.isItalic)
: then : include : RightwardBottomSerif RIGHTSB 0 SIDEJUT
: else : include : CenterBottomSerif (RIGHTSB - HALFSTROKE * HVCONTRAST) 0 JUT
tag-contour 'serifRB'
if (!para.isItalic) : begin
include : CenterBottomSerif (SB + HALFSTROKE * HVCONTRAST) 0 JUT
tag-contour 'serifLB'
save 'hhooktop' 0x266
sketch # hhooktopltail
include markset.p
include glyphs.hhooktop
eject-contour 'serifRB'
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST) 0 (-HOOKX) HOOK
save 'hhooktopltail' 0x267
sketch # hltail
include markset.p
include glyphs.h
eject-contour 'serifRB'
include : VerticalHook (RIGHTSB - HALFSTROKE * HVCONTRAST) 0 (-HOOKX) HOOK
save 'hltail' 0xA727
turned nothing 0x265 'h' MIDDLE (XH / 2) markset.p
sketch # hookturnh
include : nShoulder
left -- (SB + STROKE * HVCONTRAST)
right -- RIGHTSB
bottom -- (HOOK + HALFSTROKE + 1)
include : VBarLeft SB 0 CAP
include : create-glyph : glyph-construction
include glyphs.rtailBR
apply-transform : Upright
apply-transform : Translate RIGHTSB (HOOK + HALFSTROKE)
apply-transform : Italify
include : FlipAround MIDDLE (XH / 2)
include markset.p
if SLAB : begin
include : LeftwardTopSerif (RIGHTSB - STROKE * HVCONTRAST) XH SIDEJUT
include : CenterBottomSerif (RIGHTSB - HALFSTROKE * HVCONTRAST) DESCENDER JUT
save 'hookturnh' 0x2AE
sketch # hookturnhrtail
include : nShoulder
left -- (SB + STROKE * HVCONTRAST)
right -- RIGHTSB
bottom -- (HOOK + HALFSTROKE + 1)
include : VBarLeft SB 0 (XH - 1)
include : create-glyph : glyph-construction
include glyphs.rtailBR
apply-transform : Upright
apply-transform : Translate RIGHTSB (HOOK + HALFSTROKE)
apply-transform : Italify
include : FlipAround MIDDLE (XH / 2)
include : create-glyph : glyph-construction
include glyphs.rtailBR
apply-transform : Upright
apply-transform : Translate RIGHTSB 0
apply-transform : Italify
include markset.p
if SLAB : begin
include : LeftwardTopSerif (RIGHTSB - STROKE * HVCONTRAST) XH SIDEJUT
save 'hookturnhrtail' 0x2AF
sketch # hbar
include glyphs.h AS_BASE
include : HOverlayBar [mix SB 0 0.7] [mix SB RIGHTSB 0.5] [mix XH CAP 0.45]
save 'hbar' 0x127
save 'cyrtshe' 0x45B
### F
define { FShape } : do "F and related"
define [FShape top y noserif] : glyph-construction
local stroke : adviceBlackness2 2.875 2 CAP
include : VBarLeft (SB * 1.5) 0 [fallback top CAP] stroke
include : HBarTop (SB * 1.5 - O) RIGHTSB [fallback top CAP] stroke
include : HBar (SB * 1.5 - O) (RIGHTSB - [Math.max HALFSTROKE ((RIGHTSB - SB) * 0.15)] - [if SLAB (STROKE * 0.25) 0]) ([fallback top CAP] * [fallback y [if SLAB 0.52 0.54]]) stroke
if (SLAB && !noserif) : begin
include : LeftwardTopSerif (SB * 1.5) [fallback top CAP] SIDEJUT
include : CenterBottomSerif (SB * 1.5 + HALFSTROKE * HVCONTRAST) 0 JUT
tag-contour 'serifBottom'
include : DownwardRightSerif RIGHTSB [fallback top CAP] VJUT
sketch # F
set-width WIDTH
include markset.capital
include : FShape
save 'F' 'F'
sketch # Fltail
include glyphs.F AS_BASE
eject-contour 'serifBottom'
include : VerticalHook (SB * 1.5 + HALFSTROKE * HVCONTRAST) 0 (-HOOKX) HOOK
save 'Fltail' 0x191
list FShape
### long s, and f
define { LongSShape } : do "long-s and f related"
define fovershoot : fallback para.fovershoot (O * 6)
sketch # longs.straight
set-width WIDTH
include markset.b
include : dispiro
widths.center
flat (MIDDLE - FBALANCE) 0 [heading UPWARD]
curl (MIDDLE - FBALANCE) (CAP - FHOOK)
arcvh
straight.right.end (MIDDLE - FBALANCE + HOOKX) (CAP - HALFSTROKE - fovershoot)
set-anchor 'overlay' BASE (MIDDLE - FBALANCE + STROKE * 0.5 * HVCONTRAST) (CAP * OVERLAYPOS)
if SLAB : begin
include : CenterBottomSerif (MIDDLE - FBALANCE) 0 JUT
tag-contour 'serifMB'
save 'longs.straight'
sketch # longs.upright
include markset.b
local m : MIDDLE - JBALANCE - HALFSTROKE * HVCONTRAST
local r : m + (WIDTH * 0.5) + STROKE * HVCONTRAST - OXHOOK
include : dispiro
widths.lhs
g4 r (CAP - HOOK)
hookstart (CAP - O)
flat m (CAP - SMOOTHA)
curl m 0 [heading DOWNWARD]
set-anchor 'overlay' BASE (m + STROKE * 0.65 * HVCONTRAST) (CAP * OVERLAYPOS)
if SLAB : begin
include : tagged 'serifLB' : CenterBottomSerif (m + HALFSTROKE * HVCONTRAST + RBALANCE * 0.35) 0 (JUT + RBALANCE * 0.65)
save 'longs.upright'
define [LongSShape top bottom hookx hooky fine] : glyph-construction
local w [fallback fine STROKE]
include : dispiro
widths.center w
straight.right.start (MIDDLE - hookx) (bottom + w / 2 + fovershoot)
flat MIDDLE (bottom + hooky)
curl MIDDLE (top - hooky)
straight.right.end (MIDDLE + hookx) (top - w / 2 - fovershoot)
sketch 'esh'
include markset.if
include : LongSShape CAP (-HOOK) HOOKX HOOK
branch
save 'longs.italic'
save 'esh' 0x283
branch
include : HOverlayBar (MIDDLE - LONGJUT * 0.6) (MIDDLE + LONGJUT * 0.6) (XH * 0.25)
save 'eshbar' 0x284
sketch # longs
set-width WIDTH
if (para.isItalic)
then : include glyphs.'longs.italic' AS_BASE
else : include glyphs.'longs.upright' AS_BASE
save 'longs' 0x17F
sketch # eshcurlytail
include markset.if
local fine : adviceBlackness 3.5
local rinner : LONGJUT / 2 - fine / 2
local m1 : MIDDLE - HALFSTROKE * HVCONTRAST - FBALANCE
local x2 : mix RIGHTSB m1 0.25
local y2 : DESCENDER + O
include glyphs.'longs.straight' false
eject-contour 'serifMB'
include : dispiro
widths.lhs
flat m1 XH [heading DOWNWARD]
curl m1 (DESCENDER + fine + rinner * 2)
CurlyTail
fine -- fine
rinner -- rinner
xleft -- m1
bottom -- DESCENDER
right -- (m1 - LONGJUT)
x2 -- x2
y2 -- y2
save 'eshcurlytail' 0x286
sketch # ifishhook
include markset.p
include : VBar MIDDLE DESCENDER (XH - HOOK)
include : VerticalHook MIDDLE (XH - HOOK) (-LONGJUT + LBALANCE) (-HOOK + HALFSTROKE)
apply-transform : Translate LBALANCE 0
if SLAB : begin
include : CenterBottomSerif MIDDLE DESCENDER JUT
save 'ifishhook' 0x27F
sketch # iviby
include markset.p
include : VBar MIDDLE 0 (XH - HOOK - HALFSTROKE)
include : VerticalHook MIDDLE (XH - HOOK - HALFSTROKE) (-LONGJUT) (-HOOK)
include : VerticalHook MIDDLE 0 LONGJUT HOOK
save 'iviby' 0x285
define fbar : XH * para.fbarpos + STROKE * para.fbarStrokeAdj
sketch # f.straight
local fovershoot2 (O * 2)
include markset.b
local barleft : [mix SB RIGHTSB 0.35] - STROKE * 0.25 * HVCONTRAST
include : dispiro
widths.lhs
g4 (RIGHTSB + RBALANCE2 - OXE) (CAP - HOOK * 0.75 - fovershoot2)
hookstart (CAP - O - fovershoot2) (tight -- true)
flat barleft (CAP - SMOOTHA * 0.8 - fovershoot2)
curl barleft 0 [heading DOWNWARD]
include : dispiro
widths.rhs
flat ([mix SB RIGHTSB 0] - HALFSTROKE * TANSLANT) fbar
curl ([mix SB RIGHTSB 0.95] - HALFSTROKE * TANSLANT) fbar
branch
save 'f.straight'
save 'lenisf' 0xAB35
branch
include : dispiro
widths.lhs
flat ([mix SB RIGHTSB 0.02] + HALFSTROKE * TANSLANT) 0
curl ([mix SB RIGHTSB 0.875] + HALFSTROKE * TANSLANT) 0
save 'f.serifed'
define dfNarrowF : DivFrame para.diversityF
sketch # f.narrow
local df : DivFrame para.diversityF
set-width df.width
include df.markSet.b
local crossLeft : mix 0 SB (1 / 2)
local crossRight : mix df.width df.rightSB (1 / 2)
local barleft : [mix crossLeft crossRight 0.42] - STROKE * 0.375 * HVCONTRAST
local tTurn : Math.max (HOOK * 0.9) (STROKE * 1.375) : Math.min HOOK (STROKE * 1.75)
include : dispiro
widths.lhs
flat crossRight CAP
curl [Math.min (barleft + tTurn) (crossRight - 1)] CAP
archv
flat barleft [Math.max XH (CAP - tTurn)]
curl barleft 0 [heading DOWNWARD]
include : dispiro
widths.rhs
flat (crossLeft - HALFSTROKE * TANSLANT) fbar
curl (crossRight - HALFSTROKE * TANSLANT) fbar
save 'f.narrow'
sketch # tailed
include glyphs.'longs.italic' AS_BASE
include : dispiro
widths.rhs
flat (MIDDLE - LONGJUT - HALFSTROKE * TANSLANT) fbar
curl (MIDDLE + LONGJUT - HALFSTROKE * TANSLANT) fbar
save 'f.tailed'
save 'fltail' 0x192
select-variant 'f' 'f'
turned 'turnf.straight' nothing 'f.straight' MIDDLE (XH / 2) markset.p
turned 'turnf.serifed' nothing 'f.serifed' MIDDLE (XH / 2) markset.p
turned 'turnf.narrow' nothing 'f.narrow' dfNarrowF.middle (XH / 2) dfNarrowF.markSet.p
turned 'turnf.tailed' nothing 'f.tailed' MIDDLE (XH / 2) markset.p
select-variant 'turnf' 0x25F (follow -- 'f')
do "f ligatures"
local shift (-(WIDTH * 0.055 + SB * 0.5))
local barr RIGHTSB
local hbarleft (SB + shift + STROKE * [if para.slantAngle 0.5 0.25])
sketch # f_i
include markset.b
include : create-glyph : glyph-construction
include glyphs.longs
apply-transform : Translate shift 0
include : VBarRight barr 0 fbar
include : HBarTop hbarleft barr fbar
if SLAB : begin
if para.isItalic
: then : include : tagged 'serifRB' : RightwardBottomSerif barr 0 SIDEJUT
: else : include : tagged 'serifRB' : CenterBottomSerif (barr - HALFSTROKE * HVCONTRAST) 0 JUT
save 'f_i' 0xFB01
sketch # f_l.upright
local m : MIDDLE - JBALANCE - HALFSTROKE * HVCONTRAST + shift
include : dispiro
widths.rhs
flat m 0 [heading UPWARD]
curl m (CAP - SMOOTHA)
hookend (CAP - O)
g4 (barr + OXHOOK) (CAP - HOOK)
include : VBarRight barr 0 (CAP - HOOK)
include : dispiro
widths.rhs
flat ([Math.min (m - STROKE * 0.3) hbarleft] - TANSLANT * HALFSTROKE) fbar
curl ([mix SB barr 0.6] - TANSLANT * HALFSTROKE) fbar
if SLAB : begin
include : tagged 'serifLB' : CenterBottomSerif (m + HALFSTROKE * HVCONTRAST + RBALANCE * 0.35) 0 (JUT + RBALANCE * 0.65)
include : tagged 'serifRB' : CenterBottomSerif (barr - HALFSTROKE * HVCONTRAST) 0 JUT
save 'f_l.upright'
sketch # f_l.italic
include : create-glyph : glyph-construction
include glyphs.'longs.italic' AS_BASE
apply-transform : Translate shift 0
include : VBarRight barr 0 CAP
include : HBarTop hbarleft [mix SB barr 0.65] fbar
if SLAB : include : tagged 'serifRB' : RightwardBottomSerif barr 0 SIDEJUT
save 'f_l.italic'
italic-variant 'f_l' 0xFB02
list LongSShape
### E
define { EShape } : do "E and related"
define [EShape top] : glyph-construction
local stroke : adviceBlackness2 2.875 2 CAP
include : FShape top nothing true
include : HBarBottom (SB * 1.5 - O) RIGHTSB 0 stroke
if SLAB : begin
include : LeftwardTopSerif (SB * 1.5) [fallback top CAP] SIDEJUT
include : CenterBottomSerif (SB * 1.5 + HALFSTROKE * HVCONTRAST) 0 JUT
tag-contour 'serifBottom'
include : DownwardRightSerif RIGHTSB [fallback top CAP] VJUT
include : LeftwardBottomSerif (SB * 1.5) 0 SIDEJUT
include : UpwardRightSerif RIGHTSB 0 VJUT
sketch # turnE
set-width WIDTH
include markset.capital
include : EShape CAP
save 'E' 'E'
save 'Epsilon' 0x395
save 'cyrIe' 0x415
include : FlipAround MIDDLE (CAP / 2)
save 'turnE' 0x18E
sketch # smcpturnE
include markset.e
include : EShape XH
include : FlipAround MIDDLE (XH / 2)
save 'smcpturnE' 0x2C7B
list EShape
### e
define { SmallEShape RevSmallEShape } : do "e and related"
define [SmallEShape top stroke barpos curly] : glyph-construction
local barbottom : top * [fallback barpos EBARPOS] - (stroke / 2)
local hookx (RIGHTSB - OXHOOK + TAILADJX * TANSLANT)
local hookmiddle : [mix (SB + O) hookx 0.55] + CORRECTION_OMIDS
local hook : Math.min AHOOK : if para.isItalic top (stroke / 2 + (top - stroke * 3) / 4)
include : dispiro
widths.lhs stroke
flat (RIGHTSB - OX) barbottom [heading UPWARD]
curl (RIGHTSB - OX) (top - SMALLSMOOTHB)
arcvh
g4 (MIDDLE - CORRECTION_OMIDS) (top - O)
archv
[if ((SMALLSMOOTHA + SMALLSMOOTHB) / top > 0.75) flat.ai flat] (SB + OX) (top - SMALLSMOOTHA)
[if ((SMALLSMOOTHA + SMALLSMOOTHB) / top > 0.75) curl.ai curl] (SB + OX) (0 + SMALLSMOOTHB)
hookend O (sw -- stroke)
g4 (RIGHTSB - OX * [if para.isItalic 0 0.5]) hook
include : HBarBottom (SB + (stroke / 2) + OX) (RIGHTSB - (stroke / 2) - OX) barbottom stroke
sketch # cyrie
include markset.e
include : SmallEShape XH [adviceBlackness2 2.875 2 XH]
save 'e' 'e'
save 'cyrie' 0x435
include : FlipAround MIDDLE (XH / 2)
save 'turne' 0x1DD
save 'schwa' 0x259
save 'cyrschwa' 0x4D9
sketch # cyrSchwa
include markset.capital
include : SmallEShape CAP [adviceBlackness2 2.875 2 CAP]
include : FlipAround MIDDLE (CAP / 2)
save 'Schwa' 0x18F
save 'cyrSchwa' 0x4D8
define [RevSmallEShape top stroke barpos] : glyph-construction
local barbottom (top * [fallback barpos EBARPOS] - HALFSTROKE)
local hookx SB
local hookmiddle : [mix (RIGHTSB - O) hookx 0.55] + CORRECTION_OMIDS
include : dispiro
widths.rhs stroke
flat (SB + OX) barbottom [heading UPWARD]
curl (SB + OX) (top - SMALLSMOOTHA)
arcvh
g4 MIDDLE (top - O)
archv
[if ((SMALLSMOOTHA + SMALLSMOOTHB) / top > 0.75) flat.ai flat] (RIGHTSB - OX) (top - SMALLSMOOTHB)
[if ((SMALLSMOOTHA + SMALLSMOOTHB) / top > 0.75) curl.ai curl] (RIGHTSB - OX) SMALLSMOOTHA
hookend O (sw -- stroke)
g4 (SB + O) AHOOK
include : HBarBottom (SB + (stroke / 2)) (RIGHTSB - (stroke / 2)) barbottom stroke
sketch # reve
include markset.e
include : RevSmallEShape XH [adviceBlackness2 2.875 2 XH]
save 'reve' 0x258
list SmallEShape RevSmallEShape
### T
do "T and related"
define [TShape top] : glyph-construction
include : VBar MIDDLE 0 top
local l : SB + OX * 1.5
local r : RIGHTSB - OX * 1.5
include : tagged 'strokeLT' : HBarTop l MIDDLE top
include : tagged 'strokeRT' : HBarTop MIDDLE r top
if SLAB : begin
include : tagged 'serifRT' : DownwardRightSerif r top VJUT MVERTSTROKE
include : tagged 'serifLT' : DownwardLeftSerif l top VJUT MVERTSTROKE
include : tagged 'serifRB' : RightwardBottomSerif MIDDLE 0 (LONGJUT * 0.6)
include : tagged 'serifRB' : LeftwardBottomSerif MIDDLE 0 (LONGJUT * 0.6)
sketch # cyrTe
include markset.capital
set-anchor 'bottomright' BASE (MIDDLE + HALFSTROKE * HVCONTRAST) 0
include : TShape CAP
save 'T' 'T'
save 'Tau' 0x3A4
save 'cyrTe' 0x422
branch
include [CyrDescender (MIDDLE + HALFSTROKE * HVCONTRAST)]
include markset.if
save 'cyrTedescender' 0x4AC
branch
include : FlipAround MIDDLE (CAP / 2)
save 'turnT' 0xA7B1
branch
include : HOverlayBar [mix MIDDLE SB 0.8] [mix MIDDLE RIGHTSB 0.8] [mix 0 CAP 0.45]
save 'Tbar' 0x166
branch
eject-contour 'serifLT'
eject-contour 'strokeLT'
include : LeftHook (SB + LeftHook.extension) CAP MIDDLE
save 'Thookleft' 0x1AC
sketch # cyrtedescender.upright
include markset.e
include : TShape XH
save 'cyrte.upright'
include [CyrDescender (MIDDLE + HALFSTROKE * HVCONTRAST)]
include markset.p
save 'cyrtedescender.upright'
italic-variant 'cyrtedescender' 0x4AD
sketch # tau
include markset.e
include : HBar SB RIGHTSB (XH - HALFSTROKE)
include : VBar MIDDLE 0 XH
save 'tau' 0x3C4
### t
do "t and related"
define tcenter : MIDDLE - TBALANCE - STROKE * 0.5 * HVCONTRAST
define dfNarrowT : DivFrame para.diversityF
define [SmallTShape top bot] : glyph-construction
local hookx : tcenter + (WIDTH - SB * 2) * 0.8 + STROKE * 0.25 * HVCONTRAST
local turn : [mix tcenter hookx 0.5] + CORRECTION_OMIDS
local smb : Math.max HOOK ((turn - tcenter) * 1.2)
local G : dispiro
widths.lhs
flat tcenter top [heading DOWNWARD]
curl tcenter (bot + smb)
hookend (bot + O) (tight -- !para.isItalic)
g4 hookx (bot + HOOK)
local g : G.call currentGlyph # Not using include
set-anchor 'bottomright' BASE g.knots.(g.knots.length - 1).x g.knots.(g.knots.length - 1).y
set-anchor 'below' BASE [mix tcenter g.knots.(g.knots.length - 1).x : linreg 18 0.375 126 0.5 STROKE] bot
include : dispiro
widths.rhs
flat (tcenter + HALFSTROKE - LONGJUT + TBALANCE2 - HALFSTROKE * TANSLANT) XH
curl (tcenter + HALFSTROKE + LONGJUT + TBALANCE2 - HALFSTROKE * TANSLANT) XH
sketch # t.standard
set-width WIDTH
include markset.b
include : SmallTShape CAP 0
save 't.standard'
sketch # t.narrow
local df : DivFrame para.diversityF
set-width df.width
include df.markSet.b
local crossLeft : mix 0 SB (1 / 2)
local crossRight : mix df.width df.rightSB (1 / 2)
local barleft : [mix crossLeft crossRight 0.42] - STROKE * 0.375 * HVCONTRAST
local tTurn : Math.max (HOOK * 0.9) (STROKE * 1.375) : Math.min HOOK (STROKE * 1.75)
include : dispiro
widths.rhs
flat crossRight 0
curl [Math.min (barleft + tTurn) (crossRight - 1)] 0
archv
flat barleft tTurn
curl barleft CAP [heading UPWARD]
include : dispiro
widths.rhs
flat (crossLeft - HALFSTROKE * TANSLANT) XH
curl (crossRight - HALFSTROKE * TANSLANT) XH
set-anchor 'topright' BASE crossRight CAP
save 't.narrow'
sketch # t.cross
set-width WIDTH
include markset.b
include : VBar MIDDLE 0 CAP
include : HBarTop (MIDDLE - LONGJUT) (MIDDLE + LONGJUT) XH
save 't.cross'
select-variant 't' 't'
turned 'turnt.standard' nothing 't.standard' MIDDLE (XH / 2) markset.p
turned 'turnt.cross' nothing 't.cross' MIDDLE (XH / 2) markset.p
turned 'turnt.narrow' nothing 't.narrow' dfNarrowT.middle (XH / 2) dfNarrowT.markSet.p
select-variant 'turnt' 0x287 (follow -- 't')
sketch # tltail
include markset.if
include glyphs.('t.standard')
local attach : utp currentGlyph.gizmo glyphs.('t.standard').anchors.bottomright
include : VBarRight attach.x 0 attach.y
include : VerticalHook (attach.x - HALFSTROKE * HVCONTRAST) 0 (-HOOKX) HOOK
save 'tltail' 0x1AB
sketch # thooktop
include markset.e
include : SmallTShape (XH - HALFSTROKE) 0
include : VerticalHook (tcenter + HALFSTROKE * HVCONTRAST) XH HOOKX (-HOOK)
save 'thooktop' 0x1AD
sketch # trtail
include markset.if
include : SmallTShape CAP DESCENDER
save 'trtail' 0x288
sketch # tcurlytail
include markset.b
local fine : adviceBlackness 3.5
local rinner : LONGJUT / 2 - fine / 2
local x2 : mix SB tcenter 0.4
local y2 : -fine
include : HBarTop (tcenter + HALFSTROKE - LONGJUT + TBALANCE2) (tcenter + HALFSTROKE + LONGJUT + TBALANCE2) XH
include : dispiro
widths.lhs
flat tcenter CAP [heading DOWNWARD]
curl tcenter (fine + rinner * 2)
CurlyTail fine rinner (tcenter+ STROKE * HVCONTRAST) 0 (tcenter + STROKE * HVCONTRAST + LONGJUT) x2 y2
save 'tcurlytail' 0x236
sketch # tbar
include glyphs.("t.standard") AS_BASE
include : HOverlayBar ([mix MIDDLE SB 0.7] - TBALANCE * 0.5 - STROKE * 0.25 * HVCONTRAST) ([mix MIDDLE RIGHTSB 0.7] - TBALANCE * 0.5 - STROKE * 0.25 * HVCONTRAST) [mix 0 XH 0.6]
save 'tbar' 0x167
### S and s
do "s and related"
sketch # S
set-width WIDTH
include markset.capital
local stroke : adviceBlackness2 2.875 2 CAP
local ess : ESS * stroke / STROKE
define smooth : adviceSSmooth CAP (-1) stroke
include : dispiro
widths.lhs stroke
g4 RIGHTSB (CAP - HOOK)
hookstart CAPO (sw -- stroke) (swItalicAdj -- STROKE)
g4 SB (CAP - smooth)
alsothru 0.5 0.5 [widths.center ess]
g4 RIGHTSB smooth [widths 0 stroke]
hookend O (sw -- stroke) (swItalicAdj -- STROKE)
g4 SB HOOK
save 'S' 'S'
save 'cyrDze' 0x405
sketch # s
set-width WIDTH
include markset.e
local stroke : adviceBlackness2 2.875 2 XH
local ess : ESS * stroke / STROKE
define smooth : adviceSSmooth XH (-1 - [linreg 18 0 126 1 stroke] * (3 - (WIDTH / 500) * 2.5 * [linreg 18 0 126 1 stroke])) stroke
include : dispiro
widths.lhs stroke
g4 (RIGHTSB + OX / 4) (XH - SHOOK)
hookstart XO (sw -- stroke) (swItalicAdj -- STROKE)
g4.down.mid (SB + OX / 8) (XH - smooth)
alsothru 0.5 0.5 [widths.center ess]
g4.down.mid (RIGHTSB - OX / 8) (smooth) [widths 0 stroke]
hookend O (sw -- stroke) (swItalicAdj -- STROKE)
g4 (SB - OX / 4) SHOOK
save 's' 's'
save 'cyrdze' 0x455
sketch # revS
include markset.capital
local stroke : adviceBlackness2 2.875 2 CAP
local ess : ESS * stroke / STROKE
local smooth : adviceSSmooth CAP 1 stroke
include : dispiro
widths.rhs stroke
g4 SB (CAP - HOOK)
hookstart CAPO (sw -- stroke) (swItalicAdj -- STROKE)
g4 RIGHTSB (CAP - smooth)
alsothru 0.5 0.5 [widths.center ess]
g4 SB smooth [widths stroke 0]
hookend O (sw -- stroke) (swItalicAdj -- STROKE)
g4 RIGHTSB HOOK
save 'revS' 0x1A7
sketch # revs
include markset.e
local stroke : adviceBlackness2 2.875 2 XH
local ess : ESS * stroke / STROKE
local smooth : adviceSSmooth XH (1 + [linreg 18 0 126 1 stroke] * (3.25 - (WIDTH / 500) * 2 * [linreg 18 0 126 1 stroke])) stroke
include : dispiro
widths.rhs stroke
g4 SB (XH - SHOOK)
hookstart XO (sw -- stroke) (swItalicAdj -- STROKE)
g4 RIGHTSB (XH - smooth)
alsothru 0.5 0.5 [widths.center ess]
g4 SB (smooth) [widths stroke 0]
hookend O (sw -- stroke) (swItalicAdj -- STROKE)
g4 RIGHTSB SHOOK
save 'revs' 0x1A8
save 'cyrghe.italic'
sketch # srtail
include glyphs.rtailBR
local stroke : adviceBlackness2 2.875 2 XH
apply-transform : Upright
apply-transform : Translate (SB + stroke * HVCONTRAST + OXHOOK) 0
apply-transform : Italify
include markset.p
include glyphs.s
include : VBarLeft (SB + OXHOOK) 0 SHOOK
save 'srtail' 0x282
sketch # Sswash
include markset.if
include glyphs.S
local stroke : adviceBlackness2 2.875 2 CAP
include : dispiro
widths.lhs [adviceBlackness 4.5]
g4 (SB + OXHOOK) HOOK
alsothru 0.15 0.6 important
flat (RIGHTSB - 1) DESCENDER [widths stroke 0]
curl RIGHTSB DESCENDER
save 'Sswash' 0x2C7E
sketch # sswash
include markset.p
include glyphs.s
local stroke : adviceBlackness2 2.875 2 XH
include : dispiro
widths.lhs [adviceBlackness 4.5]
g4 (SB + OXHOOK) SHOOK
alsothru 0.2 0.6 important
flat (RIGHTSB - 1) DESCENDER [widths stroke 0]
curl RIGHTSB DESCENDER
save 'sswash' 0x23F
### Z and z
do "Z, z and related"
sketch # Z
set-width WIDTH
include markset.capital
local cor : 1.15 * HVCONTRAST
include : HBarTop SB RIGHTSB CAP
start-from SB STROKE
line-to (SB + STROKE * cor) STROKE
line-to RIGHTSB (CAP - STROKE)
line-to (RIGHTSB - STROKE * cor) (CAP - STROKE)
reverse-last
include : HBarBottom SB RIGHTSB 0
tag-contour 'strokeBottom'
if SLAB : begin
include : DownwardLeftSerif SB CAP VJUT
include : UpwardRightSerif RIGHTSB 0 VJUT
tag-contour 'serifRB'
save 'Z' 'Z'
save 'Zeta' 0x396
sketch # z
set-width WIDTH
include markset.e
local cor : 1.2 * HVCONTRAST
include : HBarTop SB RIGHTSB XH
start-from SB STROKE
line-to (SB + STROKE * cor) STROKE
line-to RIGHTSB (XH - STROKE)
line-to (RIGHTSB - STROKE * cor) (XH - STROKE)
reverse-last
include : HBarBottom SB RIGHTSB 0
tag-contour 'strokeBottom'
if SLAB : begin
include : DownwardLeftSerif SB XH VJUT
include : UpwardRightSerif RIGHTSB 0 VJUT
tag-contour 'serifRB'
save 'z' 'z'
sketch # Zdtail
include glyphs.Z AS_BASE
eject-contour 'strokeBottom'
eject-contour 'serifRB'
include : dispiro
widths.lhs
flat SB 0 [heading RIGHTWARD]
curl (RIGHTSB - HOOKX) 0
archv
straight.down.end RIGHTSB (-HOOK) [widths.heading 0 STROKE DOWNWARD]
save 'Zdtail' 0x224
sketch # zdtail
include glyphs.z AS_BASE
eject-contour 'strokeBottom'
eject-contour 'serifRB'
include : dispiro
widths.lhs
flat SB 0 [heading RIGHTWARD]
curl (RIGHTSB - HOOKX) 0
archv
straight.down.end RIGHTSB (-HOOK) [widths.heading 0 STROKE DOWNWARD]
save 'zdtail' 0x225
sketch # Zswash
include markset.if
local cor 1.15
include : HBarTop SB RIGHTSB CAP
start-from SB 0
line-to (SB + STROKE * cor) 0
line-to RIGHTSB (CAP - STROKE)
line-to (RIGHTSB - STROKE * cor) (CAP - STROKE)
reverse-last
include : dispiro
widths.lhs
g4 SB 0
alsothru 0.36 0.6 important
flat (RIGHTSB - 1) DESCENDER
curl RIGHTSB DESCENDER
if SLAB : begin
include : DownwardLeftSerif SB CAP VJUT
save 'Zswash' 0x2C7F
sketch # zswash
include markset.p
include : HBarTop SB RIGHTSB XH
local cor 1.2
start-from SB 0
line-to (SB + STROKE * cor) 0
line-to RIGHTSB (XH - STROKE)
line-to (RIGHTSB - STROKE * cor) (XH - STROKE)
reverse-last
include : dispiro
widths.lhs
g4 (SB - OXHOOK) 0
alsothru 0.36 0.6 important
flat (RIGHTSB - 1) DESCENDER
curl RIGHTSB DESCENDER
if SLAB : begin
include : DownwardLeftSerif SB XH VJUT
save 'zswash' 0x240
sketch # Zdesc
include glyphs.Z AS_BASE
eject-contour 'serifRB'
include : VBarRight [mix SB RIGHTSB 1.05] (HALFSTROKE - LONGJUT) STROKE
save 'Zdesc' 0x2C6B
sketch # zdesc
include glyphs.z AS_BASE
eject-contour 'serifRB'
include : VBarRight [mix SB RIGHTSB 1.05] (HALFSTROKE - LONGJUT) STROKE
save 'zdesc' 0x2C6C
sketch # zcurlytail
include markset.e
local fine : adviceBlackness 4
local rinner : Math.max (XH * 0.04) (fine * 0.3)
local x2 : mix (SB + STROKE) RIGHTSB 0.3
local x1 : mix x2 (RIGHTSB - fine - rinner * 1.5) 0.45
local y2 : -XH * 0.2
local m1 : RIGHTSB - fine / 2 - rinner * 1.5 + O
include : HCurlyTail fine STROKE rinner SB m1 (RIGHTSB + fine / 2) x1 x2 y2
include glyphs.z
eject-contour 'strokeBottom'
eject-contour 'serifRB'
save 'zcurlytail' 0x291
return [object ISerifShape IotaShape LShape VShape PShape PShapeOutline RLegShape RLegTerminalX NShape UShape FShape LongSShape EShape SmallEShape RevSmallEShape CShape CShapeOutline LambdaShape AMaskShape DeltaShape]