From 10f25961159c4bdd28eb76577cbca4568b6e1c23 Mon Sep 17 00:00:00 2001 From: be5invis Date: Sat, 14 Nov 2020 23:46:02 -0800 Subject: [PATCH] =?UTF-8?q?Reorder=20and=20reorganize=20character=20varian?= =?UTF-8?q?ts=20of=20`i`,=20`l`,=20and=20`f`,=20including:=20=20=20=20*=20?= =?UTF-8?q?The=20=E2=80=9Citalic=E2=80=9D=20variants=20are=20removed,=20or?= =?UTF-8?q?=20renamed=20to=20reflect=20its=20shape;=20=20=20=20*=20Reorder?= =?UTF-8?q?=20variants=20of=20`i`=20and=20`l`=20to=20let=20them=20get=20sy?= =?UTF-8?q?nchronized;=20=20=20=20*=20Make=20`f`'s=20variant=20more=20matr?= =?UTF-8?q?ix-like.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 60 +++-- build-plans.toml | 30 +-- changes/4.0.0-beta.2.md | 4 + font-src/glyphs/common/shapes.ptl | 12 +- font-src/glyphs/letter/latin.ptl | 422 ++++++++++++++++++------------ font-src/kits/spiro-kit.ptl | 2 + font-src/meta/aesthetics.ptl | 1 + font-src/meta/macros.ptl | 2 +- params/variants.toml | 276 +++++++++++-------- 9 files changed, 475 insertions(+), 334 deletions(-) diff --git a/README.md b/README.md index c86e47b31..916238d8b 100644 --- a/README.md +++ b/README.md @@ -488,18 +488,22 @@ Subsection `variants` is used to configure character variants in the font. Prope + `d = 'toothless-rounded'`, `cv14 = 3`: `d` without bottom-right tooth, with a rounded transition. + `d = 'tailed'`, `cv14 = 4`: `d` with a slightly tail bottom-right tail (default for Italic). - Styles for `f`: - + `f = 'straight'`, `cv15 = 1`: `f` without bottom hook (default for Sans Upright). - + `f = 'tailed'`, `cv15 = 2`: `f` with a leftward bottom hook (default for Italic). - + `f = 'serifed'`, `cv15 = 3`: `f` with bottom serif (default for Slab Upright). - + `f = 'straight-tailed'`, `cv15 = 4`: `f` with straight tail. - + `f = 'flat-hook'`, `cv15 = 5`: `f` with flat hook. - + `f = 'flat-hook-crossbar-at-x-height'`, `cv15 = 6`: `f` with flat hook and crossbar placed right at X-height. - + `f = 'flat-hook-serifed'`, `cv15 = 7`: `f` with flat hook and bottom serif. - + `f = 'flat-hook-serifed-crossbar-at-x-height'`, `cv15 = 8`: `f` with flat hook, bottom serif, and crossbar placed right at X-height. - + `f = 'flat-hook-round-tailed'`, `cv15 = 9`: `f` with flat hook. - + `f = 'flat-hook-round-tailed-crossbar-at-x-height'`, `cv15 = 10`: `f` with flat hook and crossbar placed right at X-height. - + `f = 'flat-hook-flat-tailed'`, `cv15 = 11`: `f` with flat hook and bottom serif. - + `f = 'flat-hook-flat-tailed-crossbar-at-x-height'`, `cv15 = 12`: `f` with flat hook, bottom serif, and crossbar placed right at X-height. + + `f = 'serifless'`, `cv15 = 1`: `f` without bottom serif, hook or exension (default for Sans Upright). + + `f = 'serifed'`, `cv15 = 2`: `f` with bottom serif (default for Slab Upright). + + `f = 'tailed'`, `cv15 = 3`: `f` with bottom hook. + + `f = 'extended'`, `cv15 = 4`: `f` with bar extended to descender. + + `f = 'serifless-crossbar-at-x-height'`, `cv15 = 5`: `f` without bottom serif, hook or exension; crossbar is placed right at X-height. + + `f = 'serifed-crossbar-at-x-height'`, `cv15 = 6`: `f` with bottom serif; crossbar is placed right at X-height. + + `f = 'tailed-crossbar-at-x-height'`, `cv15 = 7`: `f` with bottom hook; crossbar is placed right at X-height. + + `f = 'extended-crossbar-at-x-height'`, `cv15 = 8`: `f` with bar extended to descender; crossbar is placed right at X-height. + + `f = 'flat-hook'`, `cv15 = 9`: `f` with flat top hook, without bottom serif, hook or exension. + + `f = 'flat-hook-serifed'`, `cv15 = 10`: `f` with flat top hook and bottom serif. + + `f = 'flat-hook-tailed'`, `cv15 = 11`: `f` with flat top hook and bottom hook (default for Italic). + + `f = 'flat-hook-extended'`, `cv15 = 12`: `f` with flat top hook and bar extended to descender. + + `f = 'flat-hook-crossbar-at-x-height'`, `cv15 = 13`: `f` with flat top hook, without bottom serif, hook or exension; crossbar is placed right at X-height. + + `f = 'flat-hook-serifed-crossbar-at-x-height'`, `cv15 = 14`: `f` with flat top hook, bottom serif; crossbar is placed right at X-height. + + `f = 'flat-hook-tailed-crossbar-at-x-height'`, `cv15 = 15`: `f` with flat top hook, bottom hook; crossbar is placed right at X-height. + + `f = 'flat-hook-extended-crossbar-at-x-height'`, `cv15 = 16`: `f` with flat top hook, bar extended to descender; crossbar is placed right at X-height. - Styles for `g`: + `g = 'singlestorey'`, `cv16 = 1`: Single-storey `g` (default). + `g = 'doublestorey'`, `cv16 = 2`: Double-storey `g`. @@ -513,13 +517,15 @@ Subsection `variants` is used to configure character variants in the font. Prope + `h = 'motion-serifed-tailed'`, `cv17 = 4`: `h` with curly tailed ending. - Styles for `i`: + `i = 'serifed'`, `cv18 = 1`: Serifed `i` (default for Upright). - + `i = 'italic'`, `cv18 = 2`: Italic `i` (default for Italic). + + `i = 'serifless'`, `cv18 = 2`: `i` like a straight line. + `i = 'hooky'`, `cv18 = 3`: Hooky `i`. - + `i = 'serifless'`, `cv18 = 4`: `i` like a straight line. - + `i = 'zshaped'`, `cv18 = 5`: Z-shaped `i`. - + `i = 'tailed'`, `cv18 = 6`: Tailed `i`. - + `i = 'hookybottom'`, `cv18 = 7`: `i` with a straight tail. - + `i = 'serifed-asymmetric'`, `cv18 = 8`: `i` with shorter top serif and full bottom serif. + + `i = 'zshaped'`, `cv18 = 4`: Z-shaped `i`. + + `i = 'hooky-bottom'`, `cv18 = 5`: `i` with a straight tail. + + `i = 'serifed-asymmetric'`, `cv18 = 6`: `i` with shorter top serif and full bottom serif. + + `i = 'tailed'`, `cv18 = 7`: `i` with curly tail. + + `i = 'serifed-tailed'`, `cv18 = 8`: `i` with curly tail and top serif (default for Italic). + + `i = 'flat-tailed'`, `cv18 = 9`: `i` with top serif and a curly-then-flat tail. + + `i = 'serifed-flat-tailed'`, `cv18 = 10`: `i` with top serif and a curly-then-flat tail. - Styles for `j`: + `j = 'serifed'`, `cv19 = 1`: `j` with top serif (default). + `j = 'serifless'`, `cv19 = 2`: `j` without serif. @@ -531,14 +537,16 @@ Subsection `variants` is used to configure character variants in the font. Prope + `k = 'curly'`, `cv20 = 2`: Slightly curly `k`, like Iosevka 2.x. + `k = 'cursive'`, `cv20 = 3`: `k` with a cursive loop (default for Italic). - Styles for `l`: - + `l = 'hooky'`, `cv21 = 1`: Hooky `l`. - + `l = 'zshaped'`, `cv21 = 2`: Z-shaped `l`. - + `l = 'serifed'`, `cv21 = 3`: Serifed `l` (default for Upright). - + `l = 'italic'`, `cv21 = 4`: Italic, cursive `l` (default for Italic). - + `l = 'serifless'`, `cv21 = 5`: `l` like a straight line. - + `l = 'tailed'`, `cv21 = 6`: `l` with a curved tail. - + `l = 'hookybottom'`, `cv21 = 7`: `l` with a straight tail. - + `l = 'serifed-asymmetric'`, `cv21 = 8`: `l` with shorter top serif and full bottom serif. + + `l = 'serifed'`, `cv21 = 1`: Serifed `l` (default for Upright). + + `l = 'serifless'`, `cv21 = 2`: `l` like a straight line. + + `l = 'hooky'`, `cv21 = 3`: Hooky `l`. + + `l = 'zshaped'`, `cv21 = 4`: Z-shaped `l`. + + `l = 'hooky-bottom'`, `cv21 = 5`: `l` with a straight tail. + + `l = 'serifed-asymmetric'`, `cv21 = 6`: `l` with shorter top serif and full bottom serif. + + `l = 'tailed'`, `cv21 = 7`: `l` with curly tail. + + `l = 'serifed-tailed'`, `cv21 = 8`: `l` with top serif and curly tail (default for Italic). + + `l = 'flat-tailed'`, `cv21 = 9`: `l` with top serif and a curly-then-flat tail. + + `l = 'serifed-flat-tailed'`, `cv21 = 10`: `l` with top serif and a curly-then-flat tail. - Styles for `m`: + `m = 'normal'`, `cv22 = 1`: `m` with normal middle leg, touching the baseline (default). + `m = 'shortleg'`, `cv22 = 2`: `m` with shorter middle leg, like Ubuntu Mono. diff --git a/build-plans.toml b/build-plans.toml index ebd036845..d71c412fa 100644 --- a/build-plans.toml +++ b/build-plans.toml @@ -482,9 +482,9 @@ l = 'serifed' f = 'flat-hook' [buildPlans.iosevka-aile.derivingVariants.mathtt.italic] -i = 'italic' -l = 'italic' -f = 'flat-hook-flat-tailed' +i = 'serifed-tailed' +l = 'serifed-tailed' +f = 'flat-hook-tailed' [buildPlans.iosevka-aile.variants.design] at = 'fourfold' @@ -521,18 +521,6 @@ quasiProportionalDiversity = 1 at = 'fourfold' j = 'serifed' -[buildPlans.iosevka-etoile.variants.upright] -i = 'serifed' -l = 'serifed' - -[buildPlans.iosevka-etoile.variants.oblique] -i = 'serifed' -l = 'serifed' - -[buildPlans.iosevka-etoile.variants.italic] -i = 'italic' -l = 'italic' - [buildPlans.iosevka-etoile.widths.normal] shape = 576 menu = 5 @@ -565,9 +553,9 @@ f = 'serifed' r = 'serifed' [buildPlans.iosevka-sparkle.variants.italic] -i = 'italic' -l = 'italic' -f = 'tailed' +i = 'serifed-tailed' +l = 'serifed-tailed' +f = 'flat-hook-tailed' r = 'top-serifed' [buildPlans.iosevka-sparkle.derivingVariants.mathtt.design] @@ -587,9 +575,9 @@ f = 'serifed' r = 'serifed' [buildPlans.iosevka-sparkle.derivingVariants.mathtt.italic] -i = 'italic' -l = 'italic' -f = 'tailed' +i = 'serifed-tailed' +l = 'serifed-tailed' +f = 'flat-hook-tailed' r = 'top-serifed' [buildPlans.iosevka-sparkle.widths.normal] diff --git a/changes/4.0.0-beta.2.md b/changes/4.0.0-beta.2.md index 1d71efd10..808c3be87 100644 --- a/changes/4.0.0-beta.2.md +++ b/changes/4.0.0-beta.2.md @@ -1,3 +1,7 @@ + * [**Breaking**] Reorder and reorganize character variants of `i`, `l`, and `f`, including: + * The “italic” variants are removed, or renamed to reflect its shape; + * Reorder variants of `i` and `l` to let them get synchronized; + * Make `f`'s variant more matrix-like. * Fix inconsistent italic serif of U+0463 CYRILLIC SMALL LETTER YAT (#729). * Fix dotless form of mathematical derived letters if it ia aliased (#731). * Fix inconsistent serif on Bulgarian U+044E CYRILLIC SMALL LETTER YU (#732). diff --git a/font-src/glyphs/common/shapes.ptl b/font-src/glyphs/common/shapes.ptl index 3fdb7958e..b9134015c 100644 --- a/font-src/glyphs/common/shapes.ptl +++ b/font-src/glyphs/common/shapes.ptl @@ -426,6 +426,16 @@ glyph-block CommonShapes : begin widths.center [fallback s OverlayStroke] flat xleft y curl xright y + define [HCrossBar xl xr y s] : dispiro + widths.center [fallback s OverlayStroke] + flat xl y + curl xr y + set HCrossBar.top : lambda [xl xr y _s] : begin + local s : fallback _s Stroke + return : HCrossBar (xl - 0 * s * TanSlope) (xr - 0 * s * TanSlope) (y - 0.5 * s) s + set HCrossBar.bottom : lambda [xl xr y _s] : begin + local s : fallback _s Stroke + return : HCrossBar (xl + 0 * s * TanSlope) (xr + 0 * s * TanSlope) (y + 0.5 * s) s define [VBar x ydown yup _fine] : glyph-proc local fine : fallback _fine Stroke include : dispiro @@ -678,4 +688,4 @@ glyph-block CommonShapes : begin corner [mix x1 x2 (-k)] [mix y1 y2 (-k)] corner [mix x1 x2 (1+k)] [mix y1 y2 (1+k)] - glyph-block-export Rect SquareAt Ring RingAt DotAt RingStroke RingStrokeAt DotStrokeAt CircleRing CircleRingAt CircleDotAt OShape OShapeOutline OBarLeftShape OBarRightShape LeftwardTopSerif LeftwardBottomSerif RightwardTopSerif RightwardBottomSerif CenterTopSerif CenterBottomSerif DownwardRightSerif UpwardRightSerif DownwardLeftSerif UpwardLeftSerif AIVSerifs AIHSerifs AINSerifs AICyrISerifs AIMSerifs HBar HBarTop HBarBottom HOverlayBar VBar VBarLeft VBarRight VerticalHook LegShape LeftHook HooktopLeftBar FlatSlashShape hookstart hookend CyrDescender CyrLeftDescender FlipAround ScaleAround Realign ForceUpright DiagCor CreateWaveShape NameUni PointingTo WithAIHSerifsMask WithTransform ReverseContours clear-anchors OBarLeftToothlessShape OBarLeftRoundedShape OBarRightToothlessShape OBarRightRoundedShape AsRadical ExtLineCenter DiagCorDs + glyph-block-export Rect SquareAt Ring RingAt DotAt RingStroke RingStrokeAt DotStrokeAt CircleRing CircleRingAt CircleDotAt OShape OShapeOutline OBarLeftShape OBarRightShape LeftwardTopSerif LeftwardBottomSerif RightwardTopSerif RightwardBottomSerif CenterTopSerif CenterBottomSerif DownwardRightSerif UpwardRightSerif DownwardLeftSerif UpwardLeftSerif AIVSerifs AIHSerifs AINSerifs AICyrISerifs AIMSerifs HBar HBarTop HBarBottom HOverlayBar VBar VBarLeft VBarRight VerticalHook LegShape LeftHook HooktopLeftBar FlatSlashShape hookstart hookend CyrDescender CyrLeftDescender FlipAround ScaleAround Realign ForceUpright DiagCor CreateWaveShape NameUni PointingTo WithAIHSerifsMask WithTransform ReverseContours clear-anchors OBarLeftToothlessShape OBarLeftRoundedShape OBarRightToothlessShape OBarRightRoundedShape AsRadical ExtLineCenter DiagCorDs HCrossBar diff --git a/font-src/glyphs/letter/latin.ptl b/font-src/glyphs/letter/latin.ptl index 7ad2f352d..5e9986dfd 100644 --- a/font-src/glyphs/letter/latin.ptl +++ b/font-src/glyphs/letter/latin.ptl @@ -151,6 +151,12 @@ glyph-block Letter-Shared-Shapes : begin glyph-proc include : spiro-outline : nShoulderKnots.apply null [a.concat { (fMask -- true) }] + glyph-block-export FlatHookDepth + define [FlatHookDepth df] : object + x : FlatHookDepthImpl [Math.min 1 : Math.sqrt df.div] HVContrast + y : FlatHookDepthImpl [Math.min 1 : Math.sqrt df.div] 1 + define [FlatHookDepthImpl sHook sStroke] : begin + return : Math.max (sHook * Hook) (sStroke * Stroke * 1.375) : Math.min (sHook * Hook) (sStroke * Stroke * 1.75) glyph-block Letter-Latin-Upper-I : begin glyph-block-import CommonShapes @@ -210,27 +216,69 @@ glyph-block Letter-Latin-Lower-I : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives glyph-block-import Letter-Shared : CreateDottedComposition - glyph-block-export IotaShape TailedIShape + glyph-block-import Letter-Shared-Shapes : FlatHookDepth ### dotless i, i and iota - define [IotaShape top] : glyph-proc + glyph-block-export IotaShape + define [IotaShape] : params [top [addTopSerif false]] : glyph-proc local df : DivFrame para.diversityI local middle df.middle + local hd : FlatHookDepth df set-base-anchor 'above' middle top - include : tagged 'serifLT' : LeftwardTopSerif middle top (LongJut * df.div) + if addTopSerif : include : tagged 'serifLT' + LeftwardTopSerif middle top (LongJut * df.div) include : dispiro widths.center flat middle top [heading Downward] - curl middle Hook + curl middle hd.y + arcvh.superness DesignParameters.tightHookSuperness + flat (middle + hd.x - HalfStroke * HVContrast) HalfStroke + curl (middle + [Math.max (hd.x - HalfStroke * HVContrast + 1) (LongJut * 1.05 * df.div)] + HalfStroke * TanSlope) HalfStroke + + glyph-block-export ItalicDotlessIShape + define [ItalicDotlessIShape] : params [df top [addTopSerif false] [setMarks true]] : glyph-proc + local shift : (1 - df.div) * 0.2 + local left : [mix SB df.rightSB ([StrokeWidthBlend 0.42 0.46] - shift)] - HalfStroke * HVContrast + local right : mix SB df.rightSB (1.1 - shift) + local rightTerm : Math.max right (left + HookX + Stroke) + local middle : mix left right (0.55 * df.div) + include : dispiro + widths.lhs + flat left top [heading Downward] + curl left (SmallSmoothB * 0.8) + hookend O + g4 rightTerm (Hook * [StrokeWidthBlend 0.85 1] * df.div) + if addTopSerif : include : dispiro + flat (left - (LongJut * df.div) + HalfStroke * HVContrast) top [widths 0 Stroke] + curl left top + if setMarks : begin + set-base-anchor 'above' (left + HalfStroke * HVContrast + [StrokeWidthBlend 0.25 0] * TanSlope * df.width) top + set-base-anchor 'below' middle 0 + + glyph-block-export TailedDotlessShape + define [TailedDotlessShape] : params [df top [xMiddle (df.middle - LBalance2)] [setMarks true] [hookScale 1] [addTopSerif false]] : glyph-proc + local x0 : mix HalfStroke (HalfStroke + (Hook - Stroke + 1) * 0.85 * df.div + LBalance2) hookScale + local x1 : mix HalfStroke ([Math.max (Hook - HalfStroke + 1) (LongJut * df.div)] + LBalance2) hookScale + include : dispiro + widths.center + flat xMiddle top [heading Downward] + curl xMiddle [mix Stroke Hook hookScale] arcvh - flat (middle + Hook - HalfStroke) HalfStroke - curl (middle + [Math.max HookX (LongJut * 1.05 * df.div)]) HalfStroke [heading Rightward] + g4.right.mid (xMiddle + x0) (HalfStroke + O) [heading Rightward] + g4 (xMiddle + x1) (HalfStroke + (1 - 2 * hookScale) * O) [heading Rightward] + if setMarks : begin + set-base-anchor 'above' xMiddle top + set-base-anchor 'below' xMiddle 0 + set-base-anchor 'overlay' xMiddle (top * OverlayPos) + set-base-anchor 'topright' (xMiddle + RightSB - Middle) top + if addTopSerif : begin + include : tagged 'serifLT' : LeftwardTopSerif xMiddle top (LongJut * df.div) create-glyph 'grek/iota' 0x3B9 : glyph-proc local df : DivFrame para.diversityI set-width df.width include : df.markSet.e - include : IotaShape XH + include : IotaShape XH (addTopSerif -- true) alias 'latiniota' 0x269 'grek/iota' @@ -238,7 +286,7 @@ glyph-block Letter-Latin-Lower-I : begin local df : DivFrame para.diversityI set-width df.width include : df.markSet.capital - include : IotaShape CAP + include : IotaShape CAP (addTopSerif -- true) create-glyph 'dotlessi.straight' : glyph-proc local df : DivFrame para.diversityI @@ -290,54 +338,39 @@ glyph-block Letter-Latin-Lower-I : begin include : RightwardBottomSerif df.middle 0 (LongJut * df.div) include : LeftwardBottomSerif df.middle 0 (LongJut * df.div) - create-glyph 'dotlessi.italic' : glyph-proc + create-glyph 'dotlessi.tailed' : glyph-proc local df : DivFrame para.diversityI set-width df.width include : df.markSet.e if para.isItalic : then : begin - local shift : (1 - df.div) * 0.2 - local left : [mix SB df.rightSB ([StrokeWidthBlend 0.42 0.46] - shift)] - HalfStroke * HVContrast - local right : mix SB df.rightSB (1.1 - shift) - local rightTerm : Math.max right (left + HookX + Stroke) - local middle : mix left right (0.55 * df.div) - include : dispiro - widths.lhs - flat left XH [heading Downward] - curl left (SmallSmoothB * 0.8) - hookend O - g4 rightTerm (Hook * [StrokeWidthBlend 0.85 1] * df.div) - include : dispiro - flat (left - (LongJut * df.div) + HalfStroke * HVContrast) XH [widths 0 Stroke] - curl left XH - set-base-anchor 'above' (left + HalfStroke * HVContrast + [StrokeWidthBlend 0.25 0] * TanSlope * df.width) XH - set-base-anchor 'below' middle 0 + include : ItalicDotlessIShape df XH (setMarks -- true) (addTopSerif -- false) : else : begin - include : IotaShape XH + include : TailedDotlessShape df XH (addTopSerif -- false) - define [TailedIShape] : params [df top [xMiddle (df.middle - LBalance2)] [setMarks true] [hookScale 1]] : glyph-proc - local x0 : mix HalfStroke (HalfStroke + (Hook - Stroke + 1) * 0.85 * df.div + LBalance2) hookScale - local x1 : mix HalfStroke ([Math.max (Hook - HalfStroke + 1) (LongJut * df.div)] + LBalance2) hookScale - include : dispiro - widths.center - flat xMiddle top [heading Downward] - curl xMiddle [mix Stroke Hook hookScale] - arcvh - g4.right.mid (xMiddle + x0) (HalfStroke + O) [heading Rightward] - g4 (xMiddle + x1) (HalfStroke + (1 - 2 * hookScale) * O) [heading Rightward] - if setMarks : begin - set-base-anchor 'above' xMiddle top - set-base-anchor 'below' xMiddle 0 - set-base-anchor 'overlay' xMiddle (top * OverlayPos) - set-base-anchor 'topright' (xMiddle + RightSB - Middle) top - - create-glyph 'dotlessi.tailed' : glyph-proc + create-glyph 'dotlessi.serifedTailed' : glyph-proc local df : DivFrame para.diversityI set-width df.width include : df.markSet.e - include : TailedIShape df XH + if para.isItalic + : then : begin + include : ItalicDotlessIShape df XH (setMarks -- true) (addTopSerif -- true) + : else : begin + include : TailedDotlessShape df XH (addTopSerif -- true) - create-glyph 'dotlessi.hookybottom' : glyph-proc + create-glyph 'dotlessi.flatTailed' : glyph-proc + local df : DivFrame para.diversityI + set-width df.width + include : df.markSet.e + include : IotaShape XH (addTopSerif -- false) + + create-glyph 'dotlessi.serifedFlatTailed' : glyph-proc + local df : DivFrame para.diversityI + set-width df.width + include : df.markSet.e + include : IotaShape XH (addTopSerif -- true) + + create-glyph 'dotlessi.hookyBottom' : glyph-proc local df : DivFrame para.diversityI set-width df.width include : df.markSet.e @@ -514,7 +547,7 @@ glyph-block Letter-Latin-Lower-J : begin widths.lhs flat [Math.min terminal (bar - tTurn - [Math.max (Stroke / 3) (df.width / 6)])] Descender curl (bar - tTurn) Descender - archv + archv.superness DesignParameters.tightHookSuperness flat bar (Descender + tTurn) curl bar XH [heading Upward] set-base-anchor 'above' barCenter XH @@ -653,7 +686,7 @@ glyph-block Letter-Latin-Lower-L : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives glyph-block-import Marks : markMiddle aboveMarkBot aboveMarkTop - glyph-block-import Letter-Latin-Lower-I : IotaShape TailedIShape + glyph-block-import Letter-Latin-Lower-I : IotaShape TailedDotlessShape ItalicDotlessIShape glyph-block-import Letter-Shared : CreateCommaCaronComposition glyph-block-import Letter-Shared-Shapes : CurlyTail @@ -711,33 +744,37 @@ glyph-block Letter-Latin-Lower-L : begin set-base-anchor 'overlay' (df.middle + balance / 2) (CAP * OverlayPos) set-base-anchor 'topright' (df.middle + RightSB - Middle) CAP - create-glyph 'l.italic' : glyph-proc + create-glyph 'l.tailed' : glyph-proc local df : DivFrame para.diversityI set-width df.width include : df.markSet.b if para.isItalic : then : begin - local shift : (1 - df.div) * 0.4 - local left : mix SB df.rightSB (0.3 - shift) - local right : mix SB df.rightSB (1.1 - shift) - local rightTerm : Math.max right (left + HookX + Stroke) - local middle : mix left right (0.54 * df.div) - include : dispiro - widths.lhs - flat left CAP [heading Downward] - curl left (SmallSmoothB * 0.85) - hookend O - g4 rightTerm (Hook * [StrokeWidthBlend 0.85 1] * df.div) - include : tagged 'serifLT': dispiro - flat (left - (LongJut * df.div) + HalfStroke * HVContrast) CAP [widths 0 Stroke] - curl left CAP - set-base-anchor 'above' (left + HalfStroke) CAP - set-base-anchor 'below' middle 0 - set-base-anchor 'overlay' (left + HalfStroke) (CAP * OverlayPos) - set-base-anchor 'topright' (left + HalfStroke + RightSB - Middle) CAP + include : ItalicDotlessIShape df CAP (addTopSerif -- false) : else : begin - include : IotaShape CAP - set-base-anchor 'topright' (df.middle + RightSB - Middle) CAP + include : TailedDotlessShape df CAP (addTopSerif -- false) + + create-glyph 'l.serifedTailed' : glyph-proc + local df : DivFrame para.diversityI + set-width df.width + include : df.markSet.b + if para.isItalic + : then : begin + include : ItalicDotlessIShape df CAP (addTopSerif -- true) + : else : begin + include : TailedDotlessShape df CAP (addTopSerif -- true) + + create-glyph 'l.flatTailed' : glyph-proc + local df : DivFrame para.diversityI + set-width df.width + include : df.markSet.b + include : IotaShape CAP (addTopSerif -- false) + + create-glyph 'l.serifedFlatTailed' : glyph-proc + local df : DivFrame para.diversityI + set-width df.width + include : df.markSet.b + include : IotaShape CAP (addTopSerif -- true) create-glyph 'l.phoneticLeft' : glyph-proc local df : DivFrame 1 @@ -753,13 +790,7 @@ glyph-block Letter-Latin-Lower-L : begin curl [Math.max RightSB (middle + [Math.max HookX (LongJut * 1.05 * df.div)])] HalfStroke [heading Rightward] set-base-anchor 'topright' (df.middle + RightSB - Middle) CAP - create-glyph 'l.tailed' : glyph-proc - local df : DivFrame para.diversityI - set-width df.width - include : df.markSet.b - include : TailedIShape df CAP - - create-glyph 'l.hookybottom' : glyph-proc + create-glyph 'l.hookyBottom' : glyph-proc local df : DivFrame para.diversityI set-width df.width include : df.markSet.b @@ -794,11 +825,13 @@ glyph-block Letter-Latin-Lower-L : begin list 'hooky' 0 list 'zshaped' Stroke list 'serifed' Stroke - list 'italic' Stroke + list 'serifedTailed' Stroke list 'serifless' 0 list 'tailed' Stroke - list 'hookybottom' Stroke + list 'hookyBottom' Stroke list 'serifedAsymmetric' Stroke + list 'flatTailed' Stroke + list 'serifedFlatTailed' Stroke foreach {suffix y0} [items-of LDotOptions] : if [query-glyph ('l.' + suffix)] create-glyph ('ldot.' + suffix) : glyph-proc @@ -2396,15 +2429,15 @@ glyph-block Letter-Latin-K : begin define [BashkirKaShape top straightBar] : glyph-proc local left : if SLAB ([mix SB RightSB 0.35] - MVertStroke / 2 * HVContrast) [mix SB RightSB 0.2] local leftNB : left - [KBalance straightBar] - local barleft : mix 0 SB [if SLAB 0.25 0.375] + local barLeft : mix 0 SB [if SLAB 0.25 0.375] local sw : AdviceStroke 3 - include : HBarTop barleft (Stroke * 0.1 + left) top + include : HBarTop barLeft (Stroke * 0.1 + left) top include : VBarLeft left 0 top sw include : KLegShape leftNB RightSB top straightBar sw if SLAB : begin include : CenterBottomSerif (left + HalfStroke * HVContrast) 0 Jut - include : DownwardLeftSerif barleft top VJut (MVertStroke / HVContrast) + include : DownwardLeftSerif barLeft top VJut (MVertStroke / HVContrast) create-glyph 'cyrl/BashkirUpperKa.straight' : glyph-proc include : MarkSet.capital @@ -4233,7 +4266,6 @@ glyph-block Letter-Latin-Lower-Q : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives glyph-block-import Marks : markHalfStroke - glyph-block-import Letter-Latin-Lower-I : TailedIShape glyph-block-import Letter-Shared-Shapes : RightwardTailedBar DToothlessRise DMBlend create-glyph 'q.straight' : glyph-proc @@ -5736,7 +5768,7 @@ glyph-block Letter-Latin-Upper-F : begin glyph-block Letter-Latin-Lower-F : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives - glyph-block-import Letter-Shared-Shapes : CurlyTail + glyph-block-import Letter-Shared-Shapes : CurlyTail FlatHookDepth define fovershoot : fallback para.fovershoot (O * 6) @@ -5778,10 +5810,12 @@ glyph-block Letter-Latin-Lower-F : begin local w [fallback fine Stroke] include : dispiro widths.center w - straight.right.start (Middle - hookx) (bottom + w / 2 + fovershoot) + flat (Middle - hookx) (bottom + w / 2 + fovershoot) + curl (Middle - [Math.min hooky (hookx - 0.1)]) (bottom + w / 2 + fovershoot) flat Middle (bottom + hooky) curl Middle (top - hooky) - straight.right.end (Middle + hookx) (top - w / 2 - fovershoot) + flat (Middle + [Math.min hooky (hookx - 0.1)]) (top - w / 2 - fovershoot) + curl (Middle + hookx) (top - w / 2 - fovershoot) create-glyph 'longs.italic' : glyph-proc include : MarkSet.if @@ -5842,6 +5876,7 @@ glyph-block Letter-Latin-Lower-F : begin define fbar : XH * DesignParameters.fBarPosToXH + Stroke * DesignParameters.fbarStrokeAdj + define fbarFH : XH * DesignParameters.fBarPosToXH + Stroke * DesignParameters.fbarStrokeAdjFH define [SmallFBottomSerif] : dispiro widths.lhs flat ([mix SB RightSB 0.02] + HalfStroke * TanSlope) 0 @@ -5856,78 +5891,109 @@ glyph-block Letter-Latin-Lower-F : begin [if offset corner curl] (barleft + offset) 0 [heading Downward] if offset {[corner (RightSB + RBalance2 - (OX - O) - offset) 0]} {} - create-glyph : glyph-proc - include : MarkSet.b + define [SmallFDownExtension barLeft] : VBarLeft barLeft 0.1 (Descender * 0.9) - local barleft : [mix SB RightSB 0.35] - Stroke * 0.25 * HVContrast - include : StdFShapeT dispiro 0 barleft Stroke + define [SmallFDownHook df barRight counterHookLeft] : begin + local hd : FlatHookDepth df + return : dispiro + widths.lhs + flat counterHookLeft Descender + curl [Math.max (barRight - hd.x) (counterHookLeft + 0.1)] Descender + archv.superness DesignParameters.tightHookSuperness + flat barRight [Math.min 0 (Descender + hd.y)] + curl barRight 0.1 [heading Upward] - create-derived 'f.straight' : glyph-proc - include : HBarTop SB [mix SB RightSB 0.95] fbar + define [StandardSmallFShape df m bh counterHook] : glyph-proc + local barLeft0 : [mix SB RightSB 0.35] - Stroke * 0.25 * HVContrast + local barLeft : [mix SB RightSB : if (counterHook > 1) 0.45 0.35] - Stroke * [if (counterHook > 1) 0.45 0.25] * HVContrast - create-derived 'fltail' 0x192 - VerticalHook (barleft + HalfStroke * HVContrast) 0 (-HookX) Hook + include : StdFShapeT dispiro 0 barLeft0 Stroke + include : Translate (barLeft - barLeft0) 0 + include : HCrossBar.top SB [mix SB RightSB m] bh + if (counterHook === 1) : include : SmallFDownExtension barLeft + if (counterHook === 2) : begin + local barRight : barLeft + Stroke * HVContrast + local crossRight : mix df.width df.rightSB m + local counterHookLeft : Math.max SB : barRight - (crossRight - barLeft) + include : SmallFDownHook df barRight counterHookLeft + if (counterHook === 3) : begin + include : VerticalHook (barLeft + HalfStroke * HVContrast) 0 (-HookX) Hook - create-derived 'f.serifed' : SmallFBottomSerif - - create-derived 'f.straightTailed' : glyph-proc - include : MarkSet.if - include : VBarLeft barleft 0 (Descender * 0.9) - - alias 'lenisf' 0xAB35 'f.straight' - - create-derived 'f.phoneticLeft' : glyph-proc - include : HBarTop SB RightSB fbar - if SLAB : include : SmallFBottomSerif - - glyph-block-import Letter-Blackboard : BBS BBD - create-glyph 'mathbb/f' 0x1D557 : glyph-proc - include : MarkSet.b - local barleft : [mix SB RightSB 0.35] - BBD * 0.25 * HVContrast - include : StdFShapeT dispiro 0 barleft BBS - include : intersection - VBarLeft (barleft + BBD) 0 CAP BBS - StdFShapeT spiro-outline 1 barleft BBS - include : difference - HBarTop SB [mix SB RightSB 0.95] fbar BBS - Rect CAP 0 barleft (barleft + BBD) - include : HBarBottom barleft (barleft + BBD) 0 BBS - - define dfNarrowF : DivFrame para.diversityF define [NarrowFShape df m bh counterHook] : glyph-proc local crossLeft : mix 0 SB m local crossRight : mix df.width df.rightSB m - local barLeft : [mix crossLeft crossRight 0.42] - Stroke * 0.375 * HVContrast + df.width / 32 - local tTurn : Math.max (Hook * [Math.min 1 : Math.sqrt df.div]) (Stroke * 1.375) : Math.min Hook (Stroke * 1.75) + local barLeft : if (counterHook > 1) + df.middle - HalfStroke * HVContrast + [mix crossLeft crossRight 0.42] - Stroke * 0.375 * HVContrast + df.width / 32 + local hd : FlatHookDepth df include : dispiro widths.lhs flat crossRight CAP - curl [Math.min (barLeft + tTurn) (crossRight - 0.1)] CAP - archv - flat barLeft [Math.max XH (CAP - tTurn)] + curl [Math.min (barLeft + hd.x) (crossRight - 0.1)] CAP + archv.superness DesignParameters.tightHookSuperness + flat barLeft [Math.max XH (CAP - hd.y)] curl barLeft 0 [heading Downward] - include : HBarTop crossLeft crossRight bh - if (counterHook === 1) : begin - include : VerticalHook (barLeft + HalfStroke * HVContrast) 0 (-HookX) Hook + include : HCrossBar.top crossLeft crossRight bh + if (counterHook === 1) : include : SmallFDownExtension barLeft if (counterHook === 2) : begin local barRight : barLeft + Stroke * HVContrast + local crossRight : mix df.width df.rightSB m local counterHookLeft : barRight - (crossRight - barLeft) - include : dispiro - widths.lhs - flat counterHookLeft Descender - curl [Math.max (barRight - tTurn) (counterHookLeft + 0.1)] Descender - archv - flat barRight [Math.min 0 (Descender + tTurn)] - curl barRight 0.1 [heading Upward] + include : SmallFDownHook df barRight counterHookLeft + + + create-glyph 'f.serifless' : glyph-proc + include : MarkSet.b + include : StandardSmallFShape [DivFrame 1] 0.95 fbarFH + + create-glyph 'f.phoneticLeft' : glyph-proc + include : MarkSet.b + include : StandardSmallFShape [DivFrame 1] 1 fbarFH + if SLAB : include : SmallFBottomSerif + + create-glyph 'f.serifed' : glyph-proc + include : MarkSet.b + include : StandardSmallFShape [DivFrame 1] 0.95 fbarFH + include : SmallFBottomSerif + + create-glyph 'fltail' 0x192 : glyph-proc + include : MarkSet.if + include : StandardSmallFShape [DivFrame 1] 1 fbarFH 2 + + create-glyph 'f.tailed' : glyph-proc + include : MarkSet.if + include : StandardSmallFShape [DivFrame 1] 1 fbarFH 2 + + create-glyph 'f.extended' : glyph-proc + include : MarkSet.if + include : StandardSmallFShape [DivFrame 1] 0.95 fbarFH 1 + + create-glyph 'f.seriflessCrossbarAtXHeight' : glyph-proc + include : MarkSet.b + include : StandardSmallFShape [DivFrame 1] 0.95 XH + + create-glyph 'f.serifedCrossbarAtXHeight' : glyph-proc + include : MarkSet.b + include : StandardSmallFShape [DivFrame 1] 0.95 XH + include : SmallFBottomSerif + + create-glyph 'f.tailedCrossbarAtXHeight' : glyph-proc + include : MarkSet.if + include : StandardSmallFShape [DivFrame 1] 1 XH 2 + + create-glyph 'f.extendedCrossbarAtXHeight' : glyph-proc + include : MarkSet.if + include : StandardSmallFShape [DivFrame 1] 0.95 XH 1 create-glyph 'f.narrow' : glyph-proc - set-width dfNarrowF.width - include : dfNarrowF.markSet.b - include : NarrowFShape dfNarrowF 0.5 fbar + define df : DivFrame para.diversityF + set-width df.width + include : df.markSet.b + include : NarrowFShape df 0.5 fbarFH create-glyph 'f.flatHook' : glyph-proc include : MarkSet.b - include : NarrowFShape [DivFrame 1] 1 fbar + include : NarrowFShape [DivFrame 1] 1 fbarFH create-glyph 'f.flatHookCrossbarAtXHeight' : glyph-proc include : MarkSet.b @@ -5935,7 +6001,7 @@ glyph-block Letter-Latin-Lower-F : begin create-glyph 'f.flatHookSerifed' : glyph-proc include : MarkSet.b - include : NarrowFShape [DivFrame 1] 1 fbar + include : NarrowFShape [DivFrame 1] 1 fbarFH include : WithTransform [Translate ((RightSB - SB) * 0.035) 0] : SmallFBottomSerif create-glyph 'f.flatHookSerifedCrossbarAtXHeight' : glyph-proc @@ -5943,43 +6009,57 @@ glyph-block Letter-Latin-Lower-F : begin include : NarrowFShape [DivFrame 1] 1 XH include : WithTransform [Translate ((RightSB - SB) * 0.035) 0] : SmallFBottomSerif - create-glyph 'f.flatHookRoundTailed' : glyph-proc + create-glyph 'f.flatHookTailed' : glyph-proc include : MarkSet.if - include : NarrowFShape [DivFrame 1] 1 fbar 1 + include : NarrowFShape [DivFrame 1] 1 fbarFH 2 - create-glyph 'f.flatHookRoundTailedCrossbarAtXHeight' : glyph-proc - include : MarkSet.if - include : NarrowFShape [DivFrame 1] 1 XH 1 - - create-glyph 'f.flatHookFlatTailed' : glyph-proc - include : MarkSet.if - include : NarrowFShape [DivFrame 1] 1 fbar 2 - - create-glyph 'f.flatHookFlatTailedCrossbarAtXHeight' : glyph-proc + create-glyph 'f.flatHookTailedCrossbarAtXHeight' : glyph-proc include : MarkSet.if include : NarrowFShape [DivFrame 1] 1 XH 2 - create-glyph 'f.tailed' : glyph-proc - include [refer-glyph 'longs.italic'] AS_BASE - include : HBarTop (Middle - LongJut) (Middle + LongJut) fbar + create-glyph 'f.flatHookExtended' : glyph-proc + include : MarkSet.if + include : NarrowFShape [DivFrame 1] 1 fbarFH 1 + + create-glyph 'f.flatHookExtendedCrossbarAtXHeight' : glyph-proc + include : MarkSet.if + include : NarrowFShape [DivFrame 1] 1 XH 1 select-variant 'f' 'f' + alias 'lenisf' 0xAB35 'f.serifless' - turned 'turnf.straight' nothing 'f.straight' Middle (XH / 2) [MarkSet.p] + turned 'turnf.serifless' nothing 'f.serifless' Middle (XH / 2) [MarkSet.p] turned 'turnf.serifed' nothing 'f.serifed' Middle (XH / 2) [MarkSet.p] - turned 'turnf.straightTailed' nothing 'f.straightTailed' Middle (XH / 2) [MarkSet.if] - turned 'turnf.tailed' nothing 'f.tailed' Middle [mix Descender CAP 0.5] [MarkSet.if] + turned 'turnf.tailed' nothing 'f.tailed' Middle (XH / 2) [MarkSet.if] + turned 'turnf.extended' nothing 'f.extended' Middle (XH / 2) [MarkSet.if] + turned 'turnf.seriflessCrossbarAtXHeight' nothing 'f.seriflessCrossbarAtXHeight' Middle (XH / 2) [MarkSet.p] + turned 'turnf.serifedCrossbarAtXHeight' nothing 'f.serifedCrossbarAtXHeight' Middle (XH / 2) [MarkSet.p] + turned 'turnf.tailedCrossbarAtXHeight' nothing 'f.tailedCrossbarAtXHeight' Middle (XH / 2) [MarkSet.if] + turned 'turnf.extendedCrossbarAtXHeight' nothing 'f.extendedCrossbarAtXHeight' Middle (XH / 2) [MarkSet.if] turned 'turnf.flatHook' nothing 'f.flatHook' Middle (XH / 2) [MarkSet.p] - turned 'turnf.flatHookCrossbarAtXHeight' nothing 'f.flatHookCrossbarAtXHeight' Middle (XH / 2) [MarkSet.p] turned 'turnf.flatHookSerifed' nothing 'f.flatHookSerifed' Middle (XH / 2) [MarkSet.p] + turned 'turnf.flatHookTailed' nothing 'f.flatHookTailed' Middle [mix Descender CAP 0.5] [MarkSet.if] + turned 'turnf.flatHookExtended' nothing 'f.flatHookExtended' Middle [mix Descender CAP 0.5] [MarkSet.if] + turned 'turnf.flatHookCrossbarAtXHeight' nothing 'f.flatHookCrossbarAtXHeight' Middle (XH / 2) [MarkSet.p] turned 'turnf.flatHookSerifedCrossbarAtXHeight' nothing 'f.flatHookSerifedCrossbarAtXHeight' Middle (XH / 2) [MarkSet.p] - turned 'turnf.flatHookRoundTailed' nothing 'f.flatHookRoundTailed' Middle [mix Descender CAP 0.5] [MarkSet.if] - turned 'turnf.flatHookRoundTailedCrossbarAtXHeight' nothing 'f.flatHookRoundTailedCrossbarAtXHeight' Middle [mix Descender CAP 0.5] [MarkSet.if] - turned 'turnf.flatHookFlatTailed' nothing 'f.flatHookFlatTailed' Middle [mix Descender CAP 0.5] [MarkSet.if] - turned 'turnf.flatHookFlatTailedCrossbarAtXHeight' nothing 'f.flatHookFlatTailedCrossbarAtXHeight' Middle [mix Descender CAP 0.5] [MarkSet.if] - turned 'turnf.narrow' nothing 'f.narrow' dfNarrowF.middle (XH / 2) [dfNarrowF.markSet.p] + turned 'turnf.flatHookTailedCrossbarAtXHeight' nothing 'f.flatHookTailedCrossbarAtXHeight' Middle [mix Descender CAP 0.5] [MarkSet.if] + turned 'turnf.flatHookExtendedCrossbarAtXHeight' nothing 'f.flatHookExtendedCrossbarAtXHeight' Middle [mix Descender CAP 0.5] [MarkSet.if] + let [df : DivFrame para.diversityF] : turned 'turnf.narrow' nothing 'f.narrow' df.middle (XH / 2) [df.markSet.p] select-variant 'turnf' 0x25F (follow -- 'f') + glyph-block-import Letter-Blackboard : BBS BBD + create-glyph 'mathbb/f' 0x1D557 : glyph-proc + include : MarkSet.b + local barLeft : [mix SB RightSB 0.35] - BBD * 0.25 * HVContrast + include : StdFShapeT dispiro 0 barLeft BBS + include : intersection + VBarLeft (barLeft + BBD) 0 CAP BBS + StdFShapeT spiro-outline 1 barLeft BBS + include : difference + HCrossBar.top SB [mix SB RightSB 0.95] fbar BBS + Rect CAP 0 barLeft (barLeft + BBD) + include : HBarBottom barLeft (barLeft + BBD) 0 BBS + do "f ligatures" local shift (-(Width * 0.055 + SB * 0.5)) local barr RightSB @@ -6226,7 +6306,7 @@ glyph-block Letter-Latin-Lower-T : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives glyph-block-import Letter-Shared : CreateCommaCaronComposition - glyph-block-import Letter-Shared-Shapes : CurlyTail + glyph-block-import Letter-Shared-Shapes : CurlyTail FlatHookDepth define xSmallTBarLeft : Middle - TBalance - Stroke * 0.5 * HVContrast define [SmallTHookShapeT sink offset top bot sw] : begin @@ -6247,7 +6327,7 @@ glyph-block Letter-Latin-Lower-T : begin local g : G.call currentGlyph # Not using include set-base-anchor 'bottomright' g.knots.(g.knots.length - 1).x g.knots.(g.knots.length - 1).y set-base-anchor 'below' [mix xSmallTBarLeft g.knots.(g.knots.length - 1).x : StrokeWidthBlend 0.375 0.5] bot - include : HBarTop + include : HCrossBar.top xSmallTBarLeft + HalfStroke - LongJut + TBalance2 xSmallTBarLeft + HalfStroke + LongJut + TBalance2 begin XH @@ -6265,7 +6345,7 @@ glyph-block Letter-Latin-Lower-T : begin VBarLeft (xSmallTBarLeft + BBD) 0 CAP BBS SmallTHookShapeT spiro-outline 1 CAP 0 BBS include : difference - HBarTop + HCrossBar.top xSmallTBarLeft + (BBD / 2) - LongJut + TBalance2 xSmallTBarLeft + (BBD / 2) + LongJut + TBalance2 begin XH @@ -6276,15 +6356,15 @@ glyph-block Letter-Latin-Lower-T : begin local xCrossLeft : mix 0 SB m local xCrossRight : mix df.width df.rightSB m local xBarLeft : [mix xCrossLeft xCrossRight 0.42] - Stroke * 0.375 * HVContrast - local tTurn : Math.max (Hook * [Math.min 1 : Math.sqrt df.div]) (Stroke * 1.375) : Math.min Hook (Stroke * 1.75) + local hd : FlatHookDepth df include : union - HBarTop xCrossLeft (xCrossRight + ext) XH + HCrossBar.top xCrossLeft (xCrossRight + ext) XH dispiro widths.rhs flat xCrossRight 0 - curl [Math.min (xBarLeft + tTurn) (xCrossRight - 1)] 0 - archv - flat xBarLeft tTurn + curl [Math.min (xBarLeft + hd.x) (xCrossRight - 1)] 0 + archv.superness DesignParameters.tightHookSuperness + flat xBarLeft hd.y curl xBarLeft top [heading Upward] set-base-anchor 'topright' xCrossRight CAP @@ -6324,13 +6404,13 @@ glyph-block Letter-Latin-Lower-T : begin set-width Width include : MarkSet.b include : VBar Middle 0 CAP - include : HBarTop (Middle - LongJut) (Middle + LongJut) XH + include : HCrossBar.top (Middle - LongJut) (Middle + LongJut) XH create-glyph 't.hooklessAsymmetric' : glyph-proc set-width Width include : MarkSet.b include : VBarLeft xSmallTBarLeft 0 CAP - include : HBarTop xSmallTBarLeft (Middle + LongJut) XH + include : HCrossBar.top xSmallTBarLeft (Middle + LongJut) XH select-variant 't' 't' diff --git a/font-src/kits/spiro-kit.ptl b/font-src/kits/spiro-kit.ptl index 0df51f645..c1bfee29a 100644 --- a/font-src/kits/spiro-kit.ptl +++ b/font-src/kits/spiro-kit.ptl @@ -118,7 +118,9 @@ export : define [SetupBuilders args] : begin return cache.(samples).vh list hv vh define [archv samples superness] : alsoThruThem [jhv [fallback samples DEFAULT_STEPS] superness] + set archv.superness : lambda [s] : archv DEFAULT_STEPS s define [arcvh samples superness] : alsoThruThem [jvh [fallback samples DEFAULT_STEPS] superness] + set arcvh.superness : lambda [s] : arcvh DEFAULT_STEPS s define [complexThru] : begin local a : {}.slice.call arguments diff --git a/font-src/meta/aesthetics.ptl b/font-src/meta/aesthetics.ptl index 2c52a0b45..b839b65a6 100644 --- a/font-src/meta/aesthetics.ptl +++ b/font-src/meta/aesthetics.ptl @@ -324,6 +324,7 @@ export : define DesignParameters : object upperEBarPos : lambda [slab] : if slab 0.52 0.53 # Fine adjustments fbarStrokeAdj 0.25 + fbarStrokeAdjFH 0.125 superness 2.275 tightHookSuperness 2.30 diff --git a/font-src/meta/macros.ptl b/font-src/meta/macros.ptl index 81121c2cd..138ad5d19 100644 --- a/font-src/meta/macros.ptl +++ b/font-src/meta/macros.ptl @@ -119,7 +119,7 @@ define-macro glyph-block-import : syntax-rules ScaleAround Realign ForceUpright DiagCor CreateWaveShape NameUni PointingTo WithAIHSerifsMask WithTransform ReverseContours clear-anchors OBarLeftToothlessShape OBarLeftRoundedShape OBarRightToothlessShape OBarRightRoundedShape AsRadical - ExtLineCenter DiagCorDs] + ExtLineCenter DiagCorDs HCrossBar] define vartiableFilter : if externEnv.$glyphBlockVariableUsage$ lambda [x] externEnv.$glyphBlockVariableUsage$.(x) diff --git a/params/variants.toml b/params/variants.toml index 3271491fd..2640a3377 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -306,65 +306,85 @@ selector.d = "tailed" sampler = 'f' tag = 'cv15' -[prime.f.variants.straight] +[prime.f.variants.serifless] rank = 1 -description = '`f` without bottom hook' -selector.f = "straight" - -[prime.f.variants.tailed] -rank = 2 -description = '`f` with a leftward bottom hook' -selector.f = "tailed" +description = '`f` without bottom serif, hook or exension' +selector.f = "serifless" [prime.f.variants.serifed] -rank = 3 +rank = 2 description = '`f` with bottom serif' selector.f = "serifed" -[prime.f.variants.straight-tailed] +[prime.f.variants.tailed] +rank = 3 +description = '`f` with bottom hook' +selector.f = "tailed" + +[prime.f.variants.extended] rank = 4 -description = '`f` with straight tail' -selector.f = "straightTailed" +description = '`f` with bar extended to descender' +selector.f = "extended" + +[prime.f.variants.serifless-crossbar-at-x-height] +rank = 5 +description = '`f` without bottom serif, hook or exension; crossbar is placed right at X-height' +selector.f = "seriflessCrossbarAtXHeight" + +[prime.f.variants.serifed-crossbar-at-x-height] +rank = 6 +description = '`f` with bottom serif; crossbar is placed right at X-height' +selector.f = "serifedCrossbarAtXHeight" + +[prime.f.variants.tailed-crossbar-at-x-height] +rank = 7 +description = '`f` with bottom hook; crossbar is placed right at X-height' +selector.f = "tailedCrossbarAtXHeight" + +[prime.f.variants.extended-crossbar-at-x-height] +rank = 8 +description = '`f` with bar extended to descender; crossbar is placed right at X-height' +selector.f = "extendedCrossbarAtXHeight" [prime.f.variants.flat-hook] -rank = 5 -description = '`f` with flat hook' +rank = 9 +description = '`f` with flat top hook, without bottom serif, hook or exension' selector.f = 'flatHook' -[prime.f.variants.flat-hook-crossbar-at-x-height] -rank = 6 -description = '`f` with flat hook and crossbar placed right at X-height' -selector.f = 'flatHookCrossbarAtXHeight' - [prime.f.variants.flat-hook-serifed] -rank = 7 -description = '`f` with flat hook and bottom serif' +rank = 10 +description = '`f` with flat top hook and bottom serif' selector.f = 'flatHookSerifed' +[prime.f.variants.flat-hook-tailed] +rank = 11 +description = '`f` with flat top hook and bottom hook' +selector.f = 'flatHookTailed' + +[prime.f.variants.flat-hook-extended] +rank = 12 +description = '`f` with flat top hook and bar extended to descender' +selector.f = 'flatHookExtended' + +[prime.f.variants.flat-hook-crossbar-at-x-height] +rank = 13 +description = '`f` with flat top hook, without bottom serif, hook or exension; crossbar is placed right at X-height' +selector.f = 'flatHookCrossbarAtXHeight' + [prime.f.variants.flat-hook-serifed-crossbar-at-x-height] -rank = 8 -description = '`f` with flat hook, bottom serif, and crossbar placed right at X-height' +rank = 14 +description = '`f` with flat top hook, bottom serif; crossbar is placed right at X-height' selector.f = 'flatHookSerifedCrossbarAtXHeight' -[prime.f.variants.flat-hook-round-tailed] -rank = 9 -description = '`f` with flat hook' -selector.f = 'flatHookRoundTailed' +[prime.f.variants.flat-hook-tailed-crossbar-at-x-height] +rank = 15 +description = '`f` with flat top hook, bottom hook; crossbar is placed right at X-height' +selector.f = 'flatHookTailedCrossbarAtXHeight' -[prime.f.variants.flat-hook-round-tailed-crossbar-at-x-height] -rank = 10 -description = '`f` with flat hook and crossbar placed right at X-height' -selector.f = 'flatHookRoundTailedCrossbarAtXHeight' - -[prime.f.variants.flat-hook-flat-tailed] -rank = 11 -description = '`f` with flat hook and bottom serif' -selector.f = 'flatHookFlatTailed' - -[prime.f.variants.flat-hook-flat-tailed-crossbar-at-x-height] -rank = 12 -description = '`f` with flat hook, bottom serif, and crossbar placed right at X-height' -selector.f = 'flatHookFlatTailedCrossbarAtXHeight' +[prime.f.variants.flat-hook-extended-crossbar-at-x-height] +rank = 16 +description = '`f` with flat top hook, bar extended to descender; crossbar is placed right at X-height' +selector.f = 'flatHookExtendedCrossbarAtXHeight' @@ -438,41 +458,51 @@ rank = 1 description = 'Serifed `i`' selector.dotlessi = 'serifed' -[prime.i.variants.italic] +[prime.i.variants.serifless] rank = 2 -description = 'Italic `i`' -selector.dotlessi = 'italic' +description = '`i` like a straight line' +selector.dotlessi = "serifless" [prime.i.variants.hooky] rank = 3 description = 'Hooky `i`' selector.dotlessi = 'hooky' -[prime.i.variants.serifless] -rank = 4 -description = '`i` like a straight line' -selector.dotlessi = "serifless" - [prime.i.variants.zshaped] -rank = 5 +rank = 4 description = 'Z-shaped `i`' selector.dotlessi = 'zshaped' -[prime.i.variants.tailed] -rank = 6 -description = "Tailed `i`" -selector.dotlessi = 'tailed' - -[prime.i.variants.hookybottom] -rank = 7 +[prime.i.variants.hooky-bottom] +rank = 5 description = "`i` with a straight tail" -selector.dotlessi = 'hookybottom' +selector.dotlessi = 'hookyBottom' [prime.i.variants.serifed-asymmetric] -rank = 8 +rank = 6 description = "`i` with shorter top serif and full bottom serif" selector.dotlessi = 'serifedAsymmetric' +[prime.i.variants.tailed] +rank = 7 +description = "`i` with curly tail" +selector.dotlessi = 'tailed' + +[prime.i.variants.serifed-tailed] +rank = 8 +description = '`i` with curly tail and top serif' +selector.dotlessi = 'serifedTailed' + +[prime.i.variants.flat-tailed] +rank = 9 +description = "`i` with top serif and a curly-then-flat tail" +selector.dotlessi = 'flatTailed' + +[prime.i.variants.serifed-flat-tailed] +rank = 10 +description = "`i` with top serif and a curly-then-flat tail" +selector.dotlessi = 'serifedFlatTailed' + [prime.j] @@ -531,46 +561,55 @@ selector.k = 'cursive' sampler = 'l' tag = 'cv21' -[prime.l.variants.hooky] +[prime.l.variants.serifed] rank = 1 +description = 'Serifed `l`' +selector.l = 'serifed' + +[prime.l.variants.serifless] +rank = 2 +description = '`l` like a straight line' +selector.l = "serifless" + +[prime.l.variants.hooky] +rank = 3 description = 'Hooky `l`' selector.l = 'hooky' [prime.l.variants.zshaped] -rank = 2 +rank = 4 description = 'Z-shaped `l`' selector.l = 'zshaped' -[prime.l.variants.serifed] -rank = 3 -description = 'Serifed `l`' -selector.l = 'serifed' - -[prime.l.variants.italic] -rank = 4 -description = 'Italic, cursive `l`' -selector.l = 'italic' - -[prime.l.variants.serifless] +[prime.l.variants.hooky-bottom] rank = 5 -description = '`l` like a straight line' -selector.l = "serifless" - -[prime.l.variants.tailed] -rank = 6 -description = '`l` with a curved tail' -selector.l = 'tailed' - -[prime.l.variants.hookybottom] -rank = 7 description = '`l` with a straight tail' -selector.l = 'hookybottom' +selector.l = 'hookyBottom' [prime.l.variants.serifed-asymmetric] -rank = 8 +rank = 6 description = '`l` with shorter top serif and full bottom serif' selector.l = 'serifedAsymmetric' +[prime.l.variants.tailed] +rank = 7 +description = '`l` with curly tail' +selector.l = 'tailed' + +[prime.l.variants.serifed-tailed] +rank = 8 +description = '`l` with top serif and curly tail' +selector.l = 'serifedTailed' + +[prime.l.variants.flat-tailed] +rank = 9 +description = "`l` with top serif and a curly-then-flat tail" +selector.l = 'flatTailed' + +[prime.l.variants.serifed-flat-tailed] +rank = 10 +description = "`l` with top serif and a curly-then-flat tail" +selector.l = 'serifedFlatTailed' [prime.m] @@ -1716,7 +1755,7 @@ digit-form = 'lining' [default.upright-oblique] a = 'doublestorey' d = 'toothed' -f = 'straight' +f = 'serifless' i = 'serifed' j = 'serifed' k = 'straight' @@ -1727,11 +1766,11 @@ y = 'straight' [default.italic] a = 'singlestorey-tailed' d = 'tailed' -f = 'tailed' -i = 'italic' +f = 'flat-hook-tailed' +i = 'serifed-tailed' j = 'serifed' k = 'cursive' -l = 'italic' +l = 'serifed-tailed' u = 'tailed' y = 'cursive' @@ -1741,21 +1780,16 @@ y = 'cursive' one = 'base' seven = 'serifed' -[composite.slab.upright] +[composite.slab.upright-oblique] f = 'serifed' r = 'serifed' y = 'straight-turn' [composite.slab.italic] -f = 'tailed' +f = 'flat-hook-tailed' r = 'top-serifed' y = 'cursive' -[composite.slab.oblique] -f = 'serifed' -r = 'serifed' -y = 'straight-turn' - [composite.ss01] @@ -1778,6 +1812,7 @@ asterisk = 'hexhigh' one = 'base' six = 'open-contour' nine = 'open-contour' +percent = "rings-connected" @@ -1798,6 +1833,7 @@ one = 'base' seven = 'serifed' six = 'closed-contour' nine = 'closed-contour' +percent = "rings-connected" @@ -1814,6 +1850,7 @@ asterisk = 'hexhigh' one = 'base' six = 'open-contour' nine = 'open-contour' +percent = "rings-connected" [composite.ss03.upright-oblique] g = 'doublestorey' @@ -1835,7 +1872,7 @@ a = 'doublestorey' underscore = 'low' i = 'serifed' k = 'straight' -l = 'italic' +l = 'serifed-flat-tailed' y = 'straight-turn' brace = 'straight' number-sign = 'slanted' @@ -1844,6 +1881,7 @@ one = 'base' ampersand = 'upper-open' six = 'closed-contour' nine = 'closed-contour' +percent = "rings-connected" @@ -1858,7 +1896,7 @@ a = 'doublestorey' g = 'opendoublestorey' i = 'serifed' k = 'straight' -l = 'italic' +l = 'serifed-tailed' y = 'straight-turn' number-sign = 'slanted' zero = 'dotted' @@ -1867,6 +1905,7 @@ ampersand = 'et' four = 'semi-open' six = 'closed-contour' nine = 'open-contour' +percent = "rings-connected" @@ -1887,6 +1926,7 @@ number-sign = 'slanted' one = 'base' six = 'closed-contour' nine = 'closed-contour' +percent = "rings-connected" @@ -1908,6 +1948,7 @@ one = 'base' paren = 'large-contour' six = 'closed-contour' nine = 'closed-contour' +percent = "rings-connected" @@ -1957,7 +1998,7 @@ description = 'Source Code Pro Style' capital-g = 'toothless' at = 'threefold' k = 'straight' -l = 'italic' +l = 'serifed-tailed' y = 'straight-turn' asterisk = 'low' zero = 'dotted' @@ -1992,6 +2033,7 @@ asterisk = 'low' one = 'base' nine = 'straight-bar' six = 'straight-bar' +percent = "rings-connected" @@ -2021,8 +2063,8 @@ a = "doublestorey-toothless-corner" b = "toothless-corner" d = "toothless-corner" g = "earless-corner" -i = "italic" -l = "italic" +i = "serifed-tailed" +l = "serifed-tailed" m = "earless-corner-double-arch-shortleg" n = "earless-corner-straight" p = "earless-corner" @@ -2055,6 +2097,7 @@ number-sign = 'slanted' one = 'base' six = 'closed-contour' nine = 'closed-contour' +percent = "rings-connected" @@ -2063,20 +2106,25 @@ tag = 'ss14' description = 'JetBrains Mono Style' [composite.ss14.design] -i = 'serifed' -k = 'straight' -l = 'italic' -u = 'toothless-rounded' -zero = 'long-dotted' -three = 'flattop' -capital-q = 'straight' -asterisk = 'low' -one = 'base' -seven = 'serifed' -ampersand = 'upper-open' -four = 'semi-open-non-crossing' -nine = 'straight-bar' -six = 'straight-bar' +capital-q = "straight" +capital-g = "toothless" +f = "flat-hook-crossbar-at-x-height" +i = "serifed" +l = "serifed-flat-tailed" +u = "toothless-rounded" +zero = "dotted" +three = "flattop" +one = "base" +asterisk = "low" +tilde = "low" +lig-ltgteq = "slanted" +percent = "rings-connected" +ampersand = "upper-open" +brace = "straight" +number-sign = "slanted" + +[composite.ss14.italic] +f = "flat-hook-tailed-crossbar-at-x-height"