Mezery mezi znakama
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á).
Rozdíl vidíte na první pohled. Detailněji zde:
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:
Když je vykreslíme přes sebe, tak původní, červená, skoro zmizí, což znamená, že jsme se trefili přesně.
Cvičení pro zájemce:
- Zkuste si i jiné fonty.
- Zjistěte, proč jsme tuhle akci neprováděli s fontem Roboto.
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