From 18c452a2a67534f3d0f2ea1d079f148eb816ce2f Mon Sep 17 00:00:00 2001 From: castano Date: Tue, 6 Nov 2007 09:51:53 +0000 Subject: [PATCH] Add support for EXR files --- cmake/FindOpenEXR.cmake | 8 +++++--- src/nvimage/ImageIO.cpp | 37 +++++++++++++++++++++---------------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/cmake/FindOpenEXR.cmake b/cmake/FindOpenEXR.cmake index 2ec1896..f6bbeda 100644 --- a/cmake/FindOpenEXR.cmake +++ b/cmake/FindOpenEXR.cmake @@ -13,7 +13,9 @@ ELSE (WIN32) FIND_PATH(OPENEXR_INCLUDE_PATH ImfRgbaFile.h /usr/include - /usr/local/include) + /usr/local/include + /usr/include/OpenEXR + /usr/local/include/OpenEXR) FIND_LIBRARY(OPENEXR_HALF_LIBRARY NAMES Half @@ -41,10 +43,10 @@ ELSE (WIN32) ENDIF (WIN32) -IF (OPENEXR_INCLUDE_DIR AND OPENEXR_IMATH_LIBRARY AND OPENEXR_ILMIMF_LIBRARY AND OPENEXR_IEX_LIBRARY AND OPENEXR_HALF_LIBRARY) +IF (OPENEXR_INCLUDE_PATH AND OPENEXR_IMATH_LIBRARY AND OPENEXR_ILMIMF_LIBRARY AND OPENEXR_IEX_LIBRARY AND OPENEXR_HALF_LIBRARY) SET(OPENEXR_FOUND TRUE) SET(OPENEXR_LIBRARIES ${OPENEXR_IMATH_LIBRARY} ${OPENEXR_ILMIMF_LIBRARY} ${OPENEXR_IEX_LIBRARY} ${OPENEXR_HALF_LIBRARY} CACHE STRING "The libraries needed to use OpenEXR") -ENDIF (OPENEXR_INCLUDE_DIR AND OPENEXR_IMATH_LIBRARY AND OPENEXR_ILMIMF_LIBRARY AND OPENEXR_IEX_LIBRARY AND OPENEXR_HALF_LIBRARY) +ENDIF (OPENEXR_INCLUDE_PATH AND OPENEXR_IMATH_LIBRARY AND OPENEXR_ILMIMF_LIBRARY AND OPENEXR_IEX_LIBRARY AND OPENEXR_HALF_LIBRARY) MARK_AS_ADVANCED( OPENEXR_INCLUDE_DIR diff --git a/src/nvimage/ImageIO.cpp b/src/nvimage/ImageIO.cpp index f4bbbd5..99b53f0 100644 --- a/src/nvimage/ImageIO.cpp +++ b/src/nvimage/ImageIO.cpp @@ -1019,26 +1019,31 @@ FloatImage * nv::ImageIO::loadFloatEXR(const char * fileName, Stream & s) int width = box.max.x - box.min.y + 1; int height = box.max.x - box.min.y + 1; - Array2D pixels; - pixels.resizeErase (height, width); - - inputFile.setFrameBuffer (&pixels[0][0] - dw.min.x - dw.min.y * width, 1, width); - inputFile.readPixels (box.min.y, box.max.y); + const Imf::ChannelList & channels = inputFile.header().channels(); + // Count channels. + uint channelCount= 0; + for (ChannelList::ConstIterator it = channels.begin(); it != channels.end(); ++it) + { + channelCount++; + } + + // Allocate FloatImage. AutoPtr fimage(new FloatImage()); - fimage->allocate(spp, width, height); - - for (int y = 0; y < height; y++) + fimage->allocate(channelCount, width, height); + + // Describe image's layout with a framebuffer. + FrameBuffer frameBuffer; + uint i = 0; + for (ChannelList::ConstIterator it = channels.begin(); it != channels.end(); ++it, ++i) { - for (int x = 0; x < width; x++) - { - fimage->setPixel(imagePixel.r, x, y, 0); - fimage->setPixel(imagePixel.g, x, y, 1); - fimage->setPixel(imagePixel.b, x, y, 2); - fimage->setPixel(imagePixel.a, x, y, 3); - } + frameBuffer.insert(it.name(), Slice(FLOAT, fimage->channel(i), sizeof(float), sizeof(float) * width)); } - + + // Read it. + inputFile.setFrameBuffer (frameBuffer); + inputFile.readPixels (box.min.y, box.max.y); + return fimage.release(); }