diff --git a/changes/30.3.0.md b/changes/30.3.0.md index a416d6824..cb3ffaf27 100644 --- a/changes/30.3.0.md +++ b/changes/30.3.0.md @@ -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: diff --git a/packages/font-glyphs/src/letter/latin-ext/eszet.ptl b/packages/font-glyphs/src/letter/latin-ext/eszet.ptl index a33cae902..e470a0ef7 100644 --- a/packages/font-glyphs/src/letter/latin-ext/eszet.ptl +++ b/packages/font-glyphs/src/letter/latin-ext/eszet.ptl @@ -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 diff --git a/packages/font-glyphs/src/letter/latin-ext/thorn.ptl b/packages/font-glyphs/src/letter/latin-ext/thorn.ptl index 197d10738..e0ceebf73 100644 --- a/packages/font-glyphs/src/letter/latin-ext/thorn.ptl +++ b/packages/font-glyphs/src/letter/latin-ext/thorn.ptl @@ -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' diff --git a/packages/font-glyphs/src/letter/latin-ext/wynn.ptl b/packages/font-glyphs/src/letter/latin-ext/wynn.ptl index b569a30ef..4eb04976a 100644 --- a/packages/font-glyphs/src/letter/latin-ext/wynn.ptl +++ b/packages/font-glyphs/src/letter/latin-ext/wynn.ptl @@ -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 diff --git a/params/variants.toml b/params/variants.toml index 8638a49d8..acca86cd2 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -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" diff --git a/tools/generate-samples/src/templates/package-sample.mjs b/tools/generate-samples/src/templates/package-sample.mjs index 2832b5c2d..28f2c8d8a 100644 --- a/tools/generate-samples/src/templates/package-sample.mjs +++ b/tools/generate-samples/src/templates/package-sample.mjs @@ -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) { diff --git a/tools/generate-samples/src/templates/stylistic-set.mjs b/tools/generate-samples/src/templates/stylistic-set.mjs index 5f5a43462..522ade24a 100644 --- a/tools/generate-samples/src/templates/stylistic-set.mjs +++ b/tools/generate-samples/src/templates/stylistic-set.mjs @@ -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) {