2008-11-05 09:21:04 -08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <png.h>
|
2008-11-05 12:39:10 -08:00
|
|
|
#include <setjmp.h>
|
2008-11-05 09:21:04 -08:00
|
|
|
|
|
|
|
#ifdef HAVE_EVIL
|
|
|
|
# include <Evil.h>
|
|
|
|
#endif
|
2006-01-14 12:03:42 -08:00
|
|
|
|
2008-11-09 11:32:12 -08:00
|
|
|
#ifdef _WIN32_WCE
|
|
|
|
# define E_FOPEN(file, mode) evil_fopen_native((file), (mode))
|
|
|
|
# define E_FREAD(buffer, size, count, stream) evil_fread_native(buffer, size, count, stream)
|
2011-01-04 15:16:34 -08:00
|
|
|
# define E_FCLOSE(stream) evil_fclose_native(stream)
|
2008-11-09 11:32:12 -08:00
|
|
|
#else
|
|
|
|
# define E_FOPEN(file, mode) fopen((file), (mode))
|
|
|
|
# define E_FREAD(buffer, size, count, stream) fread(buffer, size, count, stream)
|
|
|
|
# define E_FCLOSE(stream) fclose(stream)
|
|
|
|
#endif
|
|
|
|
|
2006-01-14 12:03:42 -08:00
|
|
|
#include "evas_common.h"
|
|
|
|
#include "evas_private.h"
|
|
|
|
|
|
|
|
|
|
|
|
#define PNG_BYTES_TO_CHECK 4
|
|
|
|
|
|
|
|
|
2009-12-22 15:11:57 -08:00
|
|
|
static Eina_Bool evas_image_load_file_head_png(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
|
|
|
|
static Eina_Bool evas_image_load_file_data_png(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
|
2006-01-14 12:03:42 -08:00
|
|
|
|
2009-06-16 06:01:36 -07:00
|
|
|
static Evas_Image_Load_Func evas_image_load_png_func =
|
2006-01-14 12:03:42 -08:00
|
|
|
{
|
2009-12-24 05:15:34 -08:00
|
|
|
EINA_TRUE,
|
2006-01-14 12:03:42 -08:00
|
|
|
evas_image_load_file_head_png,
|
2011-08-10 23:04:08 -07:00
|
|
|
evas_image_load_file_data_png,
|
2011-12-13 08:58:20 -08:00
|
|
|
NULL,
|
|
|
|
EINA_FALSE
|
2006-01-14 12:03:42 -08:00
|
|
|
};
|
|
|
|
|
2009-12-22 15:11:57 -08:00
|
|
|
static Eina_Bool
|
|
|
|
evas_image_load_file_head_png(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
|
2006-01-14 12:03:42 -08:00
|
|
|
{
|
|
|
|
png_uint_32 w32, h32;
|
|
|
|
FILE *f;
|
|
|
|
png_structp png_ptr = NULL;
|
|
|
|
png_infop info_ptr = NULL;
|
|
|
|
int bit_depth, color_type, interlace_type;
|
|
|
|
unsigned char buf[PNG_BYTES_TO_CHECK];
|
2007-08-24 19:36:18 -07:00
|
|
|
char hasa;
|
2006-01-14 12:03:42 -08:00
|
|
|
|
|
|
|
hasa = 0;
|
2008-11-09 11:32:12 -08:00
|
|
|
f = E_FOPEN(file, "rb");
|
2009-12-22 15:11:57 -08:00
|
|
|
if (!f)
|
|
|
|
{
|
2011-06-28 07:26:22 -07:00
|
|
|
ERR("File: '%s' does not exist\n", file);
|
2009-12-22 15:11:57 -08:00
|
|
|
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
2006-01-14 12:03:42 -08:00
|
|
|
|
|
|
|
/* if we havent read the header before, set the header data */
|
2008-11-09 11:32:12 -08:00
|
|
|
if (E_FREAD(buf, PNG_BYTES_TO_CHECK, 1, f) != 1)
|
2009-12-22 15:11:57 -08:00
|
|
|
{
|
|
|
|
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
|
|
|
|
goto close_file;
|
|
|
|
}
|
2008-11-09 11:32:12 -08:00
|
|
|
|
2010-01-26 21:52:27 -08:00
|
|
|
if (png_sig_cmp(buf, 0, PNG_BYTES_TO_CHECK))
|
2009-12-22 15:11:57 -08:00
|
|
|
{
|
|
|
|
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
|
|
|
|
goto close_file;
|
|
|
|
}
|
2008-11-09 11:32:12 -08:00
|
|
|
|
2006-01-14 12:03:42 -08:00
|
|
|
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
|
|
|
if (!png_ptr)
|
2009-12-22 15:11:57 -08:00
|
|
|
{
|
|
|
|
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
|
|
|
|
goto close_file;
|
|
|
|
}
|
2008-11-09 11:32:12 -08:00
|
|
|
|
2006-01-14 12:03:42 -08:00
|
|
|
info_ptr = png_create_info_struct(png_ptr);
|
|
|
|
if (!info_ptr)
|
|
|
|
{
|
|
|
|
png_destroy_read_struct(&png_ptr, NULL, NULL);
|
2009-12-22 15:11:57 -08:00
|
|
|
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
|
2008-11-09 11:32:12 -08:00
|
|
|
goto close_file;
|
2006-01-14 12:03:42 -08:00
|
|
|
}
|
2008-11-06 10:54:19 -08:00
|
|
|
if (setjmp(png_jmpbuf(png_ptr)))
|
2006-01-14 12:03:42 -08:00
|
|
|
{
|
|
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
2009-12-22 15:11:57 -08:00
|
|
|
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
|
2008-11-09 11:32:12 -08:00
|
|
|
goto close_file;
|
2006-01-14 12:03:42 -08:00
|
|
|
}
|
|
|
|
png_init_io(png_ptr, f);
|
2008-11-06 10:54:19 -08:00
|
|
|
png_set_sig_bytes(png_ptr, PNG_BYTES_TO_CHECK);
|
2006-01-14 12:03:42 -08:00
|
|
|
png_read_info(png_ptr, info_ptr);
|
|
|
|
png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *) (&w32),
|
|
|
|
(png_uint_32 *) (&h32), &bit_depth, &color_type,
|
|
|
|
&interlace_type, NULL, NULL);
|
2009-09-16 02:48:05 -07:00
|
|
|
if ((w32 < 1) || (h32 < 1) || (w32 > IMG_MAX_SIZE) || (h32 > IMG_MAX_SIZE) ||
|
|
|
|
IMG_TOO_BIG(w32, h32))
|
2006-11-04 21:07:53 -08:00
|
|
|
{
|
2008-11-09 11:32:12 -08:00
|
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
2009-12-22 15:11:57 -08:00
|
|
|
if (IMG_TOO_BIG(w32, h32))
|
|
|
|
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
|
|
|
|
else
|
|
|
|
*error = EVAS_LOAD_ERROR_GENERIC;
|
2008-11-09 11:32:12 -08:00
|
|
|
goto close_file;
|
2006-11-04 21:07:53 -08:00
|
|
|
}
|
2011-10-19 02:04:34 -07:00
|
|
|
if (ie->load_opts.scale_down_by > 1)
|
|
|
|
{
|
|
|
|
ie->w = (int) w32 / ie->load_opts.scale_down_by;
|
|
|
|
ie->h = (int) h32 / ie->load_opts.scale_down_by;
|
|
|
|
if ((ie->w < 1) || (ie->h < 1))
|
|
|
|
{
|
|
|
|
*error = EVAS_LOAD_ERROR_GENERIC;
|
|
|
|
goto close_file;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ie->w = (int) w32;
|
|
|
|
ie->h = (int) h32;
|
|
|
|
}
|
2007-08-24 19:36:18 -07:00
|
|
|
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) hasa = 1;
|
|
|
|
if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) hasa = 1;
|
|
|
|
if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) hasa = 1;
|
2008-06-03 02:09:39 -07:00
|
|
|
if (hasa) ie->flags.alpha = 1;
|
2008-11-09 11:32:12 -08:00
|
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
|
|
|
E_FCLOSE(f);
|
2009-12-22 15:11:57 -08:00
|
|
|
|
|
|
|
*error = EVAS_LOAD_ERROR_NONE;
|
|
|
|
return EINA_TRUE;
|
2008-11-09 11:32:12 -08:00
|
|
|
|
|
|
|
close_file:
|
|
|
|
E_FCLOSE(f);
|
2009-12-22 15:11:57 -08:00
|
|
|
return EINA_FALSE;
|
2006-01-14 12:03:42 -08:00
|
|
|
}
|
|
|
|
|
2009-12-22 15:11:57 -08:00
|
|
|
static Eina_Bool
|
|
|
|
evas_image_load_file_data_png(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
|
2006-01-14 12:03:42 -08:00
|
|
|
{
|
2008-06-03 02:09:39 -07:00
|
|
|
unsigned char *surface;
|
2006-01-14 12:03:42 -08:00
|
|
|
png_uint_32 w32, h32;
|
|
|
|
int w, h;
|
|
|
|
FILE *f;
|
|
|
|
png_structp png_ptr = NULL;
|
|
|
|
png_infop info_ptr = NULL;
|
|
|
|
int bit_depth, color_type, interlace_type;
|
|
|
|
unsigned char buf[PNG_BYTES_TO_CHECK];
|
|
|
|
unsigned char **lines;
|
2007-08-24 19:36:18 -07:00
|
|
|
char hasa;
|
2011-10-19 02:04:34 -07:00
|
|
|
int i, j;
|
|
|
|
int scale_ratio = 1, image_w = 0;
|
|
|
|
unsigned char *tmp_line;
|
|
|
|
DATA32 *src_ptr, *dst_ptr;
|
2006-01-14 12:03:42 -08:00
|
|
|
|
|
|
|
hasa = 0;
|
2008-11-09 11:32:12 -08:00
|
|
|
f = E_FOPEN(file, "rb");
|
2009-12-22 15:11:57 -08:00
|
|
|
if (!f)
|
|
|
|
{
|
|
|
|
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
2006-01-14 12:03:42 -08:00
|
|
|
|
|
|
|
/* if we havent read the header before, set the header data */
|
2010-09-18 18:14:56 -07:00
|
|
|
if (E_FREAD(buf, PNG_BYTES_TO_CHECK, 1, f) != 1)
|
2010-09-18 16:39:30 -07:00
|
|
|
{
|
2010-09-18 18:14:56 -07:00
|
|
|
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
|
2010-09-18 16:39:30 -07:00
|
|
|
goto close_file;
|
|
|
|
}
|
2010-01-26 21:52:27 -08:00
|
|
|
if (png_sig_cmp(buf, 0, PNG_BYTES_TO_CHECK))
|
2009-12-22 15:11:57 -08:00
|
|
|
{
|
|
|
|
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
|
|
|
|
goto close_file;
|
|
|
|
}
|
2006-01-14 12:03:42 -08:00
|
|
|
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
|
|
|
if (!png_ptr)
|
2009-12-22 15:11:57 -08:00
|
|
|
{
|
|
|
|
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
|
|
|
|
goto close_file;
|
|
|
|
}
|
2008-11-09 11:32:12 -08:00
|
|
|
|
2006-01-14 12:03:42 -08:00
|
|
|
info_ptr = png_create_info_struct(png_ptr);
|
|
|
|
if (!info_ptr)
|
|
|
|
{
|
|
|
|
png_destroy_read_struct(&png_ptr, NULL, NULL);
|
2009-12-22 15:11:57 -08:00
|
|
|
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
|
2008-11-09 11:32:12 -08:00
|
|
|
goto close_file;
|
2006-01-14 12:03:42 -08:00
|
|
|
}
|
2008-11-06 10:54:19 -08:00
|
|
|
if (setjmp(png_jmpbuf(png_ptr)))
|
2006-01-14 12:03:42 -08:00
|
|
|
{
|
|
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
2009-12-22 15:11:57 -08:00
|
|
|
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
|
2008-11-09 11:32:12 -08:00
|
|
|
goto close_file;
|
2006-01-14 12:03:42 -08:00
|
|
|
}
|
|
|
|
png_init_io(png_ptr, f);
|
2008-11-06 10:54:19 -08:00
|
|
|
png_set_sig_bytes(png_ptr, PNG_BYTES_TO_CHECK);
|
2006-01-14 12:03:42 -08:00
|
|
|
png_read_info(png_ptr, info_ptr);
|
|
|
|
png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *) (&w32),
|
|
|
|
(png_uint_32 *) (&h32), &bit_depth, &color_type,
|
|
|
|
&interlace_type, NULL, NULL);
|
2011-10-19 02:04:34 -07:00
|
|
|
image_w = w32;
|
|
|
|
if (ie->load_opts.scale_down_by > 1)
|
|
|
|
{
|
|
|
|
scale_ratio = ie->load_opts.scale_down_by;
|
|
|
|
w32 /= scale_ratio;
|
|
|
|
h32 /= scale_ratio;
|
|
|
|
}
|
2008-06-03 02:09:39 -07:00
|
|
|
evas_cache_image_surface_alloc(ie, w32, h32);
|
|
|
|
surface = (unsigned char *) evas_cache_image_pixels(ie);
|
|
|
|
if (!surface)
|
2008-04-11 17:32:30 -07:00
|
|
|
{
|
2008-11-09 11:32:12 -08:00
|
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
2009-12-22 15:11:57 -08:00
|
|
|
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
|
2008-11-09 11:32:12 -08:00
|
|
|
goto close_file;
|
2008-04-11 17:32:30 -07:00
|
|
|
}
|
2008-06-03 02:09:39 -07:00
|
|
|
if ((w32 != ie->w) || (h32 != ie->h))
|
2006-11-04 21:07:53 -08:00
|
|
|
{
|
2008-11-09 11:32:12 -08:00
|
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
2009-12-22 15:11:57 -08:00
|
|
|
*error = EVAS_LOAD_ERROR_GENERIC;
|
2008-11-09 11:32:12 -08:00
|
|
|
goto close_file;
|
2006-11-04 21:07:53 -08:00
|
|
|
}
|
2007-08-24 19:36:18 -07:00
|
|
|
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) hasa = 1;
|
|
|
|
if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) hasa = 1;
|
|
|
|
if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) hasa = 1;
|
2008-06-03 02:09:39 -07:00
|
|
|
if (hasa) ie->flags.alpha = 1;
|
2006-01-14 12:03:42 -08:00
|
|
|
|
2007-08-24 19:36:18 -07:00
|
|
|
/* Prep for transformations... ultimately we want ARGB */
|
|
|
|
/* expand palette -> RGB if necessary */
|
|
|
|
if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr);
|
|
|
|
/* expand gray (w/reduced bits) -> 8-bit RGB if necessary */
|
|
|
|
if ((color_type == PNG_COLOR_TYPE_GRAY) ||
|
|
|
|
(color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
|
|
|
|
{
|
|
|
|
png_set_gray_to_rgb(png_ptr);
|
|
|
|
if (bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr);
|
|
|
|
}
|
|
|
|
/* expand transparency entry -> alpha channel if present */
|
|
|
|
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
|
|
|
png_set_tRNS_to_alpha(png_ptr);
|
|
|
|
/* reduce 16bit color -> 8bit color if necessary */
|
|
|
|
if (bit_depth > 8) png_set_strip_16(png_ptr);
|
|
|
|
/* pack all pixels to byte boundaries */
|
|
|
|
png_set_packing(png_ptr);
|
2008-04-11 17:32:30 -07:00
|
|
|
|
2008-06-03 02:09:39 -07:00
|
|
|
w = ie->w;
|
|
|
|
h = ie->h;
|
2006-01-14 12:03:42 -08:00
|
|
|
/* we want ARGB */
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
|
|
png_set_swap_alpha(png_ptr);
|
2007-08-24 19:36:18 -07:00
|
|
|
if (!hasa) png_set_filler(png_ptr, 0xff, PNG_FILLER_BEFORE);
|
2006-01-14 12:03:42 -08:00
|
|
|
#else
|
|
|
|
png_set_bgr(png_ptr);
|
2007-08-24 19:36:18 -07:00
|
|
|
if (!hasa) png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
|
2006-01-14 12:03:42 -08:00
|
|
|
#endif
|
|
|
|
|
2011-10-19 02:04:34 -07:00
|
|
|
/* we read image line by line if scale down was set */
|
|
|
|
if (scale_ratio == 1)
|
|
|
|
{
|
|
|
|
lines = (unsigned char **) alloca(h * sizeof(unsigned char *));
|
|
|
|
for (i = 0; i < h; i++)
|
|
|
|
lines[i] = surface + (i * w * sizeof(DATA32));
|
|
|
|
png_read_image(png_ptr, lines);
|
|
|
|
png_read_end(png_ptr, info_ptr);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
tmp_line = (unsigned char *) alloca(image_w * sizeof(DATA32));
|
|
|
|
dst_ptr = (DATA32 *)surface;
|
|
|
|
for (i = 0; i < h; i++)
|
|
|
|
{
|
|
|
|
png_read_row(png_ptr, tmp_line, NULL);
|
|
|
|
src_ptr = (DATA32 *)tmp_line;
|
|
|
|
for (j = 0; j < w; j++)
|
|
|
|
{
|
|
|
|
*dst_ptr = *src_ptr;
|
|
|
|
dst_ptr++;
|
|
|
|
src_ptr += scale_ratio;
|
|
|
|
}
|
|
|
|
for (j = 0; j < (scale_ratio - 1); j++)
|
|
|
|
{
|
|
|
|
png_read_row(png_ptr, tmp_line, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-11-09 11:32:12 -08:00
|
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
|
|
|
E_FCLOSE(f);
|
2008-06-03 02:09:39 -07:00
|
|
|
evas_common_image_premul(ie);
|
2008-04-11 17:32:30 -07:00
|
|
|
|
2009-12-22 15:11:57 -08:00
|
|
|
*error = EVAS_LOAD_ERROR_NONE;
|
|
|
|
return EINA_TRUE;
|
2008-11-09 11:32:12 -08:00
|
|
|
|
|
|
|
close_file:
|
|
|
|
E_FCLOSE(f);
|
2009-12-22 15:11:57 -08:00
|
|
|
return EINA_FALSE;
|
2006-01-14 12:03:42 -08:00
|
|
|
}
|
|
|
|
|
2009-06-16 06:01:36 -07:00
|
|
|
static int
|
2006-09-06 00:28:46 -07:00
|
|
|
module_open(Evas_Module *em)
|
2006-01-14 12:03:42 -08:00
|
|
|
{
|
|
|
|
if (!em) return 0;
|
|
|
|
em->functions = (void *)(&evas_image_load_png_func);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2009-06-16 06:01:36 -07:00
|
|
|
static void
|
cleanup: fix some "unused" errors from -Wextra.
As we're heading for a release we better remove as much errors as
possible and as the first step I'm removing warnings due unused
parameters, variables and functions. These tend to pollute real errors
spotted by -Wall and clang/llvm.
This does not fixes all, just the clear that could be set to
__UNUSED__, particularly to do (and I'd like some help from the
authors):
* src/lib/engines/common/evas_font_{draw,query}.c (tasn):
intl_props is just used while doing BIDI, but also used in other
#ifdef blocks :-/
* evas_map_* (raster):
huge amount of warnings, code is quite confusing and thus I'm not
touching it. I have no idea whenever the commented blocks or extra
parameters are intended to be used or no.
* src/modules/engines/fbevas_fb_main.c (raster?):
is fb_setvt() to be used? If not do you mind removing it?
* src/modules/engines/gl_{common,x11} (raster):
huge amount of warnings, code is quite nested and full of #ifdefs
that does not help to give a clear picture of what's going on.
* src/bin/evas_cserve_main.c (raster):
I could have ignored most of the errors, but is the code correct? I
mean, there is no unload of images being applied. If you confirm
none of those warnings are harmful I can flag them as unused.
* src/lib/engines/common_8 (dottedmag):
lots of unused functions that were acquired from common_16, they
are unused and if they will not, then they should be removed.
SVN revision: 52421
2010-09-18 12:17:41 -07:00
|
|
|
module_close(Evas_Module *em __UNUSED__)
|
2006-01-14 12:03:42 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2009-06-16 06:01:36 -07:00
|
|
|
static Evas_Module_Api evas_modapi =
|
2006-01-14 12:03:42 -08:00
|
|
|
{
|
|
|
|
EVAS_MODULE_API_VERSION,
|
2009-06-16 06:01:36 -07:00
|
|
|
"png",
|
|
|
|
"none",
|
|
|
|
{
|
|
|
|
module_open,
|
|
|
|
module_close
|
|
|
|
}
|
2006-01-14 12:03:42 -08:00
|
|
|
};
|
2009-06-16 06:01:36 -07:00
|
|
|
|
|
|
|
EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, png);
|
|
|
|
|
|
|
|
#ifndef EVAS_STATIC_BUILD_PNG
|
|
|
|
EVAS_EINA_MODULE_DEFINE(image_loader, png);
|
|
|
|
#endif
|