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
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.