diff --git a/packages/font-glyphs/src/auto-build/composite.ptl b/packages/font-glyphs/src/auto-build/composite.ptl index cce1ecc..6cffb46 100644 --- a/packages/font-glyphs/src/auto-build/composite.ptl +++ b/packages/font-glyphs/src/auto-build/composite.ptl @@ -62,7 +62,7 @@ glyph-block Autobuild-Enclosure-Shared : begin local decomposableJobs { } local relApplications { } local decomposableRelGlyphs : new Set - foreach demand [items-of demands] : do + foreach demand [items-of demands] : if (!recursive || !recursive.koeln || [recursive.koelnCodes.has demand.0]) : do local unicode demand.0 local origParts demand.1 local mappedParts : MapPartNameWithWidthSuffix origParts suffix @@ -1601,8 +1601,9 @@ glyph-block Autobuild-Ligatures : begin list 0xf883 { 'iAcute' 'jAcute' } # Link Gr for acute variants - NLDAcuteVariant.set [glyphStore.queryByUnicodeEnsured 0x132] [glyphStore.queryNameByUnicodeEnsured 0xf882] - NLDAcuteVariant.set [glyphStore.queryByUnicodeEnsured 0x133] [glyphStore.queryNameByUnicodeEnsured 0xf883] + if (!recursive || !recursive.koeln) : begin + NLDAcuteVariant.set [glyphStore.queryByUnicodeEnsured 0x132] [glyphStore.queryNameByUnicodeEnsured 0xf882] + NLDAcuteVariant.set [glyphStore.queryByUnicodeEnsured 0x133] [glyphStore.queryNameByUnicodeEnsured 0xf883] define stdShrink : clamp 0.75 0.9 : StrokeWidthBlend 0.75 0.9 createLigatures 'compatLigature2' stdShrink stdShrink 1 1 0 : list @@ -1627,9 +1628,10 @@ glyph-block Autobuild-Ligatures : begin list 0x1F190 { 'D' 'J' } WideWidth1 # Link Gr for caron variants - HBSCaronVariant.set [glyphStore.queryByUnicodeEnsured 0x1F1] [glyphStore.queryNameByUnicodeEnsured 0x1C4] - HBSCaronVariant.set [glyphStore.queryByUnicodeEnsured 0x1F2] [glyphStore.queryNameByUnicodeEnsured 0x1C5] - HBSCaronVariant.set [glyphStore.queryByUnicodeEnsured 0x1F3] [glyphStore.queryNameByUnicodeEnsured 0x1C6] + if (!recursive || !recursive.koeln) : begin + HBSCaronVariant.set [glyphStore.queryByUnicodeEnsured 0x1F1] [glyphStore.queryNameByUnicodeEnsured 0x1C4] + HBSCaronVariant.set [glyphStore.queryByUnicodeEnsured 0x1F2] [glyphStore.queryNameByUnicodeEnsured 0x1C5] + HBSCaronVariant.set [glyphStore.queryByUnicodeEnsured 0x1F3] [glyphStore.queryNameByUnicodeEnsured 0x1C6] createLigatures 'romanNumerals1' 1 1 1 1 0 : list list 0x2160 { 'I' } diff --git a/packages/font-glyphs/src/index.ptl b/packages/font-glyphs/src/index.ptl index 239bd59..b67daaa 100644 --- a/packages/font-glyphs/src/index.ptl +++ b/packages/font-glyphs/src/index.ptl @@ -6,12 +6,15 @@ import as SpiroKit from "@iosevka/font-kits/spiro-kit" import as BooleKit from "@iosevka/font-kits/boole-kit" import [DesignParameters calculateMetrics setFontMetrics GenDivFrame] from "./meta/aesthetics.mjs" import [$NamedParameterPair$] from "@iosevka/util" +import [refineAscii] from "../iocgn-ascii.mjs" +import [buildNative] from "../iocgn-native.mjs" extern isFinite $$include './meta/macros.ptl' -export : define [buildGlyphs para recursive] : begin +export : define [buildGlyphs para recursive koelnGeometry] : begin + if (!recursive && !koelnGeometry) : return : buildNative para buildGlyphs # Execution and dependency management local $Exec$ : new GlyphBuildExecutor recursive @@ -108,12 +111,13 @@ export : define [buildGlyphs para recursive] : begin run-glyph-module "./orthography/index.mjs" # Auto-builds - if [not recursive] : begin + if (!recursive || recursive.koeln) : begin run-glyph-module "./auto-build/recursive-build.mjs" run-glyph-module "./auto-build/accents.mjs" - run-glyph-module "./auto-build/transformed.mjs" + if [not recursive] : run-glyph-module "./auto-build/transformed.mjs" run-glyph-module "./auto-build/composite.mjs" $Exec$.executePendingBlocks + refineAscii glyphStore Metrics para - return : object glyphStore fontMetrics + return : object glyphStore fontMetrics [metrics Metrics] [executor $Exec$] diff --git a/packages/font-glyphs/src/letter/latin/c.ptl b/packages/font-glyphs/src/letter/latin/c.ptl index 27fe5e7..f96d23e 100644 --- a/packages/font-glyphs/src/letter/latin/c.ptl +++ b/packages/font-glyphs/src/letter/latin/c.ptl @@ -1,5 +1,7 @@ $$include '../../meta/macros.ptl' +import [lowerBowl lowerWidth] from "../../../iocgn-shapes.mjs" + import [mix linreg clamp fallback SuffixCfg] from "@iosevka/util" import [DependentSelector MathSansSerif] from "@iosevka/glyph/relation" @@ -179,7 +181,13 @@ glyph-block Letter-Latin-C : begin local lf : CLetterForm [DivFrame 1] sty styBot XH 0 ada -- SmallArchDepthA adb -- SmallArchDepthB - include : lf.full + local radius : ([lowerWidth Width [HSwToV Stroke]] - 20 * Width / 660) / 2 + local terminalExtension : Math.max (Stroke * 0.16) (Stroke * 0.5 - 21.5) + include : if (sty == SLAB-NONE && styBot == SLAB-NONE) + difference + lowerBowl Middle Width XH [HSwToV Stroke] + Rect (XH + 10 - radius - terminalExtension) (radius - 14.5 + 0.04 * Stroke + terminalExtension) Middle Width + lf.full create-glyph "c/centKernelStd.\(suffix)" : glyph-proc set-width 0 diff --git a/packages/font-glyphs/src/letter/latin/lower-a.ptl b/packages/font-glyphs/src/letter/latin/lower-a.ptl index 577e9d6..e04cb2e 100644 --- a/packages/font-glyphs/src/letter/latin/lower-a.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-a.ptl @@ -2,6 +2,7 @@ $$include '../../meta/macros.ptl' import [mix linreg fallback SuffixCfg] from "@iosevka/util" import [MathSansSerif] from "@iosevka/glyph/relation" +import [doubleStoreyA] from "../../../iocgn-shapes.mjs" glyph-module @@ -88,10 +89,8 @@ glyph-block Letter-Latin-Lower-A : begin Serifless df hookStyle sw begin [SerifFrame.fromDf df XH 0 (swRef -- [fallback sw : ADoubleStoreyStroke df]) (swSerif -- df.mvs)].rb.outer - export : define [Tailed df hookStyle sw] : union - HookAndBar df hookStyle (XH - [ADoubleStoreySmoothB df] + O) sw - Arc df 0 0 sw - RightwardTailedBar df.rightSB 0 (XH - [ADoubleStoreySmoothB df]) [fallback sw : ADoubleStoreyStroke df] + export : define [Tailed df hookStyle sw] : glyph-proc + include : doubleStoreyA df.middle df.width XH [HSwToV : fallback sw df.mvs] export : define [ToothlessCorner df hookStyle sw] : union HookAndBar df hookStyle DToothlessRise sw diff --git a/packages/font-glyphs/src/letter/latin/lower-b.ptl b/packages/font-glyphs/src/letter/latin/lower-b.ptl index b3864ec..c2c0257 100644 --- a/packages/font-glyphs/src/letter/latin/lower-b.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-b.ptl @@ -1,5 +1,7 @@ $$include '../../meta/macros.ptl' +import [lowerBowl lowerWidth] from "../../../iocgn-shapes.mjs" + import [mix fallback SuffixCfg] from "@iosevka/util" import [MathSansSerif] from "@iosevka/glyph/relation" @@ -52,10 +54,12 @@ glyph-block Letter-Latin-Lower-B : begin local yOverlay : mix XH (Ascender - [if doST Stroke 0]) 0.5 create-glyph "b.\(suffix)" : glyph-proc include : MarkSet.b - include : Body Ascender + local fitted : Body == ToothedBody && Serifs == no-shape + local xStem : if fitted (Middle - [lowerWidth Width [HSwToV Stroke]] / 2) SB + include : if fitted [lowerBowl Middle Width XH [HSwToV Stroke] (-1) Ascender 0] [Body Ascender] include : Serifs - include : LeaningAnchor.Above.VBar.l SB - set-base-anchor 'overlayOnExtension' (SB + [HSwToV HalfStroke]) yOverlay + include : LeaningAnchor.Above.VBar.l xStem + set-base-anchor 'overlayOnExtension' (xStem + [HSwToV HalfStroke]) yOverlay set-base-anchor 'overlay' Middle (XH / 2) set-base-anchor 'strike' Middle (XH / 2) diff --git a/packages/font-glyphs/src/letter/latin/lower-d.ptl b/packages/font-glyphs/src/letter/latin/lower-d.ptl index 37bd59f..1abe30b 100644 --- a/packages/font-glyphs/src/letter/latin/lower-d.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-d.ptl @@ -1,5 +1,7 @@ $$include '../../meta/macros.ptl' +import [lowerBowl lowerWidth] from "../../../iocgn-shapes.mjs" + import [mix clamp fallback SuffixCfg] from "@iosevka/util" import [MathSansSerif] from "@iosevka/glyph/relation" @@ -91,11 +93,13 @@ glyph-block Letter-Latin-Lower-D : begin : where : [make df] : glyph-proc include : DivFrame 1 include : df.markSet.b - include : Body df Ascender + local fitted : Body == ToothedBody && !topSerif && !bottomSerif + local xStem : if fitted (df.middle + [lowerWidth df.width [HSwToV df.mvs]] / 2) df.rightSB + include : if fitted [lowerBowl df.middle df.width XH [HSwToV df.mvs] 1 Ascender 0] [Body df Ascender] if topSerif : include : topSerif df Ascender if bottomSerif : include : bottomSerif df Ascender - include : LeaningAnchor.Above.VBar.r df.rightSB df.mvs - set-base-anchor 'overlayOnExtension' (df.rightSB - [HSwToV : 0.5 * df.mvs]) yOverlay + include : LeaningAnchor.Above.VBar.r xStem df.mvs + set-base-anchor 'overlayOnExtension' (xStem - [HSwToV : 0.5 * df.mvs]) yOverlay set-base-anchor 'overlay' df.middle (XH / 2) set-base-anchor 'strike' df.middle (XH / 2) diff --git a/packages/font-glyphs/src/letter/latin/lower-e.ptl b/packages/font-glyphs/src/letter/latin/lower-e.ptl index 48ab2b0..d450294 100644 --- a/packages/font-glyphs/src/letter/latin/lower-e.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-e.ptl @@ -1,5 +1,7 @@ $$include '../../meta/macros.ptl' +import [lowerBowl lowerWidth] from "../../../iocgn-shapes.mjs" + import [mix linreg clamp fallback] from "@iosevka/util" import [DependentSelector] from "@iosevka/glyph/relation" @@ -227,10 +229,19 @@ glyph-block Letter-Latin-Lower-E : begin foreach { suffix { Body RevBody } } [Object.entries SmallEConfig] : do create-glyph "e.\(suffix)" : glyph-proc include : MarkSet.e - include : Body [DivFrame 1] XH - hook -- AHook - ada -- SmallArchDepthA - adb -- SmallArchDepthB + include : if (Body == SmallEShape) + glyph-proc + local span : lowerWidth Width [HSwToV Stroke] + local radius : (span - 20 * Width / 660) / 2 + local barBottom : XH * (259 / 525) - 0.47 * Stroke + include : difference + lowerBowl Middle Width XH [HSwToV Stroke] + Rect barBottom (radius - 34.5 + 0.04 * Stroke) Middle Width + include : HBar.b (Middle - span / 2) (Middle + span / 2) barBottom Stroke + Body [DivFrame 1] XH + hook -- AHook + ada -- SmallArchDepthA + adb -- SmallArchDepthB create-glyph "eOgonek.\(suffix)" : glyph-proc include : MarkSet.e diff --git a/packages/font-glyphs/src/letter/latin/lower-f.ptl b/packages/font-glyphs/src/letter/latin/lower-f.ptl index 271bf2f..8c34af7 100644 --- a/packages/font-glyphs/src/letter/latin/lower-f.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-f.ptl @@ -2,6 +2,7 @@ $$include '../../meta/macros.ptl' import [mix fallback SuffixCfg] from "@iosevka/util" import [MathSansSerif] from "@iosevka/glyph/relation" +import [roundHook] from "../../../iocgn-shapes.mjs" glyph-module @@ -88,9 +89,9 @@ glyph-block Letter-Latin-Lower-F : begin include : LeaningAnchor.Above.Hook barLeft (df.rightSB + barLeft - barLeft0) set-base-anchor 'overlay' (barLeft + [HSwToV HalfStroke]) (bh / 2) - include : StdFShapeT dispiro df 0 barLeft0 Stroke + include : roundHook (-barLeft0) 0 (O - Ascender) (132 + 0.36 * Stroke) [HSwToV Stroke] 120 true include : Translate (barLeft - barLeft0) 0 - include : HCrossBar.top SB [mix df.leftSB df.rightSB m] bh + include : HCrossBar.top (barLeft - 80) (barLeft + 175 + 0.87 * Stroke) bh include : match counterHook [Just CH-NONE] : SetPalatalHookPos barLeft diff --git a/packages/font-glyphs/src/letter/latin/lower-g.ptl b/packages/font-glyphs/src/letter/latin/lower-g.ptl index b5da9f7..7eb6277 100644 --- a/packages/font-glyphs/src/letter/latin/lower-g.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-g.ptl @@ -2,6 +2,7 @@ $$include '../../meta/macros.ptl' import [mix fallback SuffixCfg] from "@iosevka/util" import [MathSansSerif] from "@iosevka/glyph/relation" +import [roundHook] from "../../../iocgn-shapes.mjs" glyph-module @@ -97,7 +98,8 @@ glyph-block Letter-Latin-Lower-G : begin g4 (df.leftSB + offset) (Descender + SHook) if (sink == spiro-outline) { [corner df.leftSB XH] } {} - export : define [BentHook df y0 _ada _adb] : BentHookT dispiro df y0 0 df.mvs _ada _adb + export : define [BentHook df y0 _ada _adb] : glyph-proc + include : roundHook df.rightSB y0 (Descender + O) ((df.rightSB - df.leftSB) / 2) [HSwToV df.mvs] 155 export : define [FlatHook df y0 _ada _adb] : begin local hd : FlatHookDepth df (9 / 8) local xTerminal : Math.min (df.rightSB - hd.x - TINY) : mix df.leftSB df.rightSB (1 / 5) @@ -183,7 +185,7 @@ glyph-block Letter-Latin-Lower-G : begin foreach { suffix { hookShape {bodyShape hookStart} } } [Object.entries SingleStoreyConfig] : do create-glyph "g.\(suffix)" : glyph-proc - local df : include : DivFrame 1 + local df : include : DivFrame 1 2 1.16 Stroke include : df.markSet.p set-base-anchor 'overlay' df.middle (XH / 2) set-base-anchor 'strike' df.middle (XH / 2) diff --git a/packages/font-glyphs/src/letter/latin/lower-h.ptl b/packages/font-glyphs/src/letter/latin/lower-h.ptl index 8fd5a6c..97b184e 100644 --- a/packages/font-glyphs/src/letter/latin/lower-h.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-h.ptl @@ -1,5 +1,7 @@ $$include '../../meta/macros.ptl' +import [shoulder lowerWidth] from "../../../iocgn-shapes.mjs" + import [mix fallback SuffixCfg] from "@iosevka/util" import [MathSansSerif] from "@iosevka/glyph/relation" @@ -58,12 +60,14 @@ glyph-block Letter-Latin-Lower-H : begin foreach { suffix { fTailed {Serifs fHasTopSerif} } } [Object.entries HConfig] : do create-glyph "h.\(suffix)" : glyph-proc include : MarkSet.b - include : LeaningAnchor.Above.VBar.l SB - include : VBar.l SB 0 Ascender - include : nShoulder.shape - left -- (SB + [HSwToV Stroke]) - right -- RightSB - bottom -- [if fTailed (XH - SmallArchDepthB + O) 0] + local fitted : !fTailed && !fHasTopSerif + include : LeaningAnchor.Above.VBar.l [if fitted (Middle - [lowerWidth Width [HSwToV Stroke]] / 2) SB] + include : if fitted [shoulder Middle Width XH Ascender [HSwToV Stroke]] : glyph-proc + include : VBar.l SB 0 Ascender + include : nShoulder.shape + left -- (SB + [HSwToV Stroke]) + right -- RightSB + bottom -- [if fTailed (XH - SmallArchDepthB + O) 0] if fTailed : include : RightwardTailedBar RightSB 0 (XH - SmallArchDepthB) include : Serifs fTailed false diff --git a/packages/font-glyphs/src/letter/latin/lower-j.ptl b/packages/font-glyphs/src/letter/latin/lower-j.ptl index 8751a22..ed57799 100644 --- a/packages/font-glyphs/src/letter/latin/lower-j.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-j.ptl @@ -2,6 +2,7 @@ $$include '../../meta/macros.ptl' import [mix linreg clamp fallback] from "@iosevka/util" import [Dotless MathSansSerif] from "@iosevka/glyph/relation" +import [roundHook] from "../../../iocgn-shapes.mjs" glyph-module @@ -47,14 +48,11 @@ glyph-block Letter-Latin-Lower-J : begin define JBody : namespace export : define [BentHook df top xMiddle] : glyph-proc - local hookx : Math.min ((xMiddle - df.middle) - [HSwToV HalfStroke] + OXHook) (xMiddle - [HSwToV : 1.5 * Stroke] + OXHook) + local hookx : xMiddle + [HSwToV HalfStroke] - (205 + [HSwToV HalfStroke]) * df.width / 660 set-base-anchor "below" [mix hookx xMiddle 0.5] Descender - include : dispiro - widths.rhs - flat (xMiddle + [HSwToV HalfStroke]) top [heading Downward] - curl (xMiddle + [HSwToV HalfStroke]) (Descender + ArchDepthA) - HookEnd Descender - g4 hookx (Descender + JHook) + local right : xMiddle + [HSwToV HalfStroke] + local radius : (right - hookx) / (1 + [Math.sin : Math.PI / 9]) + include : roundHook right top (Descender + O) radius [HSwToV Stroke] 110 export : define [NarrowBentHook df top xMiddle] : glyph-proc local pAdaptive : if (para.advanceScaleF < 1) ((1 - df.adws) / (1 - para.advanceScaleF)) 0 diff --git a/packages/font-glyphs/src/letter/latin/lower-m.ptl b/packages/font-glyphs/src/letter/latin/lower-m.ptl index a647d8c..142e459 100644 --- a/packages/font-glyphs/src/letter/latin/lower-m.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-m.ptl @@ -13,7 +13,7 @@ glyph-block Letter-Latin-Lower-M : begin glyph-block-import Letter-Shared-Shapes : MidHook CyrDescender CyrCurlDescender PalatalHook EngHook glyph-block-import Letter-Shared-Shapes : UpwardHookShape SerifFrame - define [dfM] : DivFrame para.advanceScaleMM 3 + define [dfM] : if para.koelnCompactM [DivFrame para.advanceScaleMM 3 0.5] [DivFrame para.advanceScaleMM 3 0.2 Stroke] define [SmallMSmoothA df _ad _sw] : [df.slice 3 2].archDepthAOf [fallback _ad SmallArchDepth] [fallback _sw df.mvs] define [SmallMSmoothB df _ad _sw] : [df.slice 3 2].archDepthBOf [fallback _ad SmallArchDepth] [fallback _sw df.mvs] @@ -122,9 +122,9 @@ glyph-block Letter-Latin-Lower-M : begin glyph-block-export SmallMArches define [SmallMArches df top lbot mbot rbot _sw _ada _adb] : glyph-proc local sw : fallback _sw df.mvs - local fine : sw * (ShoulderFine / Stroke) - local ada : fallback _ada : SmallMSmoothA df nothing sw - local adb : fallback _adb : SmallMSmoothB df nothing sw + local fine : sw * 0.9 + local ada : fallback _ada : (df.rightSB - df.leftSB + [HSwToV sw]) / 4 + local adb : fallback _adb ada include : tagged 'barL' : VBar.l df.leftSB lbot top sw include : SmallMShoulderSpiro left -- (df.leftSB + [HSwToV : sw - fine]) diff --git a/packages/font-glyphs/src/letter/latin/lower-n.ptl b/packages/font-glyphs/src/letter/latin/lower-n.ptl index 2da55d3..a79108a 100644 --- a/packages/font-glyphs/src/letter/latin/lower-n.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-n.ptl @@ -1,5 +1,7 @@ $$include '../../meta/macros.ptl' +import [shoulder lowerWidth] from "../../../iocgn-shapes.mjs" + import [mix clamp fallback SuffixCfg] from "@iosevka/util" import [MathSansSerif Joining] from "@iosevka/glyph/relation" @@ -147,8 +149,9 @@ glyph-block Letter-Latin-Lower-N : begin foreach { suffix { Body tailed { sLT sLB sRB } } } [Object.entries NConfig] : do create-glyph "n.\(suffix)" : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' RightSB 0 - include : Body XH SB RightSB [if tailed (XH - SmallArchDepthB + O) 0] Stroke + local fitted : Body == EaredBody && !tailed && !sLT && !sLB && !sRB + set-base-anchor 'trailing' [if fitted (Middle + [lowerWidth Width [HSwToV Stroke]] / 2) RightSB] 0 + include : if fitted [shoulder Middle Width XH XH [HSwToV Stroke]] [Body XH SB RightSB [if tailed (XH - SmallArchDepthB + O) 0] Stroke] if tailed : include : EndingTail RightSB 0 (XH - SmallArchDepthB) Stroke if sLT : include : sLT [DivFrame 1] XH if sLB : include : sLB [DivFrame 1] 0 diff --git a/packages/font-glyphs/src/letter/latin/lower-p.ptl b/packages/font-glyphs/src/letter/latin/lower-p.ptl index ed5c56b..e4b230a 100644 --- a/packages/font-glyphs/src/letter/latin/lower-p.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-p.ptl @@ -1,5 +1,7 @@ $$include '../../meta/macros.ptl' +import [lowerBowl lowerWidth] from "../../../iocgn-shapes.mjs" + import [mix fallback SuffixCfg] from "@iosevka/util" import [MathSansSerif] from "@iosevka/glyph/relation" @@ -70,10 +72,12 @@ glyph-block Letter-Latin-Lower-P : begin create-glyph "p.\(suffix)" : glyph-proc include : MarkSet.p - include : Body + local fitted : Body == EaredBody && !doTS && !doBS + local xStem : if fitted (Middle - [lowerWidth Width [HSwToV Stroke]] / 2) SB + include : if fitted [lowerBowl Middle Width XH [HSwToV Stroke] (-1) XH Descender] [Body] include : Serifs [DivFrame 1] XH - include : LeaningAnchor.Below.VBar.l SB - set-base-anchor 'overlayOnExtension' (SB + [HSwToV HalfStroke]) yOverlay + include : LeaningAnchor.Below.VBar.l xStem + set-base-anchor 'overlayOnExtension' (xStem + [HSwToV HalfStroke]) yOverlay set-base-anchor 'strike' Middle (XH / 2) create-glyph "pStrokeBottom.\(suffix)" : glyph-proc diff --git a/packages/font-glyphs/src/letter/latin/lower-q.ptl b/packages/font-glyphs/src/letter/latin/lower-q.ptl index a1c364b..3204893 100644 --- a/packages/font-glyphs/src/letter/latin/lower-q.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-q.ptl @@ -1,5 +1,7 @@ $$include '../../meta/macros.ptl' +import [lowerBowl lowerWidth] from "../../../iocgn-shapes.mjs" + import [mix fallback SuffixCfg] from "@iosevka/util" import [MathSansSerif] from "@iosevka/glyph/relation" @@ -104,10 +106,12 @@ glyph-block Letter-Latin-Lower-Q : begin foreach { suffix { Body terminal { sRT sRB } } } [Object.entries QConfig] : do create-glyph "q.\(suffix)" : glyph-proc include : MarkSet.p - include : Body terminal XH Descender + local fitted : Body == EaredBody && terminal == TERMINAL-NORMAL && !sRT && !sRB + local xStem : if fitted (Middle + [lowerWidth Width [HSwToV Stroke]] / 2) RightSB + include : if fitted [lowerBowl Middle Width XH [HSwToV Stroke] 1 XH Descender] [Body terminal XH Descender] if sRT : include : sRT XH if sRB : include : sRB Descender - include : LeaningAnchor.Below.VBar.r RightSB + include : LeaningAnchor.Below.VBar.r xStem if (terminal === TERMINAL-NORMAL && !sRB) : begin create-glyph "qCapRTail.\(suffix)" : glyph-proc diff --git a/packages/font-glyphs/src/letter/latin/lower-r.ptl b/packages/font-glyphs/src/letter/latin/lower-r.ptl index 0db7ab7..2a6243f 100644 --- a/packages/font-glyphs/src/letter/latin/lower-r.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-r.ptl @@ -2,6 +2,7 @@ $$include '../../meta/macros.ptl' import [mix linreg clamp fallback SuffixCfg] from "@iosevka/util" import [MathSansSerif] from "@iosevka/glyph/relation" +import [roundHook shoulder] from "../../../iocgn-shapes.mjs" glyph-module @@ -55,8 +56,8 @@ glyph-block Letter-Latin-Lower-R : begin export : local [rTopSerif y] : tagged 'serifLT' HSerif.lt rSerifX y (rSerifLeftJut + [HSwToV : 0.5 * strokeBar]) - export : local fine ShoulderFine - local rHookXFull : df.rightSB + RBalance2 * rBalanceMultiplier - (OX - O) + export : local fine : stroke * 0.9 + local rHookXFull : xBar - [HSwToV strokeBar] + (200 + 1.12 * [HSwToV strokeBar]) * df.width / 660 local pAdaptive : if (para.advanceScaleF < 1) ((1 - df.adws) / (1 - para.advanceScaleF)) 0 export : local rHookX : match mode ([Just rNarrowHook] || [Just rNarrowHookSerifed]) : mix xBar rHookXFull [mix 0.85 1.15 pAdaptive] @@ -105,14 +106,10 @@ glyph-block Letter-Latin-Lower-R : begin define [StandardShape df md doTopSerif doBottomSerif] : glyph-proc define [object xBar rBottomSerif rTopSerif fine xArchMiddle skew rHookX rHookY hookSuperness] : RDim df md - include : dispiro - widths.lhs - g4.up.start rHookX (XH - rHookY) [heading Upward] - arcvh 32 hookSuperness - g4.left.mid (xArchMiddle - CorrectionOMidS * [linreg 72 0.75 108 1 Stroke]) (XH - O) [widths.lhs.heading Stroke {.y (-1) .x (-skew)}] - archv 32 - straight.down.end (xBar - [HSwToV fine]) (XH * 0.53 + TanSlope * SmoothAdjust) [widths.lhs.heading fine Downward] - include : VBar.r xBar 0 XH + include : if (!doTopSerif && !doBottomSerif) [shoulder df.middle df.width XH XH [HSwToV Stroke] true] : glyph-proc + local radius : (rHookX - xBar + [HSwToV Stroke]) / (1 + [Math.sin : Math.PI / 9]) + include : roundHook (0 - xBar + [HSwToV Stroke]) 0 (O - XH) radius [HSwToV Stroke] 110 true + include : VBar.r xBar 0 XH if doBottomSerif : include : rBottomSerif 0 if doTopSerif : include : rTopSerif XH diff --git a/packages/font-glyphs/src/letter/latin/lower-t.ptl b/packages/font-glyphs/src/letter/latin/lower-t.ptl index 71ecb6c..2d4f57f 100644 --- a/packages/font-glyphs/src/letter/latin/lower-t.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-t.ptl @@ -33,14 +33,15 @@ glyph-block Letter-Latin-Lower-T : begin define yShortNeck2 : clamp [mix XH Ascender 0.5] CAP : [mix XH Ascender 0.750] - Stroke * 0.125 define BentHook : namespace + define crossJut : (132 + 0.5 * Stroke) * Width / 660 export : define [BarLeftPos df sym] : match sym [Just SYM-LEFT] : mix df.leftSB [xSmallTBarLeftT df] 0.5 [Just SYM-BALANCED] : xSmallTBarLeftT df ([Just SYM-PR-LEFT] || [Just SYM-PR-BALANCED]) : df.middle - [HSwToV HalfStroke] define [xCrossBarPos df sym] : match sym - ([Just SYM-LEFT] || [Just SYM-PR-LEFT]) {([BarLeftPos df sym] + TanSlope * Stroke) ([xSmallTCrossRefT df] + LongJut * [Math.sqrt df.adws])} - __ {([xSmallTCrossRefT df] - LongJut * [Math.sqrt df.adws]) ([xSmallTCrossRefT df] + LongJut * [Math.sqrt df.adws])} + ([Just SYM-LEFT] || [Just SYM-PR-LEFT]) {([BarLeftPos df sym] + TanSlope * Stroke) ([xSmallTCrossRefT df] + crossJut * [Math.sqrt df.adws])} + __ {([xSmallTCrossRefT df] - crossJut * [Math.sqrt df.adws]) ([xSmallTCrossRefT df] + crossJut * [Math.sqrt df.adws])} define [XHookTerminal df sym] : match sym [Just SYM-LEFT] df.rightSB @@ -57,7 +58,8 @@ glyph-block Letter-Latin-Lower-T : begin [if (sink == spiro-outline) corner flat] (offset + xLeft) top [heading Downward] curl (offset + xLeft) (bot + adb) HookEnd (bot + offset) (sw -- sw) - g4 (xHook - offset) (bot + Hook) + flat (xHook - offset) (bot + (xHook - xLeft) / 2) + curl (xHook - offset) (bot + (xHook - xLeft) / 2 + sw * 0.35) [heading Upward] if (sink == spiro-outline) {[corner (xHook - offset) top]} {} export : define [CrossBar df sym] : begin diff --git a/packages/font-glyphs/src/letter/latin/lower-y.ptl b/packages/font-glyphs/src/letter/latin/lower-y.ptl index ee5050d..89aa6b5 100644 --- a/packages/font-glyphs/src/letter/latin/lower-y.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-y.ptl @@ -37,7 +37,7 @@ glyph-block Letter-Latin-Lower-Y : begin local l : fallback _l 0 local r : fallback _r Width local m : mix l r 0.5 - local sb : fallback _sb SB + local sb : fallback _sb (SB + Width * 0.065) local rsb : r + l - sb local sw : fallback _sw Stroke @@ -319,7 +319,7 @@ glyph-block Letter-Latin-Lower-Y : begin include : MarkSet.p set-base-anchor 'strike' Middle (XH / 2) set-base-anchor 'yBelowDot' (RightSB - 0.5 * DotRadius) (Descender + AccentStackOffset + DotRadius) - include : Shapes.SmallYShape XH Descender + include : Shapes.SmallYShape XH (Descender * 0.8) create-glyph "grek/lambda.\(suffix)" : glyph-proc include : MarkSet.b diff --git a/packages/font-glyphs/src/letter/latin/o.ptl b/packages/font-glyphs/src/letter/latin/o.ptl index 5a8a304..6bf535b 100644 --- a/packages/font-glyphs/src/letter/latin/o.ptl +++ b/packages/font-glyphs/src/letter/latin/o.ptl @@ -1,5 +1,7 @@ $$include '../../meta/macros.ptl' +import [lowerBowl] from "../../../iocgn-shapes.mjs" + import [mix linreg clamp fallback] from "@iosevka/util" @@ -25,7 +27,7 @@ glyph-block Letter-Latin-O : begin create-glyph 'o' 'o' : glyph-proc include : MarkSet.e - include : OShape XH 0 SB RightSB nothing nothing nothing + include : lowerBowl Middle Width XH [HSwToV Stroke] create-glyph 'grek/Omicron' 0x39F : glyph-proc include [refer-glyph 'O'] AS_BASE ALSO_METRICS diff --git a/packages/font-glyphs/src/letter/latin/u.ptl b/packages/font-glyphs/src/letter/latin/u.ptl index 040acdb..6c0bfe6 100644 --- a/packages/font-glyphs/src/letter/latin/u.ptl +++ b/packages/font-glyphs/src/letter/latin/u.ptl @@ -1,5 +1,7 @@ $$include '../../meta/macros.ptl' +import [shoulder] from "../../../iocgn-shapes.mjs" + import [mix fallback SuffixCfg] from "@iosevka/util" import [MathSansSerif] from "@iosevka/glyph/relation" @@ -195,7 +197,11 @@ glyph-block Letter-Latin-U : begin create-glyph "u.\(suffix)" : glyph-proc local df : include : DivFrame 1 include : df.markSet.e - include : Base df XH Stroke + include : if (Base == ULower.Toothed && Slabs == no-shape) + glyph-proc + include : shoulder Middle Width XH XH [HSwToV Stroke] + include : FlipAround Middle (XH / 2) + Base df XH Stroke include : Slabs df XH Stroke create-glyph "grek/mu.\(suffix)" : glyph-proc diff --git a/packages/font-glyphs/src/letter/latin/upper-a.ptl b/packages/font-glyphs/src/letter/latin/upper-a.ptl index a808d85..8bca453 100644 --- a/packages/font-glyphs/src/letter/latin/upper-a.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-a.ptl @@ -51,9 +51,33 @@ glyph-block Letter-Latin-Upper-A : begin return : tagged 'crossBar' : intersection [HBar.t 0 df.width yBar sw] [Mask df bodyShape top sw] export : define [Letter df bodyShape slabKind top sw] : new-glyph : glyph-proc - include : Outer df bodyShape top sw - include : CrossBar df bodyShape top sw - include : ASerifs df top sw slabKind + if (bodyShape == BODY-STRAIGHT && slabKind == SLAB-NONE) : begin + # Flat roof and vertical lower legs, rather than an inverted V. + local w : df.rightSB - df.leftSB + local knee : top * 0.39 + local yBar : top * 0.455 + local roofHalf : w * 0.20 + [Math.max 0 (sw - 105)] * 1.4 + local counterHalf : w * 0.03 + [Math.max 0 (75 - sw)] * 0.9 + include : difference + spiro-outline + corner df.leftSB 0 + corner df.leftSB knee + corner (df.middle - roofHalf) top + corner (df.middle + roofHalf) top + corner df.rightSB knee + corner df.rightSB 0 + spiro-outline + corner (df.leftSB + sw) 0 + corner (df.leftSB + sw) knee + corner (df.middle - counterHalf) (top - sw) + corner (df.middle + counterHalf) (top - sw) + corner (df.rightSB - sw) knee + corner (df.rightSB - sw) 0 + include : tagged 'crossBar' : HBar.t (df.leftSB + sw) (df.rightSB - sw) yBar sw + : else : begin + include : Outer df bodyShape top sw + include : CrossBar df bodyShape top sw + include : ASerifs df top sw slabKind define [CuspBottomRightRemovedImpl df bodyShape slabKind top sw] : new-glyph : glyph-proc local yBar : BarPos bodyShape slabKind top diff --git a/packages/font-glyphs/src/letter/latin/upper-n.ptl b/packages/font-glyphs/src/letter/latin/upper-n.ptl index 2bb63b9..730ad82 100644 --- a/packages/font-glyphs/src/letter/latin/upper-n.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-n.ptl @@ -149,6 +149,8 @@ glyph-block Letter-Latin-Upper-N : begin create-glyph "N.\(suffix)" : glyph-proc include : MarkSet.capital include : NShape [DivFrame 1] CAP bodyType slabType + # Wider ink, unchanged cell advance and stem weight. + kSB -- ((Width - [Math.min 472.35 (339 + 1.27 * Stroke)] * Width / 660) / (2 * SB)) swDiag -- [AdviceStroke crDiag] set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 diff --git a/packages/font-glyphs/src/letter/latin/upper-p.ptl b/packages/font-glyphs/src/letter/latin/upper-p.ptl index 83e04e6..f428b96 100644 --- a/packages/font-glyphs/src/letter/latin/upper-p.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-p.ptl @@ -36,17 +36,15 @@ glyph-block Letter-Latin-Upper-P : begin define [PShapeOutlineKnots top df mul bp overshoot sw offset] : begin local bowlTop : top - offset local bowlBottom : [PBarPosY top sw bp] + offset - local turnRadius : BowlXDepth bowlTop bowlBottom df.leftSB df.rightSB sw - local ada : ArchDepthAOf (ArchDepth * 0.9) df.width - local adb : ArchDepthBOf (ArchDepth * 0.9) df.width local left : mix 0 df.leftSB mul - local right : df.rightSB - offset - local turn : YSmoothMidR bowlTop bowlBottom ada adb + local right : left + (df.rightSB - df.leftSB) * 0.93 - offset + # Quarter-turns separated by a real vertical, not one continuous oval. + local turnRadius : Math.min ((bowlTop - bowlBottom) * 0.36) ((right - left) / 2) return : list flat (left - O) bowlTop [heading Rightward] curl [Arch.adjust-x.top (right - turnRadius) (sw -- sw)] bowlTop archv - g4 (right - overshoot) turn + flatside.rd right bowlBottom bowlTop turnRadius turnRadius 0 arcvh flat [Arch.adjust-x.bot (right - turnRadius) (sw -- sw)] bowlBottom curl (left - O) bowlBottom [heading Leftward] @@ -133,7 +131,7 @@ glyph-block Letter-Latin-Upper-P : begin set PShape.defaultMul 1.25 set PShape.defaultOvershoot : OX * 2 - set PShape.BarPos : 1 - HBarPos + set PShape.BarPos 0.40 set PShape.SwBelowBar 0.25 set PShape.SlabMotion : function [top df sw mul] : glyph-proc diff --git a/packages/font-glyphs/src/letter/latin/upper-q.ptl b/packages/font-glyphs/src/letter/latin/upper-q.ptl index 114ea5a..cd7028f 100644 --- a/packages/font-glyphs/src/letter/latin/upper-q.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-q.ptl @@ -110,13 +110,20 @@ glyph-block Letter-Latin-Upper-Q : begin glyph-block-export QCrossing define [QCrossing df top sw] : begin - define k 1.5 - define cor : DiagCor (k * (df.rightSB - df.middle)) (df.rightSB - df.middle - OX) - define shift : XH * (-0.1) - return : dispiro - widths.center (cor * sw) - flat df.rightSB shift [heading Upward] - curl (df.middle + OX) (k * (df.rightSB - df.middle) + shift) [heading Upward] + # Short, near-45-degree tail with perpendicular end cuts. + local tailSw : mix sw Stroke 0.75 + local x0 : df.middle + 0.01 * (df.rightSB - df.leftSB) + local y0 : top * 0.29 + local x1 : df.rightSB - tailSw * 0.20 + local y1 : top * 0.01 + local length : Math.hypot (x1 - x0) (y1 - y0) + local nx : (y0 - y1) * tailSw / (2 * length) + local ny : (x1 - x0) * tailSw / (2 * length) + return : spiro-outline + corner (x0 + nx) (y0 + ny) + corner (x1 + nx) (y1 + ny) + corner (x1 - nx) (y1 - ny) + corner (x0 - nx) (y0 - ny) define [QCrossingBaseline df top sw] : begin define cor : DiagCor (0.5 * (top - Stroke)) (df.rightSB - df.middle - OX) diff --git a/packages/font-glyphs/src/letter/latin/upper-r.ptl b/packages/font-glyphs/src/letter/latin/upper-r.ptl index 7bde844..433fb24 100644 --- a/packages/font-glyphs/src/letter/latin/upper-r.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-r.ptl @@ -110,7 +110,7 @@ glyph-block Letter-Latin-Upper-R : begin local-parameter : legBottom -- 0 local fSlabBot : slab && slab !== PShape.SlabMotion - local right : df.rightSB - O - [if slab 0.125 0] * Jut + local right : [mix 0 df.leftSB mul] + (df.rightSB - df.leftSB) * 0.95 - [if slab 0.125 0] * Jut include : difference PShape top (df -- df) (mul -- mul) (overshoot -- O) (slab -- slab) (bp -- bp) (sw -- sw) if open diff --git a/packages/font-glyphs/src/letter/latin/w.ptl b/packages/font-glyphs/src/letter/latin/w.ptl index 40597f0..385c6ed 100644 --- a/packages/font-glyphs/src/letter/latin/w.ptl +++ b/packages/font-glyphs/src/letter/latin/w.ptl @@ -292,13 +292,27 @@ glyph-block Letter-Latin-W : begin eject-contour 'strokeUp2' define [WVertSides df top bodyType slabType midHClass] : glyph-proc - local wMidHeight : WMidHeight df top bodyType midHClass - local wMidHeightExt : WMidHeightExt wMidHeight top bodyType midHClass - - include : new-glyph : glyph-proc - include : MShape top df (form -- 2) (slabType -- 0) (middleYExt -- (top - wMidHeightExt)) - include : FlipAround (df.width / 2) (top / 2) - + local sw : HSwToV Stroke + local span : [if (top > XH) (496 + 1.06 * sw) [Math.min 578 (386 + 1.71 * sw)]] * df.width / 660 + local left : df.middle - span / 2 + local right : df.middle + span / 2 + local lean : span * 0.07 + local roof : top * 0.68 + # Flat central roof and feet; outer strokes lean slightly inward. + include : spiro-outline + corner left top + corner (left + lean) 0 + corner (left + lean + 1.25 * sw) 0 + corner df.middle (roof - 1.15 * sw) + corner (right - lean - 1.25 * sw) 0 + corner (right - lean) 0 + corner right top + corner (right - sw) top + corner (right - lean - 0.75 * sw) (0.75 * sw) + corner (df.middle + sw / 2) roof + corner (df.middle - sw / 2) roof + corner (left + lean + 0.75 * sw) (0.75 * sw) + corner (left + sw) top include : WSerifs df top bodyType slabType define [WVSHookRightShape df top bodyType slabType midHClass] : glyph-proc diff --git a/packages/font-glyphs/src/letter/shared.ptl b/packages/font-glyphs/src/letter/shared.ptl index 1bedc6e..706f248 100644 --- a/packages/font-glyphs/src/letter/shared.ptl +++ b/packages/font-glyphs/src/letter/shared.ptl @@ -429,6 +429,8 @@ glyph-block Letter-Shared-Shapes : begin local-parameter : ada -- SmallArchDepthA local-parameter : adb -- SmallArchDepthB + # Keep attached bowls nearly monolinear at their stem junctions. + set fine : mix fine sw 0.90 return : dispiro widths.lhs fine flatside.ld (left + [HSwToV : sw - fine]) bot top ada adb 0 diff --git a/packages/font-glyphs/src/meta/aesthetics.ptl b/packages/font-glyphs/src/meta/aesthetics.ptl index 8397bf6..078716d 100644 --- a/packages/font-glyphs/src/meta/aesthetics.ptl +++ b/packages/font-glyphs/src/meta/aesthetics.ptl @@ -255,11 +255,11 @@ export : define [setFontMetrics para metrics fm] : begin set fm.os2.sxHeight XH set fm.os2.sCapHeight CAP - local slope : Math.tan para.slopeAngle - set fm.post.italicAngle : Math.round (0 - para.slopeAngle) - set fm.hhea.caretSlopeRise : if para.slopeAngle (1000) 1 - set fm.hhea.caretSlopeRun : if para.slopeAngle ((-slope) * 1000) 0 - set fm.hhea.caretOffset : if para.slopeAngle ((-slope) * para.symbolMid) 0 + local slope : Math.tan : para.slopeAngle / 180 * Math.PI + set fm.post.italicAngle : 0 - para.slopeAngle + set fm.hhea.caretSlopeRise : if para.slopeAngle 1000 1 + set fm.hhea.caretSlopeRun : Math.round : slope * 1000 + set fm.hhea.caretOffset : Math.round : (-slope) * para.symbolMid # Fixed metrics set fm.os2.yStrikeoutPosition para."os2.yStrikeoutPosition" diff --git a/packages/font-glyphs/src/number/0.ptl b/packages/font-glyphs/src/number/0.ptl index 7b46d70..6b083df 100644 --- a/packages/font-glyphs/src/number/0.ptl +++ b/packages/font-glyphs/src/number/0.ptl @@ -47,8 +47,8 @@ glyph-block Digits-Zero : begin curl Width (top * (1 - 0.77)) define [ZeroTallSlash top] : dispiro - flat 0 0 [widths.center OverlayStroke] - curl Width top + flat ((Width - top * 0.419) / 2) 0 [widths.center OverlayStroke] + curl ((Width + top * 0.419) / 2) top define [ZeroTallRevSlash top] : dispiro flat 0 top [widths.center OverlayStroke] curl Width 0 diff --git a/packages/font-glyphs/src/number/4.ptl b/packages/font-glyphs/src/number/4.ptl index aae08cc..a8a7486 100644 --- a/packages/font-glyphs/src/number/4.ptl +++ b/packages/font-glyphs/src/number/4.ptl @@ -54,15 +54,15 @@ glyph-block Digits-Four : begin return : FourStdShape top true crossing (fine -- [AdviceStroke 2.75]) (slab -- slab) define [FourOpenShape top crossing slab] : glyph-proc - local yBar : top * 0.4 - local fine : AdviceStroke 3 - - define xVertBar : mix SB RightSB : if crossing 0.825 0.9125 - define xHBarTerminal : if crossing RightSB xVertBar - - include : HBar.t SB xHBarTerminal yBar - include : VBar.r xVertBar 0 [mix (yBar - Stroke) top 0.75] - include : VBar.l SB yBar top + local left : SB - 0.06 * (RightSB - SB) + local right : RightSB + 0.06 * (RightSB - SB) + local yBar : top * 0.32 + define xVertBar : mix left right : if crossing 0.82 0.91 + define xHBarTerminal : if crossing right xVertBar + include : HBar.t left xHBarTerminal yBar + include : VBar.r xVertBar 0 (top * 0.55) + include : intersection [Rect top (yBar - Stroke) left right] + ExtLineCenter (left + Stroke * 0.10) (yBar - Stroke * 0.5) [mix left right 0.65] top Stroke 2 if slab : begin include : HSerif.rb (xVertBar - [HSwToV HalfStroke]) 0 Jut include : HSerif.lb (xVertBar - [HSwToV HalfStroke]) 0 MidJutSide diff --git a/packages/font-glyphs/src/number/6.ptl b/packages/font-glyphs/src/number/6.ptl index 25a2d85..8c30289 100644 --- a/packages/font-glyphs/src/number/6.ptl +++ b/packages/font-glyphs/src/number/6.ptl @@ -1,5 +1,7 @@ $$include '../meta/macros.ptl' +import [sixShape] from "../../iocgn-shapes.mjs" + import [mix linreg clamp fallback] from "@iosevka/util" glyph-module @@ -26,18 +28,7 @@ glyph-block Digits-Six : begin glyph-block-export ClosedContourSixShape define [ClosedContourSixShape top] : glyph-proc - local oTop : Math.max (2 * SmallArchDepth + TINY) (top * 0.55 + HalfStroke) - include : dispiro - widths.rhs ShoulderFine - straight.up.start (SB + OX + [HSwToV (Stroke - ShoulderFine)]) (oTop - SmallArchDepthA) - Arch.rhs oTop (swBefore -- ShoulderFine) - flat (RightSB - OX) (oTop - SmallArchDepthB) - curl (RightSB - OX) SmallArchDepthA - Arch.rhs 0 - flat (SB + OX) SmallArchDepthB - curl (SB + OX) (top - SmallArchDepthA) - HookEnd top - g4 (RightSB - OX) (top - Hook) + include : sixShape Middle Width top [HSwToV Stroke] glyph-block-export StraightBarSixShape define [StraightBarSixShape] : with-params [charTop [sw Stroke] [bbd 0]] : glyph-proc diff --git a/packages/font-otl/src/gsub-locl.ptl b/packages/font-otl/src/gsub-locl.ptl index a2a6476..cf53781 100644 --- a/packages/font-otl/src/gsub-locl.ptl +++ b/packages/font-otl/src/gsub-locl.ptl @@ -77,7 +77,7 @@ export : define [buildLOCL gsub para glyphStore] : begin loclNSM.addLookup : gsub.createLookup .type 'gsub_single' .substitutions : object - 'Eng' : glyphStore.ensureExists 'Eng.NSM' + 'Eng' 'Eng.NSM' # PLK define loclPLK : latnPLK.addFeature : gsub.createFeature 'locl' @@ -90,10 +90,10 @@ export : define [buildLOCL gsub para glyphStore] : begin loclROM.addLookup : gsub.createLookup .type 'gsub_single' .substitutions : object - 'SCedilla' : glyphStore.ensureExists 'SComma' - 'sCedilla' : glyphStore.ensureExists 'sComma' - 'TCedilla' : glyphStore.ensureExists 'TComma' - 'tCedilla' : glyphStore.ensureExists 'tComma' + 'SCedilla' 'SComma' + 'sCedilla' 'sComma' + 'TCedilla' 'TComma' + 'tCedilla' 'tComma' # TRK define loclTRK : gsub.createFeature 'locl' @@ -130,9 +130,11 @@ export : define [buildLOCL gsub para glyphStore] : begin foreach ch (viCircumflex + viBreve) : begin local u : ch.codePointAt 0 local gn : glyphStore.queryNameByUnicode u - local g : glyphStore.queryByNameEnsured gn - local decomp : CvDecompose.get g - set decompositionSubstitutions.(gn) decomp + # The iocgn store omits Vietnamese letters. + if gn : begin + local g : glyphStore.queryByNameEnsured gn + local decomp : CvDecompose.get g + set decompositionSubstitutions.(gn) decomp loclVIT.addLookup : gsub.createLookup .type 'gsub_chaining' diff --git a/packages/font/src/cleanup/glyphs.mjs b/packages/font/src/cleanup/glyphs.mjs index 902b3ea..9d7ad7e 100644 --- a/packages/font/src/cleanup/glyphs.mjs +++ b/packages/font/src/cleanup/glyphs.mjs @@ -28,6 +28,8 @@ function regulateGlyphStore(cache, para, skew, glyphStore) { function flattenSimpleGlyph(cache, para, _skew, g) { try { if (!g.gizmo) throw new TypeError("No gizmo"); + // iocgn-native has already simplified, rounded and placed these outlines. + if (g.koelnFinal) return g.geometry.toContours(); const gSimplified = Geom.SimplifyGeometry.wrapWithGizmo(g.geometry, g.gizmo); return gSimplified.toContours({ cache }); } catch (e) { diff --git a/packages/param/src/metric-override.mjs b/packages/param/src/metric-override.mjs index ddcb431..7ea406a 100644 --- a/packages/param/src/metric-override.mjs +++ b/packages/param/src/metric-override.mjs @@ -24,6 +24,10 @@ const validMetricOverrideFields = new Set([ "ascender", "xHeight", "sb", + "stroke", + "contrast", + "descender", + "longjut", "accentWidth", "accentClearance", "accentHeight",