diff --git a/src/doc/builtinplugins.rst b/src/doc/builtinplugins.rst index d5d84aef52..b9c55b511b 100644 --- a/src/doc/builtinplugins.rst +++ b/src/doc/builtinplugins.rst @@ -1964,7 +1964,7 @@ Lab or duotone modes. **Custom I/O Overrides** -PSD output supports the "custom I/O" feature via the special ``"oiio:ioproxy"`` +PSD input supports the "custom I/O" feature via the special ``"oiio:ioproxy"`` attributes (see Sections :ref:`sec-imageoutput-ioproxy` and :ref:`sec-imageinput-ioproxy`) as well as the `set_ioproxy()` methods. diff --git a/src/psd.imageio/psdinput.cpp b/src/psd.imageio/psdinput.cpp index e3972d087f..fd472385bb 100644 --- a/src/psd.imageio/psdinput.cpp +++ b/src/psd.imageio/psdinput.cpp @@ -1890,6 +1890,8 @@ PSDInput::load_image_data() // setup some generic properties and read any RLE lengths // Image Data Section has RLE lengths for all channels stored first for (ChannelInfo& channel_info : m_image_data.channel_info) { + channel_info.width = m_header.width; + channel_info.height = m_header.height; channel_info.compression = compression; channel_info.channel_id = id++; channel_info.data_length = row_length * m_header.height; @@ -2045,39 +2047,39 @@ PSDInput::read_channel_row(ChannelInfo& channel_info, uint32_t row, char* data) case 16: swap_endian((uint16_t*)data, channel_info.width); break; case 32: swap_endian((uint32_t*)data, channel_info.width); break; } - break; - case Compression_RLE: { - if (!ioseek(channel_info.row_pos[row])) - return false; - uint32_t rle_length = channel_info.rle_lengths[row]; - char* rle_buffer; - OIIO_ALLOCATE_STACK_OR_HEAP(rle_buffer, char, rle_length); - if (!ioread(rle_buffer, rle_length) - || !decompress_packbits(rle_buffer, data, rle_length, - channel_info.row_length)) - return false; - } break; - case Compression_ZIP: { - OIIO_ASSERT(channel_info.decompressed_data.size() - == static_cast(channel_info.width) - * channel_info.height * (m_header.depth / 8)); - // We simply copy over the row into destination - uint64_t row_index = static_cast(row) * channel_info.width - * (m_header.depth / 8); - std::memcpy(data, channel_info.decompressed_data.data() + row_index, - channel_info.row_length); - } break; - case Compression_ZIP_Predict: { - OIIO_ASSERT(channel_info.decompressed_data.size() - == static_cast(channel_info.width) - * channel_info.height * (m_header.depth / 8)); - // We simply copy over the row into destination - uint64_t row_index = static_cast(row) * channel_info.width - * (m_header.depth / 8); - std::memcpy(data, channel_info.decompressed_data.data() + row_index, - channel_info.row_length); - } break; } + break; + case Compression_RLE: { + if (!ioseek(channel_info.row_pos[row])) + return false; + uint32_t rle_length = channel_info.rle_lengths[row]; + char* rle_buffer; + OIIO_ALLOCATE_STACK_OR_HEAP(rle_buffer, char, rle_length); + if (!ioread(rle_buffer, rle_length) + || !decompress_packbits(rle_buffer, data, rle_length, + channel_info.row_length)) + return false; + } break; + case Compression_ZIP: { + OIIO_ASSERT(channel_info.decompressed_data.size() + == static_cast(channel_info.width) + * channel_info.height * (m_header.depth / 8)); + // We simply copy over the row into destination + uint64_t row_index = static_cast(row) * channel_info.width + * (m_header.depth / 8); + std::memcpy(data, channel_info.decompressed_data.data() + row_index, + channel_info.row_length); + } break; + case Compression_ZIP_Predict: { + OIIO_ASSERT(channel_info.decompressed_data.size() + == static_cast(channel_info.width) + * channel_info.height * (m_header.depth / 8)); + // We simply copy over the row into destination + uint64_t row_index = static_cast(row) * channel_info.width + * (m_header.depth / 8); + std::memcpy(data, channel_info.decompressed_data.data() + row_index, + channel_info.row_length); + } break; } return true; diff --git a/testsuite/psd-colormodes/ref/out.txt b/testsuite/psd-colormodes/ref/out.txt index b521061822..0cc89d8f3b 100644 --- a/testsuite/psd-colormodes/ref/out.txt +++ b/testsuite/psd-colormodes/ref/out.txt @@ -22,7 +22,7 @@ Comparing "pattern2-8-rgb.psd.tif" and "ref/pattern2.tif" PASS Comparing "pattern2-16-rgb.psd.tif" and "ref/pattern2.tif" PASS -Comparing "pattern2-8-cmyk.psd.tif" and "ref/pattern2-cmyk.tif" +Comparing "pattern2-8-cmyk.psd.tif" and "ref/pattern2-8-cmyk.psd.tif" PASS Comparing "pattern2-16-cmyk.psd.tif" and "ref/pattern2-16-cmyk.psd.tif" PASS @@ -30,7 +30,7 @@ Comparing "pattern2-8-multichannel.psd.tif" and "ref/pattern2.tif" PASS Comparing "pattern2-16-multichannel.psd.tif" and "ref/pattern2.tif" PASS -Comparing "pattern2-8-grayscale.psd.tif" and "ref/pattern2-gray.tif" +Comparing "pattern2-8-grayscale.psd.tif" and "ref/pattern2-8-grayscale.psd.tif" PASS Comparing "pattern2-16-grayscale.psd.tif" and "ref/pattern2-16-grayscale.psd.tif" PASS diff --git a/testsuite/psd-colormodes/ref/pattern2-16-cmyk.psd.tif b/testsuite/psd-colormodes/ref/pattern2-16-cmyk.psd.tif index d01cca324e..f6e8c9f458 100644 Binary files a/testsuite/psd-colormodes/ref/pattern2-16-cmyk.psd.tif and b/testsuite/psd-colormodes/ref/pattern2-16-cmyk.psd.tif differ diff --git a/testsuite/psd-colormodes/ref/pattern2-16-grayscale.psd.tif b/testsuite/psd-colormodes/ref/pattern2-16-grayscale.psd.tif index db88e52ad2..1943c31f05 100644 Binary files a/testsuite/psd-colormodes/ref/pattern2-16-grayscale.psd.tif and b/testsuite/psd-colormodes/ref/pattern2-16-grayscale.psd.tif differ diff --git a/testsuite/psd-colormodes/ref/pattern2-cmyk.tif b/testsuite/psd-colormodes/ref/pattern2-8-cmyk.psd.tif similarity index 100% rename from testsuite/psd-colormodes/ref/pattern2-cmyk.tif rename to testsuite/psd-colormodes/ref/pattern2-8-cmyk.psd.tif diff --git a/testsuite/psd-colormodes/ref/pattern2-gray.tif b/testsuite/psd-colormodes/ref/pattern2-8-grayscale.psd.tif similarity index 100% rename from testsuite/psd-colormodes/ref/pattern2-gray.tif rename to testsuite/psd-colormodes/ref/pattern2-8-grayscale.psd.tif diff --git a/testsuite/psd/ref/out.txt b/testsuite/psd/ref/out.txt index 7c0319d6a0..047d6a6281 100644 --- a/testsuite/psd/ref/out.txt +++ b/testsuite/psd/ref/out.txt @@ -584,7 +584,7 @@ Reading ../oiio-images/psd_rgb_8.psd stRef:originalDocumentID: "E146B3E37A92795EE3EA6577040DE6D5" Reading ../oiio-images/psd_rgb_16.psd ../oiio-images/psd_rgb_16.psd : 320 x 240, 3 channel, uint16 psd - SHA-1: 591F6850EB0B548DF2CE7177661440CB812E5C31 + SHA-1: E42334B0F0684E3C3BF9125F2920B07C44C17B11 channel list: R, G, B Artist: "Daniel Wyatt" DateTime: "2007-01-18T15:49:21" @@ -655,7 +655,7 @@ Reading ../oiio-images/psd_rgb_16.psd stRef:originalDocumentID: "E146B3E37A92795EE3EA6577040DE6D5" Reading ../oiio-images/psd_rgb_32.psd ../oiio-images/psd_rgb_32.psd : 320 x 240, 3 channel, float psd - SHA-1: B7F8CE4B4259A92AA13333EA8112C3E37C6BAB39 + SHA-1: 63CF8F7B010D24EFD3C41F51C16D8D285FE07313 channel list: R, G, B Artist: "Daniel Wyatt" DateTime: "2007-01-18T15:49:21" @@ -1459,7 +1459,7 @@ Reading src/Layers_16bit_RGB.psd src/Layers_16bit_RGB.psd : 48 x 27, 3 channel, uint16 psd 4 subimages: 48x27 [u16,u16,u16], 48x27 [u16,u16,u16,u16], 48x27 [u16,u16,u16,u16], 48x27 [u16,u16,u16,u16] subimage 0: 48 x 27, 3 channel, uint16 psd - SHA-1: 22EAC1FF517BCCEA8EBA31AB240C11518EE42424 + SHA-1: 0228B2F3AA493695E9653E1C32D303022DDEFAE4 channel list: R, G, B DateTime: "2024-03-06T15:22:40+01:00" ICCProfile: 0, 0, 12, 72, 76, 105, 110, 111, 2, 16, 0, 0, 109, 110, 116, 114, ... [3144 x uint8] @@ -1653,7 +1653,7 @@ Reading src/Layers_32bit_RGB.psd src/Layers_32bit_RGB.psd : 48 x 27, 3 channel, float psd 4 subimages: 48x27 [f,f,f], 48x27 [f,f,f,f], 48x27 [f,f,f,f], 48x27 [f,f,f,f] subimage 0: 48 x 27, 3 channel, float psd - SHA-1: 90D05324071E32026D22E44FA9EF027C80D97308 + SHA-1: C9C84C45C64884BD4D6F1B1E91CCA6744EA3C06C channel list: R, G, B DateTime: "2024-03-06T15:22:40+01:00" ICCProfile: 0, 0, 2, 56, 108, 99, 109, 115, 4, 48, 0, 0, 109, 110, 116, 114, ... [568 x uint8]