From 467af80cb3bbb986444aaa289a49053c7a9f938e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Mon, 5 Jun 2023 12:19:58 +0200 Subject: [PATCH] Fix reading ICCprofile --- CMakeLists.txt | 4 +++- libxisf.cpp | 30 ++++++++++++++++-------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 29f31ab..5c37749 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.14) -project(libXISF VERSION 0.2.6 LANGUAGES CXX C +project(libXISF VERSION 0.2.7 LANGUAGES CXX C HOMEPAGE_URL https://gitea.nouspiro.space/nou/libXISF DESCRIPTION "LibXISF is C++ library that can read and write XISF files produced by PixInsight.") @@ -92,6 +92,8 @@ else(USE_BUNDLED_LIBS) list(APPEND PC_LIBS_REQUIRE lz4 pugixml zlib) endif(USE_BUNDLED_LIBS) +target_link_libraries(XISF PUBLIC zstd) + set_target_properties(XISF PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) if(BUILD_SHARED_LIBS) diff --git a/libxisf.cpp b/libxisf.cpp index 2293a20..249fc36 100644 --- a/libxisf.cpp +++ b/libxisf.cpp @@ -541,6 +541,7 @@ private: FITSKeyword parseFITSKeyword(const pugi::xml_node &node); ColorFilterArray parseCFA(const pugi::xml_node &node); Image parseImage(const pugi::xml_node &node); + void readAttachment(DataBlock &dataBlock); std::unique_ptr _io; std::unique_ptr _buffer; @@ -595,10 +596,7 @@ const Image& XISFReaderPrivate::getImage(uint32_t n, bool readPixels) Image &img = _images[n]; if(img._dataBlock.attachmentPos && readPixels) { - _io->seekg(img._dataBlock.attachmentPos); - ByteArray data(img._dataBlock.attachmentSize); - _io->read(data.data(), data.size()); - img._dataBlock.decompress(data); + readAttachment(img._dataBlock); } return img; } @@ -734,16 +732,9 @@ Property XISFReaderPrivate::parseProperty(const pugi::xml_node &node) { DataBlock dataBlock = parseDataBlock(node); if(dataBlock.attachmentPos) - { - data.resize(dataBlock.attachmentSize); - _io->seekg(dataBlock.attachmentPos); - _io->read(data.data(), dataBlock.attachmentSize); - dataBlock.decompress(data); - } - else - { - data = dataBlock.data; - } + readAttachment(dataBlock); + + data = dataBlock.data; } deserializeVariant(node, property.value, data); @@ -812,6 +803,9 @@ Image XISFReaderPrivate::parseImage(const pugi::xml_node &node) if(node.child("ICCProfile")) { DataBlock icc = parseDataBlock(node.child("ICCProfile")); + if(icc.attachmentPos) + readAttachment(icc); + image._iccProfile = icc.data; } @@ -821,6 +815,14 @@ Image XISFReaderPrivate::parseImage(const pugi::xml_node &node) return image; } +void XISFReaderPrivate::readAttachment(DataBlock &dataBlock) +{ + ByteArray data(dataBlock.attachmentSize); + _io->seekg(dataBlock.attachmentPos); + _io->read(data.data(), dataBlock.attachmentSize); + dataBlock.decompress(data); +} + class XISFWriterPrivate { public: