Fonctions de sous-ensemble CFF et OpenType

Prise en charge des filtres PDF

 

Haut  EnableFontSubsetting  Sommaire

Ces fonctions de niveau unité exposent la surface publique de sous-ensemble de polices CFF et OpenType-CFF utilisée par le pipeline de polices intégrées de HotPDF. HotPDF fournit aussi des unités réutilisables d’analyse Type 1 PFB et CFF pour les appelants qui ont besoin d’une inspection de polices plus bas niveau

 

Delphi syntax

function HPDFSubsetCFF(const CFFBytes: TBytes; const KeepGlyph: array of Boolean): TBytes;

function HPDFSfntIsOTF(const Data: TBytes): Boolean;

function HPDFOTFFindCFFTable(const Data: TBytes; out TableOff: Cardinal; out TableLen: Cardinal): Boolean;

function HPDFSubsetOTFContainer(const OTFBytes: TBytes; const KeepGlyph: array of Boolean): TBytes;

function HPDFExtractTTFPostScriptName(const Data: TBytes): AnsiString;

 

Description

HPDFSubsetCFF réécrit une charge utile de police CFF en place, en préservant les IDs de glyphes et en remplaçant les CharStrings et sous-routines inutilisés par des stubs minimaux. C’est l’aide destinée aux appelants qui ont déjà extrait une table CFF d’un conteneur de police

 

HPDFSfntIsOTF détecte un conteneur sfnt dont la version est OTTO. HPDFOTFFindCFFTable localise la table embarquée 'CFF '. HPDFSubsetOTFContainer combine ces étapes en sous-ensemble la table CFF embarquée et en renvoyant un conteneur OTF avec la disposition originale de la table sfnt préservée

 

Le sous-ensembliste reconnaît à la fois les CFF indexés par nom (un seul Private DICT, un seul Local Subr INDEX) et les CFF indexés CID (opérateur ROS Haut DICT, FDArray de plusieurs Private DICT de sous-polices, carte glyph-to-FD FDSelect, Local Subr INDEX par FD). La prise en charge CID depuis v2.40.0 couvre les polices OpenType-CFF CJK / Indic / Arabic telles que la famille Adobe Fan/Gothic/Heiti/Ming/Myungjo/Song Std, Kozuka Pr6N et Source Han Sans - le balayage de fermeture suit le contexte FD de chaque CharString conservé afin que les Local Subr INDEX par FD soient sous-ensemblés indépendamment

 

Les décodeurs entiers CFF, analyseurs FDArray / FDSelect et scanners de sous-programmes de bas niveau sont des détails d’implémentation derrière cette surface publique

HPDFIsCFF2Font détecte un sfnt avec une table CFF2. HPDFInstantiateCFF2Font résout les coordonnées fvar sélectionnées via avar 1.0 ou 2.0, évalue les opérations blend adossées au VariationStore à travers les sous-routines récursives, cuit les métriques HVAR, VVAR et MVAR, retire les tables variables et renvoie un sfnt statique à checksum correct

 

Type 1 and CFF parser units

 

HPDFIsTrueTypeVariableFont détecte un sfnt contenant fvar, glyf et loca. HPDFInstantiateTrueTypeVariableFont projette les axes sélectionnés via avar, évalue les tuples gvar et l’interpolation IUP, met à jour les contours simples et composés plus les métriques de points fantômes, applique HVAR, VVAR et MVAR le cas échéant, retire les tables de variation et renvoie un sfnt statique à checksum correct

 

HPDFSfntIsOTF détecte un conteneur sfnt dont la version est OTTO. HPDFOTFFindCFFTable localise la table 'CFF ' embarquée. HPDFSubsetOTFContainer crée un sous-ensemble des données CFF ou CFF2 embarquées et renvoie un conteneur OTF avec des checksums sfnt valides. HPDFExtractTTFPostScriptName lit le name ID 6 de la table name du sfnt et renvoie le nom PostScript de la police lorsqu’il est présent

 

Le subsetter reconnaît le CFF à clé de nom (Private DICT unique, Local Subr INDEX unique) et le CFF à clé CID (opérateur ROS du Top DICT, FDArray de plusieurs Private DICT de sous-polices, map glyph-vers-FD FDSelect, Local Subr INDEXes par FD). Le support CID couvre les polices OpenType-CFF CJK / Indic / arabes ; le scan de closure suit le contexte FD de chaque CharString conservé afin que les Local Subr INDEXes par FD soient sous-ensemblés indépendamment

 

Les décodeurs d’entiers CFF de plus bas niveau, les parseurs FDArray / FDSelect et les scanners de sous-routines sont des détails d’implémentation derrière cette surface de helpers publique

 

Unités de parseurs Type 1 et CFF

HPDFType1Core, HPDFType1Glyphs, HPDFType1CFFHandler et HPDFType1PFBHandler fournissent des lecteurs de tableaux d’octets réutilisables, l’extraction de commandes de contours de glyphes Type 1, l’analyse CFF Header / INDEX / dictionnaire / charset / encoding, et les métadonnées PFB Type 1 plus les helpers de recherche de glyphes. HPDFType1CFFHandler résout l’héritage de SyntheticBase à travers un FontSet pour les valeurs Top et Private DICT, CharStrings, charset, Encoding et Local Subrs tout en rejetant les indices invalides, les cycles et les profondeurs excessives. HPDFType1CB fournit un point d’entrée de parseur adapté à C++Builder. Les unités sont incluses dans les projets de paquets Delphi et C++Builder afin que les applications puissent inspecter les données Type 1 PFB et CFF sans réimplémenter les parseurs binaires

 

Voir aussi: EnableFontSubsetting, FontEmbedding, Prise en charge des filtres PDF

Opérations de pile Type 2 et sécurité des subroutines

Le renderer de glyphes natif implémente les opérations Type 2 standard booléennes, arithmétiques, conditionnelles, de tableau transitoire et de pile, dont put, get, ifelse, random, dup, exch, index et roll

Les valeurs transitoires sont réinitialisées pour chaque glyphe, les valeurs aléatoires sont reproductibles, et les limites d’opérandes, de tableau transitoire, de récursion et d’exécution rejettent les programmes malformés sans renvoyer un contour partiel

Le scanner de subsetting résout les expressions arithmétiques et de tableau transitoire utilisées par les appels de subroutines locales et globales, y compris les opérandes Type 2 en virgule fixe 16.16

Lorsque des valeurs aléatoires, un état transitoire inconnu ou des effets de pile interprocéduraux rendent une cible d’appel incertaine, le subsetting conserve chaque subroutine candidate plutôt que d’abandonner une dépendance de contour potentiellement atteignable

Les opérations Multiple Master réservées et dépréciées restent non prises en charge et échouent explicitement