From 942c149a275af8f7e888662774ac61fe154a42fe Mon Sep 17 00:00:00 2001 From: John McWilliams <37010132+jmcwilliams403@users.noreply.github.com> Date: Mon, 6 May 2024 21:38:26 -0400 Subject: [PATCH] Add five letters with palatal hook. (#2328) * Add five letters with palatal hook. * fix EngHook sw * Actually fix EngHook sw --- changes/30.0.1.md | 2 + .../font-glyphs/src/letter/latin-ext/ezh.ptl | 117 ++++++++++-------- .../font-glyphs/src/letter/latin/lower-il.ptl | 2 + .../font-glyphs/src/letter/latin/lower-n.ptl | 16 +++ .../font-glyphs/src/letter/latin/lower-r.ptl | 15 +++ packages/font-glyphs/src/letter/shared.ptl | 1 + packages/font-glyphs/src/number/3.ptl | 8 +- 7 files changed, 108 insertions(+), 53 deletions(-) diff --git a/changes/30.0.1.md b/changes/30.0.1.md index ed1f8436f..0ac5e322f 100644 --- a/changes/30.0.1.md +++ b/changes/30.0.1.md @@ -1,4 +1,6 @@ * Add characters: + - LATIN SMALL LETTER L WITH BELT AND PALATAL HOOK (`U+1DF13`) ... LATIN SMALL LETTER R WITH FISHHOOK AND PALATAL HOOK (`U+1DF16`). + - LATIN SMALL LETTER EZH WITH PALATAL HOOK (`U+1DF18`). - LATIN SMALL LETTER I WITH STROKE AND RETROFLEX HOOK (`U+1DF1A`). - LATIN SMALL LETTER O WITH RETROFLEX HOOK (`U+1DF1B`). - LATIN SMALL LETTER C WITH RETROFLEX HOOK (`U+1DF1D`). diff --git a/packages/font-glyphs/src/letter/latin-ext/ezh.ptl b/packages/font-glyphs/src/letter/latin-ext/ezh.ptl index 6317422e9..8df0373ea 100644 --- a/packages/font-glyphs/src/letter/latin-ext/ezh.ptl +++ b/packages/font-glyphs/src/letter/latin-ext/ezh.ptl @@ -8,67 +8,68 @@ glyph-module glyph-block Letter-Latin-Ezh : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives - glyph-block-import Letter-Shared-Shapes : CurlyTail SerifedArcEnd RetroflexHook + glyph-block-import Letter-Shared-Shapes : CurlyTail SerifedArcEnd PalatalHook RetroflexHook - define [StdTerminalShape top bot yMidBar] : begin + define [StdTerminalShape df top bot yMidBar sw] : begin local hookDepth : Hook * (top - bot) / [fallback para.cap0 CAP] local pArc : SmallArchDepthB / (SmallArchDepthA + SmallArchDepthB) list - g4 (RightSB - OX) [mix yMidBar bot pArc] + g4 (df.rightSB - OX) [mix yMidBar bot pArc] hookend bot - g4 SB (bot + hookDepth) + g4 df.leftSB (bot + hookDepth) - define [HooklessTerminalShape p] : function [top bot yMidBar] : list - g4.down.mid (RightSB - OX) [mix yMidBar bot p] [heading Downward] + define [HooklessTerminalShape p] : function [df top bot yMidBar sw] : list + g4.down.mid (df.rightSB - OX) [mix yMidBar bot p] [heading Downward] - define [RetroflexConnectionTerminal top bot yMidBar] : begin + define [RetroflexConnectionTerminal df top bot yMidBar sw] : begin local hookDepth : Hook * (top - bot) / [fallback para.cap0 CAP] local pArc : SmallArchDepthB / (SmallArchDepthA + SmallArchDepthB) list - g4 (RightSB - OX) [mix yMidBar bot pArc] - SerifedArcEnd.RtlRhs SB Middle bot Stroke hookDepth + g4 (df.rightSB - OX) [mix yMidBar bot pArc] + SerifedArcEnd.RtlRhs df.leftSB df.middle bot sw hookDepth - define [ConventionalStart top bot ezhLeft ezhRight yMidBar] : glyph-proc - include : HBar.t SB ezhRight top + define [ConventionalStart df top bot ezhLeft ezhRight yMidBar sw] : glyph-proc + include : HBar.t df.leftSB ezhRight top sw include : dispiro - corner ezhRight (top - Stroke) [widths.rhs (Stroke / HVContrast)] - corner ezhLeft yMidBar [widths.lhs (Stroke / HVContrast)] + corner ezhRight (top - sw) [widths.rhs (sw / HVContrast)] + corner ezhLeft yMidBar [widths.lhs (sw / HVContrast)] - define [CurisveStart top bot ezhLeft ezhRight yMidBar] : glyph-proc - define hookTerminalWidth : AdviceStroke 3.5 - define xDiagWidth : 1 * Stroke - define yFootHeight : [Math.max (0.15 * (top - bot)) (Stroke * 0.625)] + 0.4 * Stroke - define yHookDepth : Hook + Stroke * 0.25 - define yHookStraightDepth : Math.min (yHookDepth - Stroke * 1.1) (yHookDepth / 3 - Stroke / 4) - define xHookDepth : Math.max (0.25 * (RightSB - SB)) (hookTerminalWidth * 1.5) - define xMockTailDepth : Math.max (0.375 * (RightSB - SB)) (hookTerminalWidth * 1.375) + define [CurisveStart df top bot ezhLeft ezhRight yMidBar sw] : glyph-proc + define hookTerminalWidth : [AdviceStroke 3.5] / Stroke * sw + define xDiagWidth : 1 * sw + define yFootHeight : [Math.max (0.15 * (top - bot)) (sw * 0.625)] + 0.4 * sw + define yHookDepth : Hook + sw * 0.25 + define yHookStraightDepth : Math.min (yHookDepth - sw * 1.1) (yHookDepth / 3 - sw / 4) + define xHookDepth : Math.max (0.25 * (df.rightSB - df.leftSB)) (hookTerminalWidth * 1.5) + define xMockTailDepth : Math.max (0.375 * (df.rightSB - df.leftSB)) (hookTerminalWidth * 1.375) define kTop 0.625 define kBot 0.625 define yTailDepth : Hook * 0.5 include : tagged 'strokeTop' : intersection spiro-outline - corner (-Width) bot - corner (-Width) (2 * top) + corner (-df.width) bot + corner (-df.width) (2 * top) corner (ezhRight - xDiagWidth + 0.1) (2 * top) corner (ezhRight - xDiagWidth + 0.1) (top - yFootHeight) corner (ezhLeft + xDiagWidth) yMidBar corner (ezhLeft + xDiagWidth) bot dispiro - flat (SB + OX) (top - yHookDepth) [widths.rhs.heading hookTerminalWidth Upward] - curl (SB + OX) (top - yHookDepth + yHookStraightDepth) [heading Upward] + flat (df.leftSB + OX) (top - yHookDepth) [widths.rhs.heading hookTerminalWidth Upward] + curl (df.leftSB + OX) (top - yHookDepth + yHookStraightDepth) [heading Upward] arcvh - g2.right.mid (SB + xHookDepth) (top - O) [widths.rhs.heading Stroke Rightward] - flat [mix (SB + xMockTailDepth) ezhRight kTop] (top - kTop * yTailDepth) - curl [mix (SB + xMockTailDepth) ezhRight 4] (top - 4 * yTailDepth) + g2.right.mid (df.leftSB + xHookDepth) (top - O) [widths.rhs.heading sw Rightward] + flat [mix (df.leftSB + xMockTailDepth) ezhRight kTop] (top - kTop * yTailDepth) + curl [mix (df.leftSB + xMockTailDepth) ezhRight 4] (top - 4 * yTailDepth) include : VBar.r ezhRight top (top - yFootHeight) (xDiagWidth / HVContrast) include : dispiro - corner ezhRight (top - yFootHeight) [widths.rhs (Stroke / HVContrast)] - corner ezhLeft yMidBar [widths.lhs (Stroke / HVContrast)] + corner ezhRight (top - yFootHeight) [widths.rhs (sw / HVContrast)] + corner ezhLeft yMidBar [widths.lhs (sw / HVContrast)] glyph-block-export EzhShape define flex-params [EzhShape] : glyph-proc + local-parameter : df local-parameter : top local-parameter : bot local-parameter : pLeft -- 0.2 @@ -76,23 +77,24 @@ glyph-block Letter-Latin-Ezh : begin local-parameter : terminalShape -- StdTerminalShape local-parameter : isCursive -- false local-parameter : isSerifed -- SLAB + local-parameter : sw -- Stroke - local yMidBar : [mix bot top [if isCursive 0.5 0.55]] + HalfStroke - local ezhLeft : mix SB RightSB pLeft - local ezhRight : mix SB RightSB pRight + local yMidBar : [mix bot top [if isCursive 0.5 0.55]] + 0.5 * sw + local ezhLeft : mix df.leftSB df.rightSB pLeft + local ezhRight : mix df.leftSB df.rightSB pRight include : union if isCursive - CurisveStart top bot ezhLeft ezhRight yMidBar - ConventionalStart top bot ezhLeft ezhRight yMidBar + CurisveStart df top bot ezhLeft ezhRight yMidBar sw + ConventionalStart df top bot ezhLeft ezhRight yMidBar sw dispiro - widths.rhs + widths.rhs sw flat ezhLeft yMidBar [heading Rightward] - curl (Middle - CorrectionOMidS) yMidBar + curl (df.middle - CorrectionOMidS) yMidBar archv - terminalShape top bot yMidBar + terminalShape df top bot yMidBar sw - if isSerifed : include : VSerif.dl SB top VJut + if isSerifed : include : VSerif.dl df.leftSB top VJut (sw / Stroke * VJutStroke) return : object yMidBar @@ -104,20 +106,20 @@ glyph-block Letter-Latin-Ezh : begin foreach { suffix { isCursive isSerifed } } [pairs-of EzhConfig] : do create-glyph "Ezh.\(suffix)" : glyph-proc include : MarkSet.capital - include : EzhShape CAP 0 (isCursive -- isCursive) (isSerifed -- isSerifed) + include : EzhShape [DivFrame 1] CAP 0 (isCursive -- isCursive) (isSerifed -- isSerifed) create-glyph "smcpEzh.\(suffix)" : glyph-proc include : MarkSet.e - include : EzhShape XH 0 (isCursive -- isCursive) (isSerifed -- isSerifed) + include : EzhShape [DivFrame 1] XH 0 (isCursive -- isCursive) (isSerifed -- isSerifed) create-glyph "ezh.\(suffix)" : glyph-proc include : MarkSet.p - include : EzhShape XH Descender (isCursive -- isCursive) (isSerifed -- isSerifed) + include : EzhShape [DivFrame 1] XH Descender (isCursive -- isCursive) (isSerifed -- isSerifed) create-glyph "ezhTail.\(suffix)" : glyph-proc include : MarkSet.p local b : mix Descender XH 0.25 - local [object yMidBar] : include : EzhShape XH b + local [object yMidBar] : include : EzhShape [DivFrame 1] XH b isCursive -- isCursive isSerifed -- isSerifed terminalShape -- [HooklessTerminalShape 0.5] @@ -137,7 +139,7 @@ glyph-block Letter-Latin-Ezh : begin create-glyph "ezhCurlyTail.\(suffix)" : glyph-proc include : MarkSet.p local p : SmallArchDepthB / (SmallArchDepthA + SmallArchDepthB) - local [object yMidBar] : include : EzhShape XH Descender + local [object yMidBar] : include : EzhShape [DivFrame 1] XH Descender isCursive -- isCursive isSerifed -- isSerifed terminalShape -- [HooklessTerminalShape p] @@ -153,12 +155,28 @@ glyph-block Letter-Latin-Ezh : begin create-glyph "ezhRetroflexHook.\(suffix)" : glyph-proc include : MarkSet.p - include : EzhShape XH 0 + include : EzhShape [DivFrame 1] XH 0 isCursive -- isCursive isSerifed -- isSerifed terminalShape -- RetroflexConnectionTerminal include : RetroflexHook.l SB 0 (yAttach -- Hook) + create-glyph "ezhPalatalHook.\(suffix)" : glyph-proc + local df : include : DivFrame para.diversityM 1 + include : df.markSet.p + local dfSub : DivFrame (0.75 * para.diversityM) 2 + local p : SmallArchDepthB / (SmallArchDepthA + SmallArchDepthB) + local [object yMidBar] : include : EzhShape dfSub XH Descender + isCursive -- isCursive + isSerifed -- isSerifed + sw -- dfSub.mvs + local y : [mix yMidBar Descender p] - 0.5 * dfSub.mvs + include : PalatalHook.r + x -- df.rightSB + y -- y + xLink -- dfSub.rightSB + refSw -- dfSub.mvs + maskOut -- [intersection [MaskBelow y] [MaskLeft dfSub.rightSB]] select-variant 'Ezh' 0x1B7 select-variant 'smcpEzh' 0x1D23 (follow -- 'Ezh') @@ -166,14 +184,15 @@ glyph-block Letter-Latin-Ezh : begin select-variant 'ezhTail' 0x1BA (follow -- 'ezh') select-variant 'ezhCurlyTail' 0x293 (follow -- 'ezh') select-variant 'ezhRetroflexHook' 0x1D9A (follow -- 'ezh') + select-variant 'ezhPalatalHook' 0x1DF18 (follow -- 'ezh') - alias 'cyrl/Ezh' 0x4E0 'Ezh' - alias 'cyrl/ezh' 0x4E1 'ezh' + alias 'cyrl/abk/Dze' 0x4E0 'Ezh' + alias 'cyrl/abk/dze' 0x4E1 'ezh' # Variants for Ezh doesn't make sense for Lyogh. create-glyph 'lyogh.serifless' : glyph-proc include : MarkSet.bp - include : EzhShape XH Descender 0.4 + include : EzhShape [DivFrame 1] XH Descender 0.4 include : VBar.l SB (XH * 0.1) Ascender create-glyph 'lyogh.hooky' : glyph-proc @@ -184,7 +203,7 @@ glyph-block Letter-Latin-Ezh : begin create-glyph 'lyoghRTail.serifless' : glyph-proc include : MarkSet.b - include : EzhShape XH 0 0.4 + include : EzhShape [DivFrame 1] XH 0 0.4 include : VBar.l SB 0 Ascender include : RetroflexHook.lExt SB 0 diff --git a/packages/font-glyphs/src/letter/latin/lower-il.ptl b/packages/font-glyphs/src/letter/latin/lower-il.ptl index 1e91f1aaf..078098c34 100644 --- a/packages/font-glyphs/src/letter/latin/lower-il.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-il.ptl @@ -344,6 +344,7 @@ glyph-block Letter-Latin-Lower-I : begin select-variant 'lRTail' 0x26D (follow -- 'l/reduced/rtail') select-variant 'llWelsh' 0x1EFB (follow -- 'l') select-variant 'lPalatalHook' 0x1D85 (follow -- 'l') + select-variant 'lPalatalHook/decompress' (shapeFrom -- 'lPalatalHook') (follow -- 'l/reduced/decompress') select-variant 'lHighBar' 0xA749 (follow -- 'l') derive-composites 'lTildeOver' 0x26B 'l/reduced/decompress' 'tildeOver' @@ -356,6 +357,7 @@ glyph-block Letter-Latin-Lower-I : begin include : BeltOverlay.at 0 0 derive-composites 'lBelt' 0x26C 'l/reduced/decompress' 'lBeltOverlay' derive-composites 'lBeltRTail' 0xA78E 'lRTail/decompress' 'lBeltOverlay' + derive-composites 'lBeltPalatalHook' 0x1DF13 'lPalatalHook/decompress' 'lBeltOverlay' derive-composites 'lDot' 0x140 'lDotBase' 'LDotDot' diff --git a/packages/font-glyphs/src/letter/latin/lower-n.ptl b/packages/font-glyphs/src/letter/latin/lower-n.ptl index b479f6112..a31f907d7 100644 --- a/packages/font-glyphs/src/letter/latin/lower-n.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-n.ptl @@ -219,6 +219,21 @@ glyph-block Letter-Latin-Lower-N : begin if sLT : include : sLT [DivFrame 1] XH if sLB : include : sLB [DivFrame 1] 0 + if (!tailed) : create-glyph "engPalatalHook.\(suffix)" : glyph-proc + local df : include : DivFrame para.diversityM 1 + include : df.markSet.p + local dfSub : DivFrame (0.75 * para.diversityM) 2 + include : Body XH dfSub.leftSB dfSub.rightSB 0 dfSub.mvs + include : EngHook dfSub.rightSB 0 Descender (sw -- dfSub.mvs) + if sLT : include : sLT dfSub XH + if sLB : include : sLB dfSub 0 + include : PalatalHook.r + x -- df.rightSB + y -- 0 + xLink -- dfSub.rightSB + refSw -- dfSub.mvs + maskOut -- [intersection [MaskBelow 0] [MaskLeft dfSub.rightSB]] + if (!tailed && !sRB) : create-glyph "RInsular.\(suffix)" : glyph-proc include : MarkSet.capDesc include : LeaningAnchor.Below.VBar.l SB @@ -273,6 +288,7 @@ glyph-block Letter-Latin-Lower-N : begin select-variant 'nCurlyTail' 0x235 (follow -- 'eng') select-variant 'nCrossedTail' 0xAB3B (follow -- 'eng') select-variant 'engCrossedTail' 0xAB3C (follow -- 'eng') + select-variant 'engPalatalHook' 0x1DF14 (follow -- 'eng') select-variant 'RInsular' 0xA782 (follow -- 'eng/lTailBase') select-variant 'rInsular' 0xA783 (follow -- 'eng/lTailBase') diff --git a/packages/font-glyphs/src/letter/latin/lower-r.ptl b/packages/font-glyphs/src/letter/latin/lower-r.ptl index e0966515b..e83dcce3c 100644 --- a/packages/font-glyphs/src/letter/latin/lower-r.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-r.ptl @@ -266,6 +266,18 @@ glyph-block Letter-Latin-Lower-R : begin include : setTurnedMarks doTS XH 0 include : RetroflexHook.lExt (df.rightSB - xBar + df.leftSB) 0 + create-glyph "rTurnPalatalHook.\(suffix)" : glyph-proc + include [refer-glyph "r.\(suffix)"] AS_BASE ALSO_METRICS + eject-contour 'serifLT' + include : FlipAround df.middle (XH / 2) + include : df.markSet.e + define [object xBar setTurnedMarks] : RDim df mode + include : setTurnedMarks doTS XH 0 + include : PalatalHook.r + xLink -- (df.rightSB - xBar + df.leftSB) + x -- (df.rightSB + SideJut) + y -- 0 + create-glyph "turnrLongLeg.\(suffix)" : glyph-proc include [refer-glyph "rLongLeg.\(suffix)"] AS_BASE ALSO_METRICS include : FlipAround df.middle (XH / 2) @@ -328,3 +340,6 @@ glyph-block Letter-Latin-Lower-R : begin select-variant 'rFlap' 0x27E (shapeFrom -- 'r') CreateAccentedComposition 'rFlapTildeOver' 0x1D73 'rFlap' 'tildeOver' + + select-variant 'rTurnPalatalHook' 0x1DF15 (follow -- 'rTurnRTail') + select-variant 'rFlapPalatalHook' 0x1DF16 (shapeFrom -- 'rPalatalHook') (follow -- 'rFlap') diff --git a/packages/font-glyphs/src/letter/shared.ptl b/packages/font-glyphs/src/letter/shared.ptl index b674525d1..5f9e7bfb2 100644 --- a/packages/font-glyphs/src/letter/shared.ptl +++ b/packages/font-glyphs/src/letter/shared.ptl @@ -988,6 +988,7 @@ glyph-block Letter-Shared-Shapes : begin define [EngHook] : with-params [x yStart yEnd [sw Stroke]] : begin return : VerticalHook.r x (yEnd + Hook + 0.5 * sw) (-HookX) Hook yExtension -- [Math.max 0 (yStart - (yEnd + Hook + 0.5 * sw))] + sw -- sw # Upward hook shape glyph-block-export TopHook diff --git a/packages/font-glyphs/src/number/3.ptl b/packages/font-glyphs/src/number/3.ptl index c8b946e28..116c36813 100644 --- a/packages/font-glyphs/src/number/3.ptl +++ b/packages/font-glyphs/src/number/3.ptl @@ -38,21 +38,21 @@ glyph-block Digits-Three : begin include : ThreeShape CAP create-glyph 'three.lnum.flatTopSerifless' : glyph-proc include : MarkSet.capital - include : EzhShape CAP 0 (pLeft -- 0.25) (pRight -- 0.975) (isSerifed -- false) + include : EzhShape [DivFrame 1] CAP 0 (pLeft -- 0.25) (pRight -- 0.975) (isSerifed -- false) create-glyph 'three.lnum.flatTopSerifed' : glyph-proc include : MarkSet.capital - include : EzhShape CAP 0 (pLeft -- 0.25) (pRight -- 0.975) (isSerifed -- true) + include : EzhShape [DivFrame 1] CAP 0 (pLeft -- 0.25) (pRight -- 0.975) (isSerifed -- true) create-glyph 'three.onum.twoArcs' : glyph-proc include : OnumMarks.p include : ThreeShape CAP include : ShiftDown create-glyph 'three.onum.flatTopSerifless' : glyph-proc include : OnumMarks.p - include : EzhShape CAP 0 (pLeft -- 0.25) (pRight -- 0.975) (isSerifed -- false) + include : EzhShape [DivFrame 1] CAP 0 (pLeft -- 0.25) (pRight -- 0.975) (isSerifed -- false) include : ShiftDown create-glyph 'three.onum.flatTopSerifed' : glyph-proc include : OnumMarks.p - include : EzhShape CAP 0 (pLeft -- 0.25) (pRight -- 0.975) (isSerifed -- true) + include : EzhShape [DivFrame 1] CAP 0 (pLeft -- 0.25) (pRight -- 0.975) (isSerifed -- true) include : ShiftDown select-variant 'three.lnum' [CodeLnum '3'] (follow -- 'three')