Wim Pomp
a6e8ed772d
doc typo
Fuzz / Fuzz (decode_comprehensive) (push) Failing after 1m14s
Fuzz / Fuzz (decode_image) (push) Failing after 39s
Fuzz / Fuzz regression (push) Successful in 40s
Rust CI / build (1.88.0) (push) Successful in 58s
Rust CI / build (beta) (push) Successful in 1m8s
Rust CI / build (nightly) (push) Successful in 56s
Rust CI / build (stable) (push) Successful in 58s
Rust CI / features (default,zstd) (push) Successful in 41s
Rust CI / features (jpeg) (push) Successful in 41s
Rust CI / features (lzw) (push) Successful in 41s
Rust CI / features (zstd) (push) Successful in 40s
Rust CI / other_archs (i686-unknown-linux-gnu) (push) Failing after 17s
Rust CI / clippy (push) Successful in 36s
Rust CI / test-platforms (ubuntu-latest) (push) Successful in 45s
Rust CI / features () (push) Successful in 37s
Rust CI / features (default) (push) Successful in 41s
Rust CI / features (deflate) (push) Successful in 45s
Rust CI / other_archs (powerpc-unknown-linux-gnu) (push) Failing after 11s
Rust CI / msrv (push) Successful in 1m0s
Rust CI / rustfmt (push) Successful in 29s
Rust CI / test-platforms (macos-26-intel) (push) Canceled after 0s
Rust CI / test-platforms (macos-latest) (push) Canceled after 0s
Rust CI / test-platforms (ubuntu-24.04-arm) (push) Canceled after 0s
Rust CI / test-platforms (windows-11-arm) (push) Canceled after 0s
Rust CI / test-platforms (windows-latest) (push) Canceled after 0s
2026-10-10 12:31:33 +02:00
Wim Pomp
9b452e93b7
- fix tiled image reading
Fuzz / Fuzz (decode_comprehensive) (push) Failing after 37s
Fuzz / Fuzz (decode_image) (push) Failing after 35s
Fuzz / Fuzz regression (push) Successful in 28s
Rust CI / build (1.88.0) (push) Successful in 46s
Rust CI / build (beta) (push) Successful in 38s
Rust CI / build (nightly) (push) Successful in 36s
Rust CI / build (stable) (push) Successful in 39s
Rust CI / test-platforms (ubuntu-latest) (push) Successful in 33s
Rust CI / features () (push) Successful in 29s
Rust CI / features (default) (push) Successful in 37s
Rust CI / features (default,zstd) (push) Successful in 36s
Rust CI / features (deflate) (push) Successful in 35s
Rust CI / features (jpeg) (push) Successful in 36s
Rust CI / features (lzw) (push) Successful in 35s
Rust CI / features (zstd) (push) Successful in 35s
Rust CI / other_archs (i686-unknown-linux-gnu) (push) Failing after 19s
Rust CI / other_archs (powerpc-unknown-linux-gnu) (push) Failing after 18s
Rust CI / rustfmt (push) Successful in 25s
Rust CI / msrv (push) Successful in 57s
Rust CI / clippy (push) Successful in 33s
Rust CI / test-platforms (macos-26-intel) (push) Canceled after 0s
Rust CI / test-platforms (macos-latest) (push) Canceled after 0s
Rust CI / test-platforms (ubuntu-24.04-arm) (push) Canceled after 0s
Rust CI / test-platforms (windows-11-arm) (push) Canceled after 0s
Rust CI / test-platforms (windows-latest) (push) Canceled after 0s
2026-10-03 23:07:34 +02:00
Wim Pomp
96d37bb087
- use a fork of the tiff crate to open RGBPalette tiffs
Fuzz / Fuzz (decode_comprehensive) (push) Failing after 27s
Fuzz / Fuzz (decode_image) (push) Failing after 36s
Fuzz / Fuzz regression (push) Successful in 29s
Rust CI / build (beta) (push) Successful in 40s
Rust CI / build (nightly) (push) Successful in 39s
Rust CI / features (default,zstd) (push) Successful in 35s
Rust CI / features (jpeg) (push) Successful in 35s
Rust CI / features (lzw) (push) Successful in 36s
Rust CI / features (zstd) (push) Successful in 36s
Rust CI / other_archs (i686-unknown-linux-gnu) (push) Failing after 19s
Rust CI / msrv (push) Successful in 56s
Rust CI / build (1.88.0) (push) Successful in 47s
Rust CI / build (stable) (push) Successful in 39s
Rust CI / test-platforms (ubuntu-latest) (push) Successful in 32s
Rust CI / features () (push) Successful in 31s
Rust CI / features (default) (push) Successful in 35s
Rust CI / features (deflate) (push) Successful in 37s
Rust CI / other_archs (powerpc-unknown-linux-gnu) (push) Failing after 17s
Rust CI / rustfmt (push) Successful in 25s
Rust CI / clippy (push) Successful in 33s
Rust CI / test-platforms (macos-26-intel) (push) Canceled after 0s
Rust CI / test-platforms (macos-latest) (push) Canceled after 0s
Rust CI / test-platforms (ubuntu-24.04-arm) (push) Canceled after 0s
Rust CI / test-platforms (windows-11-arm) (push) Canceled after 0s
Rust CI / test-platforms (windows-latest) (push) Canceled after 0s
2026-10-03 19:35:01 +02:00
Wim Pomp
12f16dbfdd
- ignore missing colormap
Fuzz / Fuzz (decode_comprehensive) (push) Successful in 1m39s
Fuzz / Fuzz regression (push) Successful in 27s
Fuzz / Fuzz (decode_image) (push) Failing after 37s
Rust CI / build (1.88.0) (push) Successful in 47s
Rust CI / build (beta) (push) Successful in 37s
Rust CI / build (nightly) (push) Successful in 39s
Rust CI / build (stable) (push) Successful in 37s
Rust CI / test-platforms (ubuntu-latest) (push) Successful in 31s
Rust CI / features () (push) Successful in 29s
Rust CI / features (default) (push) Failing after 35s
Rust CI / features (default,zstd) (push) Canceled after 0s
Rust CI / features (deflate) (push) Canceled after 0s
Rust CI / features (jpeg) (push) Canceled after 0s
Rust CI / features (lzw) (push) Canceled after 0s
Rust CI / features (zstd) (push) Canceled after 0s
Rust CI / other_archs (i686-unknown-linux-gnu) (push) Failing after 10s
Rust CI / other_archs (powerpc-unknown-linux-gnu) (push) Failing after 10s
Rust CI / msrv (push) Successful in 47s
Rust CI / rustfmt (push) Successful in 24s
Rust CI / clippy (push) Failing after 33s
Rust CI / test-platforms (macos-26-intel) (push) Canceled after 0s
Rust CI / test-platforms (macos-latest) (push) Canceled after 0s
Rust CI / test-platforms (ubuntu-24.04-arm) (push) Canceled after 0s
Rust CI / test-platforms (windows-11-arm) (push) Canceled after 0s
Rust CI / test-platforms (windows-latest) (push) Canceled after 0s
2026-10-03 16:50:04 +02:00
Wim Pomp
a8abdd2484
update README
Fuzz / Fuzz (decode_comprehensive) (push) Successful in 2m31s
Fuzz / Fuzz (decode_image) (push) Failing after 37s
Fuzz / Fuzz regression (push) Successful in 35s
Rust CI / build (1.88.0) (push) Successful in 52s
Rust CI / build (beta) (push) Successful in 47s
Rust CI / build (nightly) (push) Successful in 48s
Rust CI / test-platforms (ubuntu-latest) (push) Successful in 41s
Rust CI / features (default) (push) Failing after 35s
Rust CI / features (default,zstd) (push) Canceled after 0s
Rust CI / features (deflate) (push) Canceled after 0s
Rust CI / features (jpeg) (push) Canceled after 0s
Rust CI / features (lzw) (push) Canceled after 0s
Rust CI / features (zstd) (push) Canceled after 0s
Rust CI / build (stable) (push) Successful in 47s
Rust CI / features () (push) Successful in 29s
Rust CI / other_archs (i686-unknown-linux-gnu) (push) Failing after 16s
Rust CI / other_archs (powerpc-unknown-linux-gnu) (push) Failing after 9s
Rust CI / msrv (push) Successful in 55s
Rust CI / rustfmt (push) Successful in 24s
Rust CI / clippy (push) Failing after 32s
Rust CI / test-platforms (macos-26-intel) (push) Canceled after 0s
Rust CI / test-platforms (macos-latest) (push) Canceled after 0s
Rust CI / test-platforms (ubuntu-24.04-arm) (push) Canceled after 0s
Rust CI / test-platforms (windows-11-arm) (push) Canceled after 0s
Rust CI / test-platforms (windows-latest) (push) Canceled after 0s
2026-10-03 15:00:48 +02:00
Wim Pomp
934fde185a
Default missing PhotometricInterpretation to BlackIsZero
2026-10-03 14:52:07 +02:00
Aurelia Molzer
3302936b08
Merge pull request #415 from paolobarbolini/zstd-0.14
...
Upgrade zstd to 0.14
2026-09-06 18:22:06 +00:00
Paolo Barbolini
a5b9a57e09
Upgrade zstd to 0.14
...
Bumps the optional `zstd` dependency from `0.13` to `0.14` (pulls in
`zstd-safe` 8.0.0 / `zstd-sys` 2.1.0).
We only use `zstd::Decoder::new` for streaming decode, which is unchanged
in 0.14.0, so this is a pure version bump with no code changes.
Also worth noting: `zstd-safe` 8.0.0 fixes a dangling dictionary pointer
reachable from safe code, and `zstd-sys` 2.1.0 no longer needs `libclang`
by default. The crate stack moved from MIT to BSD-3-Clause (still
permissive, compatible with our MIT).
2026-09-06 16:59:40 +02:00
Aurelia Molzer
e27f6fe00d
Merge pull request #401 from jacovdbergh/fix-tiled-border-extra-samples
...
Fix: clip border tile rows when discarding extra samples
2026-08-10 18:46:22 +00:00
Aurelia Molzer
46b19cdacf
Merge pull request #407 from aarshivv/feat/old-style-lzw
...
feat: decode old-style (pre-TIFF-6.0) LZW streams
2026-07-25 08:11:01 +00:00
aarshivv
c27fd94e1d
feat: decode old-style (pre-TIFF-6.0) LZW streams
2026-07-25 12:45:40 +05:30
Aurelia Molzer
f28f5fc830
Merge pull request #406 from aarshivv/feat/cielab-16bit
...
feat: support 16-bit CIELab decoding
2026-07-24 10:55:17 +00:00
aarshivv
3436a2222b
feat: support 16-bit CIELab decoding
2026-07-24 13:40:56 +05:30
Aurelia Molzer
31919c7bfc
Merge pull request #386 from aarshivv/palette-cielab-transparency-lzw
...
support palette expansion, CIE L*a*b*, transparency mask, and lzw end…
2026-07-24 06:14:30 +00:00
aarshivv
d0c9198016
Merge remote-tracking branch 'origin/main' into palette-cielab-transparency-lzw
2026-07-23 00:52:37 +05:30
aarshivv
8f83f0fa82
chore: address review feedback on CIELab/TransparencyMask PR
2026-07-23 00:39:19 +05:30
Sergey "Shnatsel" Davidoff
f3f9ff1244
Merge pull request #398 from Shnatsel/safe-rust-zstd-2
...
Add safe Rust zstd decoding backend
2026-07-20 00:33:05 +01:00
Aurelia Molzer
a7dda6f4b1
Merge pull request #399 from lilith/fix/clamp-extended-depth
...
decoder: reconstruct extended-depth samples modulo declared bit depth (supersedes #396 )
2026-07-19 22:18:33 +00:00
Lilith River
35c14f1e3c
decoder: reconstruct extended-depth samples modulo declared bit depth
...
Promoted extended-depth grayscale (9-15 bits -> u16, 17-31 bits -> u32)
can carry bits above the declared depth after the horizontal predictor,
which reconstructs prev+delta in the promoted storage width rather than
modulo 2^BitsPerSample. This underflowed `max - v` in invert_colors (the
image-rs/image-tiff#396 panic in debug, wrong pixel in release) and left
junk in the high bits of the non-inverted output (#396 review, @197g:
"clamp the channel values in the non-inverted color case").
An n-bit predictor delta is stored in exactly n bits, i.e. modulo 2^n,
so reconstruction is defined modulo 2^n as well. Since 2^n divides the
u16/u32 storage modulus, masking each promoted sample with (1<<n)-1 once
after the predictor yields exactly the mod-2^n value -- including
legitimate wrap-arounds -- and also bounds any out-of-range sample from
malformed input. invert_colors' `max - v` is then always in range,
superseding the targeted saturating_sub from #396 .
mask_samples_to_bit_depth runs in every integer decode branch of
expand_chunk; outside the extended-depth unpacking branch it is a
statically provable no-op (promoted layouts, declared < storage, occur
only there -- sub-byte depths keep byte-granular storage and reject the
horizontal predictor, standard depths have declared == storage, and the
float predictor requires IEEEFP samples that are never promoted), so the
branches cannot diverge.
Adds exact-pixel regression tests on hand-built TIFFs: 12/20-bit
wrap-around (plain and WhiteIsZero) and a 9-31-bit encode/decode
identity sweep, alongside the two fuzzer-minimized panic seeds. A
saturating clamp corrupts the wrap-around cases -- 12-bit [4095, 0, 1]
is stored as deltas [4095, 1, 1] and masks back to [4095, 0, 1], but
saturating produced [4095, 4095, 4095] -- so the tests lock the modular
semantics.
2026-07-18 16:04:42 -06:00
Aurelia Molzer
a9cf5e17b9
Merge pull request #404 from kleinicke/fix-clippy-useless-borrow
...
Fix clippy 1.97 useless_borrows_in_formatting lint failing CI
2026-07-16 15:59:04 +00:00
florian and Claude Fable 5
6276defac6
Fix clippy 1.97 useless_borrows_in_formatting lint
...
Rust 1.97's new clippy lint flags the redundant `&` on `self.offset`
in Entry's Debug impl. CI runs clippy with -D warnings in every job,
so this single pre-existing lint currently fails all PR pipelines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 16:29:05 +02:00
jacovdbergh@gmail.com
dee0c2fb11
fix: clip border tile rows when discarding extra samples
...
Tiled images with a width that is not a multiple of the tile width
wrote the border tiles' horizontal padding into the next output row.
Fixes #400 .
2026-07-08 08:16:27 +02:00
Sergey "Shnatsel" Davidoff
11133cb1e3
upgrade zrip to 0.8.x series
2026-07-06 15:15:04 +01:00
Aurelia Molzer
8ad05b85db
Merge pull request #397 from soyosaki/lenient
...
Fix: add a lenient mode for image decoder
2026-07-03 14:36:35 +00:00
陈启
4a9e1d152b
fix: resolve comments
2026-07-03 18:49:16 +08:00
陈启
1c6001ea5d
fix: resolve comments
2026-07-03 17:19:48 +08:00
Sergey "Shnatsel" Davidoff
c0043c1a84
Use zrip-decode crate instead of ruzstd
2026-06-27 12:47:51 +01:00
陈启
c7a1176381
fix: eliminate clippy errors
2026-06-22 14:13:53 +08:00
陈启
a658c09f09
feat: add lenient decoder example
2026-06-22 12:02:54 +08:00
陈启
0309349e1b
fix: add lenient mode for tiff image decoder
2026-06-22 10:59:36 +08:00
陈启
279851a9a9
fix: correct extra bits rgb test assertion based on write extra bits
...
image logic
2026-06-22 10:58:42 +08:00
Aurelia Molzer
22b4c39254
Merge pull request #394 from powturns/main
...
Add PhotometricInterpretation unknown tag support
2026-06-02 17:50:20 +00:00
Dustin Thomson
f11a1c5393
Add PhotometricInterpretation unknown tag support
...
Provides a mechanism to support private or extension
photometric interpretations (such as CFA)
2026-05-28 08:48:12 -06:00
Aurelia Molzer
c4285aea4a
Merge pull request #393 from image-rs/bench-lzw
...
Fix benches/lzw.rs directory iteration
2026-05-16 15:59:17 +00:00
A. Molzer
a1426ca802
Fix benches/lzw.rs directory iteration
2026-05-16 02:28:36 +02:00
Aurelia Molzer
66e6567acc
Merge pull request #392 from image-rs/upgrade-weezl
...
Upgrade weezl to 0.2
2026-05-15 22:51:46 +00:00
A. Molzer
5947d3b72e
Make newer clippy happy
2026-05-16 00:46:02 +02:00
A. Molzer
0fdf1e0502
Upgrade weezl to 0.2
2026-05-16 00:40:00 +02:00
aarshivv
9924ea2721
chore: clean clippy deprecated warn in test case
2026-04-11 20:56:42 +05:30
aarshivv
30e04f3381
chore: drop palette and LZW, add tests for CIELab and TransparencyMask
2026-04-11 20:48:40 +05:30
aarshivv
dfd0191403
support palette expansion, CIE L*a*b*, transparency mask, and lzw end marker tolerance
...
Add expand_palette_to_rgb() for converting palette indices to RGB using the color map (1/2/4/8/16-bit indices, row-aligned sub-byte).
Accept CIE L*a*b* (photometric=8) as Lab(8) for 8-bit 3-channel images. Re-bias a/b from signed to unsigned during expand_chunk so callers handle CIELab and ICCLab the same way.
Treat TransparencyMask as grayscale instead of erroring.
Handle missing LZW end-of-information code gracefully when output was already produced.
2026-04-10 23:02:15 +05:30
Aurelia Molzer
cf9eee64ad
Merge pull request #383 from lilith/chore/fuzz-dict-and-target
...
chore: replace decode_image fuzz target with comprehensive decoder exerciser
2026-04-09 22:26:34 +00:00
Lilith River
a59db23341
chore: replace decode_image fuzz target with comprehensive decoder exerciser
...
Replace decode_image with decode_comprehensive, which exercises
per-IFD via a probe_directory helper:
- Tag iteration and value parsing for every tag
- SubIFD, EXIF, and GPS directory traversal via read_directory
- Image metadata (dimensions, colortype, color_map, chunk info)
- Layout queries (image_buffer_layout, image_chunk_buffer_layout)
- Per-chunk reads at first and last indices
- Full image decode via read_image
Three IFD traversal strategies:
- Linear iteration via next_directory (tolerates invalid
intermediate IFDs)
- Random-access via seek_to_directory (find_nth_ifd code path)
- Image-aware random-access via seek_to_image
Dictionary covers classic TIFF and BigTIFF byte order marks, and
common IFD tags in both LE and BE (image geometry, strips, tiles,
SubIFD, EXIF, GPS, ColorMap).
Strict resource limits (512 KB decode/intermediate, 64 KB IFD).
Bounded iteration (max 8 linear, max 4 seek).
2026-04-09 14:14:35 -06:00
Aurelia Molzer
e8103509fa
Merge pull request #385 from lilith/fix/colormap-shl-overflow
...
fix: prevent shift overflow panic in ColorMap size validation
2026-04-09 12:25:51 +00:00
Lilith River
26b18c5184
fix: prevent shift overflow panic in ColorMap size validation
...
`1usize << bits_per_sample` panics when bits_per_sample >= 64.
Use checked_shl to return a LimitsExceeded error instead.
Found by fuzzing decode_comprehensive with a BE TIFF containing
PhotometricInterpretation=RGBPalette and BitsPerSample=83.
2026-04-09 04:46:05 -06:00
Lilith River
b0712855b1
ci: add nightly fuzz workflow (60s on push, 5min nightly)
2026-04-09 04:43:12 -06:00
Lilith River
ea6e2a8d80
feat: add decode_comprehensive fuzz target with safe metadata probing
...
New fuzz target exercises TiffHeader::parse, dimensions/colortype
probing, chunk-by-chunk reading, and multi-IFD iteration. Guards
get_chunk_type/chunk_dimensions behind dimensions() success check
to avoid documented panics on non-image IFDs.
2026-04-09 04:43:12 -06:00
Lilith River
032421634f
chore: add fuzz dictionary for TIFF
...
Format-specific dictionary with LE/BE byte order marks, TIFF magic
number, and common IFD tag numbers as 2-byte LE and BE pairs.
Also add coverage to fuzz/.gitignore.
2026-04-09 04:43:12 -06:00
Aurelia Molzer
d760bd3442
Merge pull request #384 from image-rs/renovate-decode-iteration
...
Fix decode example/fuzz with new iteration
2026-04-08 18:49:52 +00:00
A. Molzer
a70e05e51e
Fix decode example/fuzz with new iteration
2026-04-08 20:43:12 +02:00