Do código à fonte · Ipak

> As fontes de destaque do Ipak são construídas por programas: tijolos com juntas desencontradas, chanfro do entalhador e luz, serifas em cunha, rastro de uma pena larga. Como cada regra se transforma em letras e como das letras se monta o arquivo da fonte.

[Oʻzbekcha](https://ipak.xronocode.com/maqolalar/from-code-to-font/index.md) · [English](https://ipak.xronocode.com/en/maqolalar/from-code-to-font/index.md) · [Русский](https://ipak.xronocode.com/ru/maqolalar/from-code-to-font/index.md) · [Español](https://ipak.xronocode.com/es/maqolalar/from-code-to-font/index.md) · [Português](https://ipak.xronocode.com/pt/maqolalar/from-code-to-font/index.md) · [中文](https://ipak.xronocode.com/zh/maqolalar/from-code-to-font/index.md)

[Artigos] · [Etapa 3 · Fontes de destaque]

# Do código à fonte

As fontes de destaque do Ipak são construídas por programas: tijolos com juntas desencontradas, chanfro do entalhador e luz, serifas em cunha, rastro de uma pena larga. Como cada regra se transforma em letras e como das letras se monta o arquivo da fonte.

Normalmente, uma fonte é desenhada à mão num editor: o designer coloca pontos e puxa curvas. As fontes de destaque do Ipak — Bannai, Ganch, Metro e Kalam — foram feitas de outro jeito. Cada letra é construída por um pequeno programa em Python segundo uma única regra para a fonte inteira. A regra é uma só, por isso espessuras, cortes e ritmo coincidem em todos os sinais — de A a Ҳ e de 0 a №.

Neste artigo: como é a regra de cada fonte, como das letras desenhadas se monta o arquivo da fonte e onde estão, por enquanto, os limites da versão 0.1.

![Quatro fontes de destaque do Ipak](https://ipak.xronocode.com/images/p/from-code-to-font/four-fonts.png)

*Quatro fontes de destaque do Ipak — Bannai, Ganch, Metro, Kalam. O texto foi digitado com o apóstrofo comum; os sinais ʻ foram colocados pela própria substituição da fonte Ipak; render HarfBuzz (hb-view) das fontes Ipak v0.1; fontes — SIL OFL 1.1 · CC BY 4.0 · Ipak*

## Primeiro o motivo, depois as letras

Cada fonte de destaque começa não pela letra, e sim pelo motivo, reconhecível à primeira vista: o tijolo do bannai, a faca do entalhador de ganch, as letras metálicas do metrô de Tashkent, a pena do kalam (sobre a história dessas técnicas — no artigo «Bannai, ganch, kalam»). O motivo vira regra, e a regra vira o programa que constrói por ela qualquer letra.

Para comparar os motivos em ação, a palavra TOSHKENT foi colocada na foto do aeroporto de Tashkent no lugar do letreiro verdadeiro.

![Quatro motivos sobre a foto do aeroporto de Tashkent](https://ipak.xronocode.com/images/p/from-code-to-font/concepts-sheet.jpg)

*Quatro motivos das fontes de destaque num mockup sobre a foto do aeroporto de Tashkent: bannai, ganch, metro, kalam Foto: Alpasli, Wikimedia Commons; mockup — Ipak · CC BY-SA 4.0 (foto: Alpasli; mockup — Ipak)*

**Nota.** Contorno é a linha fechada que contorna a letra. A fonte guarda as letras justamente como contornos. A unidade da fonte é a milésima parte do corpo (o tamanho da fonte). Nas fontes de destaque do Ipak, a altura da maiúscula é 700 dessas unidades. Os contornos são somados, subtraídos e cruzados com operações booleanas, como num editor gráfico: «unir», «subtrair», «manter o comum». Para isso usa-se a biblioteca aberta skia-pathops.

## Bannai: tijolos com juntas desencontradas

A letra é primeiro registrada como uma imagem de células — linhas de quadradinhos e pontos, como num caderno quadriculado. A maiúscula ocupa 10 fiadas. A célula é quadrada: 70 unidades. O traço tem duas células; o vão interno da letra, no mínimo duas: assim as letras não se fundem à distância.

Depois o programa assenta os tijolos. O tijolo tem duas células, e nas fiadas vizinhas as juntas avançam meio tijolo. É a alvenaria com juntas desencontradas: as juntas de uma fiada não coincidem com as da vizinha. Entre os tijolos resta uma junta de 9 unidades. As diagonais de K, N, Z correm em degraus de alvenaria, não em rampa lisa. Os pontos de Ö, o breve de Ў e o sinal ʻ ficam em fiadas acima da maiúscula; as caudas de Қ Ҳ e as cedilhas de Ş Ç, em fiadas abaixo da linha.

![Ipak Bannai: malha de 10 fiadas, tijolos com juntas desencontradas](https://ipak.xronocode.com/images/p/from-code-to-font/spec-bannai.png)

*Ipak Bannai: letras numa malha de 10 fiadas, tijolos com juntas desencontradas Ipak · CC BY 4.0 · Ipak*

## Ganch: o chanfro do entalhador e a luz

O contorno é construído com retângulos e octógonos. O traço vertical tem 168 unidades; o horizontal, 140: assim eles parecem iguais. As letras «redondas» O, C, G, Q são octógonos.

A última passada é o chanfro do entalhador. O programa percorre o contorno e, em cada ângulo externo que seja reto ou mais agudo (até 100°), apara a ponta: recua 40 unidades ao longo de cada um dos dois lados e liga os pontos com uma reta. No ângulo reto, isso é um corte a 45°. Os ângulos internos permanecem agudos: é por ali que a faca entra. As faces obtusas dos octógonos não são tocadas.

O volume é calculado à parte, a partir da imagem da letra. Para cada ponto interno da letra encontra-se a distância até a borda mais próxima. Resulta um «campo de distâncias»: zero na borda, maior rumo ao meio do traço. Se esse campo for imaginado como altura, sai uma crista no meio do traço e duas encostas para as bordas — o corte em V. Em seguida, o programa vê para onde cada encosta está virada. A encosta voltada para a luz, do alto à esquerda, clareia; a oposta escurece. Por cima acrescenta-se uma sombra suave para baixo e para a direita: a letra salta da parede. Para a parede de pedra, o mesmo campo é invertido, e a letra torna-se uma incisão.

![Ganch: relevo a partir do campo de distâncias](https://ipak.xronocode.com/images/p/from-code-to-font/ganch.png)

*Ipak Ganch: o relevo do corte em V foi calculado a partir do contorno com um campo de distâncias; luz do alto à esquerda Ipak · CC BY 4.0 · Ipak*

**Nota.** Campo de distâncias é um mapa em que, para cada ponto, está registrado o quão longe ele está da borda da figura. Ele é usado em computação gráfica, por exemplo para desenhar texto nítido em jogos. Aqui ele dá o relevo para todos os sinais de uma vez: as faces não são desenhadas à mão para cada letra — uma única função as calcula.

## Metro: maiúsculas finas e serifas em cunha

O modelo é a inscrição «КОСМОНАВТЛАР» na plataforma da estação de 1984 (arquitetos Серго Сутягин e Сергей Соколов). O traço é fino: 48 unidades nas linhas principais, 40 nas horizontais. As letras são largas, cerca de 600 unidades para uma altura de 700.

Nas pontas dos traços, pequenas serifas em cunha. A base da cunha é 40 unidades mais larga que o traço de cada lado; a altura da cunha é 34 unidades, e o topo converge exatamente para as bordas do traço. A palavra é composta com grande espaçamento. O Л, «em casinha», como na estação. O desenho é nosso, pelo princípio; o alfabeto latino foi construído pelo mesmo sistema.

![Ipak Metro: КОСМОНАВТЛАР](https://ipak.xronocode.com/images/p/from-code-to-font/scene-metro.png)

*Ipak Metro: maiúsculas finas e largas com serifas em cunha e grande espaçamento; alfabeto latino e cirílico num só sistema Ipak · CC BY 4.0 · Ipak*

## Kalam: a pena larga em ângulo

Para cada letra define-se um esqueleto — a linha mediana feita de pontos. A pena é um segmento de 150 unidades de comprimento, a 65° em relação à linha. O programa coloca a pena em cada ponto do esqueleto, liga as posições vizinhas num quadrilátero e une todos os quadriláteros. Ninguém define a espessura: ela sai sozinha da direção do traço. A 65°, as horizontais ficam pesadas e as verticais, leves.

Quando o traço corre quase ao longo da pena, ele se afina até virar um fio. Por isso as diagonais se afastam do ângulo da pena em pelo menos 9–10°: assim, a linha mais fina não fica mais estreita que 25 unidades. Todos os sinais — letras, pontos, algarismos, pontuação — são escritos com a mesma pena.

![Ipak Kalam: rastro da pena achatada](https://ipak.xronocode.com/images/p/from-code-to-font/kalam-65.png)

*Ipak Kalam: rastro da pena achatada de 150 unidades de largura a 65° Ipak · CC BY 4.0 · Ipak*

## Os sinais ʻ e ʼ em cada estilo

Os sinais não são tomados prontos das aspas: cada um foi desenhado segundo a regra da sua fonte. Uma coisa é comum: no ʻ a massa fica embaixo, no ʼ, em cima; por isso os silhuetas olham para lados diferentes e não se confundem.

| Fonte | ʻ | ʼ |
| --- | --- | --- |
| Bannai | «seis» de alvenaria: cabeça de 2×2 células embaixo, cauda para cima e para a direita | o mesmo, girado em 180° |
| Ganch | cunha com a massa embaixo, inclinação de 10° | cunha com a massa em cima, inclinação de 23° |
| Metro | cunha com a base embaixo e a ponta para cima e para a direita | cunha com a base em cima e a ponta para baixo e para a esquerda |
| Kalam | gesto da pena: fio de cima para baixo e para a esquerda, embaixo uma volta com pressão | o mesmo gesto, girado em 180° |

É o kerning por medição que aproxima o sinal de O e G (sobre ele, mais abaixo): o ʻ deve ler-se como parte da letra, e não como aspa à parte.

## Da imagem à fonte

Imagem ainda não é fonte. Uma fonte precisa compor letras com as distâncias corretas, conhecer as regras uzbeques e abrir em qualquer programa.

**Nota.** O FontBuilder é parte da biblioteca aberta fontTools. Entregam-se a ele os contornos das letras, as larguras, a tabela «símbolo → letra» e os nomes, e ele monta o arquivo .ttf.

**Montagem.** O programa de cada estilo entrega um dicionário: símbolo, contorno, largura, afastamentos à esquerda e à direita. A montagem converte as curvas para o formato TrueType, uniformiza a direção dos contornos e grava o arquivo pelo FontBuilder. As minúsculas apontam para as mesmas maiúsculas: as fontes são de destaque, para inscrições em maiúsculas. Os caracteres ' ‘ ’ ` digitados no teclado apontam para os sinais ʻ e ʼ.

**Distâncias por medição.** O programa toma um par de letras e mede a distância branca entre elas linha por linha, em toda a altura da maiúscula; os mergulhos profundos são descartados, porque o olho não olha para eles. O padrão de referência é a média dos pares HH, HO, OH e OO da mesma fonte. Cada par é puxado ao padrão, mas apenas pela metade: senão, pares abertos como LT se grudam. Esse ajuste para um par específico de letras chama-se kerning. O alfabeto latino recebe kerning com o alfabeto latino, o cirílico com o cirílico. Os algarismos não recebem kerning, para que as colunas de números permaneçam alinhadas.

**Os sinais ʻ e ʼ, à parte.** O sinal é pequeno e fica no alto, por isso é medido apenas na faixa do sinal — nos 38% superiores da altura da maiúscula (em detalhe, no artigo «A faixa do sinal»). O ʻ fica colado a O e G: 0,45 do vão HH. Depois do ʻ, o vão HH comum. O ʼ fica exatamente no meio: 0,8 do vão dos dois lados.

**Proibição de toques.** Depois de todos os ajustes, o programa verifica o ponto mais estreito do par em toda a altura, incluindo as caudas abaixo da linha. Nenhum par pode chegar a menos de 5% do corpo. O ajuste também é limitado: no máximo 15% do corpo para qualquer lado. Ajustes menores que 20 unidades não são gravados.

**A substituição uzbeque.** As pessoas digitam Oʻzbekiston com o apóstrofo comum. A própria fonte o troca pelo sinal necessário, com uma regra gravada dentro do arquivo; no formato OpenType, essa regra chama-se calt. Depois de O, antes de letra — ʻ. Depois de G — ʻ, inclusive no fim da palavra (BOGʻ), mas não na sequência ng no fim da palavra e não antes de s no fim da palavra (o possessivo inglês 's). Entre duas letras, nos demais casos — ʼ, como em MAʼNO. A lógica é a mesma da fonte de trabalho Ipak Davlat; sobre ela há o artigo «o' → oʻ».

![QOʻNGʻIROQ sem substituição e com substituição](https://ipak.xronocode.com/images/p/from-code-to-font/calt-qongiroq.png)

*A palavra QOʻNGʻIROQ, digitada com o apóstrofo do teclado, no Ipak Metro: em cima, substituição desativada; embaixo, ativada Ipak; render HarfBuzz (hb-view) de IpakMetro-Regular.ttf v0.1; fonte — SIL OFL 1.1 · CC BY 4.0 · Ipak*

No fim, a montagem imprime uma prova: o conjunto inteiro de sinais e as palavras de controle — OʻZBEKISTON RESPUBLIKASI, ҚЎҚОН · ҒАЛЛАОРОЛ · ҲАЁТ, ÖZBEKISTON · TOŞKENT.

![Prova do Ipak Bannai](https://ipak.xronocode.com/images/p/from-code-to-font/bannai-proof.png)

*Prova do Ipak Bannai: o conjunto inteiro de sinais e palavras de controle em três alfabetos Ipak; render HarfBuzz (hb-view); fonte — SIL OFL 1.1 · CC BY 4.0 · Ipak*

## Os limites da versão 0.1

**Só maiúsculas e um único estilo.** As minúsculas são compostas pelas mesmas maiúsculas. Ainda não há pesos.

**O Bannai é para inscrições grandes.** A alvenaria quadrada fica perto de uma fonte pixelada; para placas e corpo pequeno ele não se destina.

**O ângulo da pena do Kalam é a nossa escolha.** Os 65° foram definidos por comparação numa mesma palavra; não é citação de fonte.

**As distâncias foram ajustadas automaticamente.** Para um letreiro, vale conferi-las a olho na palavra específica.

**A substituição não distingue idiomas.** Nas fontes de destaque, a regra funciona para qualquer texto: no inglês DON'T, o apóstrofo também virará ʼ. Para texto não uzbeque, convém desativar a substituição no programa de diagramação.

## O resultado

Em cada uma das quatro fontes de destaque há 94 sinais: alfabeto latino com Ö Ğ Ş Ç, cirílico com Ў Қ Ғ Ҳ, sinais ʻ e ʼ, algarismos e pontuação. Todos foram construídos com uma única regra por fonte e são distribuídos sob a licença aberta SIL OFL 1.1, como toda a biblioteca.

## Fontes

A descrição baseia-se no código de construção das fontes de destaque do Ipak e na documentação das ferramentas: fontTools, skia-pathops, SciPy, HarfBuzz, especificação OpenType; sobre o modelo do Metro — Wikipedia «Kosmonavtlar (Tashkent Metro)».

Links:

fontTools: FontBuilder. [https://fonttools.readthedocs.io/en/latest/fontBuilder/fontBuilder.html](https://fonttools.readthedocs.io/en/latest/fontBuilder/fontBuilder.html)

skia-pathops — operações booleanas sobre contornos. [https://github.com/fonttools/skia-pathops](https://github.com/fonttools/skia-pathops)

SciPy: distance_transform_edt — campo de distâncias. [https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.distance_transform_edt.html](https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.distance_transform_edt.html)

HarfBuzz — motor de composição de texto. [https://harfbuzz.github.io/](https://harfbuzz.github.io/)

OpenType: o recurso calt (Contextual Alternates). [https://learn.microsoft.com/en-us/typography/opentype/spec/features_ae#tag-calt](https://learn.microsoft.com/en-us/typography/opentype/spec/features_ae#tag-calt)

OpenType: o recurso kern (Kerning). [https://learn.microsoft.com/en-us/typography/opentype/spec/features_ko#tag-kern](https://learn.microsoft.com/en-us/typography/opentype/spec/features_ko#tag-kern)

Wikipedia: Kosmonavtlar (Tashkent Metro). [https://en.wikipedia.org/wiki/Kosmonavtlar_(Tashkent_Metro)](https://en.wikipedia.org/wiki/Kosmonavtlar_(Tashkent_Metro))

---
Página: https://ipak.xronocode.com/pt/maqolalar/from-code-to-font/ · SIL Open Font License 1.1 · avenex@xronocode.com
