Add variant selectors for Capital Eszet and Thorn. (#2385)

This commit is contained in:
John McWilliams 2024-06-20 19:26:03 -04:00 committed by GitHub
parent 3f813bb01d
commit a9c0037a2e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 191 additions and 55 deletions

View file

@ -1,4 +1,6 @@
* Add separate variant selectors For Cyrillic Capital/Lower E (`VXAA`, `VXAB`).
* Add variant selector for Capital Eszet (`ẞ`) (`VXAC`) (#1552).
* Add variant selector for Capital Thorn (`Þ`) (`VXAD`).
* Add `serifed-capped` variants for `capital-e` and `capital-f` (`cv05`, `cv06`) (#2026).
* Add `unilateral-bottom-serifed` and `unilateral-bottom-inward-serifed` variants for Cyrillic Capital/Lower Ze (`cv69`, `cv70`).
* Add characters:

View file

@ -181,12 +181,44 @@ glyph-block Letter-Latin-Upper-Eszet : begin
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives
create-glyph 'Eszet' 0x1E9E : glyph-proc
define [EszetRoundedShape slab] : glyph-proc
include : MarkSet.capital
define ymiddle : [mix 0 CAP 0.5] - HalfStroke
define ymiddleCap : [mix 0 CAP 0.54] - HalfStroke
define ymiddleCap : [mix 0 CAP 0.5] + HalfStroke
define xFinal : Math.max
mix (SB + [HSwToV Stroke]) RightSB 0.1
mix SB RightSB 0.3
define xMiddle : RightSB - ymiddle / 2 - Stroke * 0.75
define xMiddleBot : RightSB - ymiddle / 2 - HalfStroke
define rightTopX : RightSB + O * 2
include : dispiro
widths.lhs
g4 rightTopX (CAP - ArchDepthB)
hookstart (CAP - O)
flat SB XH
curl SB 0 [heading Downward]
include : dispiro
widths.rhs
g4 xMiddle ymiddleCap
archv
g4 (RightSB - O) [mix 0 ymiddleCap 0.5]
arcvh
flat xMiddleBot 0
curl xFinal 0 [heading Leftward]
include : dispiro
widths.rhs
g4 rightTopX (CAP - ArchDepthB)
g4 xMiddle ymiddleCap [widths Stroke 0]
if slab : include : HSerif.lb SB 0 SideJut
define [EszetFlatTopShape slab] : glyph-proc
include : MarkSet.capital
define ymiddle : [mix 0 CAP 0.5] - HalfStroke
define ymiddleCap : [mix 0 CAP 0.54] + HalfStroke
define xFinal : Math.max
mix (SB + [HSwToV Stroke]) RightSB 0.1
mix SB RightSB 0.3
@ -203,15 +235,28 @@ glyph-block Letter-Latin-Upper-Eszet : begin
curl SB 0 [heading Downward]
include : dispiro
widths.rhs
g4 xMiddle (ymiddleCap + Stroke) [heading Rightward]
g4 xMiddle ymiddleCap [heading Rightward]
archv
g4 (RightSB - O * 2) [YSmoothMidR (ymiddleCap + Stroke) 0]
g4 (RightSB - O * 2) [YSmoothMidR ymiddleCap 0]
arcvh
flat xMiddleBot 0
curl xFinal 0 [heading Leftward]
include : dispiro
widths.rhs
g4 rightTopX (CAP - Stroke)
g4 xMiddle (ymiddleCap + Stroke) [widths.lhs Stroke]
g4 xMiddle ymiddleCap [widths.lhs Stroke]
if SLAB : include : HSerif.lb SB 0 SideJut
if slab : include : HSerif.lb SB 0 SideJut
define CapitalEszetConfig : SuffixCfg.weave
object # body
rounded EszetRoundedShape
flatTop EszetFlatTopShape
object # serifs
serifless false
serifed true
foreach { suffix { Base serif } } [pairs-of CapitalEszetConfig] : do
create-glyph "Eszet.\(suffix)" : Base serif
select-variant 'Eszet' 0x1E9E

View file

@ -13,15 +13,15 @@ glyph-block Letter-Latin-Thorn : begin
define xThornLeftStroke : SB * 1.25
define [yThornBowlBot top] : top * 0.25 + [if SLAB (Stroke * 0.125) 0]
define [yThornBowlTop top] : top - 0.7 * [yThornBowlBot top] + [if SLAB (-0.125) 0.25] * Stroke
define [yThornBowlBot top slab] : top * 0.25 + [if slab (Stroke * 0.125) 0]
define [yThornBowlTop top slab] : top - 0.7 * [yThornBowlBot top slab] + [if slab (-0.125) 0.25] * Stroke
define [yShoBowlBot top] : mix [yThornBowlBot top] (top - [yThornBowlTop top]) 0.5
define [yShoBowlTop top] : top - [yShoBowlBot top]
define [yShoBowlBot top slab] : mix [yThornBowlBot top slab] (top - [yThornBowlTop top slab]) 0.5
define [yShoBowlTop top slab] : top - [yShoBowlBot top slab]
define [ThornShape top _yBowlBot _yBowlTop] : glyph-proc
local yBowlBot : fallback _yBowlBot [yThornBowlBot top]
local yBowlTop : fallback _yBowlTop [yThornBowlTop top]
define [ThornShape top slabTop slabBot _yBowlBot _yBowlTop] : glyph-proc
local yBowlBot : fallback _yBowlBot [yThornBowlBot top slabBot]
local yBowlTop : fallback _yBowlTop [yThornBowlTop top slabBot]
local turn : mix yBowlTop yBowlBot (ArchDepthB / (ArchDepthA + ArchDepthB))
local turnRadius : (yBowlTop - yBowlBot) / 2
@ -37,44 +37,51 @@ glyph-block Letter-Latin-Thorn : begin
curl xThornLeftStroke yBowlBot [heading Leftward]
include : VBar.l xThornLeftStroke 0 top
if SLAB : begin
if slabTop : begin
local sf : SerifFrame top 0 xThornLeftStroke RightSB
include : composite-proc sf.lt.fullSide sf.lb.fullSide
if slabBot
then : include : composite-proc sf.lt.fullSide sf.lb.fullSide
else : include sf.lt.outer
define [GrekShoShapeImpl top] : ThornShape top [yShoBowlBot top] [yShoBowlTop top]
define [GrekShoShapeImpl top slabTop slabBot] : ThornShape top slabTop slabBot
yShoBowlBot top slabBot
yShoBowlTop top slabBot
create-glyph 'Thorn' 0xDE : glyph-proc
include : MarkSet.capital
include : ThornShape CAP
include : LeaningAnchor.Above.VBar.l xThornLeftStroke
include : LeaningAnchor.Below.VBar.l xThornLeftStroke
define ThornConfig : object
serifless { false false }
motionSerifed { true false }
serifed { true true }
foreach { suffix { st sb } } [Object.entries ThornConfig] : do
create-glyph "Thorn.\(suffix)" : glyph-proc
include : MarkSet.capital
include : ThornShape CAP st sb
include : LeaningAnchor.Above.VBar.l xThornLeftStroke
include : LeaningAnchor.Below.VBar.l xThornLeftStroke
create-glyph "ThornStroke.\(suffix)" : glyph-proc
include : MarkSet.capital
include : ThornShape CAP st sb (CAP - [yThornBowlTop CAP sb]) (CAP - [yThornBowlBot CAP st])
include : LeaningAnchor.Above.VBar.l xThornLeftStroke
include : LeaningAnchor.Below.VBar.l xThornLeftStroke
include : LetterBarOverlay.l.in
x -- xThornLeftStroke
top -- (CAP - [if st Stroke 0])
bot -- (CAP - [yThornBowlBot CAP st])
create-glyph "ThornStrokeBot.\(suffix)" : glyph-proc
include [refer-glyph "Thorn.\(suffix)"] AS_BASE ALSO_METRICS
include : LetterBarOverlay.l.in
x -- xThornLeftStroke
bot -- (0 + [if sb Stroke 0])
top -- (0 + [yThornBowlBot CAP sb])
select-variant 'Thorn' 0xDE
select-variant 'ThornStroke' 0xA764 (follow -- 'Thorn')
select-variant 'ThornStrokeBot' 0xA766 (follow -- 'Thorn')
create-glyph 'grek/Sho' 0x3F7 : glyph-proc
include : MarkSet.capital
include : GrekShoShapeImpl CAP
include : GrekShoShapeImpl CAP SLAB SLAB
include : LeaningAnchor.Above.VBar.l xThornLeftStroke
include : LeaningAnchor.Below.VBar.l xThornLeftStroke
# create-glyph 'smcpThorn' 0xEF15 : glyph-proc
# include : MarkSet.e
# include : GrekShoShapeImpl XH
# include : LeaningAnchor.Above.VBar.l xThornLeftStroke
# include : LeaningAnchor.Below.VBar.l xThornLeftStroke
create-glyph 'ThornStroke/base' : glyph-proc
include : MarkSet.capital
include : ThornShape CAP (CAP - [yThornBowlTop CAP]) (CAP - [yThornBowlBot CAP])
include : LeaningAnchor.Above.VBar.l xThornLeftStroke
include : LeaningAnchor.Below.VBar.l xThornLeftStroke
create-glyph 'ThornStroke/Overlay' : LetterBarOverlay.l.in
x -- xThornLeftStroke
top -- (CAP - [if SLAB Stroke 0])
bot -- (CAP - [yThornBowlBot CAP])
derive-composites 'ThornStroke' 0xA764 'ThornStroke/base' 'ThornStroke/Overlay'
create-glyph 'ThornStrokeBot/Overlay' : LetterBarOverlay.l.in
x -- xThornLeftStroke
bot -- (0 + [if SLAB Stroke 0])
top -- (0 + [yThornBowlBot CAP])
derive-composites 'ThornStrokeBot' 0xA766 'Thorn' 'ThornStrokeBot/Overlay'

View file

@ -35,16 +35,16 @@ glyph-block Letter-Latin-Wynn : begin
serifed { FullSerifs true }
foreach { suffix { Serifs doBS } } [Object.entries WynnConfig] : do
create-glyph "Wynn.\(suffix)" : glyph-proc
include : MarkSet.capital
include : LeaningAnchor.Below.VBar.l SB
include : WynnShape 0 CAP
include : Serifs CAP 0
create-glyph "wynn.\(suffix)" : glyph-proc
include : MarkSet.p
include : LeaningAnchor.Below.VBar.l SB
include : WynnShape Descender XH
include : Serifs XH Descender
select-variant 'Wynn' 0x1F7
select-variant 'wynn' 0x1BF
create-glyph 'Wynn' 0x1F7 : glyph-proc
include : MarkSet.capital
include : LeaningAnchor.Below.VBar.l SB
include : WynnShape 0 CAP
if SLAB : include : FullSerifs CAP 0

View file

@ -4466,6 +4466,42 @@ selectorAffix."ezh/phoneticRight" = ""
[prime.capital-eszet]
sampler = "ẞ"
samplerExplain = "Capital Eszet"
nonBreakingTagForNewVariantSelector = "VXAC" # REMOVE IN NEXT MAJOR VERSION CHANGE
tagKind = "letter"
[prime.capital-eszet.variants-buildup]
entry = "body"
descriptionLeader = "Capital Eszet (`ẞ`)"
[prime.capital-eszet.variants-buildup.stages.body."*"]
next = "serifs"
[prime.capital-eszet.variants-buildup.stages.body.rounded]
rank = 1
descriptionAffix = "rounded top"
selectorAffix.Eszet = "rounded"
[prime.capital-eszet.variants-buildup.stages.body.flat-top]
rank = 2
descriptionAffix = "flat top"
selectorAffix.Eszet = "flatTop"
[prime.capital-eszet.variants-buildup.stages.serifs.serifless]
rank = 1
descriptionJoiner = "without"
descriptionAffix = "serifs"
selectorAffix.Eszet = "serifless"
[prime.capital-eszet.variants-buildup.stages.serifs.serifed]
rank = 2
descriptionAffix = "serifs"
selectorAffix.Eszet = "serifed"
[prime.long-s]
sampler = "ſ"
samplerExplain = "Long-S"
@ -4696,6 +4732,32 @@ selector."eth" = "curly-bar"
[prime.capital-thorn]
sampler = "Þ"
samplerExplain = "Capital Thorn (`Þ`)"
nonBreakingTagForNewVariantSelector = "VXAD" # REMOVE IN NEXT MAJOR VERSION CHANGE
tagKind = "letter"
[prime.capital-thorn.variants.serifless]
rank = 1
description = "Capital Thorn (`Þ`) without serifs"
selector.Thorn = "serifless"
selector.Wynn = "serifless"
[prime.capital-thorn.variants.motion-serifed]
rank = 2
description = "Capital Thorn (`Þ`) with motion serifs"
selector.Thorn = "motionSerifed"
selector.Wynn = "motionSerifed"
[prime.capital-thorn.variants.serifed]
rank = 3
description = "Capital Thorn (`Þ`) with serifs"
selector.Thorn = "serifed"
selector.Wynn = "serifed"
[prime.lower-thorn]
sampler = "þ"
samplerExplain = "Lowercase Thorn (`þ`)"
@ -7990,9 +8052,12 @@ w = "straight-serifless"
x = "straight-serifless"
y = "straight-serifless"
z = "straight-serifless"
# Latin ext.
capital-eszet = "flat-top-serifless"
long-s = "bent-hook-serifless"
eszet = "sulzbacher-serifless"
lower-eth = "curly-bar"
capital-thorn = "serifless"
lower-thorn = "serifless"
# Non-latin
lower-alpha = "crossing"
@ -8145,8 +8210,10 @@ w = "straight-serifed"
x = "straight-serifed"
y = "straight-turn-serifed"
z = "straight-serifed"
capital-eszet = "flat-top-serifed"
long-s = "bent-hook-bottom-serifed"
eszet = "sulzbacher-bottom-serifed"
capital-thorn = "serifed"
lower-thorn = "serifed"
capital-gamma = "serifed"
capital-lambda = "straight-base-serifed"
@ -8419,6 +8486,7 @@ k = "symmetric-touching-serifless"
l = "serifed"
u = "toothed-serifless"
y = "straight-turn-serifless"
capital-eszet = "rounded-serifless"
long-s = "flat-hook-serifless"
eszet = "longs-s-lig-serifless"
lower-chi = "semi-chancery-straight"
@ -8474,6 +8542,7 @@ k = "symmetric-touching-serifed"
u = "toothed-serifed"
y = "straight-turn-serifed"
z = "straight-serifed"
capital-eszet = "rounded-serifed"
long-s = "flat-hook-bottom-serifed"
eszet = "longs-s-lig-bottom-serifed"
cyrl-capital-ka = "symmetric-touching-serifed"
@ -8706,6 +8775,7 @@ l = "serifed-flat-tailed"
r = "hookless-serifless"
u = "toothed-serifless"
y = "straight-turn-serifless"
capital-eszet = "rounded-serifless"
long-s = "flat-hook-serifless"
eszet = "longs-s-lig-serifless"
lower-delta = "flat-top"
@ -8760,6 +8830,7 @@ w = "straight-serifed"
x = "straight-serifed"
y = "straight-turn-serifed"
z = "straight-serifed"
capital-eszet = "rounded-serifed"
long-s = "flat-hook-bottom-serifed"
eszet = "longs-s-lig-bottom-serifed"
lower-mu = "tailed-serifed"
@ -9015,6 +9086,7 @@ r = "hookless-serifless"
u = "toothed-serifless"
w = "straight-flat-top-serifless"
y = "straight-turn-serifless"
capital-eszet = "rounded-serifless"
long-s = "flat-hook-middle-serifed"
eszet = "longs-s-lig-serifless"
lower-lambda = "straight-turn"
@ -9060,6 +9132,7 @@ u = "toothed-serifed"
w = "straight-flat-top-serifed"
y = "straight-turn-serifed"
z = "straight-serifed"
capital-eszet = "rounded-serifed"
long-s = "flat-hook-double-serifed"
eszet = "longs-s-lig-bottom-serifed"
cyrl-capital-u = "straight-turn-serifed"
@ -9197,6 +9270,7 @@ capital-m = "slanted-sides-hanging-serifless"
a = "double-storey-toothless-corner"
b = "toothless-corner-serifless"
d = "toothless-corner-serifless"
f = "serifless"
g = "single-storey-earless-corner"
i = "serifed-semi-tailed"
k = "symmetric-touching-serifless"
@ -9208,6 +9282,7 @@ q = "earless-corner-straight-serifless"
r = "earless-corner-serifless"
u = "toothless-corner-serifless"
y = "straight-turn-serifless"
capital-eszet = "rounded-serifless"
long-s = "bent-hook-serifless"
eszet = "longs-s-lig-serifless"
lower-alpha = "barred-earless-corner-tailed"
@ -9264,6 +9339,7 @@ capital-k = "symmetric-touching-serifed"
capital-m = "slanted-sides-hanging-serifed"
b = "toothless-corner-serifed"
d = "toothless-corner-serifed"
f = "serifed"
k = "symmetric-touching-serifed"
m = "earless-corner-double-arch-short-leg-serifed"
n = "earless-corner-straight-serifed"
@ -9273,6 +9349,7 @@ r = "earless-corner-serifed"
u = "toothless-corner-serifed"
y = "straight-turn-serifed"
z = "straight-serifed"
capital-eszet = "rounded-serifed"
long-s = "bent-hook-bottom-serifed"
eszet = "longs-s-lig-bottom-serifed"
capital-gamma = "serifed"
@ -9290,6 +9367,7 @@ micro-sign = "toothless-corner-serifed"
[composite.ss12.slab-override.italic]
d = "tailed-serifed"
f = "tailed"
k = "symmetric-touching-top-left-serifed"
m = "earless-corner-double-arch-short-leg-bottom-right-serifed"
n = "earless-corner-straight-motion-serifed"
@ -9640,6 +9718,7 @@ r = "serifed"
t = "bent-hook-short-neck2"
u = "toothed-serifed"
y = "straight-turn-serifless"
capital-eszet = "rounded-serifless"
long-s = "flat-hook-middle-serifed"
eszet = "longs-s-lig-middle-serifed"
lower-thorn = "motion-serifed"
@ -9695,6 +9774,7 @@ w = "straight-serifed"
x = "straight-serifed"
y = "straight-turn-serifed"
z = "straight-serifed"
capital-eszet = "rounded-serifed"
long-s = "flat-hook-double-serifed"
eszet = "longs-s-lig-dual-serifed"
lower-thorn = "serifed"
@ -9753,6 +9833,7 @@ z = "straight-serifless"
long-s = "bent-hook-serifless"
eszet = "longs-s-lig-serifless"
lower-eth = "straight-bar"
capital-thorn = "motion-serifed"
lower-iota = "serifed-flat-tailed"
lower-lambda = "tailed-turn"
lower-tau = "flat-tailed"
@ -9841,6 +9922,7 @@ y = "straight-turn-serifed"
z = "straight-top-serifed"
long-s = "bent-hook-bottom-serifed"
eszet = "longs-s-lig-bottom-serifed"
capital-thorn = "serifed"
cyrl-ze = "unilateral-inward-serifed"
cyrl-capital-ka = "symmetric-connected-serifed"
cyrl-ka = "symmetric-connected-serifed"

View file

@ -5,7 +5,7 @@ export const ssStrings = [
["ABC.DEF.GHI.JKL.MNO.PQRS.TUV.WXYZ", "abc.def.ghi.jkl.mno.pqrs.tuv.wxyz"],
["!iIlL17|¦ ¢coO08BbDQ $5SZ2zs 96µm", "float il1[]={1-2/3.4,5+6=7/8%90};"],
["1234567890 ,._-+= >< «¯-¬_» ~–÷+×", "{*}[]()<>`+-=$/#_%^@\\&|~?'\" !,.;:"],
["E3CGQ g9q¶ äöü ſßðþ ΓΔΛαδιλμξπτχ∂", [..."ЖЗКУЭЯжзклмнруфчъыьэя ", "<=", " ", "!=", " ", "==", " ", "=>"]]
["CG6Qg9q¶ äöü Þẞðþſß ΓΔΛαδιλμξπτχ∂", [..."ЖЗКУЭЯжзклмнруфчъыьэя ", "<=", " ", "!=", " ", "==", " ", "=>"]]
];
function* makeSample(lbm, hotChars) {

View file

@ -5,7 +5,7 @@ const ssStrings = [
["ABC.DEF.GHI.JKL.MNO.PQRS.TUV.WXYZ", "abc.def.ghi.jkl.mno.pqrs.tuv.wxyz"],
["!iIlL17|¦ ¢coO08BbDQ $5SZ2zs 96µm", "float il1[]={1-2/3.4,5+6=7/8%90};"],
["1234567890 ,._-+= >< «¯-¬_» ~–÷+×", "{*}[]()<>`+-=$/#_%^@\\&|~?'\" !,.;:"],
["E3CGQ g9q¶ äöü ſßðþ ΓΔΛαδιλμξπτχ∂", [..."ЖЗКУЭЯжзклмнруфчъыьэя ", "<=", " ", "!=", " ", "==", " ", "=>"]]
["CG6Qg9q¶ äöü Þẞðþſß ΓΔΛαδιλμξπτχ∂", [..."ЖЗКУЭЯжзклмнруфчъыьэя ", "<=", " ", "!=", " ", "==", " ", "=>"]]
];
function* makeSample(theme, lbm, features, hotChars) {