From 0787efe08cff36a0417a55e4417c59de6a70f3cb Mon Sep 17 00:00:00 2001 From: be5invis Date: Thu, 15 Apr 2021 20:55:07 -0700 Subject: [PATCH] Add flat-hooked Long S and Eszet (#952). --- changes/6.0.0-preview.3.md | 3 +- font-src/glyphs/letter/latin-ext/eszet.ptl | 22 +++- font-src/glyphs/letter/latin/lower-f.ptl | 28 ++++- params/variants.toml | 124 +++++++++++++-------- 4 files changed, 122 insertions(+), 55 deletions(-) diff --git a/changes/6.0.0-preview.3.md b/changes/6.0.0-preview.3.md index 3c23e3009..de7458fae 100644 --- a/changes/6.0.0-preview.3.md +++ b/changes/6.0.0-preview.3.md @@ -7,4 +7,5 @@ * Add flat-arc parenthesis (#941). * Fixed broken shape of Motion Serifed Cyrl/Shcha (#944). * Add vertical-sides variants of `W` and `w` (#950). - * Add slant-sided `M` (#953). \ No newline at end of file + * Add slant-sided `M` (#953). + * Add flat-hooked Long S and Eszet (#952). \ No newline at end of file diff --git a/font-src/glyphs/letter/latin-ext/eszet.ptl b/font-src/glyphs/letter/latin-ext/eszet.ptl index ca44b165c..d8f37426f 100644 --- a/font-src/glyphs/letter/latin-ext/eszet.ptl +++ b/font-src/glyphs/letter/latin-ext/eszet.ptl @@ -9,6 +9,7 @@ glyph-module glyph-block Letter-Latin-Eszet : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives + glyph-block-import Letter-Shared-Shapes : FlatHookDepth glyph-block-import Letter-Latin-S : SNeck local ymiddle : [mix 0 CAP 0.5] - HalfStroke @@ -19,12 +20,21 @@ glyph-block Letter-Latin-Eszet : begin xmiddle - 1 - Stroke * TanSlope Math.max (SB + Stroke * 2) [mix SB RightSB (1 / 4)] - define [TraditionalBody slab tail] : glyph-proc + define [TraditionalBody fFlathook slab tail] : glyph-proc include : MarkSet.b local l : SB * 1 - include : dispiro + local xHook : [mix SB RightSB 0.75] + HalfStroke * HVContrast + local hd : FlatHookDepth [DivFrame 1] + if fFlathook + : then : include : dispiro + flat xHook CAP [widths.lhs] + curl (l + hd.x) CAP + archv + flat l (CAP - hd.y) + curl l 0 [heading Downward] + : else : include : dispiro widths.lhs - g4 ([mix SB RightSB 0.75] + HalfStroke * HVContrast) (CAP - Hook) + g4 xHook (CAP - Hook) hookstart (CAP - O) flat l XH curl l 0 [heading Downward] @@ -112,8 +122,10 @@ glyph-block Letter-Latin-Eszet : begin if tail : include : VerticalHook (SB + 0.5 * swOuter * HVContrast) 0 (-Hook * 1.2) Hook swOuter if slab : include : LeftwardBottomSerif SB 0 SideJut - create-glyph 'eszet.traditional' : TraditionalBody SLAB false - create-glyph 'eszet.traditionalTailed' : TraditionalBody false true + create-glyph 'eszet.traditional' : TraditionalBody false SLAB false + create-glyph 'eszet.traditionalTailed' : TraditionalBody false false true + create-glyph 'eszet.traditionalFlatHook' : TraditionalBody true SLAB false + create-glyph 'eszet.traditionalFlatHookTailed' : TraditionalBody true false true create-glyph 'eszet.sulzbacher' : SulzbacherBody SLAB false create-glyph 'eszet.sulzbacherTailed' : SulzbacherBody false true create-glyph 'eszet.longSSLig' : LongSSLigBody SLAB false diff --git a/font-src/glyphs/letter/latin/lower-f.ptl b/font-src/glyphs/letter/latin/lower-f.ptl index 8fbcd5a38..8d6670c2e 100644 --- a/font-src/glyphs/letter/latin/lower-f.ptl +++ b/font-src/glyphs/letter/latin/lower-f.ptl @@ -26,7 +26,7 @@ glyph-block Letter-Latin-Lower-F : begin if SLAB : begin include : tagged 'serifMB' : CenterBottomSerif (Middle - FBalance) 0 Jut - create-glyph 'longs.upright' : glyph-proc + create-glyph 'longs.upright.standard' : glyph-proc include : MarkSet.b local m : Middle - JBalance - HalfStroke * HVContrast local r : m + (Width * 0.5) + Stroke * HVContrast - OXHook @@ -40,7 +40,28 @@ glyph-block Letter-Latin-Lower-F : begin if SLAB : begin include : tagged 'serifLB' : CenterBottomSerif (m + HalfStroke * HVContrast + RBalance * 0.35) 0 (Jut + RBalance * 0.65) - create-derived 'longsbar.upright' : glyph-proc + create-derived 'longsbar.upright.standard' : glyph-proc + include : HOverlayBar + m + HalfStroke * HVContrast - LongJut * 0.75 + m + HalfStroke * HVContrast + LongJut * 0.75 + [mix (XH - Stroke) CAP 0.5] - HalfStroke + + create-glyph 'longs.upright.flatHook' : glyph-proc + include : MarkSet.b + local hd : FlatHookDepth [DivFrame 1] + local m : Middle - JBalance - HalfStroke * HVContrast + include : dispiro + widths.lhs + flat RightSB CAP + curl (m + hd.x) CAP + archv + flat m (CAP - hd.y) + curl m 0 [heading Downward] + set-base-anchor 'overlay' (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) + + create-derived 'longsbar.upright.flatHook' : glyph-proc include : HOverlayBar m + HalfStroke * HVContrast - LongJut * 0.75 m + HalfStroke * HVContrast + LongJut * 0.75 @@ -74,7 +95,8 @@ glyph-block Letter-Latin-Lower-F : begin Middle + LongJut * 0.75 [mix Stroke Descender 0.5] + HalfStroke - + select-variant 'longs.upright' + select-variant 'longsbar.upright' null (follow -- 'longs.upright') alias 'esh' 0x283 'longs.italic' create-glyph 'eshcurlytail' 0x286 : glyph-proc diff --git a/params/variants.toml b/params/variants.toml index eedaf6c1c..d8b448cce 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -3055,10 +3055,28 @@ selector.z = "cursiveWithHorizontalCrossBar" selector."zReduced" = "cursive" + +[prime.long-s] +sampler = "ſ" +samplerExplain = "Long-S" +tag = "cv51" + +[prime.long-s.variants.standard] +rank = 1 +description = "Long-S with standard hook" +selector."longs.upright" = "standard" + +[prime.long-s.variants.flat-hook] +rank = 2 +description = "Long-S with flat hook" +selector."longs.upright" = "flatHook" + + + [prime.eszet] sampler = "ß" samplerExplain = "Eszet" -tag = "cv51" +tag = "cv52" [prime.eszet.variants.traditional] rank = 1 @@ -3067,27 +3085,37 @@ selector.eszet = "traditional" [prime.eszet.variants.traditional-tailed] rank = 2 -description = "Traditional, Fraktur-like Eszet (`ß`)" +description = "Traditional, Fraktur-like Eszet (`ß`) with descending tail" selector.eszet = "traditionalTailed" -[prime.eszet.variants.sulzbacher] +[prime.eszet.variants.traditional-flat-hook] rank = 3 +description = "Traditional, Fraktur-like Eszet (`ß`) with flat hook" +selector.eszet = "traditionalFlatHook" + +[prime.eszet.variants.traditional-flat-hook-tailed] +rank = 4 +description = "Traditional, Fraktur-like Eszet (`ß`) with flat hook and descending tail" +selector.eszet = "traditionalFlatHookTailed" + +[prime.eszet.variants.sulzbacher] +rank = 5 description = "More modern, beta-like Eszet (`ß`)" selector.eszet = "sulzbacher" [prime.eszet.variants.sulzbacher-tailed] -rank = 4 -description = "More modern, beta-like Eszet (`ß`)" +rank = 6 +description = "More modern, beta-like Eszet (`ß`) with descending tail" selector.eszet = "sulzbacherTailed" [prime.eszet.variants.longs-s-lig] -rank = 5 +rank = 7 description = "Eszet (`ß`) shown as a ligature of long-S (`ſ`) and `s`" selector.eszet = "longSSLig" [prime.eszet.variants.longs-s-lig-tailed] -rank = 6 -description = "Eszet (`ß`) shown as a ligature of long-S (`ſ`) and `s`" +rank = 8 +description = "Eszet (`ß`) shown as a ligature of long-S (`ſ`) and `s`, with descending tail" selector.eszet = "longSSLigTailed" @@ -3096,7 +3124,7 @@ selector.eszet = "longSSLigTailed" sampler = "ΛΔ" samplerExplain = "Greek capital Lambda (`Λ`) and Greek capital Delta (`Δ`)" -tag = "cv52" +tag = "cv53" [prime.turn-v.variants.straight] rank = 1 @@ -3115,7 +3143,7 @@ selector."grek/Delta" = "curly" [prime.lower-alpha] sampler = "α" samplerExplain = "Greek lower Alpha" -tag = "cv53" +tag = "cv54" [prime.lower-alpha.variants.crossing] rank = 1 @@ -3132,7 +3160,7 @@ selector."grek/alpha" = "tailedBarred" [prime.capital-gamma] sampler = "Γ" samplerExplain = "Greek capital Gamma" -tag = "cv54" +tag = "cv55" [prime.capital-gamma.variants.standard] rank = 1 @@ -3153,7 +3181,7 @@ selector."cyrl/ghe.upright" = "motionSerifed" [prime.latn-epsilon] sampler = "ɛ" samplerExplain = "Latin small Epsilon" -tag = "cv55" +tag = "cv56" [prime.latn-epsilon.variants.serifless] rank = 1 @@ -3178,7 +3206,7 @@ selector.'latn/epsilon' = 'inwardSerifed' [prime.latn-reverse-epsilon] sampler = "ɜ" samplerExplain = "Latin reverse Epsilon and Cyrillic Ze" -tag = "cv56" +tag = "cv57" [prime.latn-reverse-epsilon.variants.serifless] rank = 1 @@ -3203,7 +3231,7 @@ selector.'cyrl/ze' = 'inwardSerifed' [prime.lower-iota] sampler = "ι" samplerExplain = "Greek lower Iota" -tag = "cv57" +tag = "cv58" [prime.lower-iota.variants.zshaped] rank = 1 @@ -3240,7 +3268,7 @@ selector."grek/iota" = "serifedFlatTailed" [prime.lower-lambda] sampler = "λ" samplerExplain = "Greek small Lambda" -tag = "cv58" +tag = "cv59" [prime.lower-lambda.variants.straight] rank = 1 @@ -3267,7 +3295,7 @@ selector."grek/lambda" = "curlyTurn" [prime.cyrl-ka] sampler = "к" samplerExplain = "Cyrillic Ka" -tag = "cv59" +tag = "cv60" [prime.cyrl-ka.variants.straight] rank = 1 @@ -3322,7 +3350,7 @@ selector."cyrl/ka" = "symmetricConnectedMotionSerifed" [prime.cyrl-capital-u] sampler = "У" samplerExplain = "Cyrillic Capital U" -tag = "cv60" +tag = "cv61" [prime.cyrl-capital-u.variants.straight] rank = 1 @@ -3426,7 +3454,7 @@ selector."cyrl/lje" = "cursive" [prime.zero] sampler = "0" -tag = "cv61" +tag = "cv62" [prime.zero.variants.unslashed] rank = 1 @@ -3482,7 +3510,7 @@ selector.zero = "longDottedOval" [prime.one] sampler = "1" -tag = "cv62" +tag = "cv63" [prime.one.variants.nobase] rank = 1 @@ -3523,7 +3551,7 @@ selector.one = "baseFlatTopSerif" [prime.two] sampler = "2" -tag = "cv63" +tag = "cv64" [prime.two.variants.straight-neck] rank = 1 @@ -3539,7 +3567,7 @@ selector.two = "curlyNeck" [prime.three] sampler = "3" -tag = "cv64" +tag = "cv65" [prime.three.variants.flattop] rank = 1 @@ -3555,7 +3583,7 @@ selector.three = "twoarcs" [prime.four] sampler = "4" -tag = "cv65" +tag = "cv66" [prime.four.variants.closed] rank = 1 @@ -3591,7 +3619,7 @@ selector.four = "openNonCrossing" [prime.five] sampler = "5" -tag = "cv66" +tag = "cv67" [prime.five.variants.vertical-upper-left-bar] rank = 1 @@ -3607,7 +3635,7 @@ selector.five = "obliqueUpperLeftBar" [prime.six] sampler = "6" -tag = "cv67" +tag = "cv68" [prime.six.variants.closed-contour] rank = 1 @@ -3628,7 +3656,7 @@ selector.six = "straightBar" [prime.seven] sampler = "7" -tag = "cv68" +tag = "cv69" [prime.seven.variants.straight-serifless] rank = 1 @@ -3694,7 +3722,7 @@ selector.seven = "curlyCrossbarSerifed" [prime.eight] sampler = "8" -tag = "cv69" +tag = "cv70" [prime.eight.variants.crossing] rank = 1 @@ -3715,7 +3743,7 @@ selector.eight = "crossingAsymmetric" [prime.nine] sampler = "9" -tag = "cv70" +tag = "cv71" [prime.nine.variants.closed-contour] rank = 1 @@ -3736,7 +3764,7 @@ selector.nine = "straightBar" [prime.tilde] sampler = "~" -tag = "cv71" +tag = "cv72" [prime.tilde.variants.high] rank = 1 @@ -3752,7 +3780,7 @@ selector.asciiTilde = "low" [prime.asterisk] sampler = "*" -tag = "cv72" +tag = "cv73" [prime.asterisk.variants.high] rank = 1 @@ -3794,7 +3822,7 @@ selector."asterisk/lowered" = "turnPentaLow" [prime.underscore] sampler = "_" -tag = "cv73" +tag = "cv74" [prime.underscore.variants.above-baseline] rank = 1 @@ -3815,7 +3843,7 @@ selector.underscore = "low" [prime.paragraph-sign] sampler = "¶" -tag = "cv74" +tag = "cv75" [prime.paragraph-sign.variants.high] rank = 1 @@ -3833,7 +3861,7 @@ selector.revertParagraph = "low" [prime.caret] sampler = "^" -tag = "cv75" +tag = "cv76" [prime.caret.variants.high] rank = 1 @@ -3854,7 +3882,7 @@ selector.asciiCaret = "low" [prime.paren] sampler = "( )" -tag = "cv76" +tag = "cv77" [prime.paren.variants.normal] rank = 1 @@ -3878,7 +3906,7 @@ selector.parenRight = "flatArc" [prime.brace] sampler = "{ }" -tag = "cv77" +tag = "cv78" [prime.brace.variants.straight] rank = 1 @@ -3896,7 +3924,7 @@ selector.braceRight = "curly" [prime.number-sign] sampler = "#" -tag = "cv78" +tag = "cv79" [prime.number-sign.variants.upright] rank = 1 @@ -3922,7 +3950,7 @@ selector.numberSign = "slantedOpen" [prime.ampersand] sampler = "&" -tag = "cv79" +tag = "cv80" [prime.ampersand.variants.closed] rank = 1 @@ -3963,7 +3991,7 @@ selector.ampersand = "flatTop" [prime.at] sampler = "@" -tag = "cv80" +tag = "cv81" [prime.at.variants.threefold] rank = 1 @@ -3984,7 +4012,7 @@ selector.at = "short" [prime.dollar] sampler = "$" -tag = "cv81" +tag = "cv82" [prime.dollar.variants.open] rank = 1 @@ -4020,7 +4048,7 @@ selector.dollar = "interruptedCap" [prime.cent] sampler = "¢" -tag = "cv82" +tag = "cv83" [prime.cent.variants.open] rank = 1 @@ -4041,7 +4069,7 @@ selector.cent = "barInterrupted" [prime.percent] sampler = "%" -tag = "cv83" +tag = "cv84" [prime.percent.variants.dots] rank = 1 @@ -4075,7 +4103,7 @@ selector."permille.WWID" = "ringsContinuousSlashAlsoConnected" [prime.bar] sampler = "|" -tag = "cv84" +tag = "cv85" slopeDependent = true [prime.bar.variants.natural-slope] @@ -4092,7 +4120,7 @@ selector."bar.italic" = "forceUpright" [prime.lig-ltgteq] sampler = "<= >=" -tag = "cv85" +tag = "cv86" [prime.lig-ltgteq.variants.flat] rank = 1 @@ -4110,7 +4138,7 @@ selector."eq.at-gteq.lig2" = "slanted" [prime.ascii-single-quote] sampler = "'" -tag = "cv86" +tag = "cv87" [prime.ascii-single-quote.variants.straight] rank = 1 @@ -4126,7 +4154,7 @@ selector.asciiSingleQuote = "raisedComma" [prime.ascii-grave] sampler = "`" -tag = "cv87" +tag = "cv88" [prime.ascii-grave.variants.straight] rank = 1 @@ -4147,7 +4175,7 @@ selector.asciiGrave = "raisedTurnComma" [prime.question] sampler = "?" -tag = "cv88" +tag = "cv89" [prime.question.variants.smooth] rank = 1 @@ -4218,6 +4246,7 @@ w = "straight" x = "straight-serifless" z = "straight-serifless" # Non-latin +long-s = "standard" turn-v = "straight" lower-alpha = "crossing" capital-gamma = "standard" @@ -4436,6 +4465,7 @@ description = "Consolas Style" [composite.ss03.design] capital-g = "toothless-corner-serifless-hooked" capital-k = "symmetric-touching" +capital-m = "slanted-sides-hanging" a = "double-storey" d = "toothed-serifless" g = "double-storey" @@ -4526,6 +4556,7 @@ description = "Fira Mono Style" [composite.ss05.design] capital-g = "toothless-corner-serifless-hooked" capital-k = "symmetric-touching" +capital-m = "slanted-sides-hanging" a = "double-storey-tailed" e = "flat-crossbar" f = "serifless" @@ -4891,6 +4922,7 @@ l = "serifed-flat-tailed" u = "toothless-rounded" w = "straight-flat-top" y = "straight" +long-s = "flat-hook" lower-alpha = "tailed-barred" cyrl-ka = "symmetric-connected" cyrl-capital-u = "straight" @@ -4936,7 +4968,7 @@ r = "compact-serifed" t = "flat-hook" u = "toothed" y = "straight-turn" -eszet = "traditional" +eszet = "traditional-flat-hook" lower-lambda = "straight-turn" cyrl-capital-u = "straight-turn" zero = "dotted"