Erweiterte Rendering-Semantik

Das Rendering geladener Seiten bewahrt den verschachtelten Zustand von Form-XObjects, während Transparenzgruppen, Weichmasken, Type-3-Glyphenprozeduren und die auflösungsbewusste Dekodierung sichtbarer Bildbereiche angewandt werden

Gestrichelte Pfadstriche

Das native Pfad-Rendering bewahrt vollständige Dash-Arrays und deren Phase, einschließlich Arrays ungerader Länge, Bruchteilen von Längen und gezeichneter Striche der Länge null mit runden oder quadratischen Caps; das Dash-Muster startet an jedem Subpfad neu

Vollton-Striche und Gradient-Pattern-Stroke-Clips teilen sich einen begrenzten Dash-Geometrie-Pfad, behalten Joins innerhalb durchgehend gezeichneter Abschnitte bei und verbinden gezeichnete Abschnitte über den Startpunkt einer geschlossenen Kontur hinweg

Dash-Längen behalten den mittleren Skalierungsfaktor der aktuellen Transformation des Renderers bei, während die Kurventeilung adaptives Device-Space-Flattening nutzt; Flächenfüllung und ausstehendes Clipping verwenden weiterhin den ursprünglichen ungeteilten Pfad

Transparenzgruppen

Weichmasken

Übertragungs- und Sample-Funktionen

/TR2 hat Vorrang vor /TR, eine einzelne Funktion wird auf jeden RGB-Ausgabekanal angewandt, und ein Array aus vier Funktionen wendet seine ersten drei Einträge unabhängig an, während die Einträge /Identity und /Default erhalten bleiben

Das Anwenden eines neuen Übertragungszustands ersetzt jeden Kanal atomar, sodass Identity-Einträge keine Lookup-Werte aus einem früheren Grafikzustand übernehmen können

Typ-0-Sample-Funktionen unterstützen ein bis vier Eingabe- und Ausgabedimensionen, /BitsPerSample-Werte 1, 2, 4, 8, 12, 16, 24 und 32, umgekehrte oder vorwärts gerichtete /Encode-Abbildungen, unabhängige /Decode-Bereiche, multilineare Interpolation, mehrdimensionale kubische Interpolation und natürliche kubische Splines für eindimensionale Daten mit /Order 3

Dekodierte Sample-Bytes, validierte Dimensionen, Abbildungen und kubische Ableitungen teilen sich je Rendering-Thread eine auf acht Einträge begrenzte LRU mit maximal 64 MiB; zu große oder fehlerhafte Funktionen schlagen fehl, ohne die aktive Übertragungs-Lookup-Tabelle teilweise zu ersetzen

Rasterpunktbildschirme

Schwellenwertarrays der Typen 6, 10 und 16 werden direkt mit exakten dekodierten Längen, 16-Bit-Schwellenwerten in Big-Endian-Reihenfolge, additivem Komponentenvergleich und kompakten periodischen Streifen ausgeführt, die das Aufblähen abgewinkelter oder aus zwei Rechtecken bestehender Bildschirme vermeiden

Wörterbücher des Typs 5 wählen unabhängige Bildschirme /Red, /Green und /Blue mit Fallbacks /Gray und dem erforderlichen /Default; jeder ausgewählte Bildschirm kann die globale Übertragungsfunktion überschreiben

Validierte Schwellenwertbytes und ihre normalisierte Geometrie teilen sich je Renderer eine auf 64 Einträge und 64 MiB begrenzte LRU; fehlerhafte Dimensionen, übergroße Zuweisungen, verschachtelte Wörterbücher des Typs 5 oder nicht passende Nutzlastlängen lassen den vollständigen aktiven Bildschirmzustand im Halbtonmodus

Type-3-Glyphen

Type-3-CharProcs laufen mit dem vollständigen Inhaltsoperator-Engine und dem aktuellen Ressourcenbereich des Schriftwörterbuchs, Form-Unterstützung, Clipping, Bildern, Mustern und begrenzter Rekursion

d0 und d1 liefern Glyphenmetriken, während eine d1-Prozedur die vom Aufrufer gewählte Farbe beibehält, wie es das PDF-Bildmodell verlangt

Wiederholte CharProcs verwenden dekodierte und tokenisierte Display-Listen erneut, wenn Schrift, Glyphe, lineare Gerätematrix und Farbzustand übereinstimmen; die Translation bleibt dynamisch, sodass wiederholte Zeichen an unterschiedlichen Positionen einen Eintrag teilen

Die LRU je Renderer bewahrt höchstens 256 Einträge und 131.072 Token, umgeht jeden CharProc mit mehr als 16.384 Token und meldet ihr Verhalten über GetLastType3GlyphCacheStats

Beschnittene und herunterskalierte Bildbereiche

Achsenparallel ausgerichtete Image-XObjects fordern nur sichtbare Quellgrenzen an und übergeben die sichtbare Geräte-Pixelgröße an den Dekodierungspfad

Ein Bild mit einer Weichmaske wird als Ganzes in der Größe dekodiert, in der es gezeichnet wird, und seine Maske in derselben Größe, sodass die Maske mit dem Bild ausgerichtet bleibt, während das Clipping begrenzt, was gemalt wird; JPEG-Masken verwenden den DCT-Dekoder mit reduzierter Größe

Beim Rendern wird ein dekodierter Bereich, der in beiden Richtungen mindestens doppelt so groß wie die gezeichnete Größe ist, vor dem Zeichnen oder Zwischenspeichern durch Flächenmittelung exakt auf die gezeichnete Größe verkleinert; ein großes, klein gezeichnetes Bild passt dann in den Dekodierungscache, sodass eine zweimal gezeichnete Gruppe oder eine wiederholte Seite es wiederverwendet, und seine Weichmaske wird auf dieser Größe pixelgenau angewandt. Schablonen-Bildmasken behalten ihre volle Auflösung, und die öffentlichen Methoden zur Bereichsdekodierung liefern ihre dokumentierten Größen

JPEG 2000 kombiniert die native Bereichs-API des Dekoders mit einer Zweierpotenz-Auflösungsstufe, die vor Wavelet-Rekonstruktion und Rastererweiterung beide Zielabmessungen erfüllt

Kacheladressierbare JPEG-2000-Codestreams können außerdem eine validierte Kachel direkt über THPDFJpeg2000Decoder.LoadTileFromByteArray dekodieren, wobei der Dekoder Kachelrastermetadaten und Ausgabebytegrenzen bereitstellt

Wenn ein nativer Bereich mehrere unabhängige Kacheln schneidet, weist LoadRegionFromByteArrayParallel jedem Worker einen privaten OpenJPEG-Zustand zu und setzt fertige Raster in deterministischer zeilenweiser Reihenfolge zusammen; Abbruch, Ausgabegrenzen und das wirksame Spitzenspeicherbudget können die Planung anhalten oder den sequenziellen Fallback wählen

Region := PDF.DecodeLoadedImageRegion(ImageStream, 128, 64, 640, 480);
try
  Canvas.Draw(0, 0, Region);
finally
  Region.Free;
end;

Verwandte APIs