Aller au contenu

Lire des fichiers de police

phil/fonts

Fichiers et formats

FontFile::fromBytes(string $bytes, ?Closure $brotli = null) et FontFile::fromFile(string $path, ?Closure $brotli = null) lisent un fichier et en tirent :

PropriétéCe qu'elle contient
formatLe conteneur, un Format
facesLes faces du fichier, jamais vide : une seule, ou plusieurs pour une collection
sha256Le SHA-256 des octets du fichier, en hexadécimal
extendedMetadataLe XML des métadonnées étendues d'un fichier WOFF ou WOFF2, décompressé, ou null

face(int $index = 0) donne une face, et lance InvalidFont pour un indice que le fichier n'a pas.

FormatSignatureRemarques
TrueType00 01 00 00 ou trueDes contours TrueType, ou aucun
OpenTypeOTTODes contours PostScript (CFF)
CollectionttcfChaque face lue, chacune avec ses propres tables
WoffwOFFChaque table décompressée avec zlib jusqu'à la longueur qu'elle déclare, ou gardée telle quelle lorsqu'elle est stockée sans compression
Woff2wOF2Toutes les tables décompressées ensemble au moyen du décompresseur Brotli fourni

Chaque valeur de Format est le mot-clé de la fonction CSS format(). La bibliothèque lit dans les tables ce dont elle a besoin et vérifie chaque lecture par rapport à la fin de sa table : un fichier tronqué, une table hors du fichier, un bloc WOFF qui ne se décompresse pas à la longueur déclarée ou un bloc Brotli de mauvaise longueur lance InvalidFont.

Les fichiers de polices sont souvent téléversés : le travail qu'un fichier peut causer est donc borné, et un fichier qui dépasse une limite lance InvalidFont :

LimiteValeur
Le fichier32 Mio
Les tables que liste une face256, chaque étiquette une fois
Les faces d'une collection64
Les tables et les métadonnées, copiées ou décompressées64 Mio en tout, réservés avant chaque copie ou décompression

Seules les six tables dont une face est lue sont copiées ou décompressées ; les autres sont vérifiées à l'intérieur du fichier. Deux blocs WOFF qui partagent des octets sont refusés.

Les encodeurs WOFF2 transforment les tables glyf, loca et hmtx. Elles ne portent aucune métadonnée : la bibliothèque ne les reconstruit donc pas, elle note seulement leur présence. Une collection WOFF2 lance UnsupportedFont, tout comme un fichier WOFF2 lu sans décompresseur : passez Brotli::decompressor(), qui vaut brotli_uncompress() lorsque ext-brotli est chargée (voir Installation).

Faces

Une Font est lue à partir de six tables. Seule name est requise ; chaque autre table absente laisse ses valeurs à leurs valeurs par défaut.

TableCe que lit la bibliothèque
nameChaque chaîne, décodée
OS/2usWeightClass, usWidthClass, fsType, fsSelection
headmacStyle, lorsque la face n'a pas de table OS/2
postitalicAngle, isFixedPitch
fvarLes axes de variation
cmapLa sous-table Unicode, au format 12 ou au format 4
Propriété ou méthodeCe qu'elle donne
family(), subfamily()La famille et la sous-famille typographiques (noms 16 et 17) lorsque la police les donne, sinon les noms 1 et 2 ; une chaîne vide s'il n'y en a aucun
fullName(), postScriptName(), version()Les noms 4, 6 et 5
copyright(), trademark(), manufacturer(), designer(), vendorUrl(), designerUrl()Les noms 0, 7, 8, 9, 11 et 12
licence()Les noms 13 et 14, sous forme de Licence
weightusWeightClass, de 1 à 1000 ; 400 hors de cet intervalle ; sans OS/2, 700 pour un macStyle gras, sinon 400
widthClassusWidthClass, de 1 à 9 ; 5 hors de cet intervalle ou en son absence
styleOblique pour le bit oblique de fsSelection, Italic pour son bit italique, sinon Normal ; sans OS/2, le bit italique de macStyle
embeddingLes EmbeddingPermissions de fsType ; voir Permissions d'incorporation
outlinesTrueType pour une table glyf, PostScript pour CFF ou CFF2, sinon None
italicAngle, fixedPitchTirés de post : les degrés dans le sens antihoraire à partir de la verticale, et si chaque glyphe a la même chasse
axes, axis($tag), isVariable()Les axes de fvar, chacun un Axis avec son étiquette, son minimum, sa valeur par défaut, son maximum et son identifiant de nom
weightRange()La plage de l'axe wght, arrondie, ou la graisse deux fois
stretchRange()La plage de l'axe wdth, ou le pourcentage que représente la classe de largeur (de 50 % à 200 %), deux fois
unicodeRangesLes plages de points de code que déclare la table de caractères, triées et fusionnées là où elles se touchent

Les plages viennent de la sous-table Unicode telle qu'elle est déclarée : le format 12 s'il existe, sinon le format 4, dont le segment de fin est exclu. Un point de code qu'une sous-table fait correspondre au glyphe manquant compte quand même comme couvert.

Noms

$font->names contient chaque chaîne de la table name sous forme de valeurs NameRecord : plateforme, encodage, langue, identifiant de nom et chaîne en UTF-8. Les chaînes de la plateforme Unicode et celles de la plateforme Windows dans ses encodages Unicode et symbole sont lues en UTF-16 ; les chaînes Macintosh dans l'encodage Roman sont lues en Mac Roman. Les chaînes dans d'autres encodages (les encodages japonais ou chinois de Macintosh, la plateforme ISO obsolète) sont exclues.

get(NameId $id) donne la chaîne qu'un lecteur attend le plus probablement : Windows en anglais des États-Unis, puis toute autre langue Windows, puis Unicode, puis Macintosh, une chaîne vide comptant comme une absence. all(NameId $id) donne chaque chaîne d'un nom, pour afficher les noms d'une police dans chaque langue pour laquelle ils ont été écrits :

use Phil\Fonts\Name\NameId;

foreach ($font->names->all(NameId::FullName) as $record) {
    printf("%d/%d/0x%04X: %s\n", $record->platform, $record->encoding, $record->language, $record->value);
}

La langue d'un enregistrement est l'identifiant numérique de la plateforme : sur Windows, 0x0409 désigne l'anglais des États-Unis et 0x040C le français.