Commit Graph
3518 Commits
Author SHA1 Message Date
aiongg bf27724f06 Merge PR #3652: Keep filtered inline images whole when their data contains EI
crates/content/src/lib.rs: kept #3259's eod argument; image_data_end takes eod and passes it to both end_of_image calls; inline_image tries unfiltered, then declared /L, then image_data_end(filter_eod).
2026-10-22 01:45:07 +00:00
aiongg cb48f53a1e Merge PR #2715: fix(automation): tools on a file the viewer reads fewer pages of answer instead of panicking 2026-10-22 01:45:06 +00:00
aiongg 3d8b906870 Merge PR #3543: M6: a push button's caption uses the font, size and color of its /DA 2026-10-22 01:45:06 +00:00
aiongg 510ca5d35f Merge PR #3631: Control channel: wait after a failed accept instead of retrying at once 2026-10-22 01:45:06 +00:00
aiongg c907fd2a81 Merge PR #2607: M12: Compare panel filters text changes and visual differences (gap 21) 2026-10-22 01:45:05 +00:00
aiongg bcad9a2e4c Merge PR #3814: fix(xfdf): a field name full of periods no longer overflows the stack on export 2026-10-22 01:45:05 +00:00
aiongg 0b3321b990 Merge PR #3011: M12: the page side of a measuring scale takes a unit, so 1:50 is 1 mm = 50 mm (#2752) 2026-10-22 01:45:04 +00:00
aiongg c9aff05965 Integration: #3864 one doc comment each for page_raster_out_of_date and page_out_of_date 2026-10-22 01:45:03 +00:00
aiongg caffb259f1 Merge PR #2280: Draw the widget border inside /Tx BMC so the reference app keeps it on focus changes (#1613) 2026-10-22 01:45:03 +00:00
aiongg 561c5de14a Merge PR #3952: M7: opening a paragraph leaves the page as it is until it changes 2026-10-22 01:45:02 +00:00
aiongg 16af57acac Merge PR #3942: M7: a text editing session for one paragraph 2026-10-22 01:45:01 +00:00
aiongg d9d3a8279f Merge PR #2584: M10: Two-sided starts at Printer default, so the printer's own duplex applies (#2422)
ATTRIBUTION.toml: kept main's sha256 lines; hashes recomputed after the track.
2026-10-22 01:45:00 +00:00
aiongg 874e276bac Merge PR #3725: Join /Contents pieces with a space in measure snap 2026-10-22 01:45:00 +00:00
aiongg 504b5ba5fd Merge PR #2603: fix(combine): let the cards zoom to 500% (#2531) 2026-10-22 01:45:00 +00:00
aiongg 6e2a449bf7 Merge PR #3318: M6: Optimize AcroForm JavaScript snapshots and diffs
parity/acrobat-features.toml: form calculation order entry keeps main's commands, tools and notes; evidence is the union of both sides.
2026-10-22 01:44:59 +00:00
aiongg 9d7ccc9cd2 Merge PR #2723: fix(edit): keep a one-row centred title centred when it grows (#2581) 2026-10-22 01:44:58 +00:00
aiongg d133dfbf75 Merge PR #1989: Edit images: rotate an image by any angle with a knob (#1940) 2026-10-22 01:44:58 +00:00
aiongg 43411bcf8a Merge PR #2506: Ctrl+V pastes a picture from the system clipboard onto the page 2026-10-22 01:44:57 +00:00
aiongg 7bef6fb7b4 Merge PR #2854: Redaction audit: an opaque filled Square annotation over text is a cover 2026-10-22 01:44:56 +00:00
aiongg c58f1a0ff7 Merge PR #3723: Redact: count shared outline items once so the walk ends 2026-10-22 01:44:56 +00:00
aiongg 7f1d4b6f80 Merge PR #2513: fix(sign): fill typed signature outlines with non-zero winding (#1786) 2026-10-22 01:44:55 +00:00
aiongg 4749f2f6bd Merge PR #3720: fix(render): hit-test selection against the glyph quad, not its bounding box (#3693) 2026-10-22 01:44:55 +00:00
aiongg 05eea2da3b Merge PR #2989: fix(sign): explain 0x8009001D and 0xC0000225 when a store key's provider fails 2026-10-22 01:44:55 +00:00
aiongg 9cb8f52294 Merge PR #3782: M6: XFA formattedValue shows a date in the field's display picture 2026-10-22 01:44:53 +00:00
aiongg a77d3d25ae Merge PR #3015: fix(comments): the note editor takes the keyboard once, so V and H pick tools again 2026-10-22 01:44:52 +00:00
aiongg da90eb93fb Merge PR #3259: fix(content): accept inline image EI without preceding whitespace (#3108) 2026-10-22 01:44:52 +00:00
aiongg ffcab7a777 Merge PR #3764: Print: keep the picked printer for the next print (#3537) 2026-10-22 01:44:52 +00:00
aiongg ee0b147a61 Merge PR #3728: Refuse redaction marks with no readable area instead of skipping them 2026-10-22 01:44:51 +00:00
aiongg e95fb49afa Merge PR #3716: fix(sign): embed the issuers of macOS Keychain identities 2026-10-22 01:44:51 +00:00
aiongg 5d7b9a98b3 Merge PR #3192: fix(forms): an XFA form whose config forbids dynamic rendering is static (#3180) 2026-10-22 01:44:51 +00:00
aiongg 4a73cacb85 Merge PR #3116: fix(render): emit clip-only text (7 Tr) to devices for text extraction (#3109) 2026-10-22 01:44:50 +00:00
aiongg 23ad2d6b2b Merge PR #3245: Draw a note without an appearance as a fixed-size icon at the corner of its Rect (#3175) 2026-10-22 01:44:50 +00:00
aiongg 2016fd43d8 Merge PR #3596: fix(print): restore previous paper size after leaving Label mode (#3564) 2026-10-22 01:44:50 +00:00
aiongg be1b2bb882 Merge PR #2963: Keep seconds in FormCalc Time2Num/IsoTime2Num for ISO 8601 times 2026-10-22 01:44:49 +00:00
aiongg 69ef1c18e6 Merge PR #3674: M8: applying redactions drops structure-tree references to the comments and fields it removes (#2874) 2026-10-22 01:44:49 +00:00
aiongg b57185f451 Merge PR #3623: Decode JavaScript hex and control escapes in AF script strings 2026-10-22 01:44:49 +00:00
aiongg f89d5b21d0 Merge PR #3864: M7: keep a moved or resized page image in place until its page is drawn again 2026-10-22 01:44:48 +00:00
aiongg c8e81d58d3 Merge PR #3681: M2: text extraction keeps doubled letters in text condensed to 20 Tz and below (#2457) 2026-10-22 01:44:48 +00:00
aiongg 96a345ecb2 Merge PR #2851: fix(print): offer the US #10 envelope as a paper size (#2734) 2026-10-22 01:44:48 +00:00
aiongg 09e5232ff1 Merge PR #3411: Honor single-page redaction selections 2026-10-22 01:44:46 +00:00
aiongg 06ab5aa275 Merge PR #3237: M8: phone pattern finds slashed and labelled unseparated numbers (#3205) 2026-10-22 01:44:44 +00:00
pr-keeperandClaude Sonnet 5.5 473d65da3e Merge upstream main d676fd44 into pr/attachments
Mechanical merge (ATTRIBUTION.toml): main's copy of the pinned files, hashes recomputed, both sides' catalog rows kept.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 01:31:45 +00:00
d676fd44ea M6: Prepare a form ▸ Text field table: rows and columns of text fields as one edit (#3479)
* M6: Prepare a form ▸ Text field table: rows and columns of text fields as one edit

Drag an area with the Text field table tool and set it up in a movable
window: rows, columns, row and column spacing, the first row number,
column widths (draggable dividers, arrow keys once focused) and a name
pattern per column, with the table previewed on the page. Add fields adds
every cell as one undoable edit ("Add text field table").

- forms: `table` lays the table out in view space and names its cells. It
  refuses the whole table for a cell under MIN_FIELD_SIDE (now one
  constant) or a name with a period, used twice or already taken, and
  free_base picks the first free TableK for default names.
- engine: `field_table::edit` maps the cells onto the page, /Rotate and
  /UserUnit included, and checks their size again there.
- automation: `form_add_field_table`, with an end-to-end test.
- ui-egui: the window belongs to one page of one document and closes when
  that stops being the one prepared; Enter commits a number instead of
  adding the table; dividers between many columns no longer panic in
  f64::clamp. Strings in all 22 catalogs, and the Spanish engine-wording
  tests cover the table's mistakes.
- parity: form.multiple-copies is partial; copying an existing field into
  a grid is still missing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* M6: text field table: refuse corners past the page's number range, run it by its command

Review follow-up on #3479.

- engine: a corner finite as an f64 but past f32's range came back from
  the page's f32 mapping infinite. With one such corner a side was
  infinite rather than NaN, so the cell passed and add_field refused it
  only once the edit was applied ("the field is too small"). The edit now
  refuses any corner that isn't finite on the page with the table's own
  reason, before anything is added.
- automation: form.add.text_table runs form_add_field_table through
  command_run, as comment.stamp runs stamp_custom.
- ui-egui: doc comments for the window's three remaining helpers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* M6: text field table: close on document edits, lay out once per change, keep Escape for fields

Review follow-up on #3479 (benandez).

- The window belongs to the document as it was when it opened: it closes
  when the edit generation moves (a page rotated, moved or deleted, an edit
  undone), so a table set up for one page never lands on another or off it.
- The table is laid out and checked once per change, not several times a
  frame: the window and the page preview share one `Laid` (cells and the
  edit), and the preview draws only the cells in view, naming only those
  with room for a name.
- Escape in a field of the window leaves the field and keeps the setup; a
  second Escape closes the window.
- A table placed with a click is moved in from the page's edges, so all of
  it is on the page.
- `free_base` takes one pass over the names; `{seq}` is documented as
  counting from the first row number; `form_add_field_table` takes its
  names from the batch instead of laying the table out again; the
  unreachable `Dialog::FieldTable` arm says why it is there.

Each new test fails with its fix reverted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BfMGHQNgdq5yf5tKZHGR3z

* M6: text field table: drawn with its panel closed, the window opens Prepare a form instead of closing

With the tool picked and the Prepare a form panel closed, the form is
still prepared and a table can be drawn. Drawing sends the tool back to
Select, though, so nothing was prepared on the next frame, and the table
window, which lasts only while the form is prepared, closed itself at
once: the table couldn't be set up. Opening the window now opens the
Prepare a form panel it belongs to. Closing the panel while the window
is open still closes the window.

Found by CodeRabbit, which saw the preview stop drawing; the window
closing first was the larger effect. prepare.rs
a_table_drawn_with_the_panel_closed_opens_it_again fails without the fix
("the window stays open": (None, false)).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BfMGHQNgdq5yf5tKZHGR3z

* Drop the second generation binding the main merge left in document_area

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: aiongg <aiongtaigi@gmail.com>
2026-10-21 21:27:31 -04:00
Osvaldo Duran MelendezandClaude Opus 5.5 102f0b7bfb Merge upstream main ffaf3123 into pr/attachments
Only ATTRIBUTION.toml met this branch: main's copy, hashes recomputed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 20:51:29 -04:00
mtlcl410andClaude Opus 5.5 09668ce885 M10: a swapped post 2.0 table's glyph names serve /Differences (#2946)
Review follow-up on #2949.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Gv2WwdgjmBz33GWkwgNn3Q
2026-10-22 08:40:08 +08:00
mtlcl410andClaude Opus 5.5 b67a8bf268 M2: a post table version with swapped halves doesn't make a font unusable (#2946)
Vendored hayro-interpret refuses an embedded font whose `post` table
version isn't 1.0, 2.0, 2.5 or 3.0 (a guard from pdf.js issue 9462).
ScanSoft PDF Create! writes the version of every font it embeds with its
16-bit halves swapped (`00 00 00 03` for 3.0), so those fonts were refused
and their text drawn with a substitute: Hebrew came out as Latin
look-alikes or not at all.

1.0, 2.0 and 3.0 with swapped halves are now accepted too; any other
unknown version is still refused. PdfCraft patch (38) in vendor/README.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RUNQSPVXx3dDBabRZHAnjz
2026-10-22 08:40:08 +08:00
ffaf312358 M6: Prepare a form ▸ Calculation order: a page to reorder, check and fix the order fields calculate in (#3733)
* M6: renaming a field renames it in the calculations that read it

A rename silently broke every formula that used the field: a sum dropped
it, notation read it as 0 and a script kept a stale value. set_props now
rewrites the name in each field's Calculate script, in the same edit:
AFSimple_Calculate field lists, simplified field notation (the BVCALC
comment and its translation) and getField calls naming it in one string
literal. The rest of each script is kept as written; names built at run
time, non-UTF-8 script streams and a name another field still has are
left alone, and a self-check keeps a script whose meaning would change.

Notation is read by one lexer shared by notation_js, eval_notation and
the rename. form_set_props returns formulas_updated; Field Properties
says how many calculations now use the new name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BfMGHQNgdq5yf5tKZHGR3z

* M6: form_set_props leaves the renamed field out of formulas_updated by object

The renamed field was matched by the name given, but set_props stores it trimmed and under
its parent's prefix. When the same call changed the field's own formula, formulas_updated
listed the field as one the rename had rewritten.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BfMGHQNgdq5yf5tKZHGR3z

* M6: calculation order: read, check, fix and set the order fields calculate in

A form's calculations run in its calculation order (/CO), which a field
joins when it gets a calculation, so a chain defined in the wrong order
shows stale values. calculation_order reads the order against the fields,
with what each formula reads (field lists, notation names, literal getField
names) and what is wrong: a field reading one that calculates later, a loop
(strongly connected components, found without recursion), a field /CO
leaves out, and /CO entries that calculate nothing. Fix order is a stable
topological sort that moves only what must move and leaves loops alone.
set_calculation_order writes /CO afresh; a name two fields share (a
malformed form) stands for the next of them in the current order.

Edit::SetCalculationOrder sets it in one undo step and recalculates, and
form_calculation_order reads, sets, moves one field or fixes the order
headlessly. An edited formula now keeps its field's place in /CO, a field
/CO lists twice calculates once, and recalculation runs each field by
object, so two fields sharing a name both calculate. The /CO code of the
Calculate tab, field scripts and recalculation goes through one place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BfMGHQNgdq5yf5tKZHGR3z

* M6: Prepare a form ▸ Calculation order: a page to reorder, check and fix the order fields calculate in

The calculated fields in the order they calculate (/CO), each with its
formula and the value it shows, moved with Up/Down arrows (as Acrobat's Set
Field Calculation Order), Alt+Up/Down or by dragging. A card says which
fields read one calculated later, which read each other in a loop and which
/CO leaves out, and holds Fix order; a loop's card opens one of its
formulas. On the page, arrows show what the field in focus reads and what
reads it, with each linked field's step. The order is a page of the Prepare
a form panel, opened from its Fields tools, with a back arrow to Prepare a
form; opening it ends Preview and closes the page grid.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BfMGHQNgdq5yf5tKZHGR3z

* M6: form.calculation_order runs form_calculation_order headlessly

The command had no tool linked, so command_list showed none for it and
command_run refused it. form_calculation_order is now its tool: run without
a change, it reads the order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BfMGHQNgdq5yf5tKZHGR3z

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: aiongg <aiongtaigi@gmail.com>
2026-10-21 20:30:58 -04:00
jonathanwxh-cell 895ccb90c3 fix(engine): guard undo and redo refresh and roll back on failure (#3925) 2026-10-22 08:28:37 +08:00
Osvaldo Duran MelendezandClaude Opus 5.5 f325b63c8a Merge upstream main dbc7130b into pr/attachments
Only ATTRIBUTION.toml met this branch: main's copy, hashes recomputed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 20:19:16 -04:00
jonathanwxh-cell b388116c86 Merge latest main and preserve both roadmap histories
Retain the calculation-order update and inline-image repair entry.
Position the repair entry away from concurrent top-of-log additions;
parser and render regression code remain unchanged.
2026-10-22 08:10:54 +08:00