Commit Graph
4844 Commits
Author SHA1 Message Date
322a1b2ac0 M7: lay out the Edit panel as Acrobat's (#2245)
* M7: the Edit tab turns on Edit text & images, as in Acrobat

Entering Edit boxes every paragraph and image on the page at once, so text
is editable with one click instead of first finding Edit text & images in
the tool list. The floating toolbar gets an Edit text & images button while
Edit is open or the tool is in use. Leaving Edit (or turning the tool off
there) applies a paragraph still open in the editor, as clicking away from
it does; left open, its page kept showing the paragraph's text removed.

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

* M7: parity notes for the Edit tab turning on Edit text & images

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

* M7: the panel-reveal test looks for the Edit panel's own row

With Edit text & images on, its name is on the floating toolbar as well as in the panel, so
the label alone matched twice and no longer showed that the Tools tab was revealed.

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

* M7: lay out the Edit panel as Acrobat's

Under the Edit tab the panel is titled Edit, with Preferences and Close;
Modify page is a row of icon buttons (rotate, insert, delete, extract) and
Organize pages; Add content lists Text, Image, Header and footer, Watermark
and Link, with the rest under More; Other options links Combine files,
Redact a PDF and Prepare a form. The milestone banner and Ready chips are
gone; a planned item is muted and says when it ships. Every row still
comes from the catalogue. Edit text & images is on the floating toolbar.

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

* M7: Organize pages in the Edit panel opens the Organize workspace

It ran page.organize, which showed the page grid behind the Edit panel;
Acrobat replaces the panel with Organize pages' own. It now selects the
Organize tool, so its panel and the grid open together.

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

* M7: translate the Edit panel's Less and Other options

Every catalogue gets the two strings the Acrobat-style Edit panel adds.

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

* chore(i18n): refresh the catalogue hashes in ATTRIBUTION.toml

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

* M7: no idle selection hint above Format text in the Edit panel

"Shift-click to select several objects. Drag empty space to select an
area." sat at the top of the Edit panel whenever Edit text & images was
on, pushing Format text down; Acrobat's panel has no such line. The
selection count and how to move it still show while objects are
selected. Tests that read the hint as "nothing selected" check that no
selection count shows instead.

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

* M7: let auto-deref find the Edit panel's buttons (clippy)

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

* M7: the Edit panel keeps main's Add / Update / Remove menu

Main gave Header and footer, Watermark and Background a menu of Add,
Update and Remove in the tool panel (#1857). This branch draws the Edit
group in its own panel, so those rows ran only Add and Update / Remove
were unreachable there. Both panels now share one helper for the caret
and the menu.

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

* Edit panel: Modify page buttons follow command enablement; Organize pages with no document asks for a file

CodeRabbit on #2245: the four Modify page buttons were enabled from the catalogue
(always Ready) while execute() refuses them on a document that forbids page assembly;
they now use command_enabled. Organize pages with no document open selected a panel
with no grid to show; it now runs page.organize, which asks for a file first.

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

---------

Co-authored-by: abc2cb <271337822+abc2cb@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 17:33:59 -04:00
mtlcl410andClaude Opus 5.5 4ac31b3ffe M9: stop the side-by-side frame as soon as either half has closed (#3915)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R3niW7kVeT8mi7TpWc8eAJ
2026-10-22 05:07:42 +08:00
Philip 860a35a995 Merge remote-tracking branch 'origin/main' into feat/edit-scanned-page-offers-ocr 2026-10-21 22:03:41 +01:00
Philip ba6fb6aaf1 Merge remote-tracking branch 'origin/main' into feat/system-cjk-font-fallback 2026-10-21 22:03:41 +01:00
mtlcl410andClaude Opus 5.5 f945eff68a M9: closing a half of a side-by-side comparison keeps the app running (#3915)
Drawing a half can close its own tab (the snapshot bar's Close), which removed
or shifted the view indexes compare_area kept using: the right half's close
panicked at the scroll sync, the left half's in document_area for the other half.
Each half is now found again by id, and the frame ends when one is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R3niW7kVeT8mi7TpWc8eAJ
2026-10-22 04:56:40 +08:00
PhilipandClaude Sonnet 5.5 4895569476 M2: review of #1567: the viewer-wiring test no longer skips when the wiring is lost
CodeRabbit: the engine test skipped when the viewer's render was blank, so a
viewer pool that lost the installed-font fallback would have skipped instead of
failing. Whether this machine has a face that can draw the page is now asked of
a renderer with RenderConfig::system_fonts switched on by hand, and the viewer's
render must then draw it. Without the fallback on the viewer's pool the test
fails.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-21 21:45:28 +01:00
PhilipandClaude Sonnet 5.5 90c15aa514 M10: review of #1609: an automatic run's result waits for Read mode and dialogs
CodeRabbit: Edit refuses to start recognition in Read mode or beneath a dialog,
but a run started a moment earlier could finish after the user had switched to
Read mode or opened a dialog, and poll_ocr applied its result there. The result
of a run Edit started is now left until both are gone; a run the user asked for
completes as before. The unit test uses a made-up result, so it needs no OCR
models, and fails without the check.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-21 21:43:58 +01:00
Adrian ad28a5073a js_ui: put the preferences_body doc comment back on preferences_body (#3557)
The old doc comment was left above the constants added in this change, where it
documents PREFERENCES_BUTTON_ROW wrongly, and its "Returns true to close" no
longer holds for preferences_body, which returns ().

Move its first sentence onto preferences_body, drop the "Returns" sentence, and
leave each constant with only its own comment.
2026-10-21 16:11:11 -04:00
Dylan M. Taylor b1bf1cf01f ci: add sonar-project.properties for CI-based analysis
Marks the project ineligible for SonarCloud Automatic Analysis, resolving the
CI-vs-automatic-analysis conflict so the SonarCloud workflow succeeds.
2026-10-21 16:00:45 -04:00
Dylan M. Taylor 30b8c60b55 ci: add SonarCloud scan via shared reusable workflow
Calls storytold/craft-common-actions/.github/workflows/sonarcloud.yml@main
with secrets: inherit. Adds SonarCloud badge to README where missing and
removes the redundant sonar-project.properties (config now passed by the
reusable workflow).
2026-10-21 15:47:03 -04:00
kcobelli-pixelandClaude Opus 5.5 57d41762b5 M14: Italian catalog: the 8-character digital ID password message
Create a new digital ID rejects a password shorter than
sign::pkcs12::MIN_PASSWORD_CHARS (8) with "The password must have at
least 8 characters.", which the dialog shows through tl!. Italian only
had the older 6-character wording, so the message appeared in English.
Czech, Lithuanian and Vietnamese already carry the current key.

The other 67 keys some catalogs have and Italian lacks are not looked
up by the code: shortcut tooltips the code now fills from {key} rows,
older wordings, plain-string plurals and generic labels only ar/lt/vi
carry. The catalog's SHA-256 in ATTRIBUTION.toml is updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 21:44:49 +02:00
Adrian eaed3409f8 M14: the Preferences OK button stays in reach below the scrolling settings (#3557)
The settings scroll when the window is short, but OK was the last thing inside
the scrolled content, so in a short window it was off screen until you scrolled
to it, and the dialog was cut off partway through the theme cards.

OK is now a row below the scroll area, outside it. The scroll area gets the
height the window leaves (at least 60 pt, so OK stays on screen in the smallest
window, 520 pt, at the largest interface size, 300%) and a scrollbar of its own
instead of the floating one that lay over the right edge of the theme cards.

A scroll area starts from the room its modal offers, and a modal offers more
each frame for the first few, so with OK outside the scroll the dialog opened
small and stretched by about 45 pt a frame for ten frames, and clicks in the
first frames missed. The scroll area is asked for its full height from the start
(min_scrolled_height, which egui applies only when the settings overflow it),
so it opens at full size and does not stretch in a tall window.

- test: OK and the title are on screen at window heights from 173 to 1100; OK
  closes the dialog and does not move while the settings scroll, and a far-down
  setting scrolls into view between the title and OK; the dialog does not grow
  after it opens; a very tall window has no blank gap above OK. Both the
  original layout and the stretching variants fail them.
- parity: misc.preferences-dialog evidence and what is still missing.
2026-10-21 15:37:50 -04:00
mtlcl410andClaude Opus 5.5 81c08be3ea M6: a field without /TU shows no tooltip of its own (#3854)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R3niW7kVeT8mi7TpWc8eAJ
2026-10-22 03:37:01 +08:00
mtlcl410andClaude Opus 5.5 33150203a8 M6: test the read-only and blank-/TU tooltip cases (#3854)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R3niW7kVeT8mi7TpWc8eAJ
2026-10-22 03:37:01 +08:00
mtlcl410andClaude Opus 5.5 7ddb6226b8 M6: hovering a form field shows its tooltip (#3854)
The field's /TU is read into FormField::tooltip and shown in the Fields
panel, but resting the pointer on the field on the page showed nothing.
page_input now attaches it to the hover, as Acrobat does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R3niW7kVeT8mi7TpWc8eAJ
2026-10-22 03:37:01 +08:00
Philip 22636e3a79 Merge remote-tracking branch 'origin/main' into feat/edit-scanned-page-offers-ocr 2026-10-21 20:31:03 +01:00
Philip 23ea087fa5 Merge remote-tracking branch 'origin/main' into feat/system-cjk-font-fallback 2026-10-21 20:31:02 +01:00
Brandon ThomasandClaude Opus 5.5 3e3064532f Release: PdfCraft v0.11.0 (#3893)
* Release: PdfCraft v0.11.0

- Bump the workspace to 0.11.0.
- Fix main's red CI (cargo-deny): update rustls-webpki 0.103.15 -> 0.103.16
  (RUSTSEC-2026-0382) and webpki-root-certs 1.0.9 -> 1.0.10 (RUSTSEC-2026-0383),
  both reached through winprint's sigstore build dependency.
- `cargo xtask version set` now moves the workspace crates' pins in
  [workspace.dependencies] with the version; before, `cargo update --workspace`
  refused the bump and the pins had to be edited by hand.

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

* Tests: a healthy private retry may answer during the watchdog pass that scheduled it

shared_timeouts_retry_healthy_pages_privately_before_blacklisting failed on
CI (PR #3893): the try_recv that runs the watchdog spawns the private retries,
and page 1's retry has no gate, so on a loaded runner its healthy result
arrived before that same call read the channel. Accept that early answer
(page 1, no error) and use it as the healthy result; an error still fails.
Reproduced by sleeping 300 ms after the watchdog in try_recv: the old test
fails every time, the new one passes.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
v0.11.0
2026-10-21 15:27:33 -04:00
Philip 26dc2c390d Merge remote-tracking branch 'origin/main' into feat/system-cjk-font-fallback 2026-10-21 20:26:34 +01:00
PhilipandClaude Sonnet 5.5 3bdc4ddcc7 M10: review of #1609: test the Edit-triggered recognition rules without OCR models
FredApps: CI never fetches the OCR models, so the tests that recognize something
skip there and the recognition paths this PR adds went untested in CI.

The decision is split out of auto_ocr_scanned_page into scan_to_read, which
needs no models (the run itself judges the page's own text), with unit tests
that run everywhere: a picture page is read and a text or blank page is not;
only Edit being on starts it (its tab counts); Read mode and an open dialog
wait; a page already read is not read again and a page found no scan is judged
again once the document changes. Two mutants (no Read/modal guard; a no-scan
page never judged again) each fail one of them. The tests that recognize words
still need the models.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-21 20:26:24 +01:00
Philip 13605becce Merge remote-tracking branch 'origin/main' into feat/edit-scanned-page-offers-ocr 2026-10-21 20:17:50 +01:00
PhilipandClaude Sonnet 5.5 e42c21a3c8 docs: AGENTS.md §1.4 — the viewer may draw non-embedded CJK fonts with an installed face
Proposed for the maintainers to accept or drop (separate commit): the page
viewer, on screen only, may use one installed face for a CID font of an Adobe
CJK collection that a PDF does not embed. Exports, printing, OCR and the
automation tools never use it; nothing drawn with it is saved or printed; no
Noto CJK, Source Han or Adobe family is a candidate.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-21 20:17:27 +01:00
PhilipandClaude Sonnet 5.5 57a16aea17 M2: review of #1567: draw installed CJK fonts on screen only
FredApps: AGENTS.md §1.4 allows reading an installed font at runtime only as
the interface's last fallback and says nothing from it may enter a PDF or
package, while the renderer fallback also served exports and printing.

RenderConfig gains system_fonts, off by default. The engine sets it only on the
pool that draws the viewer (display_config); exports, printing, OCR and the
automation tools render with the document's own configuration, so nothing drawn
with an installed font is saved or printed. Tests: the render of a non-embedded
CNS1, GB1 and Korea1 font is blank without the flag and drawn with it; the
viewer's pool draws such a page and an export of it does not (it fails if the
flag is on everywhere). No Adobe-named font can be a candidate.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-21 20:17:27 +01:00
eliets2 4de9459f2f Give the print preview's grayscale tag a bit of its own
The preview was always monochrome, so the Print in grayscale checkbox appeared to do nothing but flicker between the colour thumbnail and the (wrongly) greyed sheet raster.

Move GRAYSCALE_TAG to a free tag bit (1 << 59) so it no longer overlaps PRINT_TAG, and let the colour and grayscale preview requests carry different tags so set_print_grayscale actually re-renders the right one.

Test: print_preview_tag_distinguishes_grayscale_from_colour failed before the change and passes after.
2026-10-21 21:48:08 +03:00
komo1iddinandClaude Opus 5.5 6495c08afd M7: a text editing session for one paragraph
A TextSession opens a paragraph once: it keeps the document as it was
and the page's lines then. Each draft is laid out on a copy of that
document, so no draft sees another's output, and the commit writes into
the document it was opened on, refusing ("the paragraph changed while it
was being edited") when that document has changed since.

text_edit_layout and rewrite_block now open a session and lay out or
commit once, so there is one path and their output is unchanged. No
caches yet: those come next, each under the same equivalence test.

First step of #2512.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 02:15:47 +08:00
komo1iddinandClaude Opus 5.5 f632c1b0ca M7: a resized page image stays blanked where the raster still has it
Two cases kept the old picture on screen after a move or resize:

- A page that had no tiles when the edit applied was taken as drawn
  again as soon as a first tile arrived, while its backdrop still had
  the picture. Out of date now means its whole-page raster or any tile
  still waits for a replacement.
- A second drag before the page was drawn again took the picture's
  pixels from its new frame, where the raster doesn't have it, and
  blanked only that. It now takes them from where the raster still has
  the picture and blanks that, and keeps it as the source on release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 00:26:39 +08:00
komo1iddinandClaude Opus 5.5 764439bbcc M7: hold an applied paragraph's look until every tile is drawn, and not after a turn
The look of an applied paragraph ended with the first whole-page raster.
On a tiled page the stale tiles are painted over that raster and can
still carry the old text. End it only once the page is no longer drawn
from before the edit: its whole-page raster (a tiled page's backdrop
too) and every one of its tiles has been replaced, whichever arrives
last.

Keep the page's turn on screen with the look, too: after the view is
turned, its position would be misplaced, so the raster shows instead,
as after a zoom.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 00:26:22 +08:00
komo1iddinandClaude Opus 5.5 08513ad906 M7: keep a paragraph open with its typing when its edit fails
Applying a paragraph takes the editor away before the edit runs. When the
edit failed (a letter no font can draw, for one), the error was shown
and the typing was gone with the editor. A refused form field already
opens again with its value.

Keep the editor whose edit was queued (applying it, or clicking into
another paragraph). If that edit fails it opens again with what was
typed and takes the focus, instead of the box the click moved to; a
successful edit drops it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 00:13:49 +08:00
Adrian 946a77cf9b M4: a new bookmark goes to where the reader is (#3865)
A bookmark made in the app always went to the top of the page. It now goes to
the top-left of the selected text, or with nothing selected to the top of the
window, as /XYZ left top null: the reader's zoom is kept, and with only the top
pinned so is the horizontal position.

- render: PageInfo::xyz_for_view, the inverse of dest_fraction. It pins only
  the coordinates given; on a page turned a quarter the displayed y decides the
  user left and the displayed x the user top.
- organize: add_bookmark_at and OutlineError::BadPosition (a coordinate that is
  not finite is refused before anything changes).
- engine: Edit::AddBookmark takes left and top (None, None is the page top, as
  before).
- automation: bookmark_add takes top and left in points from the top-left of the
  displayed page, as bookmark_list reports them, bounded and refused when not a
  usable number.
- ui: DocView::bookmark_position. It follows the window's vertical when the view
  is turned a quarter (View > Rotate View), picks the selection's corner that
  shows at the top-left, and in a spread of unequal pages uses the page that
  crosses the window's top edge.
- parity: organize.bookmark-add evidence and what is still missing.
2026-10-21 12:12:03 -04:00
komo1iddinandClaude Opus 5.5 b5ba176023 test: the paragraph editor is drawn at full colour from the click's own frame
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 00:09:21 +08:00
komo1iddinandClaude Opus 5.5 1f335a2bad M7: an added picture resized by a corner shows only at its new size
The page without an added item is rendered once per gesture so the
item's pixels can follow a move (MoveBackground). A corner resize got
none of that: only the outline followed the corner, the picture stayed
at its old size under it for the whole drag, and showed there again
after the release until the page was rendered.

Give a picture's corner resize the same background, and stretch its
pixels from the box it had into the dragged box, then into the applied
box while the page settles. Text resized by a corner rewraps, so it
keeps the outline only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 23:45:00 +08:00
komo1iddinandClaude Opus 5.5 7a7d39f01f M7: keep a moved or resized page image in place until its page is drawn again
A dragged page image is drawn from the page raster, blanked where it was
and stretched into its new frame. On release the edit applied and the
drag state cleared in the same frame, but the page raster on screen
still had the picture at its old size and place until its replacement
arrived. For those frames the old picture showed again around the new
frame, then jumped.

Keep the old and new frames on the selection after a release, and draw
the picture the way the drag did while the page is out of date: its
raster, or on a tiled page any tile, still waits for a replacement. A
failed edit never makes the page stale, so nothing is kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 23:15:28 +08:00
komo1iddinandClaude Opus 5.5 f7fc209498 M7: keep an applied paragraph's look until its page is drawn again
Applying a paragraph rewrites its page, but the page raster on screen
still has the old text until the page is rendered again. The textless
background and the editor went away on the frame the edit applied, so
for those frames the old text came back under the paragraph's new
outline, and then jumped to the new one.

The editor now remembers how it drew its text each frame. When the
edit that closes it is that paragraph's, the textless page and that
last look stay on screen until the page's new raster arrives, as
MoveBackground does for moved items. Any other edit, a zoom, or the
raster ends it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 23:10:44 +08:00
Combiler01 bc12134b51 Keep marked-content sequences whole when arranging images (#3145) 2026-10-21 20:40:24 +05:30
komo1iddinandClaude Opus 5.5 68c85bce6e M7: open the paragraph editor without a fade-in
The paragraph editor is an egui Area, and Areas fade in over the style's
animation time (0.2 s) each time they appear. While the editor faded, so
did its cover and its frame: the page's own copy of the paragraph showed
through it under the editor's text, and the frame pulsed from dim to
full. Every click into a paragraph did this.

Show the in-place editors at once: the paragraph editor, the editor for
text added in this session, the Fill & Sign text box and the form field
editor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 23:06:23 +08:00
Combiler01 ca20261b4f Broken Test Fixes 2026-10-21 20:26:47 +05:30
komo1iddinandClaude Opus 5.5 475f375ff4 M7: keep a word on its line when its spacing differs by less than a thousandth of an em
Joining runs into one line compared their character and word spacing to
1e-6. Word documents exported through macOS Quartz write 0.0001 Tc on
some words, so a line like "for company AEROSOL" split into "for
company A" and "EROSOL", two paragraphs that edit separately.

Spacing below a thousandth of an em, the unit glyph widths are given in,
can't be seen. Compare character and word spacing to that; scale and
rise still have to match exactly, and visible spacing still keeps runs
apart.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 22:41:17 +08:00
Hamza 755266cf9f cli: the argument bugs photocraft#7071 lists are live here too
Three of them, measured on main:

    pdfcraft-cli extract f.pdf --pages 1 --out --password
    (exit 0, and the PDF is in a file called `--password`)

    pdfcraft-cli check-one --edit f.pdf
    pdfcraft-cli: check-one: missing file

    pdfcraft-cli info /tmp/café.pdf          (that é as one Latin-1 byte)
    thread 'main' panicked at library/std/src/env.rs:878:51:
    called `Result::unwrap()` on an `Err` value

- An option whose value is a **file or folder** refuses a value that is another
  option, and names the way out for a file that really starts with `-`:
  `./--name`, as `--root` already offered. That also closes the gap the option
  walk left for those: an unknown option in a value position was skipped along
  with the option it followed, so `combine --out --nonsense` wrote `--nonsense`
  instead of saying what `--nonsense` was.

  Only those options. A password or a title can be any string, `--page`
  included — `an_option_shaped_password_is_not_parsed_as_a_page_flag` pins
  that, and a bad `--page` or `--dpi` is reported by the command in its own
  terms either way.

- `positional` asks the option table which tokens are values, instead of
  skipping the one after every option. The token after a flag that takes none
  is an argument: `check-one --edit f.pdf` read the file as `--edit`'s operand
  and then reported it missing.

- Arguments come through `args_os`, so one that is not UTF-8 is a usage error
  rather than a panic. `std::env::args` panics while collecting them, so even
  `--help` ended that way.

tests/options.rs covers each, and each fails without its fix (the file called
`--password` comes back; "check-one: missing file"; exit 101 with that report).
2026-10-21 18:45:04 +05:00
Combiler01 72028ba3cf fix: update rustls-webpki to patch RUSTSEC-2026-0382 2026-10-21 18:54:08 +05:30
Combiler01 96d738677b Update webpki-root-certs to 1.0.10 (RUSTSEC-2026-0383) 2026-10-21 18:44:57 +05:30
Combiler01 925241b502 Removed normalized-coordinate heuristic in crop_image_impl 2026-10-21 18:31:16 +05:30
Combiler01 cf336c2ff2 Stored the added-image rotation in the direction used by AddedImage.rotation 2026-10-21 17:49:31 +05:30
robertobulltech 1f78e2f37d M3: resize Pages inspector thumbnails (#3808) 2026-10-21 13:24:58 +02:00
johnpetersa19andCopilot App 8ea9049809 M14: update Brazilian Portuguese parity notes
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-10-21 08:19:51 -03:00
johnpetersa19andCopilot App 4eaba2bbcd M14: complete Brazilian Portuguese catalog
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-10-21 08:14:32 -03:00
Combiler01 b3b555ff5e Fixes the bug regarding duplicate images 2026-10-21 16:33:31 +05:30
Nikolai Nyegaard ca56271678 Preferences: list the languages alphabetically by their own name
- English (and Auto where offered) stays first as the source language and fallback; the rest sort by native name with accents folded, so Čeština is under C and Magyar under M; Cyrillic and CJK names follow the Latin ones
- The list used the registry order, which is the order the languages were added
2026-10-21 12:01:37 +02:00
Unhumanje cf565db3fe fix(annot): a comment listed many times gets one display appearance
with_missing_appearances_cached checked each /Annots entry against the source document, which never gets the appearance, so an annotation listed K times added K appearance streams to the display copy. The engine writes that copy on open and after every edit, so the display bytes grew with the number of listings: 20,000 listings of one Ink comment in a 136 KB file came to 428 MB.

Each annotation reference is now handled once per call, across all pages.
2026-10-21 11:24:48 +02:00
Unhumanje d335ff375d fix(xfdf): a field name full of periods no longer overflows the stack on export
The XFDF export nested one <field> element per period-separated part of a field's full name. A /T can hold periods of its own, so a name can have far more parts than the field tree has levels. Past 64 levels the import refuses the file the export wrote, and around 100,000 parts the recursive write overflows the main thread's stack and aborts the process.

The export now nests at most as many levels as the import reads back. The parts past the last level stay in the deepest element's name, and the import joins them back into the same full name.
2026-10-21 11:17:56 +02:00
Marco Arnulfo 8444a08c00 fix(cos): a repaired xref table fills only the numbers the damage leaves out (refs #1628) 2026-10-21 10:53:02 +02:00