diff --git a/libxisf.cpp b/libxisf.cpp index 25980f9..b741d40 100644 --- a/libxisf.cpp +++ b/libxisf.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -486,7 +487,38 @@ DataBlock::CompressionCodec Image::compression() const void Image::setCompression(DataBlock::CompressionCodec compression, int level) { _dataBlock.codec = compression; - _dataBlock.compressLevel = level; + _dataBlock.compressLevel = -1; + + 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 diff --git a/libxisf.h b/libxisf.h index 089de20..0442694 100644 --- a/libxisf.h +++ b/libxisf.h @@ -317,6 +317,11 @@ public: const T* imageData() const { return static_cast(imageData()); } size_t imageDataSize() 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); bool byteShuffling() const; void setByteshuffling(bool enable);