From 45018e421651afdc3c35a175a1ba027c7f1c5c61 Mon Sep 17 00:00:00 2001 From: John Haddon Date: Fri, 9 May 2025 09:47:30 +0100 Subject: [PATCH 1/4] ImageReader : Remove unused member data --- src/IECoreImage/ImageReader.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/IECoreImage/ImageReader.cpp b/src/IECoreImage/ImageReader.cpp index 1e2419f2d5..53939d468a 100644 --- a/src/IECoreImage/ImageReader.cpp +++ b/src/IECoreImage/ImageReader.cpp @@ -453,16 +453,6 @@ class ImageReader::Implementation { m_inputFileName = m_reader->fileName(); - // Store the miplevels that the file natively supports. We do - // this as OIIO returns a different value once automip is turned - // on. - m_cache->get_image_info( - m_inputFileName, - 0, 0, // subimage, miplevel - ustring( "miplevels" ), - TypeDesc::TypeInt, &m_miplevels - ); - // Get the fileFormat and store the current and linear color spaces // We do this so we can perform color conversion on the image after // loading the data. @@ -522,7 +512,6 @@ class ImageReader::Implementation ustring m_inputFileName; std::string m_currentColorSpace; std::string m_linearColorSpace; - int m_miplevels; }; From f91a37b718c2fdb677a047134988deda658a03a6 Mon Sep 17 00:00:00 2001 From: John Haddon Date: Fri, 9 May 2025 10:20:07 +0100 Subject: [PATCH 2/4] IECoreImage : Adapt for OIIO 3.0 TypeDesc changes The type aliases nested in the TypeDesc class have been removed. Both OIIO 2 and 3 have namespace-level equivalents, so the new code will compile with both. --- src/IECoreImage/ImageReader.cpp | 2 +- src/IECoreImage/OpenImageIOAlgo.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/IECoreImage/ImageReader.cpp b/src/IECoreImage/ImageReader.cpp index 53939d468a..913733b0d8 100644 --- a/src/IECoreImage/ImageReader.cpp +++ b/src/IECoreImage/ImageReader.cpp @@ -461,7 +461,7 @@ class ImageReader::Implementation m_inputFileName, 0, miplevel(), // subimage, miplevel ustring( "fileformat" ), - TypeDesc::TypeString, &fileFormat + OIIO::TypeString, &fileFormat ); if( strcmp( fileFormat, "png" ) == 0 ) diff --git a/src/IECoreImage/OpenImageIOAlgo.cpp b/src/IECoreImage/OpenImageIOAlgo.cpp index 0d51eb338d..2783ce2608 100644 --- a/src/IECoreImage/OpenImageIOAlgo.cpp +++ b/src/IECoreImage/OpenImageIOAlgo.cpp @@ -318,7 +318,7 @@ DataView::DataView( const IECore::Data *d, bool createUStrings ) data = static_cast( d )->baseReadable(); break; case StringDataTypeId : - type = TypeDesc::TypeString; + type = OIIO::TypeString; m_charPointers.resize(1); m_charPointers[0] = static_cast( d )->readable().c_str(); if( createUStrings ) @@ -344,7 +344,7 @@ DataView::DataView( const IECore::Data *d, bool createUStrings ) data = static_cast( d )->baseReadable(); break; case IntDataTypeId : - type = TypeDesc::TypeInt; + type = OIIO::TypeInt; data = static_cast( d )->baseReadable(); break; case UInt64DataTypeId : @@ -356,7 +356,7 @@ DataView::DataView( const IECore::Data *d, bool createUStrings ) data = static_cast( d )->baseReadable(); break; case FloatDataTypeId : - type = TypeDesc::TypeFloat; + type = OIIO::TypeFloat; data = static_cast( d )->baseReadable(); break; case DoubleDataTypeId : @@ -420,7 +420,7 @@ DataView::DataView( const IECore::Data *d, bool createUStrings ) data = static_cast( d )->baseReadable(); break; case Color3fDataTypeId : - type = TypeDesc::TypeColor; + type = OIIO::TypeColor; data = static_cast( d )->baseReadable(); break; case Color4fDataTypeId : @@ -428,7 +428,7 @@ DataView::DataView( const IECore::Data *d, bool createUStrings ) data = static_cast( d )->baseReadable(); break; case TimeCodeDataTypeId : - type = TypeDesc::TypeTimeCode; + type = OIIO::TypeTimeCode; data = static_cast( d )->baseReadable(); break; From 235be5776e58b292e3ab8b99026f3f677a538993 Mon Sep 17 00:00:00 2001 From: John Haddon Date: Fri, 9 May 2025 10:23:28 +0100 Subject: [PATCH 3/4] IECoreImage/GL : Adapt to OIIO 3 ImageCache changes There are two changes that affect us : - `ImageCache::create()` now returns a `shared_ptr`. - `ImageCache::imagespec()` completely ignores the `miplevel` parameter, and we have to use `get_cache_dimensions()` instead. --- src/IECoreGL/TextureLoader.cpp | 22 +++++++++++++++++++- src/IECoreImage/ImageReader.cpp | 37 +++++++++++++++++++++++---------- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/IECoreGL/TextureLoader.cpp b/src/IECoreGL/TextureLoader.cpp index 322490c39d..2f6ed800c4 100644 --- a/src/IECoreGL/TextureLoader.cpp +++ b/src/IECoreGL/TextureLoader.cpp @@ -56,6 +56,8 @@ using namespace IECoreGL; +#if OIIO_VERSION < 30000 + namespace{ void destroyImageCache( OIIO::ImageCache *cache ) { @@ -63,6 +65,8 @@ namespace{ } } +#endif + TextureLoader::TextureLoader( const IECore::SearchPath &searchPaths ) : m_searchPaths( searchPaths ) { @@ -92,7 +96,12 @@ TexturePtr TextureLoader::load( const std::string &name, int maximumResolution ) // doesn't have mipmaps on disk ... but I'm keeping this consistent for now. // To set automip, we need to create an ImageCache - currently I just destroy it when this function exits: // we cache the GL texture ourselves, so dropping the OIIO cache should be OK. +#if OIIO_VERSION >= 30000 + std::shared_ptr imageCache = OIIO::ImageCache::create( /* shared */ false ); +#else std::unique_ptr imageCache( OIIO::ImageCache::create( /* shared */ false ), &destroyImageCache ); +#endif + imageCache->attribute( "automip", 1 ); OIIO::ImageSpec mipSpec; @@ -109,14 +118,25 @@ TexturePtr TextureLoader::load( const std::string &name, int maximumResolution ) { while( std::max( mipSpec.full_width, mipSpec.full_height ) > maximumResolution && +#if OIIO_VERSION >= 30000 + imageCache->get_cache_dimensions( oiioPath, mipSpec, 0, miplevel + 1 ) +#else imageCache->get_imagespec( oiioPath, mipSpec, 0, miplevel + 1 ) +#endif ) { miplevel++; } } - OIIO::ImageBuf imageBuf( oiioPath, 0, miplevel, imageCache.get() ); + OIIO::ImageBuf imageBuf( + oiioPath, 0, miplevel, +#if OIIO_VERSION >= 30000 + imageCache +#else + imageCache.get() +#endif + ); if( imageBuf.spec().full_x != 0 || imageBuf.spec().full_y != 0 ) { IECore::msg( IECore::Msg::Error, "IECoreGL::TextureLoader::load", boost::format( "Texture display window must start at origin for \"%s\"." ) % path.string() ); diff --git a/src/IECoreImage/ImageReader.cpp b/src/IECoreImage/ImageReader.cpp index 913733b0d8..d4cf5f1ef1 100644 --- a/src/IECoreImage/ImageReader.cpp +++ b/src/IECoreImage/ImageReader.cpp @@ -118,7 +118,7 @@ class ImageReader::Implementation public : - Implementation( const ImageReader *reader ) : m_reader( reader ), m_cache( nullptr, &destroyImageCache ) + Implementation( const ImageReader *reader ) : m_reader( reader ) { } @@ -251,11 +251,17 @@ class ImageReader::Implementation Imath::Box2i dataWindow() { open( /* throwOnFailure */ true ); - const ImageSpec *spec = m_cache->imagespec( m_inputFileName, /* subimage = */ 0, miplevel() ); + + ImageSpec spec; +#if OIIO_VERSION >= 30000 + m_cache->get_cache_dimensions( m_inputFileName, spec, /* subimage = */ 0, miplevel() ); +#else + spec = *m_cache->imagespec( m_inputFileName, /* subimage = */ 0, miplevel() ); +#endif return Imath::Box2i( - Imath::V2i( spec->x, spec->y ), - Imath::V2i( spec->width + spec->x - 1, spec->height + spec->y - 1 ) + Imath::V2i( spec.x, spec.y ), + Imath::V2i( spec.width + spec.x - 1, spec.height + spec.y - 1 ) ); } @@ -263,11 +269,15 @@ class ImageReader::Implementation { open( /* throwOnFailure */ true ); - const ImageSpec *spec = m_cache->imagespec( m_inputFileName, /* subimage = */ 0, miplevel() ); - + ImageSpec spec; +#if OIIO_VERSION >= 30000 + m_cache->get_cache_dimensions( m_inputFileName, spec, /* subimage = */ 0, miplevel() ); +#else + spec = *m_cache->imagespec( m_inputFileName, /* subimage = */ 0, miplevel() ); +#endif return Imath::Box2i( - Imath::V2i( spec->full_x, spec->full_y ), - Imath::V2i( spec->full_x + spec->full_width - 1, spec->full_y + spec->full_height - 1 ) + Imath::V2i( spec.full_x, spec.full_y ), + Imath::V2i( spec.full_x + spec.full_width - 1, spec.full_y + spec.full_height - 1 ) ); } @@ -441,8 +451,11 @@ class ImageReader::Implementation } m_inputFileName = ""; - m_cache.reset( ImageCache::create( /* shared */ false ) ); - +#if OIIO_VERSION >= 30000 + m_cache = ImageCache::create( /* shared */ false ); +#else + m_cache.reset( ImageCache::create( /* shared */ false ), destroyImageCache ); +#endif // Autompip ensures that if a miplevel is requested that the file // doesn't contain, OIIO creates the respective level on the fly. m_cache->attribute( "automip", 1 ); @@ -502,13 +515,15 @@ class ImageReader::Implementation return p->getNumericValue(); } +#if OIIO_VERSION < 30000 static void destroyImageCache( ImageCache *cache ) { ImageCache::destroy( cache, /* teardown */ true ); } +#endif const ImageReader *m_reader; - std::unique_ptr m_cache; + std::shared_ptr m_cache; ustring m_inputFileName; std::string m_currentColorSpace; std::string m_linearColorSpace; From 90661f3864ab4f6d6b2597faed2d413a66bd969a Mon Sep 17 00:00:00 2001 From: John Haddon Date: Fri, 9 May 2025 10:25:12 +0100 Subject: [PATCH 4/4] IECoreImageTest : Adapt for OIIO 3 metadata changes --- test/IECoreImage/ImageReaderTest.py | 5 ++++- test/IECoreImage/ImageWriterTest.py | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/test/IECoreImage/ImageReaderTest.py b/test/IECoreImage/ImageReaderTest.py index 199d780397..5d7b2406a5 100644 --- a/test/IECoreImage/ImageReaderTest.py +++ b/test/IECoreImage/ImageReaderTest.py @@ -218,7 +218,7 @@ def testHeaderToBlindData( self ) : dictHeader = { 'channelNames': IECore.StringVectorData( [ "R", "G", "B" ] ), - 'oiio:ColorSpace': IECore.StringData( "Linear" ), + 'oiio:ColorSpace': IECore.StringData( "lin_rec709" if IECoreImage.OpenImageIOAlgo.version() >= 30000 else "Linear" ), 'compression': IECore.StringData( "piz" ), 'screenWindowCenter': IECore.V2fData( imath.V2f(0,0) ), 'displayWindow': IECore.Box2iData( imath.Box2i( imath.V2i(0,0), imath.V2i(511,255) ) ), @@ -229,6 +229,9 @@ def testHeaderToBlindData( self ) : } if IECoreImage.OpenImageIOAlgo.version() >= 20206 : dictHeader['oiio:subimages'] = IECore.IntData( 1 ) + if IECoreImage.OpenImageIOAlgo.version() >= 30000 : + dictHeader["openexr:lineOrder"] = IECore.StringData( "increasingY" ) + dictHeader["screenWindowCenter"] = IECore.V2fData( imath.V2f( 0 ) ) r = IECore.Reader.create( os.path.join( "test", "IECoreImage", "data", "exr", "uvMap.512x256.exr" ) ) header = r.readHeader() diff --git a/test/IECoreImage/ImageWriterTest.py b/test/IECoreImage/ImageWriterTest.py index f185cb3e30..9de316e043 100644 --- a/test/IECoreImage/ImageWriterTest.py +++ b/test/IECoreImage/ImageWriterTest.py @@ -418,6 +418,8 @@ def testBlindDataToHeader( self ) : del imgBlindData['oiio:ColorSpace'] if IECoreImage.OpenImageIOAlgo.version() >= 20206 : del imgBlindData['oiio:subimages'] + if IECoreImage.OpenImageIOAlgo.version() >= 30000 : + del imgBlindData["openexr:lineOrder"] del imgBlindData['compression'] del imgBlindData['PixelAspectRatio'] del imgBlindData['displayWindow']