Files
pdfcraft/crates
Grzegorz MartensandClaude Opus 5.5 6b53325f28 M11: Optimize stores one-bit images and masks past 80 million pixels as monochrome images
The image steps leave an image over 80 million pixels alone, for memory:
decoded at eight bits a pixel or more, it would hold 80 MB a component
and more. An image already of one bit a pixel holds a byte for each 8
samples of a row, so a large black-and-white scan (an A0 page at 600 ppi
has about 560 million pixels) was left as stored though its samples
would take less than 80 MB.

The monochrome step now takes an image of one bit a pixel as stored (an
image mask, or one bit in one colour component), a picture's one-bit mask
included, while its rows hold no more bytes than 80 million pixels of
eight bits (`one_bit_bytes`): up to 640 million pixels when it is wide,
and a strip one sample wide no taller than before. One it would pack
from eight bits keeps the 80 million limit, as it is decoded at eight
bits first. A fax image's code is allowed no more than 80 MB for its
pixels however large the page, and four bytes a row, where it was
allowed about a byte a pixel (`fax_code_allowance`). When planning how
many pictures run at once, a one-bit image counts as the bytes its rows
hold and one more a row, as decoding allows each row's end a few bytes
besides its samples. The optimize README and the parity note say which images the monochrome
step now takes, and the note states JBIG2's limit of 2^28 pixels in all,
as the README does.

`group_4_takes_images_of_one_bit_a_pixel_up_to_the_pixel_limit` now
expects its one-bit image of 10,000 by 8,001 stored again, where it was
left alone. The packing path counts what it decodes, for the tests, as
the one-bit path does.

Tests: `one_bit_images_past_80_million_pixels_are_stored_as_group_4` (a
one-bit image, a picture's stencil mask and a picture's one-bit soft mask
of 9,000 by 8,900), `a_one_bit_image_past_80_million_pixels_is_averaged_with_the_default_settings`,
`an_image_too_large_for_the_jbig2_decoder_stays_as_it_is` (2^28 pixels
stored as JBIG2, a row more left alone, and averaged), and the unit
tests `one_bit_images_are_decoded_up_to_their_own_limit` and
`a_one_bit_picture_counts_as_the_bytes_of_its_rows` (each with a strip one
sample wide, at its limit and past it) and
`a_fax_images_code_is_allowed_80_million_bytes_and_four_a_row` and
`a_zero_wide_image_is_not_decoded`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmsdeUCdTaD72jkDw2pJKY
2026-11-11 00:54:22 +01:00
..
…
2026-11-09 18:32:42 +07:00
…