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