Listy wyświetlania i produkcja drukowa
HotPDF kompiluje załadowane strumienie stron w komponenty THPDFPageDisplayList wielokrotnego użytku z metrykami THPDFDisplayListInfo i ramkami ograniczającymi obiektów treści
Renderowanie dokumentu buforuje skompilowane listy, podczas gdy wywołujący mogą żądać listy o niezależnej własności do powtarzanego wykonania lub zapytań obiektów regionalnych
Współdzielony interpreter produkcyjny
Nieprogresywne bitmapy, bezpośrednie DC, replay Form i display list przepuszczają uprzednio ztokenizowaną treść przez HPDFInterpretContentTokensDevice, który posiada traversal operatorów i granice anulowania
THPDFPageRenderer implementuje IHPDFContentOperatorDevice, więc współdzielony traversal wywołuje jego kompletną maszynę stanów grafiki, tekstu, zasobów, clipowania, wzorów, transparency, marked content i obrazów, nie zbijając renderowania produkcyjnego do mniejszej, semantycznej powierzchni callbacków
Display liste cache'ują indeksy tokenów operatorów, gdy strumienie są kompilowane, i replayują tylko te indeksy, unikając powtarzanych skanów operandów; THPDFPageDisplayList.OperatorCount i THPDFDisplayListInfo.OperatorCount wystawiają cache'owaną liczbę poleceń
Urządzenia semantyczne implementujące tylko IHPDFContentDevice zachowują callbacki filtrowane po zdolnościach, podczas gdy kompletne urządzenia operatorowe dostają jeden zwalidowany operator naraz z jednym punktem kontrolnym anulowania na operator
Ograniczone i współbieżne renderowanie
THPDFRenderTileEvent otrzymuje pojedynczy kafel lub poziomy pasek o rozmiarze wywołującego, utrzymując szczytową pamięć rastra niezależną od pełnego rozmiaru strony
RenderLoadedPagesParallel nakłada kompilację list wyświetlania na odtwarzanie, rozpoczyna pierwszą gotową stronę bez czekania na pełną barierę kompilacji, dynamicznie równoważy oba etapy na ograniczonych procesach roboczych i zwraca THPDFBitmapArray w kolejności wejścia
Kompilacja działa poza blokadą pamięci podręcznej list wyświetlania, podczas gdy podwójnie sprawdzone dopuszczenie i chronione liczniki użycia pozwalają niepowiązanym stronom kompilować się współbieżnie bez duplikowania opublikowanych wpisów ani wysiedlania listy podczas odtwarzania
THPDFParallelRenderPipelineInfo wystawia trafienia pamięci podręcznej, kompilacje, ukończenia, szczytowe współbieżności kompilacji i renderowania, strony skompilowane przy pierwszym wyniku, opóźnienie pierwszego wyniku i całkowity upływający czas
RenderLoadedPagesParallelOrdered dostarcza wywołania zwrotne w kolejności wejścia na wątku wywołującym i zwalnia każdą pożyczoną bitmapę po powrocie wywołania, podczas gdy wybrana przez wywołującego głębokość wyjścia stosuje przeciwciśnienie producentowi i rezerwuje jeden slot dla następnej wymaganej strony, aby wolna wczesna strona nie mogła zakleszczyć się za późniejszymi wynikami
Uporządkowane strumieniowanie zachowuje co najwyżej jedną listę wyświetlania i aktywne renderowanie na proces roboczy plus ograniczoną kolejkę ukończonych bitmap zamiast utrzymywania kompletnego wyjścia zadania w pamięci
Wtykowe backendy renderowania zużywają te same skompilowane listy przez niebędący właścicielem widok zasobów dokumentu, więc ścieżki synchroniczna i równoległa unikają ponownego parsowania treści strony, podczas gdy możliwości backendu określają, czy wywołania mogą się nakładać, czy wymagają wysyłki szeregowej
Procesowy planista pamięci szczytowej ogranicza teraz oba równoległe API: największe oszacowanie strony zmniejsza początkową liczbę procesów roboczych, każda pobrana strona rezerwuje swój kompletny szacowany zestaw roboczy, a uporządkowane wyjście zachowuje tę rezerwację przez dostarczanie wywołania
Anulowanie planisty budzi czekających na budżet przy anulowaniu wywołania lub awarii procesu roboczego, podczas gdy telemetria wystawia żądane względem efektywnych procesów roboczych, szczytową wagę rezerwacji, opóźnione strony i zagregowany czas oczekiwania
RenderLoadedPageTilesParallel i RenderLoadedPageBandsParallel dostarczają pożyczone kafle wierszowo albo pasy od góry do dołu przez izolowane workery, przy czym każdy worker ma co najwyżej jeden kafel, a limit pamięci roboczej od wywołującego redukuje współbieżność przed pierwszą rezerwacją
Równoległe konteksty renderowania kopiują niemutowalne sekwencje tokenów glifów Type 3 i ekrany progowe halftone z jednego ograniczonego cache LRU, zachowując własność lokalną renderera dla mutowalnego stanu grafiki i zasobów GDI
SaveLoadedPageToPng, SaveLoadedPageToPngStream, SaveLoadedPagesToTiffBanded i SaveLoadedPagesToTiffStreamBanded konsumują ten sam renderer pasów przez strumieniowe enkodery PNG albo TIFF, więc bardzo duże strony emitują skompresowane wyjście wiersz po wierszu bez trzymania pełnego framebuffera, a THPDFBandImageExportInfo raportuje wyrenderowane pasy, zakodowane wiersze, workerów, szczytowe bajty rezerwacji, bajty wyjścia, czas i anulowanie
Współdzielone dekodowanie obrazów jest koordynowane osobno, więc praca nad stronami wektorowymi pozostaje równoległa bez uszkadzania wpisów pamięci podręcznej zdekodowanych obrazów
PrefetchLoadedPages rozgrzewa wpisy rastra z dedykowanym tokenem anulowania podczas kompilacji i renderowania poza blokadą pamięci podręcznej, a renderowanie strony na pierwszym planie wywłaszcza proces roboczy przed rozpoczęciem pracy wrażliwej na opóźnienie
THPDFLoadedPagePrefetchInfo raportuje pracę zaplanowaną, rozpoczętą, ukończoną, buforowaną, wyrenderowaną, nieudaną, anulowaną i wywłaszczoną na pierwszym planie razem z ostatnim i szczytowym opóźnieniem anulowania
Przezroczystość i kontrola druku
Spłaszczanie przezroczystości najpierw sprawdza licznik przezroczystości listy wyświetlania i zdefiniowany przez wywołującego sufit pikseli, a następnie zastępuje malowanie strony bezstratnym, skompresowanym Flate, skalibrowanym obrazem RGB
Strony z kolorantami Separation lub DeviceN pozostają jako treść wektorowa, z wykrytymi kolorantami i stanem zachowania wystawionym wywołującemu
Renderer wykonuje funkcje przeniesienia oraz słowniki rastra Typu 1, 5, 6, 10 lub 16 z ExtGState, zachowując niezależne ekrany RGB i ich nadpisy przeniesienia przez q i Q
THPDFInkCoverageInfo raportuje średnie pokrycie CMYK, maksymalne całkowite pokrycie obszaru i liczbę pikseli powyżej wybranego progu
Wyjście płyt procesowych i spotowych obsługuje koloranty DeviceCMYK, Separation i DeviceN
Przepisanie kolorów załadowanej strony używa tego samego kompletnego renderera do konwersji złożonych stron na Gray, RGB lub CMYK, zachowując proste wektorowe treści stron o kolorze urządzenia i stosując jawną politykę płyt spot
THPDFTrappingInfo łączy deklaracje trapowania dokumentu, metadane strony i diagnostykę strukturalną TrapNet
Przepływ pracy ICC
Transformacja renderowania może łączyć profil źródłowy PDF, przestrzeń kolorów mieszania, profil proof, profil wyjściowy i rasterowe miejsce docelowe sRGB
Wszystkie cztery intencje renderowania ICC i prawdziwa kompensacja czarnego punktu są stosowane spójnie do kolorów wektorowych i próbek obrazu w całym potoku
Kompletne transformacje są współdzielone przez ścieżki renderowania wektorowego, obrazowego, strony i równoległego przez bezpieczną wątek pamięć podręczną LRU 64 MiB kluczowaną przez treści profili źródłowego, proof i wyjściowego, efektywną intencję renderowania i kompensację czarnego punktu
Spłaszczanie przezroczystości ponownie używa tego samego potoku transformacji, a następnie emituje kafli CalRGB bez szwów pod budżetami pikseli całkowitego rastra i per kafel kontrolowanymi przez wywołującego
Główne API
- Wtykowe backendy renderowania
THotPDF.CompileLoadedPageDisplayListTHPDFPageDisplayList.GetTokenTHPDFPageDisplayList.GetObjectTHPDFPageDisplayList.GetTokenTHPDFPageDisplayList.GetObjectTHPDFPageDisplayList.QueryObjectIndexesTHPDFPageDisplayList.PageObjectTHPDFPageDisplayList.ResourcesTHPDFPageDisplayList.MediaBoxTHotPDF.RenderLoadedPageTilesiRenderLoadedPageBandsTHotPDF.RenderLoadedPageTilesiRenderLoadedPageBandsTHotPDF.RenderLoadedPagesParallelTHotPDF.RenderLoadedPagesParallelOrderedTHPDFParallelRenderPipelineInfoTHotPDF.PrefetchLoadedPagesTHotPDF.GetLoadedPagePrefetchInfoTHPDFLoadedPagePrefetchInfoTHotPDF.FlattenLoadedPageTransparencyTHotPDF.FlattenLoadedPageComplexGraphicsTHotPDF.RenderLoadedPageSeparationPlateTHotPDF.GetLoadedPageSpotColorantsTHotPDF.RewriteLoadedPageColorsTHotPDF.AnalyzeLoadedPageInkCoverageTHotPDF.InspectLoadedPageTrappingTHotPDF.ConfigureRenderICCWorkflowTHotPDF.FlattenLoadedPageComplexGraphicsTHotPDF.RenderLoadedPageSeparationPlateTHotPDF.GetLoadedPageSpotColorantsTHotPDF.RewriteLoadedPageColorsTHotPDF.AnalyzeLoadedPageInkCoverageTHotPDF.InspectLoadedPageTrappingTHotPDF.ConfigureRenderICCWorkflow