Sémantique de rendu avancée
Le rendu des pages chargées préserve l’état des Form XObject imbriqués tout en appliquant les groupes de transparence, masques doux, procédures de glyphes Type 3 et décodage selon la résolution des régions d’image visibles
Traits de chemins en pointillés
Le rendu natif des chemins préserve les dash arrays complets et leur phase, y compris les tableaux de longueur impaire, les longueurs fractionnaires et les tirets peints de longueur nulle avec des bouts rond ou carré ; le motif de tirets redémarre à chaque sous-chemin
Les traits en couleur unie et les clips de trait en pattern dégradé partagent un même chemin de géométrie de tirets borné, conservent les jointures à l’intérieur des sections peintes continues et joignent les sections peintes au point de départ d’un contour fermé
Les longueurs de tirets conservent l’échelle moyenne de transformation courante du renderer, tandis que la découpe des courbes utilise un aplatissement adaptatif dans l’espace périphérique ; le remplissage et le clipping en attente continuent d’utiliser le chemin d’origine non découpé
Groupes de transparence
- Les valeurs
/Matrixdes Form XObject sont composées avec la matrice de transformation courante avant l’exécution du contenu du groupe - Les groupes isolés utilisent un plan alpha distinct afin que le contenu noir reste distinguable des pixels transparents
- Les groupes knockout remplacent la contribution précédente du groupe dans les zones peintes qui se chevauchent
- Le contenu d’un groupe démarre en mode de fusion Normal : le mode de fusion, l’alpha constant et le masque doux en vigueur au moment de
Dos’appliquent au groupe dans son ensemble - Un groupe peint avec un autre mode de fusion fond sa propre couleur et son propre alpha avec l’arrière-plan ; un groupe non isolé dont les états graphiques internes fusionnent normalement est dessiné sur fond noir puis sur fond blanc pour retrouver son alpha
- Les groupes sont divisés en tuiles limitées à 768 pixels tandis que le dessin GDI, la phase de trame, les groupes imbriqués, les masques doux et la composition conservent des coordonnées de périphérique absolues
- Les octets de formulaire sont décodés et lexicalisés une seule fois avant l’exécution des tuiles, et les masques temporaires locaux aux tuiles sont libérés avant la tuile suivante
- Les groupes imbriqués sont pris en charge avec une récursion limitée et une restauration complète de l’état graphique après chaque invocation de Form
Masques doux
- Les masques
/S /Alphaet/S /Luminositysont évalués à partir du groupe de masque - Le groupe de masque est dessiné avec une fusion Normal, quel que soit le mode de fusion porté par l’état graphique qui définit le masque
- Les masques de luminosité résolvent le
/CSdu groupe de transparence et pondèrent la couleur résolue avec l’approximation PDF DeviceGray, comme le font les viewers courants ; définissezRenderColorimetricLuminosityMaskspour utiliser le CIE Y colorimétrique pour les espaces CIE à la place /BCest validé avec le nombre exact de composants de l’espace de fusion et fournit la luminosité convertie hors du contenu peint du masque- La peinture Separation et DeviceN est convertie par son espace Lab ou ICCBased alternatif afin que les composants directs ne fuient jamais dans un masque doux
- Les fonctions de transfert
/TRprennent en charge les fonctions échantillonnées, exponentielles, d’assemblage et calculatrices PostScript à l’aide de l’évaluateur partagé /SMask /Noneefface le masque actif, etqouQconservent normalement l’état du masque- Les masques compilés ne sont réutilisés que si le dictionnaire source, la matrice de transformation courante et l’intention de rendu correspondent tous
Fonctions de transfert et échantillonnées
/TR2 l’emporte sur /TR, une fonction unique s’applique à chaque canal de sortie RVB, et un tableau de quatre fonctions applique ses trois premières entrées indépendamment tout en préservant les entrées /Identity et /Default
L’application d’un nouvel état de transfert remplace atomiquement chaque canal, de sorte que les entrées d’identité ne peuvent hériter de valeurs de recherche d’un état graphique antérieur
Les fonctions échantillonnées de type 0 prennent en charge de une à quatre dimensions d’entrée et de sortie, les valeurs /BitsPerSample 1, 2, 4, 8, 12, 16, 24 et 32, les mappages /Encode inversés ou directs, des plages /Decode indépendantes, l’interpolation multilinéaire, l’interpolation cubique multidimensionnelle et les splines cubiques naturelles pour les données unidimensionnelles /Order 3
Les octets d’échantillons décodés, dimensions validées, mappages et dérivées cubiques partagent un LRU de huit entrées plafonné à 64 Mio par thread de rendu, tandis que les fonctions surdimensionnées ou mal formées échouent sans remplacer partiellement la table de transfert active
Trames de demi-teinte
Les tableaux de seuils Type 6, Type 10 et Type 16 s’exécutent directement avec des longueurs décodées exactes, des seuils 16 bits big-endian, une comparaison de composants additifs et des bandes périodiques compactes qui évitent d’étendre les trames inclinées ou à deux rectangles
Les dictionnaires Type 5 sélectionnent des trames /Red, /Green et /Blue indépendantes avec les replis /Gray et /Default requis, tandis que chaque trame sélectionnée peut remplacer la fonction de transfert globale
Les octets de seuil validés et leur géométrie normalisée partagent un LRU de 64 entrées plafonné à 64 Mio par moteur de rendu ; des dimensions mal formées, allocations excessives, dictionnaires Type 5 imbriqués ou incohérences de longueur de charge utile maintiennent tout l’état actif de trame en mode tons continus
Glyphes Type 3
Les CharProcs Type 3 passent par le moteur complet d’opérateurs de contenu avec l’étendue de ressources courante du dictionnaire de police, la prise en charge Form, le découpage, les images, motifs et la récursion limitée
d0 et d1 fournissent les métriques de glyphe, tandis qu’une procédure d1 conserve la couleur choisie par l’appelant conformément au modèle d’imagerie PDF
Les CharProcs répétés réutilisent les listes d’affichage décodées et lexicalisées lorsque police, glyphe, matrice linéaire de périphérique et état de couleur correspondent ; la translation reste dynamique, permettant aux caractères répétés à différentes positions de partager une entrée
Le LRU par moteur de rendu conserve au plus 256 entrées et 131 072 jetons, ignore tout CharProc dépassant 16 384 jetons et rapporte son comportement via GetLastType3GlyphCacheStats
Régions d’image découpées et sous-échantillonnées
Les XObject d’image alignés sur les axes ne demandent que les limites source visibles et transmettent la taille visible en pixels de périphérique au chemin de décodage
Une image dotée d’un masque doux est décodée en entier à la taille à laquelle elle est dessinée, et son masque à la même taille, si bien que le masque reste aligné sur l’image tandis que le découpage limite ce qui est peint ; les masques JPEG passent par le décodeur DCT à taille réduite
Au rendu, une région décodée au moins deux fois plus grande que la taille dessinée dans les deux directions est réduite à la taille dessinée exacte par moyennage de surface avant d’être dessinée ou mise en cache ; une grande image dessinée en petit tient alors dans le cache de décodage, de sorte qu’un groupe dessiné deux fois ou une page répétée la réutilise, et son masque doux s’applique pixel par pixel à cette taille. Les masques d’image stencil conservent leur pleine résolution, et les méthodes publiques de décodage de région renvoient leurs tailles documentées
JPEG 2000 combine l’API région native du décodeur avec un niveau de résolution de puissance de deux sélectionné pour satisfaire les deux dimensions cibles avant la reconstruction par ondelettes et l’expansion raster
Les flux JPEG 2000 adressables par tuiles peuvent aussi décoder directement une tuile validée via THPDFJpeg2000Decoder.LoadTileFromByteArray, avec les métadonnées de grille et les limites d’octets de sortie exposées par le décodeur
Lorsqu’une région native intersecte plusieurs tuiles indépendantes, LoadRegionFromByteArrayParallel affecte un état OpenJPEG privé à chaque worker et compose les rasters terminés dans un ordre ligne-majeur déterministe ; l’annulation, les limites de sortie et le budget mémoire maximal effectif peuvent interrompre la planification ou sélectionner le repli séquentiel
Region := PDF.DecodeLoadedImageRegion(ImageStream, 128, 64, 640, 480);
try
Canvas.Draw(0, 0, Region);
finally
Region.Free;
end;