forked from enlightenment/efl
efl: use Eina_File for evas webp loader.
SVN revision: 81969
This commit is contained in:
parent
8263e62028
commit
311fe62f75
|
@ -1,3 +1,7 @@
|
||||||
|
2013-01-02 Cedric Bail
|
||||||
|
|
||||||
|
* Use Eina_File for evas webp loader.
|
||||||
|
|
||||||
2012-12-31 Gustavo Sverzut Barbieri (k-s)
|
2012-12-31 Gustavo Sverzut Barbieri (k-s)
|
||||||
|
|
||||||
* Fixed eina_xattr_value_ls() an eina_xattr_value_fd_ls()
|
* Fixed eina_xattr_value_ls() an eina_xattr_value_fd_ls()
|
||||||
|
|
1
NEWS
1
NEWS
|
@ -68,6 +68,7 @@ Improvements:
|
||||||
* Display more information with eet -l -v.
|
* Display more information with eet -l -v.
|
||||||
* eina_magic_fail() now throws error messages on NULL pointers instead of critical
|
* eina_magic_fail() now throws error messages on NULL pointers instead of critical
|
||||||
* all efl object-freeing functions now take NULL without crashing or erroring
|
* all efl object-freeing functions now take NULL without crashing or erroring
|
||||||
|
* use Eina_File in webp loader
|
||||||
|
|
||||||
Fixes:
|
Fixes:
|
||||||
* Fix PPC (big endian) image codec bug.
|
* Fix PPC (big endian) image codec bug.
|
||||||
|
|
|
@ -25,36 +25,19 @@ static Evas_Image_Load_Func evas_image_load_webp_func =
|
||||||
EINA_FALSE
|
EINA_FALSE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
evas_image_load_file_head_webp(Image_Entry *ie, const char *file, const char *key EINA_UNUSED, int *error)
|
evas_image_load_file_check(Eina_File *f, void *map, Image_Entry *ie, int *error)
|
||||||
{
|
{
|
||||||
WebPDecoderConfig config;
|
WebPDecoderConfig config;
|
||||||
FILE *f;
|
|
||||||
size_t header_size = 30;
|
|
||||||
uint8_t header[30];
|
|
||||||
|
|
||||||
// XXX: use eina_file to mmap things
|
if (eina_file_size_get(f) < 30) return EINA_FALSE;
|
||||||
f = fopen(file, "rb");
|
|
||||||
if (!f)
|
|
||||||
{
|
|
||||||
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
if (fread(header, header_size, 1, f) != 1)
|
|
||||||
{
|
|
||||||
fclose(f);
|
|
||||||
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
if (!WebPInitDecoderConfig(&config))
|
if (!WebPInitDecoderConfig(&config))
|
||||||
{
|
{
|
||||||
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
|
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
}
|
}
|
||||||
if (WebPGetFeatures(header, header_size, &config.input) != VP8_STATUS_OK)
|
if (WebPGetFeatures(map, 30, &config.input) != VP8_STATUS_OK)
|
||||||
{
|
{
|
||||||
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
|
*error = EVAS_LOAD_ERROR_CORRUPT_FILE;
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
|
@ -64,82 +47,84 @@ evas_image_load_file_head_webp(Image_Entry *ie, const char *file, const char *ke
|
||||||
ie->h = config.input.height;
|
ie->h = config.input.height;
|
||||||
ie->flags.alpha = config.input.has_alpha;
|
ie->flags.alpha = config.input.has_alpha;
|
||||||
|
|
||||||
*error = EVAS_LOAD_ERROR_NONE;
|
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
evas_image_load_file_data_webp(Image_Entry *ie, const char *file, const char *key EINA_UNUSED, int *error)
|
evas_image_load_file_head_webp(Image_Entry *ie, const char *file, const char *key EINA_UNUSED, int *error)
|
||||||
{
|
{
|
||||||
FILE *f;
|
Eina_File *f;
|
||||||
size_t file_size;
|
Eina_Bool r;
|
||||||
void *data, *decoded, *surface;
|
void *data;
|
||||||
int width, height;
|
|
||||||
|
|
||||||
// XXX: use eina_file to mmap things
|
// XXX: use eina_file to mmap things
|
||||||
f = fopen(file, "rb");
|
f = eina_file_open(file, EINA_FALSE);
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
|
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fseek(f, 0, SEEK_END) != 0)
|
*error = EVAS_LOAD_ERROR_NONE;
|
||||||
{
|
|
||||||
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
|
|
||||||
goto close_file;
|
|
||||||
}
|
|
||||||
file_size = ftell(f);
|
|
||||||
|
|
||||||
if (fseek(f, 0, SEEK_SET) != 0)
|
data = eina_file_map_all(f, EINA_FILE_SEQUENTIAL);
|
||||||
{
|
|
||||||
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
|
|
||||||
goto close_file;
|
|
||||||
}
|
|
||||||
|
|
||||||
data = malloc(file_size);
|
r = evas_image_load_file_check(f, data, ie, error);
|
||||||
if (!data)
|
|
||||||
{
|
if (data) eina_file_map_free(f, data);
|
||||||
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
|
eina_file_close(f);
|
||||||
goto close_file;
|
|
||||||
}
|
return r;
|
||||||
if (fread(data, file_size, 1, f) != 1)
|
}
|
||||||
{
|
|
||||||
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
|
static Eina_Bool
|
||||||
goto free_data;
|
evas_image_load_file_data_webp(Image_Entry *ie, const char *file, const char *key EINA_UNUSED, int *error)
|
||||||
}
|
{
|
||||||
|
Eina_File *f;
|
||||||
|
void *data = NULL;
|
||||||
|
void *decoded = NULL;
|
||||||
|
void *surface = NULL;
|
||||||
|
int width, height;
|
||||||
|
|
||||||
|
// XXX: use eina_file to mmap things
|
||||||
|
f = eina_file_open(file, EINA_FALSE);
|
||||||
|
if (!f)
|
||||||
|
{
|
||||||
|
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = eina_file_map_all(f, EINA_FILE_SEQUENTIAL);
|
||||||
|
|
||||||
|
if (!evas_image_load_file_check(f, data, ie, error))
|
||||||
|
goto free_data;
|
||||||
|
|
||||||
evas_cache_image_surface_alloc(ie, ie->w, ie->h);
|
evas_cache_image_surface_alloc(ie, ie->w, ie->h);
|
||||||
surface = evas_cache_image_pixels(ie);
|
surface = evas_cache_image_pixels(ie);
|
||||||
if (!surface)
|
if (!surface)
|
||||||
{
|
{
|
||||||
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
|
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
|
||||||
goto free_data;
|
goto free_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
decoded = WebPDecodeBGRA(data, file_size, &width, &height);
|
decoded = WebPDecodeBGRA(data, eina_file_size_get(f), &width, &height);
|
||||||
if (!decoded)
|
if (!decoded)
|
||||||
{
|
{
|
||||||
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
|
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
|
||||||
goto free_data;
|
goto free_data;
|
||||||
}
|
}
|
||||||
|
*error = EVAS_LOAD_ERROR_NONE;
|
||||||
|
|
||||||
// XXX: this copy of the surface is inefficient
|
// XXX: this copy of the surface is inefficient
|
||||||
memcpy(surface, decoded, width * height * 4);
|
memcpy(surface, decoded, width * height * 4);
|
||||||
evas_common_image_premul(ie);
|
evas_common_image_premul(ie);
|
||||||
|
|
||||||
|
free_data:
|
||||||
|
if (data) eina_file_map_free(f, data);
|
||||||
|
eina_file_close(f);
|
||||||
free(decoded);
|
free(decoded);
|
||||||
free(data);
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
*error = EVAS_LOAD_ERROR_NONE;
|
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
|
|
||||||
free_data:
|
|
||||||
free(data);
|
|
||||||
|
|
||||||
close_file:
|
|
||||||
fclose(f);
|
|
||||||
return EINA_FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Loading…
Reference in New Issue