Skip to content

OpenImageIO v2.4.4.1

Compare
Choose a tag to compare
@lgritz lgritz released this 01 Oct 17:16

OpenImageIO version 2.4 has been released! Officially tagged as "v2.4.4.1", we have also moved the "release" branch tag to this position. Henceforth, 2.4 is the supported production release family. The API is now frozen -- we promise that subsequent 2.4.x releases (which should happen monthly) will not break back-compatibility of API, ABI, or linkage, compared to this release. Please note that this release is not ABI or link compatible with 2.3 or older releases (and not necessarily with earlier in-progress 2.4 development before this release).

Release notes for 2.4 outlining all the changes since last year's release are below.

Please note that a few of the build and runtime dependencies have changed their minimum supported versions. OpenEXR versions 2.0, 2.1, and 2.2 are no longer supported, 2.3 is now the minimum. Field3D is now no longer supported as a volume data format, as it is no longer actively maintained and everybody seems to have switched to OpenVDB for volume data.

Enjoy, and please report any problems. We will continue to make patch releases to the 2.4 family roughly monthly, which will contain bug fixes and non-breaking enhancements.

The older 2.3 series of releases is now considered obsolete. We will continue for now to make 2.3 patch releases, but over time, these will become less frequent and be reserved for only the most critical bug fixes.

The "master" branch is now progressing toward an eventual 2.5 release next summer. As usual, you are welcome to use master for real work, but we do not make any compatibility guarantees and don't guarantee continuing API compatibility in master.

Release 2.4 (1 Oct 2022) -- compared to 2.3

New minimum dependencies and compatibility changes:

  • OpenEXR minimum is now 2.3 (raised from 2.0). #3109 (2.4.0)
  • Field3D support has been removed entirely. The Field3D library appears to be
    no longer maintained, and is incompatible with modern versions of
    OpenEXR/Imath. We believe that all prior uses of Field3D use via OIIO have
    been migrated to OpenVDB. #3151 (2.4.0)

New major features and public API changes:

  • Imath header and class hiding:
    • Header includes have been shuffled around so that Imath headers are not
      included from OIIO headers where they are not needed, and some OIIO
      headers that need Imath types only for few function parameters now guard
      those functions with #if so that Imath-taking functions are not
      visible unless the calling app has previously had an #include of
      Imath. If your app uses Imath types but did not include the right Imath
      headers (relying on the accidental fact of other OIIO headers
      transitively including them), you may need to adjust your includes.
      #3301 #3332 (2.4.0.2) #3406 #3474 (2.4.2)
    • New V3fParam, M33fParam, and M44fParam (defined in vecparam.h) are
      used just for parameter passing in public APIs, instead of Imath::V3f,
      M33f, or M44f, in order to more fully hide Imath types from our public
      interfaces. These are only parameter-passing classes, and are not useful
      as vector or matrix classes in their own right. But they seamlessly cast
      to and from other vector- and matrix-like classes. #3330 (2.4.1.0)
    • OPENIMAGEIO_IMATH_DEPENDENCY_VISIBILITY is a new CMake cache variable
      at OIIO build time that controls whether the Imath library dependencies
      will be declared as PUBLIC (default) or PRIVATE target dependencies of
      libOpenImageIO and libOpenImageIO_Util. #3322 (4.2.0.2) #3339 (4.2.0.3)
    • For downstream projects that consume OIIO's exported cmake config
      files, setting CMake variable OPENIMAGEIO_CONFIG_DO_NOT_FIND_IMATH to
      ON will skip the find_depencency() calls for Imath and OpenEXR. To
      clarify, this is not a variable that has any effect when building OIIO,
      it's something set in the downstream project itself. #3322 (4.2.0.2)
  • The dithering that happens when saving high bit depth image data to low bit
    depth formats has been improved in several ways. It now applies when writing

    8 bit data to <= 8 bit files, not just when the source is float or half.
    The dither pattern is now based on blue noise, and this dramatically
    improves the visual appearance. #3141 (2.4.0/2.3.10)

  • TextureSystem now supports stochastic sampling. If the new TextureOpt field
    rnd (which now defaults to -1.0) is set to a value >= 0, the filtered
    texture lookup can use stochastic sampling to save work. The shading system
    attribute "stochastic" is set to the stochastic strategy: 0 = no stochastic
    sampling; 1 = for trilinear or anisotropic MIP modes, choose one MIP level
    stochastically instead of blending between two levels; 2 = for anisotropic
    mode, use just one anisotropic sample, chosen across the filter axis. (This
    is a bit field, so 3 combines both strategies.) We measure this speeding up
    texture lookups by 25-40%, though with more visual noise (which should be
    resolved cleanly by a renderer that uses many samples per pixel). This
    should only used for texture lookups where many samples per pixel will be
    combined, such as for surface or light shading. It should not be used for
    texture lookups that must return a single correct value (such as for
    displacement, when each grid position is sampled only once). Even when the
    "stochastic" attribute is nonzero, any individual texture call may be made
    non-stochastic by setting TextureOpt.rnd to a negative value. #3127
    (2.4.0/2.3.10) #3457 (2.4.2)
  • maketx/make_texture() now supports options to store Gaussian forward and
    inverse transform lookup tables in image metadata (must be OpenEXR textures
    for this to work) to aid writing shaders that use histogram-preserving
    blending of texture tiling. This is controlled by new maketx arguments
    --cdf, --cdfsigma, --sdfbits, or for IBA::make_texture() by using
    hints maketx:cdf, maketx:cdfsigma, and maketx:cdfbits. #3159 #3206
    (2.4.0/2.3.10)
  • oiiotool new commands and features:
    • Control flow via --if, --else, --endif, --while, --endwhile,
      --for, --endfor let you prototypes conditional execution and loops
      in the command sequence. #3242 (2.4.0)
    • --set can set variables and their values can be retrieved in
      expressions. #3242 (2.4.0)
    • Expressions now support: numerical comparisons via <, >, <=, >=,
      ==, !=, <=>; logical operators &&, ||, !, not(); string
      comparison functions eq(a,b) and neq(). #3242 #3243 (2.4.0)
    • --oiioattrib can set "global" OIIO control attributes for an oiiotool
      run (equivalent of calling OIIO::attribute()). #3171 (2.4.0/2.3.10)
    • --repremult exposes the previously existing IBA::repremult(). The
      guidance here is that --premult should be used for one-time conversion
      of "unassociated alpha/unpremultiplied color" to
      associated/premultiplied, but when you are starting with a premultiplied
      image and have a sequence of unpremultiply, doing some adjustment in
      unpremultiplied space, then re-premultiplying, it's --repremult you
      want as the last step, because it preserves alpha = 0, color > 0 data
      without crushing it to black. #3192 (2.4.0/2.3.10)
    • --saturate can adjust saturation level of a color image. #3190
      (2.4.0/2.3.10)
    • --maxchan and --minchan turn an N-channel image into a 1-channel
      images that for each pixel, contains the maximum value in any channel of
      the original for that pixel. #3198 (2.4.0/2.3.10)
    • --point lets you color one or more pixels in an image (analogous to
      IBA::render_point). #3256 (2.4.0)
    • --warp now takes an optional modifier :wrap=... that lets you set
      which wrap mode to use when sampling past the edge of the source image.
      #3341 (2.4.0.3)
    • New --st_warp performs warping of an image where a second image gives
      the (s,t) coordinates to look up from at every pixel. #3379
      (2.4.2/2.3.14)
    • Many attribute actions now take optional modifier :subimages= that
      instructs oiiotool to apply to a particular subset of subimges in
      multi-subimage files (such as multi-part exr). The commands so enabled
      include --attrib, --sattrib, --eraseattrib, --caption,
      --orientation, --clear-keywords, --iscolorspace. The default, if
      subimages are not specified, is to only change the attributes of the
      first subimage, unless -a is used, in which case the default is to
      change the attributes of all subimages. #3384 (2.4.2)
  • ImageSpec :
    • New constructors to accept a string for the data type. #3245
      (2.4.0/2.3.12)
  • ImageBuf/ImageBufAlgo :
    • IBA::saturate() can adjust saturation level of a color image. #3190
      (2.4.0/2.3.10)
    • IBA::maxchan() and minchan() turn an N-channel image into a
      1-channel images that for each pixel, contains the maximum value in any
      channel of the original for that pixel. #3198 (2.4.0/2.3.10)
    • New IBA::st_warp() performs warping of an image where a second image
      gives the (s,t) coordinates to look up from at every pixel. #3379
      (2.4.2/2.3.14)
    • IBA::bluenoise_image() returns a reference to a periodic blue noise
      image. #3141 #3254 (2.4.0/2.3.10)
  • ImageCache / TextureSystem :
    • IC/TS both have added a getattributetype() method, which retrieves
      just the type of a named attribute. #3559 (2.4.4.0)
  • Python bindings:
    • New ImageBuf constructor and reset() from a NumPy array only -- it
      deduces the resolution, channels, and data type from the array
      dimensions and type. #3246 (2.4.0/2.3.12)
    • ROI now has a working copy() method. #3253 (2.4.0/2.3.12)
    • ImageSpec and ParamValueList now support 'key' in spec, del spec['key'], and spec.get('key', defaultval) to more fully emulate
      Python dict syntax for manipulating metadata. #3252 (2.3.12/2.4.0)
    • Support uint8 array attributes in and out. This enables the proper
      Python access to "ICCProfile" metadata. #3378 (2.4.1.0/2.3.14)
    • New ImageSpec.get_bytes_attribute() method is for string attributes,
      but in Python3, skips decoding the underlying C string as UTF-8 and
      returns a bytes object containing the raw byte string. #3396 (2.4.2)
    • Fixes for Python 3.8+ to ensure that it can find the OpenImageIO module
      as long as it's somewhere in the PATH. This behavior can be disabled by
      setting environment variable OIIO_LOAD_DLLS_FROM_PATH=0. #3470
      (2.4.0/2.3.18)
  • New global OIIO attributes:
    • "try_all_readers" can be set to 0 if you want to override the default
      behavior and specifically NOT try any format readers that don't match
      the file extension of an input image (usually, it will try that one
      first, but it if fails to open the file, all known file readers will be
      tried in case the file is just misnamed, but sometimes you don't want it
      to do that). #3172 (2.4.0/2.3.10)
    • "use_tbb" if nonzero, and if OIIO was built with TBB enabled and
      found, then will use the TBB thread pool instead of the OIIO internal
      thread pool. #3473 (2.4.2.2)
    • "version" (read only) now retrieves the version string. #3534
      (2.3.19.0/2.4.2.2)
  • Full IOProxy support has been added to TIFF #3075 (2.4.0/2.3.8), JPEG, GIF
    #3181 #3182 (2.4.0/2.3.10), DDS #3217, PNM #3219, PSD #3220, Targa #3221,
    WebP #3224, BMP #3223, JPEG-2000 #3226 (2.4.0).
  • Convention change: Image readers who wish to convey that the color space of
    an input image is a simple gamma-corrected space will now call the color
    space "GammaX.Y" (previously we sometimes used this, but sometimes called it
    "GammaCorrectedX.Y"). #3202 (2.4.0)
  • oiioversion.h now defines symbols OIIO_USING_IMATH_VERSION_MAJOR and
    OIIO_USING_IMATH_VERSION_MINOR that reveal which Imath version was used
    internally to OIIO when it was built (which may be different than the
    version found when the downstream app is being compiled). #3305 (2.4.0.1)
  • Most of the major APIs (including ImageInput, ImageOutput, and ImageBuf)
    that took a std::string or string_view to indicate a filename (assumed to
    support UTF-8 encoding of Unicode filenames) now have additional versions
    that directly take a std::wstring, thus supporting UTF-16 Unicode
    filenames as "wide strings". #3312 #3318 (2.4.0.1)
  • The ColorConfig API adds new calls getDisplayViewColorSpaceName() and
    getDisplayViewLooks() that expose the underlying OpenColorIO
    functionality. #3319 (2.4.0.2)
  • Many long-deprecated functions in imageio.h and imagbufalgo.h are now
    marked as OIIO_DEPRECATED, and therefore may start to generate warnings
    if used by downstream software. #3328 (2.4.1.0)

Performance improvements:

  • Raise the default ImageCache default tile cache from 256MB to 1GB. This
    should improve performance for some operations involving large images or
    images with many channels. #3180 (2.4.0/2.3.10)
  • Performance of JPEG-2000 I/O is improved by 2-3x due to multithreading,
    but only if you are using a sufficiently new version of OpenJPEG (2.2
    for encoding, 2.4 for decoding). #2225 (2.3.11/2.4.0)
  • Dramatically speed up (50-100x) the implementation of Strutil iequals,
    iless, starts_with, istarts_with, ends_with, iends_with. This in turn speeds
    up ParamValueList find/get related methods, ImageSpec find/get methods, and
    TS::get_texture_info. #3388 (2.4.1.1)
  • Renderer users of the TextureSystem might see up to a ~40% speedup if
    using the new stochastic sampling features. #3127 #3457
  • Speed up reading of uncompressed DDS images by about 3x. #3463 (2.4.2.0)

Fixes and feature enhancements:

  • ImageSpec:
    • Implemented deserialization of extra_attribs from XML. #3066 (2.4.0/2.3.8)
    • Allow getattribute("format") to retrieve the name of the pixel data
      type. #3247 (2.4.0)
  • ImageInput / ImageOutput:
    • Protected methods that make it easier to implement support for IOProxy
      in image readers and writers. #3231 (2.4.0)
    • Fix crash when ioproxy is passed to a plugin that doesn't support it.
      #3453 (2.4.2)
  • ImageBuf / ImageBufAlgo:
    • Fix ImageBuf::read bug for images of mixed per-channel data types. #3088
      (2.4.0/2.3.8)
    • IBA::noise() now takes "blue" as a noise name. Also, "white" is now
      the preferred name for what used to be "uniform" (which still works as a
      synonym). #3141 (2.4.0/2.3.10)
    • Refactor ImageBuf::Iterator, ConstIterator templates, reduces compile
      time substantially. #3195 (2.4.0)
    • IBA functions taking a cspan<> now more flexibly can be passed
      an init list like { 0.2f, 0.4f, 0.5f } instead of needing to wrap it
      in a cspan<float>() constructor. #3257 (2.3.12/2.4.0)
    • make_texture(): ensure that "maketx:ignore_unassoc" is honored.
      #3269 (2.4.0.1/2.3.12)
    • IBA::computePixelStats() improved precision. #3353 (2.4.1.0/2.3.14)
    • IBA::isConstantColor() is faster -- now if one thread finds its
      portion not constant, it can signal the other threads to stop
      immediately instead of completing their regions. #3383 (2.4.1.1)
    • A new flavor of IBA::compare() allows relative as well as absolute
      error thresholds. #3508 (2.3.19.0/2.4.2.2)
  • ImageCache / TextureSystem / maketx:
    • When textures are created with the "monochrome_detect" feature enabled,
      which turns RGB textures where all channels are always equal into true
      single channel greyscale, the single channel that results is now
      correctly named "Y" instead of leaving it as "R" (it's not red, it's
      luminance). #3205 (2.4.0/2.3.10)
    • Enhance safety/correctness for untiled images that exceed 2GB size
      (there was an integer overflow problem in computing offsets within
      tiles). #3232 (2.3.11/2.4.0)
    • Improve error propagation from ImageCache to higher levels, especially
      for tile-reading errors encountered during ImageBuf iterator use, and
      ImageCache errors encountered when using the TextureSystem. #3233
      (2.4.0)
    • Support an additional UDIM pattern <UVTILE>, which is specified by
      MaterialX. #3280 #3285 (2.3.12/2.4.0.1)
    • Add support for UDIM pattern <uvtile> (used by Clarisse & V-Ray). #3358
      (2.4.1.0/2.3.14)
    • The maketx --handed option, or oiiotool -attrib -otex:handed=..., or
      adding "handed" metadata to the configuration ImageSpec being passed to
      IBA::make_texture() is now supported for communicating the handedness
      of a vector displacement or normal map. #3331 (2.4.0.2)
    • Speed up UDIM lookups by eliminating internal mutex. #3417 (2.4.0)
    • TextureSystem: Fix typo that prevented "max_tile_channels" attribute from
      being set or retrieved. (2.4.2/2.3.17)
  • oiiotool:
    • --ch now has virtually no expense if the arguments require no change
      to the channel order or naming (previously, it would always incur an
      image allocation and copy even if no real work needed to be done). #3068
      (2.4.0/2.3.8)
    • --ch now warns if you specify a channel name that was not present
      in the input image. #3290 (2.4.0.1)
    • --runstats timing report has been improved and now more accurately
      attributes time to each operation. In particular, input I/O is now
      credited to "-i" rather than being incorrectly attributed to the other
      ops that happen to trigger I/O of previously mentioned files. #3073
      (2.4.0/2.3.8)
    • Allow quotes in command modifiers. #3112 (2.4.0/2.3.9)
    • Fix --dumpdata getting the formatting of floating point values wrong.
      #3131 (2.4.0/2.3.9)
    • --dumpdata:C=name causes the dumped image data to be formatted with
      the syntax of a C array. #3136 (2.4.0/2.3.9)
    • --noise now takes "blue" as an additional noise type. #3141
      (2.4.0/2.3.10)
    • -d now accepts "uint1", "uint2", "uint4", and "uint6" for formats that
      support such low bit depths (TIFF). #3141 (2.4.0/2.3.10)
    • --invert fixed to avoid losing the alpha channel values. #3191
      (2.4.0/2.3.10)
    • Fix bug when autocropping output images when the entire pixel data
      window is in the negative coordinate region. #3164 (2.4.0/2.3.10)
    • Improved detection of file reading failures. #3165 (2.4.0/2.3.10)
    • All commands that do filtering (--rotate, --warp, --reize, --fit, and
      --pixelaspect) now accept optional modifier :highlightcomp=1 to enable
      "highlight compensation" to avoid ringing artifacts in HDR images with
      very high-contrast regions. #3239 (2.4.0)
    • --pattern checker behavior has changed slightly: if the optional
      modifier :width= is specified but :height= is not, the height will
      be equal to the width. #3255 (2.4.0)
    • --pixelaspect fixes setting of the "PixelAspectRatio", "XResolution",
      and "YResolution" metadata, they were not set properly before. #3340
      (2.4.0.3)
    • Fix bug that prevented metadata from being able to print as XML. #3499
      (2.4.2.2)
    • i:ch=... fixes crashes, and also improves the warning message in cases
      where the requested channels don't exist in the source image. #3513
      (2.4.2.2)
  • Python bindings:
    • Subtle/asymptomatic bugs fixed in ImageBufAlgo.color_range_check() and
      histogram() due to incorrect release of the GIL. #3074 (2.4.0)
    • Bug fix for ImageBufAlgo.clamp(): when just a float was passed for the
      min or max, it only clamped the first channel instead of all channels.
      #3265 (2.3.12/2.4.0)
    • Fix the ability to getattribute() of int64 and uint64 metadata or
      attributes. #3555 (2.4.4.0)
  • idiff:
    • --allowfailures allows that number of failed pixels of any magnitude.
      #3455 (2.4.2)
    • --failrelative and --warnrelative allows the failure and warning
      threshold to use a symmetric mean relative error (rather than the
      absolute error implied by the existing --fail and --warn arguments).
      #3508 (2.3.19.0, 2.4.2.2)
  • BMP:
    • IOProxy support. #3223 (2.4.0)
    • Support for additional (not exactly fully documented) varieties used by
      some Adobe apps. #3375 (2.4.1.0/2.3.14)
    • Better detection of corrupted files with nonsensical image dimensions or
      total size. #3434 (2.4.2/2.3.17/2.2.21)
    • Protect against corrupted files that have palette indices out of bound.
      #3435 (2.4.2/2.3.17/2.2.21)
  • DDS:
    • Don't set "texturetype" metadata, it should always have been only
      "textureformat". Also, add unit testing of DDS to the testsuite. #3200
      (2.4.0/2.3.10)
    • IOProxy support. #3217 (2.4.0)
    • Add support for BC4-BC7 compression methods. #3459 (2.4.2)
    • Speed up reading of uncompressed DDS images (by about 3x). #3463
    • Better handling of cube maps with MIPmap levels. #3467 (2.4.0)
    • For 2-channel DDS files, label them as Y,A if the flags indicate
      luminance and/or alpha, otherwise label them as R,G. #3530 (2.4.2.2)
    • Do not set "oiio:BitsPerSample" for cases where the dds.fmt.bpp field is
      not assumed to be valid. MS docs say it's valid only if the flags field
      indicates RGB, LUMINANCE, or YUV types. #3530 (2.4.2.2)
  • FFMpeg
    • Now uses case-insensitive tests on file extensions, so does not get
      confused on Windows with all-caps filenames. #3364 (2.4.1.0/2.3.14)
    • Take care against possible double-free of allocated memory crash upon
      destruction. #3376 (2.4.1.0/2.3.14)
  • GIF
    • IOProxy support. #3181 (2.4.0/2.3.10)
  • HDR:
    • IOProxy support. #3218 (2.4.0)
  • HEIF:
    • Handle images with unassociated alpha. #3146 (2.4.0/2.3.9)
  • JPEG:
    • IOProxy support. #3182 (2.4.0/2.3.10)
    • Better handling of PixelAspectRatio. #3366 (2.4.1.0)
    • Fix multithreaded race condition in read_native_scanline. #3495
      (2.4.2.2)
    • Fix bug in XRes,YRes aspect ratio logic. #3500 (2.4.2.2)
    • When asked to output 2-channel images (which JPEG doesn't support), use
      the channel names to decide whether to drop the second channel (if it
      seems to be a luminance/alpha image) or add a third black channel (other
      cases). #3531 (2.4.2.2)
  • JPEG2000:
    • Enable multithreading for decoding (if using OpenJPEG >= 2.2) and
      encoding (if using OpenJPEG >= 2.4). This speeds up JPEG-2000 I/O by
      3-4x. #2225 (2.3.11/2.4.0)
    • IOProxy support. #3226 (2.4.0)
    • Better detection and error reporting of failure to open the file.
      #3440 (2.4.2)
  • OpenEXR:
    • When building against OpenEXR 3.1+ and when the global OIIO attribute
      "openexr:core" is set to nonzero, do more efficient multithreaded
      reading of OpenEXR files. #3107 (2.4.0/2.3.9.1)
    • Fix excessive memory usage when saving EXR files with many channels.
      #3176 (2.4.0/2.3.10)
    • When building against OpenEXR >= 3.1.3, our OpenEXR output now supports
      specifying the zip compression level (for example, by passing the
      "compression" metadata as "zip:4"). Also note than when using OpenEXR >=
      3.1.3, the default zip compression has been changed from 6 to 4, which
      writes compressed files significantly (tens of percent) faster, but only
      increases compressed file size by 1-2%. #3157 (2.4.0/2.3.10) Fixes in
      #3387 (2.4.1.1)
    • Fix writing deep exrs when buffer datatype doesn't match the file. #3369
      (2.4.1.0/2.3.14)
  • PNG:
    • Assume sRGB color space as default when no color space attribute is
      in the file. #3321 (2.4.0.2/2.3.13)
    • Improve error detection and propagation for corrupt/broken files. #3442
      (2.4.2)
    • Improve error detection and messages when writing PNG files, for various
      kinds of errors involving metadata. #3535 (2.4.2.2)
  • PPM:
    • Mark all PPM files as Rec709 color space, which they are by
      specification. #3321 (2.4.0.2/2.3.13)
  • PSD:
    • IOProxy support. #3220 (2.4.0)
    • Better error messages for corrupted files and other failures. #3469
      (2.4.0)
  • RAW:
    • When using libraw 0.21+, now support new color space names "DCE-P3",
      "Rec2020", and "sRGB-linear", and "ProPhoto-linear". Fix incorrect gamma
      values for "ProPhoto". #3123 #3153 (2.4.0/2.3.9.1)
  • RLA:
    • Better guards against malformed input. #3163 (2.4.0/2.3.10)
  • Targa:
    • Improved error detection for read errors and corrupted files. #3120
      (2.4.0/2.3.9.1) #3162 (2.4.0/2.3.10)
    • Fixed bug when reading x-flipped images. #3162 (2.4.0/2.3.10)
    • IOProxy support. #3221 (2.4.0)
    • Better interpretation of TGA 1.0 files with alpha that is zero
      everywhere. Be more consistent with Targa attributes all being called
      "targa:foo". Add "targa:version" to reveal whether the file was TGA 1.0
      or 2.0 version of the format. #3279 (2.4.0.1/2.3.12)
    • Fix parsing of TGA 2.0 extension area when the software name was
      missing form the header. #3323 (2.4.0.2/2.3.13)
    • Fix reading of tiny 1x1 2-bpp Targa 1.0 images. #3433 (2.3.17/2.2.21)
  • Socket imageio plugin has been removed entirely, it never was completed or
    did anything useful. #3527 (2.3.2.2)
  • TIFF:
    • IOProxy is now supported for TIFF output. #3075 (2.4.0/2.3.8)
    • Honor zip compression quality request when writing TIFF. #3110
      (2.4.0/2.3.11)
    • Automatically switch to "bigtiff" format for really big (> 4GB) images.
      #3158 (2.4.0)
    • Support for palette images with 16 bit palette indices. #3262
      (2.4.0/2.3.12)
    • Gracefully handle missing ExtraSamples tag. #3287 (2.4.0.1/2.3.12)
    • New output configuration hint: "tiff:write_extrasamples" (default: 1),
      if set to 0, will cause the TIFF output to NOT include the required
      EXTRASAMPLES tag in the header. This is not recommended, but fixes
      a specific problem in some circumstances where PhotoShop misbehaves
      when the extrasamples tag is present. #3289 (2.4.0.1)
    • No longer write IPTC blocks to the TIFF header by default, it caused
      trouble and was sometimes corrupted. You can force it to write an IPTC
      block by using the output open configuration hint "tiff:write_iptc" set
      to nonzero. #3302 (2.4.0.1)
    • Fix read problems with TIFF files with non-zero y offset. #3419
      (2.3.17/2.4.2)
    • Fixed some longstanding issues with IPTC data in the headers. #3465
      (2.4.0)
    • Protect against crashes with certain empty string attributes. #3491
      (2.4.2.1)
  • WebP:
    • Fix previous failure to properly set the "oiio:LoopCount" metadata
      when reading animated webp images. #3183 (2.4.0/2.3.10)
    • IOProxy support. #3224 (2.4.0)
  • Better catching of exceptions thrown by OCIO 1.x if it encounters 2.0 config
    files. #3089 (2.4.0/2.3.9)
  • Improved internal logic and error reporting of missing OCIO configs. #3092
    #3095
  • Improved finding of fonts (by IBA::render_text and oiiotool --text). It now
    honors environment variable $OPENIMAGEIO_FONTS and global OIIO attribute
    "font_searchpath" to list directories to be searched when fonts are needed.
    #3096 (2.4.0/2.3.8)
  • Fix crash that could happen with invalidly numbered UDIM files. #3116
    (2.4.0/2.3.9)
  • Fix possible bad data alignment and SIMD assumptions inside TextureSystems
    internals. #3145 (2.4.0/2.3.9)
  • Update internal stb_printf implementation (avoids some sanitizer alerts).
    #3160 (2.4.0/2.3.10)
  • Replace the few remaining instances of sscanf in the codebase with Strutil
    utilities that are guaranteed to be locale-independent. #3178 (2.4.0)
  • Security: New global OIIO attributes "limits:channels" (default: 1024) and
    "limits:imagesize_MB" (default: 32768, or 32 GB) are intended to reject
    input files that exceed these limits, on the assumption that they are either
    corrupt or maliciously constructed, and would, if read, lead to absurd
    allocations, crashes, or other mayhem. Apps may lower or raise these limits
    if they know that a legitimate input image exceeds these limits. Currently,
    only the TIFF reader checks these limits, but others will be modified to
    honor the limits over time. #3230 (2.3.11/2.4.0)
  • Fix integer overflow warnings. #3329 (2.4.1.0)
  • Improved behavior when opening a file whose format doesn't correctly match
    its extension: try common formats first, rather than alphabetically; and
    improve error messages. #3400 (2.4.2)
  • The maximum number of threads you can set with option "oiio:threads"
    has been increased from 256 to 512. #3484 (2.4.2.1)
  • Make access to the internal imageio_mutex not be recursive. #3489 (2.4.2.2)
  • Various protections against string metadata found in file that has zero
    length. #3493 (2.4.2.2)
  • Fix possible null pointer dereference in inventory_udim. #3498 (2.4.2.2)
  • oiiotool, maketx, iinfo, igrep, and iv now all take a --version command
    line argument, which just prints the OIIO version and exits. #3534

Developer goodies / internals:

  • benchmark.h:
    • Alter the declaration of DoNotOptimize() so that it doesn't have
      compilation problems on some platforms. #3444 (2.4.2/2.3.17)
  • filesystem.h:
    • A new version of searchpath_split returns the vector of strings rather
      than needing to be passed a reference. #3154 (2.4.0/2.3.10)
    • New write_binary_file() utility function. #3199 (2.4.0/2.3.10)
    • searchpath_split() fixes to better handle empty paths. #3306 (2.4.0.1)
  • fmath.h:
    • Added round_down_to_multiple(). Also, more correctly handle
      round_to_multiple() results when the value is < 0. #3104
    • Add round_down_to_multiple() and improve round_to_multiple() to
      correctly handle cases where the value is less than 0. #3104
      (2.4.0/2.3.8)
    • Make bit_cast specialization take refs, like the template. This fixes
      warnings for some compilers. #3213 (2.4.0/2.3.10.1)
  • imageio.h:
    • ImageInput and ImageOutput have many new helper methods (protected,
      meant for II and IO subclass implementations to use, not users of these
      classes) for helping to implement IOProxy support in format readers and
      writers. #3203 #3222 (2.4.0)
  • Imath.h:
    • In addition to including the right Imath headers for the version that
      OIIO is built with, this defines custom formatters for the Imath types
      for use with fmt::format/print or Strutil::format/print. #3367 (2.4.1.0)
  • oiioversion.h
    • OIIO_MAKE_VERSION_STRING and OIIO_VERSION_STRING now print all 4
      version parts. #3368 (2.4.1.0)
  • parallel.h
    • Refactoring of the entry points (back compatible for API), and add
      support for using TBB for the thread pool (which seems slightly faster
      than our internal thread pool). By default it still uses the internal
      pool, but if OIIO::attribute("use_tbb") is set to nonzero, it will use
      the TBB thread pool if built against TBB. #3473 (2.4.2.2) #3566
      (2.4.4.0)
  • paramlist.h
    • Various internal fixes that reduce the amount of ustring construction
      that happens when constructing ParamValue and ParamList, and making
      certain ImageSpec::attribute() calls. #3342 (2.4.1.0)
  • simd.h:
    • Better guards to make it safe to include from Cuda. #3291 #3292
      (2.4.0.1/2.3.12)
    • Fix compiler warnings related to discrepancies between template
      declaration and redeclaration in simd.h. #3350 (2.4.1.0/2.3.14)
    • The vector types all now have a size() method giving its length.
      #3367 (2.4.1.0)
    • Defines custom formatters for the vector and matrix types, for use
      with fmt::format/print or Strutil::format/print. #3367 (2.4.1.0)
  • string_view.h
    • Auto-conversion between our string_view, std::string_view (when
      available), and fmt::string_view. #3337 (2.4.1.0)
    • OIIO::string_view is now fully templated, to match std::string_view.
      #3344 (2.4.1.0)
  • strutil.h:
    • New utility functions: parse_values(), scan_values(), scan_datetime()
      #3173 #3177 (2.4.0/2.3.10), edit_distance() #3229 (2.4.0/2.3.11)
    • The utf8_to_utf16() and ut16_to_utf8() utilities are now exposed on
      all platforms, not just windows (and their internals have been
      modernized). #3307 (2.4.0.1)
    • Strutil::isspace() is a safe alternative to C isspace(), that works
      even for signed characters. #3310 (2.4.1.0)
    • Strutil::print() now is buffered (and much more efficient, and
      directly wraps fmt::print). A new Strutil::sync::print() is a version
      that does a flush after every call. #3348 (2.4.1.0)
    • get_rest_arguments() fixes conflict between RESTful and Windows long
      path notations. #3372 (2.4.1.0/2.3.14)
    • Dramatically speed up (50-100x) Strutil iequals, iless, starts_with,
      istarts_with, ends_with, iends_with. #3388 (2.4.1.1)
    • New safe_strcat is a buffer-length-aware safe replcement for strcat.
      #3471 (2.4.0/2.3.18)
    • Strutil::debug() is the new OIIO::debug(), moving it from
      libOpenImageIO to libOpenImageIO_Util. #3486 (2.4.2.1)
    • New Strutil::safe_strlen() is a portable safe strlen replacement.
      #3501 (2.4.2.2)
  • sysutil.h:
    • The Term class now recognizes a wider set of terminal emulators as
      supporting color output. #3185 (2.4.0)
  • timer.h:
    • Timer::add_seconds() and Timer::add_ticks() allows add/subtract
      directly to a timer's elapsed value. #3070 (2.4.0/2.3.8)
    • For Linux, switch from using gettimeofday to clock_gettime, for
      potentially higher resolution. #3443 (2.4.2)
  • typedesc.h:
    • Add Cuda host/device decorations to TypeDesc methods to make them GPU
      friendly. #3188 (2.4.0/2.3.10)
    • TypeDesc constructor from a string now accepts "box2f" and "box3f"
      as synonyms for "box2" and "box3", respectively. #3183 (2.4.0/2.3.10)
  • type_traits.h:
    • This new header contains a variety of type traits used by other OIIO
      headers. They aren't really part of the public API, but they are sometimes
      used by public headers. #3367 (2.4.1.0)
  • unittest.h:
    • Changes OIIO_CHECK_SIMD_EQUAL_THRESH macro to compare <= eps
      instead of <. #3333 (2.4.0.3)
  • unordered_map_concurrent.h: Fix bug in erase() method. #3485 (2.4.2.2)
  • ustring.h:
    • New static method from_hash() creates a ustring from the known hash
      value. #3397 (2.4.2)
    • New ustringhash class is just like a ustring, except that the "local"
      representation is the hash, rather than the unique string pointer. #3436
      (2.4.2)
  • vecparam.h:
    • New V3fParam, M33fParam, and M44fParam (defined in vecparam.h) are
      used just for parameter passing in public APIs, instead of Imath::V3f,
      M33f, or M44f, in order to more fully hide Imath types from our public
      interfaces. These are only parameter-passing classes, and are not useful
      as vector or matrix classes in their own right. But they seamlessly cast
      to and from other vector- and matrix-like classes. #3330 (2.4.1.0)
  • More internals conversion to use the new fmt style for string formatting,
    console output, error messages, and warnings: oiiotool internals #3240
    (2.4.0); TS/IC stats output #3374 (2.4.1.0); misc #3777 (2.4.1.0); testshade
    #3415 (2.4.2)
  • Internals are working toward removing all uses of string_view::c_str(),
    since that isn't part of C++17 std::string_view. #3315 (2.4.0.1)
  • New testtex options: --minthreads sets the minimum numer of threads that
    will be used for thread wedges, --lowtrials is an optional maximum number
    of trials just for the 1 or 2 thread cse. #3418 (2.4.2)
  • Internals: internal classes with vertual methods now mark all their
    overridden destructors correctly as override. #3481 (2.4.2.1) #3488 #3511
    (2.4.2.2)

Build/test system improvements and platform ports:

  • CMake build system and scripts:
    • Remove the old FindOpenImageIO.cmake module; downstream clients should
      instead use our exported configs. #3098 (2.4.0/2.3.8)
    • Fix over-use of targets when we should have been using variables. #3108
      (2.4.0/2.3.9)
    • CMake variable -DENABLE_INSTALL_testtex=1 causes testtex to be
      installed as an application. #3111 (2.4.0)
    • Make OpenImageIO_SUPPORTED_RELEASE into a CMake cache variable so it
      can be overridden at build time. #3142 (2.4.0)
    • New build option -DTIME_COMMANDS=ON will print time to compile each
      module (for investigating build performance; only useful when building
      with CMAKE_BUILD_PARALLEL_LEVEL=1). #3194 (2.4.0/2.3.10)
    • PROJECT_VERSION_RELEASE_TYPE is now a cache variable that can be
      overridden at build time. #3197 (2.4.0/2.3.10)
    • Set and use the variable PROJECT_IS_TOP_LEVEL to know if OIIO is a
      top level project or a subproject. #3197 (2.4.0/2.3.10)
    • Restore code that finds Jasper when using statically-linked libraw.
      #3210 (2.4.0/2.3.10.1)
    • Gracefully handle failing to find git for test data download. #3212
      (2.4.0/2.3.10.1)
    • Make sure to properly use the tbb target if it exists. #3214
      (2.4.0/2.3.10.1)
    • Use a project-specific "OpenImageIO_CI" for whether we're running in CI,
      rather than the confusingly generic "CI" #3211 (2.4.0/2.3.11)
    • If CMake variable BUILD_TESTING is OFF, don't do any automatic
      downloading of missing test data. #3227 (2.3.11/2.4.0)
    • Fixes to FindOpenColorIO.cmake module, now it prefers an OCIO exported
      cmake config (for OCIO 2.1+) unless OPENCOLORIO_NO_CONFIG=ON is set.
      #3278 (2.4.0.1/2.3.12)
    • Fix problems with FindOpenEXR build script for Windows. #3281
      (2.4.0.1/2.3.12)
    • New CMake cache variable DOWNSTREAM_CXX_STANDARD specifies which C++
      standard is the minimum for downstream projects (currently 14), which
      may be less than the CMAKE_CXX_STANDARD that specifies which C++
      standard we are using to build OIIO itself. #3288 (2.4.0.1)
    • The exported cmake configs now use relative paths so they are
      relocatable. #3302 (2.4.0.1)
    • CMake variable OPENIMAGEIO_CONFIG_DO_NOT_FIND_IMATH, if set to ON,
      will make our generated config file not do a find_dependency(Imath).
      (Use with caution.) #3335 (2.4.0.3)
    • Can now do unity/jumbo builds. This isn't helpful when building with
      many cores/threads, but in thread-limited situtations (such as CI), it
      can speed up builds a lot to use -DCMAKE_UNITY_BUILD=ON. #3381 #3389
      #3392 #3393 #3398 #3402 (2.4.2.0)
    • Do not auto-download test images by default. To auto download test
      images, build with -DOIIO_DOWNLOAD_MISSING_TESTDATA=ON. #3409 (2.4.0)
    • Allow using the Makefile wrapper on arm64 systems. #3456 (2.4.2)
    • The export OpenImageIOConfig.cmake fixes OpenImageIO_INCLUDE_DIR to
      work correctly on Debian systems where there are multiple filesystem
      components to the path. #3487 (2.4.2.1)
    • On MacOS, do not force MACOS_RPATH on. #3523 (2.4.2.2)
    • Improvements to the generated cmake config files when building static
      libraries. #3552 #3557 (2.4.4.0)
  • Dependency version support:
    • When using C++17, use std::gcd instead of boost. #3076 (2.4.0)
    • When using C++17, use inline constexpr instead of certain statics.
      #3119 (2.4.0)
    • Fixes to work with the libraw 202110 snapshot. #3143 (2.4.0/2.3.9.1)
    • Fix occasional build breaks related to OpenCV headers. #3135
      (2.4.0/2.3.9)
    • The internals of Filesystem::searchpath_split have been reimplemented
      in such a way as to no longer need boost.tokenzer. #3154 (2.4.0/2.3.10)
    • Deal with the fact that OpenColorIO has changed its default branch
      name to "main". #3169 (2.4.0/2.3.10/2.2.20)
    • pybind11 v2.9.0 incorporated into our testing and CI. #3248
    • Fix clang10 compile warnings. #3272 (2.4.0.1/2.3.12)
    • Support for ffmpeg 5.0. #3282 (2.4.0.2/2.3.13)
    • Support for fmtlib 9.0.0. #3327 (2.4.0.2/2.3.13) #3466 (2.4.2/2.3.18)
    • build_opencolorio.bash helper script bumped its default build of
      OpenColorIO to 2.1.2. #3475 (2.4.2.1)
    • When building with C++17 or higher, Boost.filesystem is no longer
      needed or used. #3472 #3477 (2.4.2.1)
    • Upgrade the internal fallback implemention of PugiXML to the latest
      version. #3494 (2.4.2.2)
    • Fixes for ffmpeg 5.1 detection. #3516 (2.3.19.0/2.4.2.2)
    • Support for gcc 12.1. #3480 (2.4.2.1) #3551 (2.4.4.0)
    • Support building with clang 15.0. #3563 (2.4.4.0)
  • Testing and Continuous integration (CI) systems:
    • Properly test against all the versions of VFX Platform 2022. #3074
      (2.4.0)
    • The helper script build_libtiff.bash now allows you to override the
      build type (by setting LIBTIFF_BUILD_TYPE) and also bumps the default
      libtiff that it downloads and builds from 4.1.0 to 4.3.0. #3161 (2.4.0)
    • New tests on MacOS 11 #3193 (2.4.0/2.3.10) and MacOS 12, remove test on
      MacOS 10.15 (GitHub Actions is imminently removing MacOS 10.15). #3528
      (2.3.19.0/2.4.2.2)
    • Add a DDS test (we never had one before). #3200 (2.4.0/2.3.10)
    • imageinout_test now has options to make it easy to unit test just one
      named format, as well as to preserve the temp files for inspection.
      #3201 (2.4.0/2.3.10)
    • Add an HDR test (we never had one before). #3218 (2.4.0)
    • Fix bugs in the build_opencolorio.bash script, did not correctly handle
      installation into custom directories. #3278 (2.4.0.1/2.3.12)
    • Failed build artifact storage is revised to save more cmake-related
      artifacts to help debugging. #3311 (2.4.0.1)
    • Now doing CI builds for Intel icc and icx compilers. #3355 #3363
      (2.4.1.0/2.3.13) #3407 (2.4.0)
    • Overhaul of ci.yml file to be more clear and compact by using GHA
      "strategy" feature. #3356 #3365 (2.4.1.0/2.3.13)
    • Removed CI for windows-2016 GHA instance which will soon be removed.
      #3370 (2.4.1.0)
    • Test against clang 14. #3404
    • Various guards against supply chain attacks durig CI. #3454 (2.4.2)
    • Test against pybind11 v2.10. #3478 (2.4.2.1)
    • Run SonarCloud nightly for static analysis and coverage analysis. #3505
      (2.4.2.2)
  • Platform support:
    • Fix when building with Clang on big-endian architectures. #3133
      (2.4.0/2.3.9)
    • Improvements to NetBSD and OpenBSD support. #3137. (2.4.0/2.3.9)
    • Fixes for MSVS compile. #3168 (2.4.0/2.3.10)
    • Fix problems on Windows with MSVC for Debug builds, where crashes were
      occurring inside isspace() calls. #3310
    • Improved simd.h support for armv7 and aarch32. #3361 (2.4.1.0/2.3.14)
    • Suppress MacOS wasnings about OpenGL deprecation. #3380 (2.4.1.0/2.3.14)
    • Fix MSVS/Windows errors. #3382 (2.4.1.1)
    • Fix cross-compiling on Android failing due to -latomic check. #3560
      (2.4.4.0)
    • Fix building on iOS. #3562 (2.4.4.0)

Notable documentation changes:

  • Add an oiiotool example of putting a border around an image. #3138
    (2.4.0/2.3.9)
  • Fix explanation of ImageCache "failure_retries" attribute. #3147
    (2.4.0/2.3.9)
  • Improved maketx argument explanations.
  • Clean up intra-document section references. #3238 (2.3.11/2.4.0)
  • New explanations about input and output configuration hints. #3238
    (2.3.11/2.4.0)
  • More code examples in both C++ and Python (especially for the ImageInput,
    ImageOutput, and ImageBufAlgo chapters). #3238 #3244 #3250 (2.3.11/2.4.0)
    #3263 (2.3.12/2.4.0)
  • Pretty much anyplace where a parameter that represents a filename, and it is
    supporting UTF-8 encoding of Unicode filenames, the docs for that function
    explicitly say that the string is assumed to be UTF-8. #3312 (2.4.0.1)
  • Fix many typos in docs. #3492 (2.4.2.2)