Mezery mezi znakama

... Petr Blahoš, 22. 10. 2023 Font Python

Dnes opustíme font Roboto, a vezmeme si font Libration Sans. Určitě někde najdete. Pokud máte podobný Linux jako já, bude v /usr/share/fonts/truetype/liberation2/LiberationSans-Regular.ttf. A začneme tím, že si vypíšeme nějaká písmena pomocí naším způsobem z minula (to je černá) a pak pomocí systémové funkce (to je červená).

Porovnání kerningu

Rozdíl vidíte na první pohled. Detailněji zde:

Porovnání kerningu

Kde je ta informace

Někde ve fontu musí být napsané, pro které páry písmen se má použít kerning, a také o kolik se mají posunout. V nejjednodušším případě to bude takto:

    def prepare_kerning(font: TTFont) -> dict:
        pairs = defaultdict(int)
        if not "kern" in font:
            return pairs
        for kern_table in font['kern'].kernTables:
            assert kern_table.version == 0, "kern table version other than 0 not supported"
            pairs.update(kern_table.kernTable)
        return pairs

Všimněte si kontroly na formát tabulky. Momentálně existují 4 formáty, svým způsobem dobrá zpráva je, že MS Windows podporují jen formát 0. To znamená, že Váš font bude pravděpodobně mít jen tento formát.

Dobrá. Tímto jsme získali seznam párů znaků (spíše glyphů) a jejich posunutí. To znamená, že kdykoliv vykreslujeme glyph, podíváme se, jaký glyph jsme vykreslili před ním, a pokud je tato dvojice v tabulce, posuneme.

Kód

Pokud bychom něco přidali do kódu z minula, dostaneme:

        m = gc.CreateMatrix()
        m.Translate(0, height // 2)
        m.Scale(scale, -scale)

        last = None
        cmap = self.font['cmap'].getBestCmap()
        for unicode in t:
            glyph_name = cmap.get(ord(unicode))
            if not glyph_name:
                glyph_name = ".notdef"
            m.Translate(self.kerning_pairs[last, glyph_name], 0)
            glyph = self.draw_glyph(gc, glyph_name, m, wx.BLACK_BRUSH)
            m.Translate(glyph.width, 0)
            last = glyph_name

A obrázek porovnání všech tří textů, kde červený je text vykreslený systémem, modrý je náš bez kerningu, černý je s kerningem, vypadá takto:

Tři varianty

Když je vykreslíme přes sebe, tak původní, červená, skoro zmizí, což znamená, že jsme se trefili přesně.

Přes sebe

Cvičení pro zájemce:

  • Zkuste si i jiné fonty.
  • Zjistěte, proč jsme tuhle akci neprováděli s fontem Roboto.

Kompletní kód je zde.

Varování

Nerad bych, abyste získali dojem, že práce s fontem je takhle jednoduchá. Jak jste viděli u tabulky kern, může mít čtyři formáty. Kromě toho, tabulek s kerningem může být ve fontu i více. Mám dojem, že snad může být i vertikální kerning. Taky mám dojem, že nějaké informace o kerningu můžou být i v jiných tabulkách. A to je jen kerning. Jestliže máte volný půlrok a pevné nervy, přečtěte si něco o formátu ttf, třeba zde:

Co příště

Bude to zajímavější. Podíváme se trochu víc na tvary glyphů.


Komentáře byly zrušeny
V EU teď máme složitou situaci s Cookies. Na komentáře jsem používal jistou službu třetí strany. Ta však používá Cookies poměrně, ehm, benevolentně. Tak jsem se rozhodl komentáře zrušit. Pokud chcete, můžete mi napsat přímo