evas: remove svg loader from inside the merged tree.

This commit is contained in:
Cedric Bail 2013-04-25 14:56:55 +09:00
parent 49e88118d5
commit 2b61da5a5a
3 changed files with 5 additions and 308 deletions

View File

@ -1,3 +1,7 @@
2013-05-06 Cedric Bail
* Evas: Remove SVG loader from inside the merged tree.
2013-05-06 ChunEon Park (Hermet)
* Evas: update the map smart members really when it needs to render.

1
NEWS
View File

@ -120,6 +120,7 @@ Deprecations:
Removed:
* directfb support: ecore_directfb and evas directfb engine.
* Removed XRender, WinCE, Glew, Direct3d, X11-16 and X11-8 ecore_evas support.
* Removed svg from inside merged tree.
Improvements:
* Reduced number of enqueued font commands when rendering textgrid objects

View File

@ -1,308 +0,0 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <math.h>
#ifdef HAVE_EVIL
# include <Evil.h>
#endif
#include <Esvg.h>
#include "evas_common.h"
#include "evas_private.h"
static inline Eina_Bool evas_image_load_file_is_svg(const char *file) EINA_ARG_NONNULL(1) EINA_PURE;
static Eina_Bool evas_image_load_file_head_svg(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_svg(Image_Entry *ie, const char *file, const char *key, int *error) EINA_ARG_NONNULL(1, 2, 4);
Evas_Image_Load_Func evas_image_load_svg_func =
{
EINA_FALSE,
evas_image_load_file_head_svg,
evas_image_load_file_data_svg,
NULL,
EINA_FALSE
};
static Eina_Bool esvg_initialized = EINA_FALSE;
static inline Eina_Bool evas_image_load_file_is_svg(const char *file)
{
int i, len = strlen(file);
Eina_Bool is_gz = EINA_FALSE;
for (i = len - 1; i > 0; i--)
{
if (file[i] == '.')
{
if (is_gz)
break;
else if (strcasecmp(file + i + 1, "gz") == 0)
is_gz = EINA_TRUE;
else
break;
}
}
if (i < 1) return EINA_FALSE;
i++;
if (i >= len) return EINA_FALSE;
if (strncasecmp(file + i, "svg", 3) != 0) return EINA_FALSE;
i += 3;
if (is_gz)
{
if (file[i] == '.') return EINA_TRUE;
else return EINA_FALSE;
}
else
{
if (file[i] == '\0') return EINA_TRUE;
else if (((file[i] == 'z') || (file[i] == 'Z')) && (!file[i + 1])) return EINA_TRUE;
else return EINA_FALSE;
}
}
static Eina_Bool
evas_image_load_file_head_svg(Image_Entry *ie, const char *file, const char *key EINA_UNUSED, int *error)
{
Ender_Element *e;
int w, h;
double sw, sh;
/* ignore all files not called .svg or .svg.gz - because rsvg has a leak
* where closing the handle doesn't free mem */
if (!evas_image_load_file_is_svg(file))
{
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
return EINA_FALSE;
}
e = esvg_parser_load(file);
if (!e)
{
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
return EINA_FALSE;
}
esvg_svg_x_dpi_set(e, 92.0);
esvg_svg_y_dpi_set(e, 92.0);
esvg_svg_actual_width_get(e, &sw);
esvg_svg_actual_height_get(e, &sh);
w = (int)ceil(sw);
h = (int)ceil(sh);
if ((w < 1) || (h < 1) || (w > IMG_MAX_SIZE) || (h > IMG_MAX_SIZE) ||
IMG_TOO_BIG(w, h))
{
ender_element_unref(e);
if (IMG_TOO_BIG(w, h))
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
else
*error = EVAS_LOAD_ERROR_GENERIC;
return EINA_FALSE;
}
if (ie->load_opts.scale_down_by > 1)
{
w /= ie->load_opts.scale_down_by;
h /= ie->load_opts.scale_down_by;
}
else if (ie->load_opts.dpi > 0.0)
{
w = (w * ie->load_opts.dpi) / 75.0;
h = (h * ie->load_opts.dpi) / 75.0;
}
else if ((ie->load_opts.w > 0) &&
(ie->load_opts.h > 0))
{
unsigned int w2, h2;
w2 = ie->load_opts.w;
h2 = (ie->load_opts.w * h) / w;
if (h2 > ie->load_opts.h)
{
h2 = ie->load_opts.h;
w2 = (ie->load_opts.h * w) / h;
}
w = w2;
h = h2;
}
if (w < 1) w = 1;
if (h < 1) h = 1;
ie->w = w;
ie->h = h;
ie->flags.alpha = 1;
ender_element_unref(e);
*error = EVAS_LOAD_ERROR_NONE;
return EINA_TRUE;
}
/** FIXME: All evas loaders need to be tightened up **/
static Eina_Bool
evas_image_load_file_data_svg(Image_Entry *ie, const char *file, const char *key EINA_UNUSED, int *error)
{
DATA32 *pixels;
Ender_Element *e;
Enesim_Error *err = NULL;
Enesim_Surface *s;
void *data;
size_t stride;
int w, h;
double sw, sh;
if (!evas_image_load_file_is_svg(file))
{
*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
return EINA_FALSE;
}
e = esvg_parser_load(file);
if (!e)
{
*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
return EINA_FALSE;
}
esvg_svg_x_dpi_set(e, 92.0);
esvg_svg_y_dpi_set(e, 92.0);
esvg_svg_actual_width_get(e, &sw);
esvg_svg_actual_height_get(e, &sh);
w = (int)ceil(sw);
h = (int)ceil(sh);
if ((w < 1) || (h < 1) || (w > IMG_MAX_SIZE) || (h > IMG_MAX_SIZE))
{
ender_element_unref(e);
if (IMG_TOO_BIG(w, h))
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
else
*error = EVAS_LOAD_ERROR_GENERIC;
goto unref_renderer;
}
if (ie->load_opts.scale_down_by > 1)
{
w /= ie->load_opts.scale_down_by;
h /= ie->load_opts.scale_down_by;
}
else if (ie->load_opts.dpi > 0.0)
{
w = (w * ie->load_opts.dpi) / 75.0;
h = (h * ie->load_opts.dpi) / 75.0;
}
else if ((ie->load_opts.w > 0) &&
(ie->load_opts.h > 0))
{
unsigned int w2, h2;
w2 = ie->load_opts.w;
h2 = (ie->load_opts.w * h) / w;
if (h2 > ie->load_opts.h)
{
h2 = ie->load_opts.h;
w2 = (ie->load_opts.h * w) / h;
}
w = w2;
h = h2;
}
if (w < 1) w = 1;
if (h < 1) h = 1;
if ((w != (int)ie->w) || (h != (int)ie->h))
{
*error = EVAS_LOAD_ERROR_GENERIC;
goto unref_renderer;
}
ie->flags.alpha = 1;
evas_cache_image_surface_alloc(ie, w, h);
pixels = evas_cache_image_pixels(ie);
if (!pixels)
{
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
goto unref_renderer;
}
memset(pixels, 0, w * h * sizeof(DATA32));
s = enesim_surface_new(ENESIM_FORMAT_ARGB8888, w, h);
if (!s)
{
*error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
goto unref_renderer;
}
esvg_svg_setup(e, NULL);
if (!esvg_svg_draw(e, s, NULL, 0, 0, &err))
{
*error = EVAS_LOAD_ERROR_GENERIC;
enesim_error_dump(err);
goto unref_surface;
}
if (!enesim_surface_data_get(s, &data, &stride))
{
*error = EVAS_LOAD_ERROR_GENERIC;
goto unref_surface;
}
/* printf("test : %d %d\n", w * h * sizeof(int), h * stride); */
/* if ((w * h * sizeof(int)) != (h * stride)) */
/* { */
/* *error = EVAS_LOAD_ERROR_GENERIC; */
/* goto unref_surface; */
/* } */
/* FIXME: scale to (double)ie->w / dim.em, (double)ie->h / dim.ex */
memcpy (pixels, data, h * stride);
enesim_surface_unref(s);
ender_element_unref(e);
evas_common_image_set_alpha_sparse(ie);
return EINA_TRUE;
unref_surface:
enesim_surface_unref(s);
unref_renderer:
ender_element_unref(e);
return EINA_FALSE;
}
static int
module_open(Evas_Module *em)
{
if (!em) return 0;
em->functions = (void *)(&evas_image_load_svg_func);
if (!esvg_initialized) esvg_init();
esvg_initialized = EINA_TRUE;
return 1;
}
static void
module_close(Evas_Module *em EINA_UNUSED)
{
if (!esvg_initialized) return;
esvg_shutdown();
esvg_initialized = EINA_FALSE;
}
static Evas_Module_Api evas_modapi =
{
EVAS_MODULE_API_VERSION,
"svg",
"none",
{
module_open,
module_close
}
};
EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_IMAGE_LOADER, image_loader, svg);
#ifndef EVAS_STATIC_BUILD_SVG
EVAS_EINA_MODULE_DEFINE(image_loader, svg);
#endif