diff --git a/CHANGELOG.md b/CHANGELOG.md index 7efafe587..b2ffb44c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,30 @@ ## Modifications since last major version +### 29.0.5 + +* Fix side bearings of multi-dot punctuation (`U+10FB`, `U+2056`, `U+2058`..`205B`, `U+2E2A`..`U+2E2D`) under Quasi-Proportional. +* Fix mapping of DENSE VERTICAL FILL (`U+1CC44`) and DENSE HORIZONTAL FILL (`U+1CC45`). +* Fix glyph visuals: + - MATHEMATICAL RISING DIAGONAL (`U+27CB`). + - MATHEMATICAL FALLING DIAGONAL (`U+27CD`). + - CIRCLE WITH HORIZONTAL BAR (`U+29B5`). + - SOLIDUS WITH OVERBAR (`U+29F6`). + - SMALL VEE WITH UNDERBAR (`U+2A61`). +* Add characters: + - LOWER RIGHT CORNER WITH DOT (`U+27D3`). + - UPPER LEFT CORNER WITH DOT (`U+27D4`). + - UP-POINTING GO-KART (`U+1CC00`) ... VERTICAL RESISTOR SEGMENT (`U+1CC0A`) (Proposed for Unicode 16; L2/21-235). + - LEFT-POINTING DIODE (`U+1CC0E`) ... VERTICAL CAPACITOR (`U+1CC14`) (Proposed for Unicode 16; L2/21-235). + - LOGIC GATE INVERTED INPUTS (`U+1CC17`) ... LOGIC GATE BUFFER WITH INVERTED INPUT (`U+1CC1A`) (Proposed for Unicode 16; L2/21-235). + - LEFT-POINTING ENERGY WAVE (`U+1CC78`) ... DOWN-POINTING ENERGY WAVE (`U+1CC7B`) (Proposed for Unicode 16; L2/21-235). + - WHITE LOWER LEFT POINTER (`U+1CC86`) (Proposed for Unicode 16; L2/21-235). + - WHITE LOWER RIGHT POINTER (`U+1CC87`) (Proposed for Unicode 16; L2/21-235). + - TWO RINGS ALIGNED HORIZONTALLY (`U+1CC88`) (Proposed for Unicode 16; L2/21-235). + - LEFT-POINTING RACING CAR (`U+1CC97`) ... VERTICAL GO-KART (`U+1CC9D`) (Proposed for Unicode 16; L2/21-235). + - TOP LEFT BLACK LEFT-POINTING SMALL TRIANGLE (`U+1CE07`) (Proposed for Unicode 16; L2/21-235). +* Add APL form for WHITE DIAMOND (`U+25C7`). + + ### 29.0.4 * Make `U+2980` respond to `VSAM`. diff --git a/README.md b/README.md index f075a1c3c..b6cd74136 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ * Customizable install using Homebrew: see [robertgzr/homebrew-tap](https://github.com/robertgzr/homebrew-tap). * **Linux** * Arch Linux: Install one of the [ttc-iosevka packages](https://archlinux.org/packages/?q=ttc-iosevka). - * Ubuntu Linux: Install one of the [fonts-iosevka packages](http://phd-sid.ethz.ch/debian/fonts-iosevka/). + * Ubuntu Linux: Install one of the [fonts-iosevka packages](http://sid.ethz.ch/debian/fonts-iosevka/). * Void Linux: Install the font with `xbps-install font-iosevka`. * Fedora: Install the font(s) from [the COPR here](https://copr.fedorainfracloud.org/coprs/peterwu/iosevka/). Run `dnf search iosevka` to discover available fonts and `dnf install` to install the chosen one(s). * **FreeBSD**: The font can be installed with `pkg install iosevka`. diff --git a/changes/29.0.5.md b/changes/29.0.5.md new file mode 100644 index 000000000..eef0e8126 --- /dev/null +++ b/changes/29.0.5.md @@ -0,0 +1,21 @@ +* Fix side bearings of multi-dot punctuation (`U+10FB`, `U+2056`, `U+2058`..`205B`, `U+2E2A`..`U+2E2D`) under Quasi-Proportional. +* Fix mapping of DENSE VERTICAL FILL (`U+1CC44`) and DENSE HORIZONTAL FILL (`U+1CC45`). +* Fix glyph visuals: + - MATHEMATICAL RISING DIAGONAL (`U+27CB`). + - MATHEMATICAL FALLING DIAGONAL (`U+27CD`). + - CIRCLE WITH HORIZONTAL BAR (`U+29B5`). + - SOLIDUS WITH OVERBAR (`U+29F6`). + - SMALL VEE WITH UNDERBAR (`U+2A61`). +* Add characters: + - LOWER RIGHT CORNER WITH DOT (`U+27D3`). + - UPPER LEFT CORNER WITH DOT (`U+27D4`). + - UP-POINTING GO-KART (`U+1CC00`) ... VERTICAL RESISTOR SEGMENT (`U+1CC0A`) (Proposed for Unicode 16; L2/21-235). + - LEFT-POINTING DIODE (`U+1CC0E`) ... VERTICAL CAPACITOR (`U+1CC14`) (Proposed for Unicode 16; L2/21-235). + - LOGIC GATE INVERTED INPUTS (`U+1CC17`) ... LOGIC GATE BUFFER WITH INVERTED INPUT (`U+1CC1A`) (Proposed for Unicode 16; L2/21-235). + - LEFT-POINTING ENERGY WAVE (`U+1CC78`) ... DOWN-POINTING ENERGY WAVE (`U+1CC7B`) (Proposed for Unicode 16; L2/21-235). + - WHITE LOWER LEFT POINTER (`U+1CC86`) (Proposed for Unicode 16; L2/21-235). + - WHITE LOWER RIGHT POINTER (`U+1CC87`) (Proposed for Unicode 16; L2/21-235). + - TWO RINGS ALIGNED HORIZONTALLY (`U+1CC88`) (Proposed for Unicode 16; L2/21-235). + - LEFT-POINTING RACING CAR (`U+1CC97`) ... VERTICAL GO-KART (`U+1CC9D`) (Proposed for Unicode 16; L2/21-235). + - TOP LEFT BLACK LEFT-POINTING SMALL TRIANGLE (`U+1CE07`) (Proposed for Unicode 16; L2/21-235). +* Add APL form for WHITE DIAMOND (`U+25C7`). diff --git a/doc/PACKAGE-LIST.md b/doc/PACKAGE-LIST.md index ef7604ae7..e5d075d2f 100644 --- a/doc/PACKAGE-LIST.md +++ b/doc/PACKAGE-LIST.md @@ -1,7 +1,7 @@ -# Package list of Release 29.0.4 +# Package list of Release 29.0.5 ## Prebuilt Packages Iosevka provides a large variety of variants. Prebuilt variants are listed below. For all Monospace variants' packages, it will contain three _spacing variants_. You can either download the package containing all the spacing variants (recommended), or cherry-pick the variant with specific spacing. @@ -22,146 +22,146 @@ Iosevka provides various packaging formats, here is the list of them: - + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - + + - - + +
📦 IosevkaMonospace, DefaultSuper TTCTTC 
📦 IosevkaMonospace, DefaultSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ IosevkaDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka TermTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka FixedFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SlabMonospace, Slab-serifSuper TTCTTC 
    ├ IosevkaDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka TermTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka FixedFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SlabMonospace, Slab-serifSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SlabDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SlabTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SlabFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka CurlyMonospace, Curly StyleSuper TTCTTC 
    ├ Iosevka SlabDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SlabTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SlabFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka CurlyMonospace, Curly StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka CurlyDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term CurlyTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed CurlyFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka Curly SlabMonospace, Curly Style, Slab-serifSuper TTCTTC 
    ├ Iosevka CurlyDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term CurlyTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed CurlyFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka Curly SlabMonospace, Curly Style, Slab-serifSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka Curly SlabDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term Curly SlabTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed Curly SlabFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS01Monospace, Andale Mono StyleSuper TTCTTC 
    ├ Iosevka Curly SlabDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term Curly SlabTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed Curly SlabFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS01Monospace, Andale Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS01DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS01TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS01FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS02Monospace, Anonymous Pro StyleSuper TTCTTC 
    ├ Iosevka SS01DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS01TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS01FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS02Monospace, Anonymous Pro StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS02DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS02TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS02FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS03Monospace, Consolas StyleSuper TTCTTC 
    ├ Iosevka SS02DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS02TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS02FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS03Monospace, Consolas StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS03DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS03TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS03FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS04Monospace, Menlo StyleSuper TTCTTC 
    ├ Iosevka SS03DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS03TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS03FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS04Monospace, Menlo StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS04DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS04TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS04FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS05Monospace, Fira Mono StyleSuper TTCTTC 
    ├ Iosevka SS04DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS04TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS04FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS05Monospace, Fira Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS05DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS05TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS05FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS06Monospace, Liberation Mono StyleSuper TTCTTC 
    ├ Iosevka SS05DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS05TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS05FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS06Monospace, Liberation Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS06DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS06TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS06FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS07Monospace, Monaco StyleSuper TTCTTC 
    ├ Iosevka SS06DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS06TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS06FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS07Monospace, Monaco StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS07DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS07TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS07FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS08Monospace, Pragmata Pro StyleSuper TTCTTC 
    ├ Iosevka SS07DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS07TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS07FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS08Monospace, Pragmata Pro StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS08DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS08TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS08FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS09Monospace, Source Code Pro StyleSuper TTCTTC 
    ├ Iosevka SS08DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS08TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS08FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS09Monospace, Source Code Pro StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS09DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS09TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS09FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS10Monospace, Envy Code R StyleSuper TTCTTC 
    ├ Iosevka SS09DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS09TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS09FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS10Monospace, Envy Code R StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS10DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS10TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS10FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS11Monospace, X Windows Fixed StyleSuper TTCTTC 
    ├ Iosevka SS10DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS10TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS10FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS11Monospace, X Windows Fixed StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS11DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS11TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS11FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS12Monospace, Ubuntu Mono StyleSuper TTCTTC 
    ├ Iosevka SS11DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS11TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS11FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS12Monospace, Ubuntu Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS12DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS12TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS12FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS13Monospace, Lucida StyleSuper TTCTTC 
    ├ Iosevka SS12DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS12TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS12FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS13Monospace, Lucida StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS13DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS13TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS13FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS14Monospace, JetBrains Mono StyleSuper TTCTTC 
    ├ Iosevka SS13DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS13TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS13FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS14Monospace, JetBrains Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS14DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS14TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS14FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS15Monospace, IBM Plex Mono StyleSuper TTCTTC 
    ├ Iosevka SS14DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS14TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS14FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS15Monospace, IBM Plex Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS15DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS15TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS15FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS16Monospace, PT Mono StyleSuper TTCTTC 
    ├ Iosevka SS15DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS15TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS15FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS16Monospace, PT Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS16DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS16TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS16FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS17Monospace, Recursive Mono StyleSuper TTCTTC 
    ├ Iosevka SS16DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS16TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS16FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS17Monospace, Recursive Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS17DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS17TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS17FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS18Monospace, Input Mono StyleSuper TTCTTC 
    ├ Iosevka SS17DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS17TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS17FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS18Monospace, Input Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS18DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS18TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS18FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka SS18DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS18TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS18FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka AileQuasi-proportional, Sans-serif 
  └ Sub-packagesSpacingLigaturesDownloads
    └ Iosevka AileDefaultNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka AileDefaultNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka EtoileQuasi-proportional, Slab-serif 
  └ Sub-packagesSpacingLigaturesDownloads
    └ Iosevka EtoileDefaultNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka EtoileDefaultNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
diff --git a/doc/cv-influences.md b/doc/cv-influences.md index 499a85f67..0b0bc970a 100644 --- a/doc/cv-influences.md +++ b/doc/cv-influences.md @@ -385,7 +385,7 @@ - `cv96`: - \! (`U+0021`), ' (`U+0027`), , (`U+002C`), \. (`U+002E`), : (`U+003A`), ; (`U+003B`), ? (`U+003F`), \` (`U+0060`), ¡ (`U+00A1`), · (`U+00B7`), ¿ (`U+00BF`), ÷ (`U+00F7`), Ŀ (`U+013F`), ŀ (`U+0140`), ʼn (`U+0149`), ǃ (`U+01C3`), ʻ (`U+02BB`), ʼ (`U+02BC`), ʽ (`U+02BD`), ˮ (`U+02EE`), ˸ (`U+02F8`), ; (`U+037E`), · (`U+0387`), ჻ (`U+10FB`), ‘ (`U+2018`), ’ (`U+2019`), ‚ (`U+201A`), ‛ (`U+201B`), “ (`U+201C`), ” (`U+201D`), „ (`U+201E`), ‟ (`U+201F`), ․ (`U+2024`), ‥ (`U+2025`), … (`U+2026`), ‧ (`U+2027`), ※ (`U+203B`), ‼ (`U+203C`), ‽ (`U+203D`), ⁇ (`U+2047`), ⁈ (`U+2048`), ⁉ (`U+2049`), ⁏ (`U+204F`), ⁒ (`U+2052`), ⁖ (`U+2056`), ⁘ (`U+2058`), ⁙ (`U+2059`), ⁚ (`U+205A`), ⁛ (`U+205B`), ⁜ (`U+205C`), ⁝ (`U+205D`), ⁞ (`U+205E`), ∔ (`U+2214`), ∴ (`U+2234`), ∵ (`U+2235`), ∶ (`U+2236`), ∷ (`U+2237`), ∸ (`U+2238`), ∹ (`U+2239`), ∺ (`U+223A`), ∻ (`U+223B`), ≐ (`U+2250`), ≑ (`U+2251`), ≒ (`U+2252`), ≓ (`U+2253`), ≔ (`U+2254`), ≕ (`U+2255`), ≟ (`U+225F`), ⊍ (`U+228D`), ⊙ (`U+2299`), ⊡ (`U+22A1`), ⋅ (`U+22C5`), ⋇ (`U+22C7`), ⋖ (`U+22D6`), ⋗ (`U+22D7`), ⋮ (`U+22EE`), ⋯ (`U+22EF`), ⋰ (`U+22F0`), ⋱ (`U+22F1`), ⋵ (`U+22F5`), ⌹ (`U+2339`), ⍠ (`U+2360`), ⍪ (`U+236A`), ⍮ (`U+236E`), ⍰ (`U+2370`), ␦ (`U+2426`), ⒈ (`U+2488`), ⒉ (`U+2489`), ⒊ (`U+248A`), ⒋ (`U+248B`), ⒌ (`U+248C`), ⒍ (`U+248D`), ⒎ (`U+248E`), ⒏ (`U+248F`), ⒐ (`U+2490`), ⒑ (`U+2491`), ⒒ (`U+2492`), ⒓ (`U+2493`), ⒔ (`U+2494`), ⒕ (`U+2495`), ⒖ (`U+2496`), ⒗ (`U+2497`), ⒘ (`U+2498`), ⒙ (`U+2499`), ⒚ (`U+249A`), ⒛ (`U+249B`), ⦙ (`U+2999`), ⦼ (`U+29BC`), ⧴ (`U+29F4`), ⨀ (`U+2A00`), ⨒ (`U+2A12`), ⨓ (`U+2A13`), ⨔ (`U+2A14`), ⨕ (`U+2A15`), ⨥ (`U+2A25`), ⨪ (`U+2A2A`), ⨫ (`U+2A2B`), ⨬ (`U+2A2C`), ⨰ (`U+2A30`), ⨸ (`U+2A38`), ⩀ (`U+2A40`), ⩦ (`U+2A66`), ⩧ (`U+2A67`), ⩪ (`U+2A6A`), ⩫ (`U+2A6B`), ⩭ (`U+2A6D`), ⩿ (`U+2A7F`), ⪀ (`U+2A80`), ⪗ (`U+2A97`), ⪘ (`U+2A98`), ⪽ (`U+2ABD`), ⪾ (`U+2ABE`), ⫶ (`U+2AF6`), ⸘ (`U+2E18`), ⸞ (`U+2E1E`), ⸟ (`U+2E1F`), ⸪ (`U+2E2A`), ⸫ (`U+2E2B`), ⸬ (`U+2E2C`), ⸭ (`U+2E2D`), ⸮ (`U+2E2E`), ⸱ (`U+2E31`), ⸲ (`U+2E32`), ⸳ (`U+2E33`), ⸴ (`U+2E34`), ⸵ (`U+2E35`), ⹁ (`U+2E41`), ⹂ (`U+2E42`), ꜝ (`U+A71D`), ꜞ (`U+A71E`), ꜟ (`U+A71F`), ꞉ (`U+A789`), ꞏ (`U+A78F`), � (`U+FFFD`), 𐞹 (`U+107B9`), 𝼊 (`U+1DF0A`), 🄀 (`U+1F100`), 🄁 (`U+1F101`), 🄂 (`U+1F102`), 🄃 (`U+1F103`), 🄄 (`U+1F104`), 🄅 (`U+1F105`), 🄆 (`U+1F106`), 🄇 (`U+1F107`), 🄈 (`U+1F108`), 🄉 (`U+1F109`), 🄊 (`U+1F10A`), 🆙 (`U+1F199`), 🆠 (`U+1F1A0`), 🆡 (`U+1F1A1`), 🆢 (`U+1F1A2`), 🯄 (`U+1FBC4`) + \! (`U+0021`), ' (`U+0027`), , (`U+002C`), \. (`U+002E`), : (`U+003A`), ; (`U+003B`), ? (`U+003F`), \` (`U+0060`), ¡ (`U+00A1`), · (`U+00B7`), ¿ (`U+00BF`), ÷ (`U+00F7`), Ŀ (`U+013F`), ŀ (`U+0140`), ʼn (`U+0149`), ǃ (`U+01C3`), ʻ (`U+02BB`), ʼ (`U+02BC`), ʽ (`U+02BD`), ˮ (`U+02EE`), ˸ (`U+02F8`), ; (`U+037E`), · (`U+0387`), ჻ (`U+10FB`), ‘ (`U+2018`), ’ (`U+2019`), ‚ (`U+201A`), ‛ (`U+201B`), “ (`U+201C`), ” (`U+201D`), „ (`U+201E`), ‟ (`U+201F`), ․ (`U+2024`), ‥ (`U+2025`), … (`U+2026`), ‧ (`U+2027`), ※ (`U+203B`), ‼ (`U+203C`), ‽ (`U+203D`), ⁇ (`U+2047`), ⁈ (`U+2048`), ⁉ (`U+2049`), ⁏ (`U+204F`), ⁒ (`U+2052`), ⁖ (`U+2056`), ⁘ (`U+2058`), ⁙ (`U+2059`), ⁚ (`U+205A`), ⁛ (`U+205B`), ⁜ (`U+205C`), ⁝ (`U+205D`), ⁞ (`U+205E`), ∔ (`U+2214`), ∴ (`U+2234`), ∵ (`U+2235`), ∶ (`U+2236`), ∷ (`U+2237`), ∸ (`U+2238`), ∹ (`U+2239`), ∺ (`U+223A`), ∻ (`U+223B`), ≐ (`U+2250`), ≑ (`U+2251`), ≒ (`U+2252`), ≓ (`U+2253`), ≔ (`U+2254`), ≕ (`U+2255`), ≟ (`U+225F`), ⊍ (`U+228D`), ⊙ (`U+2299`), ⊡ (`U+22A1`), ⋅ (`U+22C5`), ⋇ (`U+22C7`), ⋖ (`U+22D6`), ⋗ (`U+22D7`), ⋮ (`U+22EE`), ⋯ (`U+22EF`), ⋰ (`U+22F0`), ⋱ (`U+22F1`), ⋵ (`U+22F5`), ⌹ (`U+2339`), ⍠ (`U+2360`), ⍪ (`U+236A`), ⍮ (`U+236E`), ⍰ (`U+2370`), ␦ (`U+2426`), ⒈ (`U+2488`), ⒉ (`U+2489`), ⒊ (`U+248A`), ⒋ (`U+248B`), ⒌ (`U+248C`), ⒍ (`U+248D`), ⒎ (`U+248E`), ⒏ (`U+248F`), ⒐ (`U+2490`), ⒑ (`U+2491`), ⒒ (`U+2492`), ⒓ (`U+2493`), ⒔ (`U+2494`), ⒕ (`U+2495`), ⒖ (`U+2496`), ⒗ (`U+2497`), ⒘ (`U+2498`), ⒙ (`U+2499`), ⒚ (`U+249A`), ⒛ (`U+249B`), ⟓ (`U+27D3`), ⟔ (`U+27D4`), ⦙ (`U+2999`), ⦼ (`U+29BC`), ⧴ (`U+29F4`), ⨀ (`U+2A00`), ⨒ (`U+2A12`), ⨓ (`U+2A13`), ⨔ (`U+2A14`), ⨕ (`U+2A15`), ⨥ (`U+2A25`), ⨪ (`U+2A2A`), ⨫ (`U+2A2B`), ⨬ (`U+2A2C`), ⨰ (`U+2A30`), ⨸ (`U+2A38`), ⩀ (`U+2A40`), ⩦ (`U+2A66`), ⩧ (`U+2A67`), ⩪ (`U+2A6A`), ⩫ (`U+2A6B`), ⩭ (`U+2A6D`), ⩿ (`U+2A7F`), ⪀ (`U+2A80`), ⪗ (`U+2A97`), ⪘ (`U+2A98`), ⪽ (`U+2ABD`), ⪾ (`U+2ABE`), ⫶ (`U+2AF6`), ⸘ (`U+2E18`), ⸞ (`U+2E1E`), ⸟ (`U+2E1F`), ⸪ (`U+2E2A`), ⸫ (`U+2E2B`), ⸬ (`U+2E2C`), ⸭ (`U+2E2D`), ⸮ (`U+2E2E`), ⸱ (`U+2E31`), ⸲ (`U+2E32`), ⸳ (`U+2E33`), ⸴ (`U+2E34`), ⸵ (`U+2E35`), ⹁ (`U+2E41`), ⹂ (`U+2E42`), ꜝ (`U+A71D`), ꜞ (`U+A71E`), ꜟ (`U+A71F`), ꞉ (`U+A789`), ꞏ (`U+A78F`), � (`U+FFFD`), 𐞹 (`U+107B9`), 𝼊 (`U+1DF0A`), 🄀 (`U+1F100`), 🄁 (`U+1F101`), 🄂 (`U+1F102`), 🄃 (`U+1F103`), 🄄 (`U+1F104`), 🄅 (`U+1F105`), 🄆 (`U+1F106`), 🄇 (`U+1F107`), 🄈 (`U+1F108`), 🄉 (`U+1F109`), 🄊 (`U+1F10A`), 🆙 (`U+1F199`), 🆠 (`U+1F1A0`), 🆡 (`U+1F1A1`), 🆢 (`U+1F1A2`), 🯄 (`U+1FBC4`) - `cv97`: @@ -848,7 +848,7 @@ - `cv96`: - \! (`U+0021`), ' (`U+0027`), , (`U+002C`), \. (`U+002E`), : (`U+003A`), ; (`U+003B`), ? (`U+003F`), \` (`U+0060`), ¡ (`U+00A1`), · (`U+00B7`), ¿ (`U+00BF`), ÷ (`U+00F7`), Ŀ (`U+013F`), ŀ (`U+0140`), ʼn (`U+0149`), ǃ (`U+01C3`), ʻ (`U+02BB`), ʼ (`U+02BC`), ʽ (`U+02BD`), ˮ (`U+02EE`), ˸ (`U+02F8`), ; (`U+037E`), · (`U+0387`), ჻ (`U+10FB`), ‘ (`U+2018`), ’ (`U+2019`), ‚ (`U+201A`), ‛ (`U+201B`), “ (`U+201C`), ” (`U+201D`), „ (`U+201E`), ‟ (`U+201F`), ․ (`U+2024`), ‥ (`U+2025`), … (`U+2026`), ‧ (`U+2027`), ※ (`U+203B`), ‼ (`U+203C`), ‽ (`U+203D`), ⁇ (`U+2047`), ⁈ (`U+2048`), ⁉ (`U+2049`), ⁏ (`U+204F`), ⁒ (`U+2052`), ⁖ (`U+2056`), ⁘ (`U+2058`), ⁙ (`U+2059`), ⁚ (`U+205A`), ⁛ (`U+205B`), ⁜ (`U+205C`), ⁝ (`U+205D`), ⁞ (`U+205E`), ∔ (`U+2214`), ∴ (`U+2234`), ∵ (`U+2235`), ∶ (`U+2236`), ∷ (`U+2237`), ∸ (`U+2238`), ∹ (`U+2239`), ∺ (`U+223A`), ∻ (`U+223B`), ≐ (`U+2250`), ≑ (`U+2251`), ≒ (`U+2252`), ≓ (`U+2253`), ≔ (`U+2254`), ≕ (`U+2255`), ≟ (`U+225F`), ⊍ (`U+228D`), ⊙ (`U+2299`), ⊡ (`U+22A1`), ⋅ (`U+22C5`), ⋇ (`U+22C7`), ⋖ (`U+22D6`), ⋗ (`U+22D7`), ⋮ (`U+22EE`), ⋯ (`U+22EF`), ⋰ (`U+22F0`), ⋱ (`U+22F1`), ⋵ (`U+22F5`), ⌹ (`U+2339`), ⍠ (`U+2360`), ⍪ (`U+236A`), ⍮ (`U+236E`), ⍰ (`U+2370`), ␦ (`U+2426`), ⒈ (`U+2488`), ⒉ (`U+2489`), ⒊ (`U+248A`), ⒋ (`U+248B`), ⒌ (`U+248C`), ⒍ (`U+248D`), ⒎ (`U+248E`), ⒏ (`U+248F`), ⒐ (`U+2490`), ⒑ (`U+2491`), ⒒ (`U+2492`), ⒓ (`U+2493`), ⒔ (`U+2494`), ⒕ (`U+2495`), ⒖ (`U+2496`), ⒗ (`U+2497`), ⒘ (`U+2498`), ⒙ (`U+2499`), ⒚ (`U+249A`), ⒛ (`U+249B`), ⦙ (`U+2999`), ⦼ (`U+29BC`), ⧴ (`U+29F4`), ⨀ (`U+2A00`), ⨒ (`U+2A12`), ⨓ (`U+2A13`), ⨔ (`U+2A14`), ⨕ (`U+2A15`), ⨥ (`U+2A25`), ⨪ (`U+2A2A`), ⨫ (`U+2A2B`), ⨬ (`U+2A2C`), ⨰ (`U+2A30`), ⨸ (`U+2A38`), ⩀ (`U+2A40`), ⩦ (`U+2A66`), ⩧ (`U+2A67`), ⩪ (`U+2A6A`), ⩫ (`U+2A6B`), ⩭ (`U+2A6D`), ⩿ (`U+2A7F`), ⪀ (`U+2A80`), ⪗ (`U+2A97`), ⪘ (`U+2A98`), ⪽ (`U+2ABD`), ⪾ (`U+2ABE`), ⫶ (`U+2AF6`), ⸘ (`U+2E18`), ⸞ (`U+2E1E`), ⸟ (`U+2E1F`), ⸪ (`U+2E2A`), ⸫ (`U+2E2B`), ⸬ (`U+2E2C`), ⸭ (`U+2E2D`), ⸮ (`U+2E2E`), ⸱ (`U+2E31`), ⸲ (`U+2E32`), ⸳ (`U+2E33`), ⸴ (`U+2E34`), ⸵ (`U+2E35`), ⹁ (`U+2E41`), ⹂ (`U+2E42`), ꜝ (`U+A71D`), ꜞ (`U+A71E`), ꜟ (`U+A71F`), ꞉ (`U+A789`), ꞏ (`U+A78F`), � (`U+FFFD`), 𐞹 (`U+107B9`), 𝼊 (`U+1DF0A`), 🄀 (`U+1F100`), 🄁 (`U+1F101`), 🄂 (`U+1F102`), 🄃 (`U+1F103`), 🄄 (`U+1F104`), 🄅 (`U+1F105`), 🄆 (`U+1F106`), 🄇 (`U+1F107`), 🄈 (`U+1F108`), 🄉 (`U+1F109`), 🄊 (`U+1F10A`), 🆙 (`U+1F199`), 🆠 (`U+1F1A0`), 🆡 (`U+1F1A1`), 🆢 (`U+1F1A2`), 🯄 (`U+1FBC4`) + \! (`U+0021`), ' (`U+0027`), , (`U+002C`), \. (`U+002E`), : (`U+003A`), ; (`U+003B`), ? (`U+003F`), \` (`U+0060`), ¡ (`U+00A1`), · (`U+00B7`), ¿ (`U+00BF`), ÷ (`U+00F7`), Ŀ (`U+013F`), ŀ (`U+0140`), ʼn (`U+0149`), ǃ (`U+01C3`), ʻ (`U+02BB`), ʼ (`U+02BC`), ʽ (`U+02BD`), ˮ (`U+02EE`), ˸ (`U+02F8`), ; (`U+037E`), · (`U+0387`), ჻ (`U+10FB`), ‘ (`U+2018`), ’ (`U+2019`), ‚ (`U+201A`), ‛ (`U+201B`), “ (`U+201C`), ” (`U+201D`), „ (`U+201E`), ‟ (`U+201F`), ․ (`U+2024`), ‥ (`U+2025`), … (`U+2026`), ‧ (`U+2027`), ※ (`U+203B`), ‼ (`U+203C`), ‽ (`U+203D`), ⁇ (`U+2047`), ⁈ (`U+2048`), ⁉ (`U+2049`), ⁏ (`U+204F`), ⁒ (`U+2052`), ⁖ (`U+2056`), ⁘ (`U+2058`), ⁙ (`U+2059`), ⁚ (`U+205A`), ⁛ (`U+205B`), ⁜ (`U+205C`), ⁝ (`U+205D`), ⁞ (`U+205E`), ∔ (`U+2214`), ∴ (`U+2234`), ∵ (`U+2235`), ∶ (`U+2236`), ∷ (`U+2237`), ∸ (`U+2238`), ∹ (`U+2239`), ∺ (`U+223A`), ∻ (`U+223B`), ≐ (`U+2250`), ≑ (`U+2251`), ≒ (`U+2252`), ≓ (`U+2253`), ≔ (`U+2254`), ≕ (`U+2255`), ≟ (`U+225F`), ⊍ (`U+228D`), ⊙ (`U+2299`), ⊡ (`U+22A1`), ⋅ (`U+22C5`), ⋇ (`U+22C7`), ⋖ (`U+22D6`), ⋗ (`U+22D7`), ⋮ (`U+22EE`), ⋯ (`U+22EF`), ⋰ (`U+22F0`), ⋱ (`U+22F1`), ⋵ (`U+22F5`), ⌹ (`U+2339`), ⍠ (`U+2360`), ⍪ (`U+236A`), ⍮ (`U+236E`), ⍰ (`U+2370`), ␦ (`U+2426`), ⒈ (`U+2488`), ⒉ (`U+2489`), ⒊ (`U+248A`), ⒋ (`U+248B`), ⒌ (`U+248C`), ⒍ (`U+248D`), ⒎ (`U+248E`), ⒏ (`U+248F`), ⒐ (`U+2490`), ⒑ (`U+2491`), ⒒ (`U+2492`), ⒓ (`U+2493`), ⒔ (`U+2494`), ⒕ (`U+2495`), ⒖ (`U+2496`), ⒗ (`U+2497`), ⒘ (`U+2498`), ⒙ (`U+2499`), ⒚ (`U+249A`), ⒛ (`U+249B`), ⟓ (`U+27D3`), ⟔ (`U+27D4`), ⦙ (`U+2999`), ⦼ (`U+29BC`), ⧴ (`U+29F4`), ⨀ (`U+2A00`), ⨒ (`U+2A12`), ⨓ (`U+2A13`), ⨔ (`U+2A14`), ⨕ (`U+2A15`), ⨥ (`U+2A25`), ⨪ (`U+2A2A`), ⨫ (`U+2A2B`), ⨬ (`U+2A2C`), ⨰ (`U+2A30`), ⨸ (`U+2A38`), ⩀ (`U+2A40`), ⩦ (`U+2A66`), ⩧ (`U+2A67`), ⩪ (`U+2A6A`), ⩫ (`U+2A6B`), ⩭ (`U+2A6D`), ⩿ (`U+2A7F`), ⪀ (`U+2A80`), ⪗ (`U+2A97`), ⪘ (`U+2A98`), ⪽ (`U+2ABD`), ⪾ (`U+2ABE`), ⫶ (`U+2AF6`), ⸘ (`U+2E18`), ⸞ (`U+2E1E`), ⸟ (`U+2E1F`), ⸪ (`U+2E2A`), ⸫ (`U+2E2B`), ⸬ (`U+2E2C`), ⸭ (`U+2E2D`), ⸮ (`U+2E2E`), ⸱ (`U+2E31`), ⸲ (`U+2E32`), ⸳ (`U+2E33`), ⸴ (`U+2E34`), ⸵ (`U+2E35`), ⹁ (`U+2E41`), ⹂ (`U+2E42`), ꜝ (`U+A71D`), ꜞ (`U+A71E`), ꜟ (`U+A71F`), ꞉ (`U+A789`), ꞏ (`U+A78F`), � (`U+FFFD`), 𐞹 (`U+107B9`), 𝼊 (`U+1DF0A`), 🄀 (`U+1F100`), 🄁 (`U+1F101`), 🄂 (`U+1F102`), 🄃 (`U+1F103`), 🄄 (`U+1F104`), 🄅 (`U+1F105`), 🄆 (`U+1F106`), 🄇 (`U+1F107`), 🄈 (`U+1F108`), 🄉 (`U+1F109`), 🄊 (`U+1F10A`), 🆙 (`U+1F199`), 🆠 (`U+1F1A0`), 🆡 (`U+1F1A1`), 🆢 (`U+1F1A2`), 🯄 (`U+1FBC4`) - `cv97`: diff --git a/images/button-release.dark.svg b/images/button-release.dark.svg index dea8f579b..4da25c061 100644 --- a/images/button-release.dark.svg +++ b/images/button-release.dark.svg @@ -10,7 +10,7 @@ - + @@ -22,7 +22,7 @@ - + diff --git a/images/button-release.light.svg b/images/button-release.light.svg index 881fa35a7..b1fc91fa7 100644 --- a/images/button-release.light.svg +++ b/images/button-release.light.svg @@ -10,7 +10,7 @@ - + @@ -22,7 +22,7 @@ - + diff --git a/images/cs-block-miscellaneous-mathematical-symbols-a.dark.svg b/images/cs-block-miscellaneous-mathematical-symbols-a.dark.svg index a51ede8e1..e85553098 100644 --- a/images/cs-block-miscellaneous-mathematical-symbols-a.dark.svg +++ b/images/cs-block-miscellaneous-mathematical-symbols-a.dark.svg @@ -22,20 +22,22 @@ - - + + - - - - - - - - - - - + + + + + + + + + + + + + @@ -233,13 +235,13 @@ - - + + - - + + @@ -279,7 +281,7 @@ - + @@ -294,7 +296,7 @@ - + @@ -314,7 +316,7 @@ - + @@ -339,35 +341,35 @@ - - - - - - - - - - - + - + - + + + + + + + + + + + @@ -379,12 +381,12 @@ - + - + \ No newline at end of file diff --git a/images/cs-block-miscellaneous-mathematical-symbols-a.light.svg b/images/cs-block-miscellaneous-mathematical-symbols-a.light.svg index 8625c9e14..9af1f965d 100644 --- a/images/cs-block-miscellaneous-mathematical-symbols-a.light.svg +++ b/images/cs-block-miscellaneous-mathematical-symbols-a.light.svg @@ -22,20 +22,22 @@ - - + + - - - - - - - - - - - + + + + + + + + + + + + + @@ -233,13 +235,13 @@ - - + + - - + + @@ -279,7 +281,7 @@ - + @@ -294,7 +296,7 @@ - + @@ -314,7 +316,7 @@ - + @@ -339,35 +341,35 @@ - - - - - - - - - - - + - + - + + + + + + + + + + + @@ -379,12 +381,12 @@ - + - + \ No newline at end of file diff --git a/images/cs-block-miscellaneous-mathematical-symbols-b.dark.svg b/images/cs-block-miscellaneous-mathematical-symbols-b.dark.svg index 162f93aec..fede71775 100644 --- a/images/cs-block-miscellaneous-mathematical-symbols-b.dark.svg +++ b/images/cs-block-miscellaneous-mathematical-symbols-b.dark.svg @@ -35,7 +35,7 @@ - + @@ -48,8 +48,8 @@ - - + + @@ -70,7 +70,7 @@ - + diff --git a/images/cs-block-miscellaneous-mathematical-symbols-b.light.svg b/images/cs-block-miscellaneous-mathematical-symbols-b.light.svg index 81862562f..500d75dcd 100644 --- a/images/cs-block-miscellaneous-mathematical-symbols-b.light.svg +++ b/images/cs-block-miscellaneous-mathematical-symbols-b.light.svg @@ -35,7 +35,7 @@ - + @@ -48,8 +48,8 @@ - - + + @@ -70,7 +70,7 @@ - + diff --git a/images/cs-block-supplemental-mathematical-operators.dark.svg b/images/cs-block-supplemental-mathematical-operators.dark.svg index 76d0e3e21..273f01c7b 100644 --- a/images/cs-block-supplemental-mathematical-operators.dark.svg +++ b/images/cs-block-supplemental-mathematical-operators.dark.svg @@ -61,7 +61,7 @@ - + diff --git a/images/cs-block-supplemental-mathematical-operators.light.svg b/images/cs-block-supplemental-mathematical-operators.light.svg index b21fdc6e7..6750047a3 100644 --- a/images/cs-block-supplemental-mathematical-operators.light.svg +++ b/images/cs-block-supplemental-mathematical-operators.light.svg @@ -61,7 +61,7 @@ - + diff --git a/images/cs-block-symbols-for-legacy-computing-supplement-proposed.dark.svg b/images/cs-block-symbols-for-legacy-computing-supplement-proposed.dark.svg index 0a92f0e09..26ce00fc4 100644 --- a/images/cs-block-symbols-for-legacy-computing-supplement-proposed.dark.svg +++ b/images/cs-block-symbols-for-legacy-computing-supplement-proposed.dark.svg @@ -19,521 +19,554 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -627,83 +660,83 @@ - + - - - - - - + - + - + - + - + - + - - + + - - + + - - + + + + + + + - + - + - + - - + + - - + + @@ -718,83 +751,83 @@ - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - + - + - + @@ -810,82 +843,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -901,82 +934,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -992,82 +1025,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1083,82 +1116,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1174,82 +1207,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1265,82 +1298,82 @@ - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - + - + - + - + @@ -1356,82 +1389,82 @@ - + - + - + - + - + - + - - + + - - + + - - + + - + - + - + - + - + - + - + @@ -1447,82 +1480,82 @@ - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + @@ -1538,82 +1571,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1629,82 +1662,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1720,82 +1753,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1811,82 +1844,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1902,82 +1935,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1993,82 +2026,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2084,82 +2117,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2175,82 +2208,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2266,82 +2299,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2357,82 +2390,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2448,82 +2481,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2539,82 +2572,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2630,82 +2663,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2721,82 +2754,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2812,82 +2845,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2903,82 +2936,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2994,82 +3027,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3085,82 +3118,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3176,82 +3209,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3267,82 +3300,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3358,82 +3391,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3449,82 +3482,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3540,82 +3573,82 @@ - + - + - - + + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + @@ -3631,82 +3664,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3722,82 +3755,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3813,82 +3846,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3904,82 +3937,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3995,82 +4028,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4086,82 +4119,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4177,82 +4210,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4268,82 +4301,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4359,82 +4392,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4450,82 +4483,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/images/cs-block-symbols-for-legacy-computing-supplement-proposed.light.svg b/images/cs-block-symbols-for-legacy-computing-supplement-proposed.light.svg index ec672a184..aa4744c9e 100644 --- a/images/cs-block-symbols-for-legacy-computing-supplement-proposed.light.svg +++ b/images/cs-block-symbols-for-legacy-computing-supplement-proposed.light.svg @@ -19,521 +19,554 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -627,83 +660,83 @@ - + - - - - - - + - + - + - + - + - + - - + + - - + + - - + + + + + + + - + - + - + - - + + - - + + @@ -718,83 +751,83 @@ - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - + - + - + @@ -810,82 +843,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -901,82 +934,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -992,82 +1025,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1083,82 +1116,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1174,82 +1207,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1265,82 +1298,82 @@ - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - + - + - + - + @@ -1356,82 +1389,82 @@ - + - + - + - + - + - + - - + + - - + + - - + + - + - + - + - + - + - + - + @@ -1447,82 +1480,82 @@ - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + @@ -1538,82 +1571,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1629,82 +1662,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1720,82 +1753,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1811,82 +1844,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1902,82 +1935,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1993,82 +2026,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2084,82 +2117,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2175,82 +2208,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2266,82 +2299,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2357,82 +2390,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2448,82 +2481,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2539,82 +2572,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2630,82 +2663,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2721,82 +2754,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2812,82 +2845,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2903,82 +2936,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2994,82 +3027,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3085,82 +3118,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3176,82 +3209,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3267,82 +3300,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3358,82 +3391,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3449,82 +3482,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3540,82 +3573,82 @@ - + - + - - + + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + @@ -3631,82 +3664,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3722,82 +3755,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3813,82 +3846,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3904,82 +3937,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3995,82 +4028,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4086,82 +4119,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4177,82 +4210,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4268,82 +4301,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4359,82 +4392,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -4450,82 +4483,82 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 79cde0026..f28b6f36f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@iosevka/monorepo", - "version": "29.0.4", + "version": "29.0.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@iosevka/monorepo", - "version": "29.0.4", + "version": "29.0.5", "workspaces": [ "packages/*", "tools/*" @@ -4310,16 +4310,16 @@ }, "packages/font": { "name": "@iosevka/font", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/font-glyphs": "29.0.4", - "@iosevka/font-otl": "29.0.4", - "@iosevka/geometry": "29.0.4", - "@iosevka/geometry-cache": "29.0.4", - "@iosevka/glyph": "29.0.4", - "@iosevka/param": "29.0.4", - "@iosevka/util": "29.0.4", + "@iosevka/font-glyphs": "29.0.5", + "@iosevka/font-otl": "29.0.5", + "@iosevka/geometry": "29.0.5", + "@iosevka/geometry-cache": "29.0.5", + "@iosevka/glyph": "29.0.5", + "@iosevka/param": "29.0.5", + "@iosevka/util": "29.0.5", "harfbuzzjs": "^0.3.4", "ot-builder": "^1.7.3", "semver": "^7.6.0" @@ -4327,100 +4327,100 @@ }, "packages/font-glyphs": { "name": "@iosevka/font-glyphs", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { - "@iosevka/font-kits": "29.0.4", - "@iosevka/geometry": "29.0.4", - "@iosevka/geometry-cache": "29.0.4", - "@iosevka/glyph": "29.0.4", - "@iosevka/util": "29.0.4", + "@iosevka/font-kits": "29.0.5", + "@iosevka/geometry": "29.0.5", + "@iosevka/geometry-cache": "29.0.5", + "@iosevka/glyph": "29.0.5", + "@iosevka/util": "29.0.5", "typo-geom": "^0.15.1" } }, "packages/font-kits": { "name": "@iosevka/font-kits", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { - "@iosevka/geometry": "29.0.4", - "@iosevka/glyph": "29.0.4", - "@iosevka/util": "29.0.4" + "@iosevka/geometry": "29.0.5", + "@iosevka/glyph": "29.0.5", + "@iosevka/util": "29.0.5" } }, "packages/font-otl": { "name": "@iosevka/font-otl", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { - "@iosevka/font-glyphs": "29.0.4", - "@iosevka/glyph": "29.0.4", + "@iosevka/font-glyphs": "29.0.5", + "@iosevka/glyph": "29.0.5", "toposort": "^2.0.2" } }, "packages/geometry": { "name": "@iosevka/geometry", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { - "@iosevka/util": "29.0.4", + "@iosevka/util": "29.0.5", "spiro": "^3.0.0", "typo-geom": "^0.15.1" } }, "packages/geometry-cache": { "name": "@iosevka/geometry-cache", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { - "@iosevka/geometry": "29.0.4", + "@iosevka/geometry": "29.0.5", "@msgpack/msgpack": "^2.8.0" } }, "packages/glyph": { "name": "@iosevka/glyph", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { - "@iosevka/geometry": "29.0.4" + "@iosevka/geometry": "29.0.5" } }, "packages/param": { "name": "@iosevka/param", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { - "@iosevka/util": "29.0.4" + "@iosevka/util": "29.0.5" } }, "packages/util": { "name": "@iosevka/util", - "version": "29.0.4" + "version": "29.0.5" }, "tools/amend-readme": { "name": "@iosevka/amend-readme", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/param": "29.0.4", + "@iosevka/param": "29.0.5", "@unicode/unicode-15.1.0": "^1.5.2" } }, "tools/data-export": { "name": "@iosevka/data-export", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/param": "29.0.4", + "@iosevka/param": "29.0.5", "@unicode/unicode-15.1.0": "^1.5.2", "cldr": "^7.5.0" } }, "tools/generate-samples": { "name": "@iosevka/generate-samples", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { - "@iosevka/data-export": "29.0.4" + "@iosevka/data-export": "29.0.5" } }, "tools/misc": { "name": "@iosevka/misc", - "version": "29.0.4", + "version": "29.0.5", "dependencies": { - "@iosevka/util": "29.0.4", + "@iosevka/util": "29.0.5", "semver": "^7.6.0", "wawoff2": "^2.0.1" } diff --git a/package.json b/package.json index 4c73d8434..f982a2a95 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/monorepo", - "version": "29.0.4", + "version": "29.0.5", "workspaces": [ "packages/*", "tools/*" diff --git a/packages/font-glyphs/package.json b/packages/font-glyphs/package.json index 72731d6f8..35ec043f4 100644 --- a/packages/font-glyphs/package.json +++ b/packages/font-glyphs/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/font-glyphs", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { ".": "./src/index.mjs", @@ -8,11 +8,11 @@ "./unicode-knowledge": "./src/meta/unicode-knowledge.mjs" }, "dependencies": { - "@iosevka/font-kits": "29.0.4", - "@iosevka/geometry": "29.0.4", - "@iosevka/geometry-cache": "29.0.4", - "@iosevka/glyph": "29.0.4", - "@iosevka/util": "29.0.4", + "@iosevka/font-kits": "29.0.5", + "@iosevka/geometry": "29.0.5", + "@iosevka/geometry-cache": "29.0.5", + "@iosevka/glyph": "29.0.5", + "@iosevka/util": "29.0.5", "typo-geom": "^0.15.1" } } diff --git a/packages/font-glyphs/src/auto-build/accents.ptl b/packages/font-glyphs/src/auto-build/accents.ptl index a5147cc46..d57cfa6db 100644 --- a/packages/font-glyphs/src/auto-build/accents.ptl +++ b/packages/font-glyphs/src/auto-build/accents.ptl @@ -130,20 +130,19 @@ glyph-block AutoBuild-Accents : begin local second : new Set local mapping : new Map - foreach { k1 m } [Object.entries uk] : begin - foreach { k2 v } [Object.entries m] : begin - local g1 : query-glyph k1 - local g2 : query-glyph k2 - local g3 : query-glyph v - if (g1 && g2 && g3) : begin - first.add g1 - second.add g2 + foreach { { k1 k2 } v } [items-of uk] : begin + local g1 : query-glyph k1 + local g2 : query-glyph k2 + local g3 : query-glyph v + if (g1 && g2 && g3) : begin + first.add g1 + second.add g2 - local mm : mapping.get g1 - if [not mm] : begin - set mm : new Map - mapping.set g1 mm - mm.set g2 g3 + local mm : mapping.get g1 + if [not mm] : begin + set mm : new Map + mapping.set g1 mm + mm.set g2 g3 define [matchFirst g] : first.has g define [matchSecond g] : second.has g diff --git a/packages/font-glyphs/src/letter/latin/upper-b.ptl b/packages/font-glyphs/src/letter/latin/upper-b.ptl index d4b3260e5..4757cad1b 100644 --- a/packages/font-glyphs/src/letter/latin/upper-b.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-b.ptl @@ -172,8 +172,8 @@ glyph-block Letter-Latin-Upper-B : begin include : body CAP [AdviceStroke2 2 3 CAP] ts false include : VBar.l SB Descender 0 if bs : begin - local fs : SerifFrame.fromDf [DivFrame 1] CAP Descender - include fs.lb.fullSide + local sf : SerifFrame.fromDf [DivFrame 1] CAP Descender + include sf.lb.fullSide select-variant 'B' 'B' link-reduced-variant 'B/sansSerif' 'B' MathSansSerif diff --git a/packages/font-glyphs/src/meta/unicode-knowledge.ptl b/packages/font-glyphs/src/meta/unicode-knowledge.ptl index 71cae193d..30bf7693d 100644 --- a/packages/font-glyphs/src/meta/unicode-knowledge.ptl +++ b/packages/font-glyphs/src/meta/unicode-knowledge.ptl @@ -24,18 +24,15 @@ export : define upperGrekMarkToTonosTf : object 'psiliPerispomeni' 'psiliPerispomeniGrekUpperTonos' 'dasiaPerispomeni' 'dasiaPerispomeniGrekUpperTonos' -export : define markCompositionTf : object - 'commaAbove' : object - 'graveAbove' 'psiliVaria' - 'acuteAbove' 'psiliOxia' - 'perispomeniAbove' 'psiliPerispomeni' - 'cyrlPokrytieAbove' 'commaCyrlPorkytieAbove' - 'revCommaAbove' : object - 'graveAbove' 'dasiaVaria' - 'acuteAbove' 'dasiaOxia' - 'perispomeniAbove' 'dasiaPerispomeni' - 'cyrlPsiliAbove' : object - 'cyrlPokrytieAbove' 'cyrlPsiliPokrytieAbove' +export : define markCompositionTf : list + list { 'commaAbove' 'graveAbove' } 'psiliVaria' + list { 'commaAbove' 'acuteAbove' } 'psiliOxia' + list { 'commaAbove' 'perispomeniAbove' } 'psiliPerispomeni' + list { 'commaAbove' 'cyrlPokrytieAbove' } 'commaCyrlPorkytieAbove' + list { 'revCommaAbove' 'graveAbove' } 'dasiaVaria' + list { 'revCommaAbove' 'acuteAbove' } 'dasiaOxia' + list { 'revCommaAbove' 'perispomeniAbove' } 'dasiaPerispomeni' + list { 'cyrlPsiliAbove' 'cyrlPokrytieAbove' } 'cyrlPsiliPokrytieAbove' export : define decompOverrides : object # Latvians use comma instead of cedillas in several letters. @@ -215,3 +212,110 @@ export : define decompOverrides : object 0x1DF0B { 'esh' 'dblBarOver' } 0x1DF0C { 'eshCurlyTail' 'dblBarOver' } + + +# List of non-canonical combinations but applicable for ccmp feature +export : define ccmpCombinations : list + ########## Data from L2/24-021 + + # Tilde overlays + list {0x004C 0x0334} 0x2C62 # L + list {0x0062 0x0334} 0x1D6C # b + list {0x0064 0x0334} 0x1D6D # d + list {0x0066 0x0334} 0x1D6E # f + list {0x006C 0x0334} 0x026B # l + list {0x006D 0x0334} 0x1D6F # m + list {0x006E 0x0334} 0x1D70 # n + list {0x0070 0x0334} 0x1D71 # p + list {0x0072 0x0334} 0x1D72 # r + list {0x0073 0x0334} 0x1D74 # s + list {0x0074 0x0334} 0x1D75 # t + list {0x007A 0x0334} 0x1D76 # z + list {0x0279 0x0334} 0xAB68 # ɹ + list {0x027E 0x0334} 0x1D73 # ɾ + list {0x02E1 0x0334} 0xAB5E # ˡ + + # Palatal hooks + list {0x0043 0x0321} 0xA7C4 # C + list {0x005A 0x0321} 0xA7C6 # Z + list {0x0062 0x0321} 0x1D80 # b + list {0x0063 0x0321} 0xA794 # c + list {0x0064 0x0321} 0x1D81 # d + list {0x0066 0x0321} 0x1D82 # f + list {0x0068 0x0321} 0xA795 # h + list {0x006B 0x0321} 0x1D84 # k + list {0x006C 0x0321} 0x1D85 # l + list {0x006D 0x0321} 0x1D86 # m + list {0x006E 0x0321} 0x1D87 # n + list {0x0070 0x0321} 0x1D88 # p + list {0x0072 0x0321} 0x1D89 # r + list {0x0073 0x0321} 0x1D8A # s + list {0x0074 0x0321} 0x01AB # t + list {0x0076 0x0321} 0x1D8C # v + list {0x0078 0x0321} 0x1D8D # x + list {0x007A 0x0321} 0x1D8E # z + list {0x014B 0x0321} 0x1DF14 # ŋ + list {0x0261 0x0321} 0x1D83 # ɡ + list {0x026C 0x0321} 0x1DF13 # ɬ + list {0x0279 0x0321} 0x1DF15 # ɹ + list {0x027E 0x0321} 0x1DF16 # ɾ + list {0x0283 0x0321} 0x1D8B # ʃ + list {0x0292 0x0321} 0x1DF18 # ʒ + list {0x02A4 0x0321} 0x1DF12 # ʤ + list {0x02A7 0x0321} 0x1DF17 # ʧ + list {0x02E1 0x0321} 0x1DAA # ˡ + list {0x1D57 0x0321} 0x1DB5 # ᵗ + + # Retroflex hooks + list {0x0052 0x0322} 0x2C64 # R + list {0x0054 0x0322} 0x01AE # T + list {0x0061 0x0322} 0x1D8F # a + list {0x0063 0x0322} 0x1DF1D # c + list {0x0064 0x0322} 0x0256 # d + list {0x0065 0x0322} 0x1D92 # e + list {0x0069 0x0322} 0x1D96 # i + list {0x006C 0x0322} 0x026D # l + list {0x006E 0x0322} 0x0273 # n + list {0x006F 0x0322} 0x1DF1B # o + list {0x0072 0x0322} 0x027D # r + list {0x0074 0x0322} 0x0288 # t + list {0x0075 0x0322} 0x1D99 # u + list {0x007A 0x0322} 0x0290 # z + list {0x01AD 0x0322} 0x1DF09 # ƭ + list {0x01C3 0x0322} 0x1DF0A # ǃ + list {0x0251 0x0322} 0x1D90 # ɑ + list {0x0254 0x0322} 0x1D97 # ɔ + list {0x0257 0x0322} 0x1D91 # ɗ + list {0x0259 0x0322} 0x1D95 # ə + list {0x025B 0x0322} 0x1D93 # ɛ + list {0x025C 0x0322} 0x1D94 # ɜ + list {0x0268 0x0322} 0x1DF1A # ɨ + list {0x026C 0x0322} 0xA78E # ɬ + list {0x026E 0x0322} 0x1DF05 # ɮ + list {0x027A 0x0322} 0x1DF08 # ɺ + list {0x0283 0x0322} 0x1D98 # ʃ + list {0x0292 0x0322} 0x1D9A # ʒ + list {0x02A3 0x0322} 0xAB66 # ʣ + list {0x02A4 0x0322} 0x1DF19 # ʤ + list {0x02A6 0x0322} 0xAB67 # ʦ + list {0x02A7 0x0322} 0x1DF1C # ʧ + list {0x02B3 0x0322} 0x107A8 # ʳ + list {0x02E1 0x0322} 0x1DA9 # ˡ + list {0x1D48 0x0322} 0x1078B # ᵈ + list {0x1D57 0x0322} 0x107AF # ᵗ + list {0x1DBB 0x0322} 0x1DBC # ᶻ + list {0x207F 0x0322} 0x1DAF # ⁿ + list {0x10787 0x0322} 0x10788 # 𐞇 + list {0x1078C 0x0322} 0x1078D # 𐞌 + list {0x1079B 0x0322} 0x1079D # 𐞛 + list {0x1079E 0x0322} 0x1079F # 𐞞 + list {0x107A6 0x0322} 0x107A7 # 𐞦 + list {0x107AC 0x0322} 0x107AD # 𐞬 + # Additional composites which cannot be inferred from L2/24-021 + list {0x0053 0x0322} 0xA7C5 # S + list {0x0073 0x0322} 0x0282 # s + list {0x0279 0x0322} 0x027B # ɹ + list {0x027F 0x0322} 0x0285 # ɿ + list {0x02AE 0x0322} 0x02AF # ʮ + list {0x02B4 0x0322} 0x02B5 # ʴ + list {0x02E2 0x0322} 0x1DB3 # ˢ diff --git a/packages/font-glyphs/src/symbol/math/apl.ptl b/packages/font-glyphs/src/symbol/math/apl.ptl index 5398134bd..13988bcbd 100644 --- a/packages/font-glyphs/src/symbol/math/apl.ptl +++ b/packages/font-glyphs/src/symbol/math/apl.ptl @@ -271,6 +271,7 @@ glyph-block Symbol-Math-APL : begin LinkAplFormForNwidWwid 'uni2687' # Uiua symbols + LinkAplFormForNwidWwid 'whiteDiamond' LinkAplFormForNwidWwid 'whiteSquare' LinkAplFormForNwidWwid 'whiteTriangleUp' LinkAplFormForNwidWwid 'whiteTriangleDown' diff --git a/packages/font-glyphs/src/symbol/math/arith.ptl b/packages/font-glyphs/src/symbol/math/arith.ptl index 2e60b883c..e5ca31804 100644 --- a/packages/font-glyphs/src/symbol/math/arith.ptl +++ b/packages/font-glyphs/src/symbol/math/arith.ptl @@ -415,12 +415,12 @@ glyph-block Symbol-Math-Arith : begin set-width MosaicWidth include : dispiro widths.center OperatorStroke - flat SB ParenBot - curl (MosaicWidth - SB) ParenTop + flat SB [mix SymbolMid PlusBot MosaicWidthScalar] + curl (MosaicWidth - SB) [mix SymbolMid PlusTop MosaicWidthScalar] create-glyph [MangleName 'fallingDiagonal'] [MangleUnicode 0x27CD] : glyph-proc set-width MosaicWidth include : dispiro widths.center OperatorStroke - flat SB ParenTop - curl (MosaicWidth - SB) ParenBot + flat SB [mix SymbolMid PlusTop MosaicWidthScalar] + curl (MosaicWidth - SB) [mix SymbolMid PlusBot MosaicWidthScalar] diff --git a/packages/font-glyphs/src/symbol/math/boxed.ptl b/packages/font-glyphs/src/symbol/math/boxed.ptl index bf4832197..624415c09 100644 --- a/packages/font-glyphs/src/symbol/math/boxed.ptl +++ b/packages/font-glyphs/src/symbol/math/boxed.ptl @@ -21,5 +21,5 @@ glyph-block Symbol-Math-Boxed : begin MakeMathBoxed 0x29C4 'innerMultiplyStroke1' MakeMathBoxed 0x29C5 'innerMultiplyStroke2' MakeMathBoxed 0x29C6 'opAsterisk' - MakeMathBoxed 0x29C7 'whiteSmallCircle.NWID' - MakeMathBoxed 0x29C8 'whiteSmallSquare.NWID' + MakeMathBoxed 0x29C7 'whiteVerySmallCircle.NWID' + MakeMathBoxed 0x29C8 'whiteVerySmallSquare.NWID' diff --git a/packages/font-glyphs/src/symbol/math/circled.ptl b/packages/font-glyphs/src/symbol/math/circled.ptl index 727b0bf87..d87c5a6f8 100644 --- a/packages/font-glyphs/src/symbol/math/circled.ptl +++ b/packages/font-glyphs/src/symbol/math/circled.ptl @@ -80,7 +80,7 @@ glyph-block Symbol-Math-Circled : begin HBar.m (SB + eqS) (RightSB - eqS) (SymbolMid + eqD) eqS HBar.m (SB + eqS) (RightSB - eqS) (SymbolMid - eqD) eqS - create-glyph 0x29B5 : composite-proc [refer-glyph 'mathO'] : HBar.m [mix SB 0 0.9] [mix RightSB Width 0.9] SymbolMid MathEnclosureSw + create-glyph 0x29B5 : composite-proc [refer-glyph 'mathO'] : HBar.m [mix Middle SB Math.SQRT2] [mix Middle RightSB Math.SQRT2] SymbolMid MathEnclosureSw create-glyph 0x29B7 : composite-proc [refer-glyph 'mathO'] : intersection refer-glyph 'mathOOutline' diff --git a/packages/font-glyphs/src/symbol/math/geometry.ptl b/packages/font-glyphs/src/symbol/math/geometry.ptl index e95f3c5c4..866863319 100644 --- a/packages/font-glyphs/src/symbol/math/geometry.ptl +++ b/packages/font-glyphs/src/symbol/math/geometry.ptl @@ -106,6 +106,13 @@ glyph-block Symbol-Math-Geometry : begin dispiro [widths.lhs GeometryStroke] [flat leftBox bottomBox] [curl rightBox bottomBox] dispiro [widths.rhs GeometryStroke] [flat rightBox topBox] [curl rightBox bottomBox] + WithDotVariants 'pullback' 0x27D3 : function [DrawAt kr ov] : glyph-proc + include [refer-glyph 'revRightAngle'] AS_BASE ALSO_METRICS + local offset : mix 0 GeometryStroke 0.5 + include : DrawAt (Middle - offset) (SymbolMid + offset) (DotRadius * kr * [AdviceStroke 4] / Stroke - ov) + + turned 'pushout' 0x27D4 'pullback' Middle SymbolMid + create-glyph 'sineWave' 0x223F : glyph-proc define N 64 local knots {} diff --git a/packages/font-glyphs/src/symbol/math/v-and-cup.ptl b/packages/font-glyphs/src/symbol/math/v-and-cup.ptl index f29679f96..51d6cac0a 100644 --- a/packages/font-glyphs/src/symbol/math/v-and-cup.ptl +++ b/packages/font-glyphs/src/symbol/math/v-and-cup.ptl @@ -119,7 +119,10 @@ glyph-block Symbol-Math-VAndCup : begin HBar.b SB RightSB (OperBot + EqualHalfSpace * 0.75) OperatorStroke WedgeShape OperTop (OperBot + OperatorStroke + EqualHalfSpace * 0.75 + gap) - alias 'veeUnderbar' 0x2A61 'math/logic/xor' + create-glyph 'smallVeeUnderbar' 0x2A61 : union + HBar.b SB RightSB 0 OperatorStroke + VeeShape PlusTop [Math.max PlusBot (0 + OperatorStroke * 1.5)] + turned 'math/logic/equalOr' 0x2A62 'math/logic/andEqual' Middle SymbolMid turned 'math/logic/orEqual' 0x2A63 'math/logic/equalAnd' Middle SymbolMid diff --git a/packages/font-glyphs/src/symbol/mosaic/block.ptl b/packages/font-glyphs/src/symbol/mosaic/block.ptl index 96ed0ba44..f9a8f598f 100644 --- a/packages/font-glyphs/src/symbol/mosaic/block.ptl +++ b/packages/font-glyphs/src/symbol/mosaic/block.ptl @@ -248,11 +248,11 @@ glyph-block Symbol-Mosaic-Block : begin set-width MosaicWidth include : DiagShade 4 include : DiagShade (-4) - create-glyph [MangleName 'denseHoriShade'] [MangleUnicode 0x1CC44] : glyph-proc - set-width MosaicWidth - include : ForceUpright - include : HShade 8 top bottom left right - create-glyph [MangleName 'denseVertShade'] [MangleUnicode 0x1CC45] : glyph-proc + create-glyph [MangleName 'denseVertShade'] [MangleUnicode 0x1CC44] : glyph-proc set-width MosaicWidth include : ForceUpright include : VShade (4 * MosaicWidthScalar) top bottom left right + create-glyph [MangleName 'denseHoriShade'] [MangleUnicode 0x1CC45] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : HShade 8 top bottom left right diff --git a/packages/font-glyphs/src/symbol/pictograph.ptl b/packages/font-glyphs/src/symbol/pictograph.ptl index edc3de21c..d11e45081 100644 --- a/packages/font-glyphs/src/symbol/pictograph.ptl +++ b/packages/font-glyphs/src/symbol/pictograph.ptl @@ -19,6 +19,7 @@ export : define [apply] : begin run-glyph-module "./pictograph/metric-marks.mjs" run-glyph-module "./pictograph/musical.mjs" run-glyph-module "./pictograph/powerline-and-gui.mjs" + run-glyph-module "./pictograph/schematic.mjs" run-glyph-module "./pictograph/stick-figure.mjs" run-glyph-module "./pictograph/suit.mjs" run-glyph-module "./pictograph/telephone-recorder.mjs" diff --git a/packages/font-glyphs/src/symbol/pictograph/game-sprite.ptl b/packages/font-glyphs/src/symbol/pictograph/game-sprite.ptl index 210f741ef..a2991da41 100644 --- a/packages/font-glyphs/src/symbol/pictograph/game-sprite.ptl +++ b/packages/font-glyphs/src/symbol/pictograph/game-sprite.ptl @@ -2,12 +2,14 @@ $$include '../../meta/macros.ptl' import [mix linreg clamp fallback] from "@iosevka/util" import [Box] from "@iosevka/geometry/box" +import [Transform] from "@iosevka/geometry/transform" glyph-module glyph-block Symbol-Pictograph-Game-Sprite : for-width-kinds WideWidth4 glyph-block-import CommonShapes glyph-block-import Common-Derivatives + glyph-block-import Shared-Symbol-Shapes : TriangleShape glyph-block-import Symbol-Pictograph-Stick-Figure : StickFigureKit WithD4Transform D4Transform glyph-block-import Symbol-Geometric-Shared : GeometricDim glyph-block-import Symbol-Mosaic-Block : HShade VShade @@ -26,7 +28,10 @@ glyph-block Symbol-Pictograph-Game-Sprite : for-width-kinds WideWidth4 define uiRight : right - SB define Geom : GeometricDim MosaicUnitWidth MosaicWidth + define graphicSw : AdviceStroke 3.5 + define smallGraphicSw : AdviceStroke 3.5 : Math.sqrt (MosaicWidthScalar / 2) + define squareBox : new Box Geom.Top Geom.Bot Geom.Left Geom.Right define [SidewaysBox top bottom left right _left2 _right2] : begin local left2 : fallback _left2 left local right2 : fallback _right2 right @@ -40,6 +45,69 @@ glyph-block Symbol-Pictograph-Game-Sprite : for-width-kinds WideWidth4 midX - newHeight / 2 midX + newHeight / 2 + do "Top-down Vehicles" + define scaffold : object + set scaffold.xWheelFront : 1.5 / 9 + set scaffold.xWheel : 1 / 9 + set scaffold.xWheelRear : 0.5 / 9 + set scaffold.wheelDiam : 3 / 9 + set scaffold.yAxle : scaffold.wheelDiam / 2 + + define [Car box fJut fWindow fSymmetric rot bodyWidth _sw] : glyph-proc + local yBody : if fJut 0 scaffold.yAxle + local xFront : if fSymmetric scaffold.xWheel scaffold.xWheelFront + local xRear : if fSymmetric scaffold.xWheel scaffold.xWheelRear + + local sw : fallback _sw smallGraphicSw + local tfm : D4Transform midX rot 0 + local Kit : StickFigureKit box tfm sw + local Kit2 : if [not fSymmetric] Kit : StickFigureKit box tfm (sw * 2) + + local shape : union + Kit2.RoundSeg xFront 1 xFront (1 - scaffold.wheelDiam) + Kit.RoundSeg xFront (1 - scaffold.yAxle) (1 - xFront) (1 - scaffold.yAxle) + Kit2.RoundSeg (1 - xFront) 1 (1 - xFront) (1 - scaffold.wheelDiam) + Kit2.RoundSeg xRear scaffold.wheelDiam xRear 0 + Kit.RoundSeg xRear (scaffold.yAxle) (1 - xRear) (scaffold.yAxle) + Kit2.RoundSeg (1 - xRear) scaffold.wheelDiam (1 - xRear) 0 + if (bodyWidth <= 0) + Kit.RoundSeg (1 / 2) (1 - yBody) (1 / 2) (yBody) + Kit.Box (1 / 2 - bodyWidth / 2) (1 - yBody) (1 / 2 + bodyWidth / 2) (yBody) + + if fWindow + include : difference shape + Kit.Box (1 / 2 - bodyWidth / 6) (1 - yBody - 1 / 9) (1 / 2 + bodyWidth / 6) (1 - yBody - 3 / 9) + include shape + + create-glyph [MangleName 'goKartUp'] [MangleUnicode 0x1CC00] : glyph-proc + set-width MosaicWidth + include : Car squareBox 0 0 0 0 0 + create-glyph [MangleName 'goKartRight'] [MangleUnicode 0x1CC01] : glyph-proc + set-width MosaicWidth + include : Car squareBox 0 0 0 3 0 + create-glyph [MangleName 'raceCarLeft'] [MangleUnicode 0x1CC97] : glyph-proc + set-width MosaicWidth + include : Car squareBox 1 1 1 1 (3 / 9) + create-glyph [MangleName 'raceCarUp'] [MangleUnicode 0x1CC98] : glyph-proc + set-width MosaicWidth + include : Car squareBox 1 1 1 0 (3 / 9) + create-glyph [MangleName 'raceCarRight'] [MangleUnicode 0x1CC99] : glyph-proc + set-width MosaicWidth + include : Car squareBox 1 1 1 3 (3 / 9) + create-glyph [MangleName 'raceCarDown'] [MangleUnicode 0x1CC9A] : glyph-proc + set-width MosaicWidth + include : Car squareBox 1 1 1 2 (3 / 9) + create-glyph [MangleName 'raceCarHori'] [MangleUnicode 0x1CC9B] : glyph-proc + set-width MosaicWidth + include : Car squareBox 1 0 1 1 (3 / 9) + create-glyph [MangleName 'raceCarVert'] [MangleUnicode 0x1CC9C] : glyph-proc + set-width MosaicWidth + include : Car squareBox 1 0 1 0 (3 / 9) + create-glyph [MangleName 'goKartVert'] [MangleUnicode 0x1CC9D] : glyph-proc + set-width MosaicWidth + include : Car squareBox 0 0 1 0 (3 / 9) + + do "Stick Man" define [StickManScaffold top bottom left right _sw] : begin local baseHeight : uiTop - uiBot @@ -51,7 +119,7 @@ glyph-block Symbol-Pictograph-Game-Sprite : for-width-kinds WideWidth4 bot bottom left left right right - stroke : fallback _sw : AdviceStroke 3.5 + stroke : fallback _sw graphicSw xMiddle : mix left right 0.5 yMiddle : mix top bottom 0.5 armRaiseK 0.4 @@ -101,31 +169,14 @@ glyph-block Symbol-Pictograph-Game-Sprite : for-width-kinds WideWidth4 define dressRight : scaffold.xRightFoot + scaffold.stroke / 2 include : StickManArms scaffold p kl kr include : VBar.m scaffold.xMiddle [scaffold.yShoulder p] scaffold.yNeck - include : intersection - spiro-outline - corner scaffold.xMiddle ([scaffold.yShoulder p] + scaffold.stroke) - corner dressRight dressBottom - corner dressLeft dressBottom - union - dispiro - widths.rhs scaffold.stroke - corner scaffold.xMiddle ([scaffold.yShoulder p] + scaffold.stroke) - corner dressRight dressBottom - dispiro - widths.rhs scaffold.stroke - corner dressRight dressBottom - corner dressLeft dressBottom - dispiro - widths.rhs scaffold.stroke - corner dressLeft dressBottom - corner scaffold.xMiddle ([scaffold.yShoulder p] + scaffold.stroke) + include : TriangleShape scaffold.xMiddle ([scaffold.yShoulder p] + scaffold.stroke) dressRight dressBottom dressLeft dressBottom scaffold.stroke include : VBar.m [mix dressLeft dressRight 0.3] scaffold.bot (dressBottom - O) scaffold.stroke include : VBar.m [mix dressLeft dressRight 0.7] scaffold.bot (dressBottom - O) scaffold.stroke define scaffold : StickManScaffold uiTop uiBot uiLeft uiRight define hBox : SidewaysBox uiTop uiBot uiLeft uiRight - define hScaffold : StickManScaffold hBox.top hBox.bottom hBox.left hBox.right [AdviceStroke 3.5 : Math.sqrt (MosaicWidthScalar / 2)] + define hScaffold : StickManScaffold hBox.top hBox.bottom hBox.left hBox.right smallGraphicSw create-glyph [MangleName 'stickMan'] [MangleUnicode 0x1FBC5] : glyph-proc set-width MosaicWidth @@ -152,6 +203,44 @@ glyph-block Symbol-Pictograph-Game-Sprite : for-width-kinds WideWidth4 set-width MosaicWidth include : StickManDressBody scaffold 0 0 + do "Energy Waves" + define [LeftEnergyWave top bottom left right] : glyph-proc + local midX : mix left right 0.5 + local midY : mix top bottom 0.5 + + include : difference + spiro-outline + corner right top + corner (midX + 0.01) top + flat midX top + archv.superness 2 + g4 left midY + arcvh.superness 2 + curl midX bottom + corner (midX + 0.01) bottom + corner right bottom + spiro-outline + corner right [mix top bottom 0.1] + flat [mix left right 0.9] [mix top bottom 0.1] + archv.superness 2 + g4 midX midY + arcvh.superness 2 + curl [mix left right 0.9] [mix top bottom 0.9] + corner right [mix top bottom 0.9] + + create-glyph [MangleName "energyWaveLeft"] [MangleUnicode 0x1CC78] : glyph-proc + set-width MosaicWidth + include : LeftEnergyWave Geom.Top Geom.Bot Geom.Left Geom.Right + create-glyph [MangleName "energyWaveUp"] [MangleUnicode 0x1CC79] : glyph-proc + set-width MosaicWidth + include : WithD4Transform midX 3 0 : lambda [] : LeftEnergyWave Geom.Top Geom.Bot Geom.Left Geom.Right + create-glyph [MangleName "energyWaveRight"] [MangleUnicode 0x1CC7A] : glyph-proc + set-width MosaicWidth + include : WithD4Transform midX 2 0 : lambda [] : LeftEnergyWave Geom.Top Geom.Bot Geom.Left Geom.Right + create-glyph [MangleName "energyWaveDown"] [MangleUnicode 0x1CC7B] : glyph-proc + set-width MosaicWidth + include : WithD4Transform midX 1 0 : lambda [] : LeftEnergyWave Geom.Top Geom.Bot Geom.Left Geom.Right + do "Square Spiral" define directions : list * {.dx 1 .dy 0 .heading Rightward} diff --git a/packages/font-glyphs/src/symbol/pictograph/powerline-and-gui.ptl b/packages/font-glyphs/src/symbol/pictograph/powerline-and-gui.ptl index fe0b8fcd0..d01577992 100644 --- a/packages/font-glyphs/src/symbol/pictograph/powerline-and-gui.ptl +++ b/packages/font-glyphs/src/symbol/pictograph/powerline-and-gui.ptl @@ -8,7 +8,9 @@ glyph-module glyph-block Symbol-Pictograph-Powerline-And-GUI : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives + glyph-block-import Shared-Symbol-Shapes : TriangleShape glyph-block-import Symbol-Pictograph-Stick-Figure : StickFigureKit PointingHandShape + glyph-block-import Symbol-Geometric-Shared : GeometricDim define uiFigTop : mix ParenBot ParenTop 0.95 define uiFigBot : mix ParenBot ParenTop 0.05 @@ -97,6 +99,8 @@ glyph-block Symbol-Pictograph-Powerline-And-GUI : begin frameRight - [HSwToV GeometryStroke] - [HSwToV progressBarGap] for-width-kinds WideWidth4 + define Geom : GeometricDim MosaicUnitWidth MosaicWidth + do "arrowheadShapedPointer" define scaffold : object set scaffold.top : mix uiFigBot uiFigTop 0.85 @@ -113,6 +117,22 @@ glyph-block Symbol-Pictograph-Powerline-And-GUI : begin corner [mix scaffold.xLeft scaffold.xRight (2 / 5)] [mix scaffold.bot scaffold.top (1 / 4)] corner scaffold.xLeft scaffold.bot + do "Pointer" + define pointerTop : mix uiFigBot uiFigTop (0.25 * MosaicWidthScalar) + define fineStroke : AdviceStroke 3.5 : Math.sqrt (MosaicWidthScalar / 2) + + create-glyph [MangleName "whiteLowerLeftPointer"] [MangleUnicode 0x1CC86] : glyph-proc + set-width MosaicWidth + include : TriangleShape SB uiFigBot SB pointerTop (MosaicWidth - SB) uiFigBot fineStroke + + create-glyph [MangleName "whiteLowerRightPointer"] [MangleUnicode 0x1CC87] : glyph-proc + set-width MosaicWidth + include : TriangleShape SB uiFigBot (MosaicWidth - SB) pointerTop (MosaicWidth - SB) uiFigBot fineStroke + + create-glyph [MangleName "topLeftBlackSmallTriangleLeft"] [MangleUnicode 0x1CE07] : glyph-proc + set-width MosaicWidth + include : with-transform [ApparentTranslate (-MosaicWidth / 4) ((CAP - Geom.MidY) * 0.3 + AccentStackOffset / 2)] : refer-glyph : MangleName 'blackSmallTriangleLeft' + do "Split graphics" define [BoxN n] : new Box uiFigTop uiFigBot SB (MosaicWidth * n - SB) diff --git a/packages/font-glyphs/src/symbol/pictograph/schematic.ptl b/packages/font-glyphs/src/symbol/pictograph/schematic.ptl new file mode 100644 index 000000000..02a772d02 --- /dev/null +++ b/packages/font-glyphs/src/symbol/pictograph/schematic.ptl @@ -0,0 +1,265 @@ +$$include '../../meta/macros.ptl' + +import [mix linreg clamp fallback] from "@iosevka/util" + +glyph-module + +glyph-block Symbol-Pictograph-Schematic : for-width-kinds WideWidth4 : begin + glyph-block-import CommonShapes + glyph-block-import Common-Derivatives + glyph-block-import Shared-Symbol-Shapes : TriangleShape + glyph-block-import Symbol-Geometric-Shared : GeometricDim + + define top fontMetrics.os2.sTypoAscender + define bottom fontMetrics.os2.sTypoDescender + define left 0 + define right MosaicWidth + + define midx : mix left right 0.5 + define midy : mix bottom top 0.5 + define MosaicHeight : top - bottom + + define Geom : GeometricDim MosaicUnitWidth MosaicWidth + + define boxDrawingStroke : AdviceStroke 3.5 + define fineStroke : AdviceStroke 3.5 : Math.sqrt (MosaicWidthScalar / 2) + define gateSize : MosaicHeight / 2 + define gateBot : midy - gateSize + define gateTop : midy + gateSize + define ringSize : Math.min (Geom.Size * 0.5) (MosaicWidth / 6) + define [InvertRingAt x y fMask] : [if fMask spiro-outline dispiro] + if fMask {} : list + widths.rhs fineStroke + g4 x (y - ringSize) + archv 32 2.0 + g4 (x - ringSize) y + arcvh 32 2.0 + g4 x (y + ringSize) + archv 32 2.0 + g4 (x + ringSize) y + arcvh 32 2.0 + close + + do "Explosion at Horizon" + define horizon : Geom.MidY - Geom.Size * 0.8 + create-glyph [MangleName 'explosionHorizon'] [MangleUnicode 0x1CE02] : glyph-proc + set-width MosaicWidth + include : HBar.m Geom.Left Geom.Right horizon boxDrawingStroke + include : dispiro + widths.center fineStroke + corner (Geom.MidX - Geom.Size * 0.8) (horizon + Geom.Size * 0.7) + corner (Geom.MidX - Geom.Size * 0.4) (horizon + Geom.Size * 0.3) + include : dispiro + widths.center fineStroke + corner (Geom.MidX + Geom.Size * 0.8) (horizon + Geom.Size * 0.7) + corner (Geom.MidX + Geom.Size * 0.4) (horizon + Geom.Size * 0.3) + include : dispiro + widths.center fineStroke + corner (Geom.MidX - Geom.Size * 0.4) (horizon + Geom.Size * 1.4) + corner (Geom.MidX - Geom.Size * 0.2) (horizon + Geom.Size * 0.4) + include : dispiro + widths.center fineStroke + corner (Geom.MidX + Geom.Size * 0.4) (horizon + Geom.Size * 1.4) + corner (Geom.MidX + Geom.Size * 0.2) (horizon + Geom.Size * 0.4) + + do "Funnel" + create-glyph [MangleName 'funnel'] [MangleUnicode 0x1CE08] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : TriangleShape Geom.Left Geom.Top Geom.Right Geom.Top Geom.MidX Geom.Bot boxDrawingStroke + include : VBar.m midx bottom (Geom.Bot + boxDrawingStroke * 2) boxDrawingStroke + + do "Antenna" + define rodLeft : Geom.Left + [HSwToV : boxDrawingStroke / 2] + define rodRight : Geom.Right - [HSwToV : boxDrawingStroke / 2] + define rodTop Geom.Top + create-glyph [MangleName 'antenna'] [MangleUnicode 0x1CC08] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : VBar.m midx bottom rodTop boxDrawingStroke + include : intersection + MaskBelow rodTop + union + dispiro + widths.center boxDrawingStroke + corner [mix midx rodLeft 2] [mix midy rodTop 2] + corner midx midy + dispiro + widths.center boxDrawingStroke + corner [mix midx rodRight 2] [mix midy rodTop 2] + corner midx midy + + do "Resistor" + define amplitude Geom.Size + define vWaves 2 + define hWaves MosaicWidthScalar + + define [HoriWaveSegment left right lefty righty sw] : intersection + MaskRight left + MaskLeft right + dispiro + widths.center sw + corner [mix left right (-1)] [mix lefty righty (-1)] + corner [mix left right 2 ] [mix lefty righty 2 ] + define [VertWaveSegment bot top botx topx sw] : intersection + MaskAbove bot + MaskBelow top + dispiro + widths.center sw + corner [mix botx topx (-1)] [mix bot top (-1)] + corner [mix botx topx 2 ] [mix bot top 2 ] + + create-glyph [MangleName 'resistorHori'] [MangleUnicode 0x1CC09] : glyph-proc + set-width MosaicWidth + include : ForceUpright + local segs : 2 * hWaves - 1 + local halfPeriod : MosaicWidth / (2 * hWaves) + local up : midy + amplitude + local down : midy - amplitude + include : HoriWaveSegment left (left + 0.5 * halfPeriod) midy up boxDrawingStroke + foreach [j : range 0 segs] : begin + include : HoriWaveSegment + left + (j + 0.5) * halfPeriod + left + (j + 1.5) * halfPeriod + if (j % 2) down up + if (j % 2) up down + * boxDrawingStroke + include : HoriWaveSegment (right - halfPeriod * 0.5) right down midy boxDrawingStroke + + create-glyph [MangleName 'resistorVert'] [MangleUnicode 0x1CC0A] : glyph-proc + set-width MosaicWidth + include : ForceUpright + local segs : 2 * vWaves - 1 + local halfPeriod : MosaicHeight / (2 * vWaves) + local up : midx + amplitude + local down : midx - amplitude + include : VertWaveSegment bottom (bottom + halfPeriod * 0.5) midx up boxDrawingStroke + foreach [j : range 0 segs] : begin + include : VertWaveSegment + bottom + (j + 0.5) * halfPeriod + bottom + (j + 1.5) * halfPeriod + if (j % 2) down up + if (j % 2) up down + * boxDrawingStroke + include : VertWaveSegment (top - halfPeriod * 0.5) top down midx boxDrawingStroke + + do "Diode" + define diodeGap : MosaicWidth / 9 + define diodeLeft : left + diodeGap + define diodeRight : right - diodeGap + + create-glyph [MangleName 'diodeLeft'] [MangleUnicode 0x1CC0E] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : HBar.m left diodeLeft midy boxDrawingStroke + include : HBar.m diodeRight right midy boxDrawingStroke + include : VBar.l diodeLeft gateBot gateTop boxDrawingStroke + include : TriangleShape diodeLeft midy diodeRight gateTop diodeRight gateBot boxDrawingStroke + + create-glyph [MangleName 'diodeRight'] [MangleUnicode 0x1CC0F] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : HBar.m left diodeLeft midy boxDrawingStroke + include : HBar.m diodeRight right midy boxDrawingStroke + include : VBar.r diodeRight gateBot gateTop boxDrawingStroke + include : TriangleShape diodeLeft gateBot diodeLeft gateTop diodeRight midy boxDrawingStroke + + do "Transistor" + local slope : MosaicHeight / MosaicWidth + local tipDx : Math.max (Geom.Size / 5) (boxDrawingStroke / slope) + local tipDy : tipDx * (-slope) + local baseDx : -tipDy / [Math.sqrt 3] * 2 + local baseDy : baseDx / (-slope) + define arrowPos : (1 - [HSwToV boxDrawingStroke] / (MosaicWidth / 2)) * 0.4 + + create-glyph [MangleName 'transistorPNP'] [MangleUnicode 0x1CC10] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : VBar.l left gateBot gateTop boxDrawingStroke + include : refer-glyph : MangleName : NameUni 0x1FBA4 + + local arrowCx : mix midx left arrowPos + local arrowCy : mix bottom midy arrowPos + include : spiro-outline + corner (arrowCx + tipDx) (arrowCy + tipDy) + corner (arrowCx - tipDx - baseDx) (arrowCy - tipDy + baseDy) + corner (arrowCx - tipDx + baseDx) (arrowCy - tipDy - baseDy) + + create-glyph [MangleName 'transistorNPN'] [MangleUnicode 0x1CC11] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : VBar.l left gateBot gateTop boxDrawingStroke + include : refer-glyph : MangleName : NameUni 0x1FBA4 + + local arrowCx : mix midx left arrowPos + local arrowCy : mix top midy arrowPos + include : spiro-outline + corner (arrowCx - tipDx) (arrowCy + tipDy) + corner (arrowCx + tipDx - baseDx) (arrowCy - tipDy - baseDy) + corner (arrowCx + tipDx + baseDx) (arrowCy - tipDy + baseDy) + + do "Receptacle" + create-glyph [MangleName 'receptacle'] [MangleUnicode 0x1CC12] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : refer-glyph : MangleName : NameUni 0x1FBDB + include : refer-glyph : MangleName : NameUni 0x2576 + + do "Capacitor" + define capacitorSize Geom.Size + define capacitorGap : Geom.Size / 4 + + create-glyph [MangleName 'capacitorHori'] [MangleUnicode 0x1CC13] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : HBar.m left (midx - capacitorGap) midy boxDrawingStroke + include : VBar.r (midx - capacitorGap) (midy - capacitorSize) (midy + capacitorSize) boxDrawingStroke + include : VBar.l (midx + capacitorGap) (midy - capacitorSize) (midy + capacitorSize) boxDrawingStroke + include : HBar.m (midx + capacitorGap) right midy boxDrawingStroke + + create-glyph [MangleName 'capacitorVert'] [MangleUnicode 0x1CC14] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : VBar.m midx bottom (midy - capacitorGap) boxDrawingStroke + include : HBar.t (midx - capacitorSize) (midx + capacitorSize) (midy - capacitorGap) boxDrawingStroke + include : HBar.b (midx - capacitorSize) (midx + capacitorSize) (midy + capacitorGap) boxDrawingStroke + include : VBar.m midx (midy + capacitorGap) top boxDrawingStroke + + do "Rings" + create-glyph [MangleName 'twoRings'] [MangleUnicode 0x1CC88] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : InvertRingAt (left + ringSize) midy + include : InvertRingAt (right - ringSize) midy + + create-glyph [MangleName 'invertedInputs'] [MangleUnicode 0x1CC17] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : InvertRingAt (right - ringSize) (top - ringSize) + include : InvertRingAt (right - ringSize) (bottom + ringSize) + include : difference + HBar.t left (right - ringSize) top boxDrawingStroke + InvertRingAt (right - ringSize) (top - ringSize) 1 + include : difference + HBar.b left (right - ringSize) bottom boxDrawingStroke + InvertRingAt (right - ringSize) (bottom + ringSize) 1 + + create-glyph [MangleName 'invertedOutput'] [MangleUnicode 0x1CC18] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : InvertRingAt (left + ringSize) midy + include : HBar.m (left + ringSize * 2 - fineStroke / 2) right midy boxDrawingStroke + + do "Buffer" + create-glyph [MangleName 'bufferGate'] [MangleUnicode 0x1CC19] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : HBar.m left midx midy boxDrawingStroke + include : TriangleShape midx bottom midx top right midy boxDrawingStroke + + create-glyph [MangleName 'invertedBufferGate'] [MangleUnicode 0x1CC1A] : glyph-proc + set-width MosaicWidth + include : ForceUpright + include : HBar.m left (midx - ringSize * 2 + fineStroke / 2) midy boxDrawingStroke + include : InvertRingAt (midx - ringSize) midy + include : TriangleShape midx bottom midx top right midy boxDrawingStroke diff --git a/packages/font-glyphs/src/symbol/punctuation/slashes-and-number-sign.ptl b/packages/font-glyphs/src/symbol/punctuation/slashes-and-number-sign.ptl index 4c38138e7..e5545b53b 100644 --- a/packages/font-glyphs/src/symbol/punctuation/slashes-and-number-sign.ptl +++ b/packages/font-glyphs/src/symbol/punctuation/slashes-and-number-sign.ptl @@ -72,7 +72,7 @@ glyph-block Symbol-Punctuation-Slashes-And-Number-Sign : begin create-glyph 'slashOverbar' 0x29F6 : glyph-proc include : refer-glyph "slash" - include : HBar.t (Middle - markExtend) (Middle + markExtend) (ParenTop + AccentClearance) markStroke + include : HBar.m (Middle - markExtend) (Middle + markExtend) (ParenTop + AccentClearance) markStroke create-glyph 'backslashBar' 0x29F7 : glyph-proc include : refer-glyph "backslash" diff --git a/packages/font-glyphs/src/symbol/punctuation/small.ptl b/packages/font-glyphs/src/symbol/punctuation/small.ptl index 31dfe1356..ae9ac91ef 100644 --- a/packages/font-glyphs/src/symbol/punctuation/small.ptl +++ b/packages/font-glyphs/src/symbol/punctuation/small.ptl @@ -25,21 +25,11 @@ glyph-block Symbol-Punctuation-Small : begin local df : include : DivFrame para.diversityF include : DrawAt df.middle (CAP - PeriodRadius * kDotRadius) (PeriodRadius * kDotRadius - overshoot) - create-glyph "smallPeriod.\(suffix)" : glyph-proc - local df : include : DivFrame para.diversityF - include : DrawAt df.middle (DotRadius * kDotRadius) (DotRadius * kDotRadius - overshoot) - create-glyph "halfXhSmallPeriod.\(suffix)" : glyph-proc - local df : include : DivFrame para.diversityF - include : DrawAt df.middle (XH / 2) (DotRadius * kDotRadius - overshoot) - create-glyph "halfCapSmallPeriod.\(suffix)" : glyph-proc - local df : include : DivFrame para.diversityF - include : DrawAt df.middle (CAP / 2) (DotRadius * kDotRadius - overshoot) - create-glyph "xhSmallPeriod.\(suffix)" : glyph-proc - local df : include : DivFrame para.diversityF - include : DrawAt df.middle (XH - DotRadius * kDotRadius) (DotRadius * kDotRadius - overshoot) - create-glyph "capSmallPeriod.\(suffix)" : glyph-proc - local df : include : DivFrame para.diversityF - include : DrawAt df.middle (CAP - DotRadius * kDotRadius) (DotRadius * kDotRadius - overshoot) + create-glyph "smallPeriod.\(suffix)" : DrawAt Middle (DotRadius * kDotRadius) (DotRadius * kDotRadius - overshoot) + create-glyph "halfXhSmallPeriod.\(suffix)" : DrawAt Middle (XH / 2) (DotRadius * kDotRadius - overshoot) + create-glyph "halfCapSmallPeriod.\(suffix)" : DrawAt Middle (CAP / 2) (DotRadius * kDotRadius - overshoot) + create-glyph "xhSmallPeriod.\(suffix)" : DrawAt Middle (XH - DotRadius * kDotRadius) (DotRadius * kDotRadius - overshoot) + create-glyph "capSmallPeriod.\(suffix)" : DrawAt Middle (CAP - DotRadius * kDotRadius) (DotRadius * kDotRadius - overshoot) select-variant 'period' '.' (follow -- 'punctuationDot') diff --git a/packages/font-glyphs/src/symbol/shared.ptl b/packages/font-glyphs/src/symbol/shared.ptl index 6a9e4c5d3..b46689fda 100644 --- a/packages/font-glyphs/src/symbol/shared.ptl +++ b/packages/font-glyphs/src/symbol/shared.ptl @@ -9,11 +9,11 @@ glyph-block Shared-Symbol-Shapes : begin glyph-block-import Common-Derivatives glyph-block-export CreateWaveShape - define [CreateWaveShape dist sw _phaesShift] : begin + define [CreateWaveShape dist sw _phaseShift] : begin define WaveResolution 256 define WaveMagnitude : dist * (3 / 4) - sw / 2 define WaveAdj : TanSlope * WaveMagnitude * (-0.75) - define phaseShift : fallback _phaesShift 0 + define phaseShift : fallback _phaseShift 0 define [WaveShapeImpl] : with-params [left right ts te xsJoin xfJoin diagJoinS diagJoinF] : glyph-proc local resolution : Math.ceil (WaveResolution * (te - ts)) local knots {} @@ -35,3 +35,26 @@ glyph-block Shared-Symbol-Shapes : begin define [WaveShape] : with-params [left right xsJoin xfJoin diagJoinS diagJoinF [waveCount 1] [unitWidth Width]] : WaveShapeImpl (unitWidth * -left) (unitWidth * (1 + right)) (-left * waveCount) ((1 + right) * waveCount) xsJoin xfJoin diagJoinS diagJoinF return WaveShape + + glyph-block-export TriangleShape + define [TriangleShape x1 y1 x2 y2 x3 y3 sw] : begin + local widthSide : if ((y2 - y1) * (y3 - y2) + (x2 - x1) * (x3 - x2) < 0) widths.rhs widths.lhs + + return : intersection + spiro-outline + corner x1 y1 + corner x2 y2 + corner x3 y3 + union + dispiro + widthSide sw + corner x1 y1 + corner x2 y2 + dispiro + widthSide sw + corner x2 y2 + corner x3 y3 + dispiro + widthSide sw + corner x3 y3 + corner x1 y1 diff --git a/packages/font-kits/package.json b/packages/font-kits/package.json index 8849f023d..ac25830df 100644 --- a/packages/font-kits/package.json +++ b/packages/font-kits/package.json @@ -1,14 +1,14 @@ { "name": "@iosevka/font-kits", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { "./boole-kit": "./src/boole-kit.mjs", "./spiro-kit": "./src/spiro-kit.mjs" }, "dependencies": { - "@iosevka/geometry": "29.0.4", - "@iosevka/glyph": "29.0.4", - "@iosevka/util": "29.0.4" + "@iosevka/geometry": "29.0.5", + "@iosevka/glyph": "29.0.5", + "@iosevka/util": "29.0.5" } } diff --git a/packages/font-otl/package.json b/packages/font-otl/package.json index 1913088a1..46b3ed04d 100644 --- a/packages/font-otl/package.json +++ b/packages/font-otl/package.json @@ -1,13 +1,13 @@ { "name": "@iosevka/font-otl", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { ".": "./src/index.mjs" }, "dependencies": { - "@iosevka/font-glyphs": "29.0.4", - "@iosevka/glyph": "29.0.4", + "@iosevka/font-glyphs": "29.0.5", + "@iosevka/glyph": "29.0.5", "toposort": "^2.0.2" } } diff --git a/packages/font-otl/src/gsub-ccmp.ptl b/packages/font-otl/src/gsub-ccmp.ptl index 11516598a..123cd8385 100644 --- a/packages/font-otl/src/gsub-ccmp.ptl +++ b/packages/font-otl/src/gsub-ccmp.ptl @@ -1,6 +1,6 @@ $$include './meta/macros.ptl' -import [UkMapToLookup UkMap2ToLookup] from "./table-util.mjs" +import [UkMapToLookup UkLigatureToLookup] from "./table-util.mjs" import [Dotless TieMark TieGlyph OgonekTrY IsSuperscript IsSubscript LeaningMark LeaningMarkSpacer] from "@iosevka/glyph/relation" import as UnicodeKnowledge from "@iosevka/font-glyphs/unicode-knowledge" @@ -33,6 +33,14 @@ export : define [buildCCMP gsub glyphStore markGlyphs] : begin gsub.endBlock rec + Ccmp-Group "Combining of overlay/hoked letters" : begin + define combineLookup : gsub.createLookup : object + .type 'gsub_ligature' + .substitutions : UkLigatureToLookup UnicodeKnowledge.ccmpCombinations + function u : glyphStore.queryNameByUnicode u + + export-lookup combineLookup + Ccmp-Group "Mark transforms" : begin define groupGrekUpperTonos {} @@ -67,7 +75,7 @@ export : define [buildCCMP gsub glyphStore markGlyphs] : begin export-lookup : gsub.createLookup : object .type 'gsub_ligature' - .substitutions : UkMap2ToLookup UnicodeKnowledge.markCompositionTf + .substitutions : UkLigatureToLookup UnicodeKnowledge.markCompositionTf [function n n] export-lookup : gsub.createLookup : object .type 'gsub_multiple' diff --git a/packages/font-otl/src/table-util.ptl b/packages/font-otl/src/table-util.ptl index 7a9a2c2d9..3ccdb0063 100644 --- a/packages/font-otl/src/table-util.ptl +++ b/packages/font-otl/src/table-util.ptl @@ -221,8 +221,25 @@ export : define [UkMapToLookup m] : begin r.push v return { .left l .right r } -export : define [UkMap2ToLookup mm] : begin - local res {} - foreach { g1 second } [Object.entries mm] : foreach { g2 gTo } [Object.entries second] : begin - res.push {.from {g1 g2} .to gTo} - return res +export : define [UkLigatureToLookup data mapper] : begin + local substitutions {} + foreach { from to } [items-of data] : begin + local allFound true + local fromGlyphNames {} + local toGlyph null + + foreach u [items-of from] : begin + local gn : mapper u + if gn + : then : fromGlyphNames.push gn + : else : set allFound false + + begin + local gn : mapper to + if gn + : then : set toGlyph gn + : else : set allFound false + + if allFound : substitutions.push {.from fromGlyphNames .to toGlyph} + + return substitutions diff --git a/packages/font/package.json b/packages/font/package.json index d8ccf5ce4..a12360d6e 100644 --- a/packages/font/package.json +++ b/packages/font/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/font", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { ".": "./src/index.mjs", @@ -10,13 +10,13 @@ }, "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/font-glyphs": "29.0.4", - "@iosevka/font-otl": "29.0.4", - "@iosevka/geometry": "29.0.4", - "@iosevka/geometry-cache": "29.0.4", - "@iosevka/glyph": "29.0.4", - "@iosevka/param": "29.0.4", - "@iosevka/util": "29.0.4", + "@iosevka/font-glyphs": "29.0.5", + "@iosevka/font-otl": "29.0.5", + "@iosevka/geometry": "29.0.5", + "@iosevka/geometry-cache": "29.0.5", + "@iosevka/glyph": "29.0.5", + "@iosevka/param": "29.0.5", + "@iosevka/util": "29.0.5", "harfbuzzjs": "^0.3.4", "ot-builder": "^1.7.3", "semver": "^7.6.0" diff --git a/packages/font/src/build-font/index.mjs b/packages/font/src/build-font/index.mjs new file mode 100644 index 000000000..a6caf3b7f --- /dev/null +++ b/packages/font/src/build-font/index.mjs @@ -0,0 +1,44 @@ +import { buildGlyphs } from "@iosevka/font-glyphs"; +import { copyFontMetrics } from "@iosevka/font-glyphs/aesthetics"; +import { buildOtl } from "@iosevka/font-otl"; + +import { cleanupGlyphStore } from "../cleanup/index.mjs"; +import { CreateEmptyFont } from "../font-io/index.mjs"; +import { buildCompatLigatures } from "../hb-compat-ligature/index.mjs"; +import { assignFontNames } from "../naming/index.mjs"; +import { convertOtd } from "../otd-conv/index.mjs"; +import { generateTtfaControls } from "../ttfa-controls/index.mjs"; +import { validateFontConfigMono } from "../validate/metrics.mjs"; + +export async function buildFont(para, cache) { + const baseFont = CreateEmptyFont(para); + assignFontNames(baseFont, para.naming, para.isQuasiProportional); + + // Build glyphs + const gs = buildGlyphs(para); + copyFontMetrics(gs.fontMetrics, baseFont); + + // Build OTL + const otl = buildOtl(para, gs.glyphStore); + + // Regulate (like geometry conversion) + const excludeChars = new Set(); + if (para.excludedCharRanges) { + for (const [start, end] of para.excludedCharRanges) { + for (let p = start; p <= end; p++) excludeChars.add(p); + } + } + const cleanGs = cleanupGlyphStore(cache, para, gs.glyphStore, excludeChars, otl); + + // Convert to TTF + const font = await convertOtd(baseFont, otl, cleanGs); + // Build compatibility ligatures + if (para.compatibilityLigatures) await buildCompatLigatures(para, font); + // Generate ttfaControls + const ttfaControls = await generateTtfaControls(cleanGs, font.glyphs); + + // Validation : Metrics + if (para.forceMonospace) validateFontConfigMono(font); + + return { font, glyphStore: cleanGs, cacheUpdated: cache && cache.isUpdated(), ttfaControls }; +} diff --git a/packages/font/src/finalize/gc.mjs b/packages/font/src/cleanup/gc.mjs similarity index 100% rename from packages/font/src/finalize/gc.mjs rename to packages/font/src/cleanup/gc.mjs diff --git a/packages/font/src/cleanup/glyphs.mjs b/packages/font/src/cleanup/glyphs.mjs new file mode 100644 index 000000000..6ba3f4f50 --- /dev/null +++ b/packages/font/src/cleanup/glyphs.mjs @@ -0,0 +1,56 @@ +import * as Geom from "@iosevka/geometry"; +import { Transform } from "@iosevka/geometry/transform"; + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +export function finalizeGlyphs(cache, para, glyphStore) { + const skew = Math.tan(((para.slopeAngle || 0) / 180) * Math.PI); + regulateGlyphStore(cache, skew, glyphStore); + return glyphStore; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +function regulateGlyphStore(cache, skew, glyphStore) { + for (const g of glyphStore.glyphs()) { + if (!(g.geometry.measureComplexity() & Geom.CPLX_NON_EMPTY)) continue; + if (!g.geometry.toReferences()) flattenSimpleGlyph(cache, skew, g); + } +} + +function flattenSimpleGlyph(cache, skew, g) { + // Check if the geometry is already in the cache. If so, use the cached geometry. + const ck = Geom.hashGeometry(g.geometry); + if (ck && cache) { + const cachedGeometry = cache && cache.getGF(ck); + if (cachedGeometry) { + g.clearGeometry(); + g.includeContours(cachedGeometry); + cache.refreshGF(ck); + return; + } + } + + // Perform the actual simplification + try { + let gSimplified; + if (skew) { + const tfBack = g.gizmo ? g.gizmo.inverse() : new Transform(1, -skew, 0, 1, 0, 0); + const tfForward = g.gizmo ? g.gizmo : new Transform(1, +skew, 0, 1, 0, 0); + gSimplified = new Geom.TransformedGeometry( + tfForward, + new Geom.SimplifyGeometry(new Geom.TransformedGeometry(tfBack, g.geometry)), + ); + } else { + gSimplified = new Geom.SimplifyGeometry(g.geometry); + } + + const cs = gSimplified.toContours(); + g.clearGeometry(); + g.includeContours(cs); + if (ck && cache) cache.saveGF(ck, cs); + } catch (e) { + console.error("Detected broken geometry when processing", g._m_identifier); + throw e; + } +} diff --git a/packages/font/src/cleanup/index.mjs b/packages/font/src/cleanup/index.mjs new file mode 100644 index 000000000..08e054d0a --- /dev/null +++ b/packages/font/src/cleanup/index.mjs @@ -0,0 +1,25 @@ +import { Nwid, Wwid } from "@iosevka/glyph/relation"; + +import { gcFont } from "./gc.mjs"; +import { finalizeGlyphs } from "./glyphs.mjs"; + +export function cleanupGlyphStore(cache, para, glyphStore, excludedCodePoints, restFont) { + assignGrAndCodeRank(glyphStore, Wwid, Nwid); + assignSubRank(glyphStore); + glyphStore = gcFont(glyphStore, excludedCodePoints, restFont); + glyphStore = finalizeGlyphs(cache, para, glyphStore); + return glyphStore; +} + +function assignGrAndCodeRank(glyphStore, ...flatteners) { + for (const g of glyphStore.glyphs()) { + g.codeRank = 0xffffffff; + for (const c of glyphStore.flattenCodes(g, flatteners)) if (c < g.codeRank) g.codeRank = c; + g.grRank = 0; + for (let i = 0; i < flatteners.length; i++) if (flatteners[i].get(g)) g.grRank |= 1 << i; + } +} +function assignSubRank(glyphStore) { + let sr = 0; + for (const g of glyphStore.glyphs()) g.subRank = sr++; +} diff --git a/packages/font/src/derive-spacing.mjs b/packages/font/src/derive-spacing.mjs index 85775d72c..ff8f033a7 100644 --- a/packages/font/src/derive-spacing.mjs +++ b/packages/font/src/derive-spacing.mjs @@ -6,6 +6,7 @@ import { CliProc, Ot } from "ot-builder"; import { readTTF, saveTTF } from "./font-io/index.mjs"; import { assignFontNames, createNamingDictFromArgv } from "./naming/index.mjs"; +import { validateFontConfigMono } from "./validate/metrics.mjs"; export default main; async function main(argv) { @@ -112,21 +113,3 @@ async function deriveFixed_DropFeatures(font, argv, fFixed) { } } } - -// In FontConfig, a font is considered "monospace" if and only if all encoded non-combining -// characters (AW > 0) have the same width. We use this method to validate whether our -// "Fixed" subfamilies are properly built. -function validateFontConfigMono(font) { - let awSet = new Set(); - for (const [ch, g] of [...font.cmap.unicode.entries()]) { - const aw = g.horizontal.end - g.horizontal.start; - if (aw > 0) awSet.add(aw); - } - for (const [ch, vs, g] of [...font.cmap.vs.entries()]) { - const aw = g.horizontal.end - g.horizontal.start; - if (aw > 0) awSet.add(aw); - } - if (awSet.size > 1) { - console.error("Fixed variant has wide characters"); - } -} diff --git a/packages/font/src/finalize/glyphs.mjs b/packages/font/src/finalize/glyphs.mjs deleted file mode 100644 index 8ffea041c..000000000 --- a/packages/font/src/finalize/glyphs.mjs +++ /dev/null @@ -1,51 +0,0 @@ -import * as Geom from "@iosevka/geometry"; -import { Transform } from "@iosevka/geometry/transform"; - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -export function finalizeGlyphs(cache, para, glyphStore) { - const skew = Math.tan(((para.slopeAngle || 0) / 180) * Math.PI); - regulateGlyphStore(cache, skew, glyphStore); - return glyphStore; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -function regulateGlyphStore(cache, skew, glyphStore) { - for (const g of glyphStore.glyphs()) { - if (!(g.geometry.measureComplexity() & Geom.CPLX_NON_EMPTY)) continue; - if (!g.geometry.toReferences()) flattenSimpleGlyph(cache, skew, g); - } -} - -function flattenSimpleGlyph(cache, skew, g) { - const ck = Geom.hashGeometry(g.geometry); - const cached = cache.getGF(ck); - if (ck && cached) { - g.clearGeometry(); - g.includeContours(cached); - cache.refreshGF(ck); - } else { - try { - let gSimplified; - if (skew) { - const tfBack = g.gizmo ? g.gizmo.inverse() : new Transform(1, -skew, 0, 1, 0, 0); - const tfForward = g.gizmo ? g.gizmo : new Transform(1, +skew, 0, 1, 0, 0); - gSimplified = new Geom.TransformedGeometry( - tfForward, - new Geom.SimplifyGeometry(new Geom.TransformedGeometry(tfBack, g.geometry)), - ); - } else { - gSimplified = new Geom.SimplifyGeometry(g.geometry); - } - - const cs = gSimplified.toContours(); - g.clearGeometry(); - g.includeContours(cs); - if (ck) cache.saveGF(ck, cs); - } catch (e) { - console.error("Detected broken geometry when processing", g._m_identifier); - throw e; - } - } -} diff --git a/packages/font/src/finalize/index.mjs b/packages/font/src/finalize/index.mjs deleted file mode 100644 index e360bc949..000000000 --- a/packages/font/src/finalize/index.mjs +++ /dev/null @@ -1,43 +0,0 @@ -import { Nwid, Wwid } from "@iosevka/glyph/relation"; - -import { gcFont } from "./gc.mjs"; -import { finalizeGlyphs } from "./glyphs.mjs"; - -export function finalizeFont(cache, para, glyphStore, excludedCodePoints, restFont) { - assignGrAndCodeRank(glyphStore, Wwid, Nwid); - assignSubRank(glyphStore); - glyphStore = gcFont(glyphStore, excludedCodePoints, restFont); - glyphStore = finalizeGlyphs(cache, para, glyphStore); - validateMonospace(para, glyphStore); - return glyphStore; -} - -function assignGrAndCodeRank(glyphStore, ...flatteners) { - for (const g of glyphStore.glyphs()) { - g.codeRank = 0xffffffff; - for (const c of glyphStore.flattenCodes(g, flatteners)) if (c < g.codeRank) g.codeRank = c; - g.grRank = 0; - for (let i = 0; i < flatteners.length; i++) if (flatteners[i].get(g)) g.grRank |= 1 << i; - } -} -function assignSubRank(glyphStore) { - let sr = 0; - for (const g of glyphStore.glyphs()) g.subRank = sr++; -} - -// In FontConfig, a font is considered "monospace" if and only if all encoded non-combining -// characters (AW > 0) have the same width. We use this method to validate whether our -// "Fixed" subfamilies are properly built. -function validateMonospace(para, glyphStore) { - let awSet = new Set(); - for (const [u, n, g] of glyphStore.encodedEntries()) { - const aw = Math.round(g.advanceWidth || 0); - if (aw > 0) awSet.add(aw); - } - if (para.forceMonospace && awSet.size > 1) { - throw new Error("Unreachable! Fixed variant has wide characters"); - } - if (!para.isQuasiProportional && !para.compLig && awSet.size > 2) { - throw new Error("Unreachable! Building monospace with more than 2 character widths"); - } -} diff --git a/packages/font/src/font-io/index.mjs b/packages/font/src/font-io/index.mjs index 0e20b4017..a546ed986 100644 --- a/packages/font/src/font-io/index.mjs +++ b/packages/font/src/font-io/index.mjs @@ -2,12 +2,12 @@ import fs from "fs"; import { FontIo, Ot } from "ot-builder"; -export function CreateEmptyFont(argv) { +export function CreateEmptyFont(para) { let font = { head: new Ot.Head.Table(), hhea: new Ot.MetricHead.Hhea(), os2: new Ot.Os2.Table(4), - post: new Ot.Post.Table(argv.featureControl.exportGlyphNames ? 2 : 3, 0), + post: new Ot.Post.Table(para.exportGlyphNames ? 2 : 3, 0), maxp: Ot.Maxp.Table.TrueType(), name: new Ot.Name.Table(), }; diff --git a/packages/font/src/font.mjs b/packages/font/src/font.mjs deleted file mode 100644 index df6c8b15f..000000000 --- a/packages/font/src/font.mjs +++ /dev/null @@ -1,38 +0,0 @@ -import { buildGlyphs } from "@iosevka/font-glyphs"; -import { copyFontMetrics } from "@iosevka/font-glyphs/aesthetics"; -import { buildOtl } from "@iosevka/font-otl"; -import * as Caching from "@iosevka/geometry-cache"; - -import { finalizeFont } from "./finalize/index.mjs"; -import { CreateEmptyFont } from "./font-io/index.mjs"; -import { assignFontNames } from "./naming/index.mjs"; -import { convertOtd } from "./otd-conv/index.mjs"; -import { generateTtfaControls } from "./ttfa-controls/index.mjs"; - -export async function buildFont(argv, para) { - const baseFont = CreateEmptyFont(argv); - assignFontNames(baseFont, para.naming, para.isQuasiProportional); - - // Build glyphs - const gs = buildGlyphs(para); - copyFontMetrics(gs.fontMetrics, baseFont); - - // Build OTL - const otl = buildOtl(para, gs.glyphStore); - - // Regulate (like geometry conversion) - const excludeChars = new Set(); - if (para.excludedCharRanges) { - for (const [start, end] of para.excludedCharRanges) { - for (let p = start; p <= end; p++) excludeChars.add(p); - } - } - const cache = await Caching.load(argv.iCache, argv.menu.version, argv.cacheFreshAgeKey); - const finalGs = finalizeFont(cache, para, gs.glyphStore, excludeChars, otl); - if (cache.isUpdated()) await Caching.save(argv.oCache, argv.menu.version, cache, true); - - // Convert to TTF - const font = await convertOtd(baseFont, otl, finalGs); - const ttfaControls = await generateTtfaControls(finalGs, font.glyphs); - return { font, glyphStore: finalGs, cacheUpdated: cache.isUpdated(), ttfaControls }; -} diff --git a/packages/font/src/hb-compat-ligature/index.mjs b/packages/font/src/hb-compat-ligature/index.mjs index a341eec8d..9f7bb19f5 100644 --- a/packages/font/src/hb-compat-ligature/index.mjs +++ b/packages/font/src/hb-compat-ligature/index.mjs @@ -3,12 +3,11 @@ import { Ot } from "ot-builder"; import { buildTTF } from "../font-io/index.mjs"; export async function buildCompatLigatures(para, font) { - // We need to fix the glyph order before building the TTF + // MappedGlyphStore is append-only, so we do not need to worry about the order of glyphs const glyphList = font.glyphs.decideOrder(); - const gsFixed = Ot.ListGlyphStoreFactory.createStoreFromList(Array.from(glyphList)); - font.glyphs = gsFixed; const completedCodePoints = new Set(); + const jobs = []; // Build a provisional in-memory TTF for shaping const provisionalTtf = buildTTF(font); @@ -55,12 +54,17 @@ export async function buildCompatLigatures(para, font) { } // Save the ligature glyph - font.glyphs.items.push(ligature); - font.cmap.unicode.set(entry.unicode, ligature); - if (font.gdef) font.gdef.glyphClassDef.set(ligature, Ot.Gdef.GlyphClass.Ligature); + jobs.push({ name: ligature.name, unicode: entry.unicode, glyph: ligature }); completedCodePoints.add(entry.unicode); } + // Commit jobs + for (const job of jobs) { + font.glyphs.addOtGlyph(job.name, job.glyph); + font.cmap.unicode.set(job.unicode, job.glyph); + if (font.gdef) font.gdef.glyphClassDef.set(job.glyph, Ot.Gdef.GlyphClass.Ligature); + } + hbFont.destroy(); hbFace.destroy(); hbBlob.destroy(); diff --git a/packages/font/src/index.mjs b/packages/font/src/index.mjs index 4af82f141..2bd651381 100644 --- a/packages/font/src/index.mjs +++ b/packages/font/src/index.mjs @@ -3,6 +3,7 @@ import path from "path"; import zlib from "zlib"; import * as Toml from "@iarna/toml"; +import * as Caching from "@iosevka/geometry-cache"; import { createGrDisplaySheet } from "@iosevka/glyph/relation"; import * as Parameters from "@iosevka/param"; import { applyLigationData } from "@iosevka/param/ligation"; @@ -10,33 +11,41 @@ import { applyMetricOverride } from "@iosevka/param/metric-override"; import * as VariantData from "@iosevka/param/variant"; import { encode } from "@msgpack/msgpack"; +import { buildFont } from "./build-font/index.mjs"; import { saveTTF } from "./font-io/index.mjs"; -import { buildFont } from "./font.mjs"; -import { buildCompatLigatures } from "./hb-compat-ligature/index.mjs"; import { createNamingDictFromArgv } from "./naming/index.mjs"; export default main; async function main(argv) { - const paraT = await getParameters(argv); + // Set up parameters + const paraT = await getParametersT(argv); const para = paraT(argv); - const { font, glyphStore, cacheUpdated, ttfaControls } = await buildFont(argv, para); - if (argv.oCharMap) { - await saveCharMap(argv, glyphStore); - } - if (argv.oTtfaControls) { - await fs.promises.writeFile(argv.oTtfaControls, ttfaControls.join("\n") + "\n"); - } - if (argv.o) { - if (para.compatibilityLigatures) await buildCompatLigatures(para, font); - await saveTTF(argv.o, font); + + // Set up cache + const cache = argv.cache + ? await Caching.load(argv.cache.input, argv.menu.version, argv.cache.freshAgeKey) + : null; + // Build font + const { font, glyphStore, cacheUpdated, ttfaControls } = await buildFont(para, cache); + + // Save charmap + if (argv.oCharMap) await saveCharMap(argv, glyphStore); + // Save ttfaControls + if (argv.oTtfaControls) await fs.promises.writeFile(argv.oTtfaControls, ttfaControls); + // Save TTF + if (argv.o) await saveTTF(argv.o, font); + // Save cache + if (argv.cache && cache && cache.isUpdated()) { + await Caching.save(argv.cache.output, argv.menu.version, cache, true); } + return { cacheUpdated }; } /////////////////////////////////////////////////////////////////////////////////////////////////// // Parameter preparation -async function getParameters(argv) { +async function getParametersT(argv) { const PARAMETERS_TOML = path.resolve(argv.paramsDir, "./parameters.toml"); const WEIGHTS_TOML = path.resolve(argv.paramsDir, "./shape-weight.toml"); const WIDTHS_TOML = path.resolve(argv.paramsDir, "./shape-width.toml"); diff --git a/packages/font/src/otd-conv/glyphs.mjs b/packages/font/src/otd-conv/glyphs.mjs index 53037c247..ca8ef0acb 100644 --- a/packages/font/src/otd-conv/glyphs.mjs +++ b/packages/font/src/otd-conv/glyphs.mjs @@ -1,5 +1,6 @@ import * as Geom from "@iosevka/geometry"; import { Point } from "@iosevka/geometry/point"; +import { Glyph } from "@iosevka/glyph"; import * as Gr from "@iosevka/glyph/relation"; import { Ot } from "ot-builder"; @@ -57,6 +58,13 @@ class MappedGlyphStore { if (!name) return undefined; return this.m_nameMapping.get(name); } + + // Add directly from Ot.Glyphs + addOtGlyph(name, g) { + this.m_nameMapping.set(name, g); + this.m_mapping.set(new Glyph(name), g); + } + decideOrder() { const gs = Ot.ListGlyphStoreFactory.createStoreFromList([...this.m_mapping.values()]); return gs.decideOrder(); diff --git a/packages/font/src/ttfa-controls/index.mjs b/packages/font/src/ttfa-controls/index.mjs index 5c816d33f..b9fb2fee0 100644 --- a/packages/font/src/ttfa-controls/index.mjs +++ b/packages/font/src/ttfa-controls/index.mjs @@ -30,7 +30,7 @@ export async function generateTtfaControls(gsOrig, gsTtf) { alignment.write(ttfaControls, gsTtf); } - return ttfaControls; + return ttfaControls.join("\n") + "\n"; } class Alignment { diff --git a/packages/font/src/validate/metrics.mjs b/packages/font/src/validate/metrics.mjs new file mode 100644 index 000000000..7000ad075 --- /dev/null +++ b/packages/font/src/validate/metrics.mjs @@ -0,0 +1,17 @@ +// In FontConfig, a font is considered "monospace" if and only if all encoded non-combining +// characters (AW > 0) have the same width. We use this method to validate whether our +// "Fixed" subfamilies are properly built. +export function validateFontConfigMono(font) { + let awSet = new Set(); + for (const [ch, g] of [...font.cmap.unicode.entries()]) { + const aw = g.horizontal.end - g.horizontal.start; + if (aw > 0) awSet.add(aw); + } + for (const [ch, vs, g] of [...font.cmap.vs.entries()]) { + const aw = g.horizontal.end - g.horizontal.start; + if (aw > 0) awSet.add(aw); + } + if (awSet.size > 1) { + console.error("Fixed variant has wide characters"); + } +} diff --git a/packages/geometry-cache/package.json b/packages/geometry-cache/package.json index 2af0d6304..1fed5b8ff 100644 --- a/packages/geometry-cache/package.json +++ b/packages/geometry-cache/package.json @@ -1,12 +1,12 @@ { "name": "@iosevka/geometry-cache", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { ".": "./src/index.mjs" }, "dependencies": { - "@iosevka/geometry": "29.0.4", + "@iosevka/geometry": "29.0.5", "@msgpack/msgpack": "^2.8.0" } } diff --git a/packages/geometry/package.json b/packages/geometry/package.json index 4094db837..3eba65194 100644 --- a/packages/geometry/package.json +++ b/packages/geometry/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/geometry", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { ".": "./src/index.mjs", @@ -13,7 +13,7 @@ "./spiro-control": "./src/spiro-control.mjs" }, "dependencies": { - "@iosevka/util": "29.0.4", + "@iosevka/util": "29.0.5", "spiro": "^3.0.0", "typo-geom": "^0.15.1" } diff --git a/packages/glyph/package.json b/packages/glyph/package.json index 1a9ee7e6c..a7c2212c2 100644 --- a/packages/glyph/package.json +++ b/packages/glyph/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/glyph", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { ".": "./src/glyph.mjs", @@ -9,6 +9,6 @@ "./relation": "./src/relation.mjs" }, "dependencies": { - "@iosevka/geometry": "29.0.4" + "@iosevka/geometry": "29.0.5" } } diff --git a/packages/param/package.json b/packages/param/package.json index 60f8a180d..b376ae785 100644 --- a/packages/param/package.json +++ b/packages/param/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/param", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { ".": "./src/index.mjs", @@ -9,6 +9,6 @@ "./metric-override": "./src/metric-override.mjs" }, "dependencies": { - "@iosevka/util": "29.0.4" + "@iosevka/util": "29.0.5" } } diff --git a/packages/param/src/index.mjs b/packages/param/src/index.mjs index cf602cf3b..f0642bcab 100644 --- a/packages/param/src/index.mjs +++ b/packages/param/src/index.mjs @@ -12,6 +12,7 @@ export function init(data, argv) { if (argv.featureControl.noCvSs) para.enableCvSs = false; if (argv.featureControl.noLigation) para.enableLigation = false; if (argv.featureControl.buildTextureFeature) para.buildTextureFeature = true; + if (argv.featureControl.exportGlyphNames) para.exportGlyphNames = true; return para; } function applyBlendingParam(argv, para, data, key, keyArgv) { diff --git a/packages/util/package.json b/packages/util/package.json index 6c79d17f9..6cee6c408 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/util", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { ".": "./src/index.mjs", diff --git a/tools/amend-readme/package.json b/tools/amend-readme/package.json index 3710a82ae..6fea36fb6 100644 --- a/tools/amend-readme/package.json +++ b/tools/amend-readme/package.json @@ -1,13 +1,13 @@ { "name": "@iosevka/amend-readme", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { ".": "./src/index.mjs" }, "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/param": "29.0.4", + "@iosevka/param": "29.0.5", "@unicode/unicode-15.1.0": "^1.5.2" } } diff --git a/tools/data-export/package.json b/tools/data-export/package.json index 4d300fa0f..02436e893 100644 --- a/tools/data-export/package.json +++ b/tools/data-export/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/data-export", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { ".": "./src/index.mjs", @@ -10,7 +10,7 @@ }, "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/param": "29.0.4", + "@iosevka/param": "29.0.5", "@unicode/unicode-15.1.0": "^1.5.2", "cldr": "^7.5.0" } diff --git a/tools/generate-samples/package.json b/tools/generate-samples/package.json index 50a694533..28b3cceee 100644 --- a/tools/generate-samples/package.json +++ b/tools/generate-samples/package.json @@ -1,11 +1,11 @@ { "name": "@iosevka/generate-samples", - "version": "29.0.4", + "version": "29.0.5", "private": true, "exports": { ".": "./src/index.mjs" }, "dependencies": { - "@iosevka/data-export": "29.0.4" + "@iosevka/data-export": "29.0.5" } } diff --git a/tools/misc/package.json b/tools/misc/package.json index f4de0d684..6f0d37c7a 100644 --- a/tools/misc/package.json +++ b/tools/misc/package.json @@ -1,10 +1,10 @@ { "name": "@iosevka/misc", - "version": "29.0.4", + "version": "29.0.5", "private": true, "dependencies": { "semver": "^7.6.0", "wawoff2": "^2.0.1", - "@iosevka/util": "29.0.4" + "@iosevka/util": "29.0.5" } } diff --git a/verdafile.mjs b/verdafile.mjs index d6b2f23aa..1095c6c3b 100644 --- a/verdafile.mjs +++ b/verdafile.mjs @@ -254,6 +254,8 @@ const FontInfoOf = computed.group("metadata:font-info-of", async (target, fileNa }; } + const [compositesFromBuildPlan] = await target.need(CompositesFromBuildPlan); + return { name: fileName, variants: bp.variants || null, @@ -304,6 +306,9 @@ const FontInfoOf = computed.group("metadata:font-info-of", async (target, fileNa // Spacing derivation -- creating faster build for spacing variants spacingDerive, + + // Composite variants from build plan -- used for variant resolution when building fonts + compositesFromBuildPlan, }; }); @@ -428,24 +433,27 @@ const DistUnhintedTTF = file.make( const cachePath = `${SHARED_CACHE}/${cacheFileName}.mpz`; const cacheDiffPath = `${charMapPath.dir}/${fn}.cache.mpz`; - const [comps] = await target.need( - CompositesFromBuildPlan, - de(charMapPath.dir), - de(ttfaControlsPath.dir), - de(SHARED_CACHE), - ); + await target.need(de(charMapPath.dir), de(ttfaControlsPath.dir), de(SHARED_CACHE)); echo.action(echo.hl.command(`Create TTF`), out.full); const { cacheUpdated } = await silently.node("packages/font/src/index.mjs", { - o: out.full, - ...(fi.buildCharMap ? { oCharMap: charMapPath.full } : {}), - paramsDir: Path.resolve("params"), - oTtfaControls: ttfaControlsPath.full, - cacheFreshAgeKey: ageKey, - iCache: cachePath, - oCache: cacheDiffPath, - compositesFromBuildPlan: comps, + // INPUT: font info ...fi, + // INPUT: path to parameters + paramsDir: Path.resolve("params"), + // TTF output. Optional. + o: out.full, + // Charmap output. Optional. + ...(fi.buildCharMap ? { oCharMap: charMapPath.full } : {}), + // TTFAutohint controls output. Optional. + oTtfaControls: ttfaControlsPath.full, + + // Geometry cache parameters. Optional. + cache: { + input: cachePath, + output: cacheDiffPath, + freshAgeKey: ageKey, + }, }); if (cacheUpdated) {