Cosa c’è in un file ttf
I circuiti interni di un computer sono composti di tanti interruttori che possono avere solo due posizioni, 1 e 0. Quindi un qualsiasi file è una lunghissima sequenza di 1 e di 0. Ad esempio l’inizio del Times New Roman, in codice binario, è questo: 00000000000000010000000000000000000000000001100100000001000...
Ma tutto questo agli occhi del programmatore non dice assolutamente niente. Perché il programmatore è abituato a ragionare in esadecimale. Significa che queste cifre vanno prese a gruppi di 4 e sostituite con una cifra da 0 a 9 o una lettera da A a F (0000=0, 0001=1... fino a 1110=E e 1111=F). Quindi, scritto in esadecimale, il Times New Roman comincia così: 00010000001901000004009044534947E78F10DA000F3F2C00001ADC47444546B9EBBCC6000DC378...
Ma anche da qui si capisce ben poco. L’unità di misura dell’informatica è il byte, che comprende 8 bit. Visto che ogni cifra esadecimale comprende quattro bit, ogni byte è indicato da due cifre esadecimali. Quindi il Times, scritto un byte alla volta, verrebbe così: 00 01 00 00 00 19 01 00 00 04 00 90 44 53 49 47 E7 8F 10 DA 00 0F 3F 2C 00 00 1A DC 47 44 45 46 B9 EB BC C6 00 0D C3 78 00 00 03 1C 47 50 4F 53 CE 94 6D 90 00 0D C6 94 00 01 12 32 47 53 55 42 C8 A0 31 B9 00 0E D8 C8 00 00 65 DE 4A 53 54 …
Ognuna di queste combinazioni di due cifre esadecimale occupa un byte di memoria, e corrisponde a un numero compreso tra 0 e 255 (00=0, 01=1 … fino a FE=254, FF=255). Quindi quei codici corrispondono a questi numeri interi: 0 1 0 0 0 25 1 0 0 4 0 144 68 83 73 71 231 143 16 218 0 15 63 44 0 0 26 220 71 68 69 70 185 235 188 198 0 13 195 120 0 0 3 28 71 80 79 83 206 148 109 144 …
A loro volta questi numeri potrebbero corrispondere lettere dell’alfabeto o segni tipografici (65=A maiuscola, 66=B, 67=C; le minuscole cominciano da 97=a fino a 122=z, eccetera). Per cui il Times New Roman inizierebbe con una specie di: ------------DSIGç--Ú-------ÜGDEF-ë-Æ--Ãx----GPOSÎ-m---Æ-----GSUBÈ-----ØÈ--eÞJSTFm-i---------LTSH---s (in cui i numeri a cui non corrisponde nessuna lettera dell’alfabeto li abbiamo sostituiti con dei trattini).
Ok, ma tutti questi numeri, o lettere, che cosa rappresentano? Nel file non c’è scritto. Il file rappresenta solo l’elenco delle risposte che vengono date a un software che pone delle domande ben precise, interpretando le risposte come numeri o lettere a seconda delle esigenze.
La guida di riferimento è stata pubblicata nel dettaglio sul sito della Apple. Il testo è in inglese, e richiede ore e ore di studio. Qui provo a dare una vaga infarinatura, tanto per rendere l’idea di quanto è complicato il tutto.
Un file .ttf (TrueType Font) è composto da varie tabelle. Ogni tabella ha una funzione ben precisa: c’è quella con l’elenco dei caratteri, quella con l’elenco dei punti che compongono ogni carattere, quella che contiene il nome e la famiglia del font in questione, eccetera. Alcune sono obbligatorie in ogni file di font, altre sono facoltative. Alcune servono per individuare la posizione delle altre, visto che in mezzo ai bit non si può tirare una riga tra due serie di dati, come si farebbe su un normale foglio.
Ogni tabella è composta da una sequenza di dati di una lunghezza ben precisa, stabilita o dallo standard, o da quanto scritto in un altra tabella, o in una parte della tabella stessa.
Il software che deve andare a utilizzare il file, prende a occhi chiusi i primi 12 byte della serie, che forniscono le istruzioni per formare un indice delle tabelle di cui è composto il file.
I primi quattro rappresentano lo scaler type, due indicano il numero delle tabelle, due il search range, due l’entry selector, due il range shift.
L’unico dato che si capisce al volo è il secondo: il numero delle tabelle.
Diamo di nuovo un’occhiata alle prime 12 cifre del file del Times New Roman:
Il numero di tabelle è determinato da due byte (numTables). Il valore del primo va moltiplicato per 256 (ma in questo caso è 0, quindi anche il risultato è 0). Bisogna poi sommarlo al secondo, che è 25, in numeri decimali. Ne consegue che in questo caso il risultato è 25. Il Times New Roman è composto da 25 tabelle. Ad ognuna delle quali corrispondono 16 byte nella table directory del file. I primi quattro di ogni serie sono lettere, e rappresentano il nome del file (o tag). Gli altri vanno interpretati come numeri.
Quindi, subito dopo avere preso i primi 12 byte del file, il software sa che per 25 volte deve prendere i successivi gruppi di 16 byte ciascuno. Questo è il risultato.
I primi quattro byte di ogni riga rappresentano il nome della tabella. Gli altri rappresentano dei numeri (qui in notazione esadecimale, due cifre per ogni byte): quattro byte per la checksum, 4 per il punto in cui inizia la tabella (il numero del primo byte della tabella), quattro per la lunghezza della tabella stessa.
Quella che ci interessa qui si chiama cmap. Vediamo la riga nel dettaglio, tradotta in lettere e numeri decimali.
Il nome della tabella, cmap, sta per characher map, ovvero mappa dei caratteri. La tabella infatti contiene l’elenco di tutti i caratteri di cui è composto il font. Dopo i quattro byte del nome, altri quattro byte rappresentano un’informazione tecnica che al momento non ci interessa.
Gli altri due gruppi da quattro rappresentano due informazioni importanti per trovare il contenuto della tabella: dove si trova, e quanto spazio occupa.
Per passare da quattro byte a un numero decimale bisogna moltiplicare per potenze di 256 (visto che in ogni byte ci sono 8 bit e 256=2 elevato all’ottava potenza).
Quindi: offset = 0*256^3+1*256^2+233*256+8 = 0+65536+59648+8 = 125192. Questo è il punto di partenza. Cioè il primo byte della tabella cmap è il numero 125192 dello stesso file (il file del Times New Roman occupa 982 kilobyte, cioè oltre un milione di byte).
La lunghezza la otteniamo dagli ultimi 4 byte: 0+0+38*256+54 = 9728+54 = 9782.
Ok, dal byte numero 125 mila e rotti, e per oltre 9 mila byte c’è la tabella cmap. Ma che ci sarà mai in questa tabella?
Come prima: è tutto stabilito dal manuale di riferimento. Due byte per il numero della versione, due per le sottotabelle (una per ogni piattaforma: Unicode, Macintosh, Windows).
Segue l’intestazione di ogni sottotabella, che ha due byte per l’id della piattaforma, due per un id specifico, e quattro per l’offset, cioè il byte da cui iniziare a leggere i dati.
E come sono questi dati? Due byte per il formato, due per la lunghezza, due per il linguaggio...
Insomma, lo schema è sempre lo stesso. Alcuni byte stabiliscono la lunghezza della sottotabella e il numero dei segmenti di cui è composta, altri invece stabiliscono il codice iniziale e finale di ognuno dei segmenti.
Ma che sono questi segmenti? Invece di mettere un numero per ogni lettera presente nel font, è stato scelto di mettere solo il codice del primo e l’ultimo carattere di ciascun gruppo contiguo. Cioè, se io volessi fare un font solo con le lettere “abcxyz”, dovrei spiegare che sto inserendo due gruppi di lettere, quelle dalla “a” alla “c” e quelle dalla “y” alla “z”. Se voglio aggiungerci anche la “f”, devo scrivere che ci ho aggiunto un gruppo che va dalla “f” alla “f”. Uhm.
A complicare ulteriormente le cose, come se già non fossero abbastanza complicate, c’è la regola per cui prima vanno messi i codici numerici di tutti i caratteri finali di ogni segmento, poi due byte vuoti (impostati a zero), poi tutti i codici numerici dei caratteri iniziali di ogni segmento, e poi altre informazioni per ciascun segmento, eccetera.
In linguaggio umano possiamo riassumere così: il Times New Roman è composto di 156 segmenti: nel primo ci sono i glifi dal 32 al 126 (dallo spazio alla tilde, passando per cifre, maiuscole, minuscole e punteggiatura). Nel secondo ci sono i caratteri dal 160 al 511 (il settore latino esteso, con le lettere accentate). Nel terzo le lettere dalla 545 alla 601 (latino esteso ed estensioni fonetiche). E così via. La somma di tutti questi segmenti è ciò che possiamo vedere nella schermata inserisci/caratteri speciali del nostro word processor.
Nel solo Times New Roman sono presenti 3120 glifi, tra lettere, punteggiatura, simboli, lettere accentate, alfabeto arabo, cirillico, ebraico, armeno, greco, disegno caselle, caratteri speciali, eccetera. Sembrano tanti, ma l’Arial Unicode ne contiene molti di più (cinese, tamil, tibetano, indiano...)
Se pensate che sia complicato arrivare fin qui, a ottenere solo l’elenco dei glifi presenti nel font, immaginate che deve essere nelle altre tabelle, dove ci sono le istruzioni per disegnare ciascuno di questi glifi (ognuno dei quali è composto di punti all’estremità di ogni linea, punti di controllo, distanze, regole relative al kerning, e chi più ne ha più ne metta).
Ma tutto questo agli occhi del programmatore non dice assolutamente niente. Perché il programmatore è abituato a ragionare in esadecimale. Significa che queste cifre vanno prese a gruppi di 4 e sostituite con una cifra da 0 a 9 o una lettera da A a F (0000=0, 0001=1... fino a 1110=E e 1111=F). Quindi, scritto in esadecimale, il Times New Roman comincia così: 00010000001901000004009044534947E78F10DA000F3F2C00001ADC47444546B9EBBCC6000DC378...
Ma anche da qui si capisce ben poco. L’unità di misura dell’informatica è il byte, che comprende 8 bit. Visto che ogni cifra esadecimale comprende quattro bit, ogni byte è indicato da due cifre esadecimali. Quindi il Times, scritto un byte alla volta, verrebbe così: 00 01 00 00 00 19 01 00 00 04 00 90 44 53 49 47 E7 8F 10 DA 00 0F 3F 2C 00 00 1A DC 47 44 45 46 B9 EB BC C6 00 0D C3 78 00 00 03 1C 47 50 4F 53 CE 94 6D 90 00 0D C6 94 00 01 12 32 47 53 55 42 C8 A0 31 B9 00 0E D8 C8 00 00 65 DE 4A 53 54 …
Ognuna di queste combinazioni di due cifre esadecimale occupa un byte di memoria, e corrisponde a un numero compreso tra 0 e 255 (00=0, 01=1 … fino a FE=254, FF=255). Quindi quei codici corrispondono a questi numeri interi: 0 1 0 0 0 25 1 0 0 4 0 144 68 83 73 71 231 143 16 218 0 15 63 44 0 0 26 220 71 68 69 70 185 235 188 198 0 13 195 120 0 0 3 28 71 80 79 83 206 148 109 144 …
A loro volta questi numeri potrebbero corrispondere lettere dell’alfabeto o segni tipografici (65=A maiuscola, 66=B, 67=C; le minuscole cominciano da 97=a fino a 122=z, eccetera). Per cui il Times New Roman inizierebbe con una specie di: ------------DSIGç--Ú-------ÜGDEF-ë-Æ--Ãx----GPOSÎ-m---Æ-----GSUBÈ-----ØÈ--eÞJSTFm-i---------LTSH---s (in cui i numeri a cui non corrisponde nessuna lettera dell’alfabeto li abbiamo sostituiti con dei trattini).
Ok, ma tutti questi numeri, o lettere, che cosa rappresentano? Nel file non c’è scritto. Il file rappresenta solo l’elenco delle risposte che vengono date a un software che pone delle domande ben precise, interpretando le risposte come numeri o lettere a seconda delle esigenze.
La guida di riferimento è stata pubblicata nel dettaglio sul sito della Apple. Il testo è in inglese, e richiede ore e ore di studio. Qui provo a dare una vaga infarinatura, tanto per rendere l’idea di quanto è complicato il tutto.
Un file .ttf (TrueType Font) è composto da varie tabelle. Ogni tabella ha una funzione ben precisa: c’è quella con l’elenco dei caratteri, quella con l’elenco dei punti che compongono ogni carattere, quella che contiene il nome e la famiglia del font in questione, eccetera. Alcune sono obbligatorie in ogni file di font, altre sono facoltative. Alcune servono per individuare la posizione delle altre, visto che in mezzo ai bit non si può tirare una riga tra due serie di dati, come si farebbe su un normale foglio.
Ogni tabella è composta da una sequenza di dati di una lunghezza ben precisa, stabilita o dallo standard, o da quanto scritto in un altra tabella, o in una parte della tabella stessa.
Il software che deve andare a utilizzare il file, prende a occhi chiusi i primi 12 byte della serie, che forniscono le istruzioni per formare un indice delle tabelle di cui è composto il file.
I primi quattro rappresentano lo scaler type, due indicano il numero delle tabelle, due il search range, due l’entry selector, due il range shift.
L’unico dato che si capisce al volo è il secondo: il numero delle tabelle.
Diamo di nuovo un’occhiata alle prime 12 cifre del file del Times New Roman:
Quindi, subito dopo avere preso i primi 12 byte del file, il software sa che per 25 volte deve prendere i successivi gruppi di 16 byte ciascuno. Questo è il risultato.
I primi quattro byte di ogni riga rappresentano il nome della tabella. Gli altri rappresentano dei numeri (qui in notazione esadecimale, due cifre per ogni byte): quattro byte per la checksum, 4 per il punto in cui inizia la tabella (il numero del primo byte della tabella), quattro per la lunghezza della tabella stessa.
Quella che ci interessa qui si chiama cmap. Vediamo la riga nel dettaglio, tradotta in lettere e numeri decimali.
Il nome della tabella, cmap, sta per characher map, ovvero mappa dei caratteri. La tabella infatti contiene l’elenco di tutti i caratteri di cui è composto il font. Dopo i quattro byte del nome, altri quattro byte rappresentano un’informazione tecnica che al momento non ci interessa.
Gli altri due gruppi da quattro rappresentano due informazioni importanti per trovare il contenuto della tabella: dove si trova, e quanto spazio occupa.
Per passare da quattro byte a un numero decimale bisogna moltiplicare per potenze di 256 (visto che in ogni byte ci sono 8 bit e 256=2 elevato all’ottava potenza).
Quindi: offset = 0*256^3+1*256^2+233*256+8 = 0+65536+59648+8 = 125192. Questo è il punto di partenza. Cioè il primo byte della tabella cmap è il numero 125192 dello stesso file (il file del Times New Roman occupa 982 kilobyte, cioè oltre un milione di byte).
La lunghezza la otteniamo dagli ultimi 4 byte: 0+0+38*256+54 = 9728+54 = 9782.
Ok, dal byte numero 125 mila e rotti, e per oltre 9 mila byte c’è la tabella cmap. Ma che ci sarà mai in questa tabella?
Come prima: è tutto stabilito dal manuale di riferimento. Due byte per il numero della versione, due per le sottotabelle (una per ogni piattaforma: Unicode, Macintosh, Windows).
Segue l’intestazione di ogni sottotabella, che ha due byte per l’id della piattaforma, due per un id specifico, e quattro per l’offset, cioè il byte da cui iniziare a leggere i dati.
E come sono questi dati? Due byte per il formato, due per la lunghezza, due per il linguaggio...
Insomma, lo schema è sempre lo stesso. Alcuni byte stabiliscono la lunghezza della sottotabella e il numero dei segmenti di cui è composta, altri invece stabiliscono il codice iniziale e finale di ognuno dei segmenti.
Ma che sono questi segmenti? Invece di mettere un numero per ogni lettera presente nel font, è stato scelto di mettere solo il codice del primo e l’ultimo carattere di ciascun gruppo contiguo. Cioè, se io volessi fare un font solo con le lettere “abcxyz”, dovrei spiegare che sto inserendo due gruppi di lettere, quelle dalla “a” alla “c” e quelle dalla “y” alla “z”. Se voglio aggiungerci anche la “f”, devo scrivere che ci ho aggiunto un gruppo che va dalla “f” alla “f”. Uhm.
A complicare ulteriormente le cose, come se già non fossero abbastanza complicate, c’è la regola per cui prima vanno messi i codici numerici di tutti i caratteri finali di ogni segmento, poi due byte vuoti (impostati a zero), poi tutti i codici numerici dei caratteri iniziali di ogni segmento, e poi altre informazioni per ciascun segmento, eccetera.
In linguaggio umano possiamo riassumere così: il Times New Roman è composto di 156 segmenti: nel primo ci sono i glifi dal 32 al 126 (dallo spazio alla tilde, passando per cifre, maiuscole, minuscole e punteggiatura). Nel secondo ci sono i caratteri dal 160 al 511 (il settore latino esteso, con le lettere accentate). Nel terzo le lettere dalla 545 alla 601 (latino esteso ed estensioni fonetiche). E così via. La somma di tutti questi segmenti è ciò che possiamo vedere nella schermata inserisci/caratteri speciali del nostro word processor.
Nel solo Times New Roman sono presenti 3120 glifi, tra lettere, punteggiatura, simboli, lettere accentate, alfabeto arabo, cirillico, ebraico, armeno, greco, disegno caselle, caratteri speciali, eccetera. Sembrano tanti, ma l’Arial Unicode ne contiene molti di più (cinese, tamil, tibetano, indiano...)
Se pensate che sia complicato arrivare fin qui, a ottenere solo l’elenco dei glifi presenti nel font, immaginate che deve essere nelle altre tabelle, dove ci sono le istruzioni per disegnare ciascuno di questi glifi (ognuno dei quali è composto di punti all’estremità di ogni linea, punti di controllo, distanze, regole relative al kerning, e chi più ne ha più ne metta).
Commenti
Posta un commento