diff --git a/changes/16.3.1.md b/changes/16.3.1.md new file mode 100644 index 000000000..90557329c --- /dev/null +++ b/changes/16.3.1.md @@ -0,0 +1 @@ + * Fix shape of LATIN SMALL LETTER E WITH OGONEK (`U+0119`) (#1427). diff --git a/font-src/glyphs/letter/latin/lower-a.ptl b/font-src/glyphs/letter/latin/lower-a.ptl index 6626e2ecc..1aecfb5bf 100644 --- a/font-src/glyphs/letter/latin/lower-a.ptl +++ b/font-src/glyphs/letter/latin/lower-a.ptl @@ -9,7 +9,7 @@ glyph-block Letter-Latin-Lower-A : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives glyph-block-import Mark-Shared-Metrics : markHalfStroke - glyph-block-import Letter-Shared : CreateAccentedComposition + glyph-block-import Letter-Shared : CreateAccentedComposition CreateOgonekComposition glyph-block-import Letter-Shared-Shapes : RightwardTailedBar DToothlessRise DMBlend define ADoubleStoreyStroke : AdviceStroke2 2 3 XH @@ -70,14 +70,14 @@ glyph-block Letter-Latin-Lower-A : begin create-glyph 'a.doubleStoreySerifless' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' RightSB 0 include : union ADoubleStoreyHookAndBar 0 ADoubleStoreyArc 0 create-glyph 'a.doubleStoreySerifed' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' (RightSB + SideJut) 0 include : union ADoubleStoreyHookAndBar 0 ADoubleStoreyArc 0 @@ -101,7 +101,7 @@ glyph-block Letter-Latin-Lower-A : begin create-glyph 'a.doubleStoreyTailed' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' (RightSB + SideJut) 0 include : union ADoubleStoreyHookAndBar (XH - ADoubleStoreySmoothB + O) ADoubleStoreyArc 0 @@ -109,47 +109,47 @@ glyph-block Letter-Latin-Lower-A : begin create-glyph 'a.doubleStoreyToothlessCorner' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + # set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 include : union ADoubleStoreyHookAndBar DToothlessRise ADoubleStoreyArc 1 DToothlessRise create-glyph 'a.doubleStoreyToothlessRounded' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + # set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 include : union ADoubleStoreyHookAndBar ADoubleStoreySmoothA ADoubleStoreyArc 2 ADoubleStoreySmoothA create-glyph 'a.singleStoreySerifless' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' RightSB 0 include : OBarRightShape include : VBarRight RightSB 0 XH create-glyph 'a.singleStoreySerifed' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' (RightSB + SideJut) 0 include : OBarRightShape include : VBarRight RightSB 0 XH include : tagged 'serifRB' : RightwardBottomSerif RightSB 0 SideJut create-glyph 'a.singleStoreyTailed' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' (RightSB + SideJut) 0 include : OBarRightShape include : RightwardTailedBar RightSB 0 XH create-glyph 'a.singleStoreyEarlessCornerSerifless' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' RightSB 0 include : OBarLeftToothlessShape XH SB DToothlessRise DMBlend include : FlipAround Middle (XH / 2) include : VBarRight RightSB 0 (XH - DToothlessRise) create-glyph 'a.singleStoreyEarlessCornerSerifed' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' (RightSB + SideJut) 0 include : OBarLeftToothlessShape XH SB DToothlessRise DMBlend include : FlipAround Middle (XH / 2) include : VBarRight RightSB 0 (XH - DToothlessRise) @@ -157,27 +157,27 @@ glyph-block Letter-Latin-Lower-A : begin create-glyph 'a.singleStoreyEarlessCornerTailed' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' (RightSB + SideJut) 0 include : OBarLeftToothlessShape XH SB DToothlessRise DMBlend include : FlipAround Middle (XH / 2) include : RightwardTailedBar RightSB 0 (XH - DToothlessRise) create-glyph 'a.singleStoreyEarlessRoundedSerifless' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' RightSB 0 include : OBarLeftRoundedShape XH SB XH include : FlipAround Middle (XH / 2) create-glyph 'a.singleStoreyEarlessRoundedSerifed' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' (RightSB + SideJut) 0 include : OBarLeftRoundedShape XH SB XH include : FlipAround Middle (XH / 2) include : tagged 'serifRB' : RightwardBottomSerif RightSB 0 SideJut create-glyph 'a.singleStoreyEarlessRoundedTailed' : glyph-proc include : MarkSet.e - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' (RightSB + SideJut) 0 include : OBarLeftRoundedShape XH SB (SmallArchDepthB - O) include : FlipAround Middle (XH / 2) include : RightwardTailedBar RightSB 0 (XH - SmallArchDepthB) @@ -232,3 +232,6 @@ glyph-block Letter-Latin-Lower-A : begin CreateAccentedComposition 'aDieresis' 0xE4 'a' 'dieresisAbove' CreateAccentedComposition 'aSbRsbUnderlineBelow' null 'a' 'sbRsbUnderlineBelow' CreateAccentedComposition 'aRightHalfRingTR' 0x1E9A 'a' 'rightHalfCircleTR' + + # Ognoek shapes + CreateOgonekComposition 'aOgonek' 0x105 'a' diff --git a/font-src/glyphs/letter/latin/lower-e.ptl b/font-src/glyphs/letter/latin/lower-e.ptl index 74f04c0aa..c95f161b5 100644 --- a/font-src/glyphs/letter/latin/lower-e.ptl +++ b/font-src/glyphs/letter/latin/lower-e.ptl @@ -10,12 +10,15 @@ glyph-block Letter-Latin-Lower-E : begin glyph-block-import Common-Derivatives glyph-block-import Letter-Shared-Shapes : FlatHookDepth + glyph-block-import Mark-Shared-Metrics : markExtend markStroke markStress markFine + glyph-block-import Mark-Above : aboveMarkTop aboveMarkBot aboveMarkMid aboveMarkStack + define [SmallEShape] : params [df top stroke barpos curly [bbd 0]] : glyph-proc local barbottom : top * [fallback barpos DesignParameters.eBarPos] - (stroke / 2) local hook : Math.min AHook : if para.isItalic top (stroke / 2 + (top - stroke * 3) / 4) include : HBarBottom (df.leftSB + (stroke / 2) + OX + bbd) (df.rightSB - (stroke / 2) - OX) barbottom stroke - include : dispiro + local path : include : dispiro widths.lhs stroke flat (df.rightSB - OX) barbottom [heading Upward] curl (df.rightSB - OX) (top - SmallArchDepthB) @@ -27,6 +30,8 @@ glyph-block Letter-Latin-Lower-E : begin hookend O (sw -- stroke) g4 (df.rightSB - OX * [if para.isItalic 0 0.5]) hook + return path.rhsKnots.[path.rhsKnots.length - 1] + define [RevSmallEShape] : params [df top stroke barpos] : glyph-proc local barbottom (top * [fallback barpos DesignParameters.eBarPos] - HalfStroke) local hookx df.leftSB @@ -53,7 +58,7 @@ glyph-block Letter-Latin-Lower-E : begin local xStart : df.leftSB + (0.125 * stroke * HVContrast) local pfIt : if para.isItalic 1 0 - include : dispiro + local path : include : dispiro widths.lhs stroke [if para.isItalic g2 flat] xStart (barbottom - pfIt * [StrokeWidthBlend 2 3] * O) if para.isItalic [alsoThru.g2 0.5 0.8] [list] @@ -68,6 +73,8 @@ glyph-block Letter-Latin-Lower-E : begin hookend O (sw -- stroke) g4 (df.rightSB - OX * [if para.isItalic 0 0.5]) hook + return path.rhsKnots.[path.rhsKnots.length - 1] + define [RevSmallERoundedShape] : params [df top stroke barpos] : glyph-proc local barbottom : top * [fallback barpos : if para.isItalic 0.500 0.475] - (stroke / 2) local hook : Math.min AHook : if para.isItalic top (stroke / 2 + (top - stroke * 3) / 4) @@ -119,6 +126,30 @@ glyph-block Letter-Latin-Lower-E : begin include : MarkSet.e include : Body [DivFrame 1] XH [AdviceStroke2 2 3 XH] + create-glyph "eOgonek.\(suffix)" : glyph-proc + include : MarkSet.e + local lastKnot : include : Body [DivFrame 1] XH [AdviceStroke2 2 3 XH] + + # Connected Ogonek shape + local fine : AdviceStroke 8 + local depth : 0 - Descender - markStroke + local extL : (7 / 16) * depth + 0.25 * markStress + local extR : Math.max (0.0625 * markExtend) (1.5 * TanSlope * markStroke) + local beginCoSlope : if para.isItalic 0.2 0 + + set-base-anchor 'trailing' (RightSB + extR) (-depth + 0.5 * O - markStroke) + + include : intersection + MaskBelow lastKnot.y + dispiro + g4 lastKnot.x lastKnot.y [widths.rhs fine] + g4 (lastKnot.x - beginCoSlope * 0.01) (lastKnot.y - 0.01) + alsoThru.withOffset 0.5 0.525 0 (-0.25 * [mix fine markStroke 0.5]) [widths.rhs [mix fine markStroke 0.5]] + g4.down.mid (RightSB - extL) (-0.75 * depth) [widths.rhs.heading markStroke {.x (HVContrast) .y (0.5 * (markStroke - fine) / markStroke)}] + arcvh [widths.rhs markStroke] + g4 (RightSB + [mix (-extL) extR (11/16)]) (-depth + O) [heading Rightward] + g4 (RightSB + extR) (-depth + 0.5 * O) [heading Rightward] + create-glyph "Schwa.\(suffix)" : glyph-proc include : MarkSet.capital include : Body [DivFrame 1] CAP [AdviceStroke2 2 3 CAP] @@ -160,6 +191,8 @@ glyph-block Letter-Latin-Lower-E : begin alias 'cyrl/ie' 0x435 'e' turned 'turne' 0x1DD 'e' Middle (XH / 2) + select-variant 'eOgonek' 0x119 (follow -- 'e') + select-variant 'Schwa' 0x18F alias 'cyrl/Schwa' 0x4D8 'Schwa' diff --git a/font-src/glyphs/letter/latin/lower-il.ptl b/font-src/glyphs/letter/latin/lower-il.ptl index 725b2e818..b02d95ade 100644 --- a/font-src/glyphs/letter/latin/lower-il.ptl +++ b/font-src/glyphs/letter/latin/lower-il.ptl @@ -8,7 +8,7 @@ glyph-module glyph-block Letter-Latin-Lower-I : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives - glyph-block-import Letter-Shared : CreateAccentedComposition CreateMultiAccentedComposition + glyph-block-import Letter-Shared : CreateAccentedComposition CreateMultiAccentedComposition CreateOgonekComposition glyph-block-import Letter-Shared-Shapes : FlatHookDepth DiagonalTailR DiagonalTailStdDepth glyph-block-import Letter-Shared : CreateCommaCaronComposition glyph-block-import Letter-Shared-Shapes : CurlyTail @@ -55,7 +55,6 @@ glyph-block Letter-Latin-Lower-I : begin export : define [Serifless df top xMiddle] : glyph-proc include : OverrideILMarks df xMiddle top include : VBar xMiddle 0 top - set-base-anchor 'trailing' xMiddle 0 export : define [HookyBottom df top xMiddle] : glyph-proc include : OverrideILMarks df xMiddle top @@ -271,6 +270,8 @@ glyph-block Letter-Latin-Lower-I : begin CreateAccentedComposition 'dotlessiBarOver' null 'dotlessi' 'barOver' CreateAccentedComposition 'iBarOver' 0x268 'dotlessiBarOver' 'dotAbove' + CreateOgonekComposition 'iOgonek' 0x12F 'i' + do "l glyphs" select-variant 'l' 'l' link-reduced-variant 'l/sansSerif' 'l' MathSansSerif diff --git a/font-src/glyphs/letter/latin/o.ptl b/font-src/glyphs/letter/latin/o.ptl index eb68c9250..8accbaa2b 100644 --- a/font-src/glyphs/letter/latin/o.ptl +++ b/font-src/glyphs/letter/latin/o.ptl @@ -16,17 +16,14 @@ glyph-block Letter-Latin-O : begin create-glyph 'O' 'O' : glyph-proc include : MarkSet.capital include : OShape CAP 0 SB RightSB nothing ArchDepthA ArchDepthB - set-base-anchor 'trailing' Middle 0 create-glyph 'smcpO' 0x1D0F : glyph-proc include : MarkSet.e include : OShape XH 0 SB RightSB nothing ArchDepthA ArchDepthB - set-base-anchor 'trailing' Middle 0 create-glyph 'o' 'o' : glyph-proc include : MarkSet.e include : OShape XH 0 SB RightSB nothing nothing nothing - set-base-anchor 'trailing' Middle 0 create-glyph 'oSideways' 0x1D11 : glyph-proc include : MarkSet.e @@ -40,7 +37,6 @@ glyph-block Letter-Latin-O : begin include : OShape CAP 0 SB RightSB df.mvs ArchDepthA ArchDepthB include : DotAt Middle (df.mvs / 2 + O) rBroadOn include : DotAt Middle (CAP - df.mvs / 2 - O) rBroadOn - set-base-anchor 'trailing' Middle 0 create-glyph 'cyrl/broadOn' 0x47B : glyph-proc define df : DivFrame 1 3 @@ -48,7 +44,6 @@ glyph-block Letter-Latin-O : begin include : OShape XH 0 SB RightSB df.mvs nothing nothing include : DotAt Middle (df.mvs / 2 + O) rBroadOn include : DotAt Middle (XH - df.mvs / 2 - O) rBroadOn - set-base-anchor 'trailing' Middle 0 create-glyph 'grek/Omicron' 0x39F : glyph-proc include [refer-glyph 'O'] AS_BASE ALSO_METRICS diff --git a/font-src/glyphs/letter/latin/u.ptl b/font-src/glyphs/letter/latin/u.ptl index 69519612a..fd4f1fd2f 100644 --- a/font-src/glyphs/letter/latin/u.ptl +++ b/font-src/glyphs/letter/latin/u.ptl @@ -9,7 +9,7 @@ glyph-block Letter-Latin-U : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives glyph-block-import Mark-Shared-Metrics : markHalfStroke - glyph-block-import Letter-Shared : CreateAccentedComposition SetGrekUpperTonos + glyph-block-import Letter-Shared : CreateAccentedComposition SetGrekUpperTonos CreateOgonekComposition glyph-block-import Letter-Shared-Shapes : nShoulder RightwardTailedBar DToothlessRise SerifFrame glyph-block-import Letter-Shared-Shapes : CyrTailDescender @@ -36,7 +36,7 @@ glyph-block Letter-Latin-U : begin offset -- offset define [UToothed df top] : glyph-proc - set-base-anchor 'trailing' (df.rightSB - markHalfStroke) 0 + set-base-anchor 'trailing' df.rightSB 0 include : nShoulder top -- top left -- (df.leftSB + Stroke * HVContrast) @@ -46,7 +46,7 @@ glyph-block Letter-Latin-U : begin include : VBarRight df.rightSB 0 top define [UTailed df top] : glyph-proc - set-base-anchor 'trailing' (df.rightSB - markHalfStroke) 0 + set-base-anchor 'trailing' (df.rightSB + SideJut) 0 include : nShoulder top -- top left -- (df.leftSB + Stroke * HVContrast) @@ -56,15 +56,12 @@ glyph-block Letter-Latin-U : begin include : RightwardTailedBar df.rightSB 0 top define [UToothlessRounded df top] : glyph-proc - set-base-anchor 'trailing' df.middle 0 include : UShape df top 0 define [UToothlessRoundedSmall df top] : glyph-proc - set-base-anchor 'trailing' df.middle 0 include : UShape df top 0 (ada -- SmallArchDepthA) (adb -- SmallArchDepthB) define [UToothlessCorner df top] : glyph-proc - set-base-anchor 'trailing' df.middle 0 include : VBarLeft df.leftSB 0 (top - DToothlessRise) include : dispiro widths.rhs @@ -76,7 +73,6 @@ glyph-block Letter-Latin-U : begin include : FlipAround df.middle (top / 2) define [UToothlessCornerSmall df top] : glyph-proc - set-base-anchor 'trailing' df.middle 0 include : VBarLeft df.leftSB 0 (top - DToothlessRise) include : dispiro widths.rhs @@ -93,8 +89,11 @@ glyph-block Letter-Latin-U : begin define [UTopRightSerif df yTop] : tagged 'serifRT' LeftwardTopSerif (df.rightSB - Stroke * HVContrast) yTop SideJut - define [UBottomRightSerif df yTop] : tagged 'serifRB' - RightwardBottomSerif df.rightSB 0 SideJut + define [UBottomRightSerif df yTop] : glyph-proc + include : tagged 'serifRB' : RightwardBottomSerif df.rightSB 0 SideJut + define trAnchor currentGlyph.baseAnchors.trailing + if trAnchor : begin + set-base-anchor 'trailing' (trAnchor.x + SideJut) trAnchor.y define [SmallUSlabs df top] : glyph-proc : if SLAB : begin include : UTopLeftSerif df top @@ -299,3 +298,6 @@ glyph-block Letter-Latin-U : begin include : Translate 0 (SB / 2) CreateAccentedComposition 'uDieresisSideways' 0x1D1E 'uDieresisSidewaysBase' 'uDieresisSidewaysMark' + + CreateOgonekComposition 'UOgonek' 0x172 'U' + CreateOgonekComposition 'uOgonek' 0x173 'u' diff --git a/font-src/glyphs/letter/latin/upper-a.ptl b/font-src/glyphs/letter/latin/upper-a.ptl index af2317cda..a8ed10b2a 100644 --- a/font-src/glyphs/letter/latin/upper-a.ptl +++ b/font-src/glyphs/letter/latin/upper-a.ptl @@ -9,7 +9,7 @@ glyph-block Letter-Latin-Upper-A : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives glyph-block-import Mark-Shared-Metrics : markHalfStroke - glyph-block-import Letter-Shared : SetGrekUpperTonos + glyph-block-import Letter-Shared : SetGrekUpperTonos CreateOgonekComposition glyph-block-import Letter-Shared-Shapes : SerifFrame glyph-block-import Letter-Latin-V : VShapeOutline VShape glyph-block-export LambdaShape AMaskShape DeltaShape @@ -48,7 +48,7 @@ glyph-block Letter-Latin-Upper-A : begin define [AShapeImpl mak top fGrek] : glyph-proc local df : DivFrame 1 include : df.markSet.(mak) - set-base-anchor 'trailing' (df.rightSB - markHalfStroke) 0 + set-base-anchor 'trailing' df.rightSB 0 if fGrek : include : SetGrekUpperTonos [if (slabKind === SLAB-TOP || slabKind === SLAB-TRI) 0 0.2] * (df.rightSB - df.leftSB) include : VShape df top Stroke fStraightBar @@ -122,4 +122,6 @@ glyph-block Letter-Latin-Upper-A : begin intersection BBVInnerMaskShape SB RightSB 1 1 CAP HBarTop 0 Width (CAP - XH / 2) BBS - include : FlipAround Middle (CAP / 2) \ No newline at end of file + include : FlipAround Middle (CAP / 2) + + CreateOgonekComposition 'AOgonek' 0x104 'A' diff --git a/font-src/glyphs/letter/latin/upper-e.ptl b/font-src/glyphs/letter/latin/upper-e.ptl index d0e44c90b..93785560e 100644 --- a/font-src/glyphs/letter/latin/upper-e.ptl +++ b/font-src/glyphs/letter/latin/upper-e.ptl @@ -9,7 +9,7 @@ glyph-block Letter-Latin-Upper-E : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives glyph-block-import Mark-Shared-Metrics : markHalfStroke - glyph-block-import Letter-Shared : SetGrekUpperTonos + glyph-block-import Letter-Shared : SetGrekUpperTonos CreateOgonekComposition glyph-block-import Letter-Latin-Upper-F : xMidBarShrink yMidBar EFVJutLength define kSB 1 @@ -49,7 +49,7 @@ glyph-block Letter-Latin-Upper-E : begin create-glyph "E.\(suffix)" : glyph-proc include : MarkSet.capital include : EShape CAP (serifLT -- lt) (serifLB -- lb) (serifV -- v) - set-base-anchor 'trailing' (RightSB - markHalfStroke) 0 + set-base-anchor 'trailing' RightSB 0 create-glyph "grek/Epsilon.\(suffix)" : glyph-proc include [refer-glyph "E.\(suffix)"] AS_BASE ALSO_METRICS @@ -84,3 +84,6 @@ glyph-block Letter-Latin-Upper-E : begin EShape CAP (serif -- false) (stroke -- BBS) Rect (CAP - BBS) BBS (xEBarLeft + BBS * HVContrast) (xEBarLeft + BBD) VBarLeft (xEBarLeft + BBD) 0 CAP BBS + + # Ognoek shapes + CreateOgonekComposition 'EOgonek' 0x118 'E' diff --git a/font-src/glyphs/letter/latin/upper-i.ptl b/font-src/glyphs/letter/latin/upper-i.ptl index 9f31cd871..e11196219 100644 --- a/font-src/glyphs/letter/latin/upper-i.ptl +++ b/font-src/glyphs/letter/latin/upper-i.ptl @@ -8,11 +8,10 @@ glyph-module glyph-block Letter-Latin-Upper-I : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives - glyph-block-import Letter-Shared : SetGrekUpperTonos CreateAccentedComposition + glyph-block-import Letter-Shared : SetGrekUpperTonos CreateAccentedComposition CreateOgonekComposition define [ISeriflessShape df top jut] : glyph-proc include : VBar df.middle 0 CAP - set-base-anchor 'trailing' df.middle 0 define [ISerifShape df top jut] : glyph-proc include : VBar df.middle 0 top @@ -58,3 +57,5 @@ glyph-block Letter-Latin-Upper-I : begin include : HBarBottom (Middle - BBD / 2 - Jut) (Middle + BBD / 2 + Jut) 0 BBS CreateAccentedComposition 'smcpIBarOver' 0x1D7B 'smcpI' 'barOver' + + CreateOgonekComposition 'IOgonek' 0x12E 'I' diff --git a/font-src/glyphs/letter/shared.ptl b/font-src/glyphs/letter/shared.ptl index 70085becf..32ea512a4 100644 --- a/font-src/glyphs/letter/shared.ptl +++ b/font-src/glyphs/letter/shared.ptl @@ -11,13 +11,22 @@ glyph-block Letter-Shared : begin glyph-block-import Common-Derivatives glyph-block-export CreateAccentedComposition - define [CreateAccentedComposition dst u srcGid accentGid fDontDecompose] + define [CreateAccentedComposition dst u srcGid accentGid] derive-multi-part-glyphs dst u { srcGid accentGid } : function [gns gr] : glyph-proc local { base mark } gns include [refer-glyph base] AS_BASE ALSO_METRICS include [refer-glyph mark] if (!gr && accentGid === 'dotAbove') : Dotless.set currentGlyph base + glyph-block-export CreateOgonekComposition + define [CreateOgonekComposition dst u srcGid] + derive-multi-part-glyphs dst u { srcGid 'ogonekBelow' 'ogonekTR' } : function [gns gr] : glyph-proc + local { base markBelow markTR } gns + include [refer-glyph base] AS_BASE ALSO_METRICS + if currentGlyph.baseAnchors.trailing + then : include [refer-glyph markTR] + else : include [refer-glyph markBelow] + glyph-block-export CreateCommaCaronComposition define [CreateCommaCaronComposition dst u sourceGid] derive-multi-part-glyphs dst u { sourceGid 'commaTR' } : function [gns gr] : glyph-proc diff --git a/font-src/glyphs/marks/above.ptl b/font-src/glyphs/marks/above.ptl index ce990279c..af93907ad 100644 --- a/font-src/glyphs/marks/above.ptl +++ b/font-src/glyphs/marks/above.ptl @@ -14,7 +14,7 @@ glyph-block Mark-Above : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives - glyph-block-import Mark-Shared-Metrics : markExtend markHalfStroke markStress markFine + glyph-block-import Mark-Shared-Metrics : markExtend markStroke markHalfStroke markStress markFine glyph-block-import Mark-Shared-Metrics : markMiddle markDotsRadius glyph-block-export aboveMarkTop aboveMarkBot aboveMarkMid aboveMarkStack @@ -24,8 +24,8 @@ glyph-block Mark-Above : begin define aboveMarkStack (XH + AccentStackOffset) glyph-block-export commaOvershoot commaOvershoot2 commaAboveRadius - define commaOvershoot : O * [linreg 16 0 90 (-1) (markHalfStroke * 2)] - define commaOvershoot2 : O * [linreg 16 1 90 (-1) (markHalfStroke * 2)] + define commaOvershoot : O * [linreg 16 0 90 (-1) markStroke] + define commaOvershoot2 : O * [linreg 16 1 90 (-1) markStroke] define commaAboveRadius : 0.85 * DotRadius * markHalfStroke / HalfStroke define asciiMarkZoom : (RightSB - SB) / (markExtend * 3) @@ -58,8 +58,8 @@ glyph-block Mark-Above : begin select-variant 'dieresisAboveAlwaysUpright' (follow -- 'diacriticDot') define [RingDims] : begin - local radiusOut : AccentHeight * [linreg 16 0.5 90 0.75 (markHalfStroke * 2)] - local radiusIn : radiusOut - markFine * [linreg 16 2 90 1.75 (markHalfStroke * 2)] + local radiusOut : AccentHeight * [linreg 16 0.5 90 0.75 markStroke] + local radiusIn : radiusOut - markFine * [linreg 16 2 90 1.75 markStroke] return [object radiusIn radiusOut] create-glyph 'ringAbove' 0x30A : glyph-proc @@ -130,7 +130,7 @@ glyph-block Mark-Above : begin set-base-anchor 'aboveBrace' markMiddle aboveMarkMid include : dispiro - widths.rhs (markHalfStroke * 2) + widths.rhs markStroke flat (markMiddle - markExtend * 1.5) (aboveMarkTop + markFine * 0.7) curl (markMiddle + markStress * HVContrast) (aboveMarkTop + markFine * 0.7) include : dispiro @@ -146,7 +146,7 @@ glyph-block Mark-Above : begin flat (markMiddle - markExtend - markStress) (aboveMarkBot + markStress - markFine) [widths markStress markStress] curl markMiddle (aboveMarkTop + markFine * 0.7) [heading Upward] include : dispiro - widths.rhs (markHalfStroke * 2) + widths.rhs markStroke flat (markMiddle - markStress * HVContrast) (aboveMarkTop + markFine * 0.7) curl (markMiddle + markExtend * 1.5) (aboveMarkTop + markFine * 0.7) @@ -176,7 +176,7 @@ glyph-block Mark-Above : begin set-base-anchor 'aboveBrace' markMiddle aboveMarkMid include : dispiro - widths.lhs (markHalfStroke * 2) + widths.lhs markStroke flat (markMiddle - markExtend * 1.5) (aboveMarkBot - markFine * 1.7 + markStress) curl (markMiddle + markStress * HVContrast) (aboveMarkBot - markFine * 1.7 + markStress) include : dispiro @@ -192,7 +192,7 @@ glyph-block Mark-Above : begin flat (markMiddle - markExtend - markStress) aboveMarkTop [widths markStress markStress] curl markMiddle (aboveMarkBot - markFine * 1.7 + markStress) [heading Downward] include : dispiro - widths.lhs (markHalfStroke * 2) + widths.lhs markStroke flat (markMiddle - markStress * HVContrast) (aboveMarkBot - markFine * 1.7 + markStress) curl (markMiddle + markExtend * 1.5) (aboveMarkBot - markFine * 1.7 + markStress) @@ -497,7 +497,7 @@ glyph-block Mark-Above : begin local radius commaAboveRadius include : Ring (aboveMarkTop + commaOvershoot) (aboveMarkTop - radius * 2 + commaOvershoot) (markMiddle - radius) (markMiddle + radius) include : dispiro - widths.rhs : Math.min radius (markFine * [linreg 16 2 90 1.75 (markHalfStroke * 2)]) + widths.rhs : Math.min radius (markFine * [linreg 16 2 90 1.75 markStroke]) straight.down.start (markMiddle + radius) (aboveMarkTop - radius + commaOvershoot) quadControls 0 0.6 g4 [mix markMiddle (markMiddle - radius) 0.2] (aboveMarkBot - radius - commaOvershoot2) @@ -511,7 +511,7 @@ glyph-block Mark-Above : begin local radius : commaAboveRadius * DesignParameters.squareDotScalar include : Rect aboveMarkTop (aboveMarkTop - radius * 2) (markMiddle - radius) (markMiddle + radius) include : dispiro - widths.rhs : Math.min radius (markFine * [linreg 16 2 90 1.75 (markHalfStroke * 2)]) + widths.rhs : Math.min radius (markFine * [linreg 16 2 90 1.75 markStroke]) flat (markMiddle + radius) aboveMarkTop [heading Downward] curl (markMiddle + radius) (aboveMarkTop - 2 * radius) [heading Downward] quadControls 0 0.6 @@ -541,7 +541,7 @@ glyph-block Mark-Above : begin local radius commaAboveRadius include : Ring (aboveMarkTop + commaOvershoot) (aboveMarkTop - radius * 2 + commaOvershoot) (markMiddle - radius) (markMiddle + radius) include : dispiro - widths.lhs : Math.min radius (markFine * [linreg 16 2 90 1.75 (markHalfStroke * 2)]) + widths.lhs : Math.min radius (markFine * [linreg 16 2 90 1.75 markStroke]) straight.down.start (markMiddle - radius) (aboveMarkTop - radius + commaOvershoot) quadControls 0 0.6 g4 [mix markMiddle (markMiddle + radius) 0.2] (aboveMarkBot - radius - commaOvershoot2) @@ -555,7 +555,7 @@ glyph-block Mark-Above : begin local radius : commaAboveRadius * DesignParameters.squareDotScalar include : Rect (aboveMarkTop + commaOvershoot) (aboveMarkTop - radius * 2 + commaOvershoot) (markMiddle - radius) (markMiddle + radius) include : dispiro - widths.lhs : Math.min radius (markFine * [linreg 16 2 90 1.75 (markHalfStroke * 2)]) + widths.lhs : Math.min radius (markFine * [linreg 16 2 90 1.75 markStroke]) flat (markMiddle - radius) aboveMarkTop [heading Downward] curl (markMiddle - radius) (aboveMarkTop - 2 * radius) [heading Downward] quadControls 0 0.6 @@ -575,22 +575,22 @@ glyph-block Mark-Above : begin set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - include : VBar markMiddle aboveMarkBot aboveMarkTop (markHalfStroke * 2) + include : VBar markMiddle aboveMarkBot aboveMarkTop markStroke create-glyph 'ascenderBarAbove' : glyph-proc set-width 0 set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - include : VBar markMiddle [mix XH aboveMarkBot 0.5] CAP (markHalfStroke * 2) + include : VBar markMiddle [mix XH aboveMarkBot 0.5] CAP markStroke create-glyph 'dblBarAbove' 0x30E : glyph-proc set-width 0 set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - include : VBar (markMiddle - markExtend * 0.75) aboveMarkBot aboveMarkTop (markHalfStroke * 2) - include : VBar (markMiddle + markExtend * 0.75) aboveMarkBot aboveMarkTop (markHalfStroke * 2) + include : VBar (markMiddle - markExtend * 0.75) aboveMarkBot aboveMarkTop markStroke + include : VBar (markMiddle + markExtend * 0.75) aboveMarkBot aboveMarkTop markStroke create-glyph 'bridgeAbove' 0x346 : glyph-proc set-width 0 @@ -616,7 +616,7 @@ glyph-block Mark-Above : begin create-glyph "candrabinduAbove.\(suffix)" : glyph-proc set-width 0 local fine : AdviceStroke 6.5 - local arcSw : Math.min (markHalfStroke * 2) (fine * 1.25) + local arcSw : Math.min markStroke (fine * 1.25) local radius : Math.max (markExtend - DotRadius) (fine * 1.35) local yDot : mix aboveMarkBot aboveMarkTop 0.625 include : dispiro @@ -883,26 +883,18 @@ glyph-block Mark-Above : begin set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - local fine : [Math.min [AdviceStroke 8] (Stroke + O)] / 2 - local ogonekBot : XH - 2 * fine - local ogonekTop : aboveMarkMid + markStress - local ogonekLeft : markMiddle - markExtend - local ogonekRight : markMiddle + (ogonekTop - ogonekBot) * 0.5 - include : spiro-outline - corner (markMiddle - 0.1) ogonekBot - curl markMiddle ogonekBot - archv - g4 ogonekRight [mix ogonekBot ogonekTop 0.5] - arcvh - flat (markMiddle - markExtend * 0.25) ogonekTop - corner ogonekLeft ogonekTop - corner ogonekLeft (ogonekTop - markStress * 2) - curl (markMiddle - markExtend * 0.25) (ogonekTop - markStress * 2) - archv - g4 (ogonekRight - [mix fine markStress 0.75] * 2 * HVContrast) [mix (ogonekBot + fine * 2) (ogonekTop - markStress * 2) 0.5] - arcvh - flat markMiddle (ogonekBot + fine * 2) - corner (markMiddle - 0.1) (ogonekBot + fine * 2) + local fine : AdviceStroke 8 + local depth : 0 - Descender - markStroke + local fullExt : (7 / 16) * depth + 0.125 * markStress + local extR : 0.5 * fullExt + local extL : 0.5 * fullExt + 0.375 * markStroke + [Math.max (0.125 * markExtend) (1.5 * TanSlope * markStroke)] + + include : dispiro + g4 (markMiddle + [mix extR (-extL) 0.75]) XH [widths.rhs fine] + g4.up.mid (markMiddle + extR) (XH + 0.75 * depth) [widths.rhs.heading markStroke {.x (-HVContrast) .y (-0.5 * (markStroke - fine) / markStroke)}] + arcvh [widths.rhs markStroke] + g4 (markMiddle + [mix extR (-extL) 0.625]) (XH + depth - O) [heading Leftward] + g4 (markMiddle - extL) (XH + depth - 0.5 * O) [heading Leftward] create-glyph 'leftHalfCircleAbove' 0x351 : glyph-proc set-width 0 diff --git a/font-src/glyphs/marks/horn-and-angle.ptl b/font-src/glyphs/marks/horn-and-angle.ptl index 22719652f..794996f7b 100644 --- a/font-src/glyphs/marks/horn-and-angle.ptl +++ b/font-src/glyphs/marks/horn-and-angle.ptl @@ -13,7 +13,7 @@ glyph-block Mark-Horn-And-Angle : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives - glyph-block-import Mark-Shared-Metrics : markExtend markHalfStroke markStress markFine + glyph-block-import Mark-Shared-Metrics : markExtend markStroke markStress markFine glyph-block-import Mark-Shared-Metrics : markMiddle markDotsRadius glyph-block-import Mark-Above : aboveMarkTop aboveMarkBot aboveMarkMid aboveMarkStack glyph-block-import Mark-Above : commaAboveRadius @@ -152,7 +152,21 @@ glyph-block Mark-Horn-And-Angle : begin create-glyph 'ogonekTR' : glyph-proc set-width 0 - include : refer-glyph "ogonekBelow" - local ogonekBot : [mix belowMarkTop belowMarkBot 0.75] + markStress - local ogonekRight : markMiddle + markExtend * 0.85 - set-mark-anchor 'trailing' markMiddle 0 ogonekRight ogonekBot + + local fine : AdviceStroke 8 + local depth : 0 - Descender - markStroke + local extL : (7 / 16) * depth + 0.125 * markStress + local extR : Math.max (0.125 * markExtend) (1.5 * TanSlope * markStroke) + + include : difference + dispiro + g4 markMiddle 0 [widths.rhs fine] + g4.down.mid (markMiddle - extL) (-0.75 * depth) [widths.rhs.heading markStroke {.x (HVContrast) .y (0.5 * (markStroke - fine) / markStroke)}] + arcvh [widths.rhs markStroke] + g4 (markMiddle + [mix (-extL) extR (11/16)]) (-depth + O) [heading Rightward] + g4 (markMiddle + extR) (-depth + 0.5 * O) [heading Rightward] + intersection + MaskAbove 0 + MaskRight markMiddle + + set-mark-anchor 'trailing' markMiddle 0 (markMiddle + extR) (-depth - 0.5 * O - markStroke) diff --git a/font-src/glyphs/marks/shared-metrics.ptl b/font-src/glyphs/marks/shared-metrics.ptl index a071f485a..de13604f0 100644 --- a/font-src/glyphs/marks/shared-metrics.ptl +++ b/font-src/glyphs/marks/shared-metrics.ptl @@ -14,9 +14,10 @@ glyph-block Mark-Shared-Metrics : begin glyph-block-import Common-Derivatives ### Combining marks - glyph-block-export markExtend markHalfStroke markStress markFine + glyph-block-export markExtend markStroke markHalfStroke markStress markFine define markExtend (AccentWidth * 0.5) - define markHalfStroke : 0.5 * [AdviceStroke2 3.375 3.5 XH] + define markStroke : AdviceStroke2 3.375 3.5 XH + define markHalfStroke : 0.5 * markStroke define markStress : markHalfStroke * 1.1 define markFine : Math.min (markHalfStroke * 0.9) (0.5 * [AdviceStroke2 3.875 4.25 XH]) diff --git a/font-src/kits/spiro-kit.mjs b/font-src/kits/spiro-kit.mjs index a65cda94f..4c67e0fb6 100644 --- a/font-src/kits/spiro-kit.mjs +++ b/font-src/kits/spiro-kit.mjs @@ -209,6 +209,13 @@ export function SetupBuilders(bindings) { fallback(args.raf, unimportant) ); } + function afInterpolateDelta(before, after, args) { + return g4( + mix(before.x, after.x, args.rx) + args.deltaX, + mix(before.y, after.y, args.ry) + args.deltaY, + fallback(args.raf, unimportant) + ); + } function afInterpolateG2(before, after, args) { return g2( mix(before.x, after.x, args.rx), @@ -236,6 +243,9 @@ export function SetupBuilders(bindings) { function alsoThru(rx, ry, raf) { return { type: "interpolate", rx, ry, raf, blender: afInterpolate }; } + alsoThru.withOffset = function (rx, ry, deltaX, deltaY, raf) { + return { type: "interpolate", rx, ry, deltaX, deltaY, raf, blender: afInterpolateDelta }; + }; alsoThru.g2 = function (rx, ry, raf) { return { type: "interpolate", rx, ry, raf, blender: afInterpolateG2 }; }; diff --git a/font-src/otl/gsub-ccmp.ptl b/font-src/otl/gsub-ccmp.ptl index 1602151ab..a4721f5a5 100644 --- a/font-src/otl/gsub-ccmp.ptl +++ b/font-src/otl/gsub-ccmp.ptl @@ -14,7 +14,6 @@ export : define [buildCCMP sink glyphStore markGlyphs] : begin define {chain-rule} : ChainRuleBuilder sink define groupGrekUpperTonos {} - define groupTR {} define groupLF {} define dotlessFrom {} define dotlessTo {} @@ -23,7 +22,6 @@ export : define [buildCCMP sink glyphStore markGlyphs] : begin define TieGlyphs {} foreach { gid g } [glyphStore.namedEntries] : if (gid.(0) !== "."): begin - if g.baseAnchors.trailing : groupTR.push gid if g.baseAnchors.lf : groupLF.push gid if g.baseAnchors.grekUpperTonos : groupGrekUpperTonos.push gid if [Dotless.get g] : begin @@ -35,7 +33,6 @@ export : define [buildCCMP sink glyphStore markGlyphs] : begin TieMarkTo.push [TieMark.get g] define [IotaLF] : UkMapToLookup UnicodeKnowledge.iotaBelowToLfTf - define [OgonekTrailing] : UkMapToLookup UnicodeKnowledge.ogonekBelowToTRTf define [GrekUpperTonosTf] : UkMapToLookup UnicodeKnowledge.upperGrekMarkToTonosTf define [ToneToToneStart toneEnd] : begin @@ -123,13 +120,7 @@ export : define [buildCCMP sink glyphStore markGlyphs] : begin chain-rule groupLF markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [IotaLF] chain-rule groupLF markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [IotaLF] - # Ogonek transform (max 6 middle marks are supported) - chain-rule groupTR [OgonekTrailing] - chain-rule groupTR markGlyphs.all [OgonekTrailing] - chain-rule groupTR markGlyphs.all markGlyphs.all [OgonekTrailing] - chain-rule groupTR markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [OgonekTrailing] - chain-rule groupTR markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [OgonekTrailing] - chain-rule groupTR markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [OgonekTrailing] + define lookupMarks2 : AddLookup sink : object .type 'gsub_ligature' @@ -235,4 +226,32 @@ export : define [buildCCMP sink glyphStore markGlyphs] : begin AddCommonFeature sink ccmp EndLookupBlock rec sink + return ccmp + +export : define [buildCCMPPostCvSs sink ccmpFeature glyphStore markGlyphs] : begin + local rec : BeginLookupBlock sink + + define ccmp : AddFeature sink 'ccmp' + define {chain-rule} : ChainRuleBuilder sink + + define groupTR {} + foreach { gid g } [glyphStore.namedEntries] : if (gid.(0) !== "."): begin + if g.baseAnchors.trailing : groupTR.push gid + + define [OgonekTrailing] : UkMapToLookup UnicodeKnowledge.ogonekBelowToTRTf + + define lookupMarks1 : AddLookup sink : object + .type 'gsub_chaining' + .rules : list + # Ogonek transform (max 6 middle marks are supported) + chain-rule groupTR [OgonekTrailing] + chain-rule groupTR markGlyphs.all [OgonekTrailing] + chain-rule groupTR markGlyphs.all markGlyphs.all [OgonekTrailing] + chain-rule groupTR markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [OgonekTrailing] + chain-rule groupTR markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [OgonekTrailing] + chain-rule groupTR markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [OgonekTrailing] + + ccmpFeature.lookups.push lookupMarks1 + EndLookupBlock rec sink + define [objectIsNotEmpty obj] : obj && [Object.keys obj].length diff --git a/font-src/otl/index.ptl b/font-src/otl/index.ptl index eaa0e23ba..95e1d9ab5 100644 --- a/font-src/otl/index.ptl +++ b/font-src/otl/index.ptl @@ -4,7 +4,7 @@ import as Gr from"../support/gr.mjs" import [CreateEmptyTable FinalizeTable MoveBackUtilityLookups] from"./table-util.mjs" import [buildLigations] from"./gsub-ligation.mjs" -import [buildCCMP] from"./gsub-ccmp.mjs" +import [buildCCMP buildCCMPPostCvSs] from"./gsub-ccmp.mjs" import [buildGrFeature] from"./gsub-gr.mjs" import [buildFrac] from"./gsub-frac.mjs" import [buildCVSS] from"./gsub-cv-ss.mjs" @@ -39,7 +39,7 @@ define [buildGSUB para glyphStore markGlyphs] : begin buildGrFeature gsub glyphStore Gr.DenominatorForm # ccmp - buildCCMP gsub glyphStore markGlyphs + local ccmp : buildCCMP gsub glyphStore markGlyphs # frac buildFrac gsub glyphStore @@ -58,6 +58,9 @@ define [buildGSUB para glyphStore markGlyphs] : begin if para.enableCvSs : begin buildCVSS gsub para glyphStore + # ccmp post cv/ss (for Ogonek shape transform) + buildCCMPPostCvSs gsub ccmp glyphStore markGlyphs + # locl # Builds last, but the lookups are added into the beginning of the lookup list buildLOCL gsub para glyphStore