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
/Matrix-Werte eines Form-XObjects werden mit der aktuellen Transformationsmatrix kombiniert, bevor der Gruppeninhalt ausgeführt wird- Isolierte Gruppen verwenden eine getrennte Alpha-Ebene, damit schwarzer Inhalt von transparenten Pixeln unterscheidbar bleibt
- Knockout-Gruppen ersetzen den vorherigen Gruppenbeitrag in überlappenden bemalten Bereichen
- Der Gruppeninhalt beginnt mit dem Normal-Mischmodus: Der Mischmodus, die konstante Alpha und die Weichmaske, die bei
Dowirksam sind, gelten für die Gruppe als Ganzes - Eine Gruppe, die mit einem anderen Mischmodus gemalt wird, mischt ihre eigene Farbe und Alpha mit dem Hintergrund; eine nicht isolierte Gruppe, deren eigene Grafikzustände normal mischen, wird auf Schwarz und auf Weiß gezeichnet, um ihre Alpha zurückzugewinnen
- Während der GDI-Ausgabe werden Gruppen in begrenzte Kacheln mit 768 Pixeln aufgeteilt, während Malen, Rasterpunktphase, verschachtelte Gruppen, Weichmasken und Komposition absolute Gerätekoordinaten beibehalten
- Form-Bytes werden vor der Kachelausführung einmal dekodiert und tokenisiert, und temporäre kachellokale Masken werden vor der nächsten Kachel freigegeben
- Verschachtelte Gruppen werden mit begrenzter Rekursion und vollständiger Wiederherstellung des Grafikzustands nach jedem Form-Aufruf unterstützt
Weichmasken
- Masken
/S /Alphaund/S /Luminositywerden aus der Maskengruppe ausgewertet - Die Maskengruppe wird mit normalem Blending gezeichnet, ganz gleich, welchen Mischmodus der Grafikzustand trägt, der die Maske setzt
- Helligkeitsmasken lösen das
/CSder Transparenzgruppe auf und wichten die aufgelöste Farbe mit der PDF-DeviceGray-Approximation, wie gängige Betrachter es tun; setzen SieRenderColorimetricLuminosityMasks, um für CIE-basierte Räume stattdessen kolorimetrisches CIE Y zu verwenden /BCwird gegen die genaue Komponentenanzahl des Mischraums validiert und liefert die konvertierte Helligkeit außerhalb bemalter Maskeninhalte- Separation- und DeviceN-Farbe wird über ihren alternativen Lab- oder ICCBased-Raum konvertiert, sodass Sonderfarbkomponenten niemals in eine Weichmaske gelangen
- Übertragungsfunktionen
/TRunterstützen über den gemeinsamen Funktionsauswerter Sample-, Exponential-, Stitching- und PostScript-Rechnerfunktionen /SMask /Nonehebt die aktive Maske auf, undqoderQbehält den Maskenzustand wie gewohnt bei- Kompilierte Masken werden nur wiederverwendet, wenn Quellwörterbuch, aktuelle Transformationsmatrix und Rendering Intent übereinstimmen
Ü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;