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.

Reply via email to