Walidacja grafu segmentów JBIG2

HotPDF waliduje osadzone strumienie obrazów JBIG2 i JBIG2Globals, zanim trafią one do dekodera natywnego lub zewnętrznego

Walidator wykonuje jeden ograniczony obchód segmentów, a po nim iteracyjne przejście po grafie zależności, korzystając z indeksowanego wyszukiwania numerów segmentów zamiast powtarzanych skanów

Walidacja przed własnym przetwarzaniem

Options := DefaultJBIG2SegmentGraphValidationOptions;
Options.MaxSegments := 32768;
Options.MaxTotalReferences := 131072;
Options.MaxReferenceDepth := 512;
Options.MaxSymbols := 500000;

if not HPDFValidateJBIG2SegmentGraph(ImageData, GlobalData,
  Options, Info) then
  raise Exception.Create(string(
    HPDFJBIG2SegmentGraphValidationStatusName(Info.Status)));

TJBIG2SegmentGraphValidationInfo raportuje liczby segmentów i krawędzi, zadeklarowane nowe symbole, maksymalną głębokość zależności oraz strumień, offset bajtu, numer segmentu i numer referencji powiązane z pierwszą awarią

Budżety mieszczą się w rekordzie TJBIG2SegmentGraphValidationOptions, którego pola MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth i MaxSymbols ograniczają każdy obchód

Stanem końcowym jest wartość TJBIG2SegmentGraphValidationStatus — od stanu niesprawdzonego i poprawnego aż po odrzucenie opcji, awarie nagłówka i referencji, cykle oraz naruszenia słownika symboli — a HPDFJBIG2SegmentGraphValidationStatusName renderuje ją jako tekst

FailureStreamKind używa typu TJBIG2SegmentStreamKind, aby powiedzieć, czy pierwsza awaria została znaleziona w strumieniu globals (jbsskGlobals), czy w strumieniu obrazu (jbsskImage)

THPDFJBIG2Decoder.LastSegmentGraphValidationInfo przechowuje ten sam raport po LoadFromByteArray lub LoadRegionFromByteArray

Warunki fail-closed

Walidacja odrzuca źle uformowane lub ucięte nagłówki, samodzielne nagłówki plików w strumieniach osadzonych, zakazane krótkie i przewymiarowane długie tablice referencji, zduplikowane albo brakujące identyfikatory segmentów, zależności fizycznie skierowane w przód, cykle zależności, nadmierną głębokość oraz przekroczenia skonfigurowanych budżetów segmentów i krawędzi

Segmenty obrazów muszą używać asocjacji strony 1, segmenty globalne asocjacji strony 0, a segment globalny nie może zależeć od segmentu obrazu

Osadzone segmenty end-of-page, end-of-file i palety kolorów są odrzucane, podobnie jak segmenty regionu i informacji o stronie przeznaczone wyłącznie dla strony, umieszczone w JBIG2Globals

Nagłówki słowników symboli są badane przed dekodowaniem, dzięki czemu zadeklarowane liczby nowych i eksportowanych symboli, zagregowane pule symboli wejściowych i niemożliwe sumy eksportu zawodzą przed alokacją bitmap

Granica dekodera i pamięci podręcznej globals

THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode i osadzone wywołania HPDFJBIG2DecDecodeEx dzielą tę samą politykę

Zarejestrowane backendy natywne i zewnętrzne korzystają z już zwalidowanych ścieżek wewnętrznych, unikając podwójnego obchodu grafu przy normalnym dekodowaniu

THPDFJBIG2GlobalsPool.Register przyjmuje wyłącznie poprawny strumień segmentów wyłącznie globalnych, co blokuje wejście wadliwych słowników współdzielonych do ponownego użycia na poziomie dokumentu

Samodzielne pliki JBIG2 przekazane z Embedded = False zachowują swoją odrębną, zorientowaną na plik ścieżkę dekodowania

Zobacz obsługę kompresji JBIG2, THPDFJBIG2Decoder.LoadFromByteArray i THPDFJBIG2Decoder.LoadRegionFromByteArray