diff --git a/changes/25.1.0.md b/changes/25.1.0.md index 3a870c744..b2cb2c655 100644 --- a/changes/25.1.0.md +++ b/changes/25.1.0.md @@ -11,6 +11,8 @@ - LONG RIGHTWARDS DOUBLE ARROW FROM BAR (`U+27FE`). - LEFTWARDS DOUBLE ARROW FROM BAR (`U+2906`). - RIGHTWARDS DOUBLE ARROW FROM BAR (`U+2907`). + - LATIN SMALL LETTER V WITH CURL (`U+2C74`) (#1857). + - LATIN SMALL LETTER E WITH NOTCH (`U+2C78`) (#1857). - LEFT DOUBLE PARENTHESIS (`U+2E28`) (#1855). - RIGHT DOUBLE PARENTHESIS (`U+2E29`) (#1855). - LATIN CAPITAL LETTER INSULAR T (`U+A786`) (#1811). diff --git a/font-src/glyphs/letter/latin/lower-e.ptl b/font-src/glyphs/letter/latin/lower-e.ptl index 1950b4044..5bd91b492 100644 --- a/font-src/glyphs/letter/latin/lower-e.ptl +++ b/font-src/glyphs/letter/latin/lower-e.ptl @@ -189,6 +189,19 @@ glyph-block Letter-Latin-Lower-E : begin g4 (RightSB + [mix (-extL) extR (11/16)]) (-depth + O) [heading Rightward] g4 (RightSB + extR) (-depth + 0.5 * O) [heading Rightward] + create-glyph "eWithNotch.\(suffix)" : glyph-proc + include : MarkSet.e + local lastKnot : include : Body [DivFrame 1] XH [AdviceStroke2 2 3 XH] + local sw : AdviceStroke 4 + local ry : Math.min (lastKnot.y - sw) (XH * 0.08) + local rx : Math.min ry + include : dispiro + g4.down.start lastKnot.x lastKnot.y [widths.rhs sw] + arcvh + g4 (lastKnot.x + rx) (lastKnot.y - ry + O) + archv + g4.up.end (lastKnot.x + rx * 2) lastKnot.y + create-glyph "eRetroflexHook.\(suffix)" : glyph-proc include : MarkSet.e local lastKnot : include : Body [DivFrame 1] XH [AdviceStroke2 2 3 XH] @@ -252,6 +265,7 @@ glyph-block Letter-Latin-Lower-E : begin select-variant 'eOgonek' 0x119 (follow -- 'e') select-variant 'eRetroflexHook' 0x1D92 (follow -- 'e') + select-variant 'eWithNotch' 0x2C78 (follow -- 'e') select-variant "Schwa/selector" (follow -- "Schwa") CreateDependentComposite 'Schwa' 0x18F "Schwa/selector" : object diff --git a/font-src/glyphs/letter/latin/v.ptl b/font-src/glyphs/letter/latin/v.ptl index 1a38ad451..56fd4f15f 100644 --- a/font-src/glyphs/letter/latin/v.ptl +++ b/font-src/glyphs/letter/latin/v.ptl @@ -131,10 +131,40 @@ glyph-block Letter-Latin-V : begin include : VBottomCapShape df fBarStraight sw include : dispiro widths.rhs sw - straight.left.start (RightSB + hookWidthOuter) (top - sw - O) - g4 (RightSB - hookWidthInner) (top - 0.5 * sw - TailY) + straight.left.start (df.rightSB + hookWidthOuter) (top - sw - O) + g4 (df.rightSB - hookWidthInner) (top - 0.5 * sw - TailY) quadControls 0.4 0.75 64 unimportant - g4 (Middle + VCornerHalfWidth * sw / Stroke) 0 [widths.rhs (VShapeFine * sw / Stroke)] + g4 (df.middle + VCornerHalfWidth * sw / Stroke) 0 [widths.rhs (VShapeFine * sw / Stroke)] + + define [VLoopShape] : with-params [df fBarStraight top [sw Stroke]] : glyph-proc + include : VShape df fBarStraight top (sw -- sw) + eject-contour 'strokeDown' + include : VBottomCapShape df fBarStraight sw + + define cornerHW : VCornerHalfWidth * (sw / Stroke) + define cornerSw : VShapeFine * sw / Stroke + define sbScale : if fBarStraight StraightSbShrink 1 + define vxStartL : df.leftSB * sbScale + define vxEndL : df.middle - cornerHW + define swLoop : AdviceStroke 4.5 + define xLoopL : mix df.leftSB vxEndL 0.1 + define loopSizeX : 0.5 * (df.middle - xLoopL + 0.5 * HVContrast * swLoop) + define loopSizeY : Math.min loopSizeX : 0.5 * (0.5 * top + 0.5 * swLoop) + + local swLoopMix1 : mix swLoop [mix sw cornerSw 0.5] 0.375 + local swLoopMix2 : mix swLoop [mix sw cornerSw 0.5] 0.75 + + include : dispiro + flat (df.leftSB * 0.5) (top - 2 * loopSizeY) [widths.lhs swLoop] + curl (xLoopL + loopSizeX) (top - 2 * loopSizeY) + archv + g4 (xLoopL + 2 * loopSizeX - O) (top - loopSizeY) + arcvh + g4 (xLoopL + loopSizeX - CorrectionOMidX * swLoop + 0.5 * HVContrast * (swLoopMix2 - swLoop)) (top - O) [widths.lhs swLoopMix1] + archv + g4 xLoopL (top - loopSizeY) [widths.lhs swLoopMix2] + flat [mix vxStartL vxEndL : if fBarStraight 0.5 0.425] [mix top 0 0.5] [widths.lhs : mix sw cornerSw 0.5] + curl vxEndL 0 [widths.lhs cornerSw] define [VSerifs df fBarStraight top] : begin local sbScale : if fBarStraight StraightSbShrink 1 @@ -183,6 +213,12 @@ glyph-block Letter-Latin-V : begin include : Serifs [DivFrame 1] fStraightBar XH eject-contour 'serifRT' + create-glyph "vLoop.\(suffix)" : glyph-proc + include : MarkSet.e + include : VLoopShape [DivFrame 1] fStraightBar XH + include : Serifs [DivFrame 1] fStraightBar XH + eject-contour 'serifLT' + create-glyph "cyrl/Uk.\(suffix)" : glyph-proc include : MarkSet.capital local vPartHeight : CAP * 0.45 + HalfStroke @@ -277,6 +313,8 @@ glyph-block Letter-Latin-V : begin select-variant 'cyrl/ukUnblended' 0x1C88 (follow -- 'v/nonCursive') select-variant 'cyrl/yn' 0xA65F (follow -- 'v/nonCursive') + select-variant 'vLoop' 0x2C74 (follow -- 'v/nonCursive') + select-variant 'cyrl/Izhitsa' 0x474 (follow -- 'VHookRight') (shapeFrom -- 'VHookRight') select-variant 'cyrl/Uk' 0xA64A (follow -- 'VHookRight') select-variant 'cyrl/Yn' 0xA65E (follow -- 'VHookRight') diff --git a/params/variants.toml b/params/variants.toml index aefe95afc..0e7a621c3 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -3503,6 +3503,7 @@ selectorAffix.v = "straight" selectorAffix."v/sansSerif" = "straight" selectorAffix."v/nonCursive" = "straight" selectorAffix.vHookTop = "" +selectorAffix.vLoop = "straight" [prime.v.variants-buildup.stages.body.curly] rank = 2 @@ -3511,6 +3512,7 @@ selectorAffix.v = "curly" selectorAffix."v/sansSerif" = "curly" selectorAffix."v/nonCursive" = "curly" selectorAffix.vHookTop = "" +selectorAffix.vLoop = "curly" [prime.v.variants-buildup.stages.body.cursive] rank = 3 @@ -3519,6 +3521,7 @@ selectorAffix.v = "cursive" selectorAffix."v/sansSerif" = "cursive" selectorAffix."v/nonCursive" = "straight" selectorAffix.vHookTop = "" +selectorAffix.vLoop = "" [prime.v.variants-buildup.stages.serifs.serifless] rank = 1 @@ -3528,6 +3531,7 @@ selectorAffix.v = "serifless" selectorAffix."v/sansSerif" = "serifless" selectorAffix."v/nonCursive" = "serifless" selectorAffix.vHookTop = "serifless" +selectorAffix.vLoop = "serifless" [prime.v.variants-buildup.stages.serifs.motion-serifed] rank = 2 @@ -3537,6 +3541,7 @@ selectorAffix.v = "motionSerifed" selectorAffix."v/sansSerif" = "serifless" selectorAffix."v/nonCursive" = "motionSerifed" selectorAffix.vHookTop = "serifed" +selectorAffix.vLoop = "serifless" [prime.v.variants-buildup.stages.serifs.serifed] rank = 3 @@ -3545,6 +3550,7 @@ selectorAffix.v = "serifed" selectorAffix."v/sansSerif" = "serifless" selectorAffix."v/nonCursive" = "serifed" selectorAffix.vHookTop = "serifed" +selectorAffix.vLoop = "serifed"