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

Miękkie maski

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;

Powiązane API