Repository navigation
v0.6.0
CrossGlyph 0.6.0
Arabic is the headline. A modern Arabic face used to build into a page of blanks, and now it builds into joined text with no setting to find. Alongside it, the preview stopped being able to show you a page the built font would not carry, and the size boxes stopped accepting sizes you could never have looked at.
Arabic that comes out joined
Arabic is written joined up, so a letter takes a different shape depending on where it sits in a word. CrossPoint picks the shape and then looks it up by a codepoint of its own, because it has no room on the device for the rule engine a font's joining rules need. Fonts split into two camps on this. Older ones store every shape under its own codepoint, which is what the device expects. Newer ones, and most good Arabic faces today, store one shape plus the rules, and the device finds nothing where it looks. Scheherazade New and Readex Pro are in the second camp, and until now they drew a page of blanks.
The rules are run here instead, once, while the font is built, and each resulting shape is stored where the device will ask for it. It is automatic, there is no setting, and it works with any Arabic face. Where a face spells a letter as a base plus a separate mark, which is how the alef with hamza and the alef with madda are usually drawn, the pieces are combined into one picture first. Lam-alef is resolved as a pair as well as letter by letter, because the device asks for that ligature by its own codepoint and without it ordinary prose has a hole at every "wala".
The one thing to do yourself is put arabic in intervals, exactly as you would for Greek or Cyrillic. It is the choice to carry Arabic at all and it costs file size, so it is not assumed, and reading on its own contains no Arabic whatsoever. Asking for the letters is enough: the shapes they are drawn by follow from the letters and are added for you. A face named in fallback 1 is repaired the same way, so a Latin family that borrows its Arabic from one still gets joined text.
The bundled fallback set gains Noto Sans Arabic, which makes thirteen faces. Upstream's folder does not carry one, so that face is fetched from the project that publishes it, and a workspace filled before this release has every other face and not this one; its absence is not an error. There is an Arabic sample in the text picker too, built the way every other preset is: the pangram the firmware itself shows under Settings > Font, then Article 1 of the Universal Declaration, then a paragraph of Arabic-Indic digits, because the English tail's digits are Latin and say nothing about whether a face carries the other ten.
A build records what it repaired, under synthesized in .crossglyph.json, so a font never carries shapes that nothing in the workspace explains.
The preview draws what a build of this coverage would draw
The page used to be sized to the text and nothing else, so it drew characters the built font would not carry. Untick a range, see no change, build, and find out on the device. That is the one thing a preview must not do. It is still sized to the text, which is what keeps it to a few dozen glyphs per keystroke, and it is now also narrowed to what the coverage would build, so the two cannot disagree.
A blank page needs an answer rather than an apology, so the note under the text counts the characters and names the preset that would carry them, and that preset's own tick is marked in the coverage row: the answer is where the answer gets applied. Nothing is ticked for you, since coverage decides what a build writes. The marks name every move in the chain one at a time, the coverage tick first, then bundled fallback faces, then Fetch when those faces are not on disk, and nothing is marked once the box is on and the faces are here, because no control on the panel fixes that. Naming a family in fallback 1 is offered throughout as the other answer.
The warning itself is louder: a filled mark, a ground and a rule. It lives inside the Text fold, and that fold is shut, so the folded heading now carries the same mark.
Fractional point sizes you can actually reach
A fractional size has built correctly for a long time: 13.25 is rasterized at 13.25 and shipped as Family_13, because the device parses the size out of the filename and cannot hold a fraction there. What was missing was every way of finding that out.
The export panel's size boxes were free text with no rules at all, so the size knob snapped to a quarter point and the box beside it took 13.3, or 13.256, or 200. They now take the same quarter points over the same 6 to 40 range, snapped when you leave the box rather than while you are still typing. Step the knob until 13.25 looks better than 13, then put 13.25 in the box.
A line under the boxes says what a fractional size will be called on the card, and turns into a warning when two of them land on the same name. Quarter points make that easy to walk into, since 13.5 and 13.75 are both 14. A comma is a decimal point in one of those boxes, because each holds a single size and that is what a Russian or German layout types; in more sizes, which is a list, it still separates one size from the next. On the command line, --list and the line each size prints as it is built now name the label when it differs from the size.
The export panel has a foot of its own
Both columns end in the same bar now. Build, Build all and a badge moved into the export panel's own foot, with the progress rule and one line of status inside it. A build used to shift the save bar down 53px; the foot measures 88px at every sample from the first press to the last, and only an error grows it. Save left the export tab, because a build writes the .conf before it starts and a second button for the first half of that is one to press by mistake. The tabs say what a lit Save used to: a dot on Tune for an unsaved knob, a dot on Export for an unsaved setting, and never about the panel you are looking at.
Fixed
- A glyph over 255 pixels on either side had nowhere to go in the
.cpfontformat, and the packer failed the whole family naming no codepoint. It is skipped with a warning that names the codepoint and its measured size instead. One glyph reaches this in practice: the bismillah at U+FDFD, an entire phrase drawn as one ornament, which passes the limit at about 12.6 pt. - Unsorted coverage packed without complaint into a file the render core rejects with nothing to say about why. The interval table is searched as though it ascends, so it is normalized on the way in.
- A face reaching the kern feature through mark attachment logged a line per subtable. Scheherazade has ninety-three of them and the preview rebuilds on every keystroke, so a render buried its own output. One Scheherazade render went from 107 lines to 14.
- Typing into the extra ranges field returned an error per keystroke, because the field holds half a range for as long as it takes to type one. A token that does not parse is simply not in force yet.
- Naming the preset that would carry a missing character cost 3.46 ms on every render of a page with nothing wrong with it, most of it listing the twenty thousand codepoints of a CJK block nobody had asked about.
- A size was spelled back with six significant digits, so a config saying 13.4999999 filled the box with 13.5 and a save moved the size. It now prints the shortest string that parses back to the same number.
- A coverage tick only redrew the page while the bundled faces were on, so the note said tick Arabic, you ticked Arabic, and the page sat there.
- Arabic supplied by a fallback face was left out of the provenance count, and a shaped advance is now rounded the way FreeType rounds, so Arabic is spaced like every other script in the same font.
Upgrading
Installs check for updates on their own; Check now in the island under the specimen does it immediately. Nothing in a workspace changes format, so an existing fonts folder and its configs are read as they were. Rebuild any family carrying Arabic to pick up the joined shapes.
