Make scriptCut variants for a/b/g/q selectable via CV. (#2634)

* Make `scriptCut` variants for `a`/`b`/`g`/`q` selectable via CV.

* Bump.
This commit is contained in:
John McWilliams 2025-01-04 20:50:17 -05:00 committed by GitHub
parent d12b856b37
commit 52c5e55053
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 217 additions and 99 deletions

View file

@ -1,3 +0,0 @@
* Add `curved` variant for `¶` (#2045).
* Add characters:
- CURVED STEM PARAGRAPH SIGN ORNAMENT (`U+2761`).

5
changes/32.4.0.md Normal file
View file

@ -0,0 +1,5 @@
* Add `curved` variant for `¶` (#2045).
* Add `top-cut` variants for `a`/`g`/`q`.
* Add `bottom-cut` variants for `b`.
* Add characters:
- CURVED STEM PARAGRAPH SIGN ORNAMENT (`U+2761`).

View file

@ -389,6 +389,21 @@ glyph-block Letter-Greek-Lower-Epsilon : begin
include : eps.Shape
include : bar df top stroke
define [TopCutBody df top bar hook ada adb] : glyph-proc
local eps : SmallEpsilon CLOSED-STEM CLOSED-STEM top 0
blend -- VolBlend
hook -- hook
overflow -- 0
ada2 -- ada
adb2 -- adb
define [object stroke] : eps.Dim
include : eps.Shape
include : bar df (top - stroke / 2) stroke
include : spiro-outline
corner df.rightSB top
corner df.rightSB (top - stroke / 2)
corner (df.rightSB - [HSwToV stroke]) (top - stroke / 2)
define [EarlessCornerBody df top bar hook ada adb] : glyph-proc
local eps : SmallEpsilon SLAB-INWARD CLOSED-STEM top 0
blend -- VolBlend
@ -415,16 +430,19 @@ glyph-block Letter-Greek-Lower-Epsilon : begin
singleStoreySerifless { FullBarBody SingleStorey.SeriflessBar }
singleStoreyEarlessCornerSerifless { EarlessCornerBody SingleStorey.SeriflessBar }
singleStoreyEarlessRoundedSerifless { EarlessRoundedBody SingleStorey.SeriflessBar }
singleStoreyTopCutSerifless { TopCutBody SingleStorey.SeriflessBar }
singleStoreySerifed { FullBarBody SingleStorey.BottomSerifedBar }
singleStoreyEarlessCornerSerifed { EarlessCornerBody SingleStorey.BottomSerifedBar }
singleStoreyEarlessRoundedSerifed { EarlessRoundedBody SingleStorey.BottomSerifedBar }
singleStoreyTopCutSerifed { TopCutBody SingleStorey.BottomSerifedBar }
singleStoreyDoubleSerifed { FullBarBody SingleStorey.DoubleSerifedBar }
singleStoreyTailed { FullBarBody SingleStorey.TailedBar }
singleStoreyEarlessCornerTailed { EarlessCornerBody SingleStorey.TailedBar }
singleStoreyEarlessRoundedTailed { EarlessRoundedBody SingleStorey.TailedBar }
singleStoreyTopCutTailed { TopCutBody SingleStorey.TailedBar }
singleStoreyTailedSerifed { FullBarBody SingleStorey.TailedSerifedBar }
@ -525,21 +543,26 @@ glyph-block Letter-Greek-Lower-Epsilon : begin
select-variant 'UeVolapuk' 0xA79E (follow -- 'u')
select-variant 'ueVolapuk' 0xA79F (follow -- 'u')
alias 'grek/epsilon' 0x3B5 'latn/epsilon.serifless'
select-variant 'latn/Epsilon' 0x190
select-variant 'latn/epsilon' 0x25B
CreateTurnedLetter 'turnepsilon' 0x1D08 'latn/epsilon' HalfAdvance (XH / 2)
alias 'grek/epsilon' 0x3B5 'latn/epsilon.serifless'
alias 'cyrl/ZeRev' 0x510 'latn/Epsilon'
alias 'cyrl/zeRev' 0x511 'latn/epsilon'
select-variant 'cyrl/Ze' 0x417
select-variant 'cyrl/ze' 0x437
select-variant 'cyrl/KsiBase' (follow -- 'cyrl/ZeTopSerifOnly')
select-variant 'cyrl/ksiBase' (follow -- 'cyrl/zeTopSerifOnly')
select-variant 'cyrl/ze.BGR' (follow -- 'cyrl/ze')
select-variant 'cyrl/ze.BGR' (follow -- 'cyrl/ze')
alias 'latn/EpsilonRev' 0xA7AB 'cyrl/Ze'
alias 'latn/epsilonRev' 0x25C 'cyrl/ze'
select-variant 'cyrl/KsiBase' (follow -- 'cyrl/ZeTopSerifOnly')
select-variant 'cyrl/ksiBase' (follow -- 'cyrl/zeTopSerifOnly')
select-variant 'cyrl/ZjeKomi' 0x504 (follow -- 'cyrl/ZeTopSerifOnly')
select-variant 'cyrl/zjeKomi' 0x505 (follow -- 'cyrl/zeTopSerifOnly')
select-variant 'cyrl/DzjeKomi' 0x506 (follow -- 'cyrl/ZeTopSerifOnly')
@ -563,13 +586,12 @@ glyph-block Letter-Greek-Lower-Epsilon : begin
include : ExtendBelowBaseAnchors (-AccentHeight)
select-variant 'latn/epsilon/descBase' (shapeFrom -- 'latn/epsilon')
select-variant 'latn/epsilonRev/descBase' (shapeFrom -- 'cyrl/ze') (follow -- 'cyrl/ze/descBase')
derive-composites 'latn/epsilonRetroflexHook' 0x1D93 'latn/epsilon/descBase'
RetroflexHook.r RightSB 0 (refSw -- [AdviceStroke2 2 3 XH])
select-variant 'latn/epsilonRev/descBase' (shapeFrom -- 'cyrl/ze') (follow -- 'cyrl/ze/descBase')
derive-composites 'latn/epsilonRevRetroflexHook' 0x1D94 'latn/epsilonRev/descBase'
RetroflexHook.l SB 0 (refSw -- [AdviceStroke2 2 3 XH])
ExtendBelowBaseAnchors Descender
RetroflexHook.l SB 0 (refSw -- [AdviceStroke2 2 3 XH])
create-glyph 'voicedLaryngealSpirant' 0x1D24 : glyph-proc
include : MarkSet.b

View file

@ -81,13 +81,13 @@ glyph-block Letter-Latin-Lower-A : begin
export : define [Serifless df hookStyle sw] : union
HookAndBar df hookStyle 0 sw
Arc df 0 nothing nothing sw
Arc df 0 nothing sw
export : define [Serifed df hookStyle sw] : union
Serifless df hookStyle sw
begin [SerifFrame.fromDf df XH 0].rb.outer
export : define [Tailed df hookStyle sw] : union
HookAndBar df hookStyle (XH - [ADoubleStoreySmoothB df] + O) sw
Arc df 0 nothing nothing sw
Arc df 0 nothing sw
RightwardTailedBar df.rightSB 0 (XH - [ADoubleStoreySmoothB df]) (sw -- [fallback sw : ADoubleStoreyStroke df])
export : define [ToothlessCorner df hookStyle sw] : union
HookAndBar df hookStyle DToothlessRise sw
@ -99,7 +99,7 @@ glyph-block Letter-Latin-Lower-A : begin
export : define [GetMask shapeFn df sw] : match shapeFn
[Just ToothlessCorner] : ArcMask df 1 DToothlessRise sw
[Just ToothlessRounded] : ArcMask df 2 [ADoubleStoreySmoothA df] sw
__ : ArcMask df 0 nothing nothing sw
__ : ArcMask df 0 nothing sw
glyph-block-export DoubleStoreyConfig
define DoubleStoreyConfig : object
@ -154,7 +154,7 @@ glyph-block Letter-Latin-Lower-A : begin
local sw : fallback _sw df.mvs
include : EaredBodyImpl df top sw
include : bar df top sw
export : define [ScriptCutBody df top bar _sw] : glyph-proc
export : define [TopCutBody df top bar _sw] : glyph-proc
local sw : fallback _sw df.mvs
include : EaredBodyImpl df top sw
include : bar df (top - sw / 2) sw
@ -220,21 +220,21 @@ glyph-block Letter-Latin-Lower-A : begin
singleStoreySerifless { SingleStorey.FullBarBody SingleStorey.SeriflessBar }
singleStoreyEarlessCornerSerifless { SingleStorey.EarlessCornerBody SingleStorey.SeriflessBar }
singleStoreyEarlessRoundedSerifless { SingleStorey.EarlessRoundedBody SingleStorey.SeriflessBar }
singleStoreyScriptCutSerifless { SingleStorey.ScriptCutBody SingleStorey.SeriflessBar }
singleStoreyTopCutSerifless { SingleStorey.TopCutBody SingleStorey.SeriflessBar }
singleStoreyTopSerifed { SingleStorey.FullBarBody SingleStorey.TopSerifedBar }
singleStoreySerifed { SingleStorey.FullBarBody SingleStorey.BottomSerifedBar }
singleStoreyEarlessCornerSerifed { SingleStorey.EarlessCornerBody SingleStorey.BottomSerifedBar }
singleStoreyEarlessRoundedSerifed { SingleStorey.EarlessRoundedBody SingleStorey.BottomSerifedBar }
singleStoreyScriptCutSerifed { SingleStorey.ScriptCutBody SingleStorey.BottomSerifedBar }
singleStoreyTopCutSerifed { SingleStorey.TopCutBody SingleStorey.BottomSerifedBar }
singleStoreyDoubleSerifed { SingleStorey.FullBarBody SingleStorey.DoubleSerifedBar }
singleStoreyTailed { SingleStorey.FullBarBody SingleStorey.TailedBar }
singleStoreyEarlessCornerTailed { SingleStorey.EarlessCornerBody SingleStorey.TailedBar }
singleStoreyEarlessRoundedTailed { SingleStorey.EarlessRoundedBody SingleStorey.TailedBar }
singleStoreyScriptCutTailed { SingleStorey.ScriptCutBody SingleStorey.TailedBar }
singleStoreyTopCutTailed { SingleStorey.TopCutBody SingleStorey.TailedBar }
singleStoreyTailedSerifed { SingleStorey.FullBarBody SingleStorey.TailedSerifedBar }
@ -262,7 +262,7 @@ glyph-block Letter-Latin-Lower-A : begin
select-variant 'aScript' 0x251 (follow -- [conditional-follow SLAB 'aScript/autoSerifed/slab' 'aScript/autoSerifed/sans']) (shapeFrom -- 'a')
select-variant 'AScript' 0x2C6D (follow -- [conditional-follow SLAB 'aScript/autoSerifed/slab' 'aScript/autoSerifed/sans'])
derive-composites 'aScriptRetroflexHook' 0x1D90 'a.singleStoreyScriptCutSerifless'
derive-composites 'aScriptRetroflexHook' 0x1D90 'a.singleStoreyTopCutSerifless'
RetroflexHook.rSideJut RightSB 0 (yOverflow -- Stroke)
CreateTurnedLetter 'turnaScript' 0x252 'aScript' HalfAdvance (XH / 2)

View file

@ -16,6 +16,14 @@ glyph-block Letter-Latin-Lower-B : begin
OBarLeft.shape
VBar.l SB 0 yTop
define [BottomCutBody yTop] : union
OBarLeft.shape
VBar.l SB HalfStroke yTop
spiro-outline
corner SB 0
corner SB HalfStroke
corner (SB + [HSwToV Stroke]) HalfStroke
define [ToothlessCornerBody yTop] : union
OBarLeft.toothless (rise -- DToothlessRise) (mBlend -- DMBlend)
VBar.l SB DToothlessRise yTop
@ -31,6 +39,7 @@ glyph-block Letter-Latin-Lower-B : begin
toothed ToothedBody
toothlessCorner ToothlessCornerBody
toothlessRounded ToothlessRoundedBody
bottomCut BottomCutBody
object # serifs
serifless { no-shape false }
motionSerifed { LTSerifs true }
@ -65,7 +74,7 @@ glyph-block Letter-Latin-Lower-B : begin
local xRight : mix SB RightSB 0.9
include : HBar.t xLeft xRight Ascender
include : Serifs
if doTS : include : VSerif.dr [mix SB RightSB 0.9] Ascender VJut
if doTS : include : VSerif.dr xRight Ascender VJut
include : LeaningAnchor.Above.VBar.m [mix xLeft xRight 0.5]
if [not doTS] : create-glyph "bHookTop.\(suffix)" : glyph-proc
@ -103,5 +112,5 @@ glyph-block Letter-Latin-Lower-B : begin
OShapeOutline.NoOvershoot XH 0 (SB + BBD + [HSwToV BBS]) RightSB
VBar.r (RightSB - BBD - OX) 0 XH BBS
include : OBarLeft.shape
left -- SB + BBD
left -- (SB + BBD)
sw -- BBS

View file

@ -95,7 +95,7 @@ glyph-block Letter-Latin-Lower-D : begin
if topSerif : include : topSerif df Ascender
if bottomSerif : include : bottomSerif df Ascender
include : LeaningAnchor.Above.VBar.r df.rightSB
set-base-anchor 'overlayOnExtension' (df.rightSB - [HSwToV : 0.5 * Stroke]) yOverlay
set-base-anchor 'overlayOnExtension' (df.rightSB - [HSwToV HalfStroke]) yOverlay
create-glyph "dStroke.\(suffix)" : glyph-proc
local df : DivFrame 1
@ -110,7 +110,7 @@ glyph-block Letter-Latin-Lower-D : begin
local xRight : df.rightSB + O
include : HBar.t xLeft xRight Ascender
if topSerif : begin
include : VSerif.dl xLeft Ascender : Math.min VJut (0.8 * (Ascender - XH))
include : VSerif.dl xLeft Ascender [Math.min VJut : 0.8 * (Ascender - XH)]
if [not para.isItalic] : include : HSerif.rt df.rightSB Ascender SideJut
if bottomSerif : include : bottomSerif df Ascender
include : LeaningAnchor.Above.VBar.m [mix xLeft xRight 0.5]
@ -198,20 +198,20 @@ glyph-block Letter-Latin-Lower-D : begin
local fine : AdviceStroke 4
local rinner : clamp (Width * 0.065) (XH * 0.05) (fine * 0.35)
local sw : AdviceStroke 2.75
local m1 : Math.min RightSB (Width - rinner * 2 - fine - OX)
local m : Math.min RightSB (Width - rinner * 2 - fine - OX)
include : LeaningAnchor.Above.VBar.r m1
include : OBarRight.shape (left -- SB) (right -- m1) (sw -- sw)
include : LeaningAnchor.Above.VBar.r m
include : OBarRight.shape (left -- SB) (right -- m) (sw -- sw)
include : dispiro
widths.lhs sw
flat (m1 - [HSwToV sw]) Ascender [heading Downward]
curl (m1 - [HSwToV sw]) (rinner * 2 + fine)
CurlyTail.n fine 0 (m1 + rinner * 2 + fine)
x2 -- ([mix SB m1 0.5] - [HSwToV : 0.75 * fine])
y2 -- 0.37 * Descender
flat (m - [HSwToV sw]) Ascender [heading Downward]
curl (m - [HSwToV sw]) (rinner * 2 + fine)
CurlyTail.n fine 0 (m + rinner * 2 + fine)
x2 -- ([mix SB m 0.5] - [HSwToV : 0.75 * fine])
y2 -- (0.37 * Descender)
swBefore -- sw
terminalSlopeAdj -- 0.25
if fSerif : include : HSerif.lt (m1 - [HSwToV sw]) Ascender SideJut
if fSerif : include : HSerif.lt (m - [HSwToV sw]) Ascender SideJut
select-variant 'dCurlyTail' 0x221
@ -224,5 +224,5 @@ glyph-block Letter-Latin-Lower-D : begin
OShapeOutline.NoOvershoot XH 0 SB (RightSB - BBD - [HSwToV BBS])
VBar.l (SB + BBD + OX) 0 XH BBS
include : OBarRight.shape
right -- RightSB - BBD
right -- (RightSB - BBD)
sw -- BBS

View file

@ -19,20 +19,20 @@ glyph-block Letter-Latin-Lower-G : begin
include : HBar.m l r currentGlyph.baseAnchors.overlay.y bw
# overlay bar width for double-storey g
define obwDoubleStorey : Math.min [AdviceStroke 5] (0.5 / 3 * (CAP - Stroke * 4))
define obwDoubleStorey : Math.min (0.5 / 3 * (CAP - Stroke * 4)) : AdviceStroke 5
create-glyph 'g.doubleStoreyClosed' : glyph-proc
include : MarkSet.p
local obot : XH * DesignParameters.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 gleftx : [mix 0 SB 0.85] + OX
local grightx : [mix Width RightSB 0.825] - OX
local groundy : Math.round : [mix Descender (XH * DesignParameters.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])]
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.rhs Stroke]
curl [mix RightSB SB 0.435] groundy
archv 4
@ -58,13 +58,13 @@ glyph-block Letter-Latin-Lower-G : begin
local obot : XH * DesignParameters.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 gleftx : [mix 0 SB 0.85] + OX
local grightx : [mix Width RightSB 0.825] - OX
local groundy : Math.round : [mix Descender (XH * DesignParameters.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])]
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.rhs Stroke]
curl [mix RightSB SB 0.435] groundy
archv 4
@ -112,15 +112,19 @@ glyph-block Letter-Latin-Lower-G : begin
CurlyTail.n fine Descender df.leftSB df.width (Descender + 0.5 * fine)
yLoopTop -- (0.15 * Descender + 0.25 * fine)
export : define [ScriptCutBody df top] : glyph-proc
export : define [TopCutBody df top] : glyph-proc
include : SeriflessBody df top
include : spiro-outline
corner df.rightSB top
corner df.rightSB (top - HalfStroke)
corner df.rightSB top
corner df.rightSB (top - HalfStroke)
corner (df.rightSB - [HSwToV Stroke]) (top - HalfStroke)
export : define [SeriflessBody df top] : glyph-proc
include : OBarRight.shape (top -- top) (left -- df.leftSB) (right -- df.rightSB) (sw -- df.mvs)
include : OBarRight.shape
top -- top
left -- df.leftSB
right -- df.rightSB
sw -- df.mvs
export : define [SerifedBody df top] : glyph-proc
include : SeriflessBody df top
@ -128,21 +132,21 @@ glyph-block Letter-Latin-Lower-G : begin
export : define [EarlessCornerBody df top] : glyph-proc
include : OBarLeft.toothless
top -- top
left -- df.leftSB
right -- df.rightSB
rise -- DToothlessRise
top -- top
left -- df.leftSB
right -- df.rightSB
rise -- DToothlessRise
mBlend -- DMBlend
sw -- df.mvs
sw -- df.mvs
include : FlipAround df.middle (top / 2)
export : define [EarlessRoundedBody df top] : glyph-proc
include : OBarLeft.rounded
top -- top
left -- df.leftSB
right -- df.rightSB
top -- top
left -- df.leftSB
right -- df.rightSB
yTerminal -- (XH - SmallArchDepthA)
sw -- df.mvs
sw -- df.mvs
include : FlipAround df.middle (top / 2)
define SingleStoreyConfig : SuffixCfg.weave
@ -155,7 +159,7 @@ glyph-block Letter-Latin-Lower-G : begin
earlessCorner { SingleStorey.EarlessCornerBody DToothlessRise }
earlessCornerHTB { SingleStorey.EarlessCornerBody 0 }
earlessRounded { SingleStorey.EarlessRoundedBody (XH - SmallArchDepthA) }
scriptCut { SingleStorey.ScriptCutBody HalfStroke }
topCut { SingleStorey.TopCutBody HalfStroke }
foreach { suffix { hookShape {bodyShape hookStart} } } [Object.entries SingleStoreyConfig] : do
create-glyph "g.\(suffix)" : glyph-proc
@ -181,10 +185,10 @@ glyph-block Letter-Latin-Lower-G : begin
include : bodyShape dfSub XH
include : hookShape dfSub (XH - hookStart)
include : PalatalHook.r
x -- df.rightSB
y -- 0
xLink -- dfSub.rightSB
refSw -- dfSub.mvs
x -- df.rightSB
y -- 0
xLink -- dfSub.rightSB
refSw -- dfSub.mvs
maskOut -- [intersection [MaskBelow 0] [MaskLeft dfSub.rightSB]]
create-glyph "gBar.\(suffix)" : glyph-proc
@ -213,8 +217,8 @@ glyph-block Letter-Latin-Lower-G : begin
include : MarkSet.p
set-base-anchor 'overlay' Middle (XH / 2)
define df : DivFrame 1
include : SingleStorey.ScriptCutBody df XH
include : SingleStorey.CrossedHook df (XH - HalfStroke)
include : SingleStorey.TopCutBody df XH
include : SingleStorey.CrossedHook df (XH - HalfStroke)
glyph-block-import Letter-Blackboard : BBS BBD BBBarRight
create-glyph 'mathbb/g' 0x1D558 : glyph-proc
@ -223,9 +227,9 @@ glyph-block Letter-Latin-Lower-G : begin
OShapeOutline.NoOvershoot XH 0 SB (RightSB - BBD - [HSwToV BBS])
VBar.l (SB + BBD + OX) 0 XH BBS
include : OBarRight.shape
left -- SB
right -- RightSB - BBD
sw -- BBS
left -- SB
right -- (RightSB - BBD)
sw -- BBS
include : SingleStorey.BentHookT dispiro [DivFrame 1] XH 0 BBS
include : HBar.t (RightSB - BBD) RightSB XH BBS
include : intersection

View file

@ -34,6 +34,18 @@ glyph-block Letter-Latin-Lower-Q : begin
[Just TERMINAL-TAILED] : RightwardTailedBar RightSB bottom top
[Just TERMINAL-DIAG] : RDiagTailedBar RightSB bottom top
define [TopCutBody terminal top bottom] : glyph-proc
set-base-anchor 'trailing' (RightSB - markHalfStroke) Descender
include : OBarRight.shape (top -- top)
include : match terminal
[Just TERMINAL-NORMAL] : VBar.r RightSB bottom (top - HalfStroke)
[Just TERMINAL-TAILED] : RightwardTailedBar RightSB bottom (top - HalfStroke)
[Just TERMINAL-DIAG] : RDiagTailedBar RightSB bottom (top - HalfStroke)
include : spiro-outline
corner RightSB top
corner RightSB (top - HalfStroke)
corner (RightSB - [HSwToV Stroke]) (top - HalfStroke)
define [EarlessCornerBody terminal top bottom] : glyph-proc
set-base-anchor 'trailing' (RightSB - markHalfStroke) Descender
include : OBarLeft.toothless (top -- top) (rise -- DToothlessRise) (mBlend -- DMBlend)
@ -64,6 +76,7 @@ glyph-block Letter-Latin-Lower-Q : begin
"" EaredBody
earlessCorner EarlessCornerBody
earlessRounded EarlessRoundedBody
topCut TopCutBody
object # tail
straight { TERMINAL-NORMAL false }
tailed { TERMINAL-TAILED true }
@ -118,6 +131,6 @@ glyph-block Letter-Latin-Lower-Q : begin
OShapeOutline.NoOvershoot XH 0 SB (RightSB - BBD - [HSwToV BBS])
VBar.l (SB + BBD + OX) 0 XH BBS
include : OBarRight.shape
left -- SB
right -- RightSB - BBD
sw -- BBS
left -- SB
right -- (RightSB - BBD)
sw -- BBS

View file

@ -2139,8 +2139,8 @@ selectorAffix."a/rtailBase" = "doubleStorey"
selectorAffix."a/doubleStorey" = "doubleStorey"
selectorAffix."a/singleStorey/autoSerifed/slab" = "singleStorey"
selectorAffix."a/singleStorey/autoSerifed/sans" = "singleStorey"
selectorAffix."aScript/autoSerifed/slab" = "singleStoreyScriptCut"
selectorAffix."aScript/autoSerifed/sans" = "singleStoreyScriptCut"
selectorAffix."aScript/autoSerifed/slab" = "singleStoreyTopCut"
selectorAffix."aScript/autoSerifed/sans" = "singleStoreyTopCut"
[prime.a.variants-buildup.stages.storey.single-storey]
rank = 2
@ -2200,11 +2200,25 @@ selectorAffix."a/rtailBase" = ""
selectorAffix."a/doubleStorey" = ""
selectorAffix."a/singleStorey/autoSerifed/slab" = ""
selectorAffix."a/singleStorey/autoSerifed/sans" = ""
selectorAffix."aScript/autoSerifed/slab" = "scriptCut"
selectorAffix."aScript/autoSerifed/sans" = "scriptCut"
selectorAffix."aScript/autoSerifed/slab" = "topCut"
selectorAffix."aScript/autoSerifed/sans" = "topCut"
[prime.a.variants-buildup.stages.ear.top-cut]
rank = 2
nonBreakingVariantAdditionPriority = 100
descriptionAffix = "a diagonal cut at top"
selectorAffix.a = "topCut"
selectorAffix."ae/a" = ""
selectorAffix."a/sansSerif" = "topCut"
selectorAffix."a/rtailBase" = "topCut"
selectorAffix."a/doubleStorey" = ""
selectorAffix."a/singleStorey/autoSerifed/slab" = "topCut"
selectorAffix."a/singleStorey/autoSerifed/sans" = "topCut"
selectorAffix."aScript/autoSerifed/slab" = "topCut"
selectorAffix."aScript/autoSerifed/sans" = "topCut"
[prime.a.variants-buildup.stages.ear.earless-corner]
rank = 2
rank = 3
descriptionAffix = "earless (cornered top-right)"
selectorAffix.a = "earlessCorner"
selectorAffix."ae/a" = ""
@ -2213,11 +2227,11 @@ selectorAffix."a/rtailBase" = "earlessCorner"
selectorAffix."a/doubleStorey" = ""
selectorAffix."a/singleStorey/autoSerifed/slab" = "earlessCorner"
selectorAffix."a/singleStorey/autoSerifed/sans" = "earlessCorner"
selectorAffix."aScript/autoSerifed/slab" = "scriptCut"
selectorAffix."aScript/autoSerifed/sans" = "scriptCut"
selectorAffix."aScript/autoSerifed/slab" = "topCut"
selectorAffix."aScript/autoSerifed/sans" = "topCut"
[prime.a.variants-buildup.stages.ear.earless-rounded]
rank = 3
rank = 4
descriptionAffix = "earless (rounded top-right)"
selectorAffix.a = "earlessRounded"
selectorAffix."ae/a" = ""
@ -2226,8 +2240,8 @@ selectorAffix."a/rtailBase" = "earlessRounded"
selectorAffix."a/doubleStorey" = ""
selectorAffix."a/singleStorey/autoSerifed/slab" = "earlessRounded"
selectorAffix."a/singleStorey/autoSerifed/sans" = "earlessRounded"
selectorAffix."aScript/autoSerifed/slab" = "scriptCut"
selectorAffix."aScript/autoSerifed/sans" = "scriptCut"
selectorAffix."aScript/autoSerifed/slab" = "topCut"
selectorAffix."aScript/autoSerifed/sans" = "topCut"
[prime.a.variants-buildup.stages.bar.serifless]
rank = 1
@ -2345,15 +2359,23 @@ selectorAffix.b = "toothed"
selectorAffix."b/sansSerif" = "toothed"
selectorAffix.bHookTop = "toothed"
[prime.b.variants-buildup.stages.body.toothless-corner]
[prime.b.variants-buildup.stages.body.bottom-cut]
rank = 2
nonBreakingVariantAdditionPriority = 100
descriptionAffix = "a diagonal cut at bottom"
selectorAffix.b = "bottomCut"
selectorAffix."b/sansSerif" = "bottomCut"
selectorAffix.bHookTop = "bottomCut"
[prime.b.variants-buildup.stages.body.toothless-corner]
rank = 3
descriptionAffix = "toothless (cornered) shape"
selectorAffix.b = "toothlessCorner"
selectorAffix."b/sansSerif" = "toothlessCorner"
selectorAffix.bHookTop = "toothlessCorner"
[prime.b.variants-buildup.stages.body.toothless-rounded]
rank = 3
rank = 4
descriptionAffix = "toothless (rounded) shape"
selectorAffix.b = "toothlessRounded"
selectorAffix."b/sansSerif" = "toothlessRounded"
@ -2768,7 +2790,7 @@ selectorAffix."g/sansSerif" = "doubleStorey"
selectorAffix."g/hookTopBase" = "singleStoreyBentHookSerifless"
selectorAffix."g/singleStorey/autoSerifed/slab" = "singleStoreyBentHookSerifed"
selectorAffix."g/singleStorey/autoSerifed/sans" = "singleStoreyBentHookSerifless"
selectorAffix.gScript = "singleStoreyBentHookScriptCut"
selectorAffix.gScript = "singleStoreyBentHookTopCut"
[prime.g.variants-buildup.stages.openness."*"]
next = "END"
@ -2834,7 +2856,7 @@ selectorAffix."g/sansSerif" = "serifless"
selectorAffix."g/hookTopBase" = "serifless"
selectorAffix."g/singleStorey/autoSerifed/slab" = "serifless"
selectorAffix."g/singleStorey/autoSerifed/sans" = "serifless"
selectorAffix.gScript = "scriptCut"
selectorAffix.gScript = "topCut"
[prime.g.variants-buildup.stages.ear.serifed]
rank = 2
@ -2844,27 +2866,38 @@ selectorAffix."g/sansSerif" = "serifless"
selectorAffix."g/hookTopBase" = "serifless"
selectorAffix."g/singleStorey/autoSerifed/slab" = "serifed"
selectorAffix."g/singleStorey/autoSerifed/sans" = "serifed"
selectorAffix.gScript = "scriptCut"
selectorAffix.gScript = "topCut"
[prime.g.variants-buildup.stages.ear.top-cut]
rank = 3
nonBreakingVariantAdditionPriority = 100
descriptionAffix = "a diagonal cut at top"
selectorAffix.g = "topCut"
selectorAffix."g/sansSerif" = "topCut"
selectorAffix."g/hookTopBase" = "serifless"
selectorAffix."g/singleStorey/autoSerifed/slab" = "topCut"
selectorAffix."g/singleStorey/autoSerifed/sans" = "topCut"
selectorAffix.gScript = "topCut"
[prime.g.variants-buildup.stages.ear.earless-corner]
rank = 3
rank = 4
descriptionAffix = "earless (cornered top-right)"
selectorAffix.g = "earlessCorner"
selectorAffix."g/sansSerif" = "earlessCorner"
selectorAffix."g/hookTopBase" = "earlessCornerHTB"
selectorAffix."g/singleStorey/autoSerifed/slab" = "earlessCorner"
selectorAffix."g/singleStorey/autoSerifed/sans" = "earlessCorner"
selectorAffix.gScript = "scriptCut"
selectorAffix.gScript = "topCut"
[prime.g.variants-buildup.stages.ear.earless-rounded]
rank = 4
rank = 5
descriptionAffix = "earless (rounded top-right)"
selectorAffix.g = "earlessRounded"
selectorAffix."g/sansSerif" = "earlessRounded"
selectorAffix."g/hookTopBase" = "serifless"
selectorAffix."g/singleStorey/autoSerifed/slab" = "earlessRounded"
selectorAffix."g/singleStorey/autoSerifed/sans" = "earlessRounded"
selectorAffix.gScript = "scriptCut"
selectorAffix.gScript = "topCut"
@ -3954,8 +3987,18 @@ selectorAffix."q/hookTopBase" = ""
selectorAffix.qRTail = ""
selectorAffix.gha = ""
[prime.q.variants-buildup.stages.body.earless-corner]
[prime.q.variants-buildup.stages.body.top-cut]
rank = 2
nonBreakingVariantAdditionPriority = 100
descriptionAffix = "a diagonal cut at top"
selectorAffix.q = "topCut"
selectorAffix."q/sansSerif" = "topCut"
selectorAffix."q/hookTopBase" = ""
selectorAffix.qRTail = "topCut"
selectorAffix.gha = ""
[prime.q.variants-buildup.stages.body.earless-corner]
rank = 3
descriptionAffix = "earless (cornered) shape"
selectorAffix.q = "earlessCorner"
selectorAffix."q/sansSerif" = "earlessCorner"
@ -3964,7 +4007,7 @@ selectorAffix.qRTail = "earlessCorner"
selectorAffix.gha = ""
[prime.q.variants-buildup.stages.body.earless-rounded]
rank = 3
rank = 4
descriptionAffix = "earless (rounded) shape"
selectorAffix.q = "earlessRounded"
selectorAffix."q/sansSerif" = "earlessRounded"
@ -5492,14 +5535,21 @@ keyAffix = ""
selectorAffix."grek/alpha" = ""
selectorAffix."grek/alpha/sansSerif" = ""
[prime.lower-alpha.variants-buildup.stages.ear.earless-corner]
[prime.lower-alpha.variants-buildup.stages.ear.top-cut]
rank = 2
nonBreakingVariantAdditionPriority = 100
descriptionAffix = "a diagonal cut at top"
selectorAffix."grek/alpha" = "topCut"
selectorAffix."grek/alpha/sansSerif" = "topCut"
[prime.lower-alpha.variants-buildup.stages.ear.earless-corner]
rank = 3
descriptionAffix = "earless (cornered top-right)"
selectorAffix."grek/alpha" = "earlessCorner"
selectorAffix."grek/alpha/sansSerif" = "earlessCorner"
[prime.lower-alpha.variants-buildup.stages.ear.earless-rounded]
rank = 3
rank = 4
descriptionAffix = "earless (rounded top-right)"
selectorAffix."grek/alpha" = "earlessRounded"
selectorAffix."grek/alpha/sansSerif" = "earlessRounded"
@ -6266,14 +6316,21 @@ keyAffix = ""
selectorAffix."cyrl/a" = ""
selectorAffix."cyrl/ae/a" = ""
[prime.cyrl-a.variants-buildup.stages.ear.earless-corner]
[prime.cyrl-a.variants-buildup.stages.ear.top-cut]
rank = 2
nonBreakingVariantAdditionPriority = 100
descriptionAffix = "a diagonal cut at top"
selectorAffix."cyrl/a" = "topCut"
selectorAffix."cyrl/ae/a" = ""
[prime.cyrl-a.variants-buildup.stages.ear.earless-corner]
rank = 3
descriptionAffix = "earless (cornered top-right)"
selectorAffix."cyrl/a" = "earlessCorner"
selectorAffix."cyrl/ae/a" = ""
[prime.cyrl-a.variants-buildup.stages.ear.earless-rounded]
rank = 3
rank = 4
descriptionAffix = "earless (rounded top-right)"
selectorAffix."cyrl/a" = "earlessRounded"
selectorAffix."cyrl/ae/a" = ""
@ -9202,6 +9259,7 @@ i = "serifed"
j = "serifed"
k = "symmetric-touching-serifless"
l = "serifed"
q = "top-cut-straight-serifless"
t = "bent-hook-short-neck"
u = "toothed-serifless"
y = "straight-turn-serifless"
@ -9243,9 +9301,9 @@ question = "corner-flat-hooked"
micro-sign = "tailed-serifless"
[composite.ss03.italic]
a = "single-storey-serifless"
a = "single-storey-top-cut-serifless"
f = "flat-hook-tailed"
g = "single-storey-serifless"
g = "single-storey-top-cut"
i = "tailed-serifed"
k = "cursive-serifless"
l = "tailed"
@ -9253,7 +9311,7 @@ long-s = "flat-hook-descending"
eszet = "longs-s-lig-descending-serifless"
lower-beta = "cursive"
lower-phi = "cursive"
cyrl-a = "single-storey-serifless"
cyrl-a = "single-storey-top-cut-serifless"
cyrl-ve = "cursive-tall"
cyrl-zhe = "symmetric-connected"
cyrl-ka = "symmetric-connected-serifless"
@ -9270,6 +9328,7 @@ b = "toothless-corner-serifed"
d = "toothed-serifed"
f = "flat-hook-serifed"
k = "symmetric-touching-serifed"
q = "top-cut-straight-serifed"
u = "toothed-serifed"
x = "straight-serifed"
y = "straight-turn-serifed"
@ -9291,7 +9350,7 @@ seven = "straight-serifed"
micro-sign = "tailed-serifed"
[composite.ss03.slab-override.italic]
a = "single-storey-serifed"
a = "single-storey-top-cut-serifed"
f = "flat-hook-tailed"
k = "cursive-top-left-and-bottom-right-serifed"
l = "tailed-serifed"
@ -9300,7 +9359,7 @@ x = "straight-bilateral-motion-serifed"
y = "straight-turn-motion-serifed"
long-s = "flat-hook-descending"
eszet = "longs-s-lig-descending-serifless"
cyrl-a = "single-storey-serifed"
cyrl-a = "single-storey-top-cut-serifed"
cyrl-ve = "cursive-tall"
cyrl-ka = "symmetric-connected-top-left-and-bottom-right-serifed"
cyrl-u = "straight-turn-motion-serifed"
@ -9976,12 +10035,14 @@ capital-k = "symmetric-touching-serifless"
capital-q = "crossing"
capital-w = "straight-vertical-sides-serifless"
a = "double-storey-toothless-corner"
b = "toothed-serifless"
f = "flat-hook-serifless"
g = "single-storey-flat-hook-serifless"
i = "hooky"
j = "flat-hook-serifed"
k = "symmetric-connected-serifless"
l = "hooky"
q = "straight-serifless"
t = "flat-hook"
w = "rounded-vertical-sides-serifless"
y = "cursive-flat-hook-serifless"
@ -10012,11 +10073,14 @@ micro-sign = "toothless-rounded-serifless"
[composite.ss10.italic]
capital-a = "straight-serifless"
a = "single-storey-tailed"
a = "single-storey-top-cut-tailed"
b = "bottom-cut-serifless"
g = "single-storey-flat-hook-top-cut"
i = "serifed-flat-tailed"
j = "serifed"
l = "serifed-flat-tailed"
cyrl-a = "single-storey-tailed"
q = "top-cut-straight-serifless"
cyrl-a = "single-storey-top-cut-tailed"
cyrl-u = "cursive-flat-hook-serifless"
[composite.ss10.slab-override.design]
@ -10024,11 +10088,13 @@ capital-a = "round-top-base-serifed"
capital-j = "serifed"
capital-k = "symmetric-touching-serifed"
capital-w = "straight-vertical-sides-serifed"
b = "toothed-serifed"
f = "flat-hook-serifed"
g = "single-storey-flat-hook-serifed"
i = "serifed"
k = "symmetric-connected-serifed"
l = "serifed"
q = "straight-serifed"
w = "rounded-vertical-sides-serifed"
x = "straight-serifed"
y = "cursive-flat-hook-serifed"
@ -10044,10 +10110,12 @@ micro-sign = "toothless-rounded-serifed"
[composite.ss10.slab-override.italic]
capital-a = "straight-base-serifed"
g = "single-storey-flat-hook-serifless"
b = "bottom-cut-serifed"
g = "single-storey-flat-hook-top-cut"
i = "serifed-flat-tailed"
k = "symmetric-connected-top-left-and-bottom-right-serifed"
l = "serifed-flat-tailed"
q = "top-cut-straight-serifed"
w = "rounded-vertical-sides-motion-serifed"
x = "straight-bilateral-motion-serifed"
y = "cursive-flat-hook-motion-serifed"