diff --git a/changes/19.0.2.md b/changes/19.0.2.md index 0b8736132..9bba7f46f 100644 --- a/changes/19.0.2.md +++ b/changes/19.0.2.md @@ -6,4 +6,4 @@ - MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE (`U+1E06D`). - COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I (`U+1E08F`). * Add variants for partial differential symbol (#1503). -* Prevent pathological geometry produced in phonetic ligatures (#1562, #1565, #1566). +* Prevent pathological geometry produced in phonetic ligatures (#1562, #1565, #1566, #1568, #1569, # 1570, #1571). diff --git a/font-src/gen/finalize/glyphs.mjs b/font-src/gen/finalize/glyphs.mjs index 7588e7696..d9828de9a 100644 --- a/font-src/gen/finalize/glyphs.mjs +++ b/font-src/gen/finalize/glyphs.mjs @@ -359,7 +359,7 @@ class CoordinateAligner { } apply() { for (let i = 0; i < this.c.length; i++) { - this.lensSet(this.c[i], this.lens(this.c[this.find(i)])); + this.lensSet(this.c[i], Math.round(this.lens(this.c[this.find(i)]))); } } } @@ -379,12 +379,11 @@ function occurrentPrecisionEqual(a, b) { function aligned(a, b, c) { return a === b && b === c; } -function between(a, b, c) { - return (a <= b && b <= c) || (a >= b && b >= c); -} + function pointsColinear(zPrev, zCurr, zNext) { - if (aligned(zPrev.x, zCurr.x, zNext.x) && between(zPrev.y, zCurr.y, zNext.y)) return true; - if (aligned(zPrev.y, zCurr.y, zNext.y) && between(zPrev.x, zCurr.x, zNext.x)) return true; + // No need to check in-betweenness, we can safely remove the corner + if (aligned(zPrev.x, zCurr.x, zNext.x)) return true; + if (aligned(zPrev.y, zCurr.y, zNext.y)) return true; return false; } diff --git a/font-src/glyphs/auto-build/composite.ptl b/font-src/glyphs/auto-build/composite.ptl index 5eb824e8d..0577860c3 100644 --- a/font-src/glyphs/auto-build/composite.ptl +++ b/font-src/glyphs/auto-build/composite.ptl @@ -1269,8 +1269,8 @@ glyph-block Autobuild-Pnonetic-Ligatures : begin local dist (Stroke * 2) local maskOuts : list - createMaskout c1 c2 0.1 - createMaskout c1 c2 (dist - 0.1) + createMaskout c1 c2 0.01 + createMaskout c1 c2 (dist - 0.01) while (s < dist) : begin maskOuts.push : createMaskout c1 c2 s set s : s + step diff --git a/font-src/glyphs/symbol/geometric/masked.ptl b/font-src/glyphs/symbol/geometric/masked.ptl index 1b29cae50..41392c2e7 100644 --- a/font-src/glyphs/symbol/geometric/masked.ptl +++ b/font-src/glyphs/symbol/geometric/masked.ptl @@ -214,37 +214,43 @@ glyph-block Symbol-Geometric-Masked : for-width-kinds WideWidth1 create-glyph [MangleName 'uni25D8'] [MangleUnicode 0x25D8] : glyph-proc set-width Geom.Width include : difference - refer-glyph : MangleName 'blackLongRectangle' + intersection [MaskAbove SymbolMid] : refer-glyph : MangleName 'blackLongRectangle' refer-glyph : MangleName 'blackInvInnerCircle' - - create-glyph [MangleName 'uni25D9'] [MangleUnicode 0x25D9] : glyph-proc - set-width Geom.Width include : difference - refer-glyph : MangleName 'blackLongRectangle' - refer-glyph : MangleName 'whiteInvInnerCircle' + intersection [MaskBelow SymbolMid] : refer-glyph : MangleName 'blackLongRectangle' + refer-glyph : MangleName 'blackInvInnerCircle' create-glyph [MangleName 'uni25DA'] [MangleUnicode 0x25DA] : glyph-proc set-width Geom.Width - include : intersection - refer-glyph : MangleName 'uni25D9' - UpperHalfMask + include : difference + intersection [MaskAbove SymbolMid] : refer-glyph : MangleName 'blackLongRectangle' + refer-glyph : MangleName 'whiteInvInnerCircle' create-glyph [MangleName 'uni25DB'] [MangleUnicode 0x25DB] : glyph-proc set-width Geom.Width - include : intersection - refer-glyph : MangleName 'uni25D9' - LowerHalfMask + include : difference + intersection [MaskBelow SymbolMid] : refer-glyph : MangleName 'blackLongRectangle' + refer-glyph : MangleName 'whiteInvInnerCircle' + + create-glyph [MangleName 'uni25D9'] [MangleUnicode 0x25D9] : glyph-proc + set-width Geom.Width + include : refer-glyph : MangleName 'uni25DA' + include : refer-glyph : MangleName 'uni25DB' create-glyph [MangleName 'uni2389'] [MangleUnicode 0x2389] : glyph-proc + define shiftUp : ApparentTranslate 0 + Math.max + 0.5 * [Math.sqrt 2] * Size.MediumSmall.sw + Geom.Size * (1 - Size.MediumSmall.size) + set-width Geom.Width - define shiftUp : Translate 0 [Math.max (0.5 * [Math.sqrt 2] * Size.MediumSmall.sw) (Geom.Size * (1 - Size.MediumSmall.size))] include : refer-glyph : MangleName 'whiteCircle' include : intersection - refer-glyph : MangleName 'blackCircle' + refer-glyph : MangleName 'blackCircleO' union difference HBar.m 0 Geom.Width Geom.MidY GeometryStroke - WithTransform shiftUp : refer-glyph : MangleName 'blackMediumEqualDiamond' + WithTransform [ApparentTranslate 0 0.01] : WithTransform shiftUp : refer-glyph : MangleName 'blackMediumEqualDiamond' intersection MaskBelow (Geom.MidY + GeometryStroke / 2) WithTransform shiftUp : refer-glyph : MangleName 'whiteMediumEqualDiamond' @@ -253,7 +259,7 @@ glyph-block Symbol-Geometric-Masked : for-width-kinds WideWidth1 set-width Geom.Width include : refer-glyph : MangleName 'whiteCircle' include : intersection - refer-glyph : MangleName 'blackCircle' + refer-glyph : MangleName 'blackCircleO' refer-glyph : MangleName 'whiteEqualTriangleDown' do "Moon Phases" @@ -265,7 +271,7 @@ glyph-block Symbol-Geometric-Masked : for-width-kinds WideWidth1 define [WaxingMoonMask] : union MaskLeft Geom.MidX composite-proc - refer-glyph [MangleName 'blackCircle'] + refer-glyph [MangleName 'blackCircleO'] Ungizmo ScaleAround Geom.MidX Geom.MidY 0.625 (1 - 0.5 * GeometryStroke / Geom.Size) Translate (-GeometryStroke * HVContrast) 0 @@ -275,14 +281,14 @@ glyph-block Symbol-Geometric-Masked : for-width-kinds WideWidth1 set-width Geom.Width include : refer-glyph [MangleName 'whiteCircle'] include : intersection - refer-glyph [MangleName 'blackCircle'] + refer-glyph [MangleName 'blackCircleO'] WaxingMoonMask create-glyph [MangleName 'waxingGibbousMoon'] [MangleUnicode 0x1F314] : glyph-proc set-width Geom.Width include : refer-glyph [MangleName 'whiteCircle'] include : difference - refer-glyph [MangleName 'blackCircle'] + refer-glyph [MangleName 'blackCircleO'] composite-proc WaxingMoonMask FlipAround Geom.MidX Geom.MidY @@ -291,14 +297,14 @@ glyph-block Symbol-Geometric-Masked : for-width-kinds WideWidth1 set-width Geom.Width include : refer-glyph [MangleName 'whiteCircle'] include : difference - refer-glyph [MangleName 'blackCircle'] + refer-glyph [MangleName 'blackCircleO'] WaxingMoonMask create-glyph [MangleName 'waningCrescentMoon'] [MangleUnicode 0x1F318] : glyph-proc set-width Geom.Width include : refer-glyph [MangleName 'whiteCircle'] include : intersection - refer-glyph [MangleName 'blackCircle'] + refer-glyph [MangleName 'blackCircleO'] composite-proc WaxingMoonMask FlipAround Geom.MidX Geom.MidY diff --git a/font-src/glyphs/symbol/geometric/plain.ptl b/font-src/glyphs/symbol/geometric/plain.ptl index 4d357f5ce..968854729 100644 --- a/font-src/glyphs/symbol/geometric/plain.ptl +++ b/font-src/glyphs/symbol/geometric/plain.ptl @@ -409,7 +409,7 @@ glyph-block Symbol-Geometric-Plain : for-width-kinds WideWidth1 define rs : Geom.TallSize / (sizeOrig * 1.5) return : CircleShape cx cy (sizeOrig * rs - sw) - StdBlackShape CircleShape 'blackCircleO' null + StdBlackShape CircleShape 'blackCircleO' null {.size 0.995} StdBlackShape CircleShape 'blackCircle' 0x25CF StdWhiteShape CircleShape 'whiteCircle' 0x25CB