Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libXISF for openSUSE:Factory checked in at 2023-05-25 23:52:26 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libXISF (Old) and /work/SRC/openSUSE:Factory/.libXISF.new.1533 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libXISF" Thu May 25 23:52:26 2023 rev:4 rq:1088998 version:0.2.5 Changes: -------- --- /work/SRC/openSUSE:Factory/libXISF/libXISF.changes 2023-04-12 12:52:24.441214948 +0200 +++ /work/SRC/openSUSE:Factory/.libXISF.new.1533/libXISF.changes 2023-05-25 23:52:38.663648911 +0200 @@ -1,0 +2,9 @@ +Thu May 25 06:44:00 UTC 2023 - Paolo Stivanin <i...@paolostivanin.com> + +- Update to 0.2.5: + * Add method to for ICC profile + * Add StreamBuffer to optimize save/load from memory + * Add support for thumbnail +- Add fix-pkgconfig.patch + +------------------------------------------------------------------- Old: ---- libXISF-0.2.3.tar.gz New: ---- fix-pkgconfig.patch libXISF-0.2.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libXISF.spec ++++++ --- /var/tmp/diff_new_pack.DxAAYu/_old 2023-05-25 23:52:39.127651635 +0200 +++ /var/tmp/diff_new_pack.DxAAYu/_new 2023-05-25 23:52:39.135651682 +0200 @@ -18,14 +18,17 @@ %define sover 0 Name: libXISF -Version: 0.2.3 +Version: 0.2.5 Release: 0 Summary: Library to read/write PixInsight XISF files License: GPL-3.0-or-later URL: https://gitea.nouspiro.space/nou/libXISF Source: https://gitea.nouspiro.space/nou/libXISF/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz +# PATCH-FIX-UPSTREAM +Patch0: fix-pkgconfig.patch BuildRequires: cmake BuildRequires: liblz4-devel +BuildRequires: pkg-config BuildRequires: pugixml-devel BuildRequires: zlib-devel BuildRequires: cmake(Qt5Core) >= 5.14.0 @@ -83,5 +86,6 @@ %{_includedir}/libXISF_global.h %{_includedir}/libxisf.h %{_libdir}/libXISF.so +%{_libdir}/pkgconfig/libxisf.pc %changelog ++++++ fix-pkgconfig.patch ++++++ --- libxisf/libxisf.pc.in.orig 2023-05-25 11:33:46.092163914 +0200 +++ libxisf/libxisf.pc.in 2023-05-25 11:38:50.753870840 +0200 @@ -7,7 +7,5 @@ Description: @CMAKE_PROJECT_DESCRIPTION@ URL: @CMAKE_PROJECT_HOMEPAGE_URL@ Version: @PROJECT_VERSION@ -Requires.private: @PC_LIBS_REQUIRE@ Cflags: -I"${includedir}" Libs: -L"${libdir}" -lXISF -Libs.private: -L"${libdir}" @PC_LIBS_REQUIRE@ ++++++ libXISF-0.2.3.tar.gz -> libXISF-0.2.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxisf/CMakeLists.txt new/libxisf/CMakeLists.txt --- old/libxisf/CMakeLists.txt 2023-04-11 12:25:14.000000000 +0200 +++ new/libxisf/CMakeLists.txt 2023-05-24 16:28:11.000000000 +0200 @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 3.14) -project(libXISF VERSION 0.2.3 LANGUAGES CXX C) +project(libXISF VERSION 0.2.5 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.") include(CMakeDependentOption) @@ -16,7 +18,7 @@ cmake_dependent_option(USE_BUNDLED_PUGIXML "Use bundled PugiXML" ON "USE_BUNDLED_LIBS" OFF) cmake_dependent_option(USE_BUNDLED_ZLIB "Use bundled Zlib" ON "USE_BUNDLED_LIBS" OFF) -find_package(PkgConfig REQUIRED) +find_package(PkgConfig) if(USE_BUNDLED_LZ4) list(APPEND THIRD_PARTY_SRC @@ -64,6 +66,8 @@ libXISF_global.h libxisf.cpp libxisf.h + streambuffer.cpp + streambuffer.h utils.cpp variant.cpp ${THIRD_PARTY_SRC} @@ -73,15 +77,19 @@ target_include_directories(XISF PRIVATE ${THIRD_PARTY_INCLUDE}) if(NOT USE_BUNDLED_LZ4) target_link_libraries(XISF PUBLIC PkgConfig::LZ4) + list(APPEND PC_LIBS_REQUIRE lz4) endif(NOT USE_BUNDLED_LZ4) if(NOT USE_BUNDLED_PUGIXML) target_link_libraries(XISF PUBLIC PkgConfig::PUGIXML) + list(APPEND PC_LIBS_REQUIRE pugixml) endif(NOT USE_BUNDLED_PUGIXML) if(NOT USE_BUNDLED_ZLIB) target_link_libraries(XISF PUBLIC PkgConfig::ZLIB) + list(APPEND PC_LIBS_REQUIRE zlib) endif(NOT USE_BUNDLED_ZLIB) else(USE_BUNDLED_LIBS) target_link_libraries(XISF PUBLIC PkgConfig::LZ4 PkgConfig::PUGIXML PkgConfig::ZLIB) + list(APPEND PC_LIBS_REQUIRE lz4 pugixml zlib) endif(USE_BUNDLED_LIBS) set_target_properties(XISF PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) @@ -97,8 +105,11 @@ include(GNUInstallDirs) install(FILES ${XISF_PUBLIC_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libxisf.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) install(TARGETS XISF LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) +configure_file(libxisf.pc.in libxisf.pc @ONLY) + #testing enable_testing() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxisf/libxisf.cpp new/libxisf/libxisf.cpp --- old/libxisf/libxisf.cpp 2023-04-11 12:25:14.000000000 +0200 +++ new/libxisf/libxisf.cpp 2023-05-24 16:28:11.000000000 +0200 @@ -27,6 +27,7 @@ #include <lz4hc.h> #include <pugixml.hpp> #include <zlib.h> +#include "streambuffer.h" namespace LibXISF { @@ -357,6 +358,16 @@ return false; } +const ByteArray &Image::iccProfile() const +{ + return _iccProfile; +} + +void Image::setIccProfile(const ByteArray &iccProfile) +{ + _iccProfile = iccProfile; +} + void *Image::imageData() { return _dataBlock.data.size() ? _dataBlock.data.data() : nullptr; @@ -520,6 +531,7 @@ * @param readPixel when false it will read pixel data from file and imageData() * will return nullptr */ const Image& getImage(uint32_t n, bool readPixels = true); + const Image& getThumbnail(); private: void readXISFHeader(); void readSignature(); @@ -531,7 +543,9 @@ Image parseImage(const pugi::xml_node &node); std::unique_ptr<std::istream> _io; + std::unique_ptr<StreamBuffer> _buffer; std::vector<Image> _images; + Image _thumbnail; std::vector<Property> _properties; }; @@ -546,8 +560,8 @@ void XISFReaderPrivate::open(const ByteArray &data) { close(); - std::string str((char*)data.data(), data.size()); - _io = std::make_unique<std::istringstream>(str, std::ios_base::in | std::ios_base::binary); + _buffer = std::make_unique<StreamBuffer>(data); + _io = std::make_unique<std::istream>(_buffer.get()); readSignature(); readXISFHeader(); } @@ -563,6 +577,7 @@ void XISFReaderPrivate::close() { _io.reset(); + _buffer.reset(); _images.clear(); _properties.clear(); } @@ -588,6 +603,19 @@ return img; } +const Image &XISFReaderPrivate::getThumbnail() +{ + Image &img = _thumbnail; + if(_thumbnail._dataBlock.attachmentPos) + { + _io->seekg(img._dataBlock.attachmentPos); + ByteArray data(img._dataBlock.attachmentSize); + _io->read(data.data(), data.size()); + img._dataBlock.decompress(data); + } + return _thumbnail; +} + void XISFReaderPrivate::readXISFHeader() { uint32_t headerLen[2] = {0}; @@ -608,6 +636,9 @@ for(auto &property : root.children("Property")) _properties.push_back(parseProperty(property)); + + if(root.child("Thumbnail")) + _thumbnail = parseImage(root.child("Thumbnail")); } else throw Error("Unknown root XML element"); } @@ -784,6 +815,9 @@ image._iccProfile = icc.data; } + if(node.child("Thumbnail") && std::strcmp(node.name(), "Thumbnail")) + _thumbnail = parseImage(node.child("Thumbnail")); + return image; } @@ -818,10 +852,10 @@ void XISFWriterPrivate::save(ByteArray &data) { - std::ostringstream oss; + StreamBuffer buffer; + std::ostream oss(&buffer); save(oss); - std::string str = oss.str(); - data = ByteArray(str.data(), str.size()); + data = buffer.byteArray(); } void XISFWriterPrivate::save(std::ostream &io) @@ -1034,6 +1068,11 @@ return p->getImage(n, readPixels); } +const Image &XISFReader::getThumbnail() +{ + return p->getThumbnail(); +} + XISFWriter::XISFWriter() { p = new XISFWriterPrivate; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxisf/libxisf.h new/libxisf/libxisf.h --- old/libxisf/libxisf.h 2023-04-11 12:25:14.000000000 +0200 +++ new/libxisf/libxisf.h 2023-05-24 16:28:11.000000000 +0200 @@ -301,6 +301,8 @@ * For example OBSERVER => Observer:Name, SITELAT => Observation:Location:Latitude */ bool addFITSKeywordAsProperty(const String &name, const String &value); + const ByteArray& iccProfile() const; + void setIccProfile(const ByteArray &iccProfile); void* imageData(); const void* imageData() const; @@ -364,9 +366,14 @@ int imagesCount() const; /** Return reference to Image * @param n index of image - * @param readPixel when false it will read pixel data from file and imageData() - * will return nullptr */ + * @param readPixel when false it will not read pixel data from file and imageData() + * will return nullptr. Other properties like width, height, format etc will be returned correctly */ const Image& getImage(uint32_t n, bool readPixels = true); + /** + * @brief getThumbnail + * @return image thumbnail + */ + const Image& getThumbnail(); private: XISFReaderPrivate *p; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxisf/libxisf.pc.in new/libxisf/libxisf.pc.in --- old/libxisf/libxisf.pc.in 1970-01-01 01:00:00.000000000 +0100 +++ new/libxisf/libxisf.pc.in 2023-05-24 16:28:11.000000000 +0200 @@ -0,0 +1,13 @@ +prefix="@CMAKE_INSTALL_PREFIX@" +exec_prefix="${prefix}" +libdir="${exec_prefix}/@CMAKE_INSTALL_LIBDIR@" +includedir="${prefix}/@CMAKE_INSTALL_INCLUDEDIR@" + +Name: @PROJECT_NAME@ +Description: @CMAKE_PROJECT_DESCRIPTION@ +URL: @CMAKE_PROJECT_HOMEPAGE_URL@ +Version: @PROJECT_VERSION@ +Requires.private: @PC_LIBS_REQUIRE@ +Cflags: -I"${includedir}" +Libs: -L"${libdir}" -lXISF +Libs.private: -L"${libdir}" @PC_LIBS_REQUIRE@ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxisf/streambuffer.cpp new/libxisf/streambuffer.cpp --- old/libxisf/streambuffer.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/libxisf/streambuffer.cpp 2023-05-24 16:28:11.000000000 +0200 @@ -0,0 +1,144 @@ +#include "streambuffer.h" + +namespace LibXISF +{ + +StreamBuffer::StreamBuffer() +{ + setg(nullptr, nullptr, nullptr); + setp(nullptr, nullptr); +} + +StreamBuffer::StreamBuffer(const ByteArray &byteArray) : + _size(byteArray.size()), + _byteArray(byteArray) +{ + if(_byteArray.size()) + { + char *ptr = _byteArray.data(); + setg(ptr, ptr, ptr + _size); + setp(ptr, ptr + _size); + } + else + { + setg(nullptr, nullptr, nullptr); + setp(nullptr, nullptr); + } +} + +ByteArray StreamBuffer::byteArray() +{ + return _byteArray; +} + +StreamBuffer::pos_type StreamBuffer::seekoff(off_type off, std::ios_base::seekdir dir, std::ios_base::openmode mode) +{ + pos_type ret = pos_type(off_type(-1)); + off_type newoffi = off; + off_type newoffo = off; + if(dir == std::ios_base::cur) + { + newoffi += gptr() - eback(); + newoffo += pptr() - pbase(); + } + else if(dir == std::ios_base::end) + newoffo = newoffi = _byteArray.size() - off; + + char *ptr = _byteArray.data(); + if(mode & std::ios_base::in && newoffi >= 0 && newoffi <= _size) + { + setg(ptr, ptr + newoffi, ptr + _size); + ret = pos_type(newoffi); + } + + if(mode & std::ios_base::out && newoffo >= 0 && newoffo <= _size) + { + setp(ptr, ptr + _size); + pbump(newoffo); + ret = pos_type(newoffo); + } + + return ret; +} + +StreamBuffer::pos_type StreamBuffer::seekpos(pos_type pos, std::ios_base::openmode mode) +{ + pos_type ret = pos_type(off_type(-1)); + off_type off = pos; + + if(off >= 0 && off <= (off_type)_byteArray.size()) + { + char *ptr = _byteArray.data(); + if(mode & std::ios_base::in) + setg(ptr, ptr + pos, ptr + _size); + + if(mode & std::ios_base::out) + { + setp(ptr, ptr + _size); + pbump(pos); + } + + ret = pos; + } + return ret; +} + +std::streamsize StreamBuffer::xsgetn(char_type *s, std::streamsize n) +{ + std::streamsize ret = 0; + std::streamsize len = egptr() - gptr(); + if(len > 0) + { + std::streamsize c = std::min(n, len); + std::memcpy(s, gptr(), c); + gbump(c); + ret = c; + } + return ret; +} + +StreamBuffer::int_type StreamBuffer::underflow() +{ + if(gptr() < egptr()) + return traits_type::to_int_type(*gptr()); + else + return traits_type::eof(); +} + +std::streamsize StreamBuffer::xsputn(const char_type *s, std::streamsize n) +{ + off_type len = epptr() - pptr(); + if(len < n) + { + _size += n - len; + _byteArray.resize(_size); + update_ptrs(); + } + std::memcpy(pptr(), s, n); + pbump(n); + return n; +} + +StreamBuffer::int_type StreamBuffer::overflow(int_type c) +{ + if(traits_type::eq_int_type(traits_type::eof(), c)) + return traits_type::eof(); + + _byteArray.append(c); + _size++; + pbump(1); + update_ptrs(); + return c; +} + +void StreamBuffer::update_ptrs() +{ + off_type ipos = gptr() - eback(); + off_type opos = pptr() - pbase(); + char *ptr = _byteArray.data(); + setg(ptr, ptr + ipos, ptr + _size); + setp(ptr, ptr + _size); + pbump(opos); +} + +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxisf/streambuffer.h new/libxisf/streambuffer.h --- old/libxisf/streambuffer.h 1970-01-01 01:00:00.000000000 +0100 +++ new/libxisf/streambuffer.h 2023-05-24 16:28:11.000000000 +0200 @@ -0,0 +1,33 @@ +#ifndef STREAMBUFFER_H +#define STREAMBUFFER_H + +#include <streambuf> +#include "libxisf.h" + +namespace LibXISF +{ + +class StreamBuffer : public std::streambuf +{ +public: + StreamBuffer(); + StreamBuffer(const ByteArray &byteArray); + ByteArray byteArray(); +protected: + pos_type seekoff(off_type off, std::ios_base::seekdir dir, std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out) override; + pos_type seekpos(pos_type pos, std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out) override; + + std::streamsize xsgetn(char_type *s, std::streamsize n) override; + int_type underflow() override; + + std::streamsize xsputn(const char_type *s, std::streamsize n) override; + int_type overflow(int_type c = traits_type::eof()) override; +private: + void update_ptrs(); + off_type _size = 0; + ByteArray _byteArray; +}; + +} + +#endif // STREAMBUFFER_H