Compare commits
19 Commits
922d4b73c9
..
ubuntu
| Author | SHA1 | Date | |
|---|---|---|---|
| 97ada678e5 | |||
| 6954620071 | |||
| 5e85ccfd72 | |||
| 0f24632753 | |||
| ff87f7d943 | |||
| bc4a66a110 | |||
| 20ff9130bb | |||
| 0f86e5ac59 | |||
| 6ae48adc6b | |||
| 605734e217 | |||
| a991f8dfcb | |||
| 7a5c05c3ad | |||
| 4333387af0 | |||
| 7da5f98d8b | |||
| 31bb8cbdd9 | |||
| 4c1d8c4ca6 | |||
| 9d034e77a3 | |||
| 16fc80fa15 | |||
| ef90ad4d7c |
Vendored
+80
@@ -0,0 +1,80 @@
|
|||||||
|
libxisf (0.2.12-ubuntu1) focal; urgency=medium
|
||||||
|
|
||||||
|
* Fix bug in writing ICCProfile
|
||||||
|
* Fix handling big +2GiB images
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Sat, 23 Mar 2024 09:25:46 +0100
|
||||||
|
|
||||||
|
libxisf (0.2.11-ubuntu1) focal; urgency=medium
|
||||||
|
|
||||||
|
* Fix not loading String properties
|
||||||
|
* Convert aperture and focal length from mm to meters
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Fri, 05 Jan 2024 16:18:32 +0100
|
||||||
|
|
||||||
|
libxisf (0.2.10-ubuntu1) focal; urgency=medium
|
||||||
|
|
||||||
|
* Fix writing incorrect header size
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Tue, 17 Oct 2023 20:33:05 +0200
|
||||||
|
|
||||||
|
libxisf (0.2.9-ubuntu1) focal; urgency=medium
|
||||||
|
|
||||||
|
* Add support for ZSTD
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Mon, 14 Aug 2023 10:32:30 +0200
|
||||||
|
|
||||||
|
libxisf (0.2.6-ubuntu1) focal; urgency=medium
|
||||||
|
|
||||||
|
* Add method for ICC profile
|
||||||
|
* pkg-config file support
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Fri, 02 Jun 2023 09:16:59 +0200
|
||||||
|
|
||||||
|
libxisf (0.2.4-ubuntu1) focal; urgency=medium
|
||||||
|
|
||||||
|
* Add getThumbnail method
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Tue, 19 May 2023 19:23:34 +0200
|
||||||
|
|
||||||
|
libxisf (0.2.3-ubuntu1) focal; urgency=medium
|
||||||
|
|
||||||
|
* Fix Color filter array
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Tue, 11 Apr 2023 12:39:41 +0200
|
||||||
|
|
||||||
|
libxisf (0.2.0-ubuntu2) focal; urgency=medium
|
||||||
|
|
||||||
|
* Fix lintian errors
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Sun, 19 Mar 2023 22:10:39 +0100
|
||||||
|
|
||||||
|
libxisf (0.2.0-ubuntu1) focal; urgency=medium
|
||||||
|
|
||||||
|
* Rewrite to remove Qt as dependency
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Fri, 10 Mar 2023 22:10:01 +0100
|
||||||
|
|
||||||
|
libxisf (0.1.3-ubuntu1) focal; urgency=medium
|
||||||
|
|
||||||
|
* Write missing pixelStorage attribute
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Fri, 17 Feb 2023 16:57:30 +0100
|
||||||
|
|
||||||
|
libxisf (0.1.2-ubuntu1) focal; urgency=medium
|
||||||
|
|
||||||
|
* Add qtbase5-dev as dependency to libxisf-dev
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Thu, 09 Feb 2023 21:28:45 +0100
|
||||||
|
|
||||||
|
libxisf (0.1.1-ubuntu1) focal; urgency=medium
|
||||||
|
|
||||||
|
* Fixed packaging
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Wed, 08 Feb 2023 18:57:50 +0100
|
||||||
|
|
||||||
|
libxisf (0.1.0-ubuntu1) focal; urgency=low
|
||||||
|
|
||||||
|
* Initial release.
|
||||||
|
|
||||||
|
-- Dušan Poizl <nou@nouspiro.space> Tue, 07 Feb 2023 10:47:08 +0100
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
10
|
||||||
Vendored
+45
@@ -0,0 +1,45 @@
|
|||||||
|
Source: libxisf
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: Dušan Poizl <nou@nouspiro.space>
|
||||||
|
Build-Depends: debhelper (>= 9),
|
||||||
|
cdbs,
|
||||||
|
cmake,
|
||||||
|
pkg-config,
|
||||||
|
liblz4-dev,
|
||||||
|
libpugixml-dev,
|
||||||
|
zlib1g-dev,
|
||||||
|
libzstd-dev
|
||||||
|
Standards-Version: 4.5.0
|
||||||
|
Section: libs
|
||||||
|
Homepage: https://gitea.nouspiro.space/nou/libXISF
|
||||||
|
Vcs-Git: https://gitea.nouspiro.space/nou/libXISF.git
|
||||||
|
|
||||||
|
Package: libxisf-dev
|
||||||
|
Section: libdevel
|
||||||
|
Architecture: any
|
||||||
|
Multi-Arch: same
|
||||||
|
Depends: libxisf (= ${binary:Version}), ${misc:Depends}
|
||||||
|
Description: Library to load and save XISF images development files
|
||||||
|
This package contain development files.
|
||||||
|
.
|
||||||
|
XISF is native format of PixInsight astroprocessing suite.
|
||||||
|
Extensible Image Serialization Format (XISF) is the native file format
|
||||||
|
of PixInsight. It is a free, open format for storage, management and
|
||||||
|
interchange of digital images and associated data.
|
||||||
|
.
|
||||||
|
This C++ library implements XISF specification 1.0 which can be found at
|
||||||
|
https://pixinsight.com/doc/docs/XISF-1.0-spec/XISF-1.0-spec.html
|
||||||
|
|
||||||
|
Package: libxisf
|
||||||
|
Architecture: any
|
||||||
|
Multi-Arch: same
|
||||||
|
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||||
|
Conflicts: libxisf0
|
||||||
|
Description: Library to load and save XISF images
|
||||||
|
XISF is native format of PixInsight astroprocessing suite.
|
||||||
|
Extensible Image Serialization Format (XISF) is the native file format
|
||||||
|
of PixInsight. It is a free, open format for storage, management and
|
||||||
|
interchange of digital images and associated data.
|
||||||
|
.
|
||||||
|
This C++ library implements XISF specification 1.0 which can be found at
|
||||||
|
https://pixinsight.com/doc/docs/XISF-1.0-spec/XISF-1.0-spec.html
|
||||||
Vendored
+97
@@ -0,0 +1,97 @@
|
|||||||
|
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
|
Upstream-Name: libxisf
|
||||||
|
Source: https://gitea.nouspiro.space/nou/libXISF
|
||||||
|
|
||||||
|
Files: * debian/*
|
||||||
|
Copyright: (c) 2023 <Dušan Poizl nou@nouspiro.space>
|
||||||
|
License: GPL-3+
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
.
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
.
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
.
|
||||||
|
On Debian systems, the complete texts of the GNU General Public Licenses
|
||||||
|
version 2 and 3 can be found in '/usr/share/common-licenses/GPL-2' and
|
||||||
|
'/usr/share/common-licenses/GPL-3'.
|
||||||
|
|
||||||
|
Files: lz4/*
|
||||||
|
Copyright: (c) 2011-2020, Yann Collet
|
||||||
|
License: BSD-2-clause
|
||||||
|
LZ4 Library
|
||||||
|
Copyright (c) 2011-2020, Yann Collet
|
||||||
|
All rights reserved.
|
||||||
|
.
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
.
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
other materials provided with the distribution.
|
||||||
|
.
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
Files: zlib/*
|
||||||
|
Copyright: (c) 1995-2022 Jean-loup Gailly and Mark Adler
|
||||||
|
License: Zlib
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
.
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
.
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
.
|
||||||
|
Jean-loup Gailly Mark Adler
|
||||||
|
jloup@gzip.org madler@alumni.caltech.edu
|
||||||
|
|
||||||
|
Files: pugixml/*
|
||||||
|
Copyright: (c) 2006-2022 Arseny Kapoulkine
|
||||||
|
License: MIT
|
||||||
|
Permission is hereby granted, free of charge, to any person
|
||||||
|
obtaining a copy of this software and associated documentation
|
||||||
|
files (the "Software"), to deal in the Software without
|
||||||
|
restriction, including without limitation the rights to use,
|
||||||
|
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following
|
||||||
|
conditions:
|
||||||
|
.
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
.
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
usr/include
|
||||||
|
usr/lib/*/*.so
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
usr/lib/*/*.so.*
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
|
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||||
|
export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
|
||||||
|
export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
|
||||||
|
DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
|
||||||
|
DPKG_EXPORT_BUILDFLAGS = 1
|
||||||
|
include /usr/share/dpkg/buildflags.mk
|
||||||
|
CFLAGS+=$(CPPFLAGS)
|
||||||
|
CXXFLAGS+=$(CPPFLAGS)
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh $@
|
||||||
|
|
||||||
|
override_dh_auto_configure:
|
||||||
|
dh_auto_configure -- -DCMAKE_LIBRARY_ARCHITECTURE="$(DEB_HOST_MULTIARCH)" -DUSE_BUNDLED_LIBS=Off
|
||||||
+2
-349
@@ -23,7 +23,6 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cmath>
|
|
||||||
#include <lz4.h>
|
#include <lz4.h>
|
||||||
#include <lz4hc.h>
|
#include <lz4hc.h>
|
||||||
#include <pugixml.hpp>
|
#include <pugixml.hpp>
|
||||||
@@ -487,38 +486,7 @@ DataBlock::CompressionCodec Image::compression() const
|
|||||||
void Image::setCompression(DataBlock::CompressionCodec compression, int level)
|
void Image::setCompression(DataBlock::CompressionCodec compression, int level)
|
||||||
{
|
{
|
||||||
_dataBlock.codec = compression;
|
_dataBlock.codec = compression;
|
||||||
_dataBlock.compressLevel = -1;
|
_dataBlock.compressLevel = level;
|
||||||
|
|
||||||
level = std::min(std::max(level, -1), 100);
|
|
||||||
|
|
||||||
auto percentToRange = [](int val, int min, int max)
|
|
||||||
{
|
|
||||||
double slope = (max - min) / 100.0;
|
|
||||||
return std::round(min + slope * val);
|
|
||||||
};
|
|
||||||
|
|
||||||
if(level >= 0)
|
|
||||||
{
|
|
||||||
switch(compression)
|
|
||||||
{
|
|
||||||
case DataBlock::CompressionCodec::Zlib:
|
|
||||||
_dataBlock.compressLevel = percentToRange(level, Z_BEST_SPEED, Z_BEST_COMPRESSION);
|
|
||||||
break;
|
|
||||||
case DataBlock::CompressionCodec::LZ4:
|
|
||||||
case DataBlock::CompressionCodec::LZ4HC:
|
|
||||||
_dataBlock.compressLevel = percentToRange(level, 1, LZ4HC_CLEVEL_MAX);
|
|
||||||
break;
|
|
||||||
case DataBlock::CompressionCodec::ZSTD:
|
|
||||||
#ifdef HAVE_ZSTD
|
|
||||||
_dataBlock.compressLevel = percentToRange(level, ZSTD_minCLevel(), ZSTD_maxCLevel());
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
//nothing
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Image::byteShuffling() const
|
bool Image::byteShuffling() const
|
||||||
@@ -981,12 +949,12 @@ public:
|
|||||||
void save(ByteArray &data);
|
void save(ByteArray &data);
|
||||||
void save(std::ostream &io);
|
void save(std::ostream &io);
|
||||||
void writeImage(const Image &image);
|
void writeImage(const Image &image);
|
||||||
static void writeFITSKeyword(pugi::xml_node &node, const FITSKeyword &keyword);
|
|
||||||
private:
|
private:
|
||||||
void writeHeader();
|
void writeHeader();
|
||||||
void writeImageElement(pugi::xml_node &node, const Image &image);
|
void writeImageElement(pugi::xml_node &node, const Image &image);
|
||||||
void writeDataBlockAttributes(pugi::xml_node &image_node, const DataBlock &dataBlock);
|
void writeDataBlockAttributes(pugi::xml_node &image_node, const DataBlock &dataBlock);
|
||||||
void writePropertyElement(pugi::xml_node &node, const Property &property);
|
void writePropertyElement(pugi::xml_node &node, const Property &property);
|
||||||
|
void writeFITSKeyword(pugi::xml_node &node, const FITSKeyword &keyword);
|
||||||
void writeMetadata(pugi::xml_node &node);
|
void writeMetadata(pugi::xml_node &node);
|
||||||
void updateImageAttachmentPos(pugi::xml_node &root, size_t offset);
|
void updateImageAttachmentPos(pugi::xml_node &root, size_t offset);
|
||||||
ByteArray _xisfHeader;
|
ByteArray _xisfHeader;
|
||||||
@@ -1302,321 +1270,6 @@ void XISFWriter::writeImage(const Image &image)
|
|||||||
p->writeImage(image);
|
p->writeImage(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
class XISFModifyPrivate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void open(const String &name);
|
|
||||||
void open(const ByteArray &data);
|
|
||||||
/** Open image from istream. This method takes ownership of *io pointer */
|
|
||||||
void open(std::istream *io);
|
|
||||||
/** Close opended file release all data. */
|
|
||||||
void close();
|
|
||||||
|
|
||||||
void save(const String &name);
|
|
||||||
void save(ByteArray &data);
|
|
||||||
void save(std::ostream &io);
|
|
||||||
|
|
||||||
void addFITSKeyword(uint32_t image, const FITSKeyword &keyword);
|
|
||||||
void updateFITSKeyword(uint32_t image, const FITSKeyword &keyword, bool add);
|
|
||||||
void removeFITSKeyword(uint32_t image, const String &name);
|
|
||||||
private:
|
|
||||||
void readXISFHeader();
|
|
||||||
void parseAttachmentPos(pugi::xml_node &root);
|
|
||||||
void updateAttachmentPos(pugi::xml_node &root, size_t offset);
|
|
||||||
|
|
||||||
std::unique_ptr<std::istream> _io;
|
|
||||||
std::unique_ptr<StreamBuffer> _buffer;
|
|
||||||
|
|
||||||
pugi::xml_document _doc;
|
|
||||||
pugi::xml_node _root;
|
|
||||||
std::map<int, std::pair<uint64_t, uint64_t>> _attachmentPos;// pair contain position and size
|
|
||||||
std::map<int, std::pair<uint64_t, uint64_t>> _attachmentPosNew;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void XISFModifyPrivate::open(const String &name)
|
|
||||||
{
|
|
||||||
close();
|
|
||||||
_io = std::make_unique<std::ifstream>(name.c_str(), std::ios_base::in | std::ios_base::binary);
|
|
||||||
readXISFHeader();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::open(const ByteArray &data)
|
|
||||||
{
|
|
||||||
close();
|
|
||||||
_buffer = std::make_unique<StreamBuffer>(data);
|
|
||||||
_io = std::make_unique<std::istream>(_buffer.get());
|
|
||||||
readXISFHeader();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::open(std::istream *io)
|
|
||||||
{
|
|
||||||
close();
|
|
||||||
_io.reset(io);
|
|
||||||
readXISFHeader();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::close()
|
|
||||||
{
|
|
||||||
_io.reset();
|
|
||||||
_buffer.reset();
|
|
||||||
_root = pugi::xml_node();
|
|
||||||
_doc.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::save(const String &name)
|
|
||||||
{
|
|
||||||
std::ofstream fw(name.c_str(), std::ios_base::out | std::ios_base::binary);
|
|
||||||
|
|
||||||
if(fw.fail())
|
|
||||||
throw Error("Failed to open file");
|
|
||||||
|
|
||||||
save(fw);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::save(ByteArray &data)
|
|
||||||
{
|
|
||||||
StreamBuffer buffer;
|
|
||||||
std::ostream oss(&buffer);
|
|
||||||
save(oss);
|
|
||||||
data = buffer.byteArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::save(std::ostream &io)
|
|
||||||
{
|
|
||||||
if(!_io || !_root)
|
|
||||||
throw Error("No input file opened");
|
|
||||||
|
|
||||||
const char signature[16] = {'X', 'I', 'S', 'F', '0', '1', '0', '0', 0, 0, 0, 0, 0, 0, 0, 0};
|
|
||||||
|
|
||||||
pugi::xml_document doc;
|
|
||||||
doc.append_child(pugi::node_comment).set_value("\nExtensible Image Serialization Format - XISF version 1.0\nCreated with libXISF - https://nouspiro.space\n");
|
|
||||||
pugi::xml_node root_copy = doc.append_copy(_root);
|
|
||||||
|
|
||||||
uint32_t size = 0;
|
|
||||||
std::string header;
|
|
||||||
while(true)
|
|
||||||
{
|
|
||||||
std::stringstream xml;
|
|
||||||
xml.write(signature, sizeof(signature));
|
|
||||||
doc.save(xml, "", pugi::format_raw);
|
|
||||||
header = xml.str();
|
|
||||||
if(size != header.size())
|
|
||||||
{
|
|
||||||
size = header.size();
|
|
||||||
updateAttachmentPos(root_copy, size);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t headerSize = header.size() - sizeof(signature);
|
|
||||||
header.replace(8, sizeof(uint32_t), (const char*)&headerSize, sizeof(uint32_t));
|
|
||||||
|
|
||||||
io.write(header.c_str(), header.size());
|
|
||||||
const uint64_t BLOCK_SIZE = 1024*1024*4;
|
|
||||||
std::vector<char> data(BLOCK_SIZE);
|
|
||||||
for(auto &pos : _attachmentPos)
|
|
||||||
{
|
|
||||||
uint64_t oldPos = pos.second.first;
|
|
||||||
uint64_t size = pos.second.second;
|
|
||||||
|
|
||||||
_io->seekg(oldPos);
|
|
||||||
while(size)
|
|
||||||
{
|
|
||||||
_io->read(&data[0], std::min(size, BLOCK_SIZE));
|
|
||||||
io.write(&data[0], std::min(size, BLOCK_SIZE));
|
|
||||||
size -= std::min(size, BLOCK_SIZE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::addFITSKeyword(uint32_t image, const FITSKeyword &keyword)
|
|
||||||
{
|
|
||||||
if(!_root)
|
|
||||||
throw Error("No input file opened");
|
|
||||||
|
|
||||||
pugi::xpath_node_set images = _root.select_nodes("//Image");
|
|
||||||
|
|
||||||
if(image >= images.size())
|
|
||||||
throw Error("Out of bounds");
|
|
||||||
|
|
||||||
pugi::xml_node imageNode = images[image].node();
|
|
||||||
XISFWriterPrivate::writeFITSKeyword(imageNode, keyword);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::updateFITSKeyword(uint32_t image, const FITSKeyword &keyword, bool add)
|
|
||||||
{
|
|
||||||
if(!_root)
|
|
||||||
throw Error("No input file opened");
|
|
||||||
|
|
||||||
pugi::xpath_node_set images = _root.select_nodes("//Image");
|
|
||||||
|
|
||||||
if(image >= images.size())
|
|
||||||
throw Error("Out of bounds");
|
|
||||||
|
|
||||||
pugi::xpath_variable_set variables;
|
|
||||||
variables.set("name", keyword.name.c_str());
|
|
||||||
pugi::xml_node imageNode = images[image].node();
|
|
||||||
pugi::xml_node keywordNode = imageNode.select_node("FITSKeyword[@name=string($name)]", &variables).node();
|
|
||||||
|
|
||||||
if(keywordNode)
|
|
||||||
{
|
|
||||||
if(keywordNode.attribute("value"))
|
|
||||||
keywordNode.attribute("value").set_value(keyword.value.c_str());
|
|
||||||
else
|
|
||||||
keywordNode.append_attribute("value").set_value(keyword.value.c_str());
|
|
||||||
|
|
||||||
if(keywordNode.attribute("comment"))
|
|
||||||
keywordNode.attribute("comment").set_value(keyword.comment.c_str());
|
|
||||||
else
|
|
||||||
keywordNode.append_attribute("comment").set_value(keyword.comment.c_str());
|
|
||||||
}
|
|
||||||
else if(add)
|
|
||||||
{
|
|
||||||
XISFWriterPrivate::writeFITSKeyword(imageNode, keyword);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::removeFITSKeyword(uint32_t image, const String &name)
|
|
||||||
{
|
|
||||||
if(!_root)
|
|
||||||
throw Error("No input file opened");
|
|
||||||
|
|
||||||
pugi::xpath_node_set images = _root.select_nodes("//Image");
|
|
||||||
|
|
||||||
if(image >= images.size())
|
|
||||||
throw Error("Out of bounds");
|
|
||||||
|
|
||||||
pugi::xpath_variable_set variables;
|
|
||||||
variables.set("name", name.c_str());
|
|
||||||
pugi::xml_node imageNode = images[image].node();
|
|
||||||
pugi::xml_node keywordNode = imageNode.select_node("FITSKeyword[@name=string($name)]", &variables).node();
|
|
||||||
|
|
||||||
if(keywordNode)
|
|
||||||
imageNode.remove_child(keywordNode);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::readXISFHeader()
|
|
||||||
{
|
|
||||||
char signature[8];
|
|
||||||
_io->read(signature, sizeof(signature));
|
|
||||||
if(_io->fail())
|
|
||||||
throw Error("Failed to read from file");
|
|
||||||
|
|
||||||
if(memcmp(signature, "XISF0100", sizeof(signature)) != 0)
|
|
||||||
throw Error("Not valid XISF 1.0 file");
|
|
||||||
|
|
||||||
uint32_t headerLen[2] = {0};
|
|
||||||
_io->read((char*)&headerLen, sizeof(headerLen));
|
|
||||||
|
|
||||||
ByteArray xisfHeader(headerLen[0]);
|
|
||||||
_io->read(xisfHeader.data(), headerLen[0]);
|
|
||||||
|
|
||||||
_doc.load_buffer(xisfHeader.data(), xisfHeader.size());
|
|
||||||
|
|
||||||
_root = _doc.child("xisf");
|
|
||||||
|
|
||||||
parseAttachmentPos(_root);
|
|
||||||
|
|
||||||
if(!_root || _root.attribute("version").as_string() != std::string("1.0"))
|
|
||||||
throw Error("Unknown root XML element");
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::parseAttachmentPos(pugi::xml_node &root)
|
|
||||||
{
|
|
||||||
pugi::xpath_node_set locationAttributes = root.select_nodes("//@location");
|
|
||||||
int i = 0;
|
|
||||||
for(auto &attr : locationAttributes)
|
|
||||||
{
|
|
||||||
std::string locationStr = attr.attribute().as_string();
|
|
||||||
std::vector<std::string> location = splitString(locationStr, ':');
|
|
||||||
if(location.size() >= 3 && location[0] == "attachment")
|
|
||||||
{
|
|
||||||
uint64_t attachmentPos = std::stoull(location[1]);
|
|
||||||
uint64_t attachmentSize = std::stoull(location[2]);
|
|
||||||
_attachmentPos[i] = {attachmentPos, attachmentSize};
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModifyPrivate::updateAttachmentPos(pugi::xml_node &root, size_t offset)
|
|
||||||
{
|
|
||||||
pugi::xpath_node_set locationAttributes = root.select_nodes("//@location");
|
|
||||||
for(auto &pos : _attachmentPos)
|
|
||||||
{
|
|
||||||
pugi::xml_attribute attr = locationAttributes[pos.first].attribute();
|
|
||||||
uint64_t attachmentSize = pos.second.second;
|
|
||||||
std::string locationStr = "attachment:" + std::to_string(offset) + ":" + std::to_string(attachmentSize);
|
|
||||||
_attachmentPosNew[pos.first] = pos.second;
|
|
||||||
offset += attachmentSize;
|
|
||||||
attr.set_value(locationStr.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
XISFModify::XISFModify()
|
|
||||||
{
|
|
||||||
p = new XISFModifyPrivate();
|
|
||||||
}
|
|
||||||
|
|
||||||
XISFModify::~XISFModify()
|
|
||||||
{
|
|
||||||
delete p;
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModify::open(const String &name)
|
|
||||||
{
|
|
||||||
p->open(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModify::open(const ByteArray &data)
|
|
||||||
{
|
|
||||||
p->open(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModify::open(std::istream *io)
|
|
||||||
{
|
|
||||||
p->open(io);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModify::close()
|
|
||||||
{
|
|
||||||
p->close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModify::save(const String &name)
|
|
||||||
{
|
|
||||||
p->save(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModify::save(ByteArray &data)
|
|
||||||
{
|
|
||||||
p->save(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModify::save(std::ostream &io)
|
|
||||||
{
|
|
||||||
p->save(io);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModify::addFITSKeyword(uint32_t image, const FITSKeyword &keyword)
|
|
||||||
{
|
|
||||||
p->addFITSKeyword(image, keyword);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModify::updateFITSKeyword(uint32_t image, const FITSKeyword &keyword, bool add)
|
|
||||||
{
|
|
||||||
p->updateFITSKeyword(image, keyword, add);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XISFModify::removeFITSKeyword(uint32_t image, const String &name)
|
|
||||||
{
|
|
||||||
p->removeFITSKeyword(image, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define STRING_ENUM(map, map2, c, e) { map.insert({#e, c::e}); map2.insert({c::e, #e}); }
|
#define STRING_ENUM(map, map2, c, e) { map.insert({#e, c::e}); map2.insert({c::e, #e}); }
|
||||||
|
|
||||||
struct Init
|
struct Init
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ namespace LibXISF
|
|||||||
|
|
||||||
class XISFReaderPrivate;
|
class XISFReaderPrivate;
|
||||||
class XISFWriterPrivate;
|
class XISFWriterPrivate;
|
||||||
class XISFModifyPrivate;
|
|
||||||
|
|
||||||
class LIBXISF_EXPORT ByteArray
|
class LIBXISF_EXPORT ByteArray
|
||||||
{
|
{
|
||||||
@@ -317,11 +316,6 @@ public:
|
|||||||
const T* imageData() const { return static_cast<T*>(imageData()); }
|
const T* imageData() const { return static_cast<T*>(imageData()); }
|
||||||
size_t imageDataSize() const;
|
size_t imageDataSize() const;
|
||||||
DataBlock::CompressionCodec compression() const;
|
DataBlock::CompressionCodec compression() const;
|
||||||
/** Set compression type and level.
|
|
||||||
* @param compression define which compression algorithm to use.
|
|
||||||
* @param level number between 0 and 100. Zero means lowest compression and maximum speed. Hundred means maximum compression speed.
|
|
||||||
* -1 means default compression level defined by compression library.
|
|
||||||
*/
|
|
||||||
void setCompression(DataBlock::CompressionCodec compression, int level = -1);
|
void setCompression(DataBlock::CompressionCodec compression, int level = -1);
|
||||||
bool byteShuffling() const;
|
bool byteShuffling() const;
|
||||||
void setByteshuffling(bool enable);
|
void setByteshuffling(bool enable);
|
||||||
@@ -411,42 +405,6 @@ public:
|
|||||||
const char* what() const noexcept { return _msg.c_str(); }
|
const char* what() const noexcept { return _msg.c_str(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
class LIBXISF_EXPORT XISFModify
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
XISFModify();
|
|
||||||
virtual ~XISFModify();
|
|
||||||
void open(const String &name);
|
|
||||||
void open(const ByteArray &data);
|
|
||||||
void open(std::istream *io);
|
|
||||||
void close();
|
|
||||||
void save(const String &name);
|
|
||||||
void save(ByteArray &data);
|
|
||||||
void save(std::ostream &io);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief addFITSKeyword append new keyword to image
|
|
||||||
* @param image index of image to update
|
|
||||||
* @param keyword that will be added
|
|
||||||
*/
|
|
||||||
void addFITSKeyword(uint32_t image, const FITSKeyword &keyword);
|
|
||||||
/**
|
|
||||||
* @brief updateFITSKeyword update keyword with same name
|
|
||||||
* @param image index of image to update
|
|
||||||
* @param keyword that will be updated
|
|
||||||
* @param add if true then it will add new keyword in case that it doesn't exists
|
|
||||||
*/
|
|
||||||
void updateFITSKeyword(uint32_t image, const FITSKeyword &keyword, bool add);
|
|
||||||
/**
|
|
||||||
* @brief removeFITSKeyword remove keyword with name from image
|
|
||||||
* @param image index of image to update
|
|
||||||
* @param name of keyword that will be removed
|
|
||||||
*/
|
|
||||||
void removeFITSKeyword(uint32_t image, const String &name);
|
|
||||||
private:
|
|
||||||
XISFModifyPrivate *p;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Image::SampleFormat Image::sampleFormatEnum()
|
constexpr Image::SampleFormat Image::sampleFormatEnum()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,21 +1,3 @@
|
|||||||
/************************************************************************
|
|
||||||
* LibXISF - library to load and save XISF files *
|
|
||||||
* Copyright (C) 2024 Dušan Poizl *
|
|
||||||
* *
|
|
||||||
* This program is free software: you can redistribute it and/or modify *
|
|
||||||
* it under the terms of the GNU General Public License as published by *
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or *
|
|
||||||
* (at your option) any later version. *
|
|
||||||
* *
|
|
||||||
* This program is distributed in the hope that it will be useful, *
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
||||||
* GNU General Public License for more details. *
|
|
||||||
* *
|
|
||||||
* You should have received a copy of the GNU General Public License *
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.*
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#include "streambuffer.h"
|
#include "streambuffer.h"
|
||||||
|
|
||||||
namespace LibXISF
|
namespace LibXISF
|
||||||
|
|||||||
@@ -1,21 +1,3 @@
|
|||||||
/************************************************************************
|
|
||||||
* LibXISF - library to load and save XISF files *
|
|
||||||
* Copyright (C) 2024 Dušan Poizl *
|
|
||||||
* *
|
|
||||||
* This program is free software: you can redistribute it and/or modify *
|
|
||||||
* it under the terms of the GNU General Public License as published by *
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or *
|
|
||||||
* (at your option) any later version. *
|
|
||||||
* *
|
|
||||||
* This program is distributed in the hope that it will be useful, *
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
||||||
* GNU General Public License for more details. *
|
|
||||||
* *
|
|
||||||
* You should have received a copy of the GNU General Public License *
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.*
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#ifndef STREAMBUFFER_H
|
#ifndef STREAMBUFFER_H
|
||||||
#define STREAMBUFFER_H
|
#define STREAMBUFFER_H
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user