Iosevka/packages/font-glyphs/src/letter/cyrillic/yeri.ptl
2024-01-27 17:00:08 -08:00

388 lines
15 KiB
Text

$$include '../../meta/macros.ptl'
import [mix linreg clamp fallback] from "@iosevka/util"
glyph-module
glyph-block Letter-Cyrillic-Yeri : begin
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives
glyph-block-import Letter-Shared-Metrics : BowlXDepth
glyph-block-import Letter-Shared-Shapes : ShoulderMidKnotLhsRev RightwardTailedBar
glyph-block-import Letter-Shared-Shapes : LetterBarOverlay UpwardHookShape VerticalHook SerifFrame
define DefaultBarPos 0.55
define Yeri : namespace
define flex-params [CornerCommon] : glyph-proc
local-parameter : top
local-parameter : left -- SB
local-parameter : right -- RightSB
local-parameter : stroke -- Stroke
local-parameter : jut -- Jut
local-parameter : pBar -- DefaultBarPos
local-parameter : yStart -- top
local bowl : top * pBar + HalfStroke
local turnRadius : BowlXDepth bowl 0 left right stroke
local ada : ArchDepthAOf ArchDepth (right - left + SB * 2)
local adb : ArchDepthBOf ArchDepth (right - left + SB * 2)
local fine : stroke * CThinB
local yTurnBottomL : YSmoothMidL bowl 0 ada adb
local yTurnBottomR : YSmoothMidR bowl 0 ada adb
include : union
dispiro
widths.lhs stroke
flat (left + Stroke * 0.2) 0 [heading Rightward]
curl ([Math.max (left + stroke * TanSlope) (right - turnRadius)] + CorrectionOMidX * stroke) 0
archv 8
g4 (right - OX) yTurnBottomR
arcvh 8
flat ([Math.max (left + stroke * TanSlope) (right - turnRadius)] - CorrectionOMidX * stroke) bowl
curl (left + Stroke * 0.2) bowl [heading Leftward]
VBar.l left 0 yStart stroke
export : define flex-params [UprightShape] : glyph-proc
local-parameter : top
local-parameter : left -- SB
local-parameter : right -- RightSB
local-parameter : stroke -- Stroke
local-parameter : jut -- Jut
local-parameter : pBar -- DefaultBarPos
local-parameter : yStart -- top
include : CornerCommon.apply null $-flex-arguments
if SLAB : begin
include : tagged 'serifYeriLB' : HSerif.lb left 0 (jut - [HSwToV : 0.5 * stroke]) stroke
include : tagged 'serifYeriLT' : HSerif.mt (left + [HSwToV : 0.5 * stroke]) top jut stroke
export : define flex-params [ItalicShape] : glyph-proc
local-parameter : top
local-parameter : left -- SB
local-parameter : right -- RightSB
local-parameter : stroke -- Stroke
local-parameter : jut -- Jut
local-parameter : pBar -- DefaultBarPos
local-parameter : yStart -- top
include : CornerCommon.apply null $-flex-arguments
if SLAB : begin
include : tagged 'serifYeriLT' : HSerif.lt left top (jut - [HSwToV : 0.5 * stroke]) stroke
export : define flex-params [AutoItalicShape] : begin
if para.isItalic
: then : ItalicShape.apply null $-flex-arguments
: else : UprightShape.apply null $-flex-arguments
export : define flex-params [RoundShape top [left SB] [right RightSB] [stroke Stroke] [jut Jut] [pBar DefaultBarPos] [yStart top]] : glyph-proc
local bowl : top * pBar + HalfStroke
local turnRadius : BowlXDepth bowl 0 left right stroke
local ada : ArchDepthAOf ArchDepth (right - left + SB * 2)
local adb : ArchDepthBOf ArchDepth (right - left + SB * 2)
local fine : stroke * CThinB
local yTurnBottomL : YSmoothMidL bowl 0 ada adb
local yTurnBottomR : YSmoothMidR bowl 0 ada adb
include : dispiro
flat left [Math.max yStart (yTurnBottomL + 0.1)] [widths.lhs.heading stroke Downward]
curl left yTurnBottomL
arcvh
g4 ([mix left right 0.5] + CorrectionOMidX * stroke) O
archv
g4 (right - OX) yTurnBottomR
arcvh
flat ([mix left right 0.5] - CorrectionOMidX * stroke) bowl
curl (left + Stroke * 0.2) bowl [heading Leftward]
if SLAB : begin
include : tagged 'serifYeriLT' : HSerif.lt left top (jut - [HSwToV : 0.5 * stroke]) stroke
export : define flex-params [CursiveShape top [left SB] [right RightSB] [stroke Stroke] [jut Jut] [pBar DefaultBarPos] [yStart top]] : glyph-proc
local bowl : top * pBar + HalfStroke
local turnRadius : BowlXDepth bowl 0 left right stroke
local ada : ArchDepthAOf ArchDepth (right - left + SB * 2)
local adb : ArchDepthBOf ArchDepth (right - left + SB * 2)
local fine : stroke * CThinB
local yTurnBottomL : YSmoothMidL bowl 0 ada adb
local yTurnBottomR : YSmoothMidR bowl 0 ada adb
include : dispiro
flat left [Math.max yStart (yTurnBottomL + 0.1)] [widths.lhs.heading stroke Downward]
curl left yTurnBottomL
arcvh
g4 ([mix left right 0.5] + CorrectionOMidX * stroke) O
archv
g4 (right - OX) yTurnBottomR
arcvh
ShoulderMidKnotLhsRev [mix left right 0.5] bowl fine stroke (-1) (-1)
archv
g4.down.end (left + (stroke - fine) * HVContrast) yTurnBottomL [widths.lhs.heading fine Downward]
if SLAB : begin
include : tagged 'serifYeriLT' : HSerif.lt left top (jut - [HSwToV : 0.5 * stroke]) stroke
define RevYeri : namespace
export : define flex-params [Shape top [left SB] [right RightSB] [stroke Stroke] [jut Jut] [pBar DefaultBarPos]] : glyph-proc
local bowl : top * pBar + HalfStroke
local turnRadius : bowl * 0.45
local turnbottom : mix 0 bowl (ArchDepthB / (ArchDepthA + ArchDepthB))
local trShrink [Math.pow ((right - left) / (RightSB - SB)) 0.5]
include : dispiro
widths.rhs stroke
flat (right - Stroke * 0.2) 0 [heading Leftward]
curl (left + turnRadius * trShrink + CorrectionOMidX * stroke) 0
archv
g4 (left + O) turnbottom
arcvh
flat (left + turnRadius * trShrink - CorrectionOMidX * stroke) bowl
curl (right - Stroke * 0.2) bowl [heading Rightward]
include : VBar.r right 0 top stroke
if SLAB : begin
include : tagged 'serifYeriRB'
HSerif.rb right 0 (jut - [HSwToV : 0.5 * stroke]) stroke
include : tagged 'serifYeriRT'
HSerif.mt (right - [HSwToV : 0.5 * stroke]) top jut stroke
export : define flex-params [RoundShape top [left SB] [right RightSB] [stroke Stroke] [jut Jut] [pBar DefaultBarPos] [yStart top]] : glyph-proc
local bowl : top * pBar + HalfStroke
local turnRadius : BowlXDepth bowl 0 left right stroke
local ada : ArchDepthAOf ArchDepth (right - left + SB * 2)
local adb : ArchDepthBOf ArchDepth (right - left + SB * 2)
local fine : stroke * CThinB
local yTurnBottomL : YSmoothMidL bowl 0 ada adb
local yTurnBottomR : YSmoothMidR bowl 0 ada adb
include : dispiro
flat right [Math.max yStart (yTurnBottomR + 0.1)] [widths.rhs.heading stroke Downward]
curl right yTurnBottomR
arcvh
g4 ([mix left right 0.5] + CorrectionOMidX * stroke) O
archv
g4 (left + OX) yTurnBottomL
arcvh
flat ([mix left right 0.5] - CorrectionOMidX * stroke) bowl
curl (right - Stroke * 0.2) bowl [heading Rightward]
define flex-params [CyrBackYerShape Base top left right [stroke Stroke] [jut Jut] [pBar DefaultBarPos]] : glyph-proc
local xLeftBarLeftEdge : Math.max (right - (RightSB - SB)) : if SLAB
[mix left right 0.35] - [HSwToV : 0.50 * stroke]
[mix left right 0.20] - [HSwToV : 0.25 * stroke]
local xTopBarLeftEnd : mix 0 left [if SLAB 0.25 0.375]
include : HBar.t xTopBarLeftEnd (Stroke * 0.1 + xLeftBarLeftEdge) top stroke
include : Base top
left -- xLeftBarLeftEdge
right -- right
stroke -- stroke
jut -- jut
pBar -- pBar
if SLAB : begin
include : VSerif.dl xTopBarLeftEnd top VJut
Math.min (VJutStroke * stroke / Stroke) (0.625 * (xLeftBarLeftEdge - xTopBarLeftEnd))
define flex-params [CyrNeutralYerShape Base top left right [stroke Stroke] [jut Jut]] : glyph-proc
local xLeftBarLeftEdge : Math.max (right - (RightSB - SB)) : if SLAB
[mix left right 0.35] - [HSwToV : 0.50 * stroke]
[mix left right 0.20] - [HSwToV : 0.25 * stroke]
local xTopBarLeftEnd : mix 0 left [if SLAB 0.25 0.375]
include : Base top
left -- xLeftBarLeftEdge
right -- right
stroke -- stroke
jut -- jut
yStart -- (top - TailY - 0.5 * stroke)
eject-contour 'serifYeriLT'
include : VerticalHook.l xLeftBarLeftEdge (top - TailY - 0.5 * stroke) (xTopBarLeftEnd - xLeftBarLeftEdge - 0.5 * stroke) (-TailY) stroke
define [CyrYeryShape LeftHalf df top fBackYer fTail] : glyph-proc
local sw : if fBackYer [AdviceStroke 3.25 df.div] df.mvs
local jut : Math.min Jut : [Math.pow (sw / Stroke) 0.5] * Jut
local xm : mix (df.rightSB - [HSwToV sw]) (df.middle + [HSwToV : 0.5 * sw]) 0.75
include : if fBackYer
CyrBackYerShape LeftHalf
top -- top
left -- df.leftSB
right -- xm
stroke -- sw
jut -- jut
LeftHalf
top -- top
left -- df.leftSB
right -- xm
stroke -- sw
jut -- jut
include : if fTail
RightwardTailedBar df.rightSB 0 top sw
VBar.r df.rightSB 0 top sw
local useFullSerifs : LeftHalf === Yeri.UprightShape || LeftHalf === Yeri.AutoItalicShape && !para.isItalic
if SLAB : begin
include : tagged 'serifRT' : if useFullSerifs
then : HSerif.mt (df.rightSB - [HSwToV : 0.5 * sw]) top jut sw
else : glyph-proc
if (!fTail) : include : tagged 'serifRB' : if useFullSerifs
then : HSerif.mb (df.rightSB - [HSwToV : 0.5 * sw]) 0 jut sw
else : HSerif.rb df.rightSB 0 (jut - [HSwToV : 0.5 * sw]) sw
define [ZhuangToneSixShape Base top] : glyph-proc
local xLeft : [mix SB RightSB 0.20] - [HSwToV : 0.125 * Stroke]
include : Base top (left -- xLeft) (right -- RightSB)
eject-contour 'serifYeriLT'
include : dispiro
corner xLeft top [widths.lhs : AdviceStroke 5.5]
corner (0.25 * xLeft) (top - xLeft)
glyph-block-export YeriConfig
define YeriConfig : object
corner { Yeri.UprightShape Yeri.AutoItalicShape }
round { Yeri.RoundShape Yeri.RoundShape }
cursive { Yeri.CursiveShape Yeri.CursiveShape }
define YeryConfig : object
corner { Yeri.UprightShape Yeri.AutoItalicShape false }
round { Yeri.RoundShape Yeri.RoundShape false }
cursive { Yeri.CursiveShape Yeri.CursiveShape false }
cornerTailed { Yeri.UprightShape Yeri.AutoItalicShape true }
roundTailed { Yeri.RoundShape Yeri.RoundShape true }
cursiveTailed { Yeri.CursiveShape Yeri.CursiveShape true }
define [YeriOverlayBar df top] : begin
local stroke : AdviceStroke2 2 3 top
return : LetterBarOverlay.l.in
x -- df.leftSB
bot -- top * DefaultBarPos + stroke / 2
top -- top - [if SLAB Stroke 0]
foreach { suffix { Uc Lc } } [Object.entries YeriConfig] : do
create-glyph "cyrl/Yeri.\(suffix)" : glyph-proc
local df : include : DivFrame 1
include : df.markSet.capital
include : Uc (left -- df.leftSB) (right -- df.rightSB) CAP
create-glyph "cyrl/yeri.\(suffix)" : glyph-proc
local df : include : DivFrame 1
include : df.markSet.e
include : Lc (left -- df.leftSB) (right -- df.rightSB) XH
create-glyph "cyrl/YeriBar.\(suffix)" : glyph-proc
local df : include : DivFrame 1
include : df.markSet.capital
include : Uc (left -- df.leftSB) (right -- df.rightSB) CAP
include : YeriOverlayBar df CAP
create-glyph "cyrl/yeriBar.\(suffix)" : glyph-proc
local df : include : DivFrame 1
include : df.markSet.e
include : Lc (left -- df.leftSB) (right -- df.rightSB) XH
include : YeriOverlayBar df XH
create-glyph "cyrl/Yer.\(suffix)" : glyph-proc
local df : include : DivFrame [mix 1 para.diversityM 0.5]
include : df.markSet.capital
include : CyrBackYerShape Uc CAP (left -- df.leftSB) (right -- df.rightSB)
create-glyph "cyrl/yer.\(suffix)" : glyph-proc
local df : include : DivFrame [mix 1 para.diversityM 0.5]
include : df.markSet.e
include : CyrBackYerShape Lc XH (left -- df.leftSB) (right -- df.rightSB)
create-glyph "cyrl/yerTall.\(suffix)" : glyph-proc
local df : include : DivFrame [mix 1 para.diversityM 0.5]
include : df.markSet.b
include : CyrBackYerShape Lc Ascender (left -- df.leftSB) (right -- df.rightSB) (pBar -- DefaultBarPos * XH / Ascender)
create-glyph "cyrl/YerNeutral.\(suffix)" : glyph-proc
local df : include : DivFrame [mix 1 para.diversityM 0.5]
include : df.markSet.capital
include : CyrNeutralYerShape Uc CAP (left -- df.leftSB) (right -- df.rightSB)
create-glyph "cyrl/yerNeutral.\(suffix)" : glyph-proc
local df : include : DivFrame [mix 1 para.diversityM 0.5]
include : df.markSet.e
include : CyrNeutralYerShape Lc XH (left -- df.leftSB) (right -- df.rightSB)
create-glyph "ZhuangToneSix.\(suffix)" : glyph-proc
include : MarkSet.capital
include : ZhuangToneSixShape Uc CAP
create-glyph "zhuangToneSix.\(suffix)" : glyph-proc
include : MarkSet.e
include : ZhuangToneSixShape Lc XH
foreach { suffix { Uc Lc fTail } } [Object.entries YeryConfig] : do
create-glyph "cyrl/Yery.\(suffix)" : glyph-proc
local df : include : DivFrame para.diversityM 3
include : df.markSet.capital
include : CyrYeryShape Uc df CAP false fTail
create-glyph "cyrl/yery.\(suffix)" : glyph-proc
local df : include : DivFrame para.diversityM 3
include : df.markSet.e
include : CyrYeryShape Lc df XH false fTail
create-glyph "cyrl/YeryBack.\(suffix)" : glyph-proc
local df : include : DivFrame para.diversityM 3
include : df.markSet.capital
include : CyrYeryShape Uc df CAP true fTail
create-glyph "cyrl/yeryBack.\(suffix)" : glyph-proc
local df : include : DivFrame para.diversityM 3
include : df.markSet.e
include : CyrYeryShape Lc df XH true fTail
select-variant 'cyrl/Yer' 0x42A
select-variant 'cyrl/yer' 0x44A
select-variant 'cyrl/yer.BGR' (shapeFrom -- 'cyrl/yer')
select-variant 'cyrl/yerTall' 0x1C86 (follow -- 'cyrl/yer')
select-variant 'cyrl/Yery' 0x42B
select-variant 'cyrl/yery' 0x44B
select-variant 'cyrl/Yeri' 0x42C
select-variant 'cyrl/yeri' 0x44C
select-variant 'cyrl/yeri.BGR' (shapeFrom -- 'cyrl/yeri')
select-variant 'cyrl/YeriBar' 0x48C (follow -- 'cyrl/Yeri')
select-variant 'cyrl/yeriBar' 0x48D (follow -- 'cyrl/yeri')
select-variant 'cyrl/YerNeutral' 0xA64E (follow -- 'cyrl/Yer')
select-variant 'cyrl/yerNeutral' 0xA64F (follow -- 'cyrl/yer')
select-variant 'cyrl/YeryBack' 0xA650 (follow -- 'cyrl/Yery')
select-variant 'cyrl/yeryBack' 0xA651 (follow -- 'cyrl/yery')
select-variant 'ZhuangToneSix' 0x184 (follow -- 'cyrl/Yer')
select-variant 'zhuangToneSix' 0x185 (follow -- 'cyrl/yer')
create-glyph 'cyrl/Be' 0x411 : glyph-proc
include : MarkSet.capital
include : Yeri.UprightShape CAP
include : HBar.m SB [mix SB RightSB 0.9] (CAP - HalfStroke)
if SLAB : begin
include : VSerif.dr [mix SB RightSB 0.9] CAP VJut
alias 'latn/Be' 0x182 'cyrl/Be'
create-glyph 'latn/De' 0x18B : glyph-proc
include : MarkSet.capital
include : RevYeri.Shape CAP
include : HBar.t [mix RightSB SB 0.9] (RightSB + O) CAP
if SLAB : begin
include : VSerif.dl [mix RightSB SB 0.9] CAP VJut
create-glyph 'cyrl/DeKomi' 0x500 : glyph-proc
include : MarkSet.capital
include : RevYeri.Shape CAP
create-glyph 'cyrl/DjeKomi' 0x502 : glyph-proc
local df : include : DivFrame para.diversityM 3
include : df.markSet.capital
local xm : df.middle + [HSwToV : 0.5 * df.mvs]
include : RevYeri.RoundShape CAP df.leftSB xm df.mvs
include : UpwardHookShape
left -- df.middle - [HSwToV : 0.5 * df.mvs]
right -- df.rightSB
ybegin -- CAP
yend -- (CAP / 2)
ada -- (SmallArchDepthA * 0.6 * df.div)
adb -- (SmallArchDepthB * 0.6 * df.div)
sw -- df.mvs
if SLAB : begin
include : HSerif.mt df.middle CAP Jut df.mvs
local sf2 : [SerifFrame.fromDf df (CAP / 2) 0].slice 1 2
include sf2.rt.full