AcroForm relationship cache

HotPDF underhåller ett dokumentlokalt tvåvägsindex över terminala AcroForm-fält, kvalificerade fältnamn, widgetannoteringar, widgetordningstal och sidpositioner

Uppslagsbeteende

Fältindex och uppslag på kvalificerade namn använder direktarrayer och en skiftlägesokänslig namnkarta med öppen adressering efter det första bygget

Ett överordnat fält kan tillhandahålla ärvda /FT, /Ff och /Opt -poster utan att vara ett terminalfält; namngivna barn som group.a och group.b förblir separata indexerade fält

Namngivna barnfält skiljs från namnlösa widgetbarn oavsett om fältet och widgeten delar en ordlista eller använder separata ordlistor

GetLoadedFormFieldWidgetPageIndex slår upp ett widgetordningstal till dess sida, medan GetLoadedFormFieldIndexForAnnotation mappar en sidannotering tillbaka till dess fält och widgetordningstal

Medlemskap i annoteringsarray går före en widget /P -post, och den första matchande sidan i dokumentordning vinner vid felaktigt duplicerat medlemskap

Widgetar som utelämnats ur /AcroForm /Fields indexeras som föräldralösa för diagnostikens skull men exponeras inte som syntetiska formulärfält

Konstruktion och mutation

Cachen byggs lätt på en genomgång av fältträdet plus en genomgång av sidannoteringarna

Skapande av laddade fält utökar en giltig cache inkrementellt, medan fältborttag, namnbyte, widgetflytt, annoteringsborttag, registrering av sammanslagning, XFA-fältsammanslagning och sidtabellmutation ogiltigförklarar den innan grafen ändras

Nästa relationsfråga byggs om från den aktuella objektgrafen, inklusive widgetar vars /P -post saknas

Att ta bort ett terminalbarn tar bort dess egna widgetar och dess fältträdespost men behåller syskonen och deras ärvda inställningar

Anropa InvalidateLoadedFormRelationshipCache efter att ha ändrat AcroForm-, fält-, widget- eller sid /Annots, /Parent, /Kids, eller /P -ordlistor via råa objekt-API:er

Prestanda och ägandeskap

Namn- och objektkartorna håller sin lastfaktor under en halv och ger varmt uppslag med förväntad konstant tid

En regressionsgate bygger 10 000 laddade fält, bevisar linjär genomgångstelemetri och kräver att upprepat namnuppslag är minst 100 gånger snabbare än ett kallt bygge plus uppslag på Win32 och Win64

Cachen lagrar icke-ägande objektpekare och åtkomst till den laddade dokumentgrafen förblir serierad av anroparen

Se även: GetLoadedFormFieldWidgetPageIndex, GetLoadedFormFieldIndexForAnnotation, InvalidateLoadedFormRelationshipCache, GetLoadedFormRelationshipCacheStatistics