HNNewShowAskJobs
Built with Tanstack Start
Text rendering hates you(faultlore.com)
89 points by andsoitis 6 days ago | 27 comments
  • Karliss3 hours ago

    Few more additional ones, more about editing than just rendering:

    The style change mid ligature has a related problem. While it might be reasonable not to support style change in the middle of ligature, you still want to select individual letters within ligatures like "ff", "ffi" and "fl". The problem just like with color change is that neither the text shaper nor program rendering text knows where each individual letter within ligature glyph is positioned. Font simply lacks this information.

    From what I have seen most programs which support it use similar approximation as what Firefox uses for coloring - split the ligature into equal parts. Works good enough for something like "fi", "fl" not so much for some of ligatures within programming fonts that combine >= into ≥.

    There are even worse edge cases in scripts for other languages. There are ligatures which look roughly like the 2 characters which formed it side by side but in reverse order. There are also some ligatures in CJK fonts which combine 4 characters in a square.

    Backspace erases characters at finer granularity than it's possible to select them.

    With regards to LTR/RTL selection weirdness I recently discovered that some editors display small flag on the cursor displaying current position direction when it's in mixed direction text.

  • Dwedit8 minutes ago

    "Subpixel offsets break glyph caches"

    I once resolved that by keeping a vertically shrunken but really wide glyph around in a cache. Just resample it for a different horizontal offset.

  • gnabgib6 days ago

    (2019) Popular in:

    2023 (290 points, 119 comments) https://news.ycombinator.com/item?id=36478892

    2022 (399 points, 154 comments) https://news.ycombinator.com/item?id=30330144

    2019 (542 points, 170 comments) https://news.ycombinator.com/item?id=21105625

  • jesse__4 hours ago

    The ligatures part of this article gets me every time I re-read it. I think reading this article may have been the first time I realized that even large, well-funded projects are still done by people who are just regular humans, and sometimes settle for something that's good enough.

  • thot_experiment4 hours ago

    I've tried to ask this before in various contexts and I've never been able to find an answer but maybe commenters on a post like this would know.

    I like the way that the CJK fonts render without anti-aliasing on windows. I want to know why and how to cause windows to render a non-cjk font of my choosing in this aliased style. I am not opposed to hex-editing or otherwise modifying the font if that's necessary. I've never been able to find information bout the mechanism or how it's triggered.

    • Permik3 hours ago |parent

      Just disable ClearType and all your text will be uniform :)

      • thot_experiment2 hours ago |parent

        Well that's not what I want, I want to specifically prevent some passages in text from being rendered as anti-aliased for art reasons.

        • bawolffan hour ago |parent

          At some point, if you're doing it for art reasons, it makes the most sense to just render to an image.

          • thot_experiment40 minutes ago |parent

            right, i can solve this okay by rendering an image and then putting transparent text over it in order to preserve editability, but it's such a pain in the ass, and i know windows is capable of doing it because it does do it, i'm not looking for a solution, i want to understand a facet of windows font rendering

  • charcircuit2 hours ago

    >But if the transform is an animation this will actually look even worse

    I wish they provided an example video of this since I can't visualize it. My natural thinking is subpixel antialiasing should look fine.

    >the characters will jiggle as each glyph bounces around between different subpixel snappings and hints on each frame.

    This shouldn't be a big issue unless your animation is slow and your subpixels are big.

    • akdor1154an hour ago |parent

      The issue (i think) is that the animation is done post-rasterizing. So a translate of integer pixels is fine, but scale? Skew? Suddenly you have really visible colour fringing appearing out of nowhere.

  • xg153 hours ago

    > Don’t ask about the code which line-breaks partial ligatures though.

    Wondered about this. All the circular dependencies sound like you could feasibly get some style/layout combinations that lead to self-contradictory situations.

    E.g. consider a ligature that's wider than the characters' individual glyphs. If the ligature is at the end of the box, it could trigger a line break. But that line break would also break up the ligature and cause the characters to be rendered as individual glyphs, reducing their width - which would undo the line break. But without the line break, the ligature would reconnect, increase the width and restore the line break, etc etc...

    • bfgeekan hour ago |parent

      Blink's (Chromium) text layout engine works the following way.

      1. Layout the entire paragraph of text as a single line.

      2. If this doesn't fit into the available width, bisect to the nearest line-break opportunity which might fit.

      3. Reshape the text up until this line-break opportunity.

      4. If it fits great! If not goto 2.

      This converges as it always steps backwards, and avoids the contradictory situations.

      Harfbuzz also provides points along the section of text which is safe to reuse, so reshaping typically involes only a small portion of text at the end of the line, if any. https://github.com/harfbuzz/harfbuzz/issues/224

      This approach is different to how many text layout engines approach this problem e.g. by adding "one word at a time" to the line, and checking at each stage if it fits.

      • nicoburnsan hour ago |parent

        > This approach is different to how many text layout engines approach this problem e.g. by adding "one word at a time" to the line, and checking at each stage if it fits.

        Do you know why Chrome does it this way?

  • tankenmate2 hours ago

    Hmm I use Firefox and the rendering I see in Firefox looks nothing like the render the author gets in Firefox; in fact the text rendering I get looks very similar to the "Chrome" rendering. Obviously this must depend on the libraries linked during the build process.

    • Denvercoder92 hours ago |parent

      The article is from 2019, things might also simply have changed since then.

    • kg2 hours ago |parent

      Depending on your OS Firefox will select from multiple rendering backends based on your GPU, driver etc.

      On Windows it may or may not be using DirectWrite for text rasterization as a general thing, and in some cases text might be rasterized using a different fallback path if DirectWrite can't handle the font, I think.

      IIRC this was/is true for Chrome as well, where in some cases it software rasterizes text using Skia instead of calling through to the OS's font implementation.

      • nicoburnsan hour ago |parent

        IIRC, Chrome now uses CoreText/DirectWrite for system fonts on macOS/Windows, and Skrifa (FreeType rewritten in Rust) outlines rasterized with Skia for everything else (system fonts on Linux, web fonts on all platforms).

        I believe Firefox leans on the system raserizers a little more heavily (using them for everything they support), and also still uses FreeType on Linux.

  • socalgal23 hours ago

    And the companion article: https://lord.io/text-editing-hates-you-too/

    (posted in other other threads too)

  • shmerlan hour ago

    > So subpixel-AA is a really neat hack that can significantly improve text legibility, great! But, sadly, it’s also a huge pain in the neck!

    Especially when you have a monitor with unusual subpixel layout, which is very common for OLEDs that don't have any standard for it. In practice, developers of common font libraries like FreeType simply didn't bother with trying to support all that. And that trickles down to toolkits like Qt. Surprising the article doesn't mention this major problem with modern displays.

    > Retina displays really don’t need it

    Assuming this means high resolution displays - unfortunately that's not always what you end up using. So subpixel antialiasing can still be useful, if it can work. But as above, it's often just broken on OLEDs.

  • djaouen2 hours ago

    Good. I hated it first!

  • lovich2 hours ago

    How did they get the exact effect to show what they want in the text here instead of say, me seeing the exact same visuals for each browser as I am reading it from a single browser?

    • zerocrates2 hours ago |parent

      You mean in the parts that say "Here's what they look like in Safari" and so on? Those are just .pngs.

      • lovich11 minutes ago |parent

        I missed some UI improvement in browsers then as I can copy and paste them as text, and even the italic emoji example carried over the italic information when I tried copying it into various editors.

  • casey23 hours ago

    The real takeaway from the article is that you can rathole forever on ill-defined problems. Decide upfront whether you care about actual humans and their usecases or hypothetical humans and their hypothetical usecases.

    • PKop2 hours ago |parent

      Or even, which subset of humans' uses cases you wish to concern yourself with as you can't always please everyone or tackle everyone's problems. If one only cared about a single language everything becomes much easier.

      • nicoburnsan hour ago |parent

        > If one only cared about a single language everything becomes much easier.

        Yes. Let's be thankful that isn't the case for browsers and major GUI toolkits though.