Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ctl for openSUSE:Factory checked in at 2026-03-30 18:32:22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ctl (Old) and /work/SRC/openSUSE:Factory/.ctl.new.1999 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ctl" Mon Mar 30 18:32:22 2026 rev:5 rq:1343592 version:1.5.5 Changes: -------- --- /work/SRC/openSUSE:Factory/ctl/ctl.changes 2025-10-17 17:29:35.595623232 +0200 +++ /work/SRC/openSUSE:Factory/.ctl.new.1999/ctl.changes 2026-03-30 18:36:01.014892128 +0200 @@ -1,0 +2,9 @@ +Mon Mar 30 06:51:38 UTC 2026 - Paolo Stivanin <[email protected]> + +- Update to 1.5.5: + * update CMake to prioritize OpenEXR v3 over OpenEXR v2 by @michaeldsmith in #189 + * Feature/preserve exr standard attributes (data window, display window, etc) by @michaeldsmith in #192 + * Codeql/replace alloca in a loop by @michaeldsmith in #193 + * Feature/add openexr v2.2 and v3.4 new compression types by @michaeldsmith in #196 + +------------------------------------------------------------------- Old: ---- ctl-1.5.4.tar.gz New: ---- ctl-1.5.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ctl.spec ++++++ --- /var/tmp/diff_new_pack.ipNht0/_old 2026-03-30 18:36:01.790924571 +0200 +++ /var/tmp/diff_new_pack.ipNht0/_new 2026-03-30 18:36:01.794924739 +0200 @@ -1,7 +1,7 @@ # # spec file for package ctl # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %define so_ver 1_5 Name: ctl -Version: 1.5.4 +Version: 1.5.5 Release: 0 Summary: Programming language for digital color management License: AMPAS ++++++ ctl-1.5.4.tar.gz -> ctl-1.5.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/.github/workflows/codeql.yml new/CTL-ctl-1.5.5/.github/workflows/codeql.yml --- old/CTL-ctl-1.5.4/.github/workflows/codeql.yml 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/.github/workflows/codeql.yml 2026-03-27 22:46:02.000000000 +0100 @@ -58,13 +58,16 @@ # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: + + - name: run apt-get update + run: sudo apt-get -y update - name: Checkout repository uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} @@ -93,6 +96,6 @@ mkdir build && cd build && cmake .. && make - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 with: category: "/language:${{matrix.language}}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/.github/workflows/docker_linuxes.yml new/CTL-ctl-1.5.5/.github/workflows/docker_linuxes.yml --- old/CTL-ctl-1.5.4/.github/workflows/docker_linuxes.yml 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/.github/workflows/docker_linuxes.yml 2026-03-27 22:46:02.000000000 +0100 @@ -244,3 +244,12 @@ # - name: Run unit tests (ctest) within the Docker image # run: docker run ctl:latest sh -c "cd ./build && ctest" + ubuntu-24-04-openexr34: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Build the Docker image + run: docker build --no-cache --rm -f ./docker/Dockerfile_ubuntu_24.04_openexr34 -t ctl:latest . + + - name: Run unit tests (ctest) within the Docker image + run: docker run ctl:latest sh -c "cd ./build && ctest" \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/.github/workflows/mac_brew.yml new/CTL-ctl-1.5.5/.github/workflows/mac_brew.yml --- old/CTL-ctl-1.5.4/.github/workflows/mac_brew.yml 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/.github/workflows/mac_brew.yml 2026-03-27 22:46:02.000000000 +0100 @@ -25,6 +25,12 @@ runs-on: macos-latest steps: + + - name: update homebrew + run: brew update + + - name: clean homebrew cache + run: brew cleanup --prune=all - name: install libtiff run: brew install libtiff @@ -52,6 +58,12 @@ steps: + - name: update homebrew + run: brew update + + - name: clean homebrew cache + run: brew cleanup --prune=all + - name: install libtiff run: brew install libtiff @@ -83,6 +95,12 @@ runs-on: macos-latest steps: + + - name: update homebrew + run: brew update + + - name: clean homebrew cache + run: brew cleanup --prune=all - name: install ctl - run: brew install ctl --head + run: brew install ctl diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/.github/workflows/ubuntu_address_sanitizer.yml new/CTL-ctl-1.5.5/.github/workflows/ubuntu_address_sanitizer.yml --- old/CTL-ctl-1.5.4/.github/workflows/ubuntu_address_sanitizer.yml 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/.github/workflows/ubuntu_address_sanitizer.yml 2026-03-27 22:46:02.000000000 +0100 @@ -27,6 +27,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove openexr run: sudo apt-get --purge remove libopenexr-dev -y @@ -70,6 +73,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove openexr run: sudo apt-get --purge remove libopenexr-dev -y diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/.github/workflows/ubuntu_arm32.yml new/CTL-ctl-1.5.5/.github/workflows/ubuntu_arm32.yml --- old/CTL-ctl-1.5.4/.github/workflows/ubuntu_arm32.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/CTL-ctl-1.5.5/.github/workflows/ubuntu_arm32.yml 2026-03-27 22:46:02.000000000 +0100 @@ -0,0 +1,39 @@ +name: Ubuntu-ARM32-Release + +permissions: + contents: read + pull-requests: write + +on: + push: + paths-ignore: + - 'README.md' + - 'doc/**' + pull_request: + paths-ignore: + - 'README.md' + - 'doc/**' + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + + build_arm32: + name: Linux-ARM32 Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: uraimo/run-on-arch-action@v2 + with: + arch: armv7 + distro: ubuntu22.04 + githubToken: ${{ github.token }} + install: | + apt-get update -q -y + apt-get install -q -y cmake make g++ libtiff-dev libopenexr-dev + run: | + cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} + cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + ctest -V --test-dir ${{github.workspace}}/build --output-on-failure diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/.github/workflows/ubuntu_arm_debug.yml new/CTL-ctl-1.5.5/.github/workflows/ubuntu_arm_debug.yml --- old/CTL-ctl-1.5.4/.github/workflows/ubuntu_arm_debug.yml 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/.github/workflows/ubuntu_arm_debug.yml 2026-03-27 22:46:02.000000000 +0100 @@ -27,6 +27,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: install ilmbase run: sudo apt-get -y install libilmbase-dev @@ -52,6 +55,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y @@ -108,6 +114,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/.github/workflows/ubuntu_arm_release.yml new/CTL-ctl-1.5.5/.github/workflows/ubuntu_arm_release.yml --- old/CTL-ctl-1.5.4/.github/workflows/ubuntu_arm_release.yml 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/.github/workflows/ubuntu_arm_release.yml 2026-03-27 22:46:02.000000000 +0100 @@ -58,6 +58,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y @@ -102,6 +105,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y @@ -157,6 +163,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y @@ -212,6 +221,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/.github/workflows/ubuntu_debug.yml new/CTL-ctl-1.5.5/.github/workflows/ubuntu_debug.yml --- old/CTL-ctl-1.5.4/.github/workflows/ubuntu_debug.yml 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/.github/workflows/ubuntu_debug.yml 2026-03-27 22:46:02.000000000 +0100 @@ -27,6 +27,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: install ilmbase run: sudo apt-get -y install libilmbase-dev @@ -52,6 +55,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y @@ -108,6 +114,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/.github/workflows/ubuntu_no_libtiff.yml new/CTL-ctl-1.5.5/.github/workflows/ubuntu_no_libtiff.yml --- old/CTL-ctl-1.5.4/.github/workflows/ubuntu_no_libtiff.yml 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/.github/workflows/ubuntu_no_libtiff.yml 2026-03-27 22:46:02.000000000 +0100 @@ -27,6 +27,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove libtiff run: sudo apt-get --purge remove libtiff-dev -y @@ -52,6 +55,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove libtiff-dev run: sudo apt-get --purge remove libtiff-dev -y diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/.github/workflows/ubuntu_release.yml new/CTL-ctl-1.5.5/.github/workflows/ubuntu_release.yml --- old/CTL-ctl-1.5.4/.github/workflows/ubuntu_release.yml 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/.github/workflows/ubuntu_release.yml 2026-03-27 22:46:02.000000000 +0100 @@ -27,6 +27,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: install libtiff run: sudo apt-get -y install libtiff-dev @@ -55,6 +58,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y @@ -98,6 +104,9 @@ runs-on: ubuntu-latest steps: + + - name: run apt-get update + run: sudo apt-get -y update - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y @@ -154,6 +163,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y @@ -209,6 +221,9 @@ steps: + - name: run apt-get update + run: sudo apt-get -y update + - name: remove ilmbase run: sudo apt-get --purge remove libilmbase-dev -y diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/CHANGELOG new/CTL-ctl-1.5.5/CHANGELOG --- old/CTL-ctl-1.5.4/CHANGELOG 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/CHANGELOG 2026-03-27 22:46:02.000000000 +0100 @@ -1,3 +1,10 @@ +Version 1.5.5: + * update Cmake to prioritze OpenEXR v3 over OpenEXR v2 + * add support to ctlrender for non-trival EXR data awindow + * add support to ctlrender to preserve standard EXR attributes (data window, display windows, etc.) + * add new compression schemes to ctlrender from OpenEXR v2.2 (DWA) and OpenEXR v3.4 (HTJ2K) + * add CI for arm32 platform + Version 1.5.4: * add CI for various platforms * add support for FreeBSD diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/CMakeLists.txt new/CTL-ctl-1.5.5/CMakeLists.txt --- old/CTL-ctl-1.5.4/CMakeLists.txt 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/CMakeLists.txt 2026-03-27 22:46:02.000000000 +0100 @@ -1,5 +1,7 @@ cmake_minimum_required(VERSION 3.12) -project(CTL VERSION 1.5.4) +project(CTL VERSION 1.5.5 + DESCRIPTION "Color Transformation Language (CTL) reference implementation" + LANGUAGES CXX) include(GNUInstallDirs) set(CMAKE_CXX_STANDARD 11) @@ -59,23 +61,21 @@ endif() # find OpenEXR -find_package(IlmBase QUIET) -if(IlmBase_FOUND) - message(STATUS "Found IlmBase ${IlmBase_VERSION}") - find_package(OpenEXR 2 QUIET) -endif() - -if(NOT OpenEXR_FOUND) - find_package(OpenEXR CONFIG 3 REQUIRED) - if(OpenEXR_FOUND) - set(OpenEXR_FOUND_WITH_CONFIG TRUE BOOL "found OpenEXR with Config") - endif() +find_package(OpenEXR 3 CONFIG QUIET) +if(OpenEXR_FOUND) + set(OpenEXR_FOUND_WITH_CONFIG TRUE BOOL "found OpenEXR with Config") +else() + message(STATUS "OpenEXR v3 not found, looking for IlmBase and OpenEXR v2") + find_package(IlmBase REQUIRED) + find_package(OpenEXR 2 REQUIRED) endif() - + if(OpenEXR_FOUND) message(STATUS "Found OpenEXR ${OpenEXR_VERSION}") set(USE_OPENEXR TRUE CACHE BOOL "Add OpenEXR support") - add_definitions(-DOJPH_ENABLE_OPENEXR_SUPPORT) + set(OPENEXR_VERSION_MAJOR ${OpenEXR_VERSION_MAJOR} CACHE STRING "OpenEXR major version") + set(OPENEXR_VERSION_MINOR ${OpenEXR_VERSION_MINOR} CACHE STRING "OpenEXR minor version") + set(OPENEXR_VERSION_PATCH ${OpenEXR_VERSION_PATCH} CACHE STRING "OpenEXR patch version") if(OpenEXR_FOUND_WITH_CONFIG) message(STATUS " found OpenEXR with Config") else(OpenEXR_FOUND_WITH_CONFIG) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/README.md new/CTL-ctl-1.5.5/README.md --- old/CTL-ctl-1.5.4/README.md 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/README.md 2026-03-27 22:46:02.000000000 +0100 @@ -149,9 +149,9 @@ * Install CTL - Homebrew will install all dependancies (cmake, ilmbase, opener, aces_container, libtiff) automatically by default. No need to install each manually. + Homebrew will install all dependancies automatically by default. No need to install each manually. - $ brew install --head ctl + $ brew install ctl * Redhat, Ubuntu diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/ctlrender/CMakeLists.txt new/CTL-ctl-1.5.5/ctlrender/CMakeLists.txt --- old/CTL-ctl-1.5.4/ctlrender/CMakeLists.txt 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/ctlrender/CMakeLists.txt 2026-03-27 22:46:02.000000000 +0100 @@ -38,6 +38,8 @@ target_compile_definitions(ctlrender PRIVATE -DHAVE_OPENEXR=1 + OPENEXR_VERSION_MAJOR=${OpenEXR_VERSION_MAJOR} + OPENEXR_VERSION_MINOR=${OpenEXR_VERSION_MINOR} ) else() message( STATUS "OPENEXR not found, ctlrender will not support EXR files" ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/ctlrender/compression.cc new/CTL-ctl-1.5.5/ctlrender/compression.cc --- old/CTL-ctl-1.5.4/ctlrender/compression.cc 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/ctlrender/compression.cc 2026-03-27 22:46:02.000000000 +0100 @@ -69,7 +69,14 @@ { "PIZ", Imf::PIZ_COMPRESSION }, { "PXR24", Imf::PXR24_COMPRESSION }, { "B44", Imf::B44_COMPRESSION }, - { "B44A", Imf::B44A_COMPRESSION } + { "B44A", Imf::B44A_COMPRESSION }, + { "DWAA", Imf::DWAA_COMPRESSION }, + { "DWAB", Imf::DWAB_COMPRESSION } + #if (defined(OPENEXR_VERSION_MAJOR) && (OPENEXR_VERSION_MAJOR >= 3) && defined(OPENEXR_VERSION_MAJOR) && (OPENEXR_VERSION_MINOR >= 4)) || (defined(OPENEXR_VERSION_MAJOR) && (OPENEXR_VERSION_MAJOR >= 4)) + , + { "HTJ2K256", Imf::HTJ2K256_COMPRESSION }, + { "HTJ2K32", Imf::HTJ2K32_COMPRESSION } + #endif }; #else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/ctlrender/exr_file.cc new/CTL-ctl-1.5.5/ctlrender/exr_file.cc --- old/CTL-ctl-1.5.4/ctlrender/exr_file.cc 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/ctlrender/exr_file.cc 2026-03-27 22:46:02.000000000 +0100 @@ -64,6 +64,20 @@ #include <ImfChannelList.h> #include <Iex.h> +void exr_read_standard_attributes(Imf::InputFile *file, format_t *format) +{ + format->exr_standard_attributes.dataWindow = file->header().dataWindow(); + format->exr_standard_attributes.displayWindow = file->header().displayWindow(); + format->exr_standard_attributes.pixelAspectRatio = file->header().pixelAspectRatio(); + format->exr_standard_attributes.screenWindowCenter = file->header().screenWindowCenter(); + format->exr_standard_attributes.screenWindowWidth = file->header().screenWindowWidth(); + format->exr_standard_attributes.lineOrder = file->header().lineOrder(); + format->exr_standard_attributes.compression = file->header().compression(); + + format->is_exr_standard_attributes_set = true; + return; +} + bool exr_read(const char *name, float scale, ctl::dpx::fb<float> *pixels, format_t *format) { std::ifstream ins; @@ -92,7 +106,9 @@ ////////////////////////// Imf::InputFile file(name); - Imath::Box2i dw = file.header().dataWindow(); + // read the exr standard attributes for potential later use in exr_write() + exr_read_standard_attributes(&file, format); + Imath::Box2i dw = format->exr_standard_attributes.dataWindow; if (file.header().channels().begin().channel().type == Imf::HALF) format->src_bps=16; @@ -112,30 +128,34 @@ Imf::FrameBuffer frameBuffer; frameBuffer.insert ("R", - Imf::Slice (pixelType, + Imf::Slice::Make (pixelType, (char *) pixels->ptr(), + dw, xstride, ystride, 1, 1, 0.0)); frameBuffer.insert ("G", - Imf::Slice (pixelType, + Imf::Slice::Make (pixelType, (char *) (pixels->ptr()+1), + dw, xstride, ystride, 1, 1, 0.0)); frameBuffer.insert ("B", - Imf::Slice (pixelType, + Imf::Slice::Make (pixelType, (char *) (pixels->ptr()+2), + dw, xstride, ystride, 1, 1, 0.0)); if (has_alpha){ frameBuffer.insert ("A", - Imf::Slice (pixelType, + Imf::Slice::Make (pixelType, (char *) (pixels->ptr()+3), + dw, xstride, ystride, 1, 1, 1.0)); @@ -166,8 +186,8 @@ bool is_half = format->bps == 16 ? true : false; int depth = pixels.depth(); - float width = pixels.width(); - float height = pixels.height(); + int width = pixels.width(); + int height = pixels.height(); float const* pixelPtr = pixels.ptr(); // Do any scaling on a full float buffer @@ -189,13 +209,33 @@ Imf::PixelType pixelType = is_half ? Imf::HALF : Imf::FLOAT; Imf::Header header(width, height); - header.compression() = (Imf::Compression)compression->exrCompressionScheme; + + if (format->is_exr_standard_attributes_set) { + header.dataWindow() = format->exr_standard_attributes.dataWindow; + header.displayWindow() = format->exr_standard_attributes.displayWindow; + header.pixelAspectRatio() = format->exr_standard_attributes.pixelAspectRatio; + header.screenWindowCenter() = format->exr_standard_attributes.screenWindowCenter; + header.screenWindowWidth() = format->exr_standard_attributes.screenWindowWidth; + header.lineOrder() = format->exr_standard_attributes.lineOrder; + if (true == format->is_compression_set) { + // the user specified a specific compression type + header.compression() = (Imf::Compression)compression->exrCompressionScheme; + } + else { + header.compression() = format->exr_standard_attributes.compression; + } + } + else { + header.compression() = (Imf::Compression)compression->exrCompressionScheme; + } + Imath::Box2i dataWindow = header.dataWindow(); header.channels().insert("R", Imf::Channel(pixelType)); header.channels().insert("G", Imf::Channel(pixelType)); header.channels().insert("B", Imf::Channel(pixelType)); - if (depth == 4) - header.channels().insert("A", Imf::Channel(pixelType)); + if (depth == 4) { + header.channels().insert("A", Imf::Channel(pixelType)); + } Imf::OutputFile file(name, header); Imf::FrameBuffer frameBuffer; @@ -219,27 +259,32 @@ int ystride = sizeof(*halfPixelPtr) * depth * width; // Insert the half buffer into the framebuffer - frameBuffer.insert("R", Imf::Slice(pixelType, (char*)halfPixelPtr, xstride, ystride)); - frameBuffer.insert("G", Imf::Slice(pixelType, (char*)(halfPixelPtr + 1), xstride, ystride)); - frameBuffer.insert("B", Imf::Slice(pixelType, (char*)(halfPixelPtr + 2), xstride, ystride)); - if (depth == 4) - frameBuffer.insert("A", Imf::Slice(pixelType, (char*)(halfPixelPtr + 3), xstride, ystride)); + frameBuffer.insert("R", Imf::Slice::Make(pixelType, (char*)(halfPixelPtr + 0), dataWindow, xstride, ystride)); + frameBuffer.insert("G", Imf::Slice::Make(pixelType, (char*)(halfPixelPtr + 1), dataWindow, xstride, ystride)); + frameBuffer.insert("B", Imf::Slice::Make(pixelType, (char*)(halfPixelPtr + 2), dataWindow, xstride, ystride)); + if (depth == 4) { + frameBuffer.insert("A", Imf::Slice::Make(pixelType, (char*)(halfPixelPtr + 3), dataWindow, xstride, ystride)); + } + } else { // No conversion needed so insert the float buffer into the frambuffer int xstride = sizeof(*pixelPtr) * depth; int ystride = sizeof(*pixelPtr) * depth * width; - frameBuffer.insert("R", Imf::Slice(pixelType, (char*)pixelPtr, xstride, ystride)); - frameBuffer.insert("G", Imf::Slice(pixelType, (char*)(pixelPtr + 1), xstride, ystride)); - frameBuffer.insert("B", Imf::Slice(pixelType, (char*)(pixelPtr + 2), xstride, ystride)); - if (depth == 4) - frameBuffer.insert("A", Imf::Slice(pixelType, (char*)(pixelPtr + 3), xstride, ystride)); + frameBuffer.insert("R", Imf::Slice::Make(pixelType, (char*)(pixelPtr + 0), dataWindow, xstride, ystride)); + frameBuffer.insert("G", Imf::Slice::Make(pixelType, (char*)(pixelPtr + 1), dataWindow, xstride, ystride)); + frameBuffer.insert("B", Imf::Slice::Make(pixelType, (char*)(pixelPtr + 2), dataWindow, xstride, ystride)); + if (depth == 4) { + frameBuffer.insert("A", Imf::Slice::Make(pixelType, (char*)(pixelPtr + 3), dataWindow, xstride, ystride)); + } + } file.setFrameBuffer(frameBuffer); - file.writePixels(height); + file.writePixels(dataWindow.max.y - dataWindow.min.y + 1); + return; } #else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/ctlrender/format.cc new/CTL-ctl-1.5.5/ctlrender/format.cc --- old/CTL-ctl-1.5.4/ctlrender/format.cc 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/ctlrender/format.cc 2026-03-27 22:46:02.000000000 +0100 @@ -59,6 +59,10 @@ bps=0; squish=0; descriptor=0; + is_compression_set = false; +#if defined(HAVE_OPENEXR) + is_exr_standard_attributes_set = false; +#endif }; format_t::format_t(const char *_ext, uint8_t _bps) { @@ -66,4 +70,8 @@ bps=_bps; squish=0; descriptor=0; + is_compression_set = false; +#if defined(HAVE_OPENEXR) + is_exr_standard_attributes_set = false; +#endif }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/ctlrender/format.hh new/CTL-ctl-1.5.5/ctlrender/format.hh --- old/CTL-ctl-1.5.4/ctlrender/format.hh 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/ctlrender/format.hh 2026-03-27 22:46:02.000000000 +0100 @@ -57,6 +57,22 @@ #include <stdint.h> +#if defined(HAVE_OPENEXR) + #include <ImathBox.h> + #include <ImfLineOrder.h> + #include <ImfCompression.h> + +struct exr_standard_attributes_t { + Imath::Box2i dataWindow; + Imath::Box2i displayWindow; + float pixelAspectRatio; + Imath::V2f screenWindowCenter; + float screenWindowWidth; + Imf::LineOrder lineOrder; + Imf::Compression compression; +}; +#endif + // Used to pass in parameters through the transform function (see transform.hh) // into the file writers. struct format_t { @@ -75,6 +91,11 @@ // 160 - RA // 161 - GA // 162 - BA + bool is_compression_set; +#if defined(HAVE_OPENEXR) + bool is_exr_standard_attributes_set; + exr_standard_attributes_t exr_standard_attributes; +#endif }; #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/ctlrender/main.cc new/CTL-ctl-1.5.5/ctlrender/main.cc --- old/CTL-ctl-1.5.4/ctlrender/main.cc 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/ctlrender/main.cc 2026-03-27 22:46:02.000000000 +0100 @@ -331,15 +331,16 @@ "used.\n See '-help compression' for more details.\n"); exit(1); } - char scheme[8]; - memset(scheme, '\0', 8); - for(int i = 0; i < 8 && argv[1][i]; ++i) { - scheme[i] = toupper(argv[1][i]); + const int compression_name_max_length = 9; // length of longest supported compression name plus null terminator + char compression_name[compression_name_max_length] = { '\0' }; + for(int i = 0; i < compression_name_max_length && argv[1][i]; ++i) { + compression_name[i] = toupper(argv[1][i]); } - compression = Compression::compressionNamed(scheme); + compression = Compression::compressionNamed(compression_name); if (!strcmp(compression.name, Compression::no_compression.name)) { - fprintf(stderr, "Unrecognized compression scheme '%s'. Turning off compression.\n", scheme); + fprintf(stderr, "Unrecognized compression scheme '%s'. Turning off compression.\n", compression_name); } + desired_format.is_compression_set = true; argv++; argc--; } @@ -672,6 +673,9 @@ exit(1); } actual_format.squish = noalpha; + if (true == desired_format.is_compression_set) { + actual_format.is_compression_set = true; + } transform(inputFile, outputFile, input_scale, output_scale, &actual_format, &compression, ctl_operations, global_ctl_parameters); input_image_files.pop_front(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/ctlrender/usage.cc new/CTL-ctl-1.5.5/ctlrender/usage.cc --- old/CTL-ctl-1.5.4/ctlrender/usage.cc 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/ctlrender/usage.cc 2026-03-27 22:46:02.000000000 +0100 @@ -194,8 +194,26 @@ "\n" " B44A (lossy) Like B44 but smaller for images containing large\n" " uniform areas.\n" +"\n" +" DWAA (lossy) Lossy compression of RGB data by quantizing discrete cosine transform (DCT) components,\n" +" in blocks of 32 scanlines. More efficient for partial buffer access.\n" +"\n" +" DWAB (lossy) Lossy compression of RGB data by quantizing discrete cosine transform (DCT) components,\n" +" in blocks of 256 scanlines. More efficient space wise and faster to decode full frames than DWAA access.\n" + +#if (defined(OPENEXR_VERSION_MAJOR) && (OPENEXR_VERSION_MAJOR >= 3) && defined(OPENEXR_VERSION_MAJOR) && (OPENEXR_VERSION_MINOR >= 4)) || (defined(OPENEXR_VERSION_MAJOR) && (OPENEXR_VERSION_MAJOR >= 4)) + +"\n" +" HTJ2K256 (lossless) High Throughput JPEG 2000 compression.\n" +" Compression is performed on blocks of 256 scanlines.\n" +"\n" +" HTJ2K32 (lossless) High Throughput JPEG 2000 compression.\n" +" Compression is performed on blocks of 32 scanlines.\n" "\n"); #else + ); +#endif +#else fprintf(stdout, "\n" "exr compression:\n" "\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/docker/Dockerfile_gentoo new/CTL-ctl-1.5.5/docker/Dockerfile_gentoo --- old/CTL-ctl-1.5.4/docker/Dockerfile_gentoo 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/docker/Dockerfile_gentoo 2026-03-27 22:46:02.000000000 +0100 @@ -1,7 +1,8 @@ FROM gentoo/stage3 # update packages -RUN emaint --auto sync +#RUN emaint --auto sync +RUN emerge-webrsync # install development tools RUN emerge cmake diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/docker/Dockerfile_ubuntu_24.04_openexr34 new/CTL-ctl-1.5.5/docker/Dockerfile_ubuntu_24.04_openexr34 --- old/CTL-ctl-1.5.4/docker/Dockerfile_ubuntu_24.04_openexr34 1970-01-01 01:00:00.000000000 +0100 +++ new/CTL-ctl-1.5.5/docker/Dockerfile_ubuntu_24.04_openexr34 2026-03-27 22:46:02.000000000 +0100 @@ -0,0 +1,37 @@ +FROM ubuntu:24.04 + +RUN apt-get update + +# disable interactive install +ENV DEBIAN_FRONTEND=noninteractive + +# install developement tools +RUN apt-get -y install cmake +RUN apt-get -y install g++ +RUN apt-get -y install git + +# install CTL dependencies +RUN apt-get -y install libtiff-dev + +# install CTL dependecies - openexr +WORKDIR /usr/src/ +RUN git clone https://github.com/AcademySoftwareFoundation/openexr.git +WORKDIR /usr/src/openexr +RUN git checkout RB-3.4 +WORKDIR /usr/src/openexr/build +RUN cmake .. -DBUILD_TESTING=OFF -DOPENEXR_BUILD_TOOLS=OFF -DOPENEXR_INSTALL_EXAMPLES=OFF +RUN make +RUN make install + +# build CTL +WORKDIR /usr/src/CTL +COPY . . +WORKDIR /usr/src/CTL/build +RUN rm -R * || true +RUN cmake .. +RUN make +RUN make install + +# finalize docker environment +WORKDIR /usr/src/CTL + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/lib/IlmCtl/CtlExc.cpp new/CTL-ctl-1.5.5/lib/IlmCtl/CtlExc.cpp --- old/CTL-ctl-1.5.4/lib/IlmCtl/CtlExc.cpp 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/lib/IlmCtl/CtlExc.cpp 2026-03-27 22:46:02.000000000 +0100 @@ -67,7 +67,7 @@ namespace Ctl { void CtlExc::_explain(const char *text, va_list _ap) { - char *ptr; + char *ptr = NULL; int length=1024; int need_len; va_list ap; @@ -77,7 +77,16 @@ } while(1) { va_copy(ap, _ap); - ptr=(char *)alloca(length); + if (ptr) { + free(ptr); + } + ptr = (char *)malloc(length); + if (!ptr) { + // Out of memory; set empty string and return + operator=("allocation failed."); + va_end(ap); + return; + } memset(ptr, 0, length); need_len=vsnprintf(ptr, length, text, ap); if(need_len<length && need_len!=-1) { @@ -91,6 +100,7 @@ } operator=(ptr); + free(ptr); va_end(ap); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/lib/IlmCtl/CtlTypeStorage.cpp new/CTL-ctl-1.5.5/lib/IlmCtl/CtlTypeStorage.cpp --- old/CTL-ctl-1.5.4/lib/IlmCtl/CtlTypeStorage.cpp 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/lib/IlmCtl/CtlTypeStorage.cpp 2026-03-27 22:46:02.000000000 +0100 @@ -87,14 +87,21 @@ } static std::string strprintf(const char *fmt, ...) { - char *ptr; + char *ptr = NULL; int length=1024; int need_len; va_list ap; while(1) { + if (ptr) { + free(ptr); + } va_start(ap, fmt); - ptr=(char *)alloca(length); + ptr=(char *)malloc(length); + if (!ptr) { + va_end(ap); + throw std::bad_alloc(); + } memset(ptr, 0, length); need_len=vsnprintf(ptr, length, fmt, ap); va_end(ap); @@ -108,7 +115,9 @@ } } - return std::string(ptr); + std::string result(ptr); + free(ptr); + return result; } void _copy(char *out, const char *in, const DataTypePtr &out_type, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/lib/dpx/dpx_util.cc new/CTL-ctl-1.5.5/lib/dpx/dpx_util.cc --- old/CTL-ctl-1.5.4/lib/dpx/dpx_util.cc 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/lib/dpx/dpx_util.cc 2026-03-27 22:46:02.000000000 +0100 @@ -76,13 +76,14 @@ while(1) { va_start(ap, fmt); - ptr=(char *)alloca(length); + ptr=(char *)malloc(length); memset(ptr, 0, length); need_len=vsnprintf(ptr, length, fmt, ap); va_end(ap); if(need_len<length && need_len!=-1) { break; } + free(ptr); if(need_len==-1) { length=length*2; } else { @@ -90,7 +91,9 @@ } } - return std::string(ptr); + std::string result(ptr); + free(ptr); + return result; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/unittest/ctlrender/CMakeLists.txt new/CTL-ctl-1.5.5/unittest/ctlrender/CMakeLists.txt --- old/CTL-ctl-1.5.4/unittest/ctlrender/CMakeLists.txt 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/unittest/ctlrender/CMakeLists.txt 2026-03-27 22:46:02.000000000 +0100 @@ -68,6 +68,23 @@ add_test(NAME "ctlrender-EXR_RGBA16->EXR_RGBA_32" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity_with_alpha.ctl" -format exr32 -force "${TEST_FILES}/colorbars_nuke_rgba_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgba_exr16_to_exr32.exr") add_test(NAME "ctlrender-EXR_RGBA32->EXR_RGBA_16" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity_with_alpha.ctl" -format exr16 -force "${TEST_FILES}/colorbars_nuke_rgba_exr32.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgba_exr32_to_exr16.exr") add_test(NAME "ctlrender-EXR_RGBA32->EXR_RGBA_32" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity_with_alpha.ctl" -format exr32 -force "${TEST_FILES}/colorbars_nuke_rgba_exr32.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgba_exr32_to_exr32.exr") + + # EXR compression tests + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-NONE" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression none "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_none.exr") + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-RLE" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression rle "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_rle.exr") + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-ZIPS" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression zips "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_zips.exr") + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-ZIP" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression zip "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_zip.exr") + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-PIZ" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression piz "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_piz.exr") + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-PXR24" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression pxr24 "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_pxr24.exr") + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-B44" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression b44 "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_b44.exr") + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-B44A" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression b44a "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_b44a.exr") + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-DWAA" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression dwaa "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_dwaa.exr") + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-DWAB" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression dwab "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_dwab.exr") + if((OPENEXR_VERSION_MAJOR GREATER_EQUAL 3 AND OPENEXR_VERSION_MINOR GREATER_EQUAL 4) OR (OPENEXR_VERSION_MAJOR GREATER_EQUAL 4)) + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-HTJ2K256" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression htj2k256 "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_htj2k256.exr") + add_test(NAME "ctlrender-EXR16->EXR16-COMPRESSION-HTJ2K32" COMMAND ${CTLRENDER_PATH} -ctl "${TEST_FILES}/unity.ctl" -format exr16 -force -compression htj2k32 "${TEST_FILES}/colorbars_nuke_rgb_exr16.exr" "${CTLRENDER_OUTPUT_FOLDER}/bars_rgb_exr16_to_exr16_compression_htj2k32.exr") + endif() + endif() #ACES tests diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CTL-ctl-1.5.4/vcpkg.json new/CTL-ctl-1.5.5/vcpkg.json --- old/CTL-ctl-1.5.4/vcpkg.json 2025-07-30 03:56:19.000000000 +0200 +++ new/CTL-ctl-1.5.5/vcpkg.json 2026-03-27 22:46:02.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "ctl", - "version": "1.5.4", + "version": "1.5.5", "dependencies": [ "imath", "openexr",
