diff --git a/changes/7.3.0.md b/changes/7.3.0.md index a37987f6a..f6725aefd 100644 --- a/changes/7.3.0.md +++ b/changes/7.3.0.md @@ -1,2 +1,3 @@ + * Add Greek Upsilon with Hook Symbol (`U+03D2`). * Add flat-topped lowercase Delta (#856). - * Add rounded lowercase Xi (#856). \ No newline at end of file + * Add rounded lowercase Xi (#856). diff --git a/font-src/glyphs/letter/latin/upper-y.ptl b/font-src/glyphs/letter/latin/upper-y.ptl index ac0b3622a..30ac7636c 100644 --- a/font-src/glyphs/letter/latin/upper-y.ptl +++ b/font-src/glyphs/letter/latin/upper-y.ptl @@ -21,40 +21,59 @@ glyph-block Letter-Latin-Upper-Y : begin define SLAB-BASE 2 define SLAB-MOTION 3 - define [YShape bodyType slabType top bot] : glyph-proc - local cross : mix [fallback bot 0] top 0.4 - include : WithAIHSerifsMask CAP 0 SB RightSB - HalfXStrand bodyType SLAB SB top Middle cross 0.1 0.4 0.28 - include : tagged 'strokeRT' : WithAIHSerifsMask CAP 0 SB RightSB - HalfXStrand bodyType SLAB RightSB top Middle cross 0.1 0.4 0.28 - include : VBar Middle [fallback bot 0] (cross + HalfStroke) - set-base-anchor 'overlay' Middle cross + define [YCrossPos top bot] : mix bot top 0.4 + define [YSlabs slabType top bot] : glyph-proc local sf : SerifFrame top 0 SB RightSB match slabType [Just SLAB-ALL] : begin include : composite-proc sf.lt.full sf.rt.full - include : CenterBottomSerif Middle [fallback bot 0] MidJutSide + include : CenterBottomSerif Middle bot MidJutSide [Just SLAB-MOTION] : include sf.lt.outer - [Just SLAB-BASE] : include : CenterBottomSerif Middle [fallback bot 0] MidJutSide + [Just SLAB-BASE] : include : CenterBottomSerif Middle bot MidJutSide + + define [YShape bodyType top bot] : glyph-proc + local cross : YCrossPos top bot + include : tagged 'strokeLT' : WithAIHSerifsMask CAP 0 SB RightSB + HalfXStrand bodyType SLAB SB top Middle cross 0.1 0.4 0.28 + include : tagged 'strokeRT' : WithAIHSerifsMask CAP 0 SB RightSB + HalfXStrand bodyType SLAB RightSB top Middle cross 0.1 0.4 0.28 + include : VBar Middle bot (cross + HalfStroke) + set-base-anchor 'overlay' Middle cross define [YOverlayShape] : glyph-proc include : HOverlayBar SB RightSB (CAP * 0.45) include : HOverlayBar SB RightSB (CAP * 0.25) - define [YHookTopShape bodyType slabType] : glyph-proc - include : YShape bodyType slabType CAP - eject-contour 'strokeRT' - eject-contour 'serifRT' + define [YHookLeftHookedStroke top bot] : begin + local cross : YCrossPos top bot + return : dispiro + widths.lhs + straight.right.start (SB - HookX / 3) (top - Stroke) + g4 (SB + HookX / 3) (top - Hook) + quadControls 0.55 0.7 32 unimportant + g4 (Middle - Stroke / 2 * HVContrast) cross - local cross (CAP * 0.4) - include : dispiro + define [YHookRightHookedStroke top bot] : begin + local cross : YCrossPos top bot + return : dispiro widths.rhs - straight.left.start (RightSB + HookX / 3) (CAP - Stroke) - g4 (RightSB - HookX / 3) (CAP - Hook) + straight.left.start (RightSB + HookX / 3) (top - Stroke) + g4 (RightSB - HookX / 3) (top - Hook) quadControls 0.55 0.7 32 unimportant g4 (Middle + Stroke / 2 * HVContrast) cross + define [YHookTopShape bodyType top bot] : glyph-proc + include : YShape bodyType top bot + eject-contour 'strokeRT' + include : YHookRightHookedStroke top bot + + define [UpsilonHookedSymbolShape top bot] : glyph-proc + local cross : YCrossPos top bot + + include : VBar Middle bot (cross + HalfStroke) + include : YHookLeftHookedStroke top bot + include : YHookRightHookedStroke top bot define YConfig : object straightSerifless { BODY-STRAIGHT SLAB-NONE } @@ -69,7 +88,8 @@ glyph-block Letter-Latin-Upper-Y : begin foreach { suffix { bodyType slabType } } [Object.entries YConfig] : do create-glyph "Y.\(suffix)" : glyph-proc include : MarkSet.capital - include : YShape bodyType slabType CAP + include : YShape bodyType CAP 0 + include : YSlabs slabType CAP 0 create-glyph "grek/Upsilon.\(suffix)" : glyph-proc include [refer-glyph "Y.\(suffix)"] AS_BASE ALSO_METRICS @@ -78,21 +98,34 @@ glyph-block Letter-Latin-Upper-Y : begin create-glyph "smcpY.\(suffix)" : glyph-proc include : MarkSet.e - include : YShape bodyType slabType XH + include : YShape bodyType XH 0 + include : YSlabs slabType XH 0 create-glyph "Yhooktop.\(suffix)" : glyph-proc include : MarkSet.capital - include : YHookTopShape bodyType slabType + include : YHookTopShape bodyType CAP 0 + include : YSlabs slabType CAP 0 + eject-contour 'serifRT' create-glyph "cyrl/ue.\(suffix)" : glyph-proc include : MarkSet.p - include : YShape bodyType slabType XH Descender + include : YShape bodyType XH Descender + include : YSlabs slabType XH Descender + + create-glyph "grek/upsilonHookedSymbolShape.\(suffix)" : glyph-proc + include : MarkSet.capital + include : UpsilonHookedSymbolShape CAP 0 + include : YSlabs slabType CAP 0 + eject-contour 'serifLT' + eject-contour 'serifRT' + include : SetGrekUpperTonos (OX - HookX / 3) select-variant 'Y' 'Y' link-reduced-variant 'Y/sansSerif' 'Y' MathSansSerif select-variant 'Yhooktop' 0x1B3 (follow -- 'Y') select-variant 'smcpY' 0x28F (follow -- 'Y') select-variant 'cyrl/ue' 0x4AF (follow -- 'Y') + select-variant 'grek/upsilonHookedSymbolShape' 0x3D2 turned 'turnSansSerifY' 0x2144 'Y/sansSerif' Middle (CAP / 2) select-variant 'grek/Upsilon' 0x3A5 (follow -- 'Y') diff --git a/params/variants.toml b/params/variants.toml index 8b566c42d..a3c0212aa 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -1360,48 +1360,56 @@ tag = "cv24" rank = 1 description = "Straight `Y` without serifs" selector.Y = "straightSerifless" +selector.'grek/upsilonHookedSymbolShape' = "straightSerifless" selector."Y/sansSerif" = "straightSerifless" [prime.capital-y.variants.curly-serifless] rank = 2 description = "Slightly curly `Y`, like Iosevka 2.x, without serifs" selector.Y = "curlySerifless" +selector.'grek/upsilonHookedSymbolShape' = "straightSerifless" selector."Y/sansSerif" = "curlySerifless" [prime.capital-y.variants.straight-base-serifed] rank = 3 description = "Standard, straight `Y`, with serif at bottom" selector.Y = "straightBaseSerifed" +selector.'grek/upsilonHookedSymbolShape' = "straightBaseSerifed" selector."Y/sansSerif" = "straightSerifless" [prime.capital-y.variants.curly-base-serifed] rank = 4 description = "Slightly curly `Y`, like Iosevka 2.x, with serif at bottom" selector.Y = "curlyBaseSerifed" +selector.'grek/upsilonHookedSymbolShape' = "straightBaseSerifed" selector."Y/sansSerif" = "curlySerifless" [prime.capital-y.variants.straight-motion-serifed] rank = 5 description = "Standard, straight `Y`, with motion serifs" selector.Y = "straightMotionSerifed" +selector.'grek/upsilonHookedSymbolShape' = "straightSerifless" selector."Y/sansSerif" = "straightSerifless" [prime.capital-y.variants.curly-motion-serifed] rank = 6 description = "Slightly curly `Y`, like Iosevka 2.x, with motion serifs" selector.Y = "curlyMotionSerifed" +selector.'grek/upsilonHookedSymbolShape' = "straightSerifless" selector."Y/sansSerif" = "curlySerifless" [prime.capital-y.variants.straight-serifed] rank = 7 description = "Standard, straight `Y`, with serifs" selector.Y = "straightSerifed" +selector.'grek/upsilonHookedSymbolShape' = "straightBaseSerifed" selector."Y/sansSerif" = "straightSerifless" [prime.capital-y.variants.curly-serifed] rank = 8 description = "Slightly curly `Y`, like Iosevka 2.x, with serifs" selector.Y = "curlySerifed" +selector.'grek/upsilonHookedSymbolShape' = "straightBaseSerifed" selector."Y/sansSerif" = "curlySerifless"