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

Masques doux

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;

API associées