microsoft / cascadia-code

This is a fun, new monospaced font that includes programming ligatures and is designed to enhance the modern look and feel of the Windows Terminal.
Other
25.1k stars 793 forks source link

New checkerboards, more quadrants, and sextants #708

Closed PhMajerus closed 2 months ago

PhMajerus commented 5 months ago

Summary of the Pull Request

This update does not modify any existing character, it is only adding new characters from the Symbols for Legacy Computing block. This is the first pull request of a few I have ready. I unified the coordinates for sextants and octants and created the glyph files for pretty much all of the pseudo-pixels mosaic characters. The goal is to have full support for all pseudo-pixels as they are used for graphics rendering in the terminal. More goodies for terminals are also coming after the mosaics.

This contains a lot of glyphs, and the octants will be even worse. However, fear not, to avoid typos or other human error while creating hundreds of glyphs, I decided instead to create some script tools to generate them. So they should be mathematically exact, based on two bounding box sets of coordinates: GDI versions assumes a full cell is [0,2226},[1200,-480], while DirectWrite versions assumes [0,1900],[1200,-480].

I checked all the characters in VTT, as well as in real use in Windows Terminal at 100% and 200% DPI screens and at different zoom levels. I have a set of sextants ANSI-art (or should we call those Uni-art?) files that now also display really nicely in Windows Terminal.

Here are the characters added by this pull request: image

## References Pseudo-pixels mosaic characters have been discussed in #647, and this covers all the 2×2 "quadrants" by adding some new ones, as well as all the 2×3 "sextants". Sextants seem to be well supported on Linux, so we need these characters to ensure Windows Terminal can handle utilities using them as well.

PR Checklist

Detailed Description of the Pull Request / Additional comments

Added 172 glyphs.

Added the new glyphs .glif files to the glyphs subfolder of each font. Being block (full-cell) symbols, they are identical in all fonts and files are just duplicated. Block-based glyphs have both a normal (GDI) and .stypo (DWrite) variants.

Added the new glyphs, including .stypo ones, to features.fea::@NotSpace array of non-italic fonts (at the end but before the LIG list). checkerBoardDeleteApple2 checkerBoardDeleteTrs80 checkerBoardDeleteAmstradCpc checkerBoardDeleteAmstradCpc.stypo checkerBoardFill checkerBoardFill.stypo checkerBoardFillInverse checkerBoardFillInverse.stypo blockQuadrant-UC blockQuadrant-UC.stypo blockQuadrant-LC blockQuadrant-LC.stypo blockQuadrant-ML blockQuadrant-ML.stypo blockQuadrant-MR blockQuadrant-MR.stypo blockTriangle-1 blockTriangle-1.stypo blockTriangle-2 blockTriangle-2.stypo blockTriangle-3 blockTriangle-3.stypo blockTriangle-4 blockTriangle-4.stypo blockTriangle-14 blockTriangle-14.stypo blockTriangle-23 blockTriangle-23.stypo blockTriangle-123 blockTriangle-123.stypo blockTriangle-124 blockTriangle-124.stypo blockTriangle-134 blockTriangle-134.stypo blockTriangle-234 blockTriangle-234.stypo blockCircle-1 blockCircle-1.stypo blockCircle-2 blockCircle-2.stypo blockCircle-3 blockCircle-3.stypo blockCircle-4 blockCircle-4.stypo blockCircle-UC blockCircle-UC.stypo blockCircle-LC by blockCircle-LC.stypo blockCircle-ML blockCircle-ML.stypo blockCircle-MR blockCircle-MR.stypo blockSextant-1 blockSextant-1.stypo blockSextant-2 blockSextant-2.stypo blockSextant-12 blockSextant-12.stypo blockSextant-3 blockSextant-3.stypo blockSextant-13 blockSextant-13.stypo blockSextant-23 blockSextant-23.stypo blockSextant-123 blockSextant-123.stypo blockSextant-4 blockSextant-4.stypo blockSextant-14 blockSextant-14.stypo blockSextant-24 blockSextant-24.stypo blockSextant-124 blockSextant-124.stypo blockSextant-34 blockSextant-34.stypo blockSextant-134 blockSextant-134.stypo blockSextant-234 blockSextant-234.stypo blockSextant-1234 blockSextant-1234.stypo blockSextant-5 blockSextant-5.stypo blockSextant-15 blockSextant-15.stypo blockSextant-25 blockSextant-25.stypo blockSextant-125 blockSextant-125.stypo blockSextant-35 blockSextant-35.stypo blockSextant-235 blockSextant-235.stypo blockSextant-1235 blockSextant-1235.stypo blockSextant-45 blockSextant-45.stypo blockSextant-145 blockSextant-145.stypo blockSextant-245 blockSextant-245.stypo blockSextant-1245 blockSextant-1245.stypo blockSextant-345 blockSextant-345.stypo blockSextant-1345 blockSextant-1345.stypo blockSextant-2345 blockSextant-2345.stypo blockSextant-12345 blockSextant-12345.stypo blockSextant-6 blockSextant-6.stypo blockSextant-16 blockSextant-16.stypo blockSextant-26 blockSextant-26.stypo blockSextant-126 blockSextant-126.stypo blockSextant-36 blockSextant-36.stypo blockSextant-136 blockSextant-136.stypo blockSextant-236 blockSextant-236.stypo blockSextant-1236 blockSextant-1236.stypo blockSextant-46 blockSextant-46.stypo blockSextant-146 blockSextant-146.stypo blockSextant-1246 blockSextant-1246.stypo blockSextant-346 blockSextant-346.stypo blockSextant-1346 blockSextant-1346.stypo blockSextant-2346 blockSextant-2346.stypo blockSextant-12346 blockSextant-12346.stypo blockSextant-56 blockSextant-56.stypo blockSextant-156 blockSextant-156.stypo blockSextant-256 blockSextant-256.stypo blockSextant-1256 blockSextant-1256.stypo blockSextant-356 blockSextant-356.stypo blockSextant-1356 blockSextant-1356.stypo blockSextant-2356 blockSextant-2356.stypo blockSextant-12356 blockSextant-12356.stypo blockSextant-456 blockSextant-456.stypo blockSextant-1456 blockSextant-1456.stypo blockSextant-2456 blockSextant-2456.stypo blockSextant-12456 blockSextant-12456.stypo blockSextant-3456 blockSextant-3456.stypo blockSextant-13456 blockSextant-13456.stypo blockSextant-23456 blockSextant-23456.stypo

Added list of glyphs and filenames to the content.plist::dict of the glyphs subfolder of each font.

Added mapping to substitute GDI with DWrite versions of glyphs to the features.fea::rclt feature of non-italic fonts and in features/rclt.fea::rclt.

sub checkerBoardDeleteAmstradCpc by checkerBoardDeleteAmstradCpc.stypo;
sub checkerBoardFill by checkerBoardFill.stypo;
sub checkerBoardFillInverse by checkerBoardFillInverse.stypo;
sub blockQuadrant-UC by blockQuadrant-UC.stypo;
sub blockQuadrant-LC by blockQuadrant-LC.stypo;
sub blockQuadrant-ML by blockQuadrant-ML.stypo;
sub blockQuadrant-MR by blockQuadrant-MR.stypo;
sub blockTriangle-1 by blockTriangle-1.stypo;
sub blockTriangle-2 by blockTriangle-2.stypo;
sub blockTriangle-3 by blockTriangle-3.stypo;
sub blockTriangle-4 by blockTriangle-4.stypo;
sub blockTriangle-14 by blockTriangle-14.stypo;
sub blockTriangle-23 by blockTriangle-23.stypo;
sub blockTriangle-123 by blockTriangle-123.stypo;
sub blockTriangle-124 by blockTriangle-124.stypo;
sub blockTriangle-134 by blockTriangle-134.stypo;
sub blockTriangle-234 by blockTriangle-234.stypo;
sub blockCircle-1 by blockCircle-1.stypo;
sub blockCircle-2 by blockCircle-2.stypo;
sub blockCircle-3 by blockCircle-3.stypo;
sub blockCircle-4 by blockCircle-4.stypo;
sub blockCircle-UC by blockCircle-UC.stypo;
sub blockCircle-LC by blockCircle-LC.stypo;
sub blockCircle-ML by blockCircle-ML.stypo;
sub blockCircle-MR by blockCircle-MR.stypo;
sub blockSextant-1 by blockSextant-1.stypo;
sub blockSextant-2 by blockSextant-2.stypo;
sub blockSextant-12 by blockSextant-12.stypo;
sub blockSextant-3 by blockSextant-3.stypo;
sub blockSextant-13 by blockSextant-13.stypo;
sub blockSextant-23 by blockSextant-23.stypo;
sub blockSextant-123 by blockSextant-123.stypo;
sub blockSextant-4 by blockSextant-4.stypo;
sub blockSextant-14 by blockSextant-14.stypo;
sub blockSextant-24 by blockSextant-24.stypo;
sub blockSextant-124 by blockSextant-124.stypo;
sub blockSextant-34 by blockSextant-34.stypo;
sub blockSextant-134 by blockSextant-134.stypo;
sub blockSextant-234 by blockSextant-234.stypo;
sub blockSextant-1234 by blockSextant-1234.stypo;
sub blockSextant-5 by blockSextant-5.stypo;
sub blockSextant-15 by blockSextant-15.stypo;
sub blockSextant-25 by blockSextant-25.stypo;
sub blockSextant-125 by blockSextant-125.stypo;
sub blockSextant-35 by blockSextant-35.stypo;
sub blockSextant-235 by blockSextant-235.stypo;
sub blockSextant-1235 by blockSextant-1235.stypo;
sub blockSextant-45 by blockSextant-45.stypo;
sub blockSextant-145 by blockSextant-145.stypo;
sub blockSextant-245 by blockSextant-245.stypo;
sub blockSextant-1245 by blockSextant-1245.stypo;
sub blockSextant-345 by blockSextant-345.stypo;
sub blockSextant-1345 by blockSextant-1345.stypo;
sub blockSextant-2345 by blockSextant-2345.stypo;
sub blockSextant-12345 by blockSextant-12345.stypo;
sub blockSextant-6 by blockSextant-6.stypo;
sub blockSextant-16 by blockSextant-16.stypo;
sub blockSextant-26 by blockSextant-26.stypo;
sub blockSextant-126 by blockSextant-126.stypo;
sub blockSextant-36 by blockSextant-36.stypo;
sub blockSextant-136 by blockSextant-136.stypo;
sub blockSextant-236 by blockSextant-236.stypo;
sub blockSextant-1236 by blockSextant-1236.stypo;
sub blockSextant-46 by blockSextant-46.stypo;
sub blockSextant-146 by blockSextant-146.stypo;
sub blockSextant-1246 by blockSextant-1246.stypo;
sub blockSextant-346 by blockSextant-346.stypo;
sub blockSextant-1346 by blockSextant-1346.stypo;
sub blockSextant-2346 by blockSextant-2346.stypo;
sub blockSextant-12346 by blockSextant-12346.stypo;
sub blockSextant-56 by blockSextant-56.stypo;
sub blockSextant-156 by blockSextant-156.stypo;
sub blockSextant-256 by blockSextant-256.stypo;
sub blockSextant-1256 by blockSextant-1256.stypo;
sub blockSextant-356 by blockSextant-356.stypo;
sub blockSextant-1356 by blockSextant-1356.stypo;
sub blockSextant-2356 by blockSextant-2356.stypo;
sub blockSextant-12356 by blockSextant-12356.stypo;
sub blockSextant-456 by blockSextant-456.stypo;
sub blockSextant-1456 by blockSextant-1456.stypo;
sub blockSextant-2456 by blockSextant-2456.stypo;
sub blockSextant-12456 by blockSextant-12456.stypo;
sub blockSextant-3456 by blockSextant-3456.stypo;
sub blockSextant-13456 by blockSextant-13456.stypo;
sub blockSextant-23456 by blockSextant-23456.stypo;

Added the new glyphs to the lib.plist::public.glyphOrder array of each font (both normals and italics).

      <string>checkerBoardDeleteApple2</string>
      <string>checkerBoardDeleteTrs80</string>
      <string>checkerBoardDeleteAmstradCpc</string>
      <string>checkerBoardDeleteAmstradCpc.stypo</string>
      <string>checkerBoardFill</string>
      <string>checkerBoardFill.stypo</string>
      <string>checkerBoardFillInverse</string>
      <string>checkerBoardFillInverse.stypo</string>
      <string>blockQuadrant-UC</string>
      <string>blockQuadrant-UC.stypo</string>
      <string>blockQuadrant-LC</string>
      <string>blockQuadrant-LC.stypo</string>
      <string>blockQuadrant-ML</string>
      <string>blockQuadrant-ML.stypo</string>
      <string>blockQuadrant-MR</string>
      <string>blockQuadrant-MR.stypo</string>
      <string>blockTriangle-1</string>
      <string>blockTriangle-1.stypo</string>
      <string>blockTriangle-2</string>
      <string>blockTriangle-2.stypo</string>
      <string>blockTriangle-3</string>
      <string>blockTriangle-3.stypo</string>
      <string>blockTriangle-4</string>
      <string>blockTriangle-4.stypo</string>
      <string>blockTriangle-14</string>
      <string>blockTriangle-14.stypo</string>
      <string>blockTriangle-23</string>
      <string>blockTriangle-23.stypo</string>
      <string>blockTriangle-123</string>
      <string>blockTriangle-123.stypo</string>
      <string>blockTriangle-124</string>
      <string>blockTriangle-124.stypo</string>
      <string>blockTriangle-134</string>
      <string>blockTriangle-134.stypo</string>
      <string>blockTriangle-234</string>
      <string>blockTriangle-234.stypo</string>
      <string>blockCircle-1</string>
      <string>blockCircle-1.stypo</string>
      <string>blockCircle-2</string>
      <string>blockCircle-2.stypo</string>
      <string>blockCircle-3</string>
      <string>blockCircle-3.stypo</string>
      <string>blockCircle-4</string>
      <string>blockCircle-4.stypo</string>
      <string>blockCircle-UC</string>
      <string>blockCircle-UC.stypo</string>
      <string>blockCircle-LC</string>
      <string>blockCircle-LC.stypo</string>
      <string>blockCircle-ML</string>
      <string>blockCircle-ML.stypo</string>
      <string>blockCircle-MR</string>
      <string>blockCircle-MR.stypo</string>
      <string>blockSextant-1</string>
      <string>blockSextant-1.stypo</string>
      <string>blockSextant-2</string>
      <string>blockSextant-2.stypo</string>
      <string>blockSextant-12</string>
      <string>blockSextant-12.stypo</string>
      <string>blockSextant-3</string>
      <string>blockSextant-3.stypo</string>
      <string>blockSextant-13</string>
      <string>blockSextant-13.stypo</string>
      <string>blockSextant-23</string>
      <string>blockSextant-23.stypo</string>
      <string>blockSextant-123</string>
      <string>blockSextant-123.stypo</string>
      <string>blockSextant-4</string>
      <string>blockSextant-4.stypo</string>
      <string>blockSextant-14</string>
      <string>blockSextant-14.stypo</string>
      <string>blockSextant-24</string>
      <string>blockSextant-24.stypo</string>
      <string>blockSextant-124</string>
      <string>blockSextant-124.stypo</string>
      <string>blockSextant-34</string>
      <string>blockSextant-34.stypo</string>
      <string>blockSextant-134</string>
      <string>blockSextant-134.stypo</string>
      <string>blockSextant-234</string>
      <string>blockSextant-234.stypo</string>
      <string>blockSextant-1234</string>
      <string>blockSextant-1234.stypo</string>
      <string>blockSextant-5</string>
      <string>blockSextant-5.stypo</string>
      <string>blockSextant-15</string>
      <string>blockSextant-15.stypo</string>
      <string>blockSextant-25</string>
      <string>blockSextant-25.stypo</string>
      <string>blockSextant-125</string>
      <string>blockSextant-125.stypo</string>
      <string>blockSextant-35</string>
      <string>blockSextant-35.stypo</string>
      <string>blockSextant-235</string>
      <string>blockSextant-235.stypo</string>
      <string>blockSextant-1235</string>
      <string>blockSextant-1235.stypo</string>
      <string>blockSextant-45</string>
      <string>blockSextant-45.stypo</string>
      <string>blockSextant-145</string>
      <string>blockSextant-145.stypo</string>
      <string>blockSextant-245</string>
      <string>blockSextant-245.stypo</string>
      <string>blockSextant-1245</string>
      <string>blockSextant-1245.stypo</string>
      <string>blockSextant-345</string>
      <string>blockSextant-345.stypo</string>
      <string>blockSextant-1345</string>
      <string>blockSextant-1345.stypo</string>
      <string>blockSextant-2345</string>
      <string>blockSextant-2345.stypo</string>
      <string>blockSextant-12345</string>
      <string>blockSextant-12345.stypo</string>
      <string>blockSextant-6</string>
      <string>blockSextant-6.stypo</string>
      <string>blockSextant-16</string>
      <string>blockSextant-16.stypo</string>
      <string>blockSextant-26</string>
      <string>blockSextant-26.stypo</string>
      <string>blockSextant-126</string>
      <string>blockSextant-126.stypo</string>
      <string>blockSextant-36</string>
      <string>blockSextant-36.stypo</string>
      <string>blockSextant-136</string>
      <string>blockSextant-136.stypo</string>
      <string>blockSextant-236</string>
      <string>blockSextant-236.stypo</string>
      <string>blockSextant-1236</string>
      <string>blockSextant-1236.stypo</string>
      <string>blockSextant-46</string>
      <string>blockSextant-46.stypo</string>
      <string>blockSextant-146</string>
      <string>blockSextant-146.stypo</string>
      <string>blockSextant-1246</string>
      <string>blockSextant-1246.stypo</string>
      <string>blockSextant-346</string>
      <string>blockSextant-346.stypo</string>
      <string>blockSextant-1346</string>
      <string>blockSextant-1346.stypo</string>
      <string>blockSextant-2346</string>
      <string>blockSextant-2346.stypo</string>
      <string>blockSextant-12346</string>
      <string>blockSextant-12346.stypo</string>
      <string>blockSextant-56</string>
      <string>blockSextant-56.stypo</string>
      <string>blockSextant-156</string>
      <string>blockSextant-156.stypo</string>
      <string>blockSextant-256</string>
      <string>blockSextant-256.stypo</string>
      <string>blockSextant-1256</string>
      <string>blockSextant-1256.stypo</string>
      <string>blockSextant-356</string>
      <string>blockSextant-356.stypo</string>
      <string>blockSextant-1356</string>
      <string>blockSextant-1356.stypo</string>
      <string>blockSextant-2356</string>
      <string>blockSextant-2356.stypo</string>
      <string>blockSextant-12356</string>
      <string>blockSextant-12356.stypo</string>
      <string>blockSextant-456</string>
      <string>blockSextant-456.stypo</string>
      <string>blockSextant-1456</string>
      <string>blockSextant-1456.stypo</string>
      <string>blockSextant-2456</string>
      <string>blockSextant-2456.stypo</string>
      <string>blockSextant-12456</string>
      <string>blockSextant-12456.stypo</string>
      <string>blockSextant-3456</string>
      <string>blockSextant-3456.stypo</string>
      <string>blockSextant-13456</string>
      <string>blockSextant-13456.stypo</string>
      <string>blockSextant-23456</string>
      <string>blockSextant-23456.stypo</string>

Added "uni[CP]" names to lib.plist::public.postscriptNames dictionary of each font.

      <key>checkerBoardDeleteApple2</key>
      <string>uni2427</string>
      <key>checkerBoardDeleteTrs80</key>
      <string>uni2428</string>
      <key>checkerBoardDeleteAmstradCpc</key>
      <string>uni2429</string>
      <key>checkerBoardDeleteAmstradCpc.stypo</key>
      <string>uni2429.stypo</string>
      <key>checkerBoardFill</key>
      <string>uni1FB95</string>
      <key>checkerBoardFill.stypo</key>
      <string>uni1FB95.stypo</string>
      <key>checkerBoardFillInverse</key>
      <string>uni1FB96</string>
      <key>checkerBoardFillInverse.stypo</key>
      <string>uni1FB96.stypo</string>
      <key>blockQuadrant-UC</key>
      <string>uni1FBE4</string>
      <key>blockQuadrant-UC.stypo</key>
      <string>uni1FBE4.stypo</string>
      <key>blockQuadrant-LC</key>
      <string>uni1FBE5</string>
      <key>blockQuadrant-LC.stypo</key>
      <string>uni1FBE5.stypo</string>
      <key>blockQuadrant-ML</key>
      <string>uni1FBE6</string>
      <key>blockQuadrant-ML.stypo</key>
      <string>uni1FBE6.stypo</string>
      <key>blockQuadrant-MR</key>
      <string>uni1FBE7</string>
      <key>blockQuadrant-MR.stypo</key>
      <string>uni1FBE7.stypo</string>
      <key>blockTriangle-1</key>
      <string>uni1FB6D</string>
      <key>blockTriangle-1.stypo</key>
      <string>uni1FB6D.stypo</string>
      <key>blockTriangle-2</key>
      <string>uni1FB6C</string>
      <key>blockTriangle-2.stypo</key>
      <string>uni1FB6C.stypo</string>
      <key>blockTriangle-3</key>
      <string>uni1FB6E</string>
      <key>blockTriangle-3.stypo</key>
      <string>uni1FB6E.stypo</string>
      <key>blockTriangle-4</key>
      <string>uni1FB6F</string>
      <key>blockTriangle-4.stypo</key>
      <string>uni1FB6F.stypo</string>
      <key>blockTriangle-14</key>
      <string>uni1FB9A</string>
      <key>blockTriangle-14.stypo</key>
      <string>uni1FB9A.stypo</string>
      <key>blockTriangle-23</key>
      <string>uni1FB9B</string>
      <key>blockTriangle-23.stypo</key>
      <string>uni1FB9B.stypo</string>
      <key>blockTriangle-123</key>
      <string>uni1FB6B</string>
      <key>blockTriangle-123.stypo</key>
      <string>uni1FB6B.stypo</string>
      <key>blockTriangle-124</key>
      <string>uni1FB6A</string>
      <key>blockTriangle-124.stypo</key>
      <string>uni1FB6A.stypo</string>
      <key>blockTriangle-134</key>
      <string>uni1FB68</string>
      <key>blockTriangle-134.stypo</key>
      <string>uni1FB68.stypo</string>
      <key>blockTriangle-234</key>
      <string>uni1FB69</string>
      <key>blockTriangle-234.stypo</key>
      <string>uni1FB69.stypo</string>
      <key>blockCircle-1</key>
      <string>uni1FBEF</string>
      <key>blockCircle-1.stypo</key>
      <string>uni1FBEF.stypo</string>
      <key>blockCircle-2</key>
      <string>uni1FBEC</string>
      <key>blockCircle-2.stypo</key>
      <string>uni1FBEC.stypo</string>
      <key>blockCircle-3</key>
      <string>uni1FBED</string>
      <key>blockCircle-3.stypo</key>
      <string>uni1FBED.stypo</string>
      <key>blockCircle-4</key>
      <string>uni1FBEE</string>
      <key>blockCircle-4.stypo</key>
      <string>uni1FBEE.stypo</string>
      <key>blockCircle-UC</key>
      <string>uni1FBE8</string>
      <key>blockCircle-UC.stypo</key>
      <string>uni1FBE8.stypo</string>
      <key>blockCircle-LC</key>
      <string>uni1FBEA</string>
      <key>blockCircle-LC.stypo</key>
      <string>uni1FBEA.stypo</string>
      <key>blockCircle-ML</key>
      <string>uni1FBEB</string>
      <key>blockCircle-ML.stypo</key>
      <string>uni1FBEB.stypo</string>
      <key>blockCircle-MR</key>
      <string>uni1FBE9</string>
      <key>blockCircle-MR.stypo</key>
      <string>uni1FBE9.stypo</string>
      <key>blockSextant-1</key>
      <string>uni1FB00</string>
      <key>blockSextant-1.stypo</key>
      <string>uni1FB00.stypo</string>
      <key>blockSextant-2</key>
      <string>uni1FB01</string>
      <key>blockSextant-2.stypo</key>
      <string>uni1FB01.stypo</string>
      <key>blockSextant-12</key>
      <string>uni1FB02</string>
      <key>blockSextant-12.stypo</key>
      <string>uni1FB02.stypo</string>
      <key>blockSextant-3</key>
      <string>uni1FB03</string>
      <key>blockSextant-3.stypo</key>
      <string>uni1FB03.stypo</string>
      <key>blockSextant-13</key>
      <string>uni1FB04</string>
      <key>blockSextant-13.stypo</key>
      <string>uni1FB04.stypo</string>
      <key>blockSextant-23</key>
      <string>uni1FB05</string>
      <key>blockSextant-23.stypo</key>
      <string>uni1FB05.stypo</string>
      <key>blockSextant-123</key>
      <string>uni1FB06</string>
      <key>blockSextant-123.stypo</key>
      <string>uni1FB06.stypo</string>
      <key>blockSextant-4</key>
      <string>uni1FB07</string>
      <key>blockSextant-4.stypo</key>
      <string>uni1FB07.stypo</string>
      <key>blockSextant-14</key>
      <string>uni1FB08</string>
      <key>blockSextant-14.stypo</key>
      <string>uni1FB08.stypo</string>
      <key>blockSextant-24</key>
      <string>uni1FB09</string>
      <key>blockSextant-24.stypo</key>
      <string>uni1FB09.stypo</string>
      <key>blockSextant-124</key>
      <string>uni1FB0A</string>
      <key>blockSextant-124.stypo</key>
      <string>uni1FB0A.stypo</string>
      <key>blockSextant-34</key>
      <string>uni1FB0B</string>
      <key>blockSextant-34.stypo</key>
      <string>uni1FB0B.stypo</string>
      <key>blockSextant-134</key>
      <string>uni1FB0C</string>
      <key>blockSextant-134.stypo</key>
      <string>uni1FB0C.stypo</string>
      <key>blockSextant-234</key>
      <string>uni1FB0D</string>
      <key>blockSextant-234.stypo</key>
      <string>uni1FB0D.stypo</string>
      <key>blockSextant-1234</key>
      <string>uni1FB0E</string>
      <key>blockSextant-1234.stypo</key>
      <string>uni1FB0E.stypo</string>
      <key>blockSextant-5</key>
      <string>uni1FB0F</string>
      <key>blockSextant-5.stypo</key>
      <string>uni1FB0F.stypo</string>
      <key>blockSextant-15</key>
      <string>uni1FB10</string>
      <key>blockSextant-15.stypo</key>
      <string>uni1FB10.stypo</string>
      <key>blockSextant-25</key>
      <string>uni1FB11</string>
      <key>blockSextant-25.stypo</key>
      <string>uni1FB11.stypo</string>
      <key>blockSextant-125</key>
      <string>uni1FB12</string>
      <key>blockSextant-125.stypo</key>
      <string>uni1FB12.stypo</string>
      <key>blockSextant-35</key>
      <string>uni1FB13</string>
      <key>blockSextant-35.stypo</key>
      <string>uni1FB13.stypo</string>
      <key>blockSextant-235</key>
      <string>uni1FB14</string>
      <key>blockSextant-235.stypo</key>
      <string>uni1FB14.stypo</string>
      <key>blockSextant-1235</key>
      <string>uni1FB15</string>
      <key>blockSextant-1235.stypo</key>
      <string>uni1FB15.stypo</string>
      <key>blockSextant-45</key>
      <string>uni1FB16</string>
      <key>blockSextant-45.stypo</key>
      <string>uni1FB16.stypo</string>
      <key>blockSextant-145</key>
      <string>uni1FB17</string>
      <key>blockSextant-145.stypo</key>
      <string>uni1FB17.stypo</string>
      <key>blockSextant-245</key>
      <string>uni1FB18</string>
      <key>blockSextant-245.stypo</key>
      <string>uni1FB18.stypo</string>
      <key>blockSextant-1245</key>
      <string>uni1FB19</string>
      <key>blockSextant-1245.stypo</key>
      <string>uni1FB19.stypo</string>
      <key>blockSextant-345</key>
      <string>uni1FB1A</string>
      <key>blockSextant-345.stypo</key>
      <string>uni1FB1A.stypo</string>
      <key>blockSextant-1345</key>
      <string>uni1FB1B</string>
      <key>blockSextant-1345.stypo</key>
      <string>uni1FB1B.stypo</string>
      <key>blockSextant-2345</key>
      <string>uni1FB1C</string>
      <key>blockSextant-2345.stypo</key>
      <string>uni1FB1C.stypo</string>
      <key>blockSextant-12345</key>
      <string>uni1FB1D</string>
      <key>blockSextant-12345.stypo</key>
      <string>uni1FB1D.stypo</string>
      <key>blockSextant-6</key>
      <string>uni1FB1E</string>
      <key>blockSextant-6.stypo</key>
      <string>uni1FB1E.stypo</string>
      <key>blockSextant-16</key>
      <string>uni1FB1F</string>
      <key>blockSextant-16.stypo</key>
      <string>uni1FB1F.stypo</string>
      <key>blockSextant-26</key>
      <string>uni1FB20</string>
      <key>blockSextant-26.stypo</key>
      <string>uni1FB20.stypo</string>
      <key>blockSextant-126</key>
      <string>uni1FB21</string>
      <key>blockSextant-126.stypo</key>
      <string>uni1FB21.stypo</string>
      <key>blockSextant-36</key>
      <string>uni1FB22</string>
      <key>blockSextant-36.stypo</key>
      <string>uni1FB22.stypo</string>
      <key>blockSextant-136</key>
      <string>uni1FB23</string>
      <key>blockSextant-136.stypo</key>
      <string>uni1FB23.stypo</string>
      <key>blockSextant-236</key>
      <string>uni1FB24</string>
      <key>blockSextant-236.stypo</key>
      <string>uni1FB24.stypo</string>
      <key>blockSextant-1236</key>
      <string>uni1FB25</string>
      <key>blockSextant-1236.stypo</key>
      <string>uni1FB25.stypo</string>
      <key>blockSextant-46</key>
      <string>uni1FB26</string>
      <key>blockSextant-46.stypo</key>
      <string>uni1FB26.stypo</string>
      <key>blockSextant-146</key>
      <string>uni1FB27</string>
      <key>blockSextant-146.stypo</key>
      <string>uni1FB27.stypo</string>
      <key>blockSextant-1246</key>
      <string>uni1FB28</string>
      <key>blockSextant-1246.stypo</key>
      <string>uni1FB28.stypo</string>
      <key>blockSextant-346</key>
      <string>uni1FB29</string>
      <key>blockSextant-346.stypo</key>
      <string>uni1FB29.stypo</string>
      <key>blockSextant-1346</key>
      <string>uni1FB2A</string>
      <key>blockSextant-1346.stypo</key>
      <string>uni1FB2A.stypo</string>
      <key>blockSextant-2346</key>
      <string>uni1FB2B</string>
      <key>blockSextant-2346.stypo</key>
      <string>uni1FB2B.stypo</string>
      <key>blockSextant-12346</key>
      <string>uni1FB2C</string>
      <key>blockSextant-12346.stypo</key>
      <string>uni1FB2C.stypo</string>
      <key>blockSextant-56</key>
      <string>uni1FB2D</string>
      <key>blockSextant-56.stypo</key>
      <string>uni1FB2D.stypo</string>
      <key>blockSextant-156</key>
      <string>uni1FB2E</string>
      <key>blockSextant-156.stypo</key>
      <string>uni1FB2E.stypo</string>
      <key>blockSextant-256</key>
      <string>uni1FB2F</string>
      <key>blockSextant-256.stypo</key>
      <string>uni1FB2F.stypo</string>
      <key>blockSextant-1256</key>
      <string>uni1FB30</string>
      <key>blockSextant-1256.stypo</key>
      <string>uni1FB30.stypo</string>
      <key>blockSextant-356</key>
      <string>uni1FB31</string>
      <key>blockSextant-356.stypo</key>
      <string>uni1FB31.stypo</string>
      <key>blockSextant-1356</key>
      <string>uni1FB32</string>
      <key>blockSextant-1356.stypo</key>
      <string>uni1FB32.stypo</string>
      <key>blockSextant-2356</key>
      <string>uni1FB33</string>
      <key>blockSextant-2356.stypo</key>
      <string>uni1FB33.stypo</string>
      <key>blockSextant-12356</key>
      <string>uni1FB34</string>
      <key>blockSextant-12356.stypo</key>
      <string>uni1FB34.stypo</string>
      <key>blockSextant-456</key>
      <string>uni1FB35</string>
      <key>blockSextant-456.stypo</key>
      <string>uni1FB35.stypo</string>
      <key>blockSextant-1456</key>
      <string>uni1FB36</string>
      <key>blockSextant-1456.stypo</key>
      <string>uni1FB36.stypo</string>
      <key>blockSextant-2456</key>
      <string>uni1FB37</string>
      <key>blockSextant-2456.stypo</key>
      <string>uni1FB37.stypo</string>
      <key>blockSextant-12456</key>
      <string>uni1FB38</string>
      <key>blockSextant-12456.stypo</key>
      <string>uni1FB38.stypo</string>
      <key>blockSextant-3456</key>
      <string>uni1FB39</string>
      <key>blockSextant-3456.stypo</key>
      <string>uni1FB39.stypo</string>
      <key>blockSextant-13456</key>
      <string>uni1FB3A</string>
      <key>blockSextant-13456.stypo</key>
      <string>uni1FB3A.stypo</string>
      <key>blockSextant-23456</key>
      <string>uni1FB3B</string>
      <key>blockSextant-23456.stypo</key>
      <string>uni1FB3B.stypo</string>

Updated FONTLOG.txt

Added characters image and updated README.md accordingly Note I used a new image for these characters because while it has only 172 glyphs at this point, next updates will bring over 900, and they are identical between regular and italic fonts.

Before (if applicable) and After Images of the Character(s)

This update adds characters of the Symbols for Legacy Computing, especially interesting for terminals:

Note this update does not modify any existing character, I'm only adding new ones.

cascadia-legacycomputing-characters

Validation Steps Performed

I've been using block elements for years, and have been pushing for about two years for the Symbols for Legacy Computing to be added : #597. I have a bunch of test files ready for when sextants and octants would be added : https://github.com/PhMajerus/ANSI-art/tree/main/Unicode But they never got added. So I decided to give it a try and provide as much of the old-school graphics characters as I can to improve the situation.

Testing have been done by using a build of the font for days, experimenting with it in Windows Terminal and Visual Studio editor. I also checked the details from VTT, and created some test files such as curl https://raw.githubusercontent.com/PhMajerus/ANSI-art/main/Unicode/Blocks%20tables.txt I also tested with ANSI-art using VT colors to check for color bleeding around the cell, and while it's not pixel-perfect at all sizes, it seems to be consistent with the existing full block, half block, and quadrant characters: image

I don't know how to perform hinting, but since these are purely geometric shapes, I don't think controlling the exact pixels is important, they seem to render properly at all sizes I tried.

I hope you can accept this request so everyone can benefit from those new characters, and I plan to push more of the same as soon as possible.

aaronbell commented 4 months ago

Thanks for all this work! Sorry for the delay in following up. Just to let you know, I have set aside some time next week to take a look at this and get it merged.

Cheers

PhMajerus commented 4 months ago

Thanks @aaronbell.

I have some Sextants test files if you want: https://github.com/PhMajerus/ANSI-art/tree/main/Unicode

This is just the beginning, I have Octants #711, Large Type Pieces #709, as well as a few misc. legacy computing symbols, ready as well: cascadia-code-legacycomputing-characters

PhMajerus commented 4 months ago

@aaronbell I've just read more about fonts conventions and found out characters from supplementary planes should be named u[CP] instead of uni[CP] in lib.plist::public.postscriptNames. I noticed you didn't have any character outside the BMP yet and the characters I added are the first > U+FFFF. Which naming scheme do you want to use? Shall I commit a fix with the postscript names changed to u[CP], or should I fix it as part of the next pull request?

aaronbell commented 4 months ago

Glyph names don’t really matter too much, so don’t worry about it :). I’m planning to take a look at this stuff soon btw!

aaronbell commented 2 months ago

Hello! I'm sorry it has taken me a while to taken a look into this, but everything you've done looks good. I'm going to go ahead and merge these in.

dankamongmen commented 2 months ago

Awesome, I will update Notcurses to consider these elements usable on the Windows Console. Is there any way to test for this support at compile, link, and/or runtime? I understand, of course, that a particular font might be missing the glyphs.

PhMajerus commented 2 months ago

Thanks @aaronbell !

I'm glad they were good to go as it, that should mean the others I have ready should be as well, as they use the same principles and grid coordinates.

The next batch will be diagonals using the same grid coordinates as the sextants from this one. It will be a small update with only 2×44 glyphs (for GDI+DWrite), but the group after that is the octants, which is 2×236 glyphs. Let me know if you prefer me to group them as a single PR instead.

PhMajerus commented 2 months ago

@dankamongmen Thanks for your reactivity to update Notcurses !

I don't think there is any clean way to detect that these characters are available. There are some solutions I can think of, but none is perfect:

It is probably better to just wait for the Microsoft Store version of Terminal to include the updated font and then turn it on, as it means almost every user will get update quickly. Maybe someone from the Terminal team has some better idea.

aaronbell commented 2 months ago

@PhMajerus Might as well just group them :)

BTW, I think I mentioned this before but we are planning one more release of this version of Cascadia in the coming weeks, and then will hold off for a couple months as I work on the next version. So if you want this to be added soon, I'd suggest getting it pulled together! :)

PhMajerus commented 2 months ago

@aaronbell Yes, you mentioned it, but most should be easy to convert to your new version, and at least we have a reference to experiment with those characters. I'm not working on any new glyph since January (except improvements on the Large Type Pieces), but I was waiting for this PR to get through before adding more stuff as you mentioned it is easier to review smaller batches.

Should I just add everything I have ready in a single PR then?

That's 948 glif files at once, they're all simple polygons, except for the segmented digits and large type pieces.

aaronbell commented 2 months ago

@PhMajerus go for it!

dankamongmen commented 2 months ago

thanks for the detailed response @PhMajerus !

PhMajerus commented 2 months ago

Just to complete, as this PR can be used as reference for changes to perform to add glyphs and one step was missing from the details above:

The mapping to substitute GDI with DWrite versions of glyphs added in features.fea::rclt feature of non-italic fonts and in features/rclt.fea::rclt must also be added in features/rclt_PL.fea::rclt.

See https://github.com/microsoft/cascadia-code/pull/721 for details.