diff options
author | Kim Woelders <kim@woelders.dk> | 2021-12-20 21:45:54 +0100 |
---|---|---|
committer | Kim Woelders <kim@woelders.dk> | 2021-12-28 16:08:06 +0100 |
commit | 503e8527c3db11355ca10544601626cbf9cb6a4a (patch) | |
tree | 16c4f36874d9450674b0553ddd32efd191bc418f | |
parent | c880edac55248a7314e9dd14fc68f4166b6ad531 (diff) | |
download | imlib2-503e8527c3db11355ca10544601626cbf9cb6a4a.tar.gz |
Add lzma loader
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/lib/loaders.c | 6 | ||||
-rw-r--r-- | src/modules/loaders/Makefile.am | 9 | ||||
-rw-r--r-- | src/modules/loaders/loader_lzma.c | 65 | ||||
-rw-r--r-- | test/images/icon-64.ff.xz | bin | 0 -> 10688 bytes | |||
-rw-r--r-- | test/test_load.cpp | 11 | ||||
-rw-r--r-- | test/test_load_2.cpp | 10 |
7 files changed, 102 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index 71c5305..a9e5c7e 100644 --- a/configure.ac +++ b/configure.ac @@ -210,6 +210,7 @@ loader_check_bz2() { } EC_LOADER_CHECK(BZ2, auto, bzip2, loader_check_bz2) +EC_LOADER_CHECK(LZMA, auto, liblzma) EC_LOADER_CHECK(ZLIB, auto, zlib) EC_LOADER_CHECK(ID3, auto, id3tag) @@ -277,6 +278,7 @@ echo " TIFF....................: $tiff_ok" echo " WEBP....................: $webp_ok" echo " Decompressors" echo " BZIP2...................: $bz2_ok" +echo " LZMA(XZ)................: $lzma_ok" echo " ZLIB....................: $zlib_ok" echo " Containers" echo " ID3.....................: $id3_ok" diff --git a/src/lib/loaders.c b/src/lib/loaders.c index 66a976a..1849677 100644 --- a/src/lib/loaders.c +++ b/src/lib/loaders.c @@ -50,6 +50,9 @@ static const char *const ext_xpm[] = { "xpm", NULL }; #ifdef BUILD_BZ2_LOADER static const char *const ext_bz2[] = { "bz2", NULL }; #endif +#ifdef BUILD_LZMA_LOADER +static const char *const ext_lzma[] = { "xz", "lzma", NULL }; +#endif #ifdef BUILD_ZLIB_LOADER static const char *const ext_zlib[] = { "gz", NULL }; #endif @@ -86,6 +89,9 @@ static const KnownLoader loaders_known[] = { #ifdef BUILD_BZ2_LOADER {"bz2", ext_bz2}, #endif +#ifdef BUILD_LZMA_LOADER + {"lzma", ext_lzma}, +#endif #ifdef BUILD_ZLIB_LOADER {"zlib", ext_zlib}, #endif diff --git a/src/modules/loaders/Makefile.am b/src/modules/loaders/Makefile.am index 5d027f4..29866fb 100644 --- a/src/modules/loaders/Makefile.am +++ b/src/modules/loaders/Makefile.am @@ -33,6 +33,9 @@ endif if BUILD_BZ2_LOADER pkg_LTLIBRARIES += bz2.la endif +if BUILD_LZMA_LOADER +pkg_LTLIBRARIES += lzma.la +endif if BUILD_ZLIB_LOADER pkg_LTLIBRARIES += zlib.la endif @@ -123,6 +126,12 @@ bz2_la_LDFLAGS = -module -avoid-version bz2_la_LIBADD = $(BZ2_LIBS) $(top_builddir)/src/lib/libImlib2.la bz2_la_LIBTOOLFLAGS = --tag=disable-static +lzma_la_SOURCES = loader_lzma.c decompress_load.c +lzma_la_CPPFLAGS = $(LZMA_CFLAGS) $(AM_CPPFLAGS) +lzma_la_LDFLAGS = -module -avoid-version +lzma_la_LIBADD = $(LZMA_LIBS) $(top_builddir)/src/lib/libImlib2.la +lzma_la_LIBTOOLFLAGS = --tag=disable-static + zlib_la_SOURCES = loader_zlib.c decompress_load.c zlib_la_CPPFLAGS = $(ZLIB_CFLAGS) $(AM_CPPFLAGS) zlib_la_LDFLAGS = -module -avoid-version diff --git a/src/modules/loaders/loader_lzma.c b/src/modules/loaders/loader_lzma.c new file mode 100644 index 0000000..f74c39a --- /dev/null +++ b/src/modules/loaders/loader_lzma.c @@ -0,0 +1,65 @@ +#include "loader_common.h" + +#include <lzma.h> + +#define OUTBUF_SIZE 16484 + +static int +uncompress_file(const void *fdata, unsigned int fsize, int dest) +{ + int ok; + lzma_stream strm = LZMA_STREAM_INIT; + lzma_ret ret; + uint8_t outbuf[OUTBUF_SIZE]; + unsigned int bytes; + + ok = 0; + + ret = lzma_auto_decoder(&strm, UINT64_MAX, 0); + if (ret != LZMA_OK) + return ok; + + strm.next_in = fdata; + strm.avail_in = fsize; + + for (;;) + { + strm.next_out = outbuf; + strm.avail_out = sizeof(outbuf); + + ret = lzma_code(&strm, 0); + + if (ret != LZMA_OK && ret != LZMA_STREAM_END) + goto quit; + + bytes = sizeof(outbuf) - strm.avail_out; + if (write(dest, outbuf, bytes) != bytes) + goto quit; + + if (ret == LZMA_STREAM_END) + break; + } + + ok = 1; + + quit: + lzma_end(&strm); + + return ok; +} + +static const char *const list_formats[] = { "xz", "lzma" }; + +int +load2(ImlibImage * im, int load_data) +{ + + return decompress_load(im, load_data, list_formats, ARRAY_SIZE(list_formats), + uncompress_file); +} + +void +formats(ImlibLoader * l) +{ + __imlib_LoaderSetFormats(l, list_formats, ARRAY_SIZE(list_formats)); +} diff --git a/test/images/icon-64.ff.xz b/test/images/icon-64.ff.xz Binary files differnew file mode 100644 index 0000000..8181338 --- /dev/null +++ b/test/images/icon-64.ff.xz diff --git a/test/test_load.cpp b/test/test_load.cpp index 92a4a8b..b15fe9a 100644 --- a/test/test_load.cpp +++ b/test/test_load.cpp @@ -3,6 +3,8 @@ #include <Imlib2.h> #include <fcntl.h> +#include "config.h" + int debug = 0; #define D(...) if (debug) printf(__VA_ARGS__) @@ -18,7 +20,6 @@ int debug = 0; static const char *const pfxs[] = { "argb", "bmp", - "ff.bz2", // bz2 "ff", "gif", "ico", @@ -33,7 +34,15 @@ static const char *const pfxs[] = { "webp", "xbm", "xpm", +#ifdef BUILD_BZ2_LOADER + "ff.bz2", // bz2 +#endif +#ifdef BUILD_ZLIB_LOADER "ff.gz", // zlib +#endif +#ifdef BUILD_LZMA_LOADER + "ff.xz", // lzma +#endif }; #define N_PFX (sizeof(pfxs) / sizeof(char*)) diff --git a/test/test_load_2.cpp b/test/test_load_2.cpp index efc30a0..59b10ac 100644 --- a/test/test_load_2.cpp +++ b/test/test_load_2.cpp @@ -4,6 +4,8 @@ #include <fcntl.h> #include <zlib.h> +#include "config.h" + int debug = 0; #define D(...) if (debug) printf(__VA_ARGS__) @@ -24,7 +26,15 @@ static tii_t tii[] = { { "icon-64.argb", 1153555547 }, { "icon-64.bmp", 1153555547 }, { "icon-64.ff", 1153555547 }, +#ifdef BUILD_BZ2_LOADER { "icon-64.ff.bz2", 1153555547 }, +#endif +#ifdef BUILD_ZLIB_LOADER + { "icon-64.ff.gz", 1153555547 }, +#endif +#ifdef BUILD_LZMA_LOADER + { "icon-64.ff.xz", 1153555547 }, +#endif { "icon-64.gif", 1768448874 }, { "icon-64.ico", 1153555547 }, { "icon-64.ilbm", 1153555547 }, |