From b67d00018049e12734cd25c533f141703a5d98c2 Mon Sep 17 00:00:00 2001 From: John McWilliams <37010132+jmcwilliams403@users.noreply.github.com> Date: Sat, 18 Nov 2023 15:20:56 -0500 Subject: [PATCH] Improve serifs of three `k`-derived characters. (#2094) * Improve serifs of three `k`-derived characters. * retarget --- changes/28.0.0-alpha.2.md | 3 + font-src/glyphs/letter/latin/k.ptl | 107 +++++++++++++++++------------ params/variants.toml | 28 ++++---- 3 files changed, 80 insertions(+), 58 deletions(-) create mode 100644 changes/28.0.0-alpha.2.md diff --git a/changes/28.0.0-alpha.2.md b/changes/28.0.0-alpha.2.md new file mode 100644 index 000000000..2836e539c --- /dev/null +++ b/changes/28.0.0-alpha.2.md @@ -0,0 +1,3 @@ +* Improve serifs for turned k (`U+029E`) to match `q` and turned h (`U+0265`). +* Improve top-left serif for LATIN SMALL LETTER KRA (`U+0138`) to match `k`. +* Make Greek Kappa (`U+03BA`) respond to more serif variants for `k` (`cv36`). diff --git a/font-src/glyphs/letter/latin/k.ptl b/font-src/glyphs/letter/latin/k.ptl index a8fc718a6..20acd1e2a 100644 --- a/font-src/glyphs/letter/latin/k.ptl +++ b/font-src/glyphs/letter/latin/k.ptl @@ -325,8 +325,8 @@ glyph-block Letter-Latin-K : begin DiagTail.F 1 xDTEnd 0 dtInnerRadius tailAngle (Hook + swDiagTail / 4) swDiagTail CursiveLoopT spiro-outline (-O) left right stroke top slabLT slabLegs - define [KHookTopBar slabLegs straightBar] : TopHook.lBarInner - x -- SB + [KBalance slabLegs straightBar] + define [KHookTopBar xBarLeft] : TopHook.lBarInner + x -- xBarLeft yBot -- 0 yTop -- Ascender @@ -352,19 +352,21 @@ glyph-block Letter-Latin-K : begin serifed { 1 1 3 0 } serifedKH { 1 1 2 0 } serifed2 { 1 1 2 1 } + serifedKra { 2 1 3 0 } + serifedKappa { 2 0 3 0 } - define [UpperKLTSerif top sw slabLT straightBar] : match slabLT - 2 : HSerif.lt (SB + [KBalance slabLT straightBar]) top SideJut - 1 : HSerif.mt (SB + [KBalance slabLT straightBar] + [HSwToV : 0.5 * sw]) top Jut + define [UpperKLTSerif top sw xBarLeft slabType straightBar] : match slabType + 2 : HSerif.lt xBarLeft top SideJut + 1 : HSerif.mt (xBarLeft + [HSwToV : 0.5 * sw]) top Jut _ : glyph-proc - define [UpperKLBSerif top sw slabLT straightBar] : match slabLT - 2 : HSerif.lb (SB + [KBalance slabLT straightBar]) 0 SideJut - 1 : HSerif.mb (SB + [KBalance slabLT straightBar] + [HSwToV : 0.5 * sw]) 0 Jut + define [UpperKLBSerif top sw xBarLeft slabType straightBar] : match slabType + 2 : HSerif.lb xBarLeft 0 SideJut + 1 : HSerif.mb (xBarLeft + [HSwToV : 0.5 * sw]) 0 Jut _ : glyph-proc - define [CyrlKaVBar top slabLT straightBar] : VBar.m - SB + [KBalance slabLT straightBar] + [HSwToV : 0.5 * CyrlVbSw] + 0.7 * CyrlVbGap + define [CyrlKaVBar top xBarLeft] : VBar.m + xBarLeft + [HSwToV : 0.5 * CyrlVbSw] + 0.7 * CyrlVbGap top / 2 - [CyrlVbLength top] / 2 top / 2 + [CyrlVbLength top] / 2 Math.min [AdviceStroke 5] (CyrlVbGap * 0.5) @@ -395,12 +397,13 @@ glyph-block Letter-Latin-K : begin # Main building foreach { suffix { LegsImpl {slabLT slabLB slabLegs slabKS} } } [pairs-of UpperKConfig] : do local straightBar : LegsImpl !== KLegs.Curly + local KBarLeft : SB + [KBalance slabLT straightBar] define [KBaseShape sw top attachment] : glyph-proc - include : VBar.l (SB + [KBalance slabLT straightBar]) 0 top sw + include : VBar.l KBarLeft 0 top sw include : LegsImpl false SB RightSB sw top slabLT slabLegs attachment - if slabLT : include : UpperKLTSerif top sw slabLT straightBar - if slabLB : include : UpperKLBSerif top sw slabLT straightBar + if slabLT : include : UpperKLTSerif top sw KBarLeft slabLT straightBar + if slabLB : include : UpperKLBSerif top sw KBarLeft slabLB straightBar create-glyph "K.\(suffix)" : glyph-proc include : MarkSet.capital @@ -411,10 +414,10 @@ glyph-block Letter-Latin-K : begin include : KBaseShape Stroke CAP CyrDescender include : ExtendBelowBaseAnchors (-LongJut + 0.5 * Stroke) - create-glyph "KBar.\(suffix)" : glyph-proc + create-glyph "KStroke.\(suffix)" : glyph-proc include [refer-glyph "K.\(suffix)"] AS_BASE ALSO_METRICS include : LetterBarOverlay.l.in - x -- (SB + [KBalance slabLT straightBar]) + x -- KBarLeft bot -- XH top -- (CAP - [if slabLT Stroke 0]) space -- { 0 [mix SB RightSB 0.75] } @@ -422,7 +425,7 @@ glyph-block Letter-Latin-K : begin create-glyph "KVBar.\(suffix)" : glyph-proc include : MarkSet.capital include : KBaseShape CyrlVbSw CAP - include : CyrlKaVBar CAP slabLT straightBar + include : CyrlKaVBar CAP KBarLeft create-glyph "grek/KaiSymbol.\(suffix)" : glyph-proc include [refer-glyph "K.\(suffix)"] AS_BASE ALSO_METRICS @@ -443,15 +446,19 @@ glyph-block Letter-Latin-K : begin create-glyph "smcpKVBar.\(suffix)" : glyph-proc include : MarkSet.e include : KBaseShape CyrlVbSw XH - include : CyrlKaVBar XH slabLT straightBar + include : CyrlKaVBar XH KBarLeft create-glyph "KHookTop.\(suffix)" : glyph-proc include : MarkSet.capital - include : VBar.l (SB + [KBalance slabLT straightBar]) 0 CAP Stroke + include : VBar.l KBarLeft 0 CAP Stroke include : LegsImpl true SB RightSB Stroke CAP slabLT slabLegs eject-contour 'serifRT' - if slabLT : include : UpperKLTSerif CAP Stroke slabLT straightBar - if slabLB : include : UpperKLBSerif CAP Stroke slabLT straightBar + if slabLT : include : UpperKLTSerif CAP Stroke KBarLeft slabLT straightBar + if slabLB : include : UpperKLBSerif CAP Stroke KBarLeft slabLB straightBar + + turned "turnK.\(suffix)" nothing "K.\(suffix)" Middle (CAP / 2) + + turned "smcpTurnK.\(suffix)" nothing "smcpK.\(suffix)" Middle (XH / 2) define [BashkirKaShape df top] : glyph-proc local left : if slabLT ([mix SB RightSB 0.35] - [HSwToV : 0.5 * df.mvs]) [mix SB RightSB 0.2] @@ -479,11 +486,11 @@ glyph-block Letter-Latin-K : begin define LowerKConfig : SuffixCfg.weave object # body - straight KLegs.Straight - curly KLegs.Curly - cursive KLegs.Cursive - cursiveTailed KLegs.CursiveTailed - symmetricTouching [KLegs.Symmetric 0] + straight KLegs.Straight + curly KLegs.Curly + cursive KLegs.Cursive + cursiveTailed KLegs.CursiveTailed + symmetricTouching [KLegs.Symmetric 0] symmetricConnected [KLegs.Symmetric : AdviceStroke 6] object # serifs serifless { 0 0 0 } @@ -494,14 +501,15 @@ glyph-block Letter-Latin-K : begin foreach { suffix { LegsImpl {slabLT slabLB slabLegs} } } [pairs-of LowerKConfig] : do local straightBar : LegsImpl !== KLegs.Curly + local kBarLeft : SB + [KBalance slabLT straightBar] define [kBaseShape attachment] : glyph-proc - include : LeaningAnchor.Above.VBar.l (SB + [KBalance slabLT straightBar]) - include : VBar.l (SB + [KBalance slabLT straightBar]) 0 Ascender + include : LeaningAnchor.Above.VBar.l kBarLeft + include : VBar.l kBarLeft 0 Ascender include : LegsImpl false SB RightSB Stroke XH slabLT slabLegs attachment - if slabLT : include : HSerif.lt (SB + [KBalance slabLT straightBar]) Ascender SideJut + if slabLT : include : HSerif.lt kBarLeft Ascender SideJut if slabLB : include : tagged 'serifLB' - HSerif.mb (SB + [KBalance slabLT straightBar] + [HSwToV HalfStroke]) 0 Jut + HSerif.mb (kBarLeft + [HSwToV HalfStroke]) 0 Jut create-glyph "k.\(suffix)" : glyph-proc include : MarkSet.b @@ -517,26 +525,38 @@ glyph-block Letter-Latin-K : begin include : kBaseShape PalatalHook include : ExtendBelowBaseAnchors Descender - create-glyph "kBar.\(suffix)" : glyph-proc + create-glyph "kStroke.\(suffix)" : glyph-proc include [refer-glyph "k.\(suffix)"] AS_BASE ALSO_METRICS include : LetterBarOverlay.l.in - x -- (SB + [KBalance slabLT straightBar]) + x -- kBarLeft bot -- XH top -- (Ascender - [if slabLT Stroke 0]) create-glyph "kHookTop.\(suffix)" : glyph-proc include : MarkSet.b include : LegsImpl false SB RightSB Stroke XH slabLT slabLegs - include : KHookTopBar slabLT straightBar + include : KHookTopBar kBarLeft if slabLB : include : tagged 'serifLB' - HSerif.mb (SB + [KBalance slabLT straightBar] + [HSwToV HalfStroke]) 0 Jut + HSerif.mb (kBarLeft + [HSwToV HalfStroke]) 0 Jut + + create-glyph "turnk.\(suffix)" : glyph-proc + include : VBar.l kBarLeft 0 Ascender + include : LegsImpl false SB RightSB Stroke XH slabLT slabLegs + if slabLT : include : tagged 'serifLT' : union + HSerif.lt (kBarLeft + [HSwToV HalfStroke]) Ascender Jut + HSerif.rt (kBarLeft + [HSwToV HalfStroke]) Ascender MidJutSide + if slabLB : include : tagged 'serifLB' + HSerif.lb kBarLeft 0 SideJut + include : FlipAround Middle (XH / 2) + include : MarkSet.p + include : LeaningAnchor.Below.VBar.r (RightSB - [KBalance slabLT straightBar]) select-variant 'K' 'K' link-reduced-variant 'K/sansSerif' 'K' MathSansSerif alias 'grek/Kappa' 0x39A 'K' alias-reduced-variant 'grek/Kappa/sansSerif' 'grek/Kappa' 'K/sansSerif' MathSansSerif - select-variant 'KBar' 0xA740 (follow -- 'K') - select-variant 'cyrl/KaStroke' 0x49E (shapeFrom -- 'KBar') (follow -- 'cyrl/Ka') + select-variant 'KStroke' 0xA740 (follow -- 'K') + select-variant 'cyrl/KaStroke' 0x49E (shapeFrom -- 'KStroke') (follow -- 'cyrl/Ka') select-variant 'KDescender' 0x2C69 select-variant 'cyrl/Ka' 0x41A 'K' (shapeFrom -- 'K') (follow -- 'cyrl/Ka') select-variant 'cyrl/KaDescender' 0x49A (shapeFrom -- 'KDescender') @@ -544,18 +564,17 @@ glyph-block Letter-Latin-K : begin select-variant 'cyrl/KaHook' 0x4C3 (shapeFrom -- 'K') (follow -- 'cyrl/KaHook') select-variant 'k' 'k' - select-variant 'k/nonCursive' (shapeFrom -- 'k') link-reduced-variant 'k/sansSerif' 'k' MathSansSerif select-variant 'kDescender' 0x2C6A select-variant 'kPalatalHook' 0x1D84 (follow -- 'kDescender') - select-variant 'kBar' 0xA741 (follow -- 'k') - select-variant 'cyrl/kaStroke' 0x49F (shapeFrom -- 'kBar') (follow -- 'cyrl/ka') + select-variant 'kStroke' 0xA741 (follow -- 'k') + select-variant 'cyrl/kaStroke' 0x49F (shapeFrom -- 'kStroke') (follow -- 'cyrl/ka') select-variant 'grek/kappa' 0x3BA (shapeFrom -- 'smcpK') link-reduced-variant 'grek/kappa/sansSerif' 'grek/kappa' MathSansSerif (shapeFrom -- 'smcpK') select-variant 'smcpK' 0x1D0B (follow -- 'K') - select-variant 'latn/kappa' 0x138 (shapeFrom -- 'smcpK') (follow -- 'k/nonCursive') + select-variant 'latn/kappa' 0x138 (shapeFrom -- 'smcpK') select-variant 'cyrl/ka' 0x43A (shapeFrom -- 'smcpK') select-variant 'cyrl/kaDescender' 0x49B (shapeFrom -- 'smcpKDescender') select-variant 'cyrl/ka.BGR' (shapeFrom -- 'k') (follow -- 'cyrl/ka') @@ -569,12 +588,12 @@ glyph-block Letter-Latin-K : begin derive-composites 'cyrl/kaAleut' 0x51F 'cyrl/ka' 'aleutSlashOver' derive-composites 'KLegStroke' 0xA742 'K' 'legSlashOver' derive-composites 'kLegStroke' 0xA743 'k' 'legSlashOver' - derive-composites 'KBarLegStroke' 0xA744 'KBar' 'legSlashOver' - derive-composites 'kBarLegStroke' 0xA745 'kBar' 'legSlashOver' + derive-composites 'KStrokeLegStroke' 0xA744 'KStroke' 'legSlashOver' + derive-composites 'kStrokeLegStroke' 0xA745 'kStroke' 'legSlashOver' - turned 'turnK' 0xA7B0 'K' Middle (CAP / 2) - turned 'turnk' 0x29E 'k' Middle (XH / 2) [MarkSet.p] - turned 'turnSmcpK' 0x1DF10 'smcpK' Middle (XH / 2) + select-variant 'turnK' 0xA7B0 (follow -- 'K') + select-variant 'turnk' 0x29E (follow -- 'k') + select-variant 'smcpTurnK' 0x1DF10 (follow -- 'K') select-variant 'cyrl/BashkirUpperKa' 0x4A0 (follow -- 'cyrl/Ka') select-variant 'cyrl/BashkirKa' 0x4A1 (follow -- 'cyrl/ka') diff --git a/params/variants.toml b/params/variants.toml index eabe56b94..cb18017cf 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -2473,7 +2473,7 @@ rank = 1 descriptionAffix = "standard shape" selectorAffix.k = "straight" selectorAffix."k/sansSerif" = "straight" -selectorAffix."k/nonCursive" = "straight" +selectorAffix."latn/kappa" = "straight" selectorAffix.kHookTop = "straight" selectorAffix.kDescender = "straight" selectorAffix."grek/kappa" = "straight" @@ -2484,7 +2484,7 @@ rank = 2 descriptionAffix = "curly shape" selectorAffix.k = "curly" selectorAffix."k/sansSerif" = "curly" -selectorAffix."k/nonCursive" = "curly" +selectorAffix."latn/kappa" = "curly" selectorAffix.kHookTop = "curly" selectorAffix.kDescender = "curly" selectorAffix."grek/kappa" = "curly" @@ -2495,7 +2495,7 @@ rank = 3 descriptionAffix = "symmetric legs touching the vertical bar" selectorAffix.k = "symmetricTouching" selectorAffix."k/sansSerif" = "symmetricTouching" -selectorAffix."k/nonCursive" = "symmetricTouching" +selectorAffix."latn/kappa" = "symmetricTouching" selectorAffix.kHookTop = "symmetricTouching" selectorAffix.kDescender = "symmetricTouching" selectorAffix."grek/kappa" = "symmetricTouching" @@ -2506,7 +2506,7 @@ rank = 4 descriptionAffix = "symmetric legs connected to the vertical bar" selectorAffix.k = "symmetricConnected" selectorAffix."k/sansSerif" = "symmetricConnected" -selectorAffix."k/nonCursive" = "symmetricConnected" +selectorAffix."latn/kappa" = "symmetricConnected" selectorAffix.kHookTop = "symmetricConnected" selectorAffix.kDescender = "symmetricConnected" selectorAffix."grek/kappa" = "symmetricConnected" @@ -2517,7 +2517,7 @@ rank = 5 descriptionAffix = "cursive loop" selectorAffix.k = "cursive" selectorAffix."k/sansSerif" = "cursive" -selectorAffix."k/nonCursive" = "straight" +selectorAffix."latn/kappa" = "straight" selectorAffix.kHookTop = "cursive" selectorAffix.kDescender = "cursive" selectorAffix."grek/kappa" = "straight" @@ -2528,7 +2528,7 @@ rank = 6 descriptionAffix = "cursive loop plus diagonal tail" selectorAffix.k = "cursiveTailed" selectorAffix."k/sansSerif" = "cursiveTailed" -selectorAffix."k/nonCursive" = "straight" +selectorAffix."latn/kappa" = "straight" selectorAffix.kHookTop = "cursiveTailed" selectorAffix.kDescender = "cursive" selectorAffix."grek/kappa" = "straight" @@ -2540,7 +2540,7 @@ descriptionAffix = "serifs" descriptionJoiner = "without" selectorAffix.k = "serifless" selectorAffix."k/sansSerif" = "serifless" -selectorAffix."k/nonCursive" = "serifless" +selectorAffix."latn/kappa" = "serifless" selectorAffix.kHookTop = "serifless" selectorAffix.kDescender = "serifless" selectorAffix."grek/kappa" = "serifless" @@ -2551,7 +2551,7 @@ rank = 2 descriptionAffix = "serifs at top left" selectorAffix.k = "topLeftSerifed" selectorAffix."k/sansSerif" = "serifless" -selectorAffix."k/nonCursive" = "topLeftSerifed" +selectorAffix."latn/kappa" = "topLeftSerifed" selectorAffix.kHookTop = "serifless" selectorAffix.kDescender = "topLeftSerifed" selectorAffix."grek/kappa" = "topLeftSerifed" @@ -2563,10 +2563,10 @@ disableIf = [ { body = "diagonal-tailed-cursive" } ] descriptionAffix = "serifs at bottom right" selectorAffix.k = "bottomRightSerifed" selectorAffix."k/sansSerif" = "serifless" -selectorAffix."k/nonCursive" = "bottomRightSerifed" +selectorAffix."latn/kappa" = "bottomRightSerifed" selectorAffix.kHookTop = "bottomRightSerifed" selectorAffix.kDescender = "serifless" -selectorAffix."grek/kappa" = "serifless" +selectorAffix."grek/kappa" = "bottomRightSerifed" selectorAffix."grek/kappa/sansSerif" = "serifless" [prime.k.variants-buildup.stages.serifs.top-left-and-bottom-right-serifed] @@ -2575,10 +2575,10 @@ disableIf = [ { body = "diagonal-tailed-cursive" } ] descriptionAffix = "serifs at top left and bottom right" selectorAffix.k = "topLeftAndBottomRightSerifed" selectorAffix."k/sansSerif" = "serifless" -selectorAffix."k/nonCursive" = "topLeftAndBottomRightSerifed" +selectorAffix."latn/kappa" = "topLeftAndBottomRightSerifed" selectorAffix.kHookTop = "bottomRightSerifed" selectorAffix.kDescender = "topLeftSerifed" -selectorAffix."grek/kappa" = "topLeftSerifed" +selectorAffix."grek/kappa" = "topLeftAndBottomRightSerifed" selectorAffix."grek/kappa/sansSerif" = "serifless" [prime.k.variants-buildup.stages.serifs.serifed] @@ -2587,10 +2587,10 @@ disableIf = [ { body = "diagonal-tailed-cursive" } ] descriptionAffix = "serifs" selectorAffix.k = "serifed" selectorAffix."k/sansSerif" = "serifless" -selectorAffix."k/nonCursive" = "serifed" +selectorAffix."latn/kappa" = "serifedKra" selectorAffix.kHookTop = "serifed" selectorAffix.kDescender = "serifed" -selectorAffix."grek/kappa" = "topLeftSerifed" +selectorAffix."grek/kappa" = "serifedKappa" selectorAffix."grek/kappa/sansSerif" = "serifless"