From 67887bd4c8becae4bfa18b9bfbf7c952f61ea1e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Thu, 14 Mar 2024 22:34:16 +0100 Subject: [PATCH] Workaround for windows where it can't read more than 2 GiB --- libxisf.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/libxisf.cpp b/libxisf.cpp index 048fa63..feef5c8 100644 --- a/libxisf.cpp +++ b/libxisf.cpp @@ -49,6 +49,7 @@ static std::unordered_map colorSpaceToString; static DataBlock::CompressionCodec compressionCodecOverride = DataBlock::None; static bool byteShuffleOverride = false; static int compressionLevelOverride = -1; +const size_t GiB = 1073741824; static const std::unordered_map> fitsNameToPropertyIdTypeConvert = { {"OBSERVER", {"Observer:Name", Variant::Type::String}}, @@ -864,7 +865,15 @@ void XISFReaderPrivate::readAttachment(DataBlock &dataBlock) { ByteArray data(dataBlock.attachmentSize); _io->seekg(dataBlock.attachmentPos); - _io->read(data.data(), dataBlock.attachmentSize); + size_t size = dataBlock.attachmentSize; + char *ptr = data.data(); + while(size > 0) + { + size_t s = std::min(size, GiB); + _io->read(ptr, s); + size -= s; + ptr += s; + } dataBlock.decompress(data); } @@ -913,7 +922,15 @@ void XISFWriterPrivate::save(std::ostream &io) for(auto &image : _images) { - io.write(image._dataBlock.data.constData(), image._dataBlock.data.size()); + const char *ptr = image._dataBlock.data.constData(); + size_t size = image._dataBlock.data.size(); + while(size > 0) + { + size_t s = std::min(size, GiB); + io.write(ptr, s); + ptr += s; + size -= s; + } } }