Evas: Add DDS image file loader

@feature: Add a Micrsoft DirectDraw Surface file loader
This commit is contained in:
Jean-Philippe Andre 2014-06-18 17:55:44 +09:00
parent e239f8f4de
commit c424153867
5 changed files with 204 additions and 0 deletions

View File

@ -1553,6 +1553,7 @@ ARG_ENABLE_EVAS_IMAGE_LOADER(WBMP, static)
ARG_ENABLE_EVAS_IMAGE_LOADER(WEBP, no)
ARG_ENABLE_EVAS_IMAGE_LOADER(XPM, static)
ARG_ENABLE_EVAS_IMAGE_LOADER(TGV, static)
ARG_ENABLE_EVAS_IMAGE_LOADER(DDS, static)
### Default values
@ -1843,6 +1844,7 @@ EVAS_CHECK_IMAGE_LOADER([WBMP], [${want_evas_image_loader_wbmp}])
EVAS_CHECK_IMAGE_LOADER([WEBP], [${want_evas_image_loader_webp}])
EVAS_CHECK_IMAGE_LOADER([XPM], [${want_evas_image_loader_xpm}])
EVAS_CHECK_IMAGE_LOADER([TGV], [${want_evas_image_loader_tgv}])
EVAS_CHECK_IMAGE_LOADER([DDS], [${want_evas_image_loader_tgv}])
EFL_EVAL_PKGS([EVAS])
@ -2050,6 +2052,8 @@ if test "x${build_gui}" = "xno"; then
AM_CONDITIONAL([EVAS_STATIC_BUILD_XPM], [false])
AM_CONDITIONAL([BUILD_LOADER_TGV], [false])
AM_CONDITIONAL([EVAS_STATIC_BUILD_TGV], [false])
AM_CONDITIONAL([BUILD_LOADER_DDS], [false])
AM_CONDITIONAL([EVAS_STATIC_BUILD_DDS], [false])
AM_CONDITIONAL([EVAS_CSERVE2], [false])
fi

View File

@ -42,6 +42,22 @@ AS_IF([test "x${have_dep}" = "xyes"], [$3], [$4])
])
dnl use: EVAS_CHECK_LOADER_DEP_DDS(loader, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
AC_DEFUN([EVAS_CHECK_LOADER_DEP_DDS],
[
have_dep="yes"
evas_image_loader_[]$1[]_cflags=""
evas_image_loader_[]$1[]_libs=""
AC_SUBST([evas_image_loader_$1_cflags])
AC_SUBST([evas_image_loader_$1_libs])
AS_IF([test "x${have_dep}" = "xyes"], [$3], [$4])
])
dnl use: EVAS_CHECK_LOADER_DEP_EET(loader, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
AC_DEFUN([EVAS_CHECK_LOADER_DEP_EET],

View File

@ -1372,6 +1372,33 @@ modules_evas_loaders_bmp_module_la_LIBTOOLFLAGS = --tag=disable-static
endif
endif
if BUILD_LOADER_DDS
if EVAS_STATIC_BUILD_DDS
lib_evas_libevas_la_SOURCES += modules/evas/loaders/dds/evas_image_load_dds.c
lib_evas_libevas_la_CPPFLAGS += @evas_image_loader_dds_cflags@
lib_evas_libevas_la_LIBADD += @evas_image_loader_dds_libs@
if EVAS_CSERVE2
bin_evas_evas_cserve2_slave_SOURCES += modules/evas/loaders/dds/evas_image_load_dds.c
bin_evas_evas_cserve2_slave_CPPFLAGS += @evas_image_loader_dds_cflags@
bin_evas_evas_cserve2_slave_LDADD += @evas_image_loader_dds_libs@
endif
else
loaderddspkgdir = $(libdir)/evas/modules/loaders/dds/$(MODULE_ARCH)
loaderddspkg_LTLIBRARIES = modules/evas/loaders/dds/module.la
modules_evas_loaders_dds_module_la_SOURCES = modules/evas/loaders/dds/evas_image_load_dds.c
modules_evas_loaders_dds_module_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl \
-I$(top_srcdir)/src/lib/evas/include \
@EVAS_CFLAGS@ \
@evas_image_loader_dds_cflags@
modules_evas_loaders_dds_module_la_LIBADD = \
@USE_EVAS_LIBS@ \
@evas_image_loader_dds_libs@
modules_evas_loaders_dds_module_la_DEPENDENCIES = @USE_EVAS_INTERNAL_LIBS@
modules_evas_loaders_dds_module_la_LDFLAGS = -module @EFL_LTMODULE_FLAGS@
modules_evas_loaders_dds_module_la_LIBTOOLFLAGS = --tag=disable-static
endif
endif
if BUILD_LOADER_EET
if EVAS_STATIC_BUILD_EET
lib_evas_libevas_la_SOURCES += modules/evas/loaders/eet/evas_image_load_eet.c modules/evas/savers/eet/evas_image_save_eet.c

View File

@ -125,6 +125,7 @@ EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_x11);
#if !EVAS_MODULE_NO_IMAGE_LOADERS
EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, bmp);
EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, dds);
EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, eet);
EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, generic);
EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, gif);
@ -189,6 +190,9 @@ static const struct {
#ifdef EVAS_STATIC_BUILD_BMP
EVAS_EINA_STATIC_MODULE_USE(image_loader, bmp),
#endif
#ifdef EVAS_STATIC_BUILD_DDS
EVAS_EINA_STATIC_MODULE_USE(image_loader, dds),
#endif
#ifdef EVAS_STATIC_BUILD_EET
EVAS_EINA_STATIC_MODULE_USE(image_loader, eet),
#endif

View File

@ -0,0 +1,153 @@
/* @file evas_image_load_dds.c
* @author Jean-Philippe ANDRE <jpeg@videolan.org>
*
* Load Microsoft DirectDraw Surface files.
* Decode S3TC image format.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "Evas_Loader.h"
typedef struct _Evas_Loader_Internal Evas_Loader_Internal;
struct _Evas_Loader_Internal
{
Eina_File *f;
};
static void *
evas_image_load_file_open_dds(Eina_File *f, Eina_Stringshare *key EINA_UNUSED,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
{
Evas_Loader_Internal *loader;
// TODO: Check file size
if (eina_file_size_get(f) <= 16)
{
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
return NULL;
}
loader = calloc(1, sizeof (Evas_Loader_Internal));
if (!loader)
{
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return NULL;
}
loader->f = eina_file_dup(f);
if (!loader->f)
{
free(loader);
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return NULL;
}
return loader;
}
static void
evas_image_load_file_close_dds(void *loader_data)
{
Evas_Loader_Internal *loader = loader_data;
eina_file_close(loader->f);
free(loader);
}
static Eina_Bool
evas_image_load_file_head_dds(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
const char *m;
m = eina_file_map_all(loader->f, EINA_FILE_SEQUENTIAL);
if (!m)
{
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
return EINA_FALSE;
}
if (strncmp(m, "DDS ", 4) != 0)
{
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
return EINA_FALSE;
}
// TODO
return EINA_TRUE;
}
Eina_Bool
evas_image_load_file_data_dds(void *loader_data,
Evas_Image_Property *prop,
void *pixels,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
const char *m;
Eina_Bool r = EINA_FALSE;
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
m = eina_file_map_all(loader->f, EINA_FILE_WILLNEED);
if (!m) return EINA_FALSE;
// TODO
r = EINA_TRUE;
on_error:
eina_file_map_free(loader->f, m);
return r;
}
Evas_Image_Load_Func evas_image_load_dds_func =
{
evas_image_load_file_open_dds,
evas_image_load_file_close_dds,
evas_image_load_file_head_dds,
evas_image_load_file_data_dds,
NULL,
EINA_TRUE,
EINA_FALSE
};
static int
module_open(Evas_Module *em)
{
if (!em) return 0;
em->functions = (void *)(&evas_image_load_dds_func);
return 1;
}
static void
module_close(Evas_Module *em EINA_UNUSED)
{
}
static Evas_Module_Api evas_modapi =
{
EVAS_MODULE_API_VERSION,
"dds",
"none",
{
module_open,
module_close
}
};
EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, dds);
#ifndef EVAS_STATIC_BUILD_DDS
EVAS_EINA_MODULE_DEFINE(image_loader, dds);
#endif