Supplied-family fallback for scalar fields
Ordinary text fields, comb cells, choice display labels, checkbox and radio marks, password masks and native pushbutton captions can use the same explicitly supplied font families as rich text without changing their scalar form metadata
Provide one through sixteen distinct configured labels and their regular TrueType programs, then enable FallbackFontFamilies; selection covers complete graphemes and does not use installed system fonts
Existing plain wrapping, spacing, shaping, bidi, clipping, rotation, automatic sizing, selected list rows and export-state behavior remain active; mixed comb fields keep the original scalar-cell restrictions and do not accept complex shaping that the original comb profile rejects
Mixed plain appearances may contain child Forms and several actual embedded fonts, so consume the returned object count rather than assuming a fixed seven-object appearance
Windows JSON and callback transport
{
"schemaVersion": 1,
"type": "forms.fill",
"fontFamilies": ["Primary", "Serif", "Sans"],
"fallbackFontFamilies": true,
"fields": [
{"name": "Plain", "value": "A\u03a9"},
{"name": "Check", "value": "Yes"}
]
}
For Windows jobs, supply each configured family's regular font file through the existing fonts object; for hpdf_document_execute_json_v1, return its real regular program through the existing versioned font callback and IO extension
Explicit named fallback routes a pure scalar fill through the same authenticated candidate transaction as mixed typed runs; scalar-only operations request regular candidate faces and return typedRichText=false with scalarFamilyProfile="supplied-regular-fonts-v1"
FDF and XFDF scalar imports use the same supplied-family path for text, choices, checkboxes and radio buttons; pushbutton captions use the native caption API and are not imported as scalar button export states
Windows scalar same-value imports and fills retain their existing value-only no-op contract and preserve exact committed bytes, including read-only fields; they do not compare a new font or color configuration with the existing AP, so use a native family setter for an explicit appearance rebuild
Original typed rich runs retain their existing style and appearance comparison; adding scalar fallback does not quantize typed sizes or colors or change authored RV
PDF and result callbacks must both succeed before a context update becomes visible; sticky font and IO errors, cancellation, budgets, encryption authentication and signature policies preserve the committed graph and atomic file output
A cleared single-selection choice stores /V null and an empty index array; an explicitly selected empty export option retains /V () and its actual index, so repeated clears and empty-value selections remain distinct
A legacy blank choice with no selected index and no empty export option can be recognized as a value-only no-op; a read-only choice with a real selected empty export cannot be cleared
Native Linux JSON and callback transport
Linux versioned operations accept the same ordered fontFamilies and fallbackFontFamilies options; regular programs are resolved through the operation's Fontconfig environment and supplied to the native family appearance APIs
Scalar text, comb cells, choice labels, checkbox and radio marks, password masks, file-select fields and explicit pushbutton captions use real complete-grapheme coverage; scalar FDF/XFDF imports load regular candidates without adding an authored rich-text flag or RV
Rich-only imports retain their actual required style union instead of requesting every family's regular face, while mixed scalar and rich imports add the regular candidates required by the scalar fields
Linux callback imports preserve exact committed bytes for repeated clears and same-value no-ops; authenticated AES R5/R6, P1/P2/P3 and FieldMDP policies, cancellation and publication failures retain the prior committed document
Run Tests/Linux/Run-ScalarFontFallbackChecks.sh LIBRARY FIXTURES FONTS OUTPUT against each freshly built native ABI library; Tests/Linux/HeadlessScalarFontFallback.en-us.md describes the genuine signed inputs, isolated three-font catalog and independent glyph/CMS checks
Reproduce the conformance checks
The public Windows runners accept explicit source, output, font, scalar fixture, clear fixture and genuine signed-policy directories; they never silently consume a previous private proof directory
Generate the initial four-field documents with Tests/Linux/Build-HeadlessTypedFormFixtures.py, then pass its mixed.pdf to the scalar and clear fixture producers
python Tests/CABI/BuildScalarFixtures.py work/typed/mixed.pdf work/scalar
python Tests/CABI/BuildScalarClearFixtures.py work/scalar/scalar.pdf work/clear
Supply genuine regular programs named primary-0.ttf, DejaVuSerifCondensed.ttf and DejaVuSans.ttf; the regression fixture producer Tests/Linux/Build-HeadlessRichFontListFixtures.py prepares the deterministic Primary subset and all twelve real style programs from a caller-provided DejaVu font directory
Generate real P1, P2, P3 and FieldMDP documents with Tests/Linux/Run-HeadlessTypedFormTests-Windows.ps1 and its required certificate/key identity directory; its outputs include p1-signed.pdf, p2-signed.pdf, p3-signed.pdf and lock-signed.pdf
Tests/CABI/RunScalarClearNative.ps1 -SourceDirectory Lib -OutputDirectory work/native `
-FontDirectory work/fonts -FixtureDirectory work/scalar `
-ClearFixtureDirectory work/clear -PolicyDirectory work/signed
Tests/CABI/RunScalarClearABI.ps1 -SourceDirectory Lib -OutputDirectory work/abi `
-FontDirectory work/fonts -FixtureDirectory work/scalar `
-ClearFixtureDirectory work/clear -PolicyDirectory work/signed `
-LegacyFixtureDirectory work/typed -LegacyFontDirectory work/legacy-fonts
The legacy regression parameters take the existing Windows typed-form fixture and font directories used by Run-WindowsTypedFormChecks.ps1; the new scalar checks also independently inspect actual embedded programs, CID maps, form values and retained signed ByteRanges
Windows DLL no-ops preserve exact committed bytes after both callbacks succeed; native mixed transactions also publish the exact source bytes when all updates are unchanged and the graph has no pending edits, while pending graph edits remain in the prepared revision even when the field update count is zero
FDF distinguishes an empty selection array from a selected empty export string; lossless XFDF choice exchange uses the namespace-qualified empty-values extension for an explicit clear, while an unmarked empty value retains its existing target-option interpretation