diff --git a/changes/16.7.0.md b/changes/16.7.0.md index e6d0fe8d2..62bd58787 100644 --- a/changes/16.7.0.md +++ b/changes/16.7.0.md @@ -7,6 +7,17 @@ - LATIN SMALL LETTER F WITH STROKE (`U+A799`) (#1453). - LATIN CAPITAL LETTER U WITH STROKE (`U+A7B8`) (#1453). - LATIN SMALL LETTER U WITH STROKE (`U+A7B9`) (#1453). + - MODIFIER LETTER RAISED UP ARROW (`U+A71B`) (#1460). + - MODIFIER LETTER RAISED DOWN ARROW (`U+A71C`) (#1460). + - MODIFIER LETTER RAISED EXCLAMATION MARK (`U+A71D`). + - MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK (`U+A71E`). + - MODIFIER LETTER LOW INVERTED EXCLAMATION MARK (`U+A71F`). + - MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON (`U+10781`) ... MODIFIER LETTER RETROFLEX CLICK WITH RETROFLEX HOOK (`U+107B9`). + - LATIN LETTER SMALL CAPITAL L WITH BELT (`U+1DF04`). + - LATIN SMALL LETTER LEZH WITH RETROFLEX HOOK (`U+1DF05`). + - LATIN SMALL LETTER TURNED Y WITH BELT (`U+1DF06`). + - LATIN SMALL LETTER TURNED R WITH LONG LEG AND RETROFLEX HOOK (`U+1DF08`). + - LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK (`U+1DF0A`). * Fix metrics of ASCII single quotes under Aile (#1454). * Fix overshoot of oval-shaped `0`, and open `6`/`9` (#1455). * Fix serifs of certain letters (#1458): diff --git a/font-src/glyphs/auto-build/accents.ptl b/font-src/glyphs/auto-build/accents.ptl index 49aeb39cc..e70fb7e26 100644 --- a/font-src/glyphs/auto-build/accents.ptl +++ b/font-src/glyphs/auto-build/accents.ptl @@ -71,21 +71,34 @@ glyph-block AutoBuild-Accents : begin # When recursively building, `recursiveCodes` contain an array of "needed" Unicode list local goalCodes : recursiveCodes || [range 0x0000 0xFFFF] foreach code goalCodes : if [not : glyphStore.queryByUnicode code] : do + local parts { } + local allFound true + + local customDecomp UnicodeKnowledge.decompOverrides.(code) + local str : String.fromCodePoint code - local nfd : fallback UnicodeKnowledge.decompositionOverrides.(str) : str.normalize 'NFD' - if (str !== nfd) : begin - local nfdChars : Array.from nfd - local parts { } - local allFound true - foreach part [items-of nfdChars] : begin - local part : glyphStore.queryByUnicode [part.codePointAt 0] + local nfd : str.normalize 'NFD' + + if customDecomp + : then : begin + foreach partName customDecomp : begin + local part : glyphStore.queryByName partName if [not part] : then : set allFound false : else : parts.push part - if allFound : begin - local glyphName : 'u' + [code.toString 16 :.padStart 4 '0'] - set parts : subParts parts - set foundDecompositions.(glyphName) { glyphName code parts } + + : else : if (str !== nfd) : begin + local nfdChars : Array.from nfd + foreach partChar [items-of nfdChars] : begin + local part : glyphStore.queryByUnicode [partChar.codePointAt 0] + if [not part] + : then : set allFound false + : else : parts.push part + + if (allFound && parts.length) : begin + local glyphName : 'u' + [code.toString 16 :.padStart 4 '0'] + set parts : subParts parts + set foundDecompositions.(glyphName) { glyphName code parts } local s_goalName nothing local s_code nothing diff --git a/font-src/glyphs/auto-build/composite.ptl b/font-src/glyphs/auto-build/composite.ptl index 2ab7ae7f7..3d0f62332 100644 --- a/font-src/glyphs/auto-build/composite.ptl +++ b/font-src/glyphs/auto-build/composite.ptl @@ -1240,7 +1240,7 @@ glyph-block Autobuild-Pnonetic-Ligatures : begin glyph-block-import Recursive-Build : Thinner glyph-block-import Autobuild-Enclosure-Shared : CollectJobs CreateDerivedFontFromJobs EnsureComponentGlyphT applyRelations - define [createPhoneticLigatures prefix div _shrink1 _shrink2 wadj1 wadj2 demands] : begin + define [createPhoneticLigatures prefix div _shrink1 _shrink2 wadj1 wadj2 tfm demands] : begin define CWidth : Width * div define jobs : CollectJobs NON-DECOMPOSABLE NOT-CENTERED ALLOW-PROPORTIONAL prefix "" demands local shrink1 : clamp 0 1 _shrink1 @@ -1288,10 +1288,21 @@ glyph-block Autobuild-Pnonetic-Ligatures : begin include : Translate (CWidth / 2) 0 include : Regizmo + include : tfm div + applyRelations jobs.relApplications + define [ToLetter] : glyph-proc + define [ToSuperscript div] : glyph-proc + local df : DivFrame df + include [Ungizmo] true + include [Translate (-df.middle) (-CAP)] true + include [Scale 0.7] true + include [Translate df.middle (CAP + AccentStackOffset / 2)] true + include [Regizmo] true + define stdShrink : clamp 0.75 0.9 : StrokeWidthBlend 0.75 0.9 - createPhoneticLigatures 'phonetic' para.diversityM stdShrink stdShrink 1 1 : list + createPhoneticLigatures 'phonetic' para.diversityM stdShrink stdShrink 1 1 ToLetter : list list 0x02A3 { 'd/phoneticLeft' 'z' } 'b' list 0x02A4 { 'd/phoneticLeft' 'ezh' } 'if' list 0x02A5 { 'd/phoneticLeft' 'zCurlyTail' } 'if' @@ -1302,10 +1313,23 @@ glyph-block Autobuild-Pnonetic-Ligatures : begin list 0x02AA { 'l/phoneticLeft' 's/phoneticRight' } 'b' list 0x02AB { 'l/phoneticLeft' 'z' } 'b' list 0xAB66 { 'd/phoneticLeft' 'zRTailBR' } 'if' - list 0xAB67 { 't/phoneticLeft1' 'sRTail' } null + list 0xAB67 { 't/phoneticLeft1' 'sRTail' } 'p' list 0xFB01 { 'f/compLigLeft1' 'dotlessi/compLigRight' } null list 0xFB02 { 'f/compLigLeft2' 'l/compLigRight' } null + createPhoneticLigatures 'phoneticSuperscript' 1 stdShrink stdShrink 1 1 ToSuperscript : list + list 0x10787 { 'd/phoneticLeft' 'z' } 'b' + list 0x1078A { 'd/phoneticLeft' 'ezh' } 'if' + list 0x10789 { 'd/phoneticLeft' 'zCurlyTail' } 'if' + list 0x107AC { 't/phoneticLeft2' 's/phoneticRight' } 'b' + list 0x107AE { 't/teshLeft' 'esh' } 'if' + list 0x107AB { 't/phoneticLeft1' 'cCurlyTail' } 'b' + list 0x10790 { 'f/phoneticLeft' 'eng/phoneticRight' } 'if' + list 0x10799 { 'l/phoneticLeft' 's/phoneticRight' } 'b' + list 0x1079A { 'l/phoneticLeft' 'z' } 'b' + list 0x10788 { 'd/phoneticLeft' 'zRTailBR' } 'if' + list 0x107AD { 't/phoneticLeft1' 'sRTail' } 'p' + glyph-block Autobuild-Double-Emotions : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives diff --git a/font-src/glyphs/auto-build/transformed.ptl b/font-src/glyphs/auto-build/transformed.ptl index 911ffddfc..78565fe46 100644 --- a/font-src/glyphs/auto-build/transformed.ptl +++ b/font-src/glyphs/auto-build/transformed.ptl @@ -218,13 +218,13 @@ glyph-block Autobuild-Transformed : begin list 0x02B6 'invSmcpR' list 0x02B7 'w' list 0x02B8 'y' - list 0x02C0 'fineglottalstop' - list 0x02C1 'finerevglottalstop' + list 0x02C0 'fineGlottalStop' + list 0x02C1 'fineRevGlottalStop' list 0x02E0 'latn/gamma' list 0x02E1 'l' list 0x02E2 's' list 0x02E3 'x' - list 0x02E4 'revglottalstop' + list 0x02E4 'revGlottalStop' list 0x2071 'i' list 0x207F 'n' list 0x1D43 'a' @@ -323,17 +323,66 @@ glyph-block Autobuild-Transformed : begin list 0x207C 'equal' list 0x207D 'parenLeft' list 0x207E 'parenRight' - list 0xA7F8 'smcpHStroke' - list 0xA7F9 'oe' list 0xA702 'subst' list 0xA703 'substBarNoRise' list 0xA704 'supst' list 0xA705 'supstBarNoRise' - list 0xAB5C 'heng' - list 0xAB69 'turnw' + list 0xA71B 'arrowUp.NWID' + list 0xA71C 'arrowDown.NWID' + list 0xA71D 'alveolarclick' + list 0xA71E 'exclamDownAlt' list 0xA7F2 'C' list 0xA7F3 'F' list 0xA7F4 'Q' + list 0xA7F8 'smcpHStroke' + list 0xA7F9 'oe' + list 0xAB5C 'heng' + list 0xAB5E 'lTildeOver' + list 0xAB69 'turnw' + list 0x107AF 'tRTail' + list 0x1078B 'dHookBottom' + list 0x107A5 'q' + list 0x10792 'smcpG' + list 0x107B3 'glottalStopBar' + list 0x10795 'hBar' + list 0x10797 'hHookTopLTail' + list 0x107B0 'vHookTop' + list 0x107A9 'rFlap' + list 0x107A8 'rRTail' + list 0x10784 'smcpB' + list 0x107AA 'smcpR' + list 0x10796 'smcpH' + list 0x107B4 'revGlottalStopBar' + list 0x1079B 'lBelt' + list 0x1079E 'lyogh' + list 0x1079D 'lBeltRTail' + list 0x1079F 'lyoghRTail' + list 0x107A1 'turnyBelt' + list 0x1079C 'smcpLBelt' + list 0x107A0 'turny' + list 0x107A6 'turnrlongleg' + list 0x107A7 'rTurnLongLetRTail' + list 0x10785 'bHookTop' + list 0x1078C 'dHookTop' + list 0x1078D 'dHookTopBottom' + list 0x10798 'dotlessjBarHookTop' + list 0x10793 'gScriptHookTop' + list 0x10794 'smcpGHookTop' + list 0x107B5 'bullEye' + list 0x107B6 'dentalclick' + list 0x107B8 'palatoalveolarclick' + list 0x107B9 'retroflexClickHook' + list 0x107B7 'alveolarlateralclick' + list 0x107B2 'smcpY' + list 0x107A4 'closeomega' + list 0x107A2 'oSlash' + list 0x1078E 'eRev' + list 0x10791 'ramshorn' + list 0x1078F 'closeturnepsilon' + list 0x10783 'ae' + list 0x107A3 'smcpOE' + list 0x10781 'triangleColon' + list 0x10782 'halfTriangleColon' list null 'S' # there is no superscript S in unicode, but is is used for the SM symbol createSuperscripts 'numerator' NumeratorForm : list @@ -409,6 +458,7 @@ glyph-block Autobuild-Transformed : begin list 0xA701 'substBarNoRise' list 0xA706 'supst' list 0xA707 'supstBarNoRise' + list 0xA71F 'exclamDownAlt' createSubscripts 'denominator' DenominatorForm : list list null 'zero.onum' diff --git a/font-src/glyphs/letter/latin-ext/ezh.ptl b/font-src/glyphs/letter/latin-ext/ezh.ptl index aff61cee8..cfd059943 100644 --- a/font-src/glyphs/letter/latin-ext/ezh.ptl +++ b/font-src/glyphs/letter/latin-ext/ezh.ptl @@ -108,6 +108,19 @@ glyph-block Letter-Latin-Ezh : begin select-variant 'lyogh' 0x26E + create-glyph 'lyoghRTail.serifless' : glyph-proc + include : MarkSet.if + include : EzhShape XH 0 0.4 + include : VBarLeft SB 0 Ascender + include : WithTransform [ApparentTranslate (SB + HVContrast * Stroke - RightSB) (-Descender)] + refer-glyph 'rtailBR' + + create-glyph 'lyoghRTail.hooky' : glyph-proc + include [refer-glyph 'lyoghRTail.serifless'] AS_BASE ALSO_METRICS + include : LeftwardTopSerif SB Ascender SideJut + + select-variant 'lyoghRTail' 0x1DF05 (follow -- 'lyogh') + create-glyph 'ezhtail' 0x1BA : glyph-proc local b : mix Descender XH 0.25 include : EzhShape XH b nothing nothing 0.5 diff --git a/font-src/glyphs/letter/latin-ext/glottal-stop.ptl b/font-src/glyphs/letter/latin-ext/glottal-stop.ptl index 133ff598e..3bc1eea02 100644 --- a/font-src/glyphs/letter/latin-ext/glottal-stop.ptl +++ b/font-src/glyphs/letter/latin-ext/glottal-stop.ptl @@ -11,7 +11,7 @@ glyph-block Letter-Latin-Glottal-Stop : begin glyph-block-import Mark-Shared-Metrics : markHalfStroke glyph-block-import Letter-Shared-Shapes : LetterBarOverlay - create-glyph 'glottalstop' 0x294 : glyph-proc + create-glyph 'glottalStop' 0x294 : glyph-proc include : MarkSet.b include : dispiro widths.rhs @@ -24,9 +24,9 @@ glyph-block Letter-Latin-Glottal-Stop : begin if SLAB : begin include : CenterBottomSerif Middle 0 Jut - alias 'capglottalstop' 0x241 'glottalstop' + alias 'capGlottalStop' 0x241 'glottalStop' - create-glyph 'revglottalstop' 0x295 : glyph-proc + create-glyph 'revGlottalStop' 0x295 : glyph-proc include : MarkSet.b include : dispiro widths.lhs @@ -39,7 +39,7 @@ glyph-block Letter-Latin-Glottal-Stop : begin if SLAB : begin include : CenterBottomSerif Middle 0 Jut - create-glyph 'smallglottalstop' 0x242 : glyph-proc + create-glyph 'smallGlottalStop' 0x242 : glyph-proc include : MarkSet.b include : dispiro widths.rhs @@ -52,7 +52,7 @@ glyph-block Letter-Latin-Glottal-Stop : begin if SLAB : begin include : CenterBottomSerif Middle 0 Jut - create-glyph 'fineglottalstop' : glyph-proc + create-glyph 'fineGlottalStop' : glyph-proc include : MarkSet.b local fine : markHalfStroke * 2 include : dispiro @@ -66,7 +66,7 @@ glyph-block Letter-Latin-Glottal-Stop : begin if SLAB : begin include : CenterBottomSerif Middle 0 Jut fine - create-glyph 'finerevglottalstop' : glyph-proc + create-glyph 'fineRevGlottalStop' : glyph-proc include : MarkSet.b local fine : markHalfStroke * 2 include : dispiro @@ -80,12 +80,12 @@ glyph-block Letter-Latin-Glottal-Stop : begin if SLAB : begin include : CenterBottomSerif Middle 0 Jut fine - turned 'invglottalstop' 0x296 'revglottalstop' Middle (Ascender / 2) + turned 'invGlottalStop' 0x296 'revGlottalStop' Middle (Ascender / 2) - create-glyph 'glottalstopbar' 0x2A1 : glyph-proc - include [refer-glyph 'glottalstop'] AS_BASE + create-glyph 'glottalStopBar' 0x2A1 : glyph-proc + include [refer-glyph 'glottalStop'] AS_BASE include : LetterBarOverlay.m.in Middle [if SLAB Stroke 0] (Ascender * 0.5) 0.5 - create-glyph 'revglottalstopbar' 0x2A2 : glyph-proc - include [refer-glyph 'revglottalstop'] AS_BASE + create-glyph 'revGlottalStopBar' 0x2A2 : glyph-proc + include [refer-glyph 'revGlottalStop'] AS_BASE include : LetterBarOverlay.m.in Middle [if SLAB Stroke 0] (Ascender * 0.5) 0.5 diff --git a/font-src/glyphs/letter/latin/lower-h.ptl b/font-src/glyphs/letter/latin/lower-h.ptl index f3ba1e410..96ca9caa5 100644 --- a/font-src/glyphs/letter/latin/lower-h.ptl +++ b/font-src/glyphs/letter/latin/lower-h.ptl @@ -60,7 +60,7 @@ glyph-block Letter-Latin-Lower-H : begin if fTailed : include : RightwardTailedBar RightSB 0 (XH - SmallArchDepthB) include : Serifs fTailed false - create-glyph "hbar.\(suffix)" : glyph-proc + create-glyph "hBar.\(suffix)" : glyph-proc include [refer-glyph "h.\(suffix)"] AS_BASE ALSO_METRICS include : HBarOverlay fHasTopSerif @@ -94,7 +94,7 @@ glyph-block Letter-Latin-Lower-H : begin select-variant 'h' 'h' link-reduced-variant 'h/sansSerif' 'h' MathSansSerif turned 'turnh' 0x265 'h' Middle (XH / 2) [MarkSet.p] - select-variant 'hbar' 0x127 (follow -- 'h') + select-variant 'hBar' 0x127 (follow -- 'h') select-variant 'cyrl/shha' 0x4BB (shapeFrom -- 'h') derive-composites 'cyrl/shhaDescender' 0x527 'cyrl/shha' [CyrDescender RightSB] @@ -142,7 +142,7 @@ glyph-block Letter-Latin-Lower-H : begin include [refer-glyph src] include : MarkSet.if - alias 'cyrl/tshe' 0x45B 'hbar' + alias 'cyrl/tshe' 0x45B 'hBar' glyph-block-import Letter-Blackboard : BBS BBD BBBarLeft create-glyph 'mathbb/h' 0x1D559 : glyph-proc diff --git a/font-src/glyphs/letter/latin/lower-r.ptl b/font-src/glyphs/letter/latin/lower-r.ptl index ce8fb8227..6b28daf63 100644 --- a/font-src/glyphs/letter/latin/lower-r.ptl +++ b/font-src/glyphs/letter/latin/lower-r.ptl @@ -200,6 +200,16 @@ glyph-block Letter-Latin-Lower-R : begin include : refer-glyph "rtailBR" include : ApparentTranslate (df.rightSB - xBar + df.leftSB + Stroke * HVContrast) 0 + create-glyph "rTurnLongLetRTail.\(suffix)" : glyph-proc + include [refer-glyph "rlongleg.\(suffix)"] AS_BASE ALSO_METRICS + eject-contour 'serifLT' + include : FlipAround df.middle (XH / 2) + include : df.markSet.if + + define [object xBar] : RDim df mode + include : new-glyph : glyph-proc + include : refer-glyph "rtailBR" + include : ApparentTranslate (df.rightSB - xBar + df.leftSB + Stroke * HVContrast) 0 select-variant 'r' 'r' link-reduced-variant 'r/sansSerif' 'r' MathSansSerif @@ -218,6 +228,7 @@ glyph-block Letter-Latin-Lower-R : begin include : df.markSet.b select-variant 'rTurnRTail' 0x27B + select-variant 'rTurnLongLetRTail' 0x1DF08 (follow -- 'rTurnRTail') define [BBRShape df md doTopSerif doBottomSerif] : glyph-proc diff --git a/font-src/glyphs/letter/latin/lower-y.ptl b/font-src/glyphs/letter/latin/lower-y.ptl index 4381d911e..02b19b28c 100644 --- a/font-src/glyphs/letter/latin/lower-y.ptl +++ b/font-src/glyphs/letter/latin/lower-y.ptl @@ -12,7 +12,7 @@ glyph-block Letter-Latin-Lower-Y : begin glyph-block-import Mark-Shared-Metrics : markExtend markStroke markStress markFine glyph-block-import Mark-Above : aboveMarkTop aboveMarkBot aboveMarkMid aboveMarkStack glyph-block-import Mark-Below : belowMarkStack - glyph-block-import Letter-Shared-Shapes : nShoulder FlatHookDepth SerifFrame + glyph-block-import Letter-Shared-Shapes : nShoulder FlatHookDepth SerifFrame BeltOverlay define SLAB-NONE { false false false } define SLAB-AUTO { SLAB SLAB false } @@ -299,9 +299,17 @@ glyph-block Letter-Latin-Lower-Y : begin set-base-anchor 'overlay' Middle (XH / 2) select-variant 'y' 'y' + select-variant 'y/nonCursive' (shapeFrom -- 'y') link-reduced-variant 'y/sansSerif' 'y' MathSansSerif alias 'cyrl/u' 0x443 'y' + turned 'turny' 0x28E 'y/nonCursive' Middle (XH / 2) [MarkSet.b] + derive-glyphs 'turnyBelt' 0x1DF06 'y/nonCursive' : function [src sel] : glyph-proc + include : MarkSet.b + include [refer-glyph src] + include : FlipAround Middle (XH / 2) + include : BeltOverlay.at Middle XH + foreach { suffix { DrawAt kdr } } [Object.entries DotVariants] : do create-glyph "yDotBelowDot1.\(suffix)" : glyph-proc set-mark-anchor 'yBelowDot' 0 0 0 belowMarkStack @@ -362,8 +370,6 @@ glyph-block Letter-Latin-Lower-Y : begin select-variant 'yHookTop' 0x1B4 select-variant 'cyrl/U' 0x423 - turned 'turny' 0x28E 'y' Middle (XH / 2) [MarkSet.b] - define [LambdaBarOverlayShape] : FlatSlashShape [mix SB RightSB 0.45] [mix 0 CAP 0.8] (OverlayStroke / 2) define LambdaConfig : object straight { true false SLAB-NONE } diff --git a/font-src/glyphs/letter/latin/o.ptl b/font-src/glyphs/letter/latin/o.ptl index 8accbaa2b..de0044e0f 100644 --- a/font-src/glyphs/letter/latin/o.ptl +++ b/font-src/glyphs/letter/latin/o.ptl @@ -175,7 +175,7 @@ glyph-block Letter-Latin-O : begin alias 'grek/capSymbolTheta' 0x3F4 'Obar' alias 'cyrl/oe' 0x4E9 'obar' - create-glyph 'bulleye' 0x298 : glyph-proc + create-glyph 'bullEye' 0x298 : glyph-proc include [refer-glyph 'O'] AS_BASE local halfDotWidth : Math.min DotRadius ((RightSB - SB - HVContrast * Stroke * 2) / 4) local halfDotHeight : Math.min DotRadius (halfDotWidth * 1.5) diff --git a/font-src/glyphs/letter/latin/upper-l.ptl b/font-src/glyphs/letter/latin/upper-l.ptl index f8562a8c8..a8a031c4f 100644 --- a/font-src/glyphs/letter/latin/upper-l.ptl +++ b/font-src/glyphs/letter/latin/upper-l.ptl @@ -80,5 +80,7 @@ glyph-block Letter-Latin-Upper-L : begin create-glyph 'LBarOverlay' : LetterBarOverlay.l.in LBarLeftX 0 CAP create-glyph 'LBeltOverlay' : BeltOverlay CAP (LBarLeftX + 0.5 * HVContrast * Stroke) + create-glyph 'smcpLBeltOverlay' : BeltOverlay XH (LBarLeftX + 0.5 * HVContrast * Stroke) derive-composites 'LBar' 0x23D 'L' 'LBarOverlay' derive-composites 'LBelt' 0xA7AD 'L' 'LBeltOverlay' + derive-composites 'smcpLBelt' 0x1DF04 'smcpL' 'smcpLBeltOverlay' diff --git a/font-src/glyphs/letter/shared.ptl b/font-src/glyphs/letter/shared.ptl index fbc943ce9..09b30fe13 100644 --- a/font-src/glyphs/letter/shared.ptl +++ b/font-src/glyphs/letter/shared.ptl @@ -538,19 +538,22 @@ glyph-block Letter-Shared-Shapes : begin archv straight.down.end SB bottom [heading Downward] - glyph-block-export BeltOverlay - define [BeltOverlay top xMiddle] : begin + define [BeltOverlayAt x y] : begin local fine : AdviceStroke 4.5 local r : XH * 0.05 return : dispiro widths.rhs fine - flat xMiddle (0.5 * top + r) [heading Leftward] - curl (xMiddle - HalfStroke - r * 1.5) (0.5 * top + r) + flat x (y + r) [heading Leftward] + curl (x - HalfStroke - r * 1.5) (y + r) archv - g4.down.mid (xMiddle - HalfStroke - r * 2.5) (0.5 * top) [heading Downward] + g4.down.mid (x - HalfStroke - r * 2.5) y [heading Downward] arcvh - flat (xMiddle - HalfStroke - r * 1.5) (0.5 * top - r) - curl (xMiddle + HalfStroke + r * 1.5 + fine) (0.5 * top - r) + flat (x - HalfStroke - r * 1.5) (y - r) + curl (x + HalfStroke + r * 1.5 + fine) (y - r) + + glyph-block-export BeltOverlay + define [BeltOverlay top xMiddle] : BeltOverlayAt xMiddle (0.5 * top) + set BeltOverlay.at BeltOverlayAt glyph-block-export LetterBarOverlay define [LetterBarOverlay] : params [x y space refSw pXInSw sw] : begin diff --git a/font-src/glyphs/symbol/punctuation/emotion.ptl b/font-src/glyphs/symbol/punctuation/emotion.ptl index 68d187889..02924db2f 100644 --- a/font-src/glyphs/symbol/punctuation/emotion.ptl +++ b/font-src/glyphs/symbol/punctuation/emotion.ptl @@ -17,7 +17,7 @@ glyph-block Symbol-Punctuation-Emotion : begin create-glyph "exclam.\(suffix)" : glyph-proc local df : DivFrame para.diversityF set-width df.width - include : MarkSet.capital + include : df.markSet.capital include : VBar df.middle [clamp 0 (CAP * 0.4) (emotionBottom * 1.18)] CAP include : DrawAt df.middle dr (dr - overshoot) @@ -35,8 +35,16 @@ glyph-block Symbol-Punctuation-Emotion : begin select-variant 'question/dotPart' (follow -- 'punctuationDot') select-variant 'questionDown/dotPart' (follow -- 'punctuationDot') - alias 'alveolarclick' 0x1C3 'exclam' - turned 'exclamDown' 0xA1 'exclam' [DivFrame para.diversityF].middle (XH / 2) + derive-glyphs 'retroflexClickHook' 0x1DF0A 'exclam' : function [src sel] : glyph-proc + include [refer-glyph src] AS_BASE ALSO_METRICS + local df : DivFrame para.diversityF + include : df.markSet.capDesc + include : WithTransform [ApparentTranslate (df.middle + HVContrast * HalfStroke - df.rightSB) (-Descender)] + refer-glyph "rtailBR" + + alias 'alveolarclick' 0x1C3 'exclam' + turned 'exclamDown' 0xA1 'exclam' [DivFrame para.diversityF].middle (XH / 2) + turned 'exclamDownAlt' null 'exclam' [DivFrame para.diversityF].middle (XH / 2) do "Question" local [YConnectT top emotionBottom] : mix emotionBottom (top - HalfStroke) 0.375 diff --git a/font-src/glyphs/symbol/punctuation/other-phonetic.ptl b/font-src/glyphs/symbol/punctuation/other-phonetic.ptl index b48bd2a8d..130c184d0 100644 --- a/font-src/glyphs/symbol/punctuation/other-phonetic.ptl +++ b/font-src/glyphs/symbol/punctuation/other-phonetic.ptl @@ -10,11 +10,11 @@ glyph-block Symbol-Other-Phonetic : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives - local triangleSize : Math.min (PeriodRadius) (XH / 5) + local triangleSize : Math.min (PeriodRadius) (XH / 6) local toneMarkLeft : mix SB RightSB 0.1 local toneMarkRight : Width - toneMarkLeft - create-glyph 'trianglecolon' 0x2D0 : glyph-proc + create-glyph 'triangleColon' 0x2D0 : glyph-proc include : union spiro-outline corner (Middle - triangleSize * 1.35) XH @@ -25,7 +25,7 @@ glyph-block Symbol-Other-Phonetic : begin corner Middle (0 + triangleSize * 2.75) corner (Middle + triangleSize * 1.35) 0 - create-glyph 'halftrianglecolon' 0x2D1 : glyph-proc + create-glyph 'halfTriangleColon' 0x2D1 : glyph-proc include : spiro-outline corner (Middle - triangleSize * 1.35) XH corner Middle (XH - triangleSize * 2.75) diff --git a/font-src/meta/unicode-knowledge.ptl b/font-src/meta/unicode-knowledge.ptl index 8dea3650b..506e53827 100644 --- a/font-src/meta/unicode-knowledge.ptl +++ b/font-src/meta/unicode-knowledge.ptl @@ -34,136 +34,120 @@ export : define markCompositionTf : object 'cyrlPsiliAbove' : object 'cyrlPokrytieAbove' 'cyrlPsiliPokrytieAbove' -export : define decompositionOverrides : object +export : define decompOverrides : object # Latvians use comma instead of cedillas in several letters. # Record them as custom decomposition. - ."\u0156" "R\u0326" - ."\u0157" "r\u0326" - ."\u0136" "K\u0326" - ."\u0137" "k\u0326" - ."\u0145" "N\u0326" - ."\u0146" "n\u0326" - ."\u013B" "L\u0326" - ."\u013C" "l\u0326" - ."\u0122" "G\u0326" - ."\u0123" "g\u0312" + 0x122 { 'G' 'commaBelow' } + 0x123 { 'g' 'turnCommaAbove' } + 0x136 { 'K' 'commaBelow' } + 0x137 { 'k' 'commaBelow' } + 0x13b { 'L' 'commaBelow' } + 0x13c { 'l' 'commaBelow' } + 0x145 { 'N' 'commaBelow' } + 0x146 { 'n' 'commaBelow' } + 0x156 { 'R' 'commaBelow' } + 0x157 { 'r' 'commaBelow' } - # autobuild Latin glyphs - ."\u0167" "t\u0335" - ."\u0197" "I\u0335" - ."\u019A" "l\u0335" - ."\u0248" "J\u0335" - ."\u0249" "j\u0335" - ."\u0268" "i\u0335" - ."\u024D" "r\u0335" - ."\u1D7B" "\u026A\u0335" - ."\u1D7C" "\u0269\u0335" + # Spacing marks + 0xa8 { 'markBaseSpace' 'dieresisAbove' } + 0xaf { 'markBaseSpace' 'macronAbove' } + 0xb8 { 'markBaseSpace' 'cedillaBelow' } + 0x2c2 { 'markBaseSpace' 'lessAbove' } + 0x2c3 { 'markBaseSpace' 'greaterAbove' } + 0x2c4 { 'markBaseSpace' 'upArrowHeadAbove' } + 0x2c5 { 'markBaseSpace' 'downArrowHeadAbove' } + 0x2c6 { 'markBaseSpace' 'circumflexAbove' } + 0x2c7 { 'markBaseSpace' 'caronAbove' } + 0x2c9 { 'markBaseSpace' 'macronAbove' } + 0x2ca { 'markBaseSpace' 'acuteAbove' } + 0x2cb { 'markBaseSpace' 'graveAbove' } + 0x2cd { 'markBaseSpace' 'macronBelow' } + 0x2ce { 'markBaseSpace' 'graveBelow' } + 0x2cf { 'markBaseSpace' 'acuteBelow' } + 0x2d2 { 'markBaseSpace' 'rightHalfCircleBelow' } + 0x2d3 { 'markBaseSpace' 'leftHalfCircleBelow' } + 0x2d4 { 'markBaseSpace' 'uptackBelow' } + 0x2d5 { 'markBaseSpace' 'downtackBelow' } + 0x2d6 { 'markBaseSpace' 'plusBelow' } + 0x2d7 { 'markBaseSpace' 'minusBelow' } + 0x2d8 { 'markBaseSpace' 'breveAbove' } + 0x2d9 { 'markBaseSpace' 'dotAbove' } + 0x2da { 'markBaseSpace' 'ringAbove' } + 0x2db { 'markBaseSpace' 'ogonekBelow' } + 0x2dc { 'markBaseSpace' 'tildeAbove' } + 0x2dd { 'markBaseSpace' 'doubleAcuteAbove' } + 0x2df { 'markBaseSpace' 'crossAbove' } + 0x2ec { 'markBaseSpace' 'caronBelow' } + 0x2ed { 'markBaseSpace' 'dblOverlineAbove' } + 0x2ef { 'markBaseSpace' 'downArrowHeadBelow' } + 0x2f0 { 'markBaseSpace' 'upArrowHeadBelow' } + 0x2f1 { 'markBaseSpace' 'lessBelow' } + 0x2f2 { 'markBaseSpace' 'greaterBelow' } + 0x2f3 { 'markBaseSpace' 'ringBelow' } + 0x2f7 { 'markBaseSpace' 'tildeBelow' } + 0x2ff { 'markBaseSpace' 'leftArrowBelow' } + 0x37a { 'markBaseSpace' 'iotaBelow' } + 0x384 { 'markBaseSpace' 'acuteAbove' } + 0x385 { 'markBaseSpace' 'dieresisAbove' 'acuteAbove' } + 0x1fbd { 'markBaseSpace' 'commaAbove' } + 0x1fbe { 'markBaseSpace' 'iotaBelow' } + 0x1fbf { 'markBaseSpace' 'commaAbove' } + 0x1fc0 { 'markBaseSpace' 'perispomeniAbove' } + 0x1fc1 { 'markBaseSpace' 'dieresisAbove' 'perispomeniAbove' } + 0x1fed { 'markBaseSpace' 'dieresisAbove' 'graveAbove' } + 0x1fee { 'markBaseSpace' 'dieresisAbove' 'acuteAbove' } + 0x1fef { 'markBaseSpace' 'graveAbove' } + 0x1ffd { 'markBaseSpace' 'acuteAbove' } + 0x1ffe { 'markBaseSpace' 'revCommaAbove' } - ."\u1D7F" "\u028A\uE001" - ."\u0289" "u\uE001" - ."\u0244" "U\uE001" - ."\u01E5" "g\uE001" - ."\u01BB" "2\uE001" - ."\u04B0" "\u04AE\u0335" - ."\u04B1" "\u04AF\u0335" - ."\u024F" "y\uE001" - ."\uAB30" "\uAB64\uE001" - ."\u1D7D" "p\uE001" + 0x167 { 't' 'barOver' } + 0x197 { 'I' 'barOver' } + 0x19a { 'l' 'barOver' } + 0x1bb { 'two.lnum' 'longBarOver' } + 0x23a { 'A' 'longSlashOver' } + 0x23b { 'C' 'longSlashOver' } + 0x23c { 'c' 'slashOver' } + 0x23e { 'T' 'longSlashOver' } + 0x244 { 'U' 'longBarOver' } + 0x246 { 'E' 'longSlashOver' } + 0x247 { 'e' 'slashOver' } + 0x248 { 'J' 'barOver' } + 0x249 { 'j' 'barOver' } + 0x24d { 'r' 'barOver' } + 0x24f { 'y' 'longBarOver' } - ."\u023A" "A\u0338" - ."\u023B" "C\u0338" - ."\u023C" "c\u0337" - ."\u023E" "T\u0338" - ."\u0246" "E\u0338" - ."\u0247" "e\u0337" + 0x47c { 'cyrl/BroadOmega' 'cyrlPsiliAbove' 'cyrlPokrytieAbove' } + 0x47d { 'cyrl/broadOmega' 'cyrlPsiliAbove' 'cyrlPokrytieAbove' } + 0x498 { 'cyrl/Ze' 'cedillaBelow' } + 0x499 { 'cyrl/ze' 'cedillaBelow' } + 0x4aa { 'cyrl/Es' 'cedillaBelow' } + 0x4ab { 'cyrl/es' 'cedillaBelow' } + 0x4b0 { 'cyrl/Ue' 'barOver' } + 0x4b1 { 'cyrl/ue' 'barOver' } - ."\u0290" "z\u0322" - ."\u1D90" "\u0251\u0322" + 0x1d7c { 'latn/iota' 'barOver' } + 0x1d7d { 'p' 'longBarOver' } + 0x1d7f { 'latinupsilon1' 'longBarOver' } + 0x1e10 { 'D' 'commaBelow' } + 0x1e11 { 'd' 'commaBelow' } + 0x1e9c { 'longs' 'shortSlashOver' } + 0x1eda { 'OHorn' 'acuteAbove' } + 0x1edb { 'oHorn' 'acuteAbove' } + 0x1edc { 'OHorn' 'graveAbove' } + 0x1edd { 'oHorn' 'graveAbove' } + 0x1ede { 'OHorn' 'hookAbove' } + 0x1edf { 'oHorn' 'hookAbove' } + 0x1ee0 { 'OHorn' 'tildeAbove' } + 0x1ee1 { 'oHorn' 'tildeAbove' } + 0x1ee2 { 'OHorn' 'dotBelow' } + 0x1ee3 { 'oHorn' 'dotBelow' } - ."\u1E10" "D\u0326" - ."\u1E11" "d\u0326" + 0x2c65 { 'a' 'slashOver' } + 0x2c66 { 't' 'longSlashOver' } - ."\u1E9C" "\u017F\uE000" - - ."\u1EDC" "\u01A0\u0300" - ."\u1EDD" "\u01A1\u0300" - ."\u1EDA" "\u01A0\u0301" - ."\u1EDB" "\u01A1\u0301" - ."\u1EDE" "\u01A0\u0309" - ."\u1EDF" "\u01A1\u0309" - ."\u1EE0" "\u01A0\u0303" - ."\u1EE1" "\u01A1\u0303" - ."\u1EE2" "\u01A0\u0323" - ."\u1EE3" "\u01A1\u0323" - - ."\u2C65" "a\u0337" - ."\u2C66" "t\u0338" - - # Cyrillic composite characters - ."\u0498" "\u0417\u0327" - ."\u0499" "\u0437\u0327" - ."\u04AA" "\u0421\u0327" - ."\u04AB" "\u0441\u0327" - ."\u047C" "\uA64C\u0486\u0487" - ."\u047D" "\uA64D\u0486\u0487" - - # Spacing modifers - ."\u02CB" "\uE00D\u0300" - ."\u02CA" "\uE00D\u0301" - ."\u02C6" "\uE00D\u0302" - ."\u02DC" "\uE00D\u0303" - ."\u00AF" "\uE00D\u0304" - ."\u02C9" "\uE00D\u0304" - ."\u02D8" "\uE00D\u0306" - ."\u02D9" "\uE00D\u0307" - ."\u00A8" "\uE00D\u0308" - ."\u02DA" "\uE00D\u030A" - ."\u02C7" "\uE00D\u030C" - ."\u00B8" "\uE00D\u0327" - ."\u02CD" "\uE00D\u0331" - ."\u02CE" "\uE00D\u0316" - ."\u02CF" "\uE00D\u0317" - ."\u02D2" "\uE00D\u0339" - ."\u02D3" "\uE00D\u031C" - ."\u02D4" "\uE00D\u031D" - ."\u02D5" "\uE00D\u031E" - ."\u02D6" "\uE00D\u031F" - ."\u02D7" "\uE00D\u0320" - ."\u02DB" "\uE00D\u0328" - ."\u02DD" "\uE00D\u030B" - ."\u02DF" "\uE00D\u033D" - ."\u02EC" "\uE00D\u032C" - ."\u02ED" "\uE00D\u033F" - ."\u02F3" "\uE00D\u0325" - ."\u02F7" "\uE00D\u0330" - ."\u02BE" "\uE00D\u0357" - ."\u02BF" "\uE00D\u0351" - ."\u02C2" "\uE00D\u1DFE" - ."\u02C3" "\uE00D\u0350" - ."\u02C4" "\uE00D\uE002" - ."\u02C5" "\uE00D\uE003" - ."\u02EF" "\uE00D\uE005" - ."\u02F0" "\uE00D\uE004" - ."\u02F1" "\uE00D\u0354" - ."\u02F2" "\uE00D\u0355" - ."\u02FF" "\uE00D\u20EE" - - ."\u1FED" "\uE00D\u0308\u0300" - ."\u1FEE" "\uE00D\u0308\u0301" - ."\u1FEF" "\uE00D\u0300" - ."\u1FFD" "\uE00D\u0301" - ."\u1FFE" "\uE00D\u0314" - ."\u1FBD" "\uE00D\u0313" - ."\u1FBE" "\uE00D\u0345" - ."\u1FBF" "\uE00D\u0313" - ."\u1FC0" "\uE00D\u0342" - ."\u1FC1" "\uE00D\u0308\u0342" - ."\u0384" "\uE00D\u0301" - ."\u0385" "\uE00D\u0308\u0301" - ."\u037A" "\uE00D\u0345" - ."\uAB30" "\u0251\uE001" - ."\uA7B8" "U\u0338" - ."\uA7B9" "u\u0337" - ."\uA7BB" "a\uE010" - ."\uA7BD" "i\uE010" - ."\uA7BF" "u\uE010" + 0xa7b8 { 'U' 'longSlashOver' } + 0xa7b9 { 'u' 'slashOver' } + 0xa7bb { 'a' 'EgyptologicalYodAbove' } + 0xa7bd { 'i' 'EgyptologicalYodAbove' } + 0xa7bf { 'u' 'EgyptologicalYodAbove' } + 0xab30 { 'scripta' 'longBarOver' } diff --git a/params/variants.toml b/params/variants.toml index 9b972e1e9..0f182b7f3 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -4301,6 +4301,7 @@ tag = "cv49" rank = 1 description = "Letter `y` that is fully straight" selector.y = "straight" +selector."y/nonCursive" = "straight" selector."y/sansSerif" = "straight" selector.yHookTop = "straight" @@ -4308,6 +4309,7 @@ selector.yHookTop = "straight" rank = 2 description = "Letter `y` with straight upper and a tail turns leftward" selector.y = "straightTurn" +selector."y/nonCursive" = "straightTurn" selector."y/sansSerif" = "straightTurn" selector.yHookTop = "straightTurn" @@ -4315,6 +4317,7 @@ selector.yHookTop = "straightTurn" rank = 3 description = "More curly letter `y`, like Iosevka 2.x" selector.y = "curly" +selector."y/nonCursive" = "curly" selector."y/sansSerif" = "curly" selector.yHookTop = "curly" @@ -4322,6 +4325,7 @@ selector.yHookTop = "curly" rank = 4 description = "More curly letter `y`, like Iosevka 2.x, with a tail turns leftward" selector.y = "curlyTurn" +selector."y/nonCursive" = "curlyTurn" selector."y/sansSerif" = "curlyTurn" selector.yHookTop = "curlyTurn" @@ -4329,6 +4333,7 @@ selector.yHookTop = "curlyTurn" rank = 5 description = "Cursive-like `y`" selector.y = "cursive" +selector."y/nonCursive" = "straightTurn" selector."y/sansSerif" = "cursive" selector.yHookTop = "cursive" @@ -4336,6 +4341,7 @@ selector.yHookTop = "cursive" rank = 6 description = "Cursive-like `y` with flat terminal hook" selector.y = "cursiveFlatHook" +selector."y/nonCursive" = "straightTurn" selector."y/sansSerif" = "cursiveFlatHook" selector.yHookTop = "cursiveFlatHook" @@ -4343,6 +4349,7 @@ selector.yHookTop = "cursiveFlatHook" rank = 7 description = "Letter `y` that is fully straight, with motion serifs" selector.y = "straightMotionSerifed" +selector."y/nonCursive" = "straightMotionSerifed" selector."y/sansSerif" = "straight" selector.yHookTop = "straight" @@ -4350,6 +4357,7 @@ selector.yHookTop = "straight" rank = 8 description = "Letter `y` with straight upper and a tail turns leftward, and motion serifs" selector.y = "straightTurnMotionSerifed" +selector."y/nonCursive" = "straightTurnMotionSerifed" selector."y/sansSerif" = "straightTurn" selector.yHookTop = "straightTurn" @@ -4357,6 +4365,7 @@ selector.yHookTop = "straightTurn" rank = 9 description = "More curly letter `y`, like Iosevka 2.x, with motion serifs" selector.y = "curlyMotionSerifed" +selector."y/nonCursive" = "curlyMotionSerifed" selector."y/sansSerif" = "curly" selector.yHookTop = "curly" @@ -4364,6 +4373,7 @@ selector.yHookTop = "curly" rank = 10 description = "More curly letter `y`, like Iosevka 2.x, with a tail turns leftward and motion serifs" selector.y = "curlyTurnMotionSerifed" +selector."y/nonCursive" = "curlyTurnMotionSerifed" selector."y/sansSerif" = "curlyTurn" selector.yHookTop = "curlyTurn" @@ -4371,6 +4381,7 @@ selector.yHookTop = "curlyTurn" rank = 11 description = "Cursive-like `y`, with motion serifs" selector.y = "cursiveMotionSerifed" +selector."y/nonCursive" = "straightTurnMotionSerifed" selector."y/sansSerif" = "cursive" selector.yHookTop = "cursive" @@ -4378,6 +4389,7 @@ selector.yHookTop = "cursive" rank = 12 description = "Cursive-like `y` with flat terminal hook, and motion serifs" selector.y = "cursiveFlatHookMotionSerifed" +selector."y/nonCursive" = "straightTurnMotionSerifed" selector."y/sansSerif" = "cursiveFlatHook" selector.yHookTop = "cursiveFlatHook" diff --git a/utility/export-data/coverage-export/block-data.mjs b/utility/export-data/coverage-export/block-data.mjs index aa1203b5a..5d34db7bc 100644 --- a/utility/export-data/coverage-export/block-data.mjs +++ b/utility/export-data/coverage-export/block-data.mjs @@ -5,6 +5,8 @@ export async function collectBlockData() { [[0xe0a0, 0xe0df], "Private Use Area — Powerline"], [[0xee00, 0xee3f], "Private Use Area — Progress Bar"], // Missing ranges in UnicodeDataIndex + [[0x10780, 0x107bf], "Latin Extended-F"], + [[0x1df00, 0x1dfff], "Latin Extended-G"], [[0x1fa70, 0x1faff], "Symbols and Pictographs Extended-A "], [[0x1fb00, 0x1fbff], "Symbols for Legacy Computing"] ];