10 Commits

Author SHA1 Message Date
nou 2107d68e71 Add missing PUBLIC keyword and change LIBXISF_STATIC_LIB define 2023-02-10 13:44:27 +01:00
nou 2e8bbf6e30 Add ability to build static lib 2023-02-10 09:10:31 +01:00
nou a0968bba3a Fix error in debian/control 2023-02-10 07:56:16 +01:00
nou 4f48eebb10 Add qtbase5-dev as dependency to libxisf-dev 2023-02-09 21:31:19 +01:00
nou 3141092456 Add readPixel param to getImage() 2023-02-09 21:27:59 +01:00
nou 02e3aba6a7 Version 0.1.1 2023-02-08 18:58:43 +01:00
nou 43af787370 Fix debian/*install 2023-02-08 18:54:16 +01:00
nou 5266ea4105 Set target VERSION and SOVERSION property 2023-02-08 18:45:27 +01:00
nou d2c264fcc5 Add LIBXISF_COMPRESSION enviroment variable 2023-02-08 18:06:20 +01:00
nou d3559a1ebc Set target VERSION property 2023-02-08 17:13:00 +01:00
9 changed files with 77 additions and 22 deletions
+11 -3
View File
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.14) cmake_minimum_required(VERSION 3.14)
project(libXISF VERSION 0.1.0 LANGUAGES CXX C) project(libXISF VERSION 0.1.2 LANGUAGES CXX C)
set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOUIC ON)
@@ -12,7 +12,9 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)
add_library(XISF SHARED option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
add_library(XISF
libXISF_global.h libXISF_global.h
libxisf.cpp libxisf.cpp
libxisf.h libxisf.h
@@ -22,9 +24,15 @@ add_library(XISF SHARED
lz4/lz4hc.h lz4/lz4hc.h
) )
set_target_properties(XISF PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR})
target_link_libraries(XISF PUBLIC Qt${QT_VERSION_MAJOR}::Core) target_link_libraries(XISF PUBLIC Qt${QT_VERSION_MAJOR}::Core)
target_compile_definitions(XISF PRIVATE LIBXISF_LIBRARY) if(BUILD_SHARED_LIBS)
target_compile_definitions(XISF PRIVATE LIBXISF_LIBRARY)
else(BUILD_SHARED_LIBS)
target_compile_definitions(XISF PUBLIC LIBXISF_STATIC_LIB)
endif(BUILD_SHARED_LIBS)
set(XISF_PUBLIC_HEADERS libxisf.h libXISF_global.h) set(XISF_PUBLIC_HEADERS libxisf.h libXISF_global.h)
+12
View File
@@ -1,3 +1,15 @@
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 libxisf (0.1.0-ubuntu1) focal; urgency=low
* Initial release. * Initial release.
+1 -1
View File
@@ -14,7 +14,7 @@ Package: libxisf-dev
Section: libdevel Section: libdevel
Architecture: any Architecture: any
Multi-Arch: same Multi-Arch: same
Depends: libxisf (= ${binary:Version}), ${misc:Depends} Depends: libxisf (= ${binary:Version}), ${misc:Depends}, qtbase5-dev
Description: Library to load and save XISF images Description: Library to load and save XISF images
Native format of PixInsight astroprocessing suite Native format of PixInsight astroprocessing suite
+1
View File
@@ -1 +1,2 @@
usr/include usr/include
usr/lib/*/*.so
+1 -1
View File
@@ -1 +1 @@
usr/lib usr/lib/*/*.so.*
-1
View File
@@ -1 +0,0 @@
activate-noawait ldconfig
+7 -3
View File
@@ -21,10 +21,14 @@
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
#if defined(LIBXISF_LIBRARY) #ifdef LIBXISF_STATIC_LIB
# define LIBXISF_EXPORT Q_DECL_EXPORT # define LIBXISF_EXPORT
#else #else
# define LIBXISF_EXPORT Q_DECL_IMPORT # if defined(LIBXISF_LIBRARY)
# define LIBXISF_EXPORT Q_DECL_EXPORT
# else
# define LIBXISF_EXPORT Q_DECL_IMPORT
# endif
#endif #endif
#endif // LIBXISF_GLOBAL_H #endif // LIBXISF_GLOBAL_H
+38 -11
View File
@@ -26,6 +26,7 @@
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QFile> #include <QFile>
#include <QBuffer> #include <QBuffer>
#include <QProcessEnvironment>
#include "lz4/lz4.h" #include "lz4/lz4.h"
#include "lz4/lz4hc.h" #include "lz4/lz4hc.h"
@@ -89,6 +90,9 @@ static std::unordered_map<QString, Image::ColorSpace> colorSpaceToEnum;
static std::unordered_map<Image::ColorSpace, QString> colorSpaceToString; static std::unordered_map<Image::ColorSpace, QString> colorSpaceToString;
static std::unordered_map<int, size_t> vectorTypeSizes; static std::unordered_map<int, size_t> vectorTypeSizes;
static std::unordered_map<int, size_t> matrixTypeSizes; static std::unordered_map<int, size_t> matrixTypeSizes;
static DataBlock::CompressionCodec compressionCodecOverride = DataBlock::None;
static bool byteShuffleOverride = false;
static int compressionLevelOverride = -1;
static const std::unordered_map<QString, std::pair<QString, int>> fitsNameToPropertyIdTypeConvert = { static const std::unordered_map<QString, std::pair<QString, int>> fitsNameToPropertyIdTypeConvert = {
{"OBSERVER", {"Observer:Name", QMetaType::QString}}, {"OBSERVER", {"Observer:Name", QMetaType::QString}},
@@ -197,20 +201,22 @@ void DataBlock::decompress(const QByteArray &input, const QString &encoding)
attachmentPos = 0; attachmentPos = 0;
} }
void DataBlock::compress() void DataBlock::compress(int sampleFormatSize)
{ {
QByteArray tmp = data; QByteArray tmp = data;
uncompressedSize = data.size(); uncompressedSize = data.size();
byteShuffle(tmp, byteShuffling); byteShuffle(tmp, byteShuffleOverride ? sampleFormatSize : byteShuffling);
switch(codec) CompressionCodec useCodec = compressionCodecOverride != CompressionCodec::None ? compressionCodecOverride : codec;
int cLevel = compressionLevelOverride != -1 ? compressionLevelOverride : compressLevel;
switch(useCodec)
{ {
case None: case None:
data = tmp; data = tmp;
break; break;
case Zlib: case Zlib:
data = qCompress(tmp); data = qCompress(tmp, cLevel);
data.remove(0, sizeof(uint32_t)); data.remove(0, sizeof(uint32_t));
break; break;
case LZ4: case LZ4:
@@ -218,10 +224,10 @@ void DataBlock::compress()
{ {
int compSize = 0; int compSize = 0;
data.resize(LZ4_compressBound(tmp.size())); data.resize(LZ4_compressBound(tmp.size()));
if(codec == LZ4) if(useCodec == LZ4)
compSize = LZ4_compress_default(tmp.constData(), data.data(), tmp.size(), data.size()); compSize = LZ4_compress_default(tmp.constData(), data.data(), tmp.size(), data.size());
else else
compSize = LZ4_compress_HC(tmp.constData(), data.data(), tmp.size(), data.size(), LZ4HC_CLEVEL_DEFAULT); compSize = LZ4_compress_HC(tmp.constData(), data.data(), tmp.size(), data.size(), cLevel < 0 ? LZ4HC_CLEVEL_DEFAULT : cLevel);
if(compSize <= 0) if(compSize <= 0)
throw Error("LZ4 compression failed"); throw Error("LZ4 compression failed");
@@ -327,6 +333,7 @@ Image::SampleFormat Image::sampleFormat() const
void Image::setSampleFormat(SampleFormat newSampleFormat) void Image::setSampleFormat(SampleFormat newSampleFormat)
{ {
_sampleFormat = newSampleFormat; _sampleFormat = newSampleFormat;
if(_dataBlock.byteShuffling)_dataBlock.byteShuffling = sampleFormatSize(_sampleFormat);
_dataBlock.data.resize(_width * _height * _channelCount * sampleFormatSize(_sampleFormat)); _dataBlock.data.resize(_width * _height * _channelCount * sampleFormatSize(_sampleFormat));
} }
@@ -397,12 +404,12 @@ bool Image::addFITSKeywordAsProperty(const QString &name, const QVariant &value)
void *Image::imageData() void *Image::imageData()
{ {
return _dataBlock.data.data(); return _dataBlock.data.isNull() ? nullptr : _dataBlock.data.data();
} }
const void *Image::imageData() const const void *Image::imageData() const
{ {
return _dataBlock.data.data(); return _dataBlock.data.isNull() ? nullptr : _dataBlock.data.data();
} }
size_t Image::imageDataSize() const size_t Image::imageDataSize() const
@@ -584,13 +591,13 @@ int XISFReader::imagesCount() const
return _images.size(); return _images.size();
} }
const Image& XISFReader::getImage(uint32_t n) const Image& XISFReader::getImage(uint32_t n, bool readPixels)
{ {
if(n >= _images.size()) if(n >= _images.size())
throw Error("Out of bounds"); throw Error("Out of bounds");
Image &img = _images[n]; Image &img = _images[n];
if(img._dataBlock.attachmentPos) if(img._dataBlock.attachmentPos && readPixels)
{ {
_io->seek(img._dataBlock.attachmentPos); _io->seek(img._dataBlock.attachmentPos);
img._dataBlock.decompress(_io->read(img._dataBlock.attachmentSize)); img._dataBlock.decompress(_io->read(img._dataBlock.attachmentSize));
@@ -887,7 +894,7 @@ void XISFWriter::writeImage(const Image &image)
{ {
_images.push_back(image); _images.push_back(image);
_images.back()._dataBlock.attachmentPos = 1; _images.back()._dataBlock.attachmentPos = 1;
_images.back()._dataBlock.compress(); _images.back()._dataBlock.compress(image.sampleFormatSize(image.sampleFormat()));
} }
void XISFWriter::writeHeader() void XISFWriter::writeHeader()
@@ -1214,6 +1221,26 @@ struct Init
c.imag = s.rightRef(comma+1).toDouble(); c.imag = s.rightRef(comma+1).toDouble();
return c; return c;
}); });
QString compression = QProcessEnvironment::systemEnvironment().value("LIBXISF_COMPRESSION");
if(!compression.isEmpty())
{
if(compression.startsWith("zlib"))
compressionCodecOverride = DataBlock::Zlib;
else if(compression.startsWith("lz4hc"))
compressionCodecOverride = DataBlock::LZ4HC;
else if(compression.startsWith("lz4"))
compressionCodecOverride = DataBlock::LZ4;
if(compression.contains("+sh"))
byteShuffleOverride = true;
int index = compression.lastIndexOf(":");
if(index > 0)
{
compressionLevelOverride = compression.mid(index+1).toInt();
}
}
} }
}; };
+6 -2
View File
@@ -49,7 +49,7 @@ struct DataBlock
int compressLevel = -1; int compressLevel = -1;
QByteArray data; QByteArray data;
void decompress(const QByteArray &input, const QString &encoding = ""); void decompress(const QByteArray &input, const QString &encoding = "");
void compress(); void compress(int sampleFormatSize);
}; };
struct LIBXISF_EXPORT Property struct LIBXISF_EXPORT Property
@@ -227,7 +227,11 @@ public:
void close(); void close();
/** Return number of images inside file */ /** Return number of images inside file */
int imagesCount() const; int imagesCount() const;
const Image& getImage(uint32_t n); /** 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 */
const Image& getImage(uint32_t n, bool readPixels = true);
private: private:
void readXISFHeader(); void readXISFHeader();
void readSignature(); void readSignature();