diff --git a/font-src/gen/otd-conv/layout.mjs b/font-src/gen/otd-conv/layout.mjs index 7843d932d..656383341 100644 --- a/font-src/gen/otd-conv/layout.mjs +++ b/font-src/gen/otd-conv/layout.mjs @@ -15,6 +15,22 @@ export function convertGdef(otdGdef, glyphs) { const g = glyphs.queryByName(gn); if (g) gdef.glyphClassDef.set(g, otdGdef.glyphClassDef[gn]); } + + gdef.markAttachClassDef = new Map(); + for (const gn in otdGdef.markAttachClassDef) { + const g = glyphs.queryByName(gn); + if (g) gdef.markAttachClassDef.set(g, otdGdef.markAttachClassDef[gn]); + } + + gdef.markGlyphSets = []; + for (const s of otdGdef.markGlyphSets) { + const result = new Set(); + for (const gn of s) { + const g = glyphs.queryByName(gn); + if (g) result.add(g); + } + if (result.size) gdef.markGlyphSets.push(result); + } return gdef; } @@ -123,6 +139,14 @@ class LookupStore { const handler = this.m_handlers[otdLookup.type]; if (!dst || !handler) return; if (otdLookup.subtables) throw new Error("Unreachable."); + if (otdLookup.ignoreGlyphs) { + let s = new Set(); + for (const gn of otdLookup.ignoreGlyphs) { + const g = this.glyphs.queryByName(gn); + if (g) s.add(g); + } + if (s.size) dst.ignoreGlyphs = s; + } handler.fill(dst, otdLookup, this); } } diff --git a/font-src/glyphs/auto-build/mark-doppelganger.ptl b/font-src/glyphs/auto-build/mark-doppelganger.ptl index 7e1e02f11..45e8457bd 100644 --- a/font-src/glyphs/auto-build/mark-doppelganger.ptl +++ b/font-src/glyphs/auto-build/mark-doppelganger.ptl @@ -13,12 +13,12 @@ glyph-block Mark-Doppelganger : if [not recursive] : begin glyph-block-import Common-Derivatives define AnchorMap : list - list 'above' 'tieAbove' 'aboveBrace' - list 'below' 'tieBelow' 'belowBrace' + list 'above' 'tieAbove' 'aboveBraceL' 'aboveBraceR' + list 'below' 'tieBelow' 'belowBraceL' 'belowBraceR' foreach { gn g } [glyphStore.namedEntries] : begin local handled false - foreach { akFrom akTo akBrace } [items-of AnchorMap] : begin + foreach { akFrom akTo akBraceL akBraceR } [items-of AnchorMap] : begin if (!handled && g.markAnchors && g.markAnchors.(akFrom)) : begin set handled true local toGN : TieMark.amendName gn @@ -28,5 +28,6 @@ glyph-block Mark-Doppelganger : if [not recursive] : begin currentGlyph.deleteMarkAnchor akFrom set currentGlyph.baseAnchors.(akTo) currentGlyph.baseAnchors.(akFrom) currentGlyph.deleteBaseAnchor akFrom - currentGlyph.deleteBaseAnchor akBrace + currentGlyph.deleteBaseAnchor akBraceL + currentGlyph.deleteBaseAnchor akBraceR TieMark.set g toGN diff --git a/font-src/glyphs/auto-build/transformed.ptl b/font-src/glyphs/auto-build/transformed.ptl index decbf62cd..fd7b72692 100644 --- a/font-src/glyphs/auto-build/transformed.ptl +++ b/font-src/glyphs/auto-build/transformed.ptl @@ -73,8 +73,8 @@ glyph-block Autobuild-Transformed : begin glyph-block-import Common-Derivatives glyph-block-import Recursive-Build : Fork Miniature glyph-block-import Mark-Shared-Metrics : markMiddle - glyph-block-import Mark-Above : aboveMarkBot aboveMarkTop - glyph-block-import Mark-Below : belowMarkBot belowMarkTop + glyph-block-import Mark-Above : aboveMarkBot aboveMarkMid aboveMarkTop + glyph-block-import Mark-Below : belowMarkBot belowMarkMid belowMarkTop glyph-block-import Autobuild-Transformed-Shared : extendRelatedGlyphs link-relations define [createSuperscripts prefix gr _records] : begin @@ -168,8 +168,10 @@ glyph-block Autobuild-Transformed : begin include : Translate markMiddle aboveMarkBot include : Regizmo local markHeight : 0.4 * (high - low) + 0 * (aboveMarkTop - aboveMarkBot) + set-mark-anchor 'above' markMiddle XH markMiddle (aboveMarkBot + markHeight) - set-base-anchor 'aboveBrace' markMiddle (aboveMarkBot + markHeight + XH * 0.2) + set-base-anchor 'aboveBraceL' markMiddle (aboveMarkBot + markHeight / 2) + set-base-anchor 'aboveBraceR' markMiddle (aboveMarkBot + markHeight / 2) link-relations relSets @@ -192,7 +194,8 @@ glyph-block Autobuild-Transformed : begin include : Translate markMiddle belowMarkTop include : Regizmo set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkBot - set-base-anchor 'belowBrace' markMiddle (belowMarkTop - XH * 0.2) + set-base-anchor 'belowBraceL' markMiddle belowMarkMid + set-base-anchor 'belowBraceR' markMiddle belowMarkMid link-relations relSets diff --git a/font-src/glyphs/letter/cyrillic/te-comb.ptl b/font-src/glyphs/letter/cyrillic/te-comb.ptl index 847b1aa3b..e54dc59ad 100644 --- a/font-src/glyphs/letter/cyrillic/te-comb.ptl +++ b/font-src/glyphs/letter/cyrillic/te-comb.ptl @@ -11,7 +11,8 @@ glyph-block Letter-Cyrillic-Te-Comb : begin create-glyph 'cyrl/teAbove' : glyph-proc set-width 0 set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + set-base-anchor 'aboveBraceL' (markMiddle - markExtend) aboveMarkMid + set-base-anchor 'aboveBraceR' (markMiddle + markExtend) aboveMarkMid local ext : markExtend * 1.5 diff --git a/font-src/glyphs/letter/latin-ext/egyptological.ptl b/font-src/glyphs/letter/latin-ext/egyptological.ptl index aad830cf2..6767d107c 100644 --- a/font-src/glyphs/letter/latin-ext/egyptological.ptl +++ b/font-src/glyphs/letter/latin-ext/egyptological.ptl @@ -69,7 +69,8 @@ glyph-block Letter-Latin-Egyptological : begin create-glyph 'EgyptologicalYodAbove' 0xE010 : glyph-proc set-width 0 set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + set-base-anchor 'aboveBraceL' markMiddle aboveMarkMid + set-base-anchor 'aboveBraceR' markMiddle aboveMarkMid local fine : AdviceStroke 5 include : EgyptologicalYodComponent fine markMiddle aboveMarkBot aboveMarkTop @@ -77,6 +78,8 @@ glyph-block Letter-Latin-Egyptological : begin set-width 0 include : refer-glyph 'EgyptologicalYodAbove' set-mark-anchor 'grekUpperTonos' markMiddle XH + set-base-anchor 'aboveBraceL' markMiddle aboveMarkMid + set-base-anchor 'aboveBraceR' markMiddle aboveMarkMid CreateAccentedComposition 'AGlottal' 0xA7BA 'grek/Alpha' 'EgyptologicalYodTonos' CreateAccentedComposition 'IGlottal' 0xA7BC 'grek/Iota' 'EgyptologicalYodTonos' diff --git a/font-src/glyphs/letter/latin/lower-e.ptl b/font-src/glyphs/letter/latin/lower-e.ptl index b67820f32..d4829c5be 100644 --- a/font-src/glyphs/letter/latin/lower-e.ptl +++ b/font-src/glyphs/letter/latin/lower-e.ptl @@ -146,6 +146,8 @@ glyph-block Letter-Latin-Lower-E : begin local beginCoSlope : if para.isItalic 0.2 0 set-base-anchor 'trailing' (RightSB + extR) (-depth + 0.5 * O - markStroke) + set-base-anchor 'belowBraceL' (RightSB - extL - 0.25 * HVContrast * markStroke) (-0.75 * depth) + set-base-anchor 'belowBraceR' (RightSB - 0.75 * extL) (-0.75 * depth) local turnSlope : 0.5 * ((markStroke - fine) / markStroke - (ArchDepthB - ArchDepth) / ArchDepth) diff --git a/font-src/glyphs/letter/shared.ptl b/font-src/glyphs/letter/shared.ptl index e65cb79ac..f834e2de8 100644 --- a/font-src/glyphs/letter/shared.ptl +++ b/font-src/glyphs/letter/shared.ptl @@ -98,7 +98,8 @@ glyph-block Letter-Blackboard : begin create-glyph 'mathbb/dotAbove' : glyph-proc set-width 0 set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle (XH + AccentStackOffset) + set-base-anchor 'aboveBraceL' markMiddle (XH + AccentStackOffset) + set-base-anchor 'aboveBraceR' markMiddle (XH + AccentStackOffset) include : DotStrokeAt markMiddle (XH + AccentStackOffset) (BBD / 2 + BBS) BBS glyph-block Letter-Shared-Metrics : begin diff --git a/font-src/glyphs/marks/above.ptl b/font-src/glyphs/marks/above.ptl index 500de4550..68ca51099 100644 --- a/font-src/glyphs/marks/above.ptl +++ b/font-src/glyphs/marks/above.ptl @@ -31,25 +31,36 @@ glyph-block Mark-Above : begin define asciiMarkZoomX : (RightSB - SB) / (markExtend * 3) define asciiMarkZoomY : 1.25 * asciiMarkZoomX + define StdAnchors : namespace + export : define [impl mk padding k] : glyph-proc + if (mk === 'above') + : then : set-mark-anchor mk markMiddle (XH - padding * AccentHeight) markMiddle (aboveMarkStack + padding * AccentHeight) + : else : set-mark-anchor mk markMiddle (XH - padding * AccentHeight) + set-base-anchor 'aboveBraceL' (markMiddle - k * markExtend) aboveMarkMid + set-base-anchor 'aboveBraceR' (markMiddle + k * markExtend) aboveMarkMid + + export : define [narrow] : impl 'above' 0 0 + export : define [mediumNarrow] : impl 'above' 0 0.25 + export : define [medium] : impl 'above' 0 0.5 + export : define [mediumWide] : impl 'above' 0 0.75 + export : define [wide] : impl 'above' 0 1 + ### Above marks foreach { suffix { DrawAt kdr } } [Object.entries DotVariants] : do create-glyph "dotAbove.\(suffix)" : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.narrow include : DrawAt markMiddle aboveMarkMid (DotRadius * kdr) create-glyph "dieresisAbove.\(suffix)" : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide include : DrawAt (markMiddle - markExtend) aboveMarkMid (markDotsRadius * kdr) include : DrawAt (markMiddle + markExtend) aboveMarkMid (markDotsRadius * kdr) create-glyph "dieresisAboveAlwaysUpright.\(suffix)" : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide include : ForceUpright include : DrawAt (markMiddle - markExtend) aboveMarkMid (markDotsRadius * kdr) include : DrawAt (markMiddle + markExtend) aboveMarkMid (markDotsRadius * kdr) @@ -72,8 +83,7 @@ glyph-block Mark-Above : begin create-glyph 'ringAbove' 0x30A : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.medium include : RingShape markMiddle aboveMarkMid create-glyph 'dblRingAbove' 0x1AB2 : glyph-proc @@ -82,14 +92,11 @@ glyph-block Mark-Above : begin local k : 2 * (radiusOut - (radiusOut - radiusIn) * 0.25) include : WithTransform [Translate (+k / 2) 0] : refer-glyph 'ringAbove' include : WithTransform [Translate (-k / 2) 0] : refer-glyph 'ringAbove' - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide create-glyph 'graveAbove' 0x300 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.medium include : dispiro flat (markMiddle + markStress) aboveMarkBot [widths markFine markFine] curl (markMiddle - markExtend) aboveMarkTop [widths markStress markStress] @@ -103,9 +110,7 @@ glyph-block Mark-Above : begin create-glyph 'acuteAbove' 0x301 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.medium include : dispiro flat (markMiddle - markStress) aboveMarkBot [widths markFine markFine] curl (markMiddle + markExtend) aboveMarkTop [widths markStress markStress] @@ -145,9 +150,7 @@ glyph-block Mark-Above : begin create-glyph 'circumflexAbove' 0x302 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.wide include : CaretShape xMiddle -- markMiddle width -- CaretCaronWidth @@ -158,9 +161,7 @@ glyph-block Mark-Above : begin create-glyph 'bardownAbove' 0x1DC6 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.wide include : CaretRightShape xMiddle -- markMiddle width -- CaretCaronWidth @@ -179,9 +180,7 @@ glyph-block Mark-Above : begin create-glyph 'upbarAbove' 0x1DC7 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.wide include : CaretLeftShape xMiddle -- markMiddle width -- CaretCaronWidth @@ -214,9 +213,7 @@ glyph-block Mark-Above : begin create-glyph 'caronAbove' 0x30c : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.wide include : CaronShape xMiddle -- markMiddle width -- CaretCaronWidth @@ -227,9 +224,7 @@ glyph-block Mark-Above : begin create-glyph 'barupAbove' 0x1DC4 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.wide include : CaronRightShape xMiddle -- markMiddle width -- CaretCaronWidth @@ -248,9 +243,7 @@ glyph-block Mark-Above : begin create-glyph 'downbarAbove' 0x1DC5 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.wide include : CaronLeftShape xMiddle -- markMiddle width -- CaretCaronWidth @@ -299,9 +292,7 @@ glyph-block Mark-Above : begin create-glyph 'tildeAbove' 0x303 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.wide include : TildeShape ttop -- aboveMarkTop tbot -- aboveMarkBot + markFine / 2 @@ -362,8 +353,7 @@ glyph-block Mark-Above : begin create-glyph : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide local m [mix aboveMarkBot aboveMarkTop 0.4] local ttop [mix m aboveMarkTop 0.7] @@ -385,7 +375,7 @@ glyph-block Mark-Above : begin foreach { suffix { DrawAt kdr } } [Object.entries DotVariants] : do create-forked-glyph "tildedotdotAbove.\(suffix)" : glyph-proc - set-mark-anchor 'above' markMiddle (XH - AccentHeight / 4) markMiddle (aboveMarkStack + AccentHeight / 4) + include : StdAnchors.impl 'above' (1 / 4) 1 local r : 0.75 * DotRadius * fine / HalfStroke include : DrawAt markMiddle [mix tbot ttop 1.5] (r * kdr) include : DrawAt markMiddle [mix ttop tbot 1.5] (r * kdr) @@ -394,9 +384,7 @@ glyph-block Mark-Above : begin create-glyph 'dblTildeAbove' 0x34C : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle (XH - AccentHeight / 4) markMiddle (aboveMarkStack + AccentHeight / 4) - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.impl 'above' (1 / 4) 1 local m aboveMarkBot local ttop [mix m aboveMarkTop 0.7] local tbot [mix m (aboveMarkBot + markFine / 2) 0.7] @@ -417,8 +405,7 @@ glyph-block Mark-Above : begin create-glyph 'macronAbove' 0x304 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide local leftEnd (markMiddle - markExtend * 1.5) local rightEnd (markMiddle + markExtend * 1.5) @@ -427,37 +414,23 @@ glyph-block Mark-Above : begin flat leftEnd aboveMarkMid [widths markHalfStroke markHalfStroke] curl rightEnd aboveMarkMid - create-glyph 'sbOverlineAbove' : glyph-proc - set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - - include : dispiro - flat (SB - Width) aboveMarkMid [widths markHalfStroke markHalfStroke] - curl (RightSB - Width) aboveMarkMid - create-glyph 'overlineAbove' 0x305 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.impl 'above' 0 2 include : dispiro flat (0 - Width) aboveMarkMid [widths markHalfStroke markHalfStroke] curl 0 aboveMarkMid create-glyph 'sbRsbOverlineAbove' : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid - + include : StdAnchors.impl 'above' 0 1.5 include : dispiro flat (SB - Width) aboveMarkMid [widths markHalfStroke markHalfStroke] curl (RightSB - Width) aboveMarkMid create-glyph 'dblOverlineAbove' 0x33F : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.impl 'above' 0 2 local boxsw : Math.min (markFine * 2) ((aboveMarkTop - aboveMarkBot) / 3) @@ -473,8 +446,7 @@ glyph-block Mark-Above : begin create-glyph 'breveAbove' 0x306 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide local leftEnd (markMiddle - markExtend * 1.2) local rightEnd (markMiddle + markExtend * 1.2) @@ -488,8 +460,7 @@ glyph-block Mark-Above : begin create-glyph 'archAbove' 0x311 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide local leftEnd (markMiddle - markExtend * 1.2) local rightEnd (markMiddle + markExtend * 1.2) @@ -503,8 +474,7 @@ glyph-block Mark-Above : begin create-glyph 'hookAbove' 0x309 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.medium local fine : Math.min markFine ((aboveMarkTop - aboveMarkBot) * 0.2) @@ -522,8 +492,7 @@ glyph-block Mark-Above : begin create-glyph 'doubleGraveAbove' 0x30F : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide local m1 : markMiddle - markExtend * 0.85 local m2 : markMiddle + markExtend * 0.85 @@ -536,8 +505,7 @@ glyph-block Mark-Above : begin create-glyph 'doubleAcuteAbove' 0x30B : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide local m1 : markMiddle - markExtend * 0.85 local m2 : markMiddle + markExtend * 0.85 @@ -550,8 +518,7 @@ glyph-block Mark-Above : begin create-glyph 'commaAbove.round' : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.narrow local radius commaAboveRadius include : Ring (aboveMarkTop + commaOvershoot) (aboveMarkTop - radius * 2 + commaOvershoot) (markMiddle - radius) (markMiddle + radius) @@ -564,8 +531,7 @@ glyph-block Mark-Above : begin create-glyph 'commaAbove.square' : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.narrow local radius : commaAboveRadius * DesignParameters.squareDotScalar include : Rect aboveMarkTop (aboveMarkTop - radius * 2) (markMiddle - radius) (markMiddle + radius) @@ -583,19 +549,17 @@ glyph-block Mark-Above : begin derive-glyphs 'commaGrekUpperTonos' null 'commaAbove' : function [src gr] : glyph-proc set-width 0 include : refer-glyph src - set-mark-anchor 'grekUpperTonos' markMiddle XH + include : StdAnchors.impl 'grekUpperTonos' 0 0 derive-glyphs 'turnCommaAbove' 0x312 'commaAbove' : function [src gr] : glyph-proc set-width 0 include : refer-glyph src include : FlipAround markMiddle ([mix aboveMarkTop (aboveMarkBot - commaAboveRadius) 0.5] + (DotRadius * 0.3) + commaOvershoot / 2) - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.narrow create-glyph 'revCommaAbove.round' : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.narrow local radius commaAboveRadius include : Ring (aboveMarkTop + commaOvershoot) (aboveMarkTop - radius * 2 + commaOvershoot) (markMiddle - radius) (markMiddle + radius) @@ -608,8 +572,7 @@ glyph-block Mark-Above : begin create-glyph 'revCommaAbove.square' : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.narrow local radius : commaAboveRadius * DesignParameters.squareDotScalar include : Rect (aboveMarkTop + commaOvershoot) (aboveMarkTop - radius * 2 + commaOvershoot) (markMiddle - radius) (markMiddle + radius) @@ -627,34 +590,30 @@ glyph-block Mark-Above : begin derive-glyphs 'revCommaGrekUpperTonos' null 'revCommaAbove' : function [src gr] : glyph-proc set-width 0 include : refer-glyph src - set-mark-anchor 'grekUpperTonos' markMiddle XH + include : StdAnchors.impl 'grekUpperTonos' 0 0 create-glyph 'barAbove' 0x30D : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.narrow include : VBar.m 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 : StdAnchors.narrow include : VBar.m 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 : StdAnchors.mediumWide include : VBar.m (markMiddle - markExtend * 0.75) aboveMarkBot aboveMarkTop markStroke include : VBar.m (markMiddle + markExtend * 0.75) aboveMarkBot aboveMarkTop markStroke create-glyph 'bridgeAbove' 0x346 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide include : VBar.m (markMiddle - markExtend) aboveMarkBot aboveMarkTop (markFine * 2) include : VBar.m (markMiddle + markExtend) aboveMarkBot aboveMarkTop (markFine * 2) @@ -662,8 +621,7 @@ glyph-block Mark-Above : begin create-glyph 'yerikAbove' 0x33E : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.narrow include : dispiro widths.center (markFine * 2) @@ -687,16 +645,15 @@ glyph-block Mark-Above : begin g4.up.end (markMiddle + radius) yDot [heading Upward] include : DrawAt markMiddle yDot (fine * kdr) include : ApparentTranslate 0 (fine * 0.5) - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.mediumWide + select-variant 'candrabinduAbove' 0x310 (follow -- 'diacriticDot') turned 'turncandrabinduAbove' 0x352 'candrabinduAbove' markMiddle aboveMarkMid create-glyph 'variaAbove' 0x340 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.medium include : dispiro flat (markMiddle + markStress) (aboveMarkBot - markFine * 0.5) [widths markFine markFine] @@ -705,12 +662,11 @@ glyph-block Mark-Above : begin create-glyph 'variaGrekUpperTonos' : glyph-proc set-width 0 include : refer-glyph 'variaAbove' - set-mark-anchor 'grekUpperTonos' markMiddle XH + include : StdAnchors.impl 'grekUpperTonos' 0 0 create-glyph 'oxiaAbove' 0x341 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.medium include : dispiro flat (markMiddle - markStress) (aboveMarkBot - markFine * 0.5) [widths markFine markFine] @@ -719,20 +675,18 @@ glyph-block Mark-Above : begin create-glyph 'oxiaGrekUpperTonos' : glyph-proc set-width 0 include : refer-glyph 'oxiaAbove' - set-mark-anchor 'grekUpperTonos' markMiddle XH + include : StdAnchors.impl 'grekUpperTonos' 0 0 create-glyph 'perispomeniAbove' 0x342 : glyph-proc set-width 0 include : refer-glyph "archAbove" - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide alias 'koronisAbove' 0x343 'commaAbove' create-glyph 'crossAbove' 0x33D : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.mediumWide include : dispiro flat (markMiddle - markExtend) aboveMarkTop [widths markFine markFine] @@ -743,8 +697,7 @@ glyph-block Mark-Above : begin create-glyph 'lessAbove' 0x1DFE : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.mediumWide local top aboveMarkTop local bot aboveMarkBot @@ -763,8 +716,7 @@ glyph-block Mark-Above : begin create-glyph 'upArrowHeadAbove' 0xE002 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.medium local top aboveMarkTop local bot aboveMarkBot @@ -832,63 +784,40 @@ glyph-block Mark-Above : begin create-glyph 'upArrowAbove' : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.medium include : ArrowheadForArrowMarkAbove-Up include : VBar.mForArrowMarkAbove create-glyph 'downArrowAbove' 0x1AB3 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.medium include : ArrowheadForArrowMarkAbove-Down include : VBar.mForArrowMarkAbove create-glyph 'leftArrowAbove' 0x20D6 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide include : ArrowheadForArrowMarkAbove-Left include : HBar.mForArrowMarkAbove create-glyph 'rightArrowAbove' 0x20D7 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide include : ArrowheadForArrowMarkAbove-Right include : HBar.mForArrowMarkAbove create-glyph 'lrArrowAbove' 0x20E1 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide include : ArrowheadForArrowMarkAbove-Left include : ArrowheadForArrowMarkAbove-Right include : HBar.mForArrowMarkAbove - create-glyph 'braceAbove' 0x1ABB : glyph-proc - set-width 0 - set-mark-anchor 'aboveBrace' markMiddle aboveMarkMid markMiddle aboveMarkMid - local braceDepth : markExtend * 0.25 - local left : [mix 0 SB 0.25] - Width - local right : [mix Width RightSB 0.25] - Width - include : dispiro - widths.lhs markFine - g4 (left + braceDepth) (aboveMarkTop + markFine) - g4 (left + OX) aboveMarkMid - g4 (left + braceDepth) (aboveMarkBot - markFine) - include : dispiro - widths.rhs markFine - g4 (right - braceDepth) (aboveMarkTop + markFine) - g4 (right - OX) aboveMarkMid - g4 (right - braceDepth) (aboveMarkBot - markFine) - alias 'cyrlDasiaAbove' 0x485 'revCommaAbove' alias 'cyrlPsiliAbove' 0x486 'commaAbove' create-glyph 'cyrlPalatilizationAbove' 0x484 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide local leftEnd : markMiddle - markExtend * 2.0 local rightEnd : markMiddle + markExtend * 1.2 @@ -901,8 +830,7 @@ glyph-block Mark-Above : begin g2.left.end leftEnd ([mix aboveMarkBot aboveMarkTop 0.5] - markHalfStroke) [heading Leftward] create-glyph 'cyrlPokrytieAbove' 0x487 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide local leftEnd : markMiddle - markExtend * 1.2 local rightEnd : markMiddle + markExtend * 2.0 @@ -916,8 +844,7 @@ glyph-block Mark-Above : begin create-glyph 'cyrlTitloAbove' 0x483 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.wide include : VBar.m (markMiddle - markExtend) aboveMarkBot (aboveMarkMid + markFine) (markFine * 2) include : VBar.m (markMiddle + markExtend) (aboveMarkMid - markFine) aboveMarkTop (markFine * 2) @@ -925,8 +852,7 @@ glyph-block Mark-Above : begin create-glyph 'zigzagAbove' 0x35B : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.mediumWide local ext : 0.625 * markExtend + markFine local coSlope 0.2 @@ -939,13 +865,15 @@ glyph-block Mark-Above : begin create-glyph 'ogonekAbove' 0x1DCE : glyph-proc set-width 0 + set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + set-base-anchor 'aboveBraceL' (markMiddle - 0.25 * markExtend) aboveMarkMid + set-base-anchor 'aboveBraceR' (markMiddle + 0.25 * markExtend + 0.25 * HVContrast * markStroke) aboveMarkMid local fine : AdviceStroke 8 local depth : 0 - Descender - markStroke local fullExt : (7 / 16) * depth + 0.125 * markStress - local extR : 0.5 * fullExt + local extR : 0.25 * fullExt local extL : 0.5 * fullExt + 0.375 * markStroke + [Math.max (0.125 * markExtend) (1.5 * TanSlope * markStroke)] local turnSlope : 0.5 * ((markStroke - fine) / markStroke - (ArchDepthB - ArchDepth) / ArchDepth) @@ -962,8 +890,7 @@ glyph-block Mark-Above : begin create-glyph 'leftHalfCircleAbove' 0x351 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.narrow local [object radiusIn radiusOut] : RingDims include : dispiro g4.left.start markMiddle aboveMarkTop [widths.center.heading (radiusOut - radiusIn) Leftward] @@ -975,8 +902,7 @@ glyph-block Mark-Above : begin create-glyph 'rightHalfCircleAbove' 0x357 : glyph-proc set-width 0 - set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack - set-base-anchor 'aboveBrace' markMiddle aboveMarkMid + include : StdAnchors.narrow local [object radiusIn radiusOut] : RingDims include : dispiro g4.right.start markMiddle aboveMarkTop [widths.center.heading (radiusOut - radiusIn) Rightward] @@ -985,3 +911,57 @@ glyph-block Mark-Above : begin arcvh g4.left.end markMiddle aboveMarkBot [heading Leftward] include : Translate (-(aboveMarkTop - aboveMarkBot) / 4) 0 + + + create-glyph 'leftParenAbove' 0x1AC1 : glyph-proc + set-width 0 + set-mark-anchor 'aboveBraceL' markMiddle aboveMarkMid (markMiddle - markExtend) aboveMarkMid + local braceDepth : markExtend * 0.25 + local left : markMiddle - 1.5 * markExtend + include : dispiro + widths.lhs markFine + g4 (left + braceDepth) (aboveMarkTop + markFine) + g4 (left + OX) aboveMarkMid + g4 (left + braceDepth) (aboveMarkBot - markFine) + + create-glyph 'rightParenAbove' 0x1AC2 : glyph-proc + set-width 0 + set-mark-anchor 'aboveBraceR' markMiddle aboveMarkMid (markMiddle + markExtend) aboveMarkMid + local braceDepth : markExtend * 0.25 + local right : markMiddle + 1.5 * markExtend + include : dispiro + widths.rhs markFine + g4 (right - braceDepth) (aboveMarkTop + markFine) + g4 (right - OX) aboveMarkMid + g4 (right - braceDepth) (aboveMarkBot - markFine) + + create-glyph 'braceAbove' 0x1ABB : glyph-proc + set-width 0 + include : refer-glyph 'leftParenAbove' + include : refer-glyph 'rightParenAbove' + # No need to setup anchors -- ccmp will help us + + create-glyph 'leftBrackAbove' : glyph-proc + set-width 0 + set-mark-anchor 'aboveBraceL' markMiddle aboveMarkMid (markMiddle - markExtend) aboveMarkMid + local braceDepth : markExtend * 0.75 + local left : markMiddle - 1.75 * markExtend + include : VBar.l left aboveMarkBot aboveMarkTop markFine + include : HBar.t left (left + braceDepth) aboveMarkTop markFine + include : HBar.b left (left + braceDepth) aboveMarkBot markFine + + create-glyph 'rightBrackAbove' : glyph-proc + set-width 0 + set-mark-anchor 'aboveBraceR' markMiddle aboveMarkMid (markMiddle + markExtend) aboveMarkMid + local braceDepth : markExtend * 0.75 + local right : markMiddle + 1.75 * markExtend + include : VBar.r right aboveMarkBot aboveMarkTop markFine + include : HBar.t (right - braceDepth) right aboveMarkTop markFine + include : HBar.b (right - braceDepth) right aboveMarkBot markFine + + create-glyph 'parenAbove' 0x1AC5 : glyph-proc + set-width 0 + include : refer-glyph 'leftBrackAbove' + include : refer-glyph 'rightBrackAbove' + # No need to setup anchors -- ccmp will help us + diff --git a/font-src/glyphs/marks/below.ptl b/font-src/glyphs/marks/below.ptl index 5b3f12ddc..0034bba87 100644 --- a/font-src/glyphs/marks/below.ptl +++ b/font-src/glyphs/marks/below.ptl @@ -21,11 +21,22 @@ glyph-block Mark-Below : begin define belowMarkMid [mix belowMarkBot belowMarkTop 0.5] define belowMarkStack (0 - AccentStackOffset) + define StdAnchors : namespace + export : define [impl padding k] : glyph-proc + set-mark-anchor 'below' markMiddle (0 + padding * AccentHeight) markMiddle (belowMarkStack - padding * AccentHeight) + set-base-anchor 'belowBraceL' (markMiddle - k * markExtend) belowMarkMid + set-base-anchor 'belowBraceR' (markMiddle + k * markExtend) belowMarkMid + + export : define [narrow] : impl 0 0 + export : define [mediumNarrow] : impl 0 0.25 + export : define [medium] : impl 0 0.5 + export : define [mediumWide] : impl 0 0.75 + export : define [wide] : impl 0 1 + ### Below marks create-glyph 'blankBelow' : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.narrow define [CedillaShape ext] : begin local fine : Math.min [AdviceStroke 6] (0.75 * (belowMarkTop - belowMarkBot - markStroke)) @@ -44,32 +55,27 @@ glyph-block Mark-Below : begin create-glyph 'cedillaExtShapeBelow' : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.medium include : CedillaShape (2 * Stroke) create-glyph 'cedillaExtShapeBelowOArc' : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.medium include : CedillaShape (Stroke + O) create-glyph 'cedillaExtShapeBelowSOArc' : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.medium include : CedillaShape ([AdviceStroke2 2 3 XH] + O) create-glyph 'cedillaBelow' 0x327 : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.medium include : CedillaShape 0 create-glyph 'iotaBelow' 0x345 : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.narrow include : VBar.m markMiddle belowMarkBot belowMarkTop markStroke create-glyph 'iotaLF' : glyph-proc @@ -79,56 +85,49 @@ glyph-block Mark-Below : begin create-glyph 'upTackBelow' 0x31D : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.medium include : VBar.m markMiddle belowMarkBot belowMarkTop (markFine * 2) include : HBar.b (markMiddle - markExtend) (markMiddle + markExtend) belowMarkBot (markFine * 2) create-glyph 'downTackBelow' 0x31E : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.medium include : VBar.m markMiddle belowMarkBot belowMarkTop (markFine * 2) include : HBar.t (markMiddle - markExtend) (markMiddle + markExtend) belowMarkTop (markFine * 2) create-glyph 'leftTackBelow' 0x318 : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.mediumWide - include : VBar.m (markMiddle + markExtend) belowMarkBot belowMarkTop (markFine * 2) + include : VBar.r (markMiddle + markExtend) belowMarkBot belowMarkTop (markFine * 2) include : HBar.m (markMiddle - markExtend) (markMiddle + markExtend) [mix belowMarkTop belowMarkBot 0.5] (markFine * 2) create-glyph 'rightTackBelow' 0x319 : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.mediumWide - include : VBar.m (markMiddle - markExtend) belowMarkBot belowMarkTop (markFine * 2) + include : VBar.l (markMiddle - markExtend) belowMarkBot belowMarkTop (markFine * 2) include : HBar.m (markMiddle - markExtend) (markMiddle + markExtend) [mix belowMarkTop belowMarkBot 0.5] (markFine * 2) create-glyph 'leftAngleBelow' 0x349 : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.mediumWide - include : VBar.m (markMiddle + markExtend) belowMarkBot belowMarkTop (markFine * 2) + include : VBar.r (markMiddle + markExtend) belowMarkBot belowMarkTop (markFine * 2) include : HBar.t (markMiddle - markExtend) (markMiddle + markExtend) belowMarkTop (markFine * 2) create-glyph 'plusBelow' 0x31F : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.mediumWide include : VBar.m markMiddle belowMarkBot belowMarkTop (markFine * 2) include : HBar.m (markMiddle - markExtend) (markMiddle + markExtend) belowMarkMid (markFine * 2) create-glyph 'minusBelow' 0x320 : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.wide include : VBar.m (markMiddle - markExtend) belowMarkBot belowMarkTop (markFine * 2) include : VBar.m (markMiddle + markExtend) belowMarkBot belowMarkTop (markFine * 2) @@ -136,8 +135,7 @@ glyph-block Mark-Below : begin create-glyph 'bridgeBelow' 0x32A : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.wide include : VBar.m (markMiddle - markExtend) belowMarkBot belowMarkTop (markFine * 2) include : VBar.m (markMiddle + markExtend) belowMarkBot belowMarkTop (markFine * 2) @@ -145,8 +143,7 @@ glyph-block Mark-Below : begin create-glyph 'boxBelow' 0x33B : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.wide local boxsw : Math.min (markFine * 2) ((belowMarkTop - belowMarkBot) / 3) @@ -157,8 +154,7 @@ glyph-block Mark-Below : begin create-glyph 'equalBelow' 0x347 : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.mediumWide local boxsw : Math.min (markFine * 2) ((belowMarkTop - belowMarkBot) / 3) @@ -167,8 +163,7 @@ glyph-block Mark-Below : begin create-glyph 'dblBreveBelow' 0x32B : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.wide local sw : [AdviceStroke 3.5] / Stroke * markStroke local extend : (belowMarkTop - belowMarkBot - 0.5 * markStroke) * 1.25 @@ -190,13 +185,11 @@ glyph-block Mark-Below : begin set-width 0 include : refer-glyph "dblBreveBelow" include : FlipAround markMiddle [mix belowMarkTop belowMarkBot 0.5] - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.wide create-glyph 'shelfBelow' : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.impl 0 1.5 include : VBar.m (SB - Width) belowMarkBot belowMarkTop (markFine * 2) include : VBar.m (RightSB - Width) belowMarkBot belowMarkTop (markFine * 2) @@ -204,29 +197,30 @@ glyph-block Mark-Below : begin create-glyph 'openShelfBelow' : glyph-proc set-width 0 - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.impl 0 1.5 include : VBar.m (SB - Width) belowMarkBot belowMarkTop (markFine * 2) include : HBar.b (SB - Width) (RightSB - Width) belowMarkBot (markFine * 2) + define [mirrorAnchor gs gt srcCls dstCls] : begin + if gs.markAnchors.(srcCls) : begin + local a : gs.gizmo.unapply gs.markAnchors.(srcCls) + gt.setMarkAnchor dstCls [mix markMiddle a.x (-1)] [mix (XH/2) a.y (-1)] + if gs.baseAnchors.(srcCls) : begin + local a : gs.gizmo.unapply gs.baseAnchors.(srcCls) + gt.setBaseAnchor dstCls [mix markMiddle a.x (-1)] [mix (XH/2) a.y (-1)] + # Turned below marks define [TurnAboveMarkToBelow gnBelowMark unicodeBelowMark gnAboveMark] : begin derive-glyphs gnBelowMark unicodeBelowMark gnAboveMark : function [src gr] : glyph-proc set-width 0 include : refer-glyph src include : FlipAround markMiddle (XH / 2) - local aboveGlyph : query-glyph gnAboveMark + local aboveGlyph : query-glyph src if aboveGlyph : begin - if aboveGlyph.markAnchors.above : set-mark-anchor 'below' - mix markMiddle aboveGlyph.markAnchors.above.x (-1) - mix (XH / 2) aboveGlyph.markAnchors.above.y (-1) - if aboveGlyph.baseAnchors.above : set-base-anchor 'below' - mix markMiddle aboveGlyph.baseAnchors.above.x (-1) - mix (XH / 2) aboveGlyph.baseAnchors.above.y (-1) - if aboveGlyph.baseAnchors.aboveBrace : set-base-anchor 'belowBrace' - mix markMiddle aboveGlyph.baseAnchors.aboveBrace.x (-1) - mix (XH / 2) aboveGlyph.baseAnchors.aboveBrace.y (-1) + mirrorAnchor aboveGlyph currentGlyph 'above' 'below' + mirrorAnchor aboveGlyph currentGlyph 'aboveBraceL' 'belowBraceR' + mirrorAnchor aboveGlyph currentGlyph 'aboveBraceR' 'belowBraceL' TurnAboveMarkToBelow 'graveBelow' 0x316 'graveAbove' TurnAboveMarkToBelow 'acuteBelow' 0x317 'acuteAbove' @@ -267,29 +261,38 @@ glyph-block Mark-Below : begin set-width 0 include : WithTransform [Translate (-markExtend) 0] : refer-glyph 'greaterBelow' include : WithTransform [Translate (+markExtend) 0] : refer-glyph 'upArrowHeadBelow' - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.impl 0 1.5 create-glyph 'greaterAndDownArrowheadBelow' 0x1DFF : glyph-proc set-width 0 include : WithTransform [Translate (-markExtend) 0] : refer-glyph 'greaterBelow' include : WithTransform [Translate (+markExtend) 0] : refer-glyph 'downArrowHeadBelow' - set-mark-anchor 'below' markMiddle 0 markMiddle belowMarkStack - set-base-anchor 'belowBrace' markMiddle belowMarkMid + include : StdAnchors.impl 0 1.5 - create-glyph 'braceBelow' 0x1ABD : glyph-proc + create-glyph 'leftParenBelow' 0x1AC3 : glyph-proc set-width 0 - set-mark-anchor 'belowBrace' markMiddle belowMarkMid markMiddle belowMarkMid + set-mark-anchor 'belowBraceL' markMiddle belowMarkMid (markMiddle - markExtend) belowMarkMid local braceDepth : markExtend * 0.25 - local left : [mix 0 SB 0.25] - Width - local right : [mix Width RightSB 0.25] - Width + local left : markMiddle - 1.5 * markExtend include : dispiro widths.lhs markFine g4 (left + braceDepth) (belowMarkTop + markFine) g4 (left + OX) belowMarkMid g4 (left + braceDepth) (belowMarkBot - markFine) + + create-glyph 'rightParenBelow' 0x1AC4 : glyph-proc + set-width 0 + set-mark-anchor 'belowBraceR' markMiddle belowMarkMid (markMiddle + markExtend) belowMarkMid + local braceDepth : markExtend * 0.25 + local right : markMiddle + 1.5 * markExtend include : dispiro widths.rhs markFine g4 (right - braceDepth) (belowMarkTop + markFine) g4 (right - OX) belowMarkMid g4 (right - braceDepth) (belowMarkBot - markFine) + + create-glyph 'parenBelow' 0x1ABD : glyph-proc + set-width 0 + include : refer-glyph 'leftParenBelow' + include : refer-glyph 'rightParenBelow' + # No need to setup anchors -- ccmp will help us diff --git a/font-src/glyphs/marks/composite.ptl b/font-src/glyphs/marks/composite.ptl index 087ba1681..c71aa8a87 100644 --- a/font-src/glyphs/marks/composite.ptl +++ b/font-src/glyphs/marks/composite.ptl @@ -30,11 +30,15 @@ glyph-block Mark-Composite : begin include : Translate (0 - k) 0 set-mark-anchor 'above' markMiddle XH markMiddle aboveMarkStack + set-base-anchor 'aboveBraceL' (markMiddle - 0.75 * markExtend) aboveMarkMid + set-base-anchor 'aboveBraceR' (markMiddle + 0.75 * markExtend) aboveMarkMid derive-glyphs "\(id)GrekUpperTonos" null id : function [src gr] : glyph-proc set-width 0 include [refer-glyph src] set-mark-anchor 'grekUpperTonos' (markMiddle - k) XH + set-base-anchor 'aboveBraceL' (markMiddle - 0.75 * markExtend) aboveMarkMid + set-base-anchor 'aboveBraceR' (markMiddle + 0.75 * markExtend) aboveMarkMid if unicode : derive-glyphs ('spaced' + id) unicode id : function [src gr] : glyph-proc include [refer-glyph 'markBaseSpace'] AS_BASE @@ -59,12 +63,17 @@ glyph-block Mark-Composite : begin g4.right.mid markMiddle (yc + radius) archv g4.down.end (markMiddle + radius) yc [heading Downward] + set-mark-anchor 'above' markMiddle XH markMiddle (aboveMarkStack + markHalfStroke * 2) + set-base-anchor 'aboveBraceL' (markMiddle - 0.5 * markExtend) (aboveMarkMid + markHalfStroke) + set-base-anchor 'aboveBraceR' (markMiddle + 0.5 * markExtend) (aboveMarkMid + markHalfStroke) derive-glyphs 'psiliPerispomeniGrekUpperTonos' null 'psiliPerispomeni' : function [src gr] : glyph-proc set-width 0 include : refer-glyph src set-mark-anchor 'grekUpperTonos' markMiddle XH + set-base-anchor 'aboveBraceL' (markMiddle - 0.5 * markExtend) (aboveMarkMid + markHalfStroke) + set-base-anchor 'aboveBraceR' (markMiddle + 0.5 * markExtend) (aboveMarkMid + markHalfStroke) derive-glyphs 'spaced_psiliPerispomeni' 0x1FCF 'psiliPerispomeni' : function [src gr] : glyph-proc include [refer-glyph 'markBaseSpace'] AS_BASE @@ -82,12 +91,17 @@ glyph-block Mark-Composite : begin g4.right.mid markMiddle (yc + radius) archv g4.down.end (markMiddle + radius) yc [heading Downward] + set-mark-anchor 'above' markMiddle XH markMiddle (aboveMarkStack + markHalfStroke * 2) + set-base-anchor 'aboveBraceL' (markMiddle - 0.5 * markExtend) (aboveMarkMid + markHalfStroke) + set-base-anchor 'aboveBraceR' (markMiddle + 0.5 * markExtend) (aboveMarkMid + markHalfStroke) derive-glyphs 'dasiaPerispomeniGrekUpperTonos' null 'dasiaPerispomeni' : function [src gr] : glyph-proc set-width 0 include : refer-glyph src set-mark-anchor 'grekUpperTonos' markMiddle XH + set-base-anchor 'aboveBraceL' (markMiddle - 0.5 * markExtend) (aboveMarkMid + markHalfStroke) + set-base-anchor 'aboveBraceR' (markMiddle + 0.5 * markExtend) (aboveMarkMid + markHalfStroke) derive-glyphs 'spaced_dasiaPerispomeni' 0x1FDF 'dasiaPerispomeni' : function [src gr] : glyph-proc include [refer-glyph 'markBaseSpace'] AS_BASE @@ -106,4 +120,7 @@ glyph-block Mark-Composite : begin g2.right.mid markMiddle (yc + radius) alsoThru.g2 0.5 0.5 g2.right.end (markMiddle + [Math.max radius (markExtend * 2)]) yc [heading Rightward] + set-mark-anchor 'above' markMiddle XH markMiddle (aboveMarkStack + markHalfStroke * 2) + set-base-anchor 'aboveBraceL' (markMiddle - markExtend) (aboveMarkMid + markHalfStroke) + set-base-anchor 'aboveBraceR' (markMiddle + markExtend) (aboveMarkMid + markHalfStroke) diff --git a/font-src/glyphs/marks/horn-and-angle.ptl b/font-src/glyphs/marks/horn-and-angle.ptl index feb518973..068ddeea7 100644 --- a/font-src/glyphs/marks/horn-and-angle.ptl +++ b/font-src/glyphs/marks/horn-and-angle.ptl @@ -30,11 +30,15 @@ glyph-block Mark-Horn-And-Angle : begin define [HornMarkAnchor attX attY overshootX overshootY yrP] : glyph-proc local [object radius hornFine startX startY] : HornDim attX attY overshootX overshootY yrP set-mark-anchor 'topright' attX attY startX startY + set-base-anchor 'aboveBraceL' (startX - radius) startY + set-base-anchor 'aboveBraceR' (startX - radius) startY glyph-block-export HornBaseAnchor define [HornBaseAnchor attX attY overshootX overshootY yrP] : glyph-proc local [object radius hornFine startX startY] : HornDim attX attY overshootX overshootY yrP set-base-anchor 'topright' startX startY + set-base-anchor 'aboveBraceL' (startX - radius) startY + set-base-anchor 'aboveBraceR' (startX - radius) startY define [HornShape attX attY overshootX overshootY yrP] : glyph-proc local [object radius hornFine hornStroke startX startY] : HornDim attX attY overshootX overshootY yrP @@ -96,14 +100,18 @@ glyph-block Mark-Horn-And-Angle : begin include : VBar.l 0 aboveMarkBot aboveMarkTop (markFine * 2) include : HBar.t (-markExtend * 1.5) 0 aboveMarkTop (markFine * 2) set-mark-anchor 'topright' 0 XH 0 aboveMarkTop + set-base-anchor 'aboveBraceL' (-0.75 * markExtend) aboveMarkMid + set-base-anchor 'aboveBraceR' 0 aboveMarkMid foreach { suffix { DrawAt kdr } } [Object.entries DotVariants] : do create-glyph "dotTR.\(suffix)" 0x358 : glyph-proc set-width 0 - include : HornMarkAnchor 0 XH 0 0 0.5 - local [object radius startX startY] : HornDim 0 XH 0 0 0.5 + local [object radius attX attY startX startY] : HornDim 0 XH 0 0 0.5 local r : mix radius DotRadius 0.5 include : DrawAt (startX - r) startY (r * kdr) + set-mark-anchor 'topright' 0 XH startX startY + set-base-anchor 'aboveBraceL' (startX - r) startY + set-base-anchor 'aboveBraceR' (startX - r) startY select-variant "dotTR" 0x358 (follow -- "diacriticDot") @@ -112,10 +120,15 @@ glyph-block Mark-Horn-And-Angle : begin include : refer-glyph src include : ApparentTranslate (RightSB - Middle + DotRadius) 0 set-mark-anchor 'topright' 0 XH 0 aboveMarkTop + set-base-anchor 'aboveBraceL' (-SB + DotRadius) aboveMarkMid + set-base-anchor 'aboveBraceR' (-SB + DotRadius) aboveMarkMid create-glyph 'rtailBR' 0x322 : glyph-proc set-width 0 set-mark-anchor 'bottomright' 0 0 0 belowMarkBot + set-base-anchor 'belowBraceL' (0.5 * HookX - 0.25 * markExtend - 0.75 * Stroke * HVContrast) (-0.5 * Hook - HalfStroke) + set-base-anchor 'belowBraceR' (0.5 * HookX + 0.25 * markExtend - 0.5 * Stroke * HVContrast) (-0.5 * Hook - HalfStroke) + include : dispiro widths.rhs flat 0 (-O) [heading Downward] @@ -126,6 +139,9 @@ glyph-block Mark-Horn-And-Angle : begin set-width 0 set-mark-anchor 'bottomright' 0 0 0 belowMarkBot + set-base-anchor 'belowBraceL' (-0.5 * HookX - 0.25 * markExtend - 0.25 * Stroke * HVContrast) (-0.5 * Hook - HalfStroke) + set-base-anchor 'belowBraceR' (-0.5 * HookX + 0.25 * markExtend - 0.25 * Stroke * HVContrast) (-0.5 * Hook - HalfStroke) + include : dispiro widths.rhs flat 0 (-O) [heading Downward] @@ -134,15 +150,20 @@ glyph-block Mark-Horn-And-Angle : begin create-glyph 'rightHalfCircleTR' : glyph-proc set-width 0 - set-mark-anchor 'topright' markMiddle XH markMiddle aboveMarkStack + include : refer-glyph "leftHalfCircleBelow" include : FlipAround markMiddle (XH / 2) + currentGlyph.clearAnchors + + set-mark-anchor 'topright' markMiddle XH markMiddle aboveMarkStack + set-base-anchor 'aboveBraceL' markMiddle aboveMarkMid + set-base-anchor 'aboveBraceR' markMiddle aboveMarkMid define ogonekTrConfig : object - 'ogonekTR' { (7/16) (1/8) 1 } - 'ogonekTR_Y' { (3/16) 1 6 } + 'ogonekTR' { (7/16) (1/8) 1 0 } + 'ogonekTR_Y' { (3/16) 1 6 0.5 } - foreach { glyphName { pExtL pExtR cwMidStrokeWidth } } [Object.entries ogonekTrConfig] : do + foreach { glyphName { pExtL pExtR cwMidStrokeWidth paren } } [Object.entries ogonekTrConfig] : do create-glyph glyphName : glyph-proc set-width 0 @@ -167,3 +188,5 @@ glyph-block Mark-Horn-And-Angle : begin MaskRight markMiddle set-mark-anchor 'trailing' markMiddle 0 (markMiddle + extR) (-depth - 0.5 * O - markStroke) + set-base-anchor 'belowBraceL' (markMiddle - extL - paren * markExtend - 0.25 * swMid * HVContrast) (-0.75 * depth) + set-base-anchor 'belowBraceR' (markMiddle - 0.75 * extL + paren * markExtend) (-0.75 * depth) diff --git a/font-src/glyphs/symbol/math/apl.ptl b/font-src/glyphs/symbol/math/apl.ptl index fd8bf71a4..55aa90880 100644 --- a/font-src/glyphs/symbol/math/apl.ptl +++ b/font-src/glyphs/symbol/math/apl.ptl @@ -204,7 +204,7 @@ glyph-block Symbol-Math-APL : begin derive-composites 'apl/omegaBar' 0x2379 'grek/omega' [refer-glyph 'underlineBelow'] [clear-anchors] # Overline - create-glyph 0x2351 : composite-proc [refer-glyph 'top'] [MarkSet.tack] [refer-glyph 'sbOverlineAbove'] [clear-anchors] + create-glyph 0x2351 : composite-proc [refer-glyph 'top'] [MarkSet.tack] [refer-glyph 'sbRsbOverlineAbove'] [clear-anchors] # Gapped Overlay create-glyph 0x2345 : composite-proc : Overlay [refer-glyph 'arrowLeft.NWID'] [refer-glyph 'apl/bar'] diff --git a/font-src/otl/gpos-mark-mkmk.ptl b/font-src/otl/gpos-mark-mkmk.ptl index 92f227068..8ddc60009 100644 --- a/font-src/otl/gpos-mark-mkmk.ptl +++ b/font-src/otl/gpos-mark-mkmk.ptl @@ -4,13 +4,24 @@ extern Map extern Set define MarkClasses { - 'above' 'below' 'overlay' 'slash' 'topright' 'bottomright' - 'trailing' 'lf' 'tieAbove' 'tieBelow' 'aboveBrace' 'belowBrace' 'grekUpperTonos' + 'above' 'tieAbove' 'topright' 'grekLowerTonos' 'aboveBraceL' 'aboveBraceR' + 'below' 'tieBelow' 'bottomright' 'trailing' 'lf' 'belowBraceL' 'belowBraceR' + + 'overlay' 'slash' 'cvDecompose' 'enclosureInner' 'enclosureInnerFirstHalf' 'enclosureInnerSecondHalf' 'fracBuildUp' } -export : define [buildMarkMkmk sink glyphStore] : begin +define MarkInteractions : new Map : list + list 'aboveBraceL' { 'aboveBraceL' 'above' 'topright' 'grekLowerTonos' } + list 'aboveBraceR' { 'aboveBraceR' 'above' 'topright' 'grekLowerTonos' } + list 'belowBraceL' { 'belowBraceL' 'below' 'bottomright' 'trailing' 'lf' } + list 'belowBraceR' { 'belowBraceR' 'below' 'bottomright' 'trailing' 'lf' } + + +define MkmkStackingLimit : new Set { 'above' 'below' } + +export : define [buildMarkMkmk sink glyphStore markGlyphs] : begin define validMarkClasses : new Set MarkClasses define mark : object @@ -27,28 +38,44 @@ export : define [buildMarkMkmk sink glyphStore] : begin AddCommonFeature sink mark.feature AddCommonFeature sink mkmk.feature + # Populate the marks foreach cls [items-of MarkClasses] : begin local markLookup : ensureLookup sink mark cls local mkmkLookup : ensureLookup sink mkmk cls foreach { gn glyph } [glyphStore.namedEntries] : begin - local glyphIsMark false if glyph.markAnchors.(cls) : begin - set glyphIsMark true + markGlyphs.all.add gn + markGlyphs.markAttachClassDef.set gn cls addMarkAnchor markLookup gn cls glyph.markAnchors.(cls) addMarkAnchor mkmkLookup gn cls glyph.markAnchors.(cls) + # Populate the bases + foreach cls [items-of MarkClasses] : begin + local markLookup : ensureLookup sink mark cls + local mkmkLookup : ensureLookup sink mkmk cls + + foreach { gn glyph } [glyphStore.namedEntries] : begin if glyph.baseAnchors.(cls) : begin - local anchor : object - x glyph.baseAnchors.(cls).x - y glyph.baseAnchors.(cls).y - if glyphIsMark + if [markGlyphs.all.has gn] : then : addBaseAnchor mkmkLookup gn cls glyph.baseAnchors.(cls) : else : addBaseAnchor markLookup gn cls glyph.baseAnchors.(cls) foreach lidMark mark.lookupNames : foreach lidMkmk mkmk.lookupNames sink.lookupDep.push { lidMark lidMkmk } + foreach { cls lookup } mkmk.lookupMap : begin + local interactionMarkSet : new Set ([MarkInteractions.get cls] || { cls }) + + local includeSet : new Set + local ignoreSet : new Set + foreach { gn c } markGlyphs.markAttachClassDef : if [interactionMarkSet.has c] + then : includeSet.add gn + else : ignoreSet.add gn + + set lookup.ignoreGlyphs : Array.from ignoreSet + if (interactionMarkSet.size > 1) : begin + markGlyphs.markGlyphSets.push : Array.from includeSet define [ensureLookup sink feat cls] : begin local existing : feat.lookupMap.get cls diff --git a/font-src/otl/gsub-ccmp.ptl b/font-src/otl/gsub-ccmp.ptl index d612d6529..50d42f413 100644 --- a/font-src/otl/gsub-ccmp.ptl +++ b/font-src/otl/gsub-ccmp.ptl @@ -8,6 +8,9 @@ define-operator "~>" 880 'right' : syntax-rules `(@l ~> @r) `{.left @l .right @r} export : define [buildCCMP sink glyphStore markGlyphs] : begin + local anyMark : Array.from markGlyphs.all + local aboveMark : filterMarkByClass markGlyphs 'above' + local rec : BeginLookupBlock sink define ccmp : AddFeature sink 'ccmp' @@ -32,7 +35,7 @@ export : define [buildCCMP sink glyphStore markGlyphs] : begin TieMarkFrom.push gid TieMarkTo.push [TieMark.get g] - define [IotaLF] : UkMapToLookup UnicodeKnowledge.iotaBelowToLfTf + define [IotaLF] : UkMapToLookup UnicodeKnowledge.iotaBelowToLfTf define [GrekUpperTonosTf] : UkMapToLookup UnicodeKnowledge.upperGrekMarkToTonosTf define [ToneToToneStart toneEnd] : begin @@ -103,24 +106,22 @@ export : define [buildCCMP sink glyphStore markGlyphs] : begin .type 'gsub_chaining' .rules : list # Dot removal (max 6 middle marks are supported) - chain-rule (dotlessFrom ~> dotlessTo) (markGlyphs.above ~> null) - chain-rule (dotlessFrom ~> dotlessTo) markGlyphs.all (markGlyphs.above ~> null) - chain-rule (dotlessFrom ~> dotlessTo) markGlyphs.all markGlyphs.all (markGlyphs.above ~> null) - chain-rule (dotlessFrom ~> dotlessTo) markGlyphs.all markGlyphs.all markGlyphs.all (markGlyphs.above ~> null) - chain-rule (dotlessFrom ~> dotlessTo) markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all (markGlyphs.above ~> null) - chain-rule (dotlessFrom ~> dotlessTo) markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all (markGlyphs.above ~> null) - chain-rule (dotlessFrom ~> dotlessTo) markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all (markGlyphs.above ~> null) + chain-rule (dotlessFrom ~> dotlessTo) (aboveMark ~> null) + chain-rule (dotlessFrom ~> dotlessTo) anyMark (aboveMark ~> null) + chain-rule (dotlessFrom ~> dotlessTo) anyMark anyMark (aboveMark ~> null) + chain-rule (dotlessFrom ~> dotlessTo) anyMark anyMark anyMark (aboveMark ~> null) + chain-rule (dotlessFrom ~> dotlessTo) anyMark anyMark anyMark anyMark (aboveMark ~> null) + chain-rule (dotlessFrom ~> dotlessTo) anyMark anyMark anyMark anyMark anyMark (aboveMark ~> null) + chain-rule (dotlessFrom ~> dotlessTo) anyMark anyMark anyMark anyMark anyMark anyMark (aboveMark ~> null) # Iota transform (max 6 middle marks are supported) chain-rule groupLF [IotaLF] - chain-rule groupLF markGlyphs.all [IotaLF] - chain-rule groupLF markGlyphs.all markGlyphs.all [IotaLF] - chain-rule groupLF markGlyphs.all markGlyphs.all markGlyphs.all [IotaLF] - chain-rule groupLF markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [IotaLF] - 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] - - + chain-rule groupLF anyMark [IotaLF] + chain-rule groupLF anyMark anyMark [IotaLF] + chain-rule groupLF anyMark anyMark anyMark [IotaLF] + chain-rule groupLF anyMark anyMark anyMark anyMark [IotaLF] + chain-rule groupLF anyMark anyMark anyMark anyMark anyMark [IotaLF] + chain-rule groupLF anyMark anyMark anyMark anyMark anyMark anyMark [IotaLF] define lookupMarks2 : AddLookup sink : object .type 'gsub_ligature' @@ -131,6 +132,13 @@ export : define [buildCCMP sink glyphStore markGlyphs] : begin .rules : list chain-rule groupGrekUpperTonos [GrekUpperTonosTf] + define lookupMarks4 : AddLookup sink : object + .type 'gsub_multiple' + .substitutions : object + 'braceAbove' { 'leftParenAbove' 'rightParenAbove' } + 'parenAbove' { 'leftBrackAbove' 'rightBrackAbove' } + 'parenBelow' { 'leftParenBelow' 'rightParenBelow' } + define lookupCcmp-TieMarkLigature : AddLookup sink : object .type 'gsub_ligature' .substitutions : {}.concat @@ -200,10 +208,11 @@ export : define [buildCCMP sink glyphStore markGlyphs] : begin chain-rule [ToneSandhiStartOrMidAt 4] [ToneSandhiToToneEnd 4] - ccmp.lookups.push lookupMarks1 lookupMarks2 lookupMarks3 lookupTieMarkContextual + ccmp.lookups.push lookupMarks1 lookupMarks2 lookupMarks3 lookupMarks4 lookupTieMarkContextual sink.lookupDep.push {lookupMarks1 lookupMarks2} sink.lookupDep.push {lookupMarks2 lookupMarks3} - sink.lookupDep.push {lookupMarks3 lookupTieMarkContextual} + sink.lookupDep.push {lookupMarks3 lookupMarks4} + sink.lookupDep.push {lookupMarks4 lookupTieMarkContextual} ccmp.lookups.push lookupToneStart lookupToneMid lookupToneEnd sink.lookupDep.push {lookupToneStart lookupToneMid} sink.lookupDep.push {lookupToneMid lookupToneEnd} @@ -229,6 +238,7 @@ export : define [buildCCMP sink glyphStore markGlyphs] : begin return ccmp export : define [buildCCMPPostCvSs sink ccmpFeature glyphStore markGlyphs] : begin + local anyMark : Array.from markGlyphs.all local rec : BeginLookupBlock sink define ccmp : AddFeature sink 'ccmp' @@ -246,12 +256,12 @@ export : define [buildCCMPPostCvSs sink ccmpFeature glyphStore markGlyphs] : beg define [pushTransforms sink triggers tf] : begin sink.push : chain-rule triggers [tf] - sink.push : chain-rule triggers markGlyphs.all [tf] - sink.push : chain-rule triggers markGlyphs.all markGlyphs.all [tf] - sink.push : chain-rule triggers markGlyphs.all markGlyphs.all markGlyphs.all [tf] - sink.push : chain-rule triggers markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [tf] - sink.push : chain-rule triggers markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [tf] - sink.push : chain-rule triggers markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all markGlyphs.all [tf] + sink.push : chain-rule triggers anyMark [tf] + sink.push : chain-rule triggers anyMark anyMark [tf] + sink.push : chain-rule triggers anyMark anyMark anyMark [tf] + sink.push : chain-rule triggers anyMark anyMark anyMark anyMark [tf] + sink.push : chain-rule triggers anyMark anyMark anyMark anyMark anyMark [tf] + sink.push : chain-rule triggers anyMark anyMark anyMark anyMark anyMark anyMark [tf] define ogonekTransforms {} pushTransforms ogonekTransforms triggerGlyphs_Normal markTransform_Normal @@ -265,3 +275,8 @@ export : define [buildCCMPPostCvSs sink ccmpFeature glyphStore markGlyphs] : beg EndLookupBlock rec sink define [objectIsNotEmpty obj] : obj && [Object.keys obj].length + +define [filterMarkByClass markGlyphs c] : begin + local marks {} + foreach { gn m } markGlyphs.markAttachClassDef : if (m == c) : marks.push gn + return marks diff --git a/font-src/otl/index.ptl b/font-src/otl/index.ptl index 95e1d9ab5..307ccce8f 100644 --- a/font-src/otl/index.ptl +++ b/font-src/otl/index.ptl @@ -17,6 +17,9 @@ define GDEF_SIMPLE 1 define GDEF_LIGATURE 2 define GDEF_MARK 3 +extern Set +extern Map + # GSUB define [buildGSUB para glyphStore markGlyphs] : begin define gsub : CreateEmptyTable @@ -72,31 +75,42 @@ define [buildGSUB para glyphStore markGlyphs] : begin # GPOS define [buildGPOS para glyphStore markGlyphs] : begin define gpos : CreateEmptyTable - buildMarkMkmk gpos glyphStore + buildMarkMkmk gpos glyphStore markGlyphs FinalizeTable gpos return gpos # GDEF define [buildGDEF para glyphStore markGlyphs] : begin - local GDEF {.glyphClassDef {.}} - foreach { gn glyph } [glyphStore.namedEntries] : begin - set GDEF.glyphClassDef.(gn) : if [[regex '_'].test gn] GDEF_LIGATURE GDEF_SIMPLE - if (glyph.markAnchors && [begin [local anchorKeys : Object.keys glyph.markAnchors] anchorKeys.length]) : begin - foreach key [items-of anchorKeys] : begin - if [not markGlyphs.(key)] : set markGlyphs.(key) {} - markGlyphs.(key).push gn - markGlyphs.all.push gn - set GDEF.glyphClassDef.(gn) GDEF_MARK + local GDEF { .glyphClassDef {.} .markAttachClassDef {.} .markGlyphSets {} } + + foreach { gn glyph } [glyphStore.namedEntries] : piecewise + [markGlyphs.all.has gn] : set GDEF.glyphClassDef.(gn) GDEF_MARK + [[regex '_'].test gn] : set GDEF.glyphClassDef.(gn) GDEF_LIGATURE + true : set GDEF.glyphClassDef.(gn) GDEF_SIMPLE + + local n 1 + local m : new Map + foreach { gn clsStr } markGlyphs.markAttachClassDef : begin + local clsNum : m.get clsStr + if [not clsNum] : begin + set clsNum n + set n (n + 1) + m.set clsStr clsNum + + set GDEF.markAttachClassDef.(gn) clsNum + + set GDEF.markGlyphSets markGlyphs.markGlyphSets + return GDEF export : define [buildOtl para glyphStore] : begin - local markGlyphs {.all {} } + local markGlyphs { .all [new Set] .markAttachClassDef [new Map] .markGlyphSets {} } local GPOS : buildGPOS para glyphStore markGlyphs local GDEF : buildGDEF para glyphStore markGlyphs local GSUB : buildGSUB para glyphStore markGlyphs # Make all diacritics join-l (Kitty #3716) - foreach gnMark [items-of markGlyphs.all] : begin + foreach gnMark markGlyphs.all : begin Gr.Joining.or [glyphStore.queryByName gnMark] Gr.Joining.Classes.Left # Build compatibility ligatures diff --git a/font-src/support/glyph/index.mjs b/font-src/support/glyph/index.mjs index cb23da9e6..345a2d572 100644 --- a/font-src/support/glyph/index.mjs +++ b/font-src/support/glyph/index.mjs @@ -182,6 +182,10 @@ export class Glyph { this.baseAnchors[id] = new Anchor(mbx, mby).transform(this.gizmo); } } + clearAnchors() { + this.baseAnchors = {}; + this.markAnchors = {}; + } deleteBaseAnchor(id) { delete this.baseAnchors[id]; }