diff --git a/CMakeLists.txt b/CMakeLists.txt
index cd1d4d7..6bc9a2d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,38 +9,53 @@ set(CMAKE_C_VISIBILITY_PRESET hidden)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
+option(USE_BUNDLED_LIBS "Use bundled LZ4 PugiXML and Zlib" ON)
+
+if(USE_BUNDLED_LIBS)
+set(THIRD_PARTY_SRC
+ lz4/lz4.c
+ lz4/lz4.h
+ lz4/lz4hc.c
+ lz4/lz4hc.h
+ pugixml/pugixml.cpp
+ zlib/adler32.c
+ zlib/compress.c
+ zlib/crc32.c
+ zlib/deflate.c
+ zlib/gzclose.c
+ zlib/gzlib.c
+ zlib/gzread.c
+ zlib/gzwrite.c
+ zlib/inflate.c
+ zlib/infback.c
+ zlib/inftrees.c
+ zlib/inffast.c
+ zlib/trees.c
+ zlib/uncompr.c
+ zlib/zutil.c)
+else(USE_BUNDLED_LIBS)
+ find_package(PkgConfig REQUIRED)
+ pkg_check_modules(LZ4 liblz4 IMPORTED_TARGET REQUIRED)
+ pkg_check_modules(PUGIXML pugixml IMPORTED_TARGET REQUIRED)
+ pkg_check_modules(ZLIB zlib IMPORTED_TARGET REQUIRED)
+endif(USE_BUNDLED_LIBS)
add_library(XISF
bytearray.cpp
- bytearray.h
libXISF_global.h
libxisf.cpp
libxisf.h
utils.cpp
variant.cpp
- variant.h
- lz4/lz4.c
- lz4/lz4.h
- lz4/lz4hc.c
- lz4/lz4hc.h
- pugixml/pugixml.cpp
- zlib/adler32.c
- zlib/compress.c
- zlib/crc32.c
- zlib/deflate.c
- zlib/gzclose.c
- zlib/gzlib.c
- zlib/gzread.c
- zlib/gzwrite.c
- zlib/inflate.c
- zlib/infback.c
- zlib/inftrees.c
- zlib/inffast.c
- zlib/trees.c
- zlib/uncompr.c
- zlib/zutil.c
+ ${THIRD_PARTY_SRC}
)
+if(USE_BUNDLED_LIBS)
+ target_include_directories(XISF PRIVATE lz4 pugixml zlib)
+else(USE_BUNDLED_LIBS)
+ target_link_libraries(XISF PUBLIC PkgConfig::LZ4 PkgConfig::PUGIXML PkgConfig::ZLIB)
+endif(USE_BUNDLED_LIBS)
+
set_target_properties(XISF PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR})
if(BUILD_SHARED_LIBS)
diff --git a/bytearray.h b/bytearray.h
deleted file mode 100644
index 92bfb50..0000000
--- a/bytearray.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/************************************************************************
- * LibXISF - library to load and save XISF files *
- * Copyright (C) 2023 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 .*
- ************************************************************************/
-
-#ifndef LIBXISF_BYTEARRAY_H
-#define LIBXISF_BYTEARRAY_H
-
-namespace LibXISF
-{
-
-
-
-}
-
-#endif // LIBXISF_BYTEARRAY_H
diff --git a/libxisf.cpp b/libxisf.cpp
index d35ef03..660e7f5 100644
--- a/libxisf.cpp
+++ b/libxisf.cpp
@@ -23,10 +23,10 @@
#include
#include
#include
-#include "lz4/lz4.h"
-#include "lz4/lz4hc.h"
-#include "pugixml/pugixml.hpp"
-#include "zlib/zlib.h"
+#include
+#include
+#include
+#include
namespace LibXISF
{
diff --git a/libxisf.h b/libxisf.h
index 5dae177..2587299 100644
--- a/libxisf.h
+++ b/libxisf.h
@@ -25,7 +25,10 @@
#include
#include
#include
-#include "variant.h"
+#include
+#include
+#include
+#include
namespace LibXISF
{
@@ -64,6 +67,103 @@ public:
void decodeHex();
};
+struct Complex32
+{
+ float real;
+ float imag;
+};
+
+struct Complex64
+{
+ double real;
+ double imag;
+};
+
+template
+class Matrix
+{
+ int _rows = 0;
+ int _cols = 0;
+ std::vector _elem;
+public:
+ using value_type = T;
+
+ Matrix() = default;
+ Matrix(int rows, int cols) : _rows(rows), _cols(cols), _elem(rows * cols) {}
+ void resize(int rows, int cols) { _rows = rows; _cols = cols; _elem.resize(rows * cols); }
+ T& operator()(int row, int col) { return _elem[row * _cols + col]; }
+ const T& operator()(int row, int col) const { return _elem[row * _cols + col]; }
+ int rows() const { return _rows; }
+ int cols() const { return _cols; }
+};
+
+typedef bool Boolean;
+typedef int8_t Int8;
+typedef uint8_t UInt8;
+typedef int16_t Int16;
+typedef uint16_t UInt16;
+typedef int32_t Int32;
+typedef uint32_t UInt32;
+typedef int64_t Int64;
+typedef uint64_t UInt64;
+typedef float Float32;
+typedef double Float64;
+typedef std::string String;
+typedef std::tm TimePoint;
+typedef std::vector I8Vector;
+typedef std::vector UI8Vector;
+typedef std::vector I16Vector;
+typedef std::vector UI16Vector;
+typedef std::vector I32Vector;
+typedef std::vector UI32Vector;
+typedef std::vector I64Vector;
+typedef std::vector UI64Vector;
+typedef std::vector F32Vector;
+typedef std::vector F64Vector;
+typedef std::vector C32Vector;
+typedef std::vector C64Vector;
+typedef Matrix I8Matrix;
+typedef Matrix UI8Matrix;
+typedef Matrix I16Matrix;
+typedef Matrix UI16Matrix;
+typedef Matrix I32Matrix;
+typedef Matrix UI32Matrix;
+typedef Matrix I64Matrix;
+typedef Matrix UI64Matrix;
+typedef Matrix F32Matrix;
+typedef Matrix F64Matrix;
+typedef Matrix C32Matrix;
+typedef Matrix C64Matrix;
+
+class Variant
+{
+ using StdVariant = std::variant;
+ StdVariant _value;
+public:
+ enum class Type
+ {
+ Monostate, Boolean, Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float32, Float64,
+ Complex32, Complex64, String, TimePoint,
+ I8Vector, UI8Vector, I16Vector, UI16Vector, I32Vector, UI32Vector, I64Vector, UI64Vector, F32Vector, F64Vector, C32Vector, C64Vector,
+ I8Matrix, UI8Matrix, I16Matrix, UI16Matrix, I32Matrix, UI32Matrix, I64Matrix, UI64Matrix, F32Matrix, F64Matrix, C32Matrix, C64Matrix
+ };
+
+ Variant() = default;
+ template
+ Variant(const T &t) : _value(t) {}
+ Type type() const;
+ const char *typeName() const;
+ template
+ T& value() { return std::get(_value); }
+ template
+ const T& value() const { return std::get(_value); }
+ template
+ void setValue(const T& val) { _value = val; }
+};
+
struct LIBXISF_EXPORT DataBlock
{
enum CompressionCodec
diff --git a/variant.cpp b/variant.cpp
index 9a3b967..215abbb 100644
--- a/variant.cpp
+++ b/variant.cpp
@@ -16,7 +16,6 @@
* along with this program. If not, see .*
************************************************************************/
-#include "variant.h"
#include
#include
#include