Ověření segmentového grafu JBIG2

HotPDF ověřuje vložené obrázky JBIG2 a streamy JBIG2Globals dříve, než je obdrží nativní či externí dekodér

Validator provede jeden ohraničený průchod segmenty s následným iterativním průchodem grafem závislostí s použitím indexovaného vyhledávání podle čísla segmentu namísto opakovaných skenů

Ověření před vlastním zpracováním

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 hlásí počty segmentů a hran, deklarované nové symboly, maximální hloubku závislostí a stream, bajtový offset, číslo segmentu a číslo reference spojené s prvním selháním

Rozpočty sídlí v záznamu TJBIG2SegmentGraphValidationOptions, jehož pole MaxSegments, MaxReferencesPerSegment, MaxTotalReferences, MaxReferenceDepth a MaxSymbols ohraničují každý průchod

Koncový stav je hodnota TJBIG2SegmentGraphValidationStatus od nezkontrolováno a platné přes odmítnutí voleb, selhání hlavičky a referencí, cykly až po porušení slovníku symbolů; HPDFJBIG2SegmentGraphValidationStatusName ji převede na text

FailureStreamKind prostřednictvím typu TJBIG2SegmentStreamKind říká, zda bylo první selhání nalezeno v streamu globals (jbsskGlobals) nebo v obrazovém streamu (jbsskImage)

THPDFJBIG2Decoder.LastSegmentGraphValidationInfo uchovává stejnou zprávu po LoadFromByteArray nebo LoadRegionFromByteArray

Podmínky selhání

Ověření odmítá poškozené či zkrácené hlavičky, hlavičky samostatných souborů ve vložených streamech, zakázané krátké a příliš velké dlouhé referenční tabulky, duplicitní či chybějící identifikátory segmentů, fyzicky dopředné závislosti, cykly závislostí, nadměrnou hloubku a přetečení nakonfigurovaného rozpočtu segmentů nebo hran

Obrazové segmenty musí používat asociaci stránek 1, globální segmenty asociaci stránek 0 a globální segment nesmí záviset na obrazovém segmentu

Vložené segmenty konce stránky, konce souboru a palety barev jsou odmítnuty, stejně jako segmenty regionu a informací stránky určené pouze pro stránky umístěné v JBIG2Globals

Hlavičky slovníků symbolů se kontrolují před dekódováním, takže deklarované nové a exportované počty symbolů, agregované vstupní skupiny symbolů a nemožné součty exportů selžou dříve než alokace bitmapy

Hranice dekodéru a cache globals

THPDFJBIG2Decoder, HPDFJBIG2NativeMMRDecode, HPDFJBIG2NativeRegionDecode a vložená volání HPDFJBIG2DecDecodeEx sdílejí stejnou politiku

Registrované nativní a externí backends používají již ověřené interní cesty, čímž se při běžném dekódování vyhnou duplicitnímu průchodu grafem

THPDFJBIG2GlobalsPool.Register přijímá pouze platný stream globálních segmentů, čímž zabraňuje vniknutí poškozených sdílených slovníků do znovupoužití na úrovni dokumentu

Samostatné soubory JBIG2 předané s Embedded = False zachovávají svou oddělenou cestu dekódování orientovanou na soubory

Viz podpora komprese JBIG2, THPDFJBIG2Decoder.LoadFromByteArray a THPDFJBIG2Decoder.LoadRegionFromByteArray