From 8cdf805a88373d07de67436c084e816a4b66ac7a Mon Sep 17 00:00:00 2001 From: John McWilliams Date: Sat, 4 Jan 2025 09:50:41 -0500 Subject: [PATCH 1/2] Make `scriptCut` variants for `a`/`b`/`g`/`q` selectable via CV. --- changes/32.3.2.md | 2 + .../src/letter/greek/lower-epsilon.ptl | 38 +++-- .../font-glyphs/src/letter/latin/lower-a.ptl | 16 +-- .../font-glyphs/src/letter/latin/lower-b.ptl | 13 +- .../font-glyphs/src/letter/latin/lower-d.ptl | 24 ++-- .../font-glyphs/src/letter/latin/lower-g.ptl | 64 +++++---- .../font-glyphs/src/letter/latin/lower-q.ptl | 19 ++- params/variants.toml | 134 +++++++++++++----- 8 files changed, 214 insertions(+), 96 deletions(-) diff --git a/changes/32.3.2.md b/changes/32.3.2.md index 3a2ce4f470..ab278377f4 100644 --- a/changes/32.3.2.md +++ b/changes/32.3.2.md @@ -1,3 +1,5 @@ * Add `curved` variant for `ΒΆ` (#2045). +* Add `top-cut` variants for `a`/`g`/`q`. +* Add `bottom-cut` variants for `b`. * Add characters: - CURVED STEM PARAGRAPH SIGN ORNAMENT (`U+2761`). \ No newline at end of file diff --git a/packages/font-glyphs/src/letter/greek/lower-epsilon.ptl b/packages/font-glyphs/src/letter/greek/lower-epsilon.ptl index 8fe22aa169..a1a923afcb 100644 --- a/packages/font-glyphs/src/letter/greek/lower-epsilon.ptl +++ b/packages/font-glyphs/src/letter/greek/lower-epsilon.ptl @@ -389,6 +389,21 @@ glyph-block Letter-Greek-Lower-Epsilon : begin include : eps.Shape include : bar df top stroke + define [TopCutBody df top bar hook ada adb] : glyph-proc + local eps : SmallEpsilon CLOSED-STEM CLOSED-STEM top 0 + blend -- VolBlend + hook -- hook + overflow -- 0 + ada2 -- ada + adb2 -- adb + define [object stroke] : eps.Dim + include : eps.Shape + include : bar df (top - stroke / 2) stroke + include : spiro-outline + corner df.rightSB top + corner df.rightSB (top - stroke / 2) + corner (df.rightSB - [HSwToV stroke]) (top - stroke / 2) + define [EarlessCornerBody df top bar hook ada adb] : glyph-proc local eps : SmallEpsilon SLAB-INWARD CLOSED-STEM top 0 blend -- VolBlend @@ -415,16 +430,19 @@ glyph-block Letter-Greek-Lower-Epsilon : begin singleStoreySerifless { FullBarBody SingleStorey.SeriflessBar } singleStoreyEarlessCornerSerifless { EarlessCornerBody SingleStorey.SeriflessBar } singleStoreyEarlessRoundedSerifless { EarlessRoundedBody SingleStorey.SeriflessBar } + singleStoreyTopCutSerifless { TopCutBody SingleStorey.SeriflessBar } singleStoreySerifed { FullBarBody SingleStorey.BottomSerifedBar } singleStoreyEarlessCornerSerifed { EarlessCornerBody SingleStorey.BottomSerifedBar } singleStoreyEarlessRoundedSerifed { EarlessRoundedBody SingleStorey.BottomSerifedBar } + singleStoreyTopCutSerifed { TopCutBody SingleStorey.BottomSerifedBar } singleStoreyDoubleSerifed { FullBarBody SingleStorey.DoubleSerifedBar } singleStoreyTailed { FullBarBody SingleStorey.TailedBar } singleStoreyEarlessCornerTailed { EarlessCornerBody SingleStorey.TailedBar } singleStoreyEarlessRoundedTailed { EarlessRoundedBody SingleStorey.TailedBar } + singleStoreyTopCutTailed { TopCutBody SingleStorey.TailedBar } singleStoreyTailedSerifed { FullBarBody SingleStorey.TailedSerifedBar } @@ -525,21 +543,26 @@ glyph-block Letter-Greek-Lower-Epsilon : begin select-variant 'UeVolapuk' 0xA79E (follow -- 'u') select-variant 'ueVolapuk' 0xA79F (follow -- 'u') - alias 'grek/epsilon' 0x3B5 'latn/epsilon.serifless' select-variant 'latn/Epsilon' 0x190 select-variant 'latn/epsilon' 0x25B + CreateTurnedLetter 'turnepsilon' 0x1D08 'latn/epsilon' HalfAdvance (XH / 2) + + alias 'grek/epsilon' 0x3B5 'latn/epsilon.serifless' + alias 'cyrl/ZeRev' 0x510 'latn/Epsilon' alias 'cyrl/zeRev' 0x511 'latn/epsilon' select-variant 'cyrl/Ze' 0x417 select-variant 'cyrl/ze' 0x437 - select-variant 'cyrl/KsiBase' (follow -- 'cyrl/ZeTopSerifOnly') - select-variant 'cyrl/ksiBase' (follow -- 'cyrl/zeTopSerifOnly') - select-variant 'cyrl/ze.BGR' (follow -- 'cyrl/ze') + select-variant 'cyrl/ze.BGR' (follow -- 'cyrl/ze') + alias 'latn/EpsilonRev' 0xA7AB 'cyrl/Ze' alias 'latn/epsilonRev' 0x25C 'cyrl/ze' + select-variant 'cyrl/KsiBase' (follow -- 'cyrl/ZeTopSerifOnly') + select-variant 'cyrl/ksiBase' (follow -- 'cyrl/zeTopSerifOnly') + select-variant 'cyrl/ZjeKomi' 0x504 (follow -- 'cyrl/ZeTopSerifOnly') select-variant 'cyrl/zjeKomi' 0x505 (follow -- 'cyrl/zeTopSerifOnly') select-variant 'cyrl/DzjeKomi' 0x506 (follow -- 'cyrl/ZeTopSerifOnly') @@ -563,13 +586,12 @@ glyph-block Letter-Greek-Lower-Epsilon : begin include : ExtendBelowBaseAnchors (-AccentHeight) select-variant 'latn/epsilon/descBase' (shapeFrom -- 'latn/epsilon') - select-variant 'latn/epsilonRev/descBase' (shapeFrom -- 'cyrl/ze') (follow -- 'cyrl/ze/descBase') - derive-composites 'latn/epsilonRetroflexHook' 0x1D93 'latn/epsilon/descBase' RetroflexHook.r RightSB 0 (refSw -- [AdviceStroke2 2 3 XH]) + + select-variant 'latn/epsilonRev/descBase' (shapeFrom -- 'cyrl/ze') (follow -- 'cyrl/ze/descBase') derive-composites 'latn/epsilonRevRetroflexHook' 0x1D94 'latn/epsilonRev/descBase' - RetroflexHook.l SB 0 (refSw -- [AdviceStroke2 2 3 XH]) - ExtendBelowBaseAnchors Descender + RetroflexHook.l SB 0 (refSw -- [AdviceStroke2 2 3 XH]) create-glyph 'voicedLaryngealSpirant' 0x1D24 : glyph-proc include : MarkSet.b diff --git a/packages/font-glyphs/src/letter/latin/lower-a.ptl b/packages/font-glyphs/src/letter/latin/lower-a.ptl index f4690f2380..db155a9851 100644 --- a/packages/font-glyphs/src/letter/latin/lower-a.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-a.ptl @@ -81,13 +81,13 @@ glyph-block Letter-Latin-Lower-A : begin export : define [Serifless df hookStyle sw] : union HookAndBar df hookStyle 0 sw - Arc df 0 nothing nothing sw + Arc df 0 nothing sw export : define [Serifed df hookStyle sw] : union Serifless df hookStyle sw begin [SerifFrame.fromDf df XH 0].rb.outer export : define [Tailed df hookStyle sw] : union HookAndBar df hookStyle (XH - [ADoubleStoreySmoothB df] + O) sw - Arc df 0 nothing nothing sw + Arc df 0 nothing sw RightwardTailedBar df.rightSB 0 (XH - [ADoubleStoreySmoothB df]) (sw -- [fallback sw : ADoubleStoreyStroke df]) export : define [ToothlessCorner df hookStyle sw] : union HookAndBar df hookStyle DToothlessRise sw @@ -99,7 +99,7 @@ glyph-block Letter-Latin-Lower-A : begin export : define [GetMask shapeFn df sw] : match shapeFn [Just ToothlessCorner] : ArcMask df 1 DToothlessRise sw [Just ToothlessRounded] : ArcMask df 2 [ADoubleStoreySmoothA df] sw - __ : ArcMask df 0 nothing nothing sw + __ : ArcMask df 0 nothing sw glyph-block-export DoubleStoreyConfig define DoubleStoreyConfig : object @@ -154,7 +154,7 @@ glyph-block Letter-Latin-Lower-A : begin local sw : fallback _sw df.mvs include : EaredBodyImpl df top sw include : bar df top sw - export : define [ScriptCutBody df top bar _sw] : glyph-proc + export : define [TopCutBody df top bar _sw] : glyph-proc local sw : fallback _sw df.mvs include : EaredBodyImpl df top sw include : bar df (top - sw / 2) sw @@ -220,21 +220,21 @@ glyph-block Letter-Latin-Lower-A : begin singleStoreySerifless { SingleStorey.FullBarBody SingleStorey.SeriflessBar } singleStoreyEarlessCornerSerifless { SingleStorey.EarlessCornerBody SingleStorey.SeriflessBar } singleStoreyEarlessRoundedSerifless { SingleStorey.EarlessRoundedBody SingleStorey.SeriflessBar } - singleStoreyScriptCutSerifless { SingleStorey.ScriptCutBody SingleStorey.SeriflessBar } + singleStoreyTopCutSerifless { SingleStorey.TopCutBody SingleStorey.SeriflessBar } singleStoreyTopSerifed { SingleStorey.FullBarBody SingleStorey.TopSerifedBar } singleStoreySerifed { SingleStorey.FullBarBody SingleStorey.BottomSerifedBar } singleStoreyEarlessCornerSerifed { SingleStorey.EarlessCornerBody SingleStorey.BottomSerifedBar } singleStoreyEarlessRoundedSerifed { SingleStorey.EarlessRoundedBody SingleStorey.BottomSerifedBar } - singleStoreyScriptCutSerifed { SingleStorey.ScriptCutBody SingleStorey.BottomSerifedBar } + singleStoreyTopCutSerifed { SingleStorey.TopCutBody SingleStorey.BottomSerifedBar } singleStoreyDoubleSerifed { SingleStorey.FullBarBody SingleStorey.DoubleSerifedBar } singleStoreyTailed { SingleStorey.FullBarBody SingleStorey.TailedBar } singleStoreyEarlessCornerTailed { SingleStorey.EarlessCornerBody SingleStorey.TailedBar } singleStoreyEarlessRoundedTailed { SingleStorey.EarlessRoundedBody SingleStorey.TailedBar } - singleStoreyScriptCutTailed { SingleStorey.ScriptCutBody SingleStorey.TailedBar } + singleStoreyTopCutTailed { SingleStorey.TopCutBody SingleStorey.TailedBar } singleStoreyTailedSerifed { SingleStorey.FullBarBody SingleStorey.TailedSerifedBar } @@ -262,7 +262,7 @@ glyph-block Letter-Latin-Lower-A : begin select-variant 'aScript' 0x251 (follow -- [conditional-follow SLAB 'aScript/autoSerifed/slab' 'aScript/autoSerifed/sans']) (shapeFrom -- 'a') select-variant 'AScript' 0x2C6D (follow -- [conditional-follow SLAB 'aScript/autoSerifed/slab' 'aScript/autoSerifed/sans']) - derive-composites 'aScriptRetroflexHook' 0x1D90 'a.singleStoreyScriptCutSerifless' + derive-composites 'aScriptRetroflexHook' 0x1D90 'a.singleStoreyTopCutSerifless' RetroflexHook.rSideJut RightSB 0 (yOverflow -- Stroke) CreateTurnedLetter 'turnaScript' 0x252 'aScript' HalfAdvance (XH / 2) diff --git a/packages/font-glyphs/src/letter/latin/lower-b.ptl b/packages/font-glyphs/src/letter/latin/lower-b.ptl index 02ac8e85ee..59ec5d6d1d 100644 --- a/packages/font-glyphs/src/letter/latin/lower-b.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-b.ptl @@ -16,6 +16,14 @@ glyph-block Letter-Latin-Lower-B : begin OBarLeft.shape VBar.l SB 0 yTop + define [BottomCutBody yTop] : union + OBarLeft.shape + VBar.l SB HalfStroke yTop + spiro-outline + corner SB 0 + corner SB HalfStroke + corner (SB + [HSwToV Stroke]) HalfStroke + define [ToothlessCornerBody yTop] : union OBarLeft.toothless (rise -- DToothlessRise) (mBlend -- DMBlend) VBar.l SB DToothlessRise yTop @@ -31,6 +39,7 @@ glyph-block Letter-Latin-Lower-B : begin toothed ToothedBody toothlessCorner ToothlessCornerBody toothlessRounded ToothlessRoundedBody + bottomCut BottomCutBody object # serifs serifless { no-shape false } motionSerifed { LTSerifs true } @@ -65,7 +74,7 @@ glyph-block Letter-Latin-Lower-B : begin local xRight : mix SB RightSB 0.9 include : HBar.t xLeft xRight Ascender include : Serifs - if doTS : include : VSerif.dr [mix SB RightSB 0.9] Ascender VJut + if doTS : include : VSerif.dr xRight Ascender VJut include : LeaningAnchor.Above.VBar.m [mix xLeft xRight 0.5] if [not doTS] : create-glyph "bHookTop.\(suffix)" : glyph-proc @@ -103,5 +112,5 @@ glyph-block Letter-Latin-Lower-B : begin OShapeOutline.NoOvershoot XH 0 (SB + BBD + [HSwToV BBS]) RightSB VBar.r (RightSB - BBD - OX) 0 XH BBS include : OBarLeft.shape - left -- SB + BBD + left -- (SB + BBD) sw -- BBS diff --git a/packages/font-glyphs/src/letter/latin/lower-d.ptl b/packages/font-glyphs/src/letter/latin/lower-d.ptl index 30684b2fdd..995481d091 100644 --- a/packages/font-glyphs/src/letter/latin/lower-d.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-d.ptl @@ -95,7 +95,7 @@ glyph-block Letter-Latin-Lower-D : begin if topSerif : include : topSerif df Ascender if bottomSerif : include : bottomSerif df Ascender include : LeaningAnchor.Above.VBar.r df.rightSB - set-base-anchor 'overlayOnExtension' (df.rightSB - [HSwToV : 0.5 * Stroke]) yOverlay + set-base-anchor 'overlayOnExtension' (df.rightSB - [HSwToV HalfStroke]) yOverlay create-glyph "dStroke.\(suffix)" : glyph-proc local df : DivFrame 1 @@ -110,7 +110,7 @@ glyph-block Letter-Latin-Lower-D : begin local xRight : df.rightSB + O include : HBar.t xLeft xRight Ascender if topSerif : begin - include : VSerif.dl xLeft Ascender : Math.min VJut (0.8 * (Ascender - XH)) + include : VSerif.dl xLeft Ascender [Math.min VJut : 0.8 * (Ascender - XH)] if [not para.isItalic] : include : HSerif.rt df.rightSB Ascender SideJut if bottomSerif : include : bottomSerif df Ascender include : LeaningAnchor.Above.VBar.m [mix xLeft xRight 0.5] @@ -198,20 +198,20 @@ glyph-block Letter-Latin-Lower-D : begin local fine : AdviceStroke 4 local rinner : clamp (Width * 0.065) (XH * 0.05) (fine * 0.35) local sw : AdviceStroke 2.75 - local m1 : Math.min RightSB (Width - rinner * 2 - fine - OX) + local m : Math.min RightSB (Width - rinner * 2 - fine - OX) - include : LeaningAnchor.Above.VBar.r m1 - include : OBarRight.shape (left -- SB) (right -- m1) (sw -- sw) + include : LeaningAnchor.Above.VBar.r m + include : OBarRight.shape (left -- SB) (right -- m) (sw -- sw) include : dispiro widths.lhs sw - flat (m1 - [HSwToV sw]) Ascender [heading Downward] - curl (m1 - [HSwToV sw]) (rinner * 2 + fine) - CurlyTail.n fine 0 (m1 + rinner * 2 + fine) - x2 -- ([mix SB m1 0.5] - [HSwToV : 0.75 * fine]) - y2 -- 0.37 * Descender + flat (m - [HSwToV sw]) Ascender [heading Downward] + curl (m - [HSwToV sw]) (rinner * 2 + fine) + CurlyTail.n fine 0 (m + rinner * 2 + fine) + x2 -- ([mix SB m 0.5] - [HSwToV : 0.75 * fine]) + y2 -- (0.37 * Descender) swBefore -- sw terminalSlopeAdj -- 0.25 - if fSerif : include : HSerif.lt (m1 - [HSwToV sw]) Ascender SideJut + if fSerif : include : HSerif.lt (m - [HSwToV sw]) Ascender SideJut select-variant 'dCurlyTail' 0x221 @@ -224,5 +224,5 @@ glyph-block Letter-Latin-Lower-D : begin OShapeOutline.NoOvershoot XH 0 SB (RightSB - BBD - [HSwToV BBS]) VBar.l (SB + BBD + OX) 0 XH BBS include : OBarRight.shape - right -- RightSB - BBD + right -- (RightSB - BBD) sw -- BBS diff --git a/packages/font-glyphs/src/letter/latin/lower-g.ptl b/packages/font-glyphs/src/letter/latin/lower-g.ptl index 16aa1cdf58..2ae6c43f5e 100644 --- a/packages/font-glyphs/src/letter/latin/lower-g.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-g.ptl @@ -19,20 +19,20 @@ glyph-block Letter-Latin-Lower-G : begin include : HBar.m l r currentGlyph.baseAnchors.overlay.y bw # overlay bar width for double-storey g - define obwDoubleStorey : Math.min [AdviceStroke 5] (0.5 / 3 * (CAP - Stroke * 4)) + define obwDoubleStorey : Math.min (0.5 / 3 * (CAP - Stroke * 4)) : AdviceStroke 5 create-glyph 'g.doubleStoreyClosed' : glyph-proc include : MarkSet.p local obot : XH * DesignParameters.gBarPos - O - Stroke * 0.4 include : OShape XH obot SB (RightSB - 0.3 * SB) - local gleftx ([mix 0 SB 0.85] + OX) - local grightx ([mix Width RightSB 0.825] - OX) + local gleftx : [mix 0 SB 0.85] + OX + local grightx : [mix Width RightSB 0.825] - OX local groundy : Math.round : [mix Descender (XH * DesignParameters.gBarPos) 0.64] + HalfStroke local gtipy : [mix groundy (obot + Stroke + O) 1.005] - Stroke * CThin include : dispiro g4.left.start [mix SB RightSB 0.4] gtipy [widths 0 (Stroke * CThin)] - g4 ([mix SB RightSB 0.0575] + Stroke * 0.85) [mix groundy gtipy 0.5] [widths.rhs (Stroke * [mix CThin 1 0.5])] + g4 ([mix SB RightSB 0.0575] + Stroke * 0.85) [mix groundy gtipy 0.5] [widths.rhs : Stroke * [mix CThin 1 0.5]] flat [mix SB RightSB 0.435] groundy [widths.rhs Stroke] curl [mix RightSB SB 0.435] groundy archv 4 @@ -58,13 +58,13 @@ glyph-block Letter-Latin-Lower-G : begin local obot : XH * DesignParameters.gBarPos - O - Stroke * 0.4 include : OShape XH obot SB (RightSB - 0.3 * SB) - local gleftx ([mix 0 SB 0.85] + OX) - local grightx ([mix Width RightSB 0.825] - OX) + local gleftx : [mix 0 SB 0.85] + OX + local grightx : [mix Width RightSB 0.825] - OX local groundy : Math.round : [mix Descender (XH * DesignParameters.gBarPos) 0.64] + HalfStroke local gtipy : [mix groundy (obot + Stroke + O) 1.005] - Stroke * CThin include : dispiro g4.left.start [mix SB RightSB 0.4] gtipy [widths 0 (Stroke * CThin)] - g4 ([mix SB RightSB 0.0575] + Stroke * 0.85) [mix groundy gtipy 0.5] [widths.rhs (Stroke * [mix CThin 1 0.5])] + g4 ([mix SB RightSB 0.0575] + Stroke * 0.85) [mix groundy gtipy 0.5] [widths.rhs : Stroke * [mix CThin 1 0.5]] flat [mix SB RightSB 0.435] groundy [widths.rhs Stroke] curl [mix RightSB SB 0.435] groundy archv 4 @@ -112,15 +112,19 @@ glyph-block Letter-Latin-Lower-G : begin CurlyTail.n fine Descender df.leftSB df.width (Descender + 0.5 * fine) yLoopTop -- (0.15 * Descender + 0.25 * fine) - export : define [ScriptCutBody df top] : glyph-proc + export : define [TopCutBody df top] : glyph-proc include : SeriflessBody df top include : spiro-outline - corner df.rightSB top - corner df.rightSB (top - HalfStroke) + corner df.rightSB top + corner df.rightSB (top - HalfStroke) corner (df.rightSB - [HSwToV Stroke]) (top - HalfStroke) export : define [SeriflessBody df top] : glyph-proc - include : OBarRight.shape (top -- top) (left -- df.leftSB) (right -- df.rightSB) (sw -- df.mvs) + include : OBarRight.shape + top -- top + left -- df.leftSB + right -- df.rightSB + sw -- df.mvs export : define [SerifedBody df top] : glyph-proc include : SeriflessBody df top @@ -128,21 +132,21 @@ glyph-block Letter-Latin-Lower-G : begin export : define [EarlessCornerBody df top] : glyph-proc include : OBarLeft.toothless - top -- top - left -- df.leftSB - right -- df.rightSB - rise -- DToothlessRise + top -- top + left -- df.leftSB + right -- df.rightSB + rise -- DToothlessRise mBlend -- DMBlend - sw -- df.mvs + sw -- df.mvs include : FlipAround df.middle (top / 2) export : define [EarlessRoundedBody df top] : glyph-proc include : OBarLeft.rounded - top -- top - left -- df.leftSB - right -- df.rightSB + top -- top + left -- df.leftSB + right -- df.rightSB yTerminal -- (XH - SmallArchDepthA) - sw -- df.mvs + sw -- df.mvs include : FlipAround df.middle (top / 2) define SingleStoreyConfig : SuffixCfg.weave @@ -155,7 +159,7 @@ glyph-block Letter-Latin-Lower-G : begin earlessCorner { SingleStorey.EarlessCornerBody DToothlessRise } earlessCornerHTB { SingleStorey.EarlessCornerBody 0 } earlessRounded { SingleStorey.EarlessRoundedBody (XH - SmallArchDepthA) } - scriptCut { SingleStorey.ScriptCutBody HalfStroke } + topCut { SingleStorey.TopCutBody HalfStroke } foreach { suffix { hookShape {bodyShape hookStart} } } [Object.entries SingleStoreyConfig] : do create-glyph "g.\(suffix)" : glyph-proc @@ -181,10 +185,10 @@ glyph-block Letter-Latin-Lower-G : begin include : bodyShape dfSub XH include : hookShape dfSub (XH - hookStart) include : PalatalHook.r - x -- df.rightSB - y -- 0 - xLink -- dfSub.rightSB - refSw -- dfSub.mvs + x -- df.rightSB + y -- 0 + xLink -- dfSub.rightSB + refSw -- dfSub.mvs maskOut -- [intersection [MaskBelow 0] [MaskLeft dfSub.rightSB]] create-glyph "gBar.\(suffix)" : glyph-proc @@ -213,8 +217,8 @@ glyph-block Letter-Latin-Lower-G : begin include : MarkSet.p set-base-anchor 'overlay' Middle (XH / 2) define df : DivFrame 1 - include : SingleStorey.ScriptCutBody df XH - include : SingleStorey.CrossedHook df (XH - HalfStroke) + include : SingleStorey.TopCutBody df XH + include : SingleStorey.CrossedHook df (XH - HalfStroke) glyph-block-import Letter-Blackboard : BBS BBD BBBarRight create-glyph 'mathbb/g' 0x1D558 : glyph-proc @@ -223,9 +227,9 @@ glyph-block Letter-Latin-Lower-G : begin OShapeOutline.NoOvershoot XH 0 SB (RightSB - BBD - [HSwToV BBS]) VBar.l (SB + BBD + OX) 0 XH BBS include : OBarRight.shape - left -- SB - right -- RightSB - BBD - sw -- BBS + left -- SB + right -- (RightSB - BBD) + sw -- BBS include : SingleStorey.BentHookT dispiro [DivFrame 1] XH 0 BBS include : HBar.t (RightSB - BBD) RightSB XH BBS include : intersection diff --git a/packages/font-glyphs/src/letter/latin/lower-q.ptl b/packages/font-glyphs/src/letter/latin/lower-q.ptl index 223f559822..11cb4a3cfe 100644 --- a/packages/font-glyphs/src/letter/latin/lower-q.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-q.ptl @@ -34,6 +34,18 @@ glyph-block Letter-Latin-Lower-Q : begin [Just TERMINAL-TAILED] : RightwardTailedBar RightSB bottom top [Just TERMINAL-DIAG] : RDiagTailedBar RightSB bottom top + define [TopCutBody terminal top bottom] : glyph-proc + set-base-anchor 'trailing' (RightSB - markHalfStroke) Descender + include : OBarRight.shape (top -- top) + include : match terminal + [Just TERMINAL-NORMAL] : VBar.r RightSB bottom (top - HalfStroke) + [Just TERMINAL-TAILED] : RightwardTailedBar RightSB bottom (top - HalfStroke) + [Just TERMINAL-DIAG] : RDiagTailedBar RightSB bottom (top - HalfStroke) + include : spiro-outline + corner RightSB top + corner RightSB (top - HalfStroke) + corner (RightSB - [HSwToV Stroke]) (top - HalfStroke) + define [EarlessCornerBody terminal top bottom] : glyph-proc set-base-anchor 'trailing' (RightSB - markHalfStroke) Descender include : OBarLeft.toothless (top -- top) (rise -- DToothlessRise) (mBlend -- DMBlend) @@ -64,6 +76,7 @@ glyph-block Letter-Latin-Lower-Q : begin "" EaredBody earlessCorner EarlessCornerBody earlessRounded EarlessRoundedBody + topCut TopCutBody object # tail straight { TERMINAL-NORMAL false } tailed { TERMINAL-TAILED true } @@ -118,6 +131,6 @@ glyph-block Letter-Latin-Lower-Q : begin OShapeOutline.NoOvershoot XH 0 SB (RightSB - BBD - [HSwToV BBS]) VBar.l (SB + BBD + OX) 0 XH BBS include : OBarRight.shape - left -- SB - right -- RightSB - BBD - sw -- BBS + left -- SB + right -- (RightSB - BBD) + sw -- BBS diff --git a/params/variants.toml b/params/variants.toml index 09c8d2fb93..b45703c1d2 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -2139,8 +2139,8 @@ selectorAffix."a/rtailBase" = "doubleStorey" selectorAffix."a/doubleStorey" = "doubleStorey" selectorAffix."a/singleStorey/autoSerifed/slab" = "singleStorey" selectorAffix."a/singleStorey/autoSerifed/sans" = "singleStorey" -selectorAffix."aScript/autoSerifed/slab" = "singleStoreyScriptCut" -selectorAffix."aScript/autoSerifed/sans" = "singleStoreyScriptCut" +selectorAffix."aScript/autoSerifed/slab" = "singleStoreyTopCut" +selectorAffix."aScript/autoSerifed/sans" = "singleStoreyTopCut" [prime.a.variants-buildup.stages.storey.single-storey] rank = 2 @@ -2200,11 +2200,25 @@ selectorAffix."a/rtailBase" = "" selectorAffix."a/doubleStorey" = "" selectorAffix."a/singleStorey/autoSerifed/slab" = "" selectorAffix."a/singleStorey/autoSerifed/sans" = "" -selectorAffix."aScript/autoSerifed/slab" = "scriptCut" -selectorAffix."aScript/autoSerifed/sans" = "scriptCut" +selectorAffix."aScript/autoSerifed/slab" = "topCut" +selectorAffix."aScript/autoSerifed/sans" = "topCut" -[prime.a.variants-buildup.stages.ear.earless-corner] +[prime.a.variants-buildup.stages.ear.top-cut] rank = 2 +nonBreakingVariantAdditionPriority = 100 +descriptionAffix = "a diagonal cut at top" +selectorAffix.a = "topCut" +selectorAffix."ae/a" = "" +selectorAffix."a/sansSerif" = "topCut" +selectorAffix."a/rtailBase" = "topCut" +selectorAffix."a/doubleStorey" = "" +selectorAffix."a/singleStorey/autoSerifed/slab" = "topCut" +selectorAffix."a/singleStorey/autoSerifed/sans" = "topCut" +selectorAffix."aScript/autoSerifed/slab" = "topCut" +selectorAffix."aScript/autoSerifed/sans" = "topCut" + +[prime.a.variants-buildup.stages.ear.earless-corner] +rank = 3 descriptionAffix = "earless (cornered top-right)" selectorAffix.a = "earlessCorner" selectorAffix."ae/a" = "" @@ -2213,11 +2227,11 @@ selectorAffix."a/rtailBase" = "earlessCorner" selectorAffix."a/doubleStorey" = "" selectorAffix."a/singleStorey/autoSerifed/slab" = "earlessCorner" selectorAffix."a/singleStorey/autoSerifed/sans" = "earlessCorner" -selectorAffix."aScript/autoSerifed/slab" = "scriptCut" -selectorAffix."aScript/autoSerifed/sans" = "scriptCut" +selectorAffix."aScript/autoSerifed/slab" = "topCut" +selectorAffix."aScript/autoSerifed/sans" = "topCut" [prime.a.variants-buildup.stages.ear.earless-rounded] -rank = 3 +rank = 4 descriptionAffix = "earless (rounded top-right)" selectorAffix.a = "earlessRounded" selectorAffix."ae/a" = "" @@ -2226,8 +2240,8 @@ selectorAffix."a/rtailBase" = "earlessRounded" selectorAffix."a/doubleStorey" = "" selectorAffix."a/singleStorey/autoSerifed/slab" = "earlessRounded" selectorAffix."a/singleStorey/autoSerifed/sans" = "earlessRounded" -selectorAffix."aScript/autoSerifed/slab" = "scriptCut" -selectorAffix."aScript/autoSerifed/sans" = "scriptCut" +selectorAffix."aScript/autoSerifed/slab" = "topCut" +selectorAffix."aScript/autoSerifed/sans" = "topCut" [prime.a.variants-buildup.stages.bar.serifless] rank = 1 @@ -2345,15 +2359,23 @@ selectorAffix.b = "toothed" selectorAffix."b/sansSerif" = "toothed" selectorAffix.bHookTop = "toothed" -[prime.b.variants-buildup.stages.body.toothless-corner] +[prime.b.variants-buildup.stages.body.bottom-cut] rank = 2 +nonBreakingVariantAdditionPriority = 100 +descriptionAffix = "a diagonal cut at bottom" +selectorAffix.b = "bottomCut" +selectorAffix."b/sansSerif" = "bottomCut" +selectorAffix.bHookTop = "bottomCut" + +[prime.b.variants-buildup.stages.body.toothless-corner] +rank = 3 descriptionAffix = "toothless (cornered) shape" selectorAffix.b = "toothlessCorner" selectorAffix."b/sansSerif" = "toothlessCorner" selectorAffix.bHookTop = "toothlessCorner" [prime.b.variants-buildup.stages.body.toothless-rounded] -rank = 3 +rank = 4 descriptionAffix = "toothless (rounded) shape" selectorAffix.b = "toothlessRounded" selectorAffix."b/sansSerif" = "toothlessRounded" @@ -2768,7 +2790,7 @@ selectorAffix."g/sansSerif" = "doubleStorey" selectorAffix."g/hookTopBase" = "singleStoreyBentHookSerifless" selectorAffix."g/singleStorey/autoSerifed/slab" = "singleStoreyBentHookSerifed" selectorAffix."g/singleStorey/autoSerifed/sans" = "singleStoreyBentHookSerifless" -selectorAffix.gScript = "singleStoreyBentHookScriptCut" +selectorAffix.gScript = "singleStoreyBentHookTopCut" [prime.g.variants-buildup.stages.openness."*"] next = "END" @@ -2834,7 +2856,7 @@ selectorAffix."g/sansSerif" = "serifless" selectorAffix."g/hookTopBase" = "serifless" selectorAffix."g/singleStorey/autoSerifed/slab" = "serifless" selectorAffix."g/singleStorey/autoSerifed/sans" = "serifless" -selectorAffix.gScript = "scriptCut" +selectorAffix.gScript = "topCut" [prime.g.variants-buildup.stages.ear.serifed] rank = 2 @@ -2844,27 +2866,38 @@ selectorAffix."g/sansSerif" = "serifless" selectorAffix."g/hookTopBase" = "serifless" selectorAffix."g/singleStorey/autoSerifed/slab" = "serifed" selectorAffix."g/singleStorey/autoSerifed/sans" = "serifed" -selectorAffix.gScript = "scriptCut" +selectorAffix.gScript = "topCut" -[prime.g.variants-buildup.stages.ear.earless-corner] +[prime.g.variants-buildup.stages.ear.top-cut] rank = 3 +nonBreakingVariantAdditionPriority = 100 +descriptionAffix = "a diagonal cut at top" +selectorAffix.g = "topCut" +selectorAffix."g/sansSerif" = "topCut" +selectorAffix."g/hookTopBase" = "serifless" +selectorAffix."g/singleStorey/autoSerifed/slab" = "topCut" +selectorAffix."g/singleStorey/autoSerifed/sans" = "topCut" +selectorAffix.gScript = "topCut" + +[prime.g.variants-buildup.stages.ear.earless-corner] +rank = 4 descriptionAffix = "earless (cornered top-right)" selectorAffix.g = "earlessCorner" selectorAffix."g/sansSerif" = "earlessCorner" selectorAffix."g/hookTopBase" = "earlessCornerHTB" selectorAffix."g/singleStorey/autoSerifed/slab" = "earlessCorner" selectorAffix."g/singleStorey/autoSerifed/sans" = "earlessCorner" -selectorAffix.gScript = "scriptCut" +selectorAffix.gScript = "topCut" [prime.g.variants-buildup.stages.ear.earless-rounded] -rank = 4 +rank = 5 descriptionAffix = "earless (rounded top-right)" selectorAffix.g = "earlessRounded" selectorAffix."g/sansSerif" = "earlessRounded" selectorAffix."g/hookTopBase" = "serifless" selectorAffix."g/singleStorey/autoSerifed/slab" = "earlessRounded" selectorAffix."g/singleStorey/autoSerifed/sans" = "earlessRounded" -selectorAffix.gScript = "scriptCut" +selectorAffix.gScript = "topCut" @@ -3954,8 +3987,18 @@ selectorAffix."q/hookTopBase" = "" selectorAffix.qRTail = "" selectorAffix.gha = "" -[prime.q.variants-buildup.stages.body.earless-corner] +[prime.q.variants-buildup.stages.body.top-cut] rank = 2 +nonBreakingVariantAdditionPriority = 100 +descriptionAffix = "a diagonal cut at top" +selectorAffix.q = "topCut" +selectorAffix."q/sansSerif" = "topCut" +selectorAffix."q/hookTopBase" = "" +selectorAffix.qRTail = "topCut" +selectorAffix.gha = "" + +[prime.q.variants-buildup.stages.body.earless-corner] +rank = 3 descriptionAffix = "earless (cornered) shape" selectorAffix.q = "earlessCorner" selectorAffix."q/sansSerif" = "earlessCorner" @@ -3964,7 +4007,7 @@ selectorAffix.qRTail = "earlessCorner" selectorAffix.gha = "" [prime.q.variants-buildup.stages.body.earless-rounded] -rank = 3 +rank = 4 descriptionAffix = "earless (rounded) shape" selectorAffix.q = "earlessRounded" selectorAffix."q/sansSerif" = "earlessRounded" @@ -5492,14 +5535,21 @@ keyAffix = "" selectorAffix."grek/alpha" = "" selectorAffix."grek/alpha/sansSerif" = "" -[prime.lower-alpha.variants-buildup.stages.ear.earless-corner] +[prime.lower-alpha.variants-buildup.stages.ear.top-cut] rank = 2 +nonBreakingVariantAdditionPriority = 100 +descriptionAffix = "a diagonal cut at top" +selectorAffix."grek/alpha" = "topCut" +selectorAffix."grek/alpha/sansSerif" = "topCut" + +[prime.lower-alpha.variants-buildup.stages.ear.earless-corner] +rank = 3 descriptionAffix = "earless (cornered top-right)" selectorAffix."grek/alpha" = "earlessCorner" selectorAffix."grek/alpha/sansSerif" = "earlessCorner" [prime.lower-alpha.variants-buildup.stages.ear.earless-rounded] -rank = 3 +rank = 4 descriptionAffix = "earless (rounded top-right)" selectorAffix."grek/alpha" = "earlessRounded" selectorAffix."grek/alpha/sansSerif" = "earlessRounded" @@ -6266,14 +6316,21 @@ keyAffix = "" selectorAffix."cyrl/a" = "" selectorAffix."cyrl/ae/a" = "" -[prime.cyrl-a.variants-buildup.stages.ear.earless-corner] +[prime.cyrl-a.variants-buildup.stages.ear.top-cut] rank = 2 +nonBreakingVariantAdditionPriority = 100 +descriptionAffix = "a diagonal cut at top" +selectorAffix."cyrl/a" = "topCut" +selectorAffix."cyrl/ae/a" = "" + +[prime.cyrl-a.variants-buildup.stages.ear.earless-corner] +rank = 3 descriptionAffix = "earless (cornered top-right)" selectorAffix."cyrl/a" = "earlessCorner" selectorAffix."cyrl/ae/a" = "" [prime.cyrl-a.variants-buildup.stages.ear.earless-rounded] -rank = 3 +rank = 4 descriptionAffix = "earless (rounded top-right)" selectorAffix."cyrl/a" = "earlessRounded" selectorAffix."cyrl/ae/a" = "" @@ -9202,6 +9259,7 @@ i = "serifed" j = "serifed" k = "symmetric-touching-serifless" l = "serifed" +q = "top-cut-straight-serifless" t = "bent-hook-short-neck" u = "toothed-serifless" y = "straight-turn-serifless" @@ -9243,9 +9301,9 @@ question = "corner-flat-hooked" micro-sign = "tailed-serifless" [composite.ss03.italic] -a = "single-storey-serifless" +a = "single-storey-top-cut-serifless" f = "flat-hook-tailed" -g = "single-storey-serifless" +g = "single-storey-top-cut" i = "tailed-serifed" k = "cursive-serifless" l = "tailed" @@ -9253,7 +9311,7 @@ long-s = "flat-hook-descending" eszet = "longs-s-lig-descending-serifless" lower-beta = "cursive" lower-phi = "cursive" -cyrl-a = "single-storey-serifless" +cyrl-a = "single-storey-top-cut-serifless" cyrl-ve = "cursive-tall" cyrl-zhe = "symmetric-connected" cyrl-ka = "symmetric-connected-serifless" @@ -9270,6 +9328,7 @@ b = "toothless-corner-serifed" d = "toothed-serifed" f = "flat-hook-serifed" k = "symmetric-touching-serifed" +q = "top-cut-straight-serifed" u = "toothed-serifed" x = "straight-serifed" y = "straight-turn-serifed" @@ -9291,7 +9350,7 @@ seven = "straight-serifed" micro-sign = "tailed-serifed" [composite.ss03.slab-override.italic] -a = "single-storey-serifed" +a = "single-storey-top-cut-serifed" f = "flat-hook-tailed" k = "cursive-top-left-and-bottom-right-serifed" l = "tailed-serifed" @@ -9300,7 +9359,7 @@ x = "straight-bilateral-motion-serifed" y = "straight-turn-motion-serifed" long-s = "flat-hook-descending" eszet = "longs-s-lig-descending-serifless" -cyrl-a = "single-storey-serifed" +cyrl-a = "single-storey-top-cut-serifed" cyrl-ve = "cursive-tall" cyrl-ka = "symmetric-connected-top-left-and-bottom-right-serifed" cyrl-u = "straight-turn-motion-serifed" @@ -9976,12 +10035,14 @@ capital-k = "symmetric-touching-serifless" capital-q = "crossing" capital-w = "straight-vertical-sides-serifless" a = "double-storey-toothless-corner" +b = "toothed-serifless" f = "flat-hook-serifless" g = "single-storey-flat-hook-serifless" i = "hooky" j = "flat-hook-serifed" k = "symmetric-connected-serifless" l = "hooky" +q = "straight-serifless" t = "flat-hook" w = "rounded-vertical-sides-serifless" y = "cursive-flat-hook-serifless" @@ -10012,11 +10073,14 @@ micro-sign = "toothless-rounded-serifless" [composite.ss10.italic] capital-a = "straight-serifless" -a = "single-storey-tailed" +a = "single-storey-top-cut-tailed" +b = "bottom-cut-serifless" +g = "single-storey-flat-hook-top-cut" i = "serifed-flat-tailed" j = "serifed" l = "serifed-flat-tailed" -cyrl-a = "single-storey-tailed" +q = "top-cut-straight-serifless" +cyrl-a = "single-storey-top-cut-tailed" cyrl-u = "cursive-flat-hook-serifless" [composite.ss10.slab-override.design] @@ -10024,11 +10088,13 @@ capital-a = "round-top-base-serifed" capital-j = "serifed" capital-k = "symmetric-touching-serifed" capital-w = "straight-vertical-sides-serifed" +b = "toothed-serifed" f = "flat-hook-serifed" g = "single-storey-flat-hook-serifed" i = "serifed" k = "symmetric-connected-serifed" l = "serifed" +q = "straight-serifed" w = "rounded-vertical-sides-serifed" x = "straight-serifed" y = "cursive-flat-hook-serifed" @@ -10044,10 +10110,12 @@ micro-sign = "toothless-rounded-serifed" [composite.ss10.slab-override.italic] capital-a = "straight-base-serifed" -g = "single-storey-flat-hook-serifless" +b = "bottom-cut-serifed" +g = "single-storey-flat-hook-top-cut" i = "serifed-flat-tailed" k = "symmetric-connected-top-left-and-bottom-right-serifed" l = "serifed-flat-tailed" +q = "top-cut-straight-serifed" w = "rounded-vertical-sides-motion-serifed" x = "straight-bilateral-motion-serifed" y = "cursive-flat-hook-motion-serifed" From 3aa42b245fb49db638859e8d24f847a6904165d7 Mon Sep 17 00:00:00 2001 From: John McWilliams Date: Sat, 4 Jan 2025 11:03:02 -0500 Subject: [PATCH 2/2] Bump. --- changes/{32.3.2.md => 32.4.0.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename changes/{32.3.2.md => 32.4.0.md} (73%) diff --git a/changes/32.3.2.md b/changes/32.4.0.md similarity index 73% rename from changes/32.3.2.md rename to changes/32.4.0.md index ab278377f4..cebe1adde7 100644 --- a/changes/32.3.2.md +++ b/changes/32.4.0.md @@ -2,4 +2,4 @@ * Add `top-cut` variants for `a`/`g`/`q`. * Add `bottom-cut` variants for `b`. * Add characters: - - CURVED STEM PARAGRAPH SIGN ORNAMENT (`U+2761`). \ No newline at end of file + - CURVED STEM PARAGRAPH SIGN ORNAMENT (`U+2761`).