100 Commits
Author SHA1 Message Date
FredApps 3ad707d07b Test: wait for the paper row before clicking Custom… while discovery is pending (#6925)
adding_custom_paper_overrides_pending_driver_default clicked Custom… as soon as the background
paper read started; on hosted macOS the dialog hadn't drawn its paper row by then and the test
failed (no node "Custom…"). It now waits for the button, up to 10 s, before clicking. Found by the
first nightly macOS run.
2026-11-10 23:14:40 +01:00
FredApps 1be1cfa6ed CI: the workspace's tests on macOS each night (and on demand) (#6921)
Pull requests and main run Linux and Windows only; release.yml builds and signs the macOS app
without running the tests, so macOS-only failures went unseen. On 10 Nov 2026 a hand-started run
found three (two print tests and a bates test, fixed in #6905 and #6913) plus one more
(min_window, fixed separately). One macos-latest leg a night, through the shared gate.
2026-11-10 22:13:16 +01:00
FredApps 85987baef0 Test: at the minimum width on macOS the main menu may be the folded Menu button (#6920)
The menu bar folds titles that don't fit into "⋯", or all of them into one "Menu" when not even
the first fits. On hosted macOS, at MIN_WINDOW_SIZE, the bar is the Menu button (the system font is
wider), so the test's File menu item wasn't there and it failed; the main menu is still reachable.
A real macOS window uses the native menu bar.
2026-11-10 21:51:38 +01:00
FredApps b10f85262c Test: the non-UTF-8 output-name probe test doesn't run on macOS (#6913)
output_probe_paths_preserve_non_utf8_names creates files named with bytes that aren't UTF-8.
APFS keeps only UTF-8 file names, so on macOS creating the probe fails before the check runs and
the test fails; no output can have such a name there. It runs on the other unix systems as before.
Found running the automation tests on hosted macOS.
2026-11-10 20:57:08 +01:00
FredApps 8e6ec925c8 macOS: a job that names no paper tray asks for Auto Select (craft-print 1ee01a4c, #3752) (#6905)
* macOS: a job that names no paper tray asks for Auto Select (craft-print 1ee01a4c, #3752)

craft-print 1ee01a4c (storytold/craft-libs#232) sends `AP_D_InputSlot=` on macOS for a job whose
options name no tray, as the system Print dialog's Paper Feed: Auto Select does. Without it CUPS
used the PPD's default tray, and a printer whose default tray is empty held every job while CUPS
reported it completed (the Xerox AltaLink in #3752).

- The Print dialog's driver options take the queue's defaults through craft-print's
  apply_queue_defaults: option and choice names match as CUPS matches them, and on macOS the
  paper tray starts on Auto Select, which is what the job sends.
- The two tests that pin the exact `lp` arguments expect the Auto Select option on macOS.

* Tests: on macOS a CUPS queue on its driver's default tray shows Auto Select (craft-libs#232)

instances_read_the_queue_ppd_and_their_own_defaults and
a_queue_that_never_answers_is_given_up_at_the_deadline expected the PPD's default tray; on macOS
apply_queue_defaults now offers Auto Select first and as the default there, which is what a job
naming no tray sends. Found by running the print tests on hosted macOS.
2026-11-10 20:17:41 +01:00
FredApps 0bffa42fc5 Merge pull request #6889 from Combiler01/fix/continuous-scrolling-default-6780
fix: Continuous Scrolling toggle not working in Preference tab (#6780)
2026-11-10 20:05:21 +01:00
FredApps b16cd32659 Print: a printer's remembered paper wins over its driver's default paper (#6906)
#5861 (#6100) reads the chosen printer's papers and default paper in the background, and the
default replaces the dialog's paper unless it was chosen in the dialog (paper_overridden). The
paper a printer's setup restores (#2001, #6779) didn't count as chosen, so on Windows the driver's
default replaced it each time the dialog opened: an office printer last printed on A3 came back
on A4.

apply_setup now marks the paper it restores as chosen. A test drives the dialog with a printer
remembered on A3 whose driver's default is A4.
2026-11-10 20:03:14 +01:00
FredApps 655aa92b5e Merge pull request #6100 from Combiler01/fix/paper-size-driver-5861
fix(print): auto-detect printer paper size and add page setup sync (fixes #5861)
2026-11-10 18:18:09 +01:00
FredApps e03d5a1c29 Render: an isolated CMYK group of any size blends in CMYK, in bands (#6885)
* Render: an isolated CMYK group of any size blends in CMYK, in bands

hayro patch (27) blended an isolated DeviceCMYK transparency group in CMYK only up to 2^24
device pixels (a 4096 x 4096 square); a larger one was blended in RGB. Print as image renders a
whole page at once, up to 8192 px on the long side, so a page enlarged to 11 x 17 in at 600 dpi
(about 43 MP) blended any group covering most of it in RGB, and a print test file's CMYK blend
patches drew their X's. The same applied to exporting a large page as an image.

A larger group is now blended in bands of whole rows, each within the old limit: both ink passes
and the tint conversion run per band, so their memory stays as before, and only the finished
group (4 bytes a pixel) is kept whole. Every band is blended before any is drawn, so a group a
pass has no tints for is still drawn as before, whole.

The regression test lowers the band to 7 rows (set_cmyk_band_pixels, hidden, per thread like
set_skip_offscreen_paths) and checks the banded group matches the whole one across an
anti-aliased edge, and is CMYK's green where magenta is under black with Difference.

* Test: CMYK green through the profile is (0, 166, 81); check green against RGB's magenta
2026-11-10 18:11:33 +01:00
FredApps 1c1a5d746e Merge main and retain grayscale spooler conversion 2026-11-10 17:42:46 +01:00
FredApps 6748830620 test(print): assert idle prerequisites before testing worker wake 2026-11-10 17:36:40 +01:00
FredApps 4bbfd51718 test(print): isolate the options worker wake from printer discovery 2026-11-10 17:35:24 +01:00
FredApps fe70ecce73 Print in grayscale prints on a Windows driver with no grey option (#5806) (#6863)
* Print in grayscale prints on a Windows driver with no grey option (#5806)

Windows refused Print in grayscale ("the printer's driver did not retain the requested
grayscale; nothing was sent") on drivers that list no grey option the ticket can name:
Microsoft Print to PDF, and an HP Photosmart driver whose grey is its own vendor setting.

- On Windows, a grayscale job's copy for the spooler is made grey first with Convert colours
  (all pages, comments and form fields, black kept black, pictures re-encoded where they can
  be), and the job says so (Job::grey_pages). The driver is still asked for grey where it has
  it; one without prints the grey pages instead of refusing them. A copy that can't be read
  goes as it is and asks the driver strictly, as before.
- craft-print 970644b7 (storytold/craft-libs#774) adds Job::grey_pages and asks a driver that
  lists only psk:Grayscale for that, not psk:Monochrome.
- Both the Print dialog and doc_print go through spooler_copy, which now takes the job.

* craft-print 1146cdc4: craft-libs main with #774 (grey pages) and #773 (the CUPS printer list waits at most 15 s, storytold/pdfcraft#6761)
2026-11-10 17:31:12 +01:00
FredApps eaff44e4d7 Merge main and retain one printer for paper and duplex discovery 2026-11-10 16:45:09 +01:00
FredApps 257c026c8a fix(print): guard paper discovery and retain explicit custom stock 2026-11-10 16:42:49 +01:00
FredAppsandKyle Kassen afca38ad71 M10: retain printed artwork with indirect annotation metadata (lands #4668) (#6855)
* M10: retain printed artwork with indirect annotation rectangles

* M10: resolve indirect annotation appearance states when printing

* M10: follow bounded annotation reference chains when printing

---------

Co-authored-by: Kyle Kassen <85040622+KyleKassen@users.noreply.github.com>
2026-11-10 16:05:43 +01:00
FredApps 956935bf0b Merge main into #6820: the area's sheet uses the chosen paper's size, custom papers included (#6830) 2026-11-10 12:36:45 +01:00
e243022792 Print: custom paper sizes in the Print dialog, kept per printer with its setup (re-lands #2381) (#6830)
Brings back #2381 (by regendorf-ux), which #6706 reverted before v0.20.0 because its page-setup
rows made the Print dialog as tall as Preferences and failed the dialog-height test.

- Custom… beside Paper adds a named size in the preferences' unit (1 to 200 inches a side),
  kept with the settings; Remove takes it off the list. doc_print takes sizes such as 8.5x14in.
- #2381's "Remember this paper for <printer>" box and its separate printer-to-paper map are left
  out: since #6779 every printer keeps its paper, sizing and two-sided choice on its own (#2001).
  That setup now keeps the paper by name, so a custom paper is found again however the list
  changes, and one removed since leaves the paper as it is.
- The dialog scrolls within the screen since #6223, so the Custom… row no longer grows it.
- The Print part of the settings restore is its own function (clippy's complexity limit).

Co-authored-by: regendorf-ux <osvaldo.duran09@gmail.com>
Co-authored-by: regendorf-ux <338149330+regendorf-ux@users.noreply.github.com>
2026-11-10 11:43:49 +01:00
FredApps 5e114c716f Windows printing: craft-print 0e4943cb (winprint 3c978dfc): pages at the printer's resolution, QName tickets, padded integers (#4941) (#6793)
storytold/craft-libs#761 moves winprint to 3c978dfc: winprint.rs#19 draws each page at the
job's resolution instead of ~96 dpi (#4941, #2676), #12 writes QName ticket values as
prefix:local (#3823), #3 accepts whitespace around integer capabilities (#2430). Only the
craft-print and winprint lock entries move, plus winprint's windows-numerics dependency.
2026-11-10 03:22:11 +01:00
FredAppsandFredApps 72e0bec32a FormCalc: a script its own clock stops is abandoned, as when the wait runs out first (#6783)
A FormCalc script under a time limit is watched twice: the caller waits
`timeout` for it, and the interpreter reads its own deadline, set to the
same `timeout`, every 256 steps. Which one notices first is down to the
scheduler, and the two reported different things: the caller's outcome is
abandoned with no changes (the form's scripts go off), while the
interpreter's kept every change the script made before the deadline.

For a click script that loops on addInstance, that difference is 1000 rows
(the most one run may add). Since repeating subforms lay out up to 1000
rows instead of 50 (#4608, landed with #6716), keeping them means laying
out a 1000-row form again, twice, which takes most of a minute in the test
build. The engine test hostile_formcalc_scripts_cannot_hang_or_bloat_the_document
took 3.0 s when the caller noticed first and 46-61 s when the script did,
so it failed its 60 s bound at random.

Now a run stopped by its own clock reports what an abandoned run does: the
same error, no changes, abandoned. XfaSession treats that outcome like a
wait that ran out (the session is dead after it). Limits other than time
(steps, loops, depth) keep their changes as before.

Co-authored-by: FredApps <FredApps@users.noreply.github.com>
2026-11-10 01:21:02 +01:00
FredApps 821636fbeb Print: each printer keeps its paper, sizing and two-sided choice across restarts (#2001) (#6779)
After a print to a printer, its paper, page sizing (Fit, Actual size,
Shrink, Custom %) and two-sided choice are remembered for that printer and
brought back when it is chosen. The printer printed to last is preselected
after a restart while it is listed, else the system default. Saved as
print_printers, most recent first, at most 32; malformed entries are skipped.
2026-11-10 00:57:33 +01:00
FredApps 1afbc1254a Merge pull request #6525 from chamber074/fix/redact-nan-quads
redact: treat unusable /QuadPoints as absent in every reader
2026-11-08 19:06:24 +01:00
FredApps 8d4f2db5b1 Merge branch 'main' into fix/redact-nan-quads 2026-11-08 17:51:37 +01:00
FredApps 981193ad41 Merge pull request #6619 from FredApps/fix/rules-content-stream-api
fix(edit): restore page rules after the content stream API change
2026-11-08 15:30:47 +01:00
FredApps cb705f73de M0: restore page rules after the content stream API change 2026-11-08 14:59:05 +01:00
FredApps 4c49290289 Refuse ruled-line extraction after incomplete page content 2026-11-08 14:40:19 +01:00
FredApps 5b204d595b Refuse ruled-line extraction after incomplete page content 2026-11-08 14:39:34 +01:00
FredApps 6f5f361368 Refuse encoding unverified glyphs after a font decode allowance refusal 2026-11-08 14:39:32 +01:00
FredApps ef7f2f3116 Merge main and retain budgeted font decoding with indirect parameters 2026-11-08 13:56:26 +01:00
FredApps a59e43e8a4 Merge main and preserve strict form decoding during redaction 2026-11-08 13:50:52 +01:00
FredApps 82c2009d09 Merge pull request #6208 from vangel76/fix/5939-sign-need-appearances
Signing a form that sets NeedAppearances no longer makes Acrobat ignore the signature
2026-11-08 13:31:20 +01:00
FredApps 5e0619d7eb Merge pull request #1977 from vangel76/feat/redact-mark-regex
Redact: mark text by caller-supplied regex (#1886)
2026-11-08 13:30:34 +01:00
FredApps 6fa72b914c Merge pull request #4876 from vangel76/perf/write-full-retain-parsed-objects
perf(cos): write_full keeps the objects it parsed while numbering
2026-11-08 13:22:45 +01:00
FredApps efe75d3a30 Merge pull request #4874 from vangel76/perf/cos-reconstruct-4868
perf(cos): speed up byte searches during cross-reference reconstruction
2026-11-08 13:22:36 +01:00
FredApps 3ba5b28533 Merge pull request #1983 from vangel76/feat/optimize-target-bytes
Optimize: optional target_bytes for doc_optimize (#1889)
2026-11-08 13:22:27 +01:00
FredApps 3bfbe24d7b Merge pull request #1988 from vangel76/fix/min-window-width
UI: allow a half-screen window, and fold the mode bar when narrow (#1913)
2026-11-08 13:22:15 +01:00
FredApps ed71db7c0f Merge pull request #4878 from vangel76/perf/cos-serialize-fmt-4870
perf(cos): write hex strings, integers and references without the formatter
2026-11-08 13:19:42 +01:00
FredApps 04f3421c9f Merge pull request #5562 from vangel76/fix/bookmark-rename-select-5529
Select the bookmark title when creating or renaming a bookmark (#5529)
2026-11-08 13:19:34 +01:00
FredApps 7d02602bde Merge pull request #5564 from vangel76/feat/crop-toolbar-5330
Add Crop pages to the document quick toolbar (#5330)
2026-11-08 13:19:28 +01:00
FredApps ca888de41f Merge pull request #6067 from vangel76/contributors-vangel76
contributors: set names for vangel76
2026-11-08 13:19:21 +01:00
FredApps 0a7798707b Merge pull request #5825 from Piohrun/fix/flate-input-work
fix(filters): inflate with zlib-rs everywhere, and charge the image allowance for what Flate reads
2026-11-08 13:11:25 +01:00
FredApps 8287ad0d06 Merge pull request #6289 from Piohrun/fix/partial-content-rewrite
M2.6: never rewrite a content stream from the part before its damage
2026-11-08 13:10:56 +01:00
FredApps 5644d56c64 Merge pull request #6243 from alehel/refactor/page-press-edit-text
refactor(ui): tell Edit text, the text layer and links whether a press is theirs (router PR 4b)
2026-11-07 17:15:50 +01:00
FredApps 9dbede8709 Merge pull request #5816 from KenM76/feat/unreadable-object-report
feat(cos): list the objects that could not be read in doc_info
2026-11-07 16:01:52 +01:00
FredApps 33e3945c04 Merge main and preserve unreadable diagnostics with cached failures 2026-11-07 15:48:09 +01:00
FredApps 784ce9212b Merge pull request #6497 from helenkwok/web/page-api
pdfcraft-web: window.pdfcraft, the page command API from craft-web-api, opt-in with ?control
2026-11-07 15:39:11 +01:00
FredApps a94e90da65 Merge pull request #6471 from ZIDAN44/fix/6440-add-text-cmyk-gray
Add text: gray or CMYK colour, painted with g or k (#6440)
2026-11-07 15:39:04 +01:00
FredApps 09a63d6dd6 Merge pull request #6197 from KenM76/feat/rich-copy
M3: copy keeps formatting as HTML (Copy with formatting)
2026-11-07 15:38:59 +01:00
FredApps 21747a4e58 Merge pull request #5802 from KenM76/perf/failed-object-cache
perf(cos): an object that can't be read is searched for once, not on every read
2026-11-07 15:38:52 +01:00
FredApps f42fda7342 Merge pull request #6416 from storytold/house-rules
Copy the shared house rules into AGENTS.md
2026-11-06 14:58:52 +01:00
FredApps 465783fc47 docs: preserve local guidance in house-rules rollout 2026-11-06 12:37:25 +01:00
FredApps 81b0833b24 Copy the shared house rules into AGENTS.md.
The blocks come from craft-contrib at dde09ea31e2e457f5b4653a6e76f7cdf55944bdf. CLAUDE.md imports AGENTS.md. The house-rules workflow checks the copy.
2026-11-06 11:50:02 +01:00
FredAppsandClaude Opus 5.5 250c2623d1 Tests: pin the file identifier formula, not a whole rewritten file (#6346)
The written file differs on Windows, so an identifier hashed from it cannot be
pinned, and main's Windows gate failed. The formula is pinned on fixed bytes.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 22:44:29 +01:00
FredApps c56a63bcb6 Merge pull request #4732 from helenkwok/web/host-page
feat(web): page host mode, so a page can host PdfCraft in its own document (#4731)
2026-11-05 14:20:12 +01:00
FredApps 419b267ee5 Merge pull request #5125 from huppiflupp/feat/scan-clean
M10: Enhance scanned file cleans scanned pages in place
2026-11-05 13:36:55 +01:00
FredApps 65aa495c98 Enhance scanned file: re-render the page shown after a successful run 2026-11-05 13:19:49 +01:00
FredApps 9cc1736dc9 Enhance scanned file: decode bi-level images within the budget, DecodeParms resolved 2026-11-05 12:56:10 +01:00
FredApps 9927a1bd12 M10: page_enhance_scan as its own dispatch method
Main split Automation::call into per-tool methods and its clippy
cognitive-complexity limit (30) now fails with the inline arm.
2026-11-05 12:47:19 +01:00
FredApps 2f2d69be17 M10: merge main into feat/scan-clean; classify mixed scan pages in one pass
Merge origin/main. Conflicts: docs/changelog headers keep both histories;
edit/run.rs keeps EnhanceScan beside main's run_edit_page_image; optimize
images.rs keeps main's scaled() and the crate-visible jpeg(); the German
strings in ui-egui/src/i18n/de.tsv go with that file, which main moved to
craft-i18n. decode_samples now takes main's ImageBudget; a scan clean-up
run shares one sized by the file.

Review (CodeRabbit, scan_clean.rs): a page whose own images and a
scan-holding Form only together cover it now cleans the images and reports
the Form; a page whose images alone cover it reports its Form too. New
regression fails on the old classification.
2026-11-05 12:14:01 +01:00
FredApps 15c505d1c6 Merge pull request #3858 from Kronbii/fix/scan-image-resampling
M2: scans stay sharp at screen size and smooth when zoomed (area-average shrink, bilinear enlarge)
2026-11-05 06:03:58 +01:00
FredApps 84e85c1ff3 Merge pull request #5758 from hasannadeem/feat/update-check-preference
M14: Preferences can turn off the update check at start (#5737, #5460)
2026-11-05 05:39:12 +01:00
FredApps f3dc867651 Merge remote-tracking branch 'origin/main' into w
# Conflicts:
#	vendor/README.md
2026-11-05 05:14:13 +01:00
FredApps 21540829cd Merge pull request #5754 from agent-reed/fix/fill-sign-quick-bar-controls
M5.7: the Fill & Sign text controls use a colour dot and a size flyout
2026-11-05 04:48:17 +01:00
FredAppsandClaude Opus 5.5 943718ea98 fix(ui): About credits tables fit without side-scrolling and their columns resize (#6052)
* fix(ui): About credits tables fit without side-scrolling and their columns resize

The Contributors table and the Models table were egui Grids inside a
two-way scroll area: they opened wider than the dialog, so they scrolled
sideways, and Company and Model sat almost touching. Both are now
egui_extras tables. Each column opens at the width of its header and widest
cell, the spare width goes to the text columns (Name; Company and Model),
and every column edge can be dragged. Widening a column grows the table
like a spreadsheet, and only then does it scroll sideways; the header stays
put while the rows scroll. Counts and dates are right-aligned and every
cell is vertically centred.

The sorted column stays highlighted and its direction shows on the
toolbar's sort-order button, so headers no longer reserve room for an
arrow. The opening widths come from fit_widths, a pure function with unit
tests that a fitted table fills its room exactly and that only the text
columns give way when room is short.

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

* Let every credits column be dragged, and refit changed tables

The last column was egui's remainder column, which has no drag handle, so
it could only be resized from the edge before it. It is now an ordinary
column with its own handle.

A table keeps its column widths, so switching to a longer name left the
Name column at its old width and clipped the text. The table now goes
back to the opening fit whenever that fit changes: a longer widest cell
or a resized window. Dragged widths are dropped at that point.

fit_widths could overflow the room when one column hit the minimum,
because the other columns did not take up its share. Columns now give
way in proportion to their width above the minimum.

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

* Refit credits tables on what they measure, not the fitted widths

Comparing the fitted widths missed the case it was meant for. Name is the
only growing column, so a longer name takes its extra width from the
spare room and the fit comes out the same: a dragged Name width stayed,
clipping the longer name.

It could also drop dragged widths by accident. The fit comes from the
available width inside the scroll area, which scrolling can nudge, so
scrolling a widened table could reset it.

The table now compares the natural widths and the clip rect's width,
which scrolling does not move.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 04:33:21 +01:00
FredApps 13cb547434 Merge remote-tracking branch 'origin/main' into fix5754
# Conflicts:
#	crates/ui-egui/tests/it/fill_sign.rs
2026-11-05 04:06:56 +01:00
FredApps 713c61548f Merge pull request #5435 from agent-reed/feat/fill-sign-rail-default
M5.7: the quick bar's Fill & Sign button shows the tool it picks
2026-11-05 04:06:42 +01:00
FredApps 083b3aca44 Merge pull request #6087 from KenM76/feat/model3d-render
M12: model_render, a page's 3D model drawn to a PNG (stacked on #6069)
2026-11-04 20:19:35 +01:00
FredApps 52d68d7844 annot: share threed's MAX_MODEL_BYTES with model3d
main's 3D-embed change (#5808) added crates/annot/src/threed.rs with its own
pub MAX_MODEL_BYTES (same 256 MiB value), so both were re-exported from the
crate root and pdfcraft-annot no longer compiled after merging main. model3d
now uses threed's constant.
2026-11-04 19:52:51 +01:00
FredApps 697a02e2ef Merge storytold/main into feat/model3d-render
# Conflicts:
#	crates/automation/src/lib.rs
#	crates/automation/tests/it/main.rs
2026-11-04 19:52:51 +01:00
FredApps ef8c71ac9c Merge pull request #6069 from KenM76/feat/prc-render
M12: headless renderer for PRC models (`pdfcraft-prc-render`), stacked on #5786
2026-11-04 19:42:33 +01:00
FredApps 8f8842e3ab Merge pull request #5396 from KenM76/fix/ocr-edit-under-scan
fix(edit): an edited OCR phrase under its scan image is drawn on top (#3973)
2026-11-04 19:42:25 +01:00
FredApps 60894af44d Merge pull request #6125 from KenM76/feat/bookmark-clipboard
feat(ui): cut, copy and paste bookmark subtrees (#3994)
2026-11-04 19:33:28 +01:00
FredApps 9070431ed3 Merge pull request #5250 from KenM76/fix/cleared-max-len-stays-cleared
fix(forms): clearing a field's length limit leaves it with none, not its parent field's
2026-11-04 19:08:06 +01:00
FredApps 3788af11d3 Merge pull request #5808 from KenM76/feat/3d-embed
M12: add a 3D model (U3D or PRC) to a page with a poster (#1297)
2026-11-04 18:53:39 +01:00
FredApps 83cbf8f89f Merge pull request #5476 from KenM76/fix/xfa-check-button-width
M12: an XFA check box without a width is as wide as its box and caption
2026-11-04 18:53:31 +01:00
FredApps 5bf6b63910 Merge pull request #5487 from KenM76/fix/file-dialog-extension-case
fix(ui): list X.PDF in file pickers on Linux and the BSDs (#5481)
2026-11-04 18:53:24 +01:00
FredApps 0429b23ea9 Merge storytold/main into feat/prc-render 2026-11-04 18:51:49 +01:00
FredApps 8d7eb74ff7 Merge remote-tracking branch 'upstream/main' into pk-6125m 2026-11-04 18:50:24 +01:00
FredApps 7d17aea92c Merge pull request #5786 from KenM76/feat/prc-reader
M12: PRC reader crate (`pdfcraft-prc`) (#1297)
2026-11-04 18:50:09 +01:00
FredApps 899f3806b1 Merge pull request #5432 from KenM76/perf/png-predictor-bytes
perf(render): undo PNG predictors a byte row at a time (#5430)
2026-11-04 18:44:45 +01:00
FredApps 61b80cb646 Merge pull request #6115 from KenM76/feat/outline-io
feat(organize): export, import and copy bookmark trees (#6018)
2026-11-04 18:44:33 +01:00
FredAppsandClaude Opus 5.5 dddb38d6c2 engine: say why the test looks in the stream's own dictionary
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 13:52:33 +01:00
FredAppsandClaude Opus 5.5 8eb962d37b engine: the shared-JBIG2 redaction test looks for the key itself
This branch removes Document::jbig2_globals_ref, which #5910's test
used. The test now counts streams whose dictionary holds JBIG2Globals in
any spelling, which also covers the arrays and references the old
helper didn't read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 13:52:22 +01:00
FredAppsandClaude Opus 5.5 01751aeb7e Merge main into fix/flate-input-work
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 13:37:20 +01:00
FredAppsandClaude Opus 5.5 dabe243903 Merge main into fix/jbig2-dictionary-any-route
Brings in #5910 (shared JBIG2 dictionaries in Optimize). redact/image.rs
keeps MAX_PIXELS as MAX_REDACTED_IMAGE_PIXELS, now pub(crate) for this
branch's globals.rs, with its doc pointing at without_dictionary, which
replaces without_globals here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 13:36:56 +01:00
FredAppsandClaude Opus 5.5 f5a9494d4c redact: a dictionary reached through a reference to a reference may be stored again
Since #5548 cos reads an object that holds only a reference as what it
names. A shared dictionary named through such a chain, and a copy whose
parameters are given through one, can now be decoded, so the run can
store the image again instead of refusing. Both tests now accept either
outcome for those cases and, when the run goes on, check that the
dictionary isn't kept and LEAK_GLOBALS isn't in the saved file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 13:36:24 +01:00
FredApps e989e48e63 Merge pull request #6058 from Piohrun/fix/jbig2-page-refinement-area
fix(render): a JBIG2 refinement of the page refines only its area (hayro-jbig2 patch 16)
2026-11-04 13:33:52 +01:00
FredAppsandClaude Opus 5.5 1508ee2608 Merge main into fix/jbig2-dictionary-any-route
Brings in #5548 (crypt filters by reference):
- writer.rs: write_full keeps this branch's walk(), which reachable()
  shares, and walk() now also follows the references of a direct
  /Encrypt, as #5548 made write_full do; collect_refs is pub(crate) for
  #5548's encryption_members;
- document.rs re-exports both DECODE_PARMS_KEYS and Held;
- document/tests.rs keeps both sides' new tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 13:18:18 +01:00
FredAppsandClaude Opus 5.5 031af8cef8 vendor/README.md: one Test cell in the hayro-jbig2 row
The merge left a | after patch (13)'s test, which made a sixth cell and
hid (14) and (16) from the rendered table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 13:16:44 +01:00
FredAppsandClaude Opus 5.5 3ed799b6f8 Merge main into fix/flate-input-work
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 12:53:59 +01:00
FredAppsandClaude Opus 5.5 b14fccef1b Merge main into fix/jbig2-dictionary-any-route
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 12:53:55 +01:00
FredAppsandClaude Opus 5.5 160ee3d421 Merge main into fix/jbig2-page-refinement-area
vendor/README.md: patch (13), from #5999, goes into this branch's
hayro-jbig2 row ahead of (14) and (16).

The page-area test now fills the page's words with 1s, padding included:
since patch (13) new_with clears the padding, so the test no longer
exercised the page-width half of the mask.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 12:50:48 +01:00
FredApps 3683150ee0 Merge pull request #5803 from alehel/refactor/page-press-dispatch
refactor(ui): tell page modules whether a press is theirs (router PR 4a)
2026-11-04 11:56:35 +01:00
FredApps a4d148bf48 Merge pull request #6031 from dotCooCoo/fix/scroll-regression-1230
Scroll: smooth wheel bursts and preserve precise movement
2026-11-04 09:49:20 +01:00
FredApps 69fda9959e Merge storytold/main into fix/scroll-regression-1230 2026-11-04 08:56:42 +01:00
FredApps 9bbcde4699 Merge pull request #6063 from dotCooCoo/fix/continuous-scroll-prefetch
fix(ui): continuous view renders the pages ahead of the scroll
2026-11-04 08:56:30 +01:00
FredApps d21abe9881 test(ui): keep the eviction-order test over the window-sized allowance 2026-11-04 07:42:59 +01:00
FredApps 933a92fad0 Merge storytold/main into fix/continuous-scroll-prefetch 2026-11-04 07:42:58 +01:00
FredApps 1f8cb45353 Merge pull request #6065 from dotCooCoo/fix/window-sized-page-budget
fix(ui): size the whole-page raster allowance to the pages on screen
2026-11-04 07:42:41 +01:00
FredApps bde72b6f26 test(ui): pin the whole-page allowance ceiling per target 2026-11-04 07:03:52 +01:00