3416 Commits
Author SHA1 Message Date
Samvardhan SinghandEugene Kliuchnikov e2948747fe Drop -lm from libjxl_cms and libjxl_threads pkg-config files on MSVC (#5061)
There is no separate math library with MSVC: the math functions are part
of the C runtime. libjxl.pc already leaves -lm out on MSVC (#4314), but
libjxl_cms.pc and libjxl_threads.pc still list it, which gives link
errors in client applications that use these files with MSVC.

Add PKGCONFIG_MATH_LIB next to PKGCONFIG_CXX_LIB and use it for both
files. This is the same change vcpkg carries for its libjxl port
(microsoft/vcpkg#53773).

Fixes #4966

Tested: with AppleClang 15 on macOS, the generated libjxl.pc,
libjxl_cms.pc and libjxl_threads.pc are byte-identical before and after
this change. A configure-only run with MSVC forced on produces no -lm in
any of the three files.

Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-10-27 12:13:12 +00:00
LongYinanandEugene Kliuchnikov ec2982b1f7 Reject PNM/PAM samples above MaxVal (#5064)
Netpbm only allows sample values in [0, MaxVal], but the PNM reader only
checked MaxVal itself and then copied the raster as-is. It also sets
JXL_BIT_DEPTH_FROM_CODESTREAM, whose documented input range is
0..(1 << bits_per_sample) - 1, and nothing downstream enforces that range.
So a P6 with MaxVal 4095 and a sample of 65535 was encoded with
bits_per_sample = 12 and modular_16_bit_buffer_sufficient = true, while the
codestream holds values that do not fit in 16-bit signed buffers.

libjxl's decoder uses int32 buffers and clamps on output, so djxl shows
4095. Decoders that use 16-bit buffers when the header says they are
sufficient (jxl-rs, used by Chrome) wrap samples above 32767 to negative
values, which render as black.

Check the samples in DecodeImagePNM and in ChunkedPNMDecoder::Init
(cjxl --streaming_input) and fail if any is above MaxVal. MaxVal is always
2^n - 1 here, so a sample is too large iff its most significant byte has a
bit set above MaxVal; the check ORs the raster 8 bytes at a time and tests
the bytes that hold those bits. It is skipped for MaxVal 255 and 65535,
where every value is valid, and for PFM. On a 6000x4000 12-bit PPM, cjxl
-d 0 -e 1 goes from about 0.10 s to 0.11 s.

Tested:
- New CodecTest.PNMSampleAboveMaxVal: P5/P6/P7 inputs with samples equal to
  MaxVal decode; a sample above MaxVal (4/12-bit, colour and alpha, at
  every position of a 19-sample row) fails. It fails without the pnm.cc
  change.
- ctest (full suite).
- cjxl -d 0, -d 1 and -d 0 --streaming_input on random PGM/PPM/PAM inputs
  with MaxVal 1, 15, 255, 1023, 4095, 16383 and 65535 (plus all-MaxVal
  images) give byte-identical output to the unpatched cjxl; inputs with a
  sample above MaxVal are now rejected.

Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-10-26 20:31:58 +00:00
AlejandroandEugene Kliuchnikov ee558e9540 Forget extra channel output buffers when skipping a frame (#5026)
JxlDecoderSkipCurrentFrame() resets image_out_buffer_set but keeps
extra_channel_output, unlike the path that finishes a frame, which clears
both. Extra channel buffers apply only to the current frame (see
JxlDecoderSetExtraChannelBuffer), so a client that skips a frame and then
requests only color output for the next frame has the decoder write that
frame's extra channel into the buffer it was given for the skipped frame.
The client may already have released that buffer, and in non-coalesced mode
the next layer can be larger than the skipped one; the bounds checks in the
write stage are debug-only, so in release builds this is a use-after-free or
heap-buffer-overflow write of decoded pixel data.

Clear the extra channel outputs together with the image output buffer, as is
done when a frame is finished.

DecodeTest.SkipCurrentFrameForgetsExtraChannelBuffers sets color and alpha
outputs for the first frame of an animation, skips it, decodes the second
frame with color output only, and checks the skipped frame's alpha buffer is
untouched. Before this change the decoder overwrote 21576 of its 21600 bytes.

Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-10-26 15:55:49 +00:00
Sami Boukortt 160a6400d5 enc_photon_noise: fix the calculation of luminance and the multiplicative factor (#5053) 2026-10-26 14:53:44 +00:00
AlejandroandEugene Kliuchnikov ddfd9a18fa Size low-memory render pipeline ring buffers from the actual schedule (#5022)
LowMemoryRenderPipeline keeps the output of every kInOut stage in a ring
buffer indexed by row number modulo a power of two. Its size was
"2 * border_y of the next stage + rows produced per call", which is the
exact distance between the newest row a stage produces and the oldest row
its consumer still reads only if every stage runs exactly border_y rows
ahead of its consumer.

Since #4713 the virtual padding of each stage is rounded up to its row
sampling factor, so a vertically subsampled stage can run up to one extra
output row per sampling step ahead of its consumer. The ring buffers were
not resized, so a consumer can read a row that has already been
overwritten by a later one, and whatever was in that slot (for the first
rows of a group, never-written memory) reaches the output. This is what
OSS-Fuzz 501356662 and 511400706 report (MSan use-of-uninitialized-value,
regressed 2026-04-08/09); the regression shipped in v0.12.0.

Compute the ring size by replaying the scheduling conditions of RenderRect
(virtual padding, input shift, border_y, rows per call) over enough virtual
rows to pass the start-up transient and cover several periods of all
sampling factors, and keep the largest distance between the newest row
produced and the oldest row still read by any consumer. A JXL_DASSERT
checks the result is never below the old formula.

In debug builds (hence in the OSS-Fuzz builds) every ring slot now
remembers which row it holds: rows about to be written are fetched with
GetOutputBuffer, rows to be read with GetInputBuffer, rows reused from the
previous invocation are re-checked, so reading a row that was never
produced or already overwritten fails at the read instead of returning
stale memory. Release builds only change the buffer sizes.

Testing: new RenderPipelineSchedulingTest compares the low-memory and the
simple pipeline for every combination of per-channel chroma upsampling,
Gaborish and 1x/2x/4x/8x upsampling at 6x5 and 17x229 (the two OSS-Fuzz
geometries): 317 of 1024 configurations fail on main, all pass with this
change. Full ctest passes as on main in Release, in ASan, and with
JXL_IS_DEBUG_BUILD (ci.sh opt), where the new row-ownership check runs on
every decode in the suite. The djxl_fuzzer seed corpus replays without new
findings under the OSS-Fuzz ASan build. The two OSS-Fuzz testcases are
clean under the OSS-Fuzz MSan build of djxl_fuzzer and reproduce without
this change. With the stage-combination harness from #4785 (frame
dimensions made consistent with the stages, all three input channels
initialized) and every pipeline buffer pre-filled with NaN so that any read
of unwritten memory is deterministic, 820 of 2048 configurations fail on
main and none with this change. ./ci.sh lint passes.

Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-10-26 13:03:03 +00:00
dependabot[bot]andEugene Kliuchnikov dda22bac19 Bump the everything group across 1 directory with 11 updates (#5046)
Bumps the everything group with 11 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [step-security/harden-runner](https://github.com/step-security/harden-runner) | `2.19.4` | `2.22.2` |
| [actions/checkout](https://github.com/actions/checkout) | `7.0.0` | `7.0.1` |
| [codecov/codecov-action](https://github.com/codecov/codecov-action) | `7.0.0` | `7.1.1` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.1` | `7.0.2` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `8.0.1` | `8.0.2` |
| [actions/setup-node](https://github.com/actions/setup-node) | `6.4.0` | `7.1.0` |
| [github/codeql-action/init](https://github.com/github/codeql-action) | `4.36.2` | `4.39.1` |
| [github/codeql-action/analyze](https://github.com/github/codeql-action) | `4.36.2` | `4.39.1` |
| [actions/deploy-pages](https://github.com/actions/deploy-pages) | `5.0.0` | `5.0.1` |
| [ossf/scorecard-action](https://github.com/ossf/scorecard-action) | `2.4.3` | `2.5.0` |
| [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) | `4.36.2` | `4.39.1` |



Updates `step-security/harden-runner` from 2.19.4 to 2.22.2
- [Release notes](https://github.com/step-security/harden-runner/releases)
- [Commits](https://github.com/step-security/harden-runner/compare/9af89fc71515a100421586dfdb3dc9c984fbf411...dc2769abcc0fcfbadfc1df54081c1608579ef6b2)

Updates `actions/checkout` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0...3d3c42e5aac5ba805825da76410c181273ba90b1)

Updates `codecov/codecov-action` from 7.0.0 to 7.1.1
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/fb8b3582c8e4def4969c97caa2f19720cb33a72f...303a32d7a59b442fa8d48b6a1cc6825c09c847a5)

Updates `actions/upload-artifact` from 7.0.1 to 7.0.2
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a...cf430e030ddbb5b0abf93d22962f4752f3646cd9)

Updates `actions/download-artifact` from 8.0.1 to 8.0.2
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c...9000827ccba6bdab643e8b6fd33ac0654aef8333)

Updates `actions/setup-node` from 6.4.0 to 7.1.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e...949feb2413d6458794dcd2491c4babbbce0c15c1)

Updates `github/codeql-action/init` from 4.36.2 to 4.39.1
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...9b3254085494b55a0f7c4c2b3d2d52cc712ce370)

Updates `github/codeql-action/analyze` from 4.36.2 to 4.39.1
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...9b3254085494b55a0f7c4c2b3d2d52cc712ce370)

Updates `actions/deploy-pages` from 5.0.0 to 5.0.1
- [Release notes](https://github.com/actions/deploy-pages/releases)
- [Commits](https://github.com/actions/deploy-pages/compare/cd2ce8fcbc39b97be8ca5fce6e763baed58fa128...368f82528645a54fb793d4d04e342629a3f51346)

Updates `ossf/scorecard-action` from 2.4.3 to 2.5.0
- [Release notes](https://github.com/ossf/scorecard-action/releases)
- [Changelog](https://github.com/ossf/scorecard-action/blob/main/RELEASE.md)
- [Commits](https://github.com/ossf/scorecard-action/compare/4eaacf0543bb3f2c246792bd56e8cdeffafb205a...fa7117db83c52d787ae5a89f350999701505d78e)

Updates `github/codeql-action/upload-sarif` from 4.36.2 to 4.39.1
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...9b3254085494b55a0f7c4c2b3d2d52cc712ce370)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: everything
- dependency-name: actions/deploy-pages
  dependency-version: 5.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: everything
- dependency-name: actions/download-artifact
  dependency-version: 8.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: everything
- dependency-name: actions/setup-node
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: everything
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: everything
- dependency-name: codecov/codecov-action
  dependency-version: 7.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: everything
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.39.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: everything
- dependency-name: github/codeql-action/init
  dependency-version: 4.39.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: everything
- dependency-name: github/codeql-action/upload-sarif
  dependency-version: 4.39.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: everything
- dependency-name: ossf/scorecard-action
  dependency-version: 2.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: everything
- dependency-name: step-security/harden-runner
  dependency-version: 2.22.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: everything
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-10-26 10:45:41 +00:00
Luca VersariandEugene Kliuchnikov 1078d924f5 Do channel-wise DC smoothing if not doing 444. (#5031)
Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-10-26 10:09:02 +00:00
Luca Versari e47d2a2b5b Bump brotli to v1.2.1 (#5062)
Also fix CI on x86.
2026-10-24 16:59:44 +00:00
Sami Boukortt 777e88f46a Fix the CI for ubuntu-latest (now 26.04) (#5058) 2026-10-22 19:59:20 +00:00
Alejandro f23e813be7 Reset JPEG reconstruction state when the decoder is rewound or reset (#5029)
* Reset JPEG reconstruction state when the decoder is rewound or reset

JxlDecoderRewind() and JxlDecoderReset() forget the image, extra channel
and box output buffers, but not the JPEG reconstruction decoder. Its output
pointer (from JxlDecoderSetJPEGBuffer), the partly read jbrd box and the
parsed JPEGData all survive into the next decode.

The API documents the JPEG buffer as used "until JxlDecoderReleaseJPEGBuffer
is called or the decoder is destroyed or reset", so a caller may free it
after a reset. When the same decoder is then reused to reconstruct another
JPEG, JxlDecoderSetJPEGBuffer() fails with "Already set JPEG buffer", and
the decoder writes the new JPEG into the freed buffer anyway. With ASan this
is a heap-use-after-free WRITE in JxlToJpegDecoder::WriteOutput(). Rewinding
while a jbrd box is only partly read has a related problem: the next pass
appends the box to the stale partial copy, and the decode fails.

Add JxlToJpegDecoder::Reset() and call it from
JxlDecoderRewindDecodingState(), next to the other per-decode output state.

Tests:
- DecodeTest.JPEGReconstructionBufferNotKeptAcrossReset reconstructs a JPEG,
  resets without releasing the buffer, reconstructs again into a new buffer,
  and checks the first buffer was not written. Before this change
  JxlDecoderSetJPEGBuffer() returned JXL_DEC_ERROR on the second pass.
- DecodeTest.JPEGReconstructionRewindInsideBox stops a few bytes into the
  jbrd box, rewinds, and checks the full decode reconstructs the original
  JPEG. Before this change it returned JXL_DEC_ERROR.

* Initialize JxlToJpegDecoder through Reset()

Call Reset() from the constructor instead of repeating the initial values
as default member initializers, so the initial state is written in one
place and stays in sync with what a rewind or reset restores.
2026-10-20 08:51:40 +00:00
Jon Sneyers ef67fde2ec Histogram clustering with forced prefix codes: charge merges that give a single-symbol histogram a second symbol (#5002)
With prefix codes a single-symbol histogram costs nothing per symbol and one
with more symbols at least a bit per symbol. The fast clustering's Shannon
distance missed that and merged a mostly-zero 2-symbol histogram into large
all-zero ones (a 715 B jxl_from_tree image became 27 KB). Only applies when
force_huffman is set.
2026-10-06 16:02:32 +00:00
Jon Sneyers 8ec4d2e8e3 Signal the default block context map with its 1-bit code (#5001)
EncodeBlockCtxMap only used the 1-bit "default" code when the context map
had 21 entries, the size of the default map when there were 7 order
classes. With 13 order classes the default map has 39 entries, so the
default map was always written out in full (~22 bytes).

Tested: cjxl output with the default block context map (e.g. effort 3, or
small images at any effort) is 22-23 bytes smaller with identical decoded
pixels in djxl and jxl-rs; other files are unchanged.

jxl_test expectations for the four tests with the default map are 23-29
bytes lower.
2026-10-04 07:33:54 +00:00
Jonathan Brown 5f92f524f1 Scale centre-first coordinates for LF frames (#4969)
* Use centre-first ordering for LF when custom HF centre is used

* Scale coordinates instead of defaulting to the middle
2026-09-29 15:22:33 +00:00
Jonathan Brown 05f95ed13b Enable LF smoothing for 444 JPEG transcoding by default and allow decoding subsampled smoothing (#4932)
* Allow non-444 Smoothing and fix JPEG reconstruction

* Enable JPEG DC smoothing

* Move reconstruction fix to a separate PR

* Add back transcode fix

Realised even with it being put in another PR, this one will just merge with it anyway, but now it'll run tests correctly too.

* Add a flag for JPEG LF Smoothing

* Add a flag for JPEG LF Smoothing

* Add a flag for JPEG LF Smoothing

* Add a flag for JPEG LF Smoothing

* Add a flag for JPEG LF Smoothing

* Enable 444 smoothing by default

* Enable 444 smoothing by default

* Enable 444 smoothing by default

* Enable 444 smoothing by default
2026-09-29 15:22:00 +00:00
Jon Sneyers e394120180 Clear all patch dictionary state when decoding a new dictionary (#4989)
PatchDictionary is reused across frames. Decode() cleared positions_ but
appended to ref_positions_ and blendings_, so in a later frame the blending
entries (indexed by position index) could still be the previous frame's:
patches were blended with a previous frame's blend modes. Clear() had the
same problem.

Tested: new PatchDictionaryTest.DecodeReplacesPreviousFrameBlendModes (fails
without the fix: the second frame's kReplace patch was blended with the first
frame's kAdd), and multi-frame files whose frames use patches with different
blend modes (made with jxl_from_tree): djxl now matches jxl-rs, which was
already correct.
2026-09-28 10:59:11 +00:00
Galaxy4594 b87738951c Align strip_alpha with boolean expectations and improve float checks (#4984)
* Align strip_alpha with boolean expectations and improve float checks

* compile fixes
2026-09-20 10:59:50 +00:00
Galaxy4594 7741c8ce99 Ignore empty alpha channels (#4981)
* ignore empty alpha channels

* default to keep empty alpha when lossless

* metadata stuff

* remove fluff

* Don't strip alpha for animation and multi-frame images

* Improve empty alpha detection and clean up
2026-09-18 13:53:43 +00:00
Jonathan Brown 3368fd0046 Auto16bit buffers for jxl_from_tree (#4976)
* If bitdepth is 12 or less, use 16bit buffers

* Update jxl_from_tree.cc

* Allow forcing buffer size and always use 32bit for multi-frame
2026-09-15 08:52:32 +00:00
Sami Boukortt 0754c26019 Slight tweaks and cleanup (#4975) 2026-09-12 14:19:30 +00:00
Sami Boukortt dd13aa499b Cocoa replacement for compare_images on macOS (#4974)
This is a bit less featureful than the Qt version but supports
wide-gamut / HDR images and builds quickly with no non-system
dependencies.
2026-09-12 10:19:55 +00:00
Eugene Kliuchnikov b5def9fb50 Use latest gcc instead of default one (#4958)
Hopefully fixed hwy 1.2+ build
2026-09-08 09:22:02 +00:00
Eugene Kliuchnikov 02abfb4d65 Drop bullseye CI (#4968)
LTS support ended last week and repo access already seems flaky.
2026-09-07 14:54:37 +00:00
Eugene Kliuchnikov 6e0282c3ea Update libpng repo (#4957) 2026-09-01 15:44:38 +00:00
Jonathan Brown aea3a06e28 Re-enable squeezed delta palette (#4930)
* Restore squeezed delta palette

* Underscore
2026-08-21 16:16:40 +00:00
Jonathan Brown 6f00b1cf2b Don't do smoothing during reconstruction (#4931) 2026-08-21 16:14:31 +00:00
Moritz Firsching e4b66d3027 Add Discord badge to README (#4946)
Added a Discord badge to the README for community engagement.
2026-08-18 09:24:16 +00:00
Eugene Kliuchnikov d089091afe Fix mingw32 build (#4940) 2026-08-11 12:36:42 +00:00
Eugene Kliuchnikov e2ceb37ab3 Make test dicsovery sequential. (#4939)
Expectation: fixed osx pipelines
Hope: also deals with mysterious build races
Known downsides: a bit slower on many-core machines
2026-08-11 08:19:08 +00:00
Eugene Kliuchnikov 13234c03c5 Fix copy-paste (#4910) 2026-08-10 12:45:49 +00:00
e8ff097624 Rewrite of LZ77 implementation for lossless image compression (#4928)
* Improved LZ77 implementation using HashMap

Changes include:
- Custom HashMap
- Improved hashing function

* fixing cost estimation comparison

* adding even more LZ options

* renaming LZ77Method enum

* rename template parameters, change cost estimation slightly

* update hardcoded testvalues

* Removal of static_assert and adding comments

Co-authored-by: Máté Makai <mmakai2@gmail.com>
Co-authored-by: Samuele Benassai <samuelebenassai.pptx@gmail.com>

---------

Co-authored-by: Máté Makai <mmakai2@gmail.com>
Co-authored-by: Samuele Benassai <samuelebenassai.pptx@gmail.com>
2026-07-31 21:41:50 +00:00
Eugene Kliuchnikov 196a43d996 Bump version (to 0.13.0) (#4893) 2026-07-06 09:44:07 +00:00
Eugene Kliuchnikov 5bcd3db2fc Fix HWY 1.3+ build (#4906) 2026-07-06 09:00:36 +00:00
Eugene Kliuchnikov f0a1c5ff9d Fix publish_release_assets (#4890) v0.12-snapshot 2026-07-02 08:06:45 +00:00
dependabot[bot]andEugene Kliuchnikov a7a9c78734 Bump actions/cache from 6.0.0 to 6.1.0 in the everything group (#4884)
Bumps the everything group with 1 update: [actions/cache](https://github.com/actions/cache).


Updates `actions/cache` from 6.0.0 to 6.1.0
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/2c8a9bd7457de244a408f35966fab2fb45fda9c8...55cc8345863c7cc4c66a329aec7e433d2d1c52a9)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: everything
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
v0.12.0
2026-07-01 16:36:59 +00:00
Jonathan BrownandEugene Kliuchnikov ffb48b4cd7 Remove reverted PR (#4886)
Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-07-01 16:30:59 +00:00
Eugene Kliuchnikov 22ad80af14 Several hardening / correctness / security fixes (#4885)
* Update kRenderPipelineXOffset on ARM to respect actual maximum padding

Thanks to Apple for reporting.

Ref: AA1

* Limit "extra_zero_runs" in JPEG metadata

Since there are at most 64 coeffs in DCT block, and each "extra_zero_run" covers 16 values,
there is no valid JPEG that have more than 4 of those.

Thanks to Anthropic for discovery

Ref: AF1

* Update MaxEncodedBitsPerSample with actual values

Thanks to Anthropic for discovery.

Ref: AF4

* Deal with box_size type size mismatch on 32-bit platforms

Thanks to Ali Raza (@locus-x64) for reporting

Ref: AR1

* Fix upsampling input/output offset

Ref: MY05

* Even if EC is not used, require consistent (late) upsampling when Patches are applied

Ref: MY11
2026-07-01 15:19:29 +00:00
Eyüp Can AkmanandEugene Kliuchnikov 0ed0dfe7c4 Fix FileDirName returning empty string for bare filenames (#4742)
* Fix FileDirName returning empty string for bare filenames

Fixes #1872

* Drop benchmark FileDirName test

---------

Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-07-01 14:53:23 +00:00
Eugene Kliuchnikov c3fbbeb65c Update release manual (#4883)
Add missing required deps
2026-07-01 14:39:23 +00:00
d716b2b54d Changelog updates (#4313)
* Prepare v0.12.0 release

Co-Authored-By: Galaxy4594 <164440799+galaxy4594@users.noreply.github.com>

* small last minute additions

Co-Authored-By: Galaxy4594 <164440799+galaxy4594@users.noreply.github.com>

---------

Co-authored-by: Galaxy4594 <164440799+galaxy4594@users.noreply.github.com>
Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-07-01 14:22:59 +00:00
Eugene Kliuchnikov 460a538d70 Fix scorecard finding. (#4882)
Do extend before multiply
2026-07-01 12:42:37 +00:00
Eugene Kliuchnikov a7371b629a Fix color encoding for reference frames. (#4567) 2026-07-01 11:14:17 +00:00
Ivan Siutsou d607ed8674 Better JPEG density (#4480)
* Better JPEG density

* Cosmetics: simpler loop, EoL normalization

* Rebase fix
2026-07-01 09:10:41 +00:00
Sayed NabhanandEugene Kliuchnikov a50b25691c fix reversed row-count check in DecodeImageAPNG frame copy (#4879)
Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-07-01 08:50:35 +00:00
Eugene Kliuchnikov c670011e15 Remove jpeg_quality from CodecIo (#4876)
Reminder: the grand plan is get rid of CodecIo, when possible

Drive-by: in some places we set "quality" option, that is no-op; set "q" instead (parsed by "jpg" encoder)
2026-07-01 08:38:28 +00:00
SnesnopicandEugene Kliuchnikov d5f0038ffe replace static_assert with JXL_DASSERT for Highway Lanes (#4880)
Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-07-01 08:28:31 +00:00
301e3e0ae0 warn user when GIF disposal mode is not supported (#3918)
* warn user when GIF disposal mode is not supported

* add pseudo to Authors file

* Apply suggestion from @jonsneyers

Co-authored-by: Jon Sneyers <jon@cloudinary.com>

---------

Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
Co-authored-by: Jon Sneyers <jon@cloudinary.com>
2026-07-01 07:06:16 +00:00
Snesnopic 2787fe3e93 Fix MSVC ARM64 build, restrict _sub_overflow_i32 to x86/x64 (#4877)
* Fix MSVC ARM64 build, restrict _sub_overflow_i32 to x86

* update AUTHORS
2026-06-30 10:36:16 +00:00
Nol MoonenandEugene Kliuchnikov c1f45f8c63 improved use of simd in tree construction hot loop (#4720)
Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-06-30 08:31:13 +00:00
jmestwa-coderandEugene Kliuchnikov 2a7457e298 simplify jhgm box buffer handling in jxlinfo (#4771)
* simplify jhgm box buffer handling in jxlinfo

* drop impossible box buffer state checks in jxlinfo

* restore box buffer size overflow check in jxlinfo

Signed-off-by: Syed Mohammed Nayyar <jmestwa@gmail.com>

---------

Signed-off-by: Syed Mohammed Nayyar <jmestwa@gmail.com>
Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-06-30 08:20:40 +00:00
Sayed NabhanandEugene Kliuchnikov 54683cea0d avoid signed overflow when computing EXR window sizes (#4874)
Co-authored-by: Eugene Kliuchnikov <eustas@google.com>
2026-06-29 10:15:50 +00:00