forked from enlightenment/efl
evas: remove svg loader from inside the merged tree.
This commit is contained in:
parent
49e88118d5
commit
2b61da5a5a
|
@ -1,3 +1,7 @@
|
||||||
|
2013-05-06 Cedric Bail
|
||||||
|
|
||||||
|
* Evas: Remove SVG loader from inside the merged tree.
|
||||||
|
|
||||||
2013-05-06 ChunEon Park (Hermet)
|
2013-05-06 ChunEon Park (Hermet)
|
||||||
|
|
||||||
* Evas: update the map smart members really when it needs to render.
|
* Evas: update the map smart members really when it needs to render.
|
||||||
|
|
1
NEWS
1
NEWS
|
@ -120,6 +120,7 @@ Deprecations:
|
||||||
Removed:
|
Removed:
|
||||||
* directfb support: ecore_directfb and evas directfb engine.
|
* directfb support: ecore_directfb and evas directfb engine.
|
||||||
* Removed XRender, WinCE, Glew, Direct3d, X11-16 and X11-8 ecore_evas support.
|
* Removed XRender, WinCE, Glew, Direct3d, X11-16 and X11-8 ecore_evas support.
|
||||||
|
* Removed svg from inside merged tree.
|
||||||
|
|
||||||
Improvements:
|
Improvements:
|
||||||
* Reduced number of enqueued font commands when rendering textgrid objects
|
* Reduced number of enqueued font commands when rendering textgrid objects
|
||||||
|
|
|
@ -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
|
|
Loading…
Reference in New Issue