diff --git a/configure.ac b/configure.ac index 2a798ef441..9ca05dc6b4 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/m4/evas_check_loader.m4 b/m4/evas_check_loader.m4 index 07d9cdd87e..c7ab0dcdeb 100644 --- a/m4/evas_check_loader.m4 +++ b/m4/evas_check_loader.m4 @@ -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], diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index 764cfca5ad..bc1a65f679 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -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 diff --git a/src/lib/evas/file/evas_module.c b/src/lib/evas/file/evas_module.c index 7d23d45963..5d1a8acdee 100644 --- a/src/lib/evas/file/evas_module.c +++ b/src/lib/evas/file/evas_module.c @@ -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 diff --git a/src/modules/evas/loaders/dds/evas_image_load_dds.c b/src/modules/evas/loaders/dds/evas_image_load_dds.c new file mode 100644 index 0000000000..356fc68443 --- /dev/null +++ b/src/modules/evas/loaders/dds/evas_image_load_dds.c @@ -0,0 +1,153 @@ +/* @file evas_image_load_dds.c + * @author Jean-Philippe ANDRE + * + * 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