Zaawansowane semantyki renderowania
Renderowanie załadowanej strony zachowuje zagnieżdżony stan Form XObject, jednocześnie stosując grupy przezroczystości, miękkie maski, procedury glifów Typu 3 i zależne od rozdzielczości dekodowanie widocznych regionów obrazu
Kreskowane stroke ścieżek
Natywne renderowanie ścieżek zachowuje kompletne tablice dash i ich fazę, łącznie z tablicami o nieparzystej długości, długościami ułamkowymi i malowanymi dash o zerowej długości z zakończeniami round lub square; wzorzec dash restartuje się na każdym podpath
Stroke jednolitym kolorem i clipy stroke wzorców gradientowych współdzielą jedną ograniczoną ścieżkę geometrii dash, zachowują łączenia wewnątrz ciągłych malowanych odcinków i łączą malowane odcinki przez punkt startowy zamkniętego konturu
Długości dash zachowują średnią skalę bieżącej transformacji renderera, podczas gdy dzielenie krzywych używa adaptacyjnego spłaszczania w przestrzeni urządzenia; malowanie wypełnienia i oczekujące przycinanie nadal używają pierwotnej, niedzielonej ścieżki
Grupy przezroczystości
- Wartości
/MatrixForm XObject są składane z bieżącą macierzą przekształcenia przed wykonaniem zawartości grupy - Grupy izolowane używają osobnej płaszczyzny alfa, dzięki czemu czarna zawartość pozostaje odróżnialna od przezroczystych pikseli
- Grupy typu knockout zastępują wcześniejszy wkład grupy w nakładających się obszarach malowania
- Zawartość grupy startuje z trybu mieszania Normal: tryb mieszania, stała alfa i miękka maska obowiązujące w momencie
Dostosują się do grupy jako całości - Grupa namalowana z innym trybem mieszania miesza własny kolor i alfę z tłem; grupa nieizolowana, której własne stany graficzne mieszają się normalnie, jest rysowana na czarnym i na białym, żeby odzyskać jej alfę
- Grupy są dzielone na ograniczone kafelki 768 pikseli, podczas gdy malowanie GDI, faza rastra, zagnieżdżone grupy, miękkie maski i kompozytowanie zachowują bezwzględne współrzędne urządzenia
- Bajty Form są dekodowane i tokenizowane raz przed wykonaniem kafla, a tymczasowe lokalne maski kafli są zwalniane przed następnym kaflem
- Grupy zagnieżdżone są obsługiwane z ograniczoną rekurencją i pełnym przywróceniem stanu grafiki po każdym wywołaniu Form
Miękkie maski
- Maski
/S /Alphai/S /Luminositysą obliczane na podstawie grupy maski - Grupa maski jest rysowana z normalnym mieszaniem, jakikolwiek tryb mieszania niosłaby stan graficzny ustawiający maskę
- Maski luminancji rozpoznają
/CSgrupy przezroczystości i ważą rozpoznany kolory przybliżeniem DeviceGray z PDF, jak czynią to powszechne przeglądarki; ustawRenderColorimetricLuminosityMasks, żeby zamiast tego brać kolorymetryczne CIE Y dla przestrzeni opartych na CIE /BCjest sprawdzane względem dokładnej liczby składowych przestrzeni mieszania i dostarcza przekonwertowaną luminancję poza malowaną zawartością maski- Malowanie Separation i DeviceN jest konwertowane przez jej alternatywną przestrzeń Lab lub ICCBased, dzięki czemu kolory spot nigdy nie przeciekają do miękkiej maski
- Funkcje przeniesienia
/TRobsługują funkcje próbkowane, eksponencjalne, szyte i kalkulatorowe PostScript przez wspólny ewaluator funkcji /SMask /Noneczyści aktywną maskę, aqlubQnormalnie zachowuje stan maski- Skompilowane maski są ponownie używane tylko wtedy, gdy słownik źródłowy, bieżąca macierz przekształcenia i intencja renderowania są zgodne
Funkcje przeniesienia i próbkowane
/TR2 ma pierwszeństwo przed /TR, pojedyncza funkcja jest stosowana do każdego kanału wyjściowego RGB, a tablica czterech funkcji stosuje pierwsze trzy wpisy niezależnie, zachowując wpisy /Identity i /Default
Zastosowanie nowego stanu przeniesienia zastępuje atomowo każdy kanał, więc wpisy tożsamości nie mogą dziedziczyć wartości wyszukiwania z wcześniejszego stanu grafiki
Funkcje próbkowane Typu 0 obsługują od jednego do czterech wymiarów wejściowych i wyjściowych, wartości /BitsPerSample 1, 2, 4, 8, 12, 16, 24 i 32, odwrócone lub proste mapowania /Encode, niezależne zakresy /Decode, interpolację multilinearną, wielowymiarową interpolację sześcienną i naturalne kubiczne splajny dla jednowymiarowych danych /Order 3
Zdekodowane bajty próbek, sprawdzone wymiary, mapowania i kubiczne pochodne współdzielą LRU o ośmiu wpisach ograniczone do 64 MiB na wątek renderowania, podczas gdy przerośnięte lub źle uformowane funkcje zawodzą bez częściowego zastąpienia aktywnej tabeli wyszukiwania przeniesienia
Ekrany rastra
Tablice progowe Typu 6, Typu 10 i Typu 16 wykonują się bezpośrednio z dokładnymi zdekodowanymi długościami, progami big-endian na 16 bitów, porównaniem składowych addytywnych i zwartymi paskami okresowymi, które pozwalają uniknąć rozszerzania ekranów kątowych lub dwuprostokątnych
Słowniki Typu 5 wybierają niezależne ekrany /Red, /Green i /Blue z zachowaniem /Gray i wymaganego zachowawczego /Default, podczas gdy każdy wybrany ekran może zastąpić globalną funkcję przeniesienia
Sprawdzone bajty progowe i ich znormalizowana geometria współdzielą LRU o 64 wpisach ograniczone do 64 MiB na renderer, a źle uformowane wymiary, przerośnięte alokacje, zagnieżdżone słowniki Typu 5 lub niezgodności długości ładunku pozostawiają cały aktywny stan ekranu w trybie ciągłego tonu
Glify Typu 3
CharProcs Typu 3 przebiegają przez pełny silnik operatorów treści z bieżącym zakresem zasobów słownika czcionki, obsługą Form, przycinaniem, obrazami, wzorcami i ograniczoną rekurencją
d0 i d1 dostarczają metryk glifów, podczas gdy procedura d1 zachowuje kolor wybrany przez wywołującego zgodnie z wymogami modelu obrazowania PDF
Powtarzające się CharProcs ponownie używają zdekodowanych i tokenizowanych list wyświetlania, gdy czcionka, glif, liniowa macierz urządzenia i stan koloru są zgodne; translacja pozostaje dynamiczna, więc powtarzające się znaki w różnych pozycjach współdzielą jeden wpis
LRU na renderer przechowuje co najwyżej 256 wpisów i 131 072 tokenów, pomija każdy CharProc powyżej 16 384 tokenów i raportuje swoje zachowanie przez GetLastType3GlyphCacheStats
Przycięte i pomniejszane regiony obrazu
Osie-ujednolicone XObjecty obrazów żądają tylko widocznych granic źródła i przekazują widoczny rozmiar pikseli urządzenia do ścieżki dekodowania
Obraz z miękką maską jest dekodowany w całości w rozmiarze, w jakim jest rysowany, a jego maska w tym samym rozmiarze, więc maska pozostaje wyrównana z obrazem, podczas gdy przycinanie ogranicza to, co malowane; maski JPEG używają dekodera DCT o zmniejszonym rozmiarze
Przy renderowaniu zdekodowany region co najmniej dwukrotnie większy od rysowanego rozmiaru w obu kierunkach jest zmniejszany uśrednianiem po obszarze dokładnie do rysowanego rozmiaru, zanim zostanie narysowany albo zapisany w cache; duży obraz rysowany mały mieści się wtedy w cache dekodowania, więc grupa rysowana dwa razy albo powtarzalna strona reużywa go, a jego miękka maska jest stosowana piksel za pikselem w tym rozmiarze. Maski obrazów stencil zachowują pełną rozdzielczość, a publiczne metody dekodowania regionów zwracają swoje udokumentowane rozmiary
JPEG 2000 łączy natywne API regionu dekodera z poziomem rozdzielczości będącym potęgą dwójki, wybranym tak, aby spełniał oba wymiary docelowe przed rekonstrukcją falkową i ekspansją rastra
Statki kodowe JPEG 2000 adresowalne kafelkowo mogą również zdekodować jeden sprawdzony kafel bezpośrednio przez THPDFJpeg2000Decoder.LoadTileFromByteArray, z metadanymi siatki kafli i limitami bajtów wyjściowych udostępnionymi przez dekoder
Gdy natywny region przecina wiele niezależnych kafli, LoadRegionFromByteArrayParallel przypisuje prywatny stan OpenJPEG na proces roboczy i składa ukończone rastry w deterministycznej kolejności wiersz-po-wierszu; anulowanie, limity wyjściowe i efektywny budżet pamięci szczytowej mogą zatrzymać planowanie lub wybrać sekwencyjny wariant zapasowy
Region := PDF.DecodeLoadedImageRegion(ImageStream, 128, 64, 640, 480);
try
Canvas.Draw(0, 0, Region);
finally
Region.Free;
end;