Files
leonarski_fandClaude Opus 5.5 d2d8102b66 JPEG: encode with the vendored stb_image_write instead of libjpeg-turbo
WriteJPEGToMem is the only JPEG code in the tree (encode only, no decoding),
and libjpeg-turbo came in as an ExternalProject whose imported target passed
its include dir as -isystem. Any other jpeglib.h on the include path (conda,
the distribution, the CUDA directory) could then win, and a build failed with
"Wrong JPEG library version: library is 62, caller expects 80".

stb_image_write v1.16 (commit 31c1ad3) is vendored in preview/stb/ and
compiled into JFJochJPEG.cpp alone with STB_IMAGE_WRITE_STATIC and
STBI_WRITE_NO_STDIO, so no JPEG symbol or header leaves that file. Output is
baseline JPEG (it was progressive); the API is unchanged. Size limits are
checked up front (JPEG's 65535 per side, stb's int pixel index) and an
encoder failure throws JFJochException. Quality is clamped to 1-100. stb
encodes an 18 Mpx frame in ~350 ms against ~210 ms for the scalar
libjpeg-turbo we built; accepted.

Removed: the ExternalProject and JPEG::JPEG target in preview/, nasm from the
Docker images, licenses/libjpeg-turbo.txt and its manifest row, and the CI
check that counted libjpeg-turbo copies in the viewer (the Qt JPEG/TIFF plugin
check stays, as does the viewer's plugin exclusion). Licence: MIT OR
Unlicense, recorded in licenses/ and THIRD_PARTY_NOTICES.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HVeDQqrcrEZy6XBUCMZvyT
2026-11-01 13:49:11 +01:00
..
2026-09-15 17:09:31 +02:00
2026-09-15 17:09:31 +02:00
2026-09-15 17:09:31 +02:00
2026-09-15 17:09:31 +02:00
2026-09-15 17:09:31 +02:00
2026-09-15 17:09:31 +02:00

Shared build-image steps

docker/rocky8, docker/rocky9, docker/ubuntu2204 and docker/ubuntu2404 differ only in their package manager, their package list and a few distro-specific extras (DIALS and XDS on rocky9, the aarch64 cross toolchain on ubuntu2404, the release tooling on rocky8). Everything built from source is identical in all four, so it lives here and is run by each Dockerfile in this order:

script what it installs
install-cmake.sh CMake, pinned, from cmake.org -- the distro CMake is not used
build-openssl.sh static OpenSSL into /opt/openssl-$OPENSSL_VERSION
build-dbus.sh static libdbus into /opt/dbus-$DBUS_VERSION-static
build-qt.sh static Qt 6 into $QT_PREFIX
install-eigen.sh Eigen 3.4 into /opt/eigen-3.4

They read their versions from the ARGs of the Dockerfile that runs them, and each one is the verbatim shell that used to be inlined four times. Keeping one copy is the point: the HTTP/1.1 git fix once landed in the two Ubuntu images and neither Rocky one, because there were four copies to remember.

The build context is therefore docker/, not docker/<variant>/ -- see build_images.sh.