evas: final cleanup of the API, should be ready to make it public by now.

This commit is contained in:
Cedric Bail 2013-05-06 19:01:35 +09:00
parent 6929386895
commit 0d2c6481b8
18 changed files with 609 additions and 212 deletions

View File

@ -150,18 +150,25 @@ _evas_image_file_header(Evas_Module *em, Image_Entry *ie, int *error)
if (evas_image_load_func)
{
Evas_Image_Property property;
Eina_File *f;
f = eina_file_open(ie->file, EINA_FALSE);
if (!f)
if (!ie->f) ie->f = eina_file_open(ie->file, EINA_FALSE);
if (!ie->f)
{
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
return EINA_TRUE;
goto load_error;
}
ie->loader_data = evas_image_load_func->file_open(ie->f, ie->key,
&ie->load_opts,
&ie->animated,
error);
if (!ie->loader_data)
{
goto load_error;
}
memset(&property, 0, sizeof (Evas_Image_Property));
if (evas_image_load_func->file_head(f, ie->key, &property,
&ie->load_opts, &ie->animated,
if (evas_image_load_func->file_head(ie->loader_data, &property,
error) &&
(*error == EVAS_LOAD_ERROR_NONE))
{
@ -184,7 +191,6 @@ _evas_image_file_header(Evas_Module *em, Image_Entry *ie, int *error)
"%s (%s)",
em->definition->name, em, ie->file, evas_load_error_str(*error));
}
eina_file_close(f);
}
else
{
@ -327,7 +333,6 @@ EAPI int
evas_common_load_rgba_image_data_from_file(Image_Entry *ie)
{
void *pixels;
Eina_File *f;
Evas_Image_Load_Func *evas_image_load_func = NULL;
Evas_Image_Property property;
int ret = EVAS_LOAD_ERROR_NONE;
@ -363,39 +368,23 @@ evas_common_load_rgba_image_data_from_file(Image_Entry *ie)
evas_image_load_func = ie->info.loader;
evas_module_use((Evas_Module*) ie->info.module);
f = eina_file_open(ie->file, EINA_FALSE);
if (!f) return EVAS_LOAD_ERROR_DOES_NOT_EXIST;
if (!ie->f) return EVAS_LOAD_ERROR_DOES_NOT_EXIST;
memset(&property, 0, sizeof (Evas_Image_Property));
if (!(evas_image_load_func->file_head(f, ie->key, &property,
&ie->load_opts, &ie->animated,
&ret) &&
(ret == EVAS_LOAD_ERROR_NONE)))
goto on_error;
ie->w = property.w;
ie->h = property.h;
ie->scale = property.scale;
ie->flags.alpha = property.alpha;
if (ie->load_opts.orientation &&
ie->load_opts.degree != 0)
ie->flags.rotated = EINA_TRUE;
property.w = ie->w;
property.h = ie->h;
property.scale = property.scale;
property.rotated = ie->flags.rotated;
property.premul = EINA_FALSE;
property.alpha_sparse = EINA_FALSE;
evas_cache_image_surface_alloc(ie, ie->w, ie->h);
pixels = evas_cache_image_pixels(ie);
if (!pixels)
{
ret = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
goto on_error;
}
return EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
evas_image_load_func->file_data(f, ie->key,
&property,
&ie->load_opts,
&ie->animated,
pixels,
&ret);
evas_image_load_func->file_data(ie->loader_data, &property, pixels, &ret);
ie->flags.alpha_sparse = property.alpha_sparse;
@ -404,9 +393,6 @@ evas_common_load_rgba_image_data_from_file(Image_Entry *ie)
// evas_module_unref((Evas_Module*) ie->info.module);
// ie->info.module = NULL;
on_error:
eina_file_close(f);
return ret;
}
@ -421,17 +407,9 @@ evas_common_load_rgba_image_frame_duration_from_file(Image_Entry *ie, const int
evas_module_use((Evas_Module*) ie->info.module);
if (evas_image_load_func->frame_duration)
{
Eina_File *f;
double r;
if (!ie->f) return -1;
f = eina_file_open(ie->file, EINA_FALSE);
if (!f) return -1;
r = evas_image_load_func->frame_duration(f, &ie->animated, start, frame_num);
eina_file_close(f);
return r;
return evas_image_load_func->frame_duration(ie->loader_data, start, frame_num);
}
return -1;
}

View File

@ -217,6 +217,14 @@ _evas_common_rgba_image_delete(Image_Entry *ie)
}
}
}
if (ie->loader_data)
{
Evas_Image_Load_Func *evas_image_load_func = NULL;
evas_image_load_func = ie->info.loader;
evas_image_load_func->file_close(ie->loader_data);
}
if (ie->f) eina_file_close(ie->f);
free(im);
}

View File

@ -633,6 +633,13 @@ struct _Image_Entry
LK(lock);
LK(lock_cancel);
/* for animation feature */
Image_Entry_Animated animated;
/* Reference to the file */
Eina_File *f;
void *loader_data;
Image_Entry_Flags flags;
Evas_Image_Scale_Hint scale_hint;
void *data1, *data2;
@ -643,9 +650,6 @@ struct _Image_Entry
int connect_num;
int channel;
int load_error;
/* for animation feature */
Image_Entry_Animated animated;
};
struct _Engine_Image_Entry

View File

@ -903,20 +903,21 @@ struct _Evas_Func
struct _Evas_Image_Load_Func
{
Eina_Bool threadable;
Eina_Bool (*file_head) (Eina_File *f, const char *key,
Evas_Image_Property *prop,
void *(*file_open) (Eina_File *f, const char *key,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated,
int *error);
Eina_Bool (*file_data) (Eina_File *f, const char *key,
void (*file_close) (void *loader_data);
Eina_Bool (*file_head) (void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated,
void *pixels,
int *error);
double (*frame_duration) (Eina_File *f,
Evas_Image_Animated *animated,
Eina_Bool (*file_data) (void *loader_data,
Evas_Image_Property *prop,
void *pixels, int *error);
double (*frame_duration) (void *loader_data,
int start, int frame_num);
Eina_Bool do_region;
};

View File

@ -38,6 +38,13 @@ struct _BMP_Header
Eina_Bool hasa;
};
typedef struct _Evas_Loader_Internal Evas_Loader_Internal;
struct _Evas_Loader_Internal
{
Eina_File *f;
Evas_Image_Load_Opts *opts;
};
static Eina_Bool
read_short(unsigned char *map, size_t length, size_t *position, short *ret)
{
@ -287,13 +294,41 @@ _evas_image_load_file_header(void *map, size_t fsize, size_t *position, int *ima
return EINA_TRUE;
}
static Eina_Bool
evas_image_load_file_head_bmp(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *load_opts,
static void *
evas_image_load_file_open_bmp(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
{
Evas_Loader_Internal *loader;
loader = calloc(1, sizeof (Evas_Loader_Internal));
if (!loader)
{
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return NULL;
}
loader->f = f;
loader->opts = opts;
return loader;
}
static void
evas_image_load_file_close_bmp(void *loader_data)
{
free(loader_data);
}
static Eina_Bool
evas_image_load_file_head_bmp(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Evas_Loader_Internal *loader;
Evas_Image_Load_Opts *load_opts;
Eina_File *f;
void *map = NULL;
size_t position = 0;
BMP_Header header;
@ -301,6 +336,10 @@ evas_image_load_file_head_bmp(Eina_File *f, const char *key EINA_UNUSED,
size_t fsize;
Eina_Bool r = EINA_FALSE;
loader = loader_data;
f = loader->f;
load_opts = loader->opts;
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
fsize = eina_file_size_get(f);
if (fsize < 2) goto close_file;
@ -405,13 +444,14 @@ evas_image_load_file_head_bmp(Eina_File *f, const char *key EINA_UNUSED,
}
static Eina_Bool
evas_image_load_file_data_bmp(Eina_File *f, const char *key EINA_UNUSED,
evas_image_load_file_data_bmp(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
int *error)
{
Evas_Loader_Internal *loader;
Evas_Image_Load_Opts *opts;
Eina_File *f;
BMP_Header header;
void *map = NULL;
size_t position = 0;
@ -428,6 +468,10 @@ evas_image_load_file_data_bmp(Eina_File *f, const char *key EINA_UNUSED,
int row_size = 0; /* Row size is rounded up to a multiple of 4bytes */
int read_line = 0; /* total read line */
loader = loader_data;
f = loader->f;
opts = loader->opts;
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
fsize = eina_file_size_get(f);
if (fsize < 2) goto close_file;
@ -1328,6 +1372,8 @@ evas_image_load_file_data_bmp(Eina_File *f, const char *key EINA_UNUSED,
static Evas_Image_Load_Func evas_image_load_bmp_func =
{
EINA_TRUE,
evas_image_load_file_open_bmp,
evas_image_load_file_close_bmp,
evas_image_load_file_head_bmp,
evas_image_load_file_data_bmp,
NULL,

View File

@ -7,17 +7,20 @@
#include "evas_common.h"
#include "evas_private.h"
static Eina_Bool
evas_image_load_file_head_eet(Eina_File *f, const char *key,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
typedef struct _Evas_Loader_Internal Evas_Loader_Internal;
struct _Evas_Loader_Internal
{
Eet_File *ef = NULL;
int a, compression, quality, lossy;
int ok;
Eina_Bool res = EINA_FALSE;
Eet_File *ef;
const char *key;
};
static void *
evas_image_load_file_open_eet(Eina_File *f, const char *key,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
{
Evas_Loader_Internal *loader;
if (!key)
{
@ -25,66 +28,80 @@ evas_image_load_file_head_eet(Eina_File *f, const char *key,
return EINA_FALSE;
}
ef = eet_mmap(f);
if (!ef)
loader = calloc(1, sizeof (Evas_Loader_Internal));
if (!loader)
{
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
goto on_error;
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return NULL;
}
ok = eet_data_image_header_read(ef, key,
loader->ef = eet_mmap(f);
if (!loader->ef)
{
free(loader);
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
return NULL;
}
loader->key = eina_stringshare_ref(key);
return loader;
}
static void
evas_image_load_file_close_eet(void *loader_data)
{
Evas_Loader_Internal *loader = loader_data;
eet_close(loader->ef);
eina_stringshare_del(loader->key);
free(loader);
}
static inline Eina_Bool
_evas_image_load_return_error(int err, int *error)
{
*error = err;
return EINA_FALSE;
}
static Eina_Bool
evas_image_load_file_head_eet(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
int a, compression, quality, lossy;
int ok;
ok = eet_data_image_header_read(loader->ef, loader->key,
&prop->w, &prop->h, &a, &compression, &quality, &lossy);
if (!ok)
{
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
goto on_error;
}
return _evas_image_load_return_error(EVAS_LOAD_ERROR_DOES_NOT_EXIST, error);
if (IMG_TOO_BIG(prop->w, prop->h))
{
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
goto on_error;
}
return _evas_image_load_return_error(EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED, error);
prop->alpha = !!a;
res = EINA_TRUE;
*error = EVAS_LOAD_ERROR_NONE;
on_error:
if (ef) eet_close(ef);
return res;
return EINA_TRUE;
}
Eina_Bool
evas_image_load_file_data_eet(Eina_File *f, const char *key,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
evas_image_load_file_data_eet(void *loader_data,
Evas_Image_Property *prop,
void *pixels,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
int alpha, compression, quality, lossy, ok;
Eet_File *ef;
DATA32 *body, *p, *end;
DATA32 nas = 0;
Eina_Bool res = EINA_FALSE;
if (!key)
{
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
return EINA_FALSE;
}
ef = eet_mmap(f);
if (!ef)
{
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
goto on_error;
}
ok = eet_data_image_read_to_surface(ef, key, 0, 0,
ok = eet_data_image_read_to_surface(loader->ef, loader->key, 0, 0,
pixels, prop->w, prop->h, prop->w * 4,
&alpha, &compression, &quality, &lossy);
if (!ok)
{
*error = EVAS_LOAD_ERROR_GENERIC;
goto on_error;
}
return _evas_image_load_return_error(EVAS_LOAD_ERROR_GENERIC, error);
if (alpha)
{
@ -112,16 +129,15 @@ evas_image_load_file_data_eet(Eina_File *f, const char *key,
// result is already premultiplied now if u compile with edje
// evas_common_image_premul(im);
*error = EVAS_LOAD_ERROR_NONE;
res = EINA_TRUE;
on_error:
if (ef) eet_close(ef);
return res;
return EINA_TRUE;
}
Evas_Image_Load_Func evas_image_load_eet_func =
{
EINA_TRUE,
evas_image_load_file_open_eet,
evas_image_load_file_close_eet,
evas_image_load_file_head_eet,
evas_image_load_file_data_eet,
NULL,

View File

@ -16,6 +16,14 @@
#include <fcntl.h>
#include <ctype.h>
typedef struct _Evas_Loader_Internal Evas_Loader_Internal;
struct _Evas_Loader_Internal
{
Eina_File *f;
const char *key;
Evas_Image_Load_Opts *opts;
};
static Eina_Bool
illegal_char(const char *str)
{
@ -372,30 +380,62 @@ getdata:
return res;
}
static Eina_Bool
evas_image_load_file_head_generic(Eina_File *f, const char *key,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
static void *
evas_image_load_file_open_generic(Eina_File *f, const char *key,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
{
return _load(f, key, prop, opts, NULL, error, EINA_FALSE);
Evas_Loader_Internal *loader;
loader = calloc(1, sizeof (Evas_Loader_Internal));
if (!loader)
{
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return NULL;
}
loader->f = f;
loader->key = eina_stringshare_ref(key);
loader->opts = opts;
return loader;
}
static void
evas_image_load_file_close_generic(void *loader_data)
{
Evas_Loader_Internal *loader = loader_data;
eina_stringshare_del(loader->key);
free(loader);
}
static Eina_Bool
evas_image_load_file_data_generic(Eina_File *f, const char *key,
evas_image_load_file_head_generic(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
return _load(loader->f, loader->key, prop, loader->opts, NULL, error, EINA_FALSE);
}
static Eina_Bool
evas_image_load_file_data_generic(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
int *error)
{
return _load(f, key, prop, opts, pixels, error, EINA_TRUE);
Evas_Loader_Internal *loader = loader_data;
return _load(loader->f, loader->key, prop, loader->opts, pixels, error, EINA_TRUE);
}
Evas_Image_Load_Func evas_image_load_generic_func =
{
EINA_TRUE,
evas_image_load_file_open_generic,
evas_image_load_file_close_generic,
evas_image_load_file_head_generic,
evas_image_load_file_data_generic,
NULL,

View File

@ -43,6 +43,14 @@ struct _Gif_Frame
int bg_val;
};
typedef struct _Evas_Loader_Internal Evas_Loader_Internal;
struct _Evas_Loader_Internal
{
Eina_File *f;
Evas_Image_Load_Opts *opts;
Evas_Image_Animated *animated;
};
static Eina_Bool evas_image_load_specific_frame(Eina_File *f, const Evas_Image_Load_Opts *opts, Evas_Image_Property *prop, Evas_Image_Animated *animated, int frame_index, int *error);
#define byte2_to_int(a,b) (((b)<<8)|(a))
@ -655,14 +663,44 @@ _evas_image_load_file_read(GifFileType* gft, GifByteType *buf,int length)
return length;
}
static void *
evas_image_load_file_open_gif(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated,
int *error)
{
Evas_Loader_Internal *loader;
loader = calloc(1, sizeof (Evas_Loader_Internal));
if (!loader)
{
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return NULL;
}
loader->f = f;
loader->opts = opts;
loader->animated = animated;
return loader;
}
static void
evas_image_load_file_close_gif(void *loader_data)
{
free(loader_data);
}
static Eina_Bool
evas_image_load_file_head_gif(Eina_File *f, const char *key EINA_UNUSED,
evas_image_load_file_head_gif(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *load_opts,
Evas_Image_Animated *animated,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
Evas_Image_Load_Opts *load_opts;
Evas_Image_Animated *animated;
Eina_File *f;
Evas_GIF_Info egi;
GifRecordType rec;
GifFileType *gif = NULL;
@ -673,6 +711,10 @@ evas_image_load_file_head_gif(Eina_File *f, const char *key EINA_UNUSED,
//in that case we should play gif file until meet error frame.
int image_count = 0;
f = loader->f;
load_opts = loader->opts;
animated = loader->animated;
prop->w = 0;
prop->h = 0;
a = 0;
@ -871,17 +913,23 @@ evas_image_load_specific_frame(Eina_File *f,
}
static Eina_Bool
evas_image_load_file_data_gif(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated,
void *pixels,
int *error)
evas_image_load_file_data_gif(void *loader_data,
Evas_Image_Property *prop,
void *pixels, int *error)
{
Evas_Loader_Internal *loader = loader_data;
Evas_Image_Load_Opts *opts;
Evas_Image_Animated *animated;
Eina_File *f;
Image_Entry_Frame *frame = NULL;
int cur_frame_index;
Eina_Bool hit;
opts = loader->opts;
animated = loader->animated;
f = loader->f;
if(!animated->animated)
cur_frame_index = 1;
else
@ -968,9 +1016,13 @@ evas_image_load_file_data_gif(Eina_File *f, const char *key EINA_UNUSED,
}
static double
evas_image_load_frame_duration_gif(Eina_File *f, Evas_Image_Animated *animated,
evas_image_load_frame_duration_gif(void *loader_data,
int start_frame, int frame_num)
{
Evas_Loader_Internal *loader = loader_data;
Evas_Image_Animated *animated;
Eina_File *f;
Evas_GIF_Info egi;
GifFileType *gif = NULL;
GifRecordType rec;
@ -979,6 +1031,8 @@ evas_image_load_frame_duration_gif(Eina_File *f, Evas_Image_Animated *animated,
double duration = -1;
int frame_count = 0;
animated = loader->animated;
f = loader->f;
frame_count = animated->frame_count;
if (!animated->animated) return -1;
@ -1060,7 +1114,9 @@ evas_image_load_frame_duration_gif(Eina_File *f, Evas_Image_Animated *animated,
static Evas_Image_Load_Func evas_image_load_gif_func =
{
EINA_TRUE,
evas_image_load_file_head_gif,
evas_image_load_file_open_gif,
evas_image_load_file_close_gif,
evas_image_load_file_head_gif,
evas_image_load_file_data_gif,
evas_image_load_frame_duration_gif,
EINA_FALSE

View File

@ -11,6 +11,14 @@
#include "evas_common.h"
#include "evas_private.h"
typedef struct _Evas_Loader_Internal Evas_Loader_Internal;
struct _Evas_Loader_Internal
{
Eina_File *f;
const char *key;
Evas_Image_Load_Opts *opts;
};
static Eina_Bool
read_ushort(unsigned char *map, size_t length, size_t *position, unsigned short *ret)
{
@ -67,13 +75,47 @@ enum
CURSOR = 2
};
static void *
evas_image_load_file_open_ico(Eina_File *f, const char *key,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
{
Evas_Loader_Internal *loader;
loader = calloc(1, sizeof (Evas_Loader_Internal));
if (!loader)
{
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return NULL;
}
loader->f = f;
loader->key = eina_stringshare_ref(key);
loader->opts = opts;
return loader;
}
static void
evas_image_load_file_close_ico(void *loader_data)
{
Evas_Loader_Internal *loader = loader_data;
eina_stringshare_del(loader->key);
free(loader);
}
static Eina_Bool
evas_image_load_file_head_ico(Eina_File *f, const char *key,
evas_image_load_file_head_ico(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
Evas_Image_Load_Opts *opts;
const char *key;
Eina_File *f;
void *map = NULL;
size_t position = 0;
unsigned short word;
@ -94,6 +136,10 @@ evas_image_load_file_head_ico(Eina_File *f, const char *key,
} chosen = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Eina_Bool r = EINA_FALSE;
opts = loader->opts;
f = loader->f;
key = loader->key;
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
fsize = eina_file_size_get(f);
if (fsize < (6 + 16 + 40)) goto close_file;
@ -288,13 +334,16 @@ evas_image_load_file_head_ico(Eina_File *f, const char *key,
}
static Eina_Bool
evas_image_load_file_data_ico(Eina_File *f, const char *key,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
evas_image_load_file_data_ico(void *loader_data,
Evas_Image_Property *prop,
void *pixels,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
Evas_Image_Load_Opts *opts;
const char *key;
Eina_File *f;
void *map = NULL;
size_t position = 0;
unsigned short word;
@ -317,6 +366,10 @@ evas_image_load_file_data_ico(Eina_File *f, const char *key,
} chosen = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Eina_Bool res = EINA_FALSE;
opts = loader->opts;
key = loader->key;
f = loader->f;
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
fsize = eina_file_size_get(f);
if (fsize < (6 + 16 + 40)) goto close_file;
@ -753,6 +806,8 @@ evas_image_load_file_data_ico(Eina_File *f, const char *key,
static Evas_Image_Load_Func evas_image_load_ico_func =
{
EINA_TRUE,
evas_image_load_file_open_ico,
evas_image_load_file_close_ico,
evas_image_load_file_head_ico,
evas_image_load_file_data_ico,
NULL,

View File

@ -14,7 +14,6 @@
#include "evas_common.h"
#include "evas_private.h"
typedef struct _JPEG_error_mgr *emptr;
struct _JPEG_error_mgr
{
@ -22,6 +21,14 @@ struct _JPEG_error_mgr
jmp_buf setjmp_buffer;
};
typedef struct _Evas_Loader_Internal Evas_Loader_Internal;
struct _Evas_Loader_Internal
{
Eina_File *f;
Evas_Image_Load_Opts *opts;
};
static void _JPEGFatalErrorHandler(j_common_ptr cinfo);
static void _JPEGErrorHandler(j_common_ptr cinfo);
static void _JPEGErrorHandler2(j_common_ptr cinfo, int msg_level);
@ -1213,17 +1220,52 @@ evas_image_load_file_data_jpeg_alpha_internal(Image_Entry *ie, FILE *f, int *err
}
#endif
static Eina_Bool
evas_image_load_file_head_jpeg(Eina_File *f, const char *key EINA_UNUSED, Evas_Image_Property *prop, Evas_Image_Load_Opts *opts, Evas_Image_Animated *animated EINA_UNUSED, int *error)
static void *
evas_image_load_file_open_jpeg(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
{
Evas_Loader_Internal *loader;
loader = calloc(1, sizeof (Evas_Loader_Internal));
if (!loader)
{
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return NULL;
}
loader->f = f;
loader->opts = opts;
return loader;
}
static void
evas_image_load_file_close_jpeg(void *loader_data)
{
free(loader_data);
}
static Eina_Bool
evas_image_load_file_head_jpeg(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
Evas_Image_Load_Opts *opts;
Eina_File *f;
void *map;
Eina_Bool val = EINA_FALSE;
Eina_Bool val;
opts = loader->opts;
f = loader->f;
map = eina_file_map_all(f, EINA_FILE_WILLNEED);
if (!map)
{
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
goto on_error;
return EINA_FALSE;
}
val = evas_image_load_file_head_jpeg_internal(&prop->w, &prop->h,
@ -1234,21 +1276,24 @@ evas_image_load_file_head_jpeg(Eina_File *f, const char *key EINA_UNUSED, Evas_I
eina_file_map_free(f, map);
on_error:
return val;
}
static Eina_Bool
evas_image_load_file_data_jpeg(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
evas_image_load_file_data_jpeg(void *loader_data,
Evas_Image_Property *prop,
void *pixels,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
Evas_Image_Load_Opts *opts;
Eina_File *f;
void *map;
Eina_Bool val = EINA_FALSE;
f = loader->f;
opts = loader->opts;
map = eina_file_map_all(f, EINA_FILE_WILLNEED);
if (!map)
{
@ -1269,6 +1314,8 @@ evas_image_load_file_data_jpeg(Eina_File *f, const char *key EINA_UNUSED,
static Evas_Image_Load_Func evas_image_load_jpeg_func =
{
EINA_TRUE,
evas_image_load_file_open_jpeg,
evas_image_load_file_close_jpeg,
evas_image_load_file_head_jpeg,
evas_image_load_file_data_jpeg,
NULL,

View File

@ -55,13 +55,26 @@ static size_t pmaps_buffer_plain_update(Pmaps_Buffer *b);
static size_t pmaps_buffer_raw_update(Pmaps_Buffer *b);
static int pmaps_buffer_comment_skip(Pmaps_Buffer *b);
static void *
evas_image_load_file_open_pmaps(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
int *error EINA_UNUSED)
{
return f;
}
static void
evas_image_load_file_close_pmaps(void *loader_data EINA_UNUSED)
{
}
static Eina_Bool
evas_image_load_file_head_pmaps(Eina_File *f, const char *key EINA_UNUSED,
evas_image_load_file_head_pmaps(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
{
Eina_File *f = loader_data;
Pmaps_Buffer b;
if (!pmaps_buffer_open(&b, f, error))
@ -85,13 +98,12 @@ evas_image_load_file_head_pmaps(Eina_File *f, const char *key EINA_UNUSED,
}
static Eina_Bool
evas_image_load_file_data_pmaps(Eina_File *f, const char *key EINA_UNUSED,
evas_image_load_file_data_pmaps(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
int *error)
{
Eina_File *f = loader_data;
Pmaps_Buffer b;
int size;
DATA32 *ptr;
@ -544,6 +556,8 @@ pmaps_buffer_plain_bw_get(Pmaps_Buffer *b, DATA32 *val)
/* external functions */
Evas_Image_Load_Func evas_image_load_pmaps_func = {
EINA_TRUE,
evas_image_load_file_open_pmaps,
evas_image_load_file_close_pmaps,
evas_image_load_file_head_pmaps,
evas_image_load_file_data_pmaps,
NULL,

View File

@ -23,6 +23,13 @@ struct _Evas_PNG_Info
size_t position;
};
typedef struct _Evas_Loader_Internal Evas_Loader_Internal;
struct _Evas_Loader_Internal
{
Eina_File *f;
Evas_Image_Load_Opts *opts;
};
static void
_evas_image_png_read(png_structp png_ptr, png_bytep out, png_size_t count)
{
@ -36,13 +43,41 @@ _evas_image_png_read(png_structp png_ptr, png_bytep out, png_size_t count)
epi->position += count;
}
static Eina_Bool
evas_image_load_file_head_png(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
static void *
evas_image_load_file_open_png(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
int *error)
{
Evas_Loader_Internal *loader;
loader = calloc(1, sizeof (Evas_Loader_Internal));
if (!loader)
{
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return NULL;
}
loader->f = f;
loader->opts = opts;
return loader;
}
static void
evas_image_load_file_close_png(void *loader_data)
{
free(loader_data);
}
static Eina_Bool
evas_image_load_file_head_png(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
Evas_Image_Load_Opts *opts;
Eina_File *f;
Evas_PNG_Info epi;
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
@ -51,6 +86,9 @@ evas_image_load_file_head_png(Eina_File *f, const char *key EINA_UNUSED,
char hasa;
Eina_Bool r = EINA_FALSE;
opts = loader->opts;
f = loader->f;
hasa = 0;
epi.map = eina_file_map_all(f, EINA_FILE_SEQUENTIAL);
if (!epi.map)
@ -141,13 +179,15 @@ evas_image_load_file_head_png(Eina_File *f, const char *key EINA_UNUSED,
}
static Eina_Bool
evas_image_load_file_data_png(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
evas_image_load_file_data_png(void *loader_data,
Evas_Image_Property *prop,
void *pixels,
int *error)
{
Evas_Loader_Internal *loader = loader_data;
Evas_Image_Load_Opts *opts;
Eina_File *f;
unsigned char *surface;
unsigned char **lines;
unsigned char *tmp_line;
@ -163,6 +203,9 @@ evas_image_load_file_data_png(Eina_File *f, const char *key EINA_UNUSED,
int scale_ratio = 1, image_w = 0;
Eina_Bool r = EINA_FALSE;
opts = loader->opts;
f = loader->f;
hasa = 0;
epi.map = eina_file_map_all(f, EINA_FILE_SEQUENTIAL);
@ -309,6 +352,8 @@ evas_image_load_file_data_png(Eina_File *f, const char *key EINA_UNUSED,
static Evas_Image_Load_Func evas_image_load_png_func =
{
EINA_TRUE,
evas_image_load_file_open_png,
evas_image_load_file_close_png,
evas_image_load_file_head_png,
evas_image_load_file_data_png,
NULL,

View File

@ -146,13 +146,26 @@ is_psd(PSD_Header *header)
return EINA_TRUE;
}
static Eina_Bool
evas_image_load_file_head_psd(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Property *prop,
static void *
evas_image_load_file_open_psd(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
int *error EINA_UNUSED)
{
return f;
}
static void
evas_image_load_file_close_psd(void *loader_data EINA_UNUSED)
{
}
static Eina_Bool
evas_image_load_file_head_psd(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Eina_File *f = loader_data;
void *map;
size_t length;
size_t position;
@ -797,13 +810,13 @@ read_psd_cmyk(Evas_Image_Property *prop, void *pixels, PSD_Header *head, const u
}
static Eina_Bool
evas_image_load_file_data_psd(Eina_File *f, const char *key EINA_UNUSED,
evas_image_load_file_data_psd(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
int *error)
{
Eina_File *f = loader_data;
void *map;
size_t length;
size_t position;
@ -884,6 +897,8 @@ get_compressed_channels_length(PSD_Header *head,
static const Evas_Image_Load_Func evas_image_load_psd_func = {
EINA_TRUE,
evas_image_load_file_open_psd,
evas_image_load_file_close_psd,
evas_image_load_file_head_psd,
evas_image_load_file_data_psd,
NULL,

View File

@ -56,13 +56,26 @@ struct _tga_footer
char null;
} __attribute__((packed));
static Eina_Bool
evas_image_load_file_head_tga(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Property *prop,
static void *
evas_image_load_file_open_tga(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
int *error EINA_UNUSED)
{
return f;
}
static void
evas_image_load_file_close_tga(void *loader_data EINA_UNUSED)
{
}
static Eina_Bool
evas_image_load_file_head_tga(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Eina_File *f = loader_data;
unsigned char *seg = NULL, *filedata;
tga_header *header;
tga_footer *footer, tfooter;
@ -153,13 +166,12 @@ close_file:
}
static Eina_Bool
evas_image_load_file_data_tga(Eina_File *f, const char *key EINA_UNUSED,
evas_image_load_file_data_tga(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
int *error)
{
Eina_File *f = loader_data;
unsigned char *seg = NULL, *filedata;
tga_header *header;
tga_footer *footer, tfooter;
@ -540,6 +552,8 @@ evas_image_load_file_data_tga(Eina_File *f, const char *key EINA_UNUSED,
static Evas_Image_Load_Func evas_image_load_tga_func =
{
EINA_TRUE,
evas_image_load_file_open_tga,
evas_image_load_file_close_tga,
evas_image_load_file_head_tga,
evas_image_load_file_data_tga,
NULL,

View File

@ -84,13 +84,26 @@ _evas_tiff_UnmapProc(thandle_t handle, tdata_t data, toff_t size EINA_UNUSED)
eina_file_map_free(f, data);
}
static Eina_Bool
evas_image_load_file_head_tiff(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Property *prop,
static void *
evas_image_load_file_open_tiff(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
int *error EINA_UNUSED)
{
return f;
}
static void
evas_image_load_file_close_tiff(void *loader_data EINA_UNUSED)
{
}
static Eina_Bool
evas_image_load_file_head_tiff(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Eina_File *f = loader_data;
char txt[1024];
TIFFRGBAImage tiff_image;
TIFF *tif = NULL;
@ -165,13 +178,12 @@ evas_image_load_file_head_tiff(Eina_File *f, const char *key EINA_UNUSED,
}
static Eina_Bool
evas_image_load_file_data_tiff(Eina_File *f, const char *key EINA_UNUSED,
evas_image_load_file_data_tiff(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
void *pixels,
int *error)
{
Eina_File *f = loader_data;
char txt[1024];
TIFFRGBAImage_Extra rgba_image;
TIFF *tif = NULL;
@ -310,6 +322,8 @@ evas_image_load_file_data_tiff(Eina_File *f, const char *key EINA_UNUSED,
static Evas_Image_Load_Func evas_image_load_tiff_func =
{
EINA_TRUE,
evas_image_load_file_open_tiff,
evas_image_load_file_close_tiff,
evas_image_load_file_head_tiff,
evas_image_load_file_data_tiff,
NULL,

View File

@ -29,13 +29,26 @@ read_mb(unsigned int *data, void *map, size_t length, size_t *position)
return 0;
}
static Eina_Bool
evas_image_load_file_head_wbmp(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Property *prop,
static void *
evas_image_load_file_open_wbmp(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
int *error EINA_UNUSED)
{
return f;
}
static void
evas_image_load_file_close_wbmp(void *loader_data EINA_UNUSED)
{
}
static Eina_Bool
evas_image_load_file_head_wbmp(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Eina_File *f = loader_data;
void *map = NULL;
size_t position = 0;
size_t length;
@ -79,13 +92,12 @@ evas_image_load_file_head_wbmp(Eina_File *f, const char *key EINA_UNUSED,
}
static Eina_Bool
evas_image_load_file_data_wbmp(Eina_File *f, const char *key EINA_UNUSED,
evas_image_load_file_data_wbmp(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
int *error)
{
Eina_File *f = loader_data;
void *map = NULL;
size_t position = 0;
size_t length;
@ -157,6 +169,8 @@ evas_image_load_file_data_wbmp(Eina_File *f, const char *key EINA_UNUSED,
static Evas_Image_Load_Func evas_image_load_wbmp_func =
{
EINA_TRUE,
evas_image_load_file_open_wbmp,
evas_image_load_file_close_wbmp,
evas_image_load_file_head_wbmp,
evas_image_load_file_data_wbmp,
NULL,

View File

@ -40,13 +40,26 @@ evas_image_load_file_check(Eina_File *f, void *map,
return EINA_TRUE;
}
static Eina_Bool
evas_image_load_file_head_webp(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Property *prop,
static void *
evas_image_load_file_open_webp(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
int *error EINA_UNUSED)
{
return f;
}
static void
evas_image_load_file_close_webp(void *loader_data EINA_UNUSED)
{
}
static Eina_Bool
evas_image_load_file_head_webp(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Eina_File *f = loader_data;
Eina_Bool r;
void *data;
@ -63,13 +76,12 @@ evas_image_load_file_head_webp(Eina_File *f, const char *key EINA_UNUSED,
}
static Eina_Bool
evas_image_load_file_data_webp(Eina_File *f, const char *key EINA_UNUSED,
evas_image_load_file_data_webp(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
int *error)
{
Eina_File *f = loader_data;
void *data = NULL;
void *decoded = NULL;
void *surface = NULL;
@ -105,6 +117,8 @@ evas_image_load_file_data_webp(Eina_File *f, const char *key EINA_UNUSED,
static Evas_Image_Load_Func evas_image_load_webp_func =
{
EINA_TRUE,
evas_image_load_file_open_webp,
evas_image_load_file_close_webp,
evas_image_load_file_head_webp,
evas_image_load_file_data_webp,
NULL,

View File

@ -648,30 +648,46 @@ evas_image_load_file_xpm(Eina_File *f, Evas_Image_Property *prop, void *pixels,
return res;
}
static Eina_Bool
evas_image_load_file_head_xpm(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Property *prop,
static void *
evas_image_load_file_open_xpm(Eina_File *f, const char *key EINA_UNUSED,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
int *error EINA_UNUSED)
{
return f;
}
static void
evas_image_load_file_close_xpm(void *loader_data EINA_UNUSED)
{
}
static Eina_Bool
evas_image_load_file_head_xpm(void *loader_data,
Evas_Image_Property *prop,
int *error)
{
Eina_File *f = loader_data;
return evas_image_load_file_xpm(f, prop, NULL, 0, error);
}
static Eina_Bool
evas_image_load_file_data_xpm(Eina_File *f, const char *key EINA_UNUSED,
evas_image_load_file_data_xpm(void *loader_data,
Evas_Image_Property *prop,
Evas_Image_Load_Opts *opts EINA_UNUSED,
Evas_Image_Animated *animated EINA_UNUSED,
void *pixels,
int *error)
{
Eina_File *f = loader_data;
return evas_image_load_file_xpm(f, prop, pixels, 1, error);
}
static Evas_Image_Load_Func evas_image_load_xpm_func =
{
EINA_FALSE,
evas_image_load_file_open_xpm,
evas_image_load_file_close_xpm,
evas_image_load_file_head_xpm,
evas_image_load_file_data_xpm,
NULL,