forked from enlightenment/efl
evas_generic_loader: Add raw image format loader. There are dozens of raw photo formats: CRW, CR2, MRW, NEF, RAF, etc. 'RAW Format' does not exist; it is an illusion created by dcraw's ability to read all raw formats. So I use libraw who was nearest of dcraw. So we have more formats supported (foveon) and better rendering (default icc profile from camera) as libopenraw provides. shm_file seems doesn't work if someone want to fix it... I'm on
SVN revision: 59679
This commit is contained in:
parent
501f779c15
commit
f7bceaf9e1
|
@ -1,4 +1,4 @@
|
|||
y##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
|
||||
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
|
||||
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
|
||||
m4_define([v_maj], [0])
|
||||
m4_define([v_min], [1])
|
||||
|
@ -64,8 +64,11 @@ PKG_CHECK_MODULES([POPPLER], [poppler >= 0.12], [have_poppler="yes"], [have_popp
|
|||
|
||||
PKG_CHECK_MODULES([SPECTRE], [libspectre], [have_ps="yes"], [have_ps="no"])
|
||||
|
||||
PKG_CHECK_MODULES([LIBRAW], [libraw], [have_raw="yes"], [have_raw="no"])
|
||||
|
||||
AM_CONDITIONAL([HAVE_PDF], [test "x${have_poppler}" = "xyes"])
|
||||
AM_CONDITIONAL([HAVE_PS], [test "x${have_ps}" = "xyes"])
|
||||
AM_CONDITIONAL(HAVE_RAW, test "x${have_raw}" = "xyes")
|
||||
|
||||
### Checks for header files
|
||||
|
||||
|
@ -116,6 +119,7 @@ src/Makefile
|
|||
src/bin/Makefile
|
||||
src/bin/common/Makefile
|
||||
src/bin/xcf/Makefile
|
||||
src/bin/raw/Makefile
|
||||
src/bin/pdf/Makefile
|
||||
src/bin/ps/Makefile
|
||||
])
|
||||
|
@ -139,6 +143,7 @@ echo "Loaders:"
|
|||
echo " XCF..................: yes"
|
||||
echo " PDF..................: ${have_poppler}"
|
||||
echo " PS...................: ${have_ps}"
|
||||
echo " RAW..................: ${have_raw}"
|
||||
echo
|
||||
echo "Compilation............: make (or gmake)"
|
||||
echo " CPPFLAGS.............: $CPPFLAGS"
|
||||
|
|
|
@ -7,6 +7,10 @@ if HAVE_PDF
|
|||
SUBDIRS += pdf
|
||||
endif
|
||||
|
||||
if HAVE_RAW
|
||||
SUBDIRS += raw
|
||||
endif
|
||||
|
||||
if HAVE_PS
|
||||
SUBDIRS += ps
|
||||
endif
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/bin \
|
||||
-I$(top_srcdir)/src/bin/common \
|
||||
-I$(top_srcdir)/src/bin/raw \
|
||||
-DPACKAGE_BIN_DIR=\"$(bindir)\" \
|
||||
-DPACKAGE_LIB_DIR=\"$(libdir)\" \
|
||||
-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
|
||||
@EINA_CFLAGS@
|
||||
|
||||
if HAVE_RAW
|
||||
bin_PROGRAMS = evas_image_loader.raw
|
||||
|
||||
evas_image_loader_raw_SOURCES = main.c $(top_srcdir)/src/bin/common/shmfile.c
|
||||
evas_image_loader_raw_CFLAGS = @LIBRAW_CFLAGS@
|
||||
evas_image_loader_raw_LDADD = @SHM_OPEN_LIBS@ @LIBRAW_LIBS@
|
||||
evas_image_loader_raw_LDFLAGS =
|
||||
endif
|
||||
|
||||
install-data-hook:
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.arw
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.cr2
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.crw
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.dcr
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.dng
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.k25
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.kdc
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.erf
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.mrw
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.nef
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.nrf
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.nrw
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.orf
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.rw2
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.pef
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.raf
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.sr2
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.srf
|
||||
ln -sf evas_image_loader.raw $(DESTDIR)$(bindir)/evas_image_loader.x3f
|
|
@ -0,0 +1,205 @@
|
|||
#include "config.h"
|
||||
#include <fcntl.h>
|
||||
#include <netinet/in.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <libraw.h>
|
||||
#include "shmfile.h"
|
||||
|
||||
#define DATA32 unsigned int
|
||||
#define DATA8 unsigned char
|
||||
|
||||
#define ARGB_JOIN(a,r,g,b) \
|
||||
(((a) << 24) + ((r) << 16) + ((g) << 8) + (b))
|
||||
|
||||
//#define RAW_DBG 1
|
||||
|
||||
#ifdef RAW_DBG
|
||||
#define D(fmt, args...) fprintf(stderr, fmt, ## args)
|
||||
#else
|
||||
#define D(fmt, args...)
|
||||
#endif
|
||||
|
||||
|
||||
static int
|
||||
read_raw_header(unsigned char *seg, int size, libraw_data_t *raw_data, int *w, int *h)
|
||||
{
|
||||
int ret;
|
||||
|
||||
D("raw_open_buffer\n");
|
||||
if ((ret = libraw_open_buffer(raw_data, seg, size)) != LIBRAW_SUCCESS)
|
||||
return 0;
|
||||
|
||||
D("raw_adjust_size\n");
|
||||
if ((ret = libraw_adjust_sizes_info_only(raw_data)) != LIBRAW_SUCCESS)
|
||||
{
|
||||
if (LIBRAW_FATAL_ERROR(ret))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((raw_data->sizes.width < 1) || (raw_data->sizes.height < 1))
|
||||
return 0;
|
||||
|
||||
*w = raw_data->sizes.iwidth;
|
||||
*h = raw_data->sizes.iheight;
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
read_raw_data(unsigned char* seg, int size, libraw_data_t *raw_data, int *w, int *h)
|
||||
{
|
||||
int ret, count;
|
||||
libraw_processed_image_t *image = NULL;
|
||||
DATA8 *bufptr;
|
||||
DATA32 *dataptr;
|
||||
|
||||
raw_data->params.half_size = 0;
|
||||
raw_data->params.user_qual = 2;
|
||||
|
||||
D("raw_open_buffer\n");
|
||||
if ((ret = libraw_open_buffer(raw_data, seg, size)) != LIBRAW_SUCCESS)
|
||||
return 0;
|
||||
|
||||
D("raw_open_unpack\n");
|
||||
if ((ret = libraw_unpack(raw_data)) != LIBRAW_SUCCESS)
|
||||
return 0;
|
||||
|
||||
D("raw_dcraw_process\n");
|
||||
if ((ret = libraw_dcraw_process(raw_data)) != LIBRAW_SUCCESS)
|
||||
{
|
||||
if (LIBRAW_FATAL_ERROR(ret))
|
||||
return 0;;
|
||||
}
|
||||
|
||||
D("raw_make_mem_image\n");
|
||||
image = libraw_dcraw_make_mem_image(raw_data, &ret);
|
||||
if (image)
|
||||
{
|
||||
if ((image->width < 1) || (image->height < 1))
|
||||
goto clean_image;
|
||||
*w = image->width;
|
||||
*h = image->height;
|
||||
// shm_alloc(image->width * image->height * (sizeof(DATA32)));
|
||||
// if (!shm_addr)
|
||||
// goto clean_image;
|
||||
shm_addr = malloc(image->width * image->height * (sizeof(DATA32)));
|
||||
memset(shm_addr, 0, image->width * image->height * (sizeof(DATA32)));
|
||||
if (image->type != LIBRAW_IMAGE_BITMAP)
|
||||
goto clean_image;
|
||||
if (image->colors != 3)
|
||||
goto clean_image;
|
||||
#define SWAP(a, b) { a ^= b; a = (b ^=a); }
|
||||
if ((image->bits == 16) && (htons(0x55aa) != 0x55aa))
|
||||
for (count = 0; count < image->data_size; count +=2)
|
||||
SWAP(image->data[count], image->data[count + 1]);
|
||||
#undef SWAP
|
||||
dataptr = shm_addr;
|
||||
bufptr = image->data;
|
||||
for (count = image->width * image->height; count > 0; --count)
|
||||
{
|
||||
*dataptr = ARGB_JOIN(0xff, bufptr[0], bufptr[1], bufptr[2]);
|
||||
dataptr++;
|
||||
bufptr += 3;
|
||||
}
|
||||
|
||||
free(image);
|
||||
}
|
||||
return 1;
|
||||
|
||||
clean_image:
|
||||
free(image);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *file;
|
||||
int i;
|
||||
int w = 0, h = 0;
|
||||
int head_only = 0;
|
||||
int fd;
|
||||
struct stat ss;
|
||||
unsigned char *seg = MAP_FAILED;
|
||||
libraw_data_t *raw_data = NULL;
|
||||
|
||||
if (argc < 2) return -1;
|
||||
file = argv[1];
|
||||
|
||||
for (i = 2; i < argc; ++i)
|
||||
{
|
||||
if (!strcmp(argv[i], "-head"))
|
||||
head_only = 1;
|
||||
else if (!strcmp(argv[i], "-key"))
|
||||
{ // not used by raw loader
|
||||
i++;
|
||||
// const char *key = argv[i];
|
||||
}
|
||||
else if (!strcmp(argv[i], "-opt-scale-down-by"))
|
||||
{ // not used by raw loader
|
||||
i++;
|
||||
// int scale_down = atoi(argv[i]);
|
||||
}
|
||||
else if (!strcmp(argv[i], "-opt-dpi"))
|
||||
{ // not used by raw loader
|
||||
i++;
|
||||
// double dpi = ((double)atoi(argv[i])) / 1000.0;
|
||||
}
|
||||
else if (!strcmp(argv[i], "-opt-size"))
|
||||
{ // not used by raw loader
|
||||
i++;
|
||||
// int size_w = atoi(argv[i]);
|
||||
i++;
|
||||
// int size_h = atoi(argv[i]);
|
||||
}
|
||||
}
|
||||
|
||||
fd = open(file, O_RDONLY);
|
||||
if (fd < 0) return 0;
|
||||
if (stat(file, &ss)) goto close_file;
|
||||
seg = mmap(0, ss.st_size, PROT_READ, MAP_SHARED, fd, 0);
|
||||
if (seg == MAP_FAILED) goto close_file;
|
||||
|
||||
D("raw_init\n");
|
||||
raw_data = libraw_init(0);
|
||||
|
||||
if (head_only != 0)
|
||||
{
|
||||
if (read_raw_header(seg, ss.st_size, raw_data, &w, &h))
|
||||
printf("size %d %d\n", w, h);
|
||||
printf("done\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (read_raw_data(seg, ss.st_size, raw_data, &w, &h))
|
||||
{
|
||||
printf("size %d %d\n", w, h);
|
||||
printf("alpha 1\n");
|
||||
|
||||
if (shm_fd >= 0) printf("shm file %s\n", shmfile);
|
||||
else
|
||||
{
|
||||
printf("data\n");
|
||||
fwrite(shm_addr, w * h * sizeof(DATA32), 1, stdout);
|
||||
}
|
||||
shm_free();
|
||||
}
|
||||
}
|
||||
D("raw_shutdown\n");
|
||||
if (raw_data)
|
||||
libraw_close(raw_data);
|
||||
if (seg != MAP_FAILED) munmap(seg, ss.st_size);
|
||||
close(fd);
|
||||
return 0;
|
||||
|
||||
close_file:
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue