This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch master
in repository legacy-imlib2.
View the commit online.
commit 59ab21a580547b62bb1698c62d207256101e428e
Author: Kim Woelders <k...@woelders.dk>
AuthorDate: Wed Jun 28 20:46:31 2023 +0200
Add new raw loader
https://git.enlightenment.org/old/legacy-imlib2/issues/10
---
configure.ac | 2 +
src/lib/loaders.c | 8 +++
src/modules/loaders/Makefile.am | 9 +++
src/modules/loaders/loader_raw.c | 131 +++++++++++++++++++++++++++++++++++++++
4 files changed, 150 insertions(+)
diff --git a/configure.ac b/configure.ac
index c2e09b7..245dd06 100644
--- a/configure.ac
+++ b/configure.ac
@@ -222,6 +222,7 @@ EC_LOADER_CHECK(J2K, auto, libopenjp2)
EC_LOADER_CHECK(JXL, auto, libjxl libjxl_threads)
EC_LOADER_CHECK(PNG, auto, libpng)
EC_LOADER_CHECK(PS, auto, libspectre)
+EC_LOADER_CHECK(RAW, auto, libraw)
EC_LOADER_CHECK(SVG, auto, librsvg-2.0 >= 2.46)
EC_LOADER_CHECK(TIFF, auto, libtiff-4)
EC_LOADER_CHECK(WEBP, auto, libwebpdemux)
@@ -316,6 +317,7 @@ echo " J2K.....................: $j2k_ok"
echo " JXL.....................: $jxl_ok"
echo " PNG.....................: $png_ok"
echo " PS......................: $ps_ok"
+echo " RAW.....................: $raw_ok"
echo " SVG.....................: $svg_ok"
echo " TIFF....................: $tiff_ok"
echo " WEBP....................: $webp_ok"
diff --git a/src/lib/loaders.c b/src/lib/loaders.c
index 8772bda..9e37a24 100644
--- a/src/lib/loaders.c
+++ b/src/lib/loaders.c
@@ -54,6 +54,11 @@ static const char *const ext_qoi[] = { "qoi", NULL };
#ifdef BUILD_PS_LOADER
static const char *const ext_ps[] = { "ps", "eps", NULL };
#endif
+#ifdef BUILD_RAW_LOADER
+static const char *const ext_raw[] = { "raw",
+ "arw", "cr2", "dcr", "dng", "nef", "orf", "raf", "rw2", "rwl", "srw", NULL
+};
+#endif
#ifdef BUILD_SVG_LOADER
static const char *const ext_svg[] = { "svg", NULL };
#endif
@@ -111,6 +116,9 @@ static const KnownLoader loaders_known[] = {
#endif
#ifdef BUILD_PS_LOADER
{"ps", ext_ps},
+#endif
+#ifdef BUILD_RAW_LOADER
+ {"raw", ext_raw},
#endif
{"pnm", ext_pnm},
{"qoi", ext_qoi},
diff --git a/src/modules/loaders/Makefile.am b/src/modules/loaders/Makefile.am
index 151e89c..946d24a 100644
--- a/src/modules/loaders/Makefile.am
+++ b/src/modules/loaders/Makefile.am
@@ -38,6 +38,9 @@ endif
if BUILD_PS_LOADER
pkg_LTLIBRARIES += ps.la
endif
+if BUILD_RAW_LOADER
+pkg_LTLIBRARIES += raw.la
+endif
if BUILD_SVG_LOADER
pkg_LTLIBRARIES += svg.la
endif
@@ -141,6 +144,12 @@ ps_la_LDFLAGS = -module -avoid-version
ps_la_LIBADD = $(PS_LIBS) $(top_builddir)/src/lib/libImlib2.la
ps_la_LIBTOOLFLAGS = --tag=disable-static
+raw_la_SOURCES = loader_raw.c
+raw_la_CPPFLAGS = $(RAW_CFLAGS) $(AM_CPPFLAGS)
+raw_la_LDFLAGS = -module -avoid-version
+raw_la_LIBADD = $(RAW_LIBS) $(top_builddir)/src/lib/libImlib2.la
+raw_la_LIBTOOLFLAGS = --tag=disable-static
+
qoi_la_SOURCES = loader_qoi.c
qoi_la_LDFLAGS = -module -avoid-version
qoi_la_LIBADD = $(top_builddir)/src/lib/libImlib2.la
diff --git a/src/modules/loaders/loader_raw.c b/src/modules/loaders/loader_raw.c
new file mode 100644
index 0000000..77cb7d3
--- /dev/null
+++ b/src/modules/loaders/loader_raw.c
@@ -0,0 +1,131 @@
+#include "config.h"
+#include "Imlib2_Loader.h"
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-prototypes"
+#include <libraw.h>
+#pragma GCC diagnostic pop
+
+#define DBG_PFX "LDR-raw"
+
+static const char *const _formats[] = { "raw",
+ "arw", "cr2", "dcr", "dng", "nef", "orf", "raf", "rw2", "rwl", "srw"
+};
+
+#define _LIBRAW_ERROR(err) (err != LIBRAW_SUCCESS && LIBRAW_FATAL_ERROR(err))
+
+/* Purely based on inspection of some raw file samples */
+static int
+_sig_check(const uint8_t * data, unsigned int size)
+{
+ if (size < 1024)
+ return 1; /* Not likely */
+
+ if ((data[0] == 'I' && data[1] == 'I') || (data[0] == 'M' && data[1] == 'M'))
+ return 0; /* Ok - TIFF-like */
+
+ if (memcmp(data, "FUJI", 4) == 0)
+ return 0; /* Ok - May be Fuji raw */
+
+ return 1;
+}
+
+static int
+_load(ImlibImage * im, int load_data)
+{
+ int rc, err;
+ libraw_data_t *raw_data;
+ libraw_processed_image_t *image;
+ int i, j;
+ uint8_t *imdata;
+ const uint8_t *bufptr;
+
+ rc = LOAD_FAIL;
+ raw_data = NULL;
+ image = NULL;
+
+ /* Signature check (avoid LibRaw constructor) */
+ if (_sig_check(im->fi->fdata, im->fi->fsize))
+ goto quit;
+
+ raw_data = libraw_init(0);
+ if (!raw_data)
+ goto quit;
+
+#if 0 /* TBD - Gives rather large speedup */
+ raw_data->params.half_size = 1;
+#endif
+
+ err = libraw_open_buffer(raw_data, im->fi->fdata, im->fi->fsize);
+ if (_LIBRAW_ERROR(err))
+ goto quit;
+
+ if (!load_data)
+ {
+ err = libraw_adjust_sizes_info_only(raw_data);
+ if (_LIBRAW_ERROR(err))
+ goto quit;
+
+ im->w = raw_data->sizes.iwidth;
+ im->h = raw_data->sizes.iheight;
+ D("size = %dx%d\n", im->w, im->h);
+
+ if (!IMAGE_DIMENSIONS_OK(im->w, im->h))
+ goto quit;
+ QUIT_WITH_RC(LOAD_SUCCESS);
+ }
+
+ /* Load data */
+
+ err = libraw_unpack(raw_data);
+ if (_LIBRAW_ERROR(err))
+ goto quit;
+
+ err = libraw_dcraw_process(raw_data);
+ if (_LIBRAW_ERROR(err))
+ goto quit;
+
+ image = libraw_dcraw_make_mem_image(raw_data, &err);
+ if (!image)
+ goto quit;
+
+ im->w = image->width;
+ im->h = image->height;
+ D("Colors=%d size = %dx%d\n", image->colors, im->w, im->h);
+
+ if (!IMAGE_DIMENSIONS_OK(im->w, im->h))
+ goto quit;
+
+ if (image->colors != 3)
+ goto quit;
+
+ if (!__imlib_AllocateData(im))
+ QUIT_WITH_RC(LOAD_OOM);
+
+ imdata = (uint8_t *) im->data;
+ bufptr = image->data;
+ for (i = 0; i < im->h; i++)
+ {
+ for (j = 0; j < im->w; j++, imdata += 4, bufptr += 3)
+ {
+ imdata[0] = bufptr[2];
+ imdata[1] = bufptr[1];
+ imdata[2] = bufptr[0];
+ imdata[3] = 0xff;
+ }
+
+ if (im->lc && __imlib_LoadProgressRows(im, i, 1))
+ QUIT_WITH_RC(LOAD_BREAK);
+ }
+
+ rc = LOAD_SUCCESS;
+
+ quit:
+ free(image);
+ if (raw_data)
+ libraw_close(raw_data);
+
+ return rc;
+}
+
+IMLIB_LOADER(_formats, _load, NULL);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.