2010-07-28 05:00:41 -07:00
|
|
|
#include "evas_common.h" /* Also includes international specific stuff */
|
2006-03-02 00:06:10 -08:00
|
|
|
#include "evas_private.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
*****
|
|
|
|
**
|
|
|
|
** ENGINE ROUTINES
|
|
|
|
**
|
|
|
|
*****
|
|
|
|
*/
|
2006-11-15 19:20:24 -08:00
|
|
|
static int cpunum = 0;
|
2009-10-22 08:22:22 -07:00
|
|
|
static int _evas_soft_gen_log_dom = -1;
|
2010-04-12 01:23:53 -07:00
|
|
|
|
|
|
|
static void
|
|
|
|
eng_output_dump(void *data __UNUSED__)
|
|
|
|
{
|
|
|
|
evas_common_image_image_all_unload();
|
|
|
|
evas_common_font_font_all_unload();
|
|
|
|
}
|
|
|
|
|
2006-03-02 00:06:10 -08:00
|
|
|
static void *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_new(void *data __UNUSED__)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
return evas_common_draw_context_new();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_free(void *data __UNUSED__, void *context)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_draw_context_free(context);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_clip_set(void *data __UNUSED__, void *context, int x, int y, int w, int h)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_draw_context_set_clip(context, x, y, w, h);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_clip_clip(void *data __UNUSED__, void *context, int x, int y, int w, int h)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_draw_context_clip_clip(context, x, y, w, h);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_clip_unset(void *data __UNUSED__, void *context)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_draw_context_unset_clip(context);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_clip_get(void *data __UNUSED__, void *context, int *x, int *y, int *w, int *h)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
*x = ((RGBA_Draw_Context *)context)->clip.x;
|
|
|
|
*y = ((RGBA_Draw_Context *)context)->clip.y;
|
|
|
|
*w = ((RGBA_Draw_Context *)context)->clip.w;
|
|
|
|
*h = ((RGBA_Draw_Context *)context)->clip.h;
|
|
|
|
return ((RGBA_Draw_Context *)context)->clip.use;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_color_set(void *data __UNUSED__, void *context, int r, int g, int b, int a)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_draw_context_set_color(context, r, g, b, a);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_color_get(void *data __UNUSED__, void *context, int *r, int *g, int *b, int *a)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
*r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->col.col));
|
|
|
|
*g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->col.col));
|
|
|
|
*b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->col.col));
|
|
|
|
*a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->col.col));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_multiplier_set(void *data __UNUSED__, void *context, int r, int g, int b, int a)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_draw_context_set_multiplier(context, r, g, b, a);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_multiplier_unset(void *data __UNUSED__, void *context)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_draw_context_unset_multiplier(context);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_multiplier_get(void *data __UNUSED__, void *context, int *r, int *g, int *b, int *a)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
*r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->mul.col));
|
|
|
|
*g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->mul.col));
|
|
|
|
*b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->mul.col));
|
|
|
|
*a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->mul.col));
|
|
|
|
return ((RGBA_Draw_Context *)context)->mul.use;
|
|
|
|
}
|
|
|
|
|
2011-04-05 22:38:38 -07:00
|
|
|
static void
|
|
|
|
eng_context_mask_set(void *data __UNUSED__, void *context, void *mask, int x, int y, int w, int h)
|
|
|
|
{
|
|
|
|
evas_common_draw_context_set_mask(context, mask, x, y, w, h);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
eng_context_mask_unset(void *data __UNUSED__, void *context)
|
|
|
|
{
|
|
|
|
evas_common_draw_context_unset_mask(context);
|
|
|
|
}
|
2011-04-05 23:10:31 -07:00
|
|
|
/*
|
2011-04-05 22:38:38 -07:00
|
|
|
static void *
|
|
|
|
eng_context_mask_get(void *data __UNUSED__, void *context)
|
|
|
|
{
|
|
|
|
return ((RGBA_Draw_Context *)context)->mask.mask;
|
|
|
|
}
|
2011-04-05 23:10:31 -07:00
|
|
|
*/
|
2011-04-05 22:38:38 -07:00
|
|
|
|
2006-03-02 00:06:10 -08:00
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_cutout_add(void *data __UNUSED__, void *context, int x, int y, int w, int h)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_draw_context_add_cutout(context, x, y, w, h);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_cutout_clear(void *data __UNUSED__, void *context)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_draw_context_clear_cutouts(context);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_anti_alias_set(void *data __UNUSED__, void *context, unsigned char aa)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_draw_context_set_anti_alias(context, aa);
|
|
|
|
}
|
|
|
|
|
|
|
|
static unsigned char
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_anti_alias_get(void *data __UNUSED__, void *context)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
return ((RGBA_Draw_Context *)context)->anti_alias;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_color_interpolation_set(void *data __UNUSED__, void *context, int color_space)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_draw_context_set_color_interpolation(context, color_space);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_color_interpolation_get(void *data __UNUSED__, void *context)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
return ((RGBA_Draw_Context *)context)->interpolation.color_space;
|
|
|
|
}
|
|
|
|
|
2006-05-02 00:28:49 -07:00
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_render_op_set(void *data __UNUSED__, void *context, int op)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
evas_common_draw_context_set_render_op(context, op);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_context_render_op_get(void *data __UNUSED__, void *context)
|
2006-05-02 00:28:49 -07:00
|
|
|
{
|
|
|
|
return ((RGBA_Draw_Context *)context)->render_op;
|
|
|
|
}
|
|
|
|
|
2006-03-02 00:06:10 -08:00
|
|
|
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_rectangle_draw(void *data __UNUSED__, void *context, void *surface, int x, int y, int w, int h)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2009-03-26 18:48:58 -07:00
|
|
|
#ifdef BUILD_PIPE_RENDER
|
2010-05-21 00:10:45 -07:00
|
|
|
if ((cpunum > 1)
|
|
|
|
#ifdef EVAS_FRAME_QUEUING
|
|
|
|
&& evas_common_frameq_enabled()
|
|
|
|
#endif
|
|
|
|
)
|
2006-11-15 19:20:24 -08:00
|
|
|
evas_common_pipe_rectangle_draw(surface, context, x, y, w, h);
|
|
|
|
else
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
evas_common_rectangle_draw(surface, context, x, y, w, h);
|
|
|
|
evas_common_cpu_end_opt();
|
|
|
|
}
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_line_draw(void *data __UNUSED__, void *context, void *surface, int x1, int y1, int x2, int y2)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2009-03-26 18:48:58 -07:00
|
|
|
#ifdef BUILD_PIPE_RENDER
|
2010-05-21 00:10:45 -07:00
|
|
|
if ((cpunum > 1)
|
|
|
|
#ifdef EVAS_FRAME_QUEUING
|
|
|
|
&& evas_common_frameq_enabled()
|
|
|
|
#endif
|
|
|
|
)
|
|
|
|
evas_common_pipe_line_draw(surface, context, x1, y1, x2, y2);
|
2006-11-15 19:20:24 -08:00
|
|
|
else
|
2006-11-13 15:23:44 -08:00
|
|
|
#endif
|
2006-11-15 19:20:24 -08:00
|
|
|
{
|
|
|
|
evas_common_line_draw(surface, context, x1, y1, x2, y2);
|
|
|
|
evas_common_cpu_end_opt();
|
|
|
|
}
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_polygon_point_add(void *data __UNUSED__, void *context __UNUSED__, void *polygon, int x, int y)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
return evas_common_polygon_point_add(polygon, x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_polygon_points_clear(void *data __UNUSED__, void *context __UNUSED__, void *polygon)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
return evas_common_polygon_points_clear(polygon);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-03-16 06:23:37 -07:00
|
|
|
eng_polygon_draw(void *data __UNUSED__, void *context, void *surface, void *polygon, int x, int y)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2009-03-26 18:48:58 -07:00
|
|
|
#ifdef BUILD_PIPE_RENDER
|
2010-05-21 00:10:45 -07:00
|
|
|
if ((cpunum > 1)
|
|
|
|
#ifdef EVAS_FRAME_QUEUING
|
|
|
|
&& evas_common_frameq_enabled()
|
|
|
|
#endif
|
|
|
|
)
|
2010-03-16 06:23:37 -07:00
|
|
|
evas_common_pipe_poly_draw(surface, context, polygon, x, y);
|
2006-11-15 19:20:24 -08:00
|
|
|
else
|
2006-11-13 15:23:44 -08:00
|
|
|
#endif
|
2006-11-15 19:20:24 -08:00
|
|
|
{
|
2010-03-16 06:23:37 -07:00
|
|
|
evas_common_polygon_draw(surface, context, polygon, x, y);
|
2006-11-15 19:20:24 -08:00
|
|
|
evas_common_cpu_end_opt();
|
|
|
|
}
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
2008-11-04 01:19:35 -08:00
|
|
|
static int
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_alpha_get(void *data __UNUSED__, void *image)
|
2008-11-04 01:19:35 -08:00
|
|
|
{
|
|
|
|
Image_Entry *im;
|
|
|
|
|
|
|
|
if (!image) return 1;
|
|
|
|
im = image;
|
|
|
|
switch (im->space)
|
|
|
|
{
|
|
|
|
case EVAS_COLORSPACE_ARGB8888:
|
|
|
|
if (im->flags.alpha) return 1;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_colorspace_get(void *data __UNUSED__, void *image)
|
2008-11-04 01:19:35 -08:00
|
|
|
{
|
|
|
|
Image_Entry *im;
|
|
|
|
|
|
|
|
if (!image) return EVAS_COLORSPACE_ARGB8888;
|
|
|
|
im = image;
|
|
|
|
return im->space;
|
|
|
|
}
|
|
|
|
|
2011-04-05 22:38:38 -07:00
|
|
|
static void
|
|
|
|
eng_image_mask_create(void *data __UNUSED__, void *image)
|
|
|
|
{
|
|
|
|
RGBA_Image *im;
|
|
|
|
int sz;
|
|
|
|
uint8_t *dst,*end;
|
|
|
|
uint32_t *src;
|
|
|
|
|
|
|
|
if (!image) return;
|
|
|
|
im = image;
|
|
|
|
if (im->mask.mask && !im->mask.dirty) return;
|
|
|
|
|
|
|
|
if (im->mask.mask) free(im->mask.mask);
|
|
|
|
sz = im->cache_entry.w * im->cache_entry.h;
|
|
|
|
im->mask.mask = malloc(sz);
|
|
|
|
dst = im->mask.mask;
|
|
|
|
if (!im->image.data)
|
|
|
|
evas_cache_image_load_data(&im->cache_entry);
|
|
|
|
src = im->image.data;
|
2011-05-19 04:19:22 -07:00
|
|
|
if (!src) return;
|
2011-04-05 22:38:38 -07:00
|
|
|
for (end = dst + sz ; dst < end ; dst ++, src ++)
|
|
|
|
*dst = *src >> 24;
|
|
|
|
im->mask.dirty = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-11-04 01:19:35 -08:00
|
|
|
static void *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_alpha_set(void *data __UNUSED__, void *image, int has_alpha)
|
2008-11-04 01:19:35 -08:00
|
|
|
{
|
|
|
|
RGBA_Image *im;
|
|
|
|
|
|
|
|
if (!image) return NULL;
|
|
|
|
im = image;
|
|
|
|
if (im->cache_entry.space != EVAS_COLORSPACE_ARGB8888)
|
|
|
|
{
|
|
|
|
im->cache_entry.flags.alpha = 0;
|
|
|
|
return im;
|
|
|
|
}
|
|
|
|
im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry);
|
|
|
|
evas_common_image_colorspace_dirty(im);
|
|
|
|
|
|
|
|
im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
|
|
|
|
return im;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_border_set(void *data __UNUSED__, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
|
2008-11-04 01:19:35 -08:00
|
|
|
{
|
|
|
|
RGBA_Image *im;
|
|
|
|
|
|
|
|
im = image;
|
|
|
|
return im;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_border_get(void *data __UNUSED__, void *image, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
|
2008-11-04 01:19:35 -08:00
|
|
|
{
|
|
|
|
RGBA_Image *im;
|
|
|
|
|
|
|
|
im = image;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__)
|
2008-11-04 01:19:35 -08:00
|
|
|
{
|
|
|
|
RGBA_Image *im;
|
|
|
|
|
|
|
|
if (!image) return NULL;
|
|
|
|
im = image;
|
|
|
|
return im->info.comment;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_format_get(void *data __UNUSED__, void *image __UNUSED__)
|
2008-11-04 01:19:35 -08:00
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_colorspace_set(void *data __UNUSED__, void *image, int cspace)
|
2008-11-04 01:19:35 -08:00
|
|
|
{
|
|
|
|
Image_Entry *im;
|
|
|
|
|
|
|
|
if (!image) return;
|
|
|
|
im = image;
|
|
|
|
evas_cache_image_colorspace(im, cspace);
|
|
|
|
}
|
|
|
|
|
2010-08-02 23:09:53 -07:00
|
|
|
static void *
|
|
|
|
eng_image_native_set(void *data __UNUSED__, void *image, void *native __UNUSED__)
|
2008-11-04 01:19:35 -08:00
|
|
|
{
|
2010-08-02 23:09:53 -07:00
|
|
|
return image;
|
2008-11-04 01:19:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_native_get(void *data __UNUSED__, void *image __UNUSED__)
|
2008-11-04 01:19:35 -08:00
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2006-03-02 00:06:10 -08:00
|
|
|
static void *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_load(void *data __UNUSED__, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2009-12-22 15:11:57 -08:00
|
|
|
*error = EVAS_LOAD_ERROR_NONE;
|
|
|
|
return evas_common_load_image_from_file(file, key, lo, error);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_new_from_data(void *data __UNUSED__, int w, int h, DATA32 *image_data, int alpha, int cspace)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2007-07-16 00:25:35 -07:00
|
|
|
return evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_new_from_copied_data(void *data __UNUSED__, int w, int h, DATA32 *image_data, int alpha, int cspace)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2007-07-16 00:25:35 -07:00
|
|
|
return evas_cache_image_copied_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_free(void *data __UNUSED__, void *image)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2007-07-16 00:25:35 -07:00
|
|
|
evas_cache_image_drop(image);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2008-06-10 02:22:27 -07:00
|
|
|
Image_Entry *im;
|
2006-03-02 00:06:10 -08:00
|
|
|
|
|
|
|
im = image;
|
2008-06-10 02:22:27 -07:00
|
|
|
if (w) *w = im->w;
|
|
|
|
if (h) *h = im->h;
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_size_set(void *data __UNUSED__, void *image, int w, int h)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2008-06-10 02:22:27 -07:00
|
|
|
Image_Entry *im;
|
2007-07-16 00:25:35 -07:00
|
|
|
|
|
|
|
im = image;
|
|
|
|
return evas_cache_image_size_set(image, w, h);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_dirty_region(void *data __UNUSED__, void *image, int x, int y, int w, int h)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2008-06-10 02:22:27 -07:00
|
|
|
Image_Entry *im = image;
|
2007-07-16 00:25:35 -07:00
|
|
|
|
2006-12-19 06:12:40 -08:00
|
|
|
if (!image) return NULL;
|
2008-06-10 02:22:27 -07:00
|
|
|
return evas_cache_image_dirty(im, x, y, w, h);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
2011-05-19 04:19:22 -07:00
|
|
|
eng_image_data_get(void *data __UNUSED__, void *image, int to_write, DATA32 **image_data, int *err)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
RGBA_Image *im;
|
2011-05-19 04:19:22 -07:00
|
|
|
int error;
|
2006-03-02 00:06:10 -08:00
|
|
|
|
2006-12-19 06:12:40 -08:00
|
|
|
if (!image)
|
|
|
|
{
|
|
|
|
*image_data = NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
2006-03-02 00:06:10 -08:00
|
|
|
im = image;
|
2011-05-19 04:19:22 -07:00
|
|
|
error = evas_cache_image_load_data(&im->cache_entry);
|
2008-04-11 17:32:30 -07:00
|
|
|
switch (im->cache_entry.space)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2006-12-17 07:48:52 -08:00
|
|
|
case EVAS_COLORSPACE_ARGB8888:
|
|
|
|
if (to_write)
|
2011-05-19 04:19:22 -07:00
|
|
|
im = (RGBA_Image *)evas_cache_image_alone(&im->cache_entry);
|
2008-04-11 17:32:30 -07:00
|
|
|
*image_data = im->image.data;
|
2006-12-17 07:48:52 -08:00
|
|
|
break;
|
|
|
|
case EVAS_COLORSPACE_YCBCR422P601_PL:
|
|
|
|
case EVAS_COLORSPACE_YCBCR422P709_PL:
|
2011-07-21 03:36:05 -07:00
|
|
|
case EVAS_COLORSPACE_YCBCR422601_PL:
|
2011-08-29 13:56:48 -07:00
|
|
|
case EVAS_COLORSPACE_YCBCR420NV12601_PL:
|
|
|
|
case EVAS_COLORSPACE_YCBCR420TM12601_PL:
|
2006-12-17 07:48:52 -08:00
|
|
|
*image_data = im->cs.data;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
abort();
|
|
|
|
break;
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
2011-05-19 04:19:22 -07:00
|
|
|
if (err) *err = error;
|
2006-03-02 00:06:10 -08:00
|
|
|
return im;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *
|
|
|
|
eng_image_data_put(void *data, void *image, DATA32 *image_data)
|
|
|
|
{
|
2006-12-17 08:46:30 -08:00
|
|
|
RGBA_Image *im, *im2;
|
2006-03-02 00:06:10 -08:00
|
|
|
|
2006-12-19 06:12:40 -08:00
|
|
|
if (!image) return NULL;
|
2006-03-02 00:06:10 -08:00
|
|
|
im = image;
|
2008-04-11 17:32:30 -07:00
|
|
|
switch (im->cache_entry.space)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2006-12-17 07:48:52 -08:00
|
|
|
case EVAS_COLORSPACE_ARGB8888:
|
2008-04-11 17:32:30 -07:00
|
|
|
if (image_data != im->image.data)
|
2006-12-17 07:48:52 -08:00
|
|
|
{
|
|
|
|
int w, h;
|
2007-07-16 00:25:35 -07:00
|
|
|
|
2008-04-11 17:32:30 -07:00
|
|
|
w = im->cache_entry.w;
|
|
|
|
h = im->cache_entry.h;
|
|
|
|
im2 = eng_image_new_from_data(data, w, h, image_data,
|
2006-12-17 08:46:30 -08:00
|
|
|
eng_image_alpha_get(data, image),
|
|
|
|
eng_image_colorspace_get(data, image));
|
2008-04-11 17:32:30 -07:00
|
|
|
evas_cache_image_drop(&im->cache_entry);
|
2006-12-17 08:46:30 -08:00
|
|
|
im = im2;
|
2006-12-17 07:48:52 -08:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case EVAS_COLORSPACE_YCBCR422P601_PL:
|
|
|
|
case EVAS_COLORSPACE_YCBCR422P709_PL:
|
2011-07-21 03:36:05 -07:00
|
|
|
case EVAS_COLORSPACE_YCBCR422601_PL:
|
2011-08-29 13:56:48 -07:00
|
|
|
case EVAS_COLORSPACE_YCBCR420NV12601_PL:
|
|
|
|
case EVAS_COLORSPACE_YCBCR420TM12601_PL:
|
2006-12-17 07:48:52 -08:00
|
|
|
if (image_data != im->cs.data)
|
|
|
|
{
|
|
|
|
if (im->cs.data)
|
|
|
|
{
|
|
|
|
if (!im->cs.no_free) free(im->cs.data);
|
|
|
|
}
|
|
|
|
im->cs.data = image_data;
|
|
|
|
}
|
2011-10-21 07:06:42 -07:00
|
|
|
evas_common_image_colorspace_dirty(im);
|
2006-12-17 07:48:52 -08:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
abort();
|
|
|
|
break;
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
2006-06-07 16:30:15 -07:00
|
|
|
return im;
|
|
|
|
}
|
|
|
|
|
2008-09-16 07:52:57 -07:00
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
|
2008-09-16 07:52:57 -07:00
|
|
|
{
|
|
|
|
RGBA_Image *im = image;
|
|
|
|
|
|
|
|
if (!im) return ;
|
|
|
|
evas_cache_image_preload_data(&im->cache_entry, target);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
|
2008-09-16 07:52:57 -07:00
|
|
|
{
|
|
|
|
RGBA_Image *im = image;
|
|
|
|
|
|
|
|
if (!im) return ;
|
2009-01-20 06:56:37 -08:00
|
|
|
evas_cache_image_preload_cancel(&im->cache_entry, target);
|
2008-09-16 07:52:57 -07:00
|
|
|
}
|
|
|
|
|
2008-11-04 01:19:35 -08:00
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_draw(void *data __UNUSED__, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
|
2006-06-07 16:30:15 -07:00
|
|
|
{
|
|
|
|
RGBA_Image *im;
|
2007-07-16 00:25:35 -07:00
|
|
|
|
2008-11-04 01:19:35 -08:00
|
|
|
if (!image) return;
|
2008-11-03 14:50:54 -08:00
|
|
|
im = image;
|
2009-03-26 18:48:58 -07:00
|
|
|
#ifdef BUILD_PIPE_RENDER
|
2010-05-21 00:10:45 -07:00
|
|
|
if ((cpunum > 1)
|
|
|
|
#ifdef EVAS_FRAME_QUEUING
|
|
|
|
&& evas_common_frameq_enabled()
|
|
|
|
#endif
|
|
|
|
)
|
2009-03-26 20:50:03 -07:00
|
|
|
{
|
2010-06-19 23:32:05 -07:00
|
|
|
evas_common_rgba_image_scalecache_prepare((Image_Entry *)(im),
|
|
|
|
surface, context, smooth,
|
2009-03-26 20:50:03 -07:00
|
|
|
src_x, src_y, src_w, src_h,
|
|
|
|
dst_x, dst_y, dst_w, dst_h);
|
|
|
|
|
|
|
|
evas_common_pipe_image_draw(im, surface, context, smooth,
|
|
|
|
src_x, src_y, src_w, src_h,
|
|
|
|
dst_x, dst_y, dst_w, dst_h);
|
|
|
|
}
|
2006-03-02 00:06:10 -08:00
|
|
|
else
|
2006-11-13 15:23:44 -08:00
|
|
|
#endif
|
2008-11-04 01:19:35 -08:00
|
|
|
{
|
2009-03-26 23:06:45 -07:00
|
|
|
// if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
|
|
|
|
// evas_cache_image_load_data(&im->cache_entry);
|
|
|
|
// evas_common_image_colorspace_normalize(im);
|
2009-12-21 07:52:12 -08:00
|
|
|
evas_common_rgba_image_scalecache_prepare(&im->cache_entry, surface, context, smooth,
|
2009-03-26 20:50:03 -07:00
|
|
|
src_x, src_y, src_w, src_h,
|
|
|
|
dst_x, dst_y, dst_w, dst_h);
|
2009-12-21 07:52:12 -08:00
|
|
|
evas_common_rgba_image_scalecache_do(&im->cache_entry, surface, context, smooth,
|
2009-03-26 00:14:08 -07:00
|
|
|
src_x, src_y, src_w, src_h,
|
|
|
|
dst_x, dst_y, dst_w, dst_h);
|
|
|
|
/*
|
2008-12-01 18:33:09 -08:00
|
|
|
if (smooth)
|
|
|
|
evas_common_scale_rgba_in_to_out_clip_smooth(im, surface, context,
|
|
|
|
src_x, src_y, src_w, src_h,
|
|
|
|
dst_x, dst_y, dst_w, dst_h);
|
|
|
|
else
|
|
|
|
evas_common_scale_rgba_in_to_out_clip_sample(im, surface, context,
|
|
|
|
src_x, src_y, src_w, src_h,
|
|
|
|
dst_x, dst_y, dst_w, dst_h);
|
2009-03-26 00:14:08 -07:00
|
|
|
*/
|
2008-11-04 01:19:35 -08:00
|
|
|
evas_common_cpu_end_opt();
|
|
|
|
}
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
2009-10-20 09:03:57 -07:00
|
|
|
static void
|
2011-02-06 15:52:17 -08:00
|
|
|
eng_image_map_draw(void *data __UNUSED__, void *context, void *surface, void *image, int npoints, RGBA_Map_Point *p, int smooth, int level)
|
2009-10-20 09:03:57 -07:00
|
|
|
{
|
2010-09-18 07:23:20 -07:00
|
|
|
RGBA_Image *im;
|
2009-10-20 09:03:57 -07:00
|
|
|
|
|
|
|
if (!image) return;
|
2011-02-06 15:52:17 -08:00
|
|
|
if (npoints < 3) return;
|
2009-10-20 09:03:57 -07:00
|
|
|
im = image;
|
2011-02-06 15:52:17 -08:00
|
|
|
|
2010-01-26 22:49:21 -08:00
|
|
|
if ((p[0].x == p[3].x) &&
|
|
|
|
(p[1].x == p[2].x) &&
|
|
|
|
(p[0].y == p[1].y) &&
|
|
|
|
(p[3].y == p[2].y) &&
|
2010-04-30 04:24:22 -07:00
|
|
|
(p[0].x <= p[1].x) &&
|
|
|
|
(p[0].y <= p[2].y) &&
|
2010-01-26 22:49:21 -08:00
|
|
|
(p[0].u == 0) &&
|
|
|
|
(p[0].v == 0) &&
|
2010-09-18 16:16:25 -07:00
|
|
|
(p[1].u == (int)(im->cache_entry.w << FP)) &&
|
2010-01-26 22:49:21 -08:00
|
|
|
(p[1].v == 0) &&
|
2010-09-18 16:16:25 -07:00
|
|
|
(p[2].u == (int)(im->cache_entry.w << FP)) &&
|
|
|
|
(p[2].v == (int)(im->cache_entry.h << FP)) &&
|
2010-01-26 22:49:21 -08:00
|
|
|
(p[3].u == 0) &&
|
2010-09-18 16:16:25 -07:00
|
|
|
(p[3].v == (int)(im->cache_entry.h << FP)) &&
|
2010-02-17 23:10:28 -08:00
|
|
|
(p[0].col == 0xffffffff) &&
|
|
|
|
(p[1].col == 0xffffffff) &&
|
|
|
|
(p[2].col == 0xffffffff) &&
|
|
|
|
(p[3].col == 0xffffffff))
|
2010-01-26 22:49:21 -08:00
|
|
|
{
|
|
|
|
int dx, dy, dw, dh;
|
2010-05-21 00:10:45 -07:00
|
|
|
|
2010-01-26 22:49:21 -08:00
|
|
|
dx = p[0].x >> FP;
|
|
|
|
dy = p[0].y >> FP;
|
|
|
|
dw = (p[2].x >> FP) - dx;
|
|
|
|
dh = (p[2].y >> FP) - dy;
|
|
|
|
eng_image_draw
|
|
|
|
(data, context, surface, image,
|
|
|
|
0, 0, im->cache_entry.w, im->cache_entry.h,
|
|
|
|
dx, dy, dw, dh, smooth);
|
|
|
|
}
|
|
|
|
else
|
2010-04-30 04:24:22 -07:00
|
|
|
{
|
2010-03-24 09:39:39 -07:00
|
|
|
#ifdef BUILD_PIPE_RENDER
|
2010-05-21 00:10:45 -07:00
|
|
|
if ((cpunum > 1)
|
|
|
|
# ifdef EVAS_FRAME_QUEUING
|
|
|
|
&& evas_common_frameq_enabled()
|
|
|
|
# endif
|
|
|
|
)
|
2011-02-06 15:52:17 -08:00
|
|
|
evas_common_pipe_map_draw(im, surface, context, npoints, p, smooth, level);
|
2010-04-30 04:24:22 -07:00
|
|
|
else
|
2010-03-24 09:39:39 -07:00
|
|
|
#endif
|
2011-02-06 15:52:17 -08:00
|
|
|
evas_common_map_rgba(im, surface, context, npoints, p, smooth, level);
|
2010-04-30 04:24:22 -07:00
|
|
|
}
|
2009-10-20 09:03:57 -07:00
|
|
|
evas_common_cpu_end_opt();
|
2011-02-06 15:52:17 -08:00
|
|
|
|
|
|
|
if (npoints > 4)
|
|
|
|
{
|
|
|
|
eng_image_map_draw(data, context, surface, image, npoints - 2, p + 2,
|
2011-02-08 04:10:58 -08:00
|
|
|
smooth, level);
|
2011-02-06 15:52:17 -08:00
|
|
|
}
|
2009-10-20 09:03:57 -07:00
|
|
|
}
|
|
|
|
|
2009-10-28 01:59:01 -07:00
|
|
|
static void *
|
|
|
|
eng_image_map_surface_new(void *data __UNUSED__, int w, int h, int alpha)
|
|
|
|
{
|
|
|
|
void *surface;
|
|
|
|
DATA32 *pixels;
|
|
|
|
surface = evas_cache_image_copied_data(evas_common_image_cache_get(),
|
|
|
|
w, h, NULL, alpha,
|
|
|
|
EVAS_COLORSPACE_ARGB8888);
|
|
|
|
pixels = evas_cache_image_pixels(surface);
|
|
|
|
return surface;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
eng_image_map_surface_free(void *data __UNUSED__, void *surface)
|
|
|
|
{
|
|
|
|
evas_cache_image_drop(surface);
|
|
|
|
}
|
|
|
|
|
2009-05-07 06:29:56 -07:00
|
|
|
static void
|
|
|
|
eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
|
|
|
|
{
|
|
|
|
Image_Entry *im;
|
|
|
|
|
|
|
|
if (!image) return;
|
|
|
|
im = image;
|
|
|
|
im->scale_hint = hint;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
eng_image_scale_hint_get(void *data __UNUSED__, void *image)
|
|
|
|
{
|
|
|
|
Image_Entry *im;
|
|
|
|
|
|
|
|
if (!image) return EVAS_IMAGE_SCALE_HINT_NONE;
|
|
|
|
im = image;
|
|
|
|
return im->scale_hint;
|
|
|
|
}
|
|
|
|
|
2011-08-10 23:04:08 -07:00
|
|
|
static Eina_Bool
|
|
|
|
eng_image_animated_get(void *data __UNUSED__, void *image)
|
|
|
|
{
|
|
|
|
Image_Entry *im;
|
|
|
|
|
|
|
|
if (!image) return EINA_FALSE;
|
|
|
|
im = image;
|
|
|
|
return im->flags.animated;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
eng_image_animated_frame_count_get(void *data __UNUSED__, void *image)
|
|
|
|
{
|
|
|
|
Image_Entry *im;
|
|
|
|
|
|
|
|
if (!image) return -1;
|
|
|
|
im = image;
|
|
|
|
if (!im->flags.animated) return -1;
|
|
|
|
return im->frame_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Evas_Image_Animated_Loop_Hint
|
|
|
|
eng_image_animated_loop_type_get(void *data __UNUSED__, void *image)
|
|
|
|
{
|
|
|
|
Image_Entry *im;
|
|
|
|
|
|
|
|
if (!image) return EVAS_IMAGE_ANIMATED_HINT_NONE;
|
|
|
|
im = image;
|
|
|
|
if (!im->flags.animated) return EVAS_IMAGE_ANIMATED_HINT_NONE;
|
|
|
|
return im->loop_hint;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
eng_image_animated_loop_count_get(void *data __UNUSED__, void *image)
|
|
|
|
{
|
|
|
|
Image_Entry *im;
|
|
|
|
|
|
|
|
if (!image) return -1;
|
|
|
|
im = image;
|
|
|
|
if (!im->flags.animated) return -1;
|
|
|
|
return im->loop_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
static double
|
|
|
|
eng_image_animated_frame_duration_get(void *data __UNUSED__, void *image, int start_frame, int frame_num)
|
|
|
|
{
|
|
|
|
Image_Entry *im;
|
|
|
|
|
|
|
|
if (!image) return -1;
|
|
|
|
im = image;
|
|
|
|
if (!im->flags.animated) return -1;
|
|
|
|
return evas_common_load_rgba_image_frame_duration_from_file(im, start_frame, frame_num);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
eng_image_animated_frame_set(void *data __UNUSED__, void *image, int frame_index)
|
|
|
|
{
|
|
|
|
Image_Entry *im;
|
|
|
|
|
|
|
|
if (!image) return EINA_FALSE;
|
|
|
|
im = image;
|
|
|
|
if (!im->flags.animated) return EINA_FALSE;
|
|
|
|
if (im->cur_frame == frame_index) return EINA_FALSE;
|
|
|
|
im->cur_frame = frame_index;
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
2006-03-02 00:06:10 -08:00
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_cache_flush(void *data __UNUSED__)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
int tmp_size;
|
|
|
|
|
|
|
|
tmp_size = evas_common_image_get_cache();
|
|
|
|
evas_common_image_set_cache(0);
|
2009-04-09 06:20:00 -07:00
|
|
|
evas_common_rgba_image_scalecache_flush();
|
2006-03-02 00:06:10 -08:00
|
|
|
evas_common_image_set_cache(tmp_size);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_cache_set(void *data __UNUSED__, int bytes)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_image_set_cache(bytes);
|
2009-04-09 06:20:00 -07:00
|
|
|
evas_common_rgba_image_scalecache_size_set(bytes);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_image_cache_get(void *data __UNUSED__)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
return evas_common_image_get_cache();
|
|
|
|
}
|
|
|
|
|
2011-05-29 06:00:54 -07:00
|
|
|
static Evas_Font_Set *
|
2011-04-12 02:05:47 -07:00
|
|
|
eng_font_load(void *data __UNUSED__, const char *name, int size,
|
|
|
|
Font_Rend_Flags wanted_rend)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return (Evas_Font_Set *) evas_common_font_load(name, size, wanted_rend);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
2011-05-29 06:00:54 -07:00
|
|
|
static Evas_Font_Set *
|
2011-04-12 02:05:47 -07:00
|
|
|
eng_font_memory_load(void *data __UNUSED__, char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return (Evas_Font_Set *) evas_common_font_memory_load(name, size, fdata,
|
|
|
|
fdata_size, wanted_rend);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
2011-05-29 06:00:54 -07:00
|
|
|
static Evas_Font_Set *
|
|
|
|
eng_font_add(void *data __UNUSED__, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return (Evas_Font_Set *) evas_common_font_add((RGBA_Font *) font, name,
|
|
|
|
size, wanted_rend);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
2011-05-29 06:00:54 -07:00
|
|
|
static Evas_Font_Set *
|
|
|
|
eng_font_memory_add(void *data __UNUSED__, Evas_Font_Set *font, char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return (Evas_Font_Set *) evas_common_font_memory_add((RGBA_Font *) font,
|
|
|
|
name, size, fdata, fdata_size, wanted_rend);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_free(void *data __UNUSED__, Evas_Font_Set *font)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
evas_common_font_free((RGBA_Font *) font);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_ascent_get(void *data __UNUSED__, Evas_Font_Set *font)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_font_ascent_get((RGBA_Font *) font);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_descent_get(void *data __UNUSED__, Evas_Font_Set *font)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_font_descent_get((RGBA_Font *) font);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_max_ascent_get(void *data __UNUSED__, Evas_Font_Set *font)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_font_max_ascent_get((RGBA_Font *) font);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_max_descent_get(void *data __UNUSED__, Evas_Font_Set *font)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_font_max_descent_get((RGBA_Font *) font);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_string_size_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int *w, int *h)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
evas_common_font_query_size((RGBA_Font *) font, text_props, w, h);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_inset_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_font_query_inset((RGBA_Font *) font, text_props);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
2011-03-29 06:52:22 -07:00
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_right_inset_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
|
2011-03-29 06:52:22 -07:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_font_query_right_inset((RGBA_Font *) font, text_props);
|
2011-03-29 06:52:22 -07:00
|
|
|
}
|
|
|
|
|
2006-03-02 00:06:10 -08:00
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_h_advance_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
int h, v;
|
|
|
|
|
2011-05-29 06:00:54 -07:00
|
|
|
evas_common_font_query_advance((RGBA_Font *) font, text_props, &h, &v);
|
2006-03-02 00:06:10 -08:00
|
|
|
return h;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_v_advance_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
int h, v;
|
|
|
|
|
2011-05-29 06:00:54 -07:00
|
|
|
evas_common_font_query_advance((RGBA_Font *) font, text_props, &h, &v);
|
2006-03-02 00:06:10 -08:00
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
2011-01-30 02:34:07 -08:00
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_pen_coords_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int pos, int *cpen_x, int *cy, int *cadv, int *ch)
|
2011-01-30 02:34:07 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_font_query_pen_coords((RGBA_Font *) font, text_props, pos, cpen_x, cy, cadv, ch);
|
2011-01-30 02:34:07 -08:00
|
|
|
}
|
|
|
|
|
2011-01-30 02:36:39 -08:00
|
|
|
static Eina_Bool
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_text_props_info_create(void *data __UNUSED__, Evas_Font_Instance *fi, const Eina_Unicode *text, Evas_Text_Props *text_props, const Evas_BiDi_Paragraph_Props *par_props, size_t par_pos, size_t len)
|
2011-04-13 01:37:01 -07:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_text_props_content_create((RGBA_Font_Int *) fi, text,
|
|
|
|
text_props, par_props, par_pos, len);
|
2011-01-30 02:36:39 -08:00
|
|
|
}
|
|
|
|
|
2006-03-02 00:06:10 -08:00
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_char_coords_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int pos, int *cx, int *cy, int *cw, int *ch)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_font_query_char_coords((RGBA_Font *) font, text_props, pos, cx, cy, cw, ch);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_char_at_coords_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int x, int y, int *cx, int *cy, int *cw, int *ch)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_font_query_char_at_coords((RGBA_Font *) font, text_props, x, y, cx, cy, cw, ch);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
2009-09-29 21:23:21 -07:00
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_last_up_to_pos(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int x, int y)
|
2009-09-29 21:23:21 -07:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_font_query_last_up_to_pos((RGBA_Font *) font, text_props, x, y);
|
2009-09-29 21:23:21 -07:00
|
|
|
}
|
|
|
|
|
2011-05-29 02:20:18 -07:00
|
|
|
static int
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_run_font_end_get(void *data __UNUSED__, Evas_Font_Set *font, Evas_Font_Instance **script_fi, Evas_Font_Instance **cur_fi, Evas_Script_Type script, const Eina_Unicode *text, int run_len)
|
2011-05-29 02:20:18 -07:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
return evas_common_font_query_run_font_end_get((RGBA_Font *) font,
|
2011-05-29 02:20:18 -07:00
|
|
|
(RGBA_Font_Int **) script_fi, (RGBA_Font_Int **) cur_fi,
|
|
|
|
script, text, run_len);
|
|
|
|
}
|
|
|
|
|
2006-03-02 00:06:10 -08:00
|
|
|
static void
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_draw(void *data __UNUSED__, void *context, void *surface, Evas_Font_Set *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const Evas_Text_Props *text_props)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2009-03-26 18:48:58 -07:00
|
|
|
#ifdef BUILD_PIPE_RENDER
|
2010-05-21 00:10:45 -07:00
|
|
|
if ((cpunum > 1)
|
|
|
|
#ifdef EVAS_FRAME_QUEUING
|
|
|
|
&& evas_common_frameq_enabled()
|
|
|
|
#endif
|
|
|
|
)
|
2011-05-29 06:00:54 -07:00
|
|
|
evas_common_pipe_text_draw(surface, context, (RGBA_Font *) font, x, y,
|
|
|
|
text_props);
|
2006-03-02 00:06:10 -08:00
|
|
|
else
|
2006-11-15 19:20:24 -08:00
|
|
|
#endif
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
evas_common_font_draw(surface, context, (RGBA_Font *) font, x, y,
|
|
|
|
text_props);
|
2006-11-15 19:20:24 -08:00
|
|
|
evas_common_cpu_end_opt();
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_font_cache_flush(void *data __UNUSED__)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-02-09 22:12:09 -08:00
|
|
|
int tmp_size;
|
|
|
|
|
|
|
|
tmp_size = evas_common_font_cache_get();
|
|
|
|
evas_common_font_cache_set(0);
|
2006-03-02 00:06:10 -08:00
|
|
|
evas_common_font_flush();
|
2011-02-09 22:12:09 -08:00
|
|
|
evas_common_font_cache_set(tmp_size);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_font_cache_set(void *data __UNUSED__, int bytes)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
evas_common_font_cache_set(bytes);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_font_cache_get(void *data __UNUSED__)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
return evas_common_font_cache_get();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-05-29 06:00:54 -07:00
|
|
|
eng_font_hinting_set(void *data __UNUSED__, Evas_Font_Set *font, int hinting)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2011-05-29 06:00:54 -07:00
|
|
|
evas_common_font_hinting_set((RGBA_Font *) font, hinting);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2009-02-28 02:08:45 -08:00
|
|
|
eng_font_hinting_can_hint(void *data __UNUSED__, int hinting)
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
return evas_common_hinting_available(hinting);
|
|
|
|
}
|
|
|
|
|
2009-06-26 06:26:52 -07:00
|
|
|
static Eina_Bool
|
|
|
|
eng_canvas_alpha_get(void *data __UNUSED__, void *info __UNUSED__)
|
|
|
|
{
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
2006-03-02 00:06:10 -08:00
|
|
|
|
2011-04-18 22:47:56 -07:00
|
|
|
|
|
|
|
/* Filter API */
|
2011-06-02 03:40:43 -07:00
|
|
|
#if 0 // filtering disabled
|
2011-04-18 22:47:56 -07:00
|
|
|
static void
|
2011-04-20 01:01:04 -07:00
|
|
|
eng_image_draw_filtered(void *data __UNUSED__, void *context __UNUSED__,
|
|
|
|
void *surface, void *image, Evas_Filter_Info *filter)
|
2011-04-18 22:47:56 -07:00
|
|
|
{
|
|
|
|
Evas_Software_Filter_Fn fn;
|
|
|
|
RGBA_Image *im = image;
|
|
|
|
|
|
|
|
fn = evas_filter_software_get(filter);
|
|
|
|
if (!fn) return;
|
|
|
|
if (im->cache_entry.cache) evas_cache_image_load_data(&im->cache_entry);
|
|
|
|
fn(filter, image, surface);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Filtered_Image *
|
|
|
|
eng_image_filtered_get(void *image, uint8_t *key, size_t keylen)
|
|
|
|
{
|
|
|
|
RGBA_Image *im = image;
|
|
|
|
Filtered_Image *fi;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
for (l = im->filtered ; l ; l = l->next)
|
|
|
|
{
|
|
|
|
fi = l->data;
|
|
|
|
if (fi->keylen != keylen) continue;
|
|
|
|
if (memcmp(key, fi->key, keylen) != 0) continue;
|
|
|
|
fi->ref ++;
|
|
|
|
return fi;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Filtered_Image *
|
|
|
|
eng_image_filtered_save(void *image, void *fimage, uint8_t *key, size_t keylen)
|
|
|
|
{
|
|
|
|
RGBA_Image *im = image;
|
|
|
|
Filtered_Image *fi;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
for (l = im->filtered ; l ; l = l->next)
|
|
|
|
{
|
|
|
|
fi = l->data;
|
|
|
|
if (fi->keylen != keylen) continue;
|
|
|
|
if (memcmp(key, fi->key, keylen) == 0) continue;
|
|
|
|
evas_cache_image_drop((void *)fi->image);
|
|
|
|
fi->image = fimage;
|
|
|
|
return fi;
|
|
|
|
}
|
|
|
|
|
|
|
|
fi = calloc(1,sizeof(Filtered_Image));
|
|
|
|
if (!fi) return NULL;
|
|
|
|
|
|
|
|
fi->keylen = keylen;
|
|
|
|
fi->key = malloc(keylen);
|
|
|
|
memcpy(fi->key, key, keylen);
|
|
|
|
fi->image = fimage;
|
|
|
|
fi->ref = 1;
|
|
|
|
|
|
|
|
im->filtered = eina_list_prepend(im->filtered, fi);
|
|
|
|
|
|
|
|
return fi;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
eng_image_filtered_free(void *image, Filtered_Image *fi)
|
|
|
|
{
|
|
|
|
RGBA_Image *im = image;
|
|
|
|
|
|
|
|
fi->ref --;
|
|
|
|
if (fi->ref) return;
|
|
|
|
|
|
|
|
free(fi->key);
|
|
|
|
evas_cache_image_drop(&fi->image->cache_entry);
|
|
|
|
fi->image = NULL;
|
|
|
|
|
|
|
|
im->filtered = eina_list_remove(im->filtered, fi);
|
|
|
|
}
|
2011-06-02 03:40:43 -07:00
|
|
|
#endif
|
2011-04-18 22:47:56 -07:00
|
|
|
|
2011-05-19 04:19:22 -07:00
|
|
|
static int
|
2011-05-19 18:35:41 -07:00
|
|
|
eng_image_load_error_get(void *data __UNUSED__, void *image)
|
2011-05-19 04:19:22 -07:00
|
|
|
{
|
|
|
|
RGBA_Image *im;
|
|
|
|
|
|
|
|
if (!image) return EVAS_LOAD_ERROR_NONE;
|
|
|
|
im = image;
|
|
|
|
return im->cache_entry.load_error;
|
|
|
|
}
|
|
|
|
|
2006-03-02 00:06:10 -08:00
|
|
|
/*
|
|
|
|
*****
|
|
|
|
**
|
|
|
|
** ENGINE API
|
|
|
|
**
|
|
|
|
*****
|
|
|
|
*/
|
|
|
|
|
2006-03-02 01:16:46 -08:00
|
|
|
static Evas_Func func =
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2007-06-16 19:56:59 -07:00
|
|
|
NULL,
|
2010-04-12 01:23:53 -07:00
|
|
|
eng_output_dump,
|
2006-03-02 00:06:10 -08:00
|
|
|
/* draw context virtual methods */
|
|
|
|
eng_context_new,
|
2009-06-26 06:26:52 -07:00
|
|
|
eng_canvas_alpha_get,
|
2006-03-02 00:06:10 -08:00
|
|
|
eng_context_free,
|
|
|
|
eng_context_clip_set,
|
|
|
|
eng_context_clip_clip,
|
|
|
|
eng_context_clip_unset,
|
|
|
|
eng_context_clip_get,
|
2011-04-05 22:38:38 -07:00
|
|
|
eng_context_mask_set,
|
|
|
|
eng_context_mask_unset,
|
2006-03-02 00:06:10 -08:00
|
|
|
eng_context_color_set,
|
|
|
|
eng_context_color_get,
|
|
|
|
eng_context_multiplier_set,
|
|
|
|
eng_context_multiplier_unset,
|
|
|
|
eng_context_multiplier_get,
|
|
|
|
eng_context_cutout_add,
|
|
|
|
eng_context_cutout_clear,
|
|
|
|
eng_context_anti_alias_set,
|
|
|
|
eng_context_anti_alias_get,
|
|
|
|
eng_context_color_interpolation_set,
|
|
|
|
eng_context_color_interpolation_get,
|
2006-05-02 00:28:49 -07:00
|
|
|
eng_context_render_op_set,
|
|
|
|
eng_context_render_op_get,
|
2006-03-02 00:06:10 -08:00
|
|
|
/* rect draw funcs */
|
|
|
|
eng_rectangle_draw,
|
|
|
|
/* line draw funcs */
|
|
|
|
eng_line_draw,
|
|
|
|
/* polygon draw funcs */
|
|
|
|
eng_polygon_point_add,
|
|
|
|
eng_polygon_points_clear,
|
|
|
|
eng_polygon_draw,
|
2008-11-04 01:19:35 -08:00
|
|
|
/* image draw funcs */
|
2006-03-02 00:06:10 -08:00
|
|
|
eng_image_load,
|
|
|
|
eng_image_new_from_data,
|
|
|
|
eng_image_new_from_copied_data,
|
|
|
|
eng_image_free,
|
|
|
|
eng_image_size_get,
|
|
|
|
eng_image_size_set,
|
2007-07-23 07:22:57 -07:00
|
|
|
NULL,
|
2006-03-02 00:06:10 -08:00
|
|
|
eng_image_dirty_region,
|
|
|
|
eng_image_data_get,
|
|
|
|
eng_image_data_put,
|
2008-09-16 07:52:57 -07:00
|
|
|
eng_image_data_preload_request,
|
|
|
|
eng_image_data_preload_cancel,
|
2006-03-02 00:06:10 -08:00
|
|
|
eng_image_alpha_set,
|
|
|
|
eng_image_alpha_get,
|
2008-11-04 01:19:35 -08:00
|
|
|
eng_image_border_set,
|
|
|
|
eng_image_border_get,
|
2006-03-02 00:06:10 -08:00
|
|
|
eng_image_draw,
|
|
|
|
eng_image_comment_get,
|
|
|
|
eng_image_format_get,
|
2006-12-09 00:52:08 -08:00
|
|
|
eng_image_colorspace_set,
|
|
|
|
eng_image_colorspace_get,
|
2011-04-05 22:38:38 -07:00
|
|
|
eng_image_mask_create,
|
2006-12-09 00:52:08 -08:00
|
|
|
eng_image_native_set,
|
|
|
|
eng_image_native_get,
|
2006-03-02 00:06:10 -08:00
|
|
|
/* image cache funcs */
|
|
|
|
eng_image_cache_flush,
|
|
|
|
eng_image_cache_set,
|
|
|
|
eng_image_cache_get,
|
2008-11-04 01:19:35 -08:00
|
|
|
/* font draw functions */
|
2006-03-02 00:06:10 -08:00
|
|
|
eng_font_load,
|
|
|
|
eng_font_memory_load,
|
|
|
|
eng_font_add,
|
|
|
|
eng_font_memory_add,
|
|
|
|
eng_font_free,
|
|
|
|
eng_font_ascent_get,
|
|
|
|
eng_font_descent_get,
|
|
|
|
eng_font_max_ascent_get,
|
|
|
|
eng_font_max_descent_get,
|
|
|
|
eng_font_string_size_get,
|
|
|
|
eng_font_inset_get,
|
|
|
|
eng_font_h_advance_get,
|
|
|
|
eng_font_v_advance_get,
|
|
|
|
eng_font_char_coords_get,
|
|
|
|
eng_font_char_at_coords_get,
|
|
|
|
eng_font_draw,
|
|
|
|
/* font cache functions */
|
|
|
|
eng_font_cache_flush,
|
|
|
|
eng_font_cache_set,
|
|
|
|
eng_font_cache_get,
|
|
|
|
/* font hinting functions */
|
|
|
|
eng_font_hinting_set,
|
2009-05-07 06:29:56 -07:00
|
|
|
eng_font_hinting_can_hint,
|
|
|
|
eng_image_scale_hint_set,
|
2009-09-29 21:23:21 -07:00
|
|
|
eng_image_scale_hint_get,
|
|
|
|
/* more font draw functions */
|
2009-10-20 09:03:57 -07:00
|
|
|
eng_font_last_up_to_pos,
|
2011-02-06 15:52:17 -08:00
|
|
|
eng_image_map_draw,
|
2009-10-28 01:59:01 -07:00
|
|
|
eng_image_map_surface_new,
|
2010-08-11 23:11:13 -07:00
|
|
|
eng_image_map_surface_free,
|
2010-09-07 20:51:24 -07:00
|
|
|
NULL, // eng_image_content_hint_set - software doesn't use it
|
2011-01-30 02:34:07 -08:00
|
|
|
NULL, // eng_image_content_hint_get - software doesn't use it
|
2011-01-30 02:36:39 -08:00
|
|
|
eng_font_pen_coords_get,
|
2011-03-29 06:52:22 -07:00
|
|
|
eng_font_text_props_info_create,
|
2011-04-04 03:23:12 -07:00
|
|
|
eng_font_right_inset_get,
|
2011-06-02 03:40:43 -07:00
|
|
|
#if 0 // filtering disabled
|
2011-04-18 22:47:56 -07:00
|
|
|
eng_image_draw_filtered,
|
|
|
|
eng_image_filtered_get,
|
|
|
|
eng_image_filtered_save,
|
|
|
|
eng_image_filtered_free,
|
2011-06-02 03:40:43 -07:00
|
|
|
#endif
|
2011-04-04 03:23:12 -07:00
|
|
|
NULL, // FIXME: need software mesa for gl rendering <- gl_surface_create
|
|
|
|
NULL, // FIXME: need software mesa for gl rendering <- gl_surface_destroy
|
|
|
|
NULL, // FIXME: need software mesa for gl rendering <- gl_context_create
|
|
|
|
NULL, // FIXME: need software mesa for gl rendering <- gl_context_destroy
|
|
|
|
NULL, // FIXME: need software mesa for gl rendering <- gl_make_current
|
From: "Sung W. Park" <sungwoo@gmail.com>
Subject: Re: [E-devel] [E-Devel][Review][Patch] Evas GL Extensions + a
bug fix
Here's an initial attempt at the GL extensions issue for Evas GL.
I have been in discussion with a few EFL developers regarding how we should
provide extensions. Essentially, there are two ways to go about doing this.
1. provide evas_gl_proc_address_get() function as it is done in other
glue layers
2. provide all the extension functions in the EVAS_GL_API struct.
#1 approach is how it's done in other glue layers and the driver implementor can
provide new extensions easily. It is however pretty annoying to get the
function prototypes right and use the function pointers and etc.
#2 approach provides all the extension functions in the struct so it's
definitely easier to use. Adding new extensions can be a pain as people may
have to wait for new version releases.
For now, we thought it was OK to just throw them in the struct as in
#2 and try it out. So, I've implemented this approach. As for the extensions,
I've basically included all the extensions in gl2ext.h as EvasGL currently
provides all the GLES 2.0 functions. In order to display the right
information, I had to override glGetString() with GL_EXTENSIONS as parameter to properly
display the supported extensions.
Also, I've added a few EGL extensions that have been
modified for EvasGL use. For example, eglCreateImage/eglDestroyImage has been
defined as folllows.
EvasGLImage (*evasglCreateImage) (int target, void* buffer, int*
attrib_list); void
(*evasglDestroyImage)
(EvasGLImage image);
const char *evas_gl_string_query() function was added to return a string of
supported EvasGL extensions. So essentially, a user can search this string to see
if the desired extension is supported. if it is, he can use the functions. He can
always check if the function pointers are NULL as well.
Take a look at the pach and let me know what you think.
______________
While I was adding the extension code, I've added a few fixes/ changes
to the EvasGL.
1. glDeletBuffers bug
- When I wad destroying evasgl context, I was deleting the context FBO with
glDeleteBuffers instead of glDeleteFramebuffers. This code in effect was
deleting BOs in other contexts and we had some funky behaviors as a
result. The
bug has been fixed.
2. make_current
- I've made some changes to the make current code and also added a resource
context to the engine data. the resource context is used for creating surface
texture/ fbos when surface/ context is created. Before, i was using evas'
context but thought it'd be a good idea to use a separate context.
SVN revision: 64139
2011-10-18 01:13:23 -07:00
|
|
|
NULL, // FIXME: need software mesa for gl rendering <- gl_string_query
|
2011-04-04 03:23:12 -07:00
|
|
|
NULL, // FIXME: need software mesa for gl rendering <- gl_proc_address_get
|
2011-05-19 04:19:22 -07:00
|
|
|
NULL, // FIXME: need software mesa for gl rendering <- gl_native_surface_get
|
|
|
|
NULL, // FIXME: need software mesa for gl rendering <- gl_api_get
|
2011-05-29 02:20:18 -07:00
|
|
|
eng_image_load_error_get,
|
2011-08-10 23:04:08 -07:00
|
|
|
eng_font_run_font_end_get,
|
|
|
|
eng_image_animated_get,
|
|
|
|
eng_image_animated_frame_count_get,
|
|
|
|
eng_image_animated_loop_type_get,
|
|
|
|
eng_image_animated_loop_count_get,
|
|
|
|
eng_image_animated_frame_duration_get,
|
|
|
|
eng_image_animated_frame_set
|
2011-05-02 20:11:08 -07:00
|
|
|
/* FUTURE software generic calls go here */
|
2006-03-02 00:06:10 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
*****
|
|
|
|
**
|
|
|
|
** MODULE ACCESSIBLE API API
|
|
|
|
**
|
|
|
|
*****
|
|
|
|
*/
|
|
|
|
|
2009-06-16 06:01:36 -07:00
|
|
|
static int
|
2006-03-02 00:06:10 -08:00
|
|
|
module_open(Evas_Module *em)
|
|
|
|
{
|
|
|
|
if (!em) return 0;
|
2010-10-07 16:46:42 -07:00
|
|
|
_evas_soft_gen_log_dom = eina_log_domain_register
|
|
|
|
("evas-software_generic", EVAS_DEFAULT_LOG_COLOR);
|
2009-10-22 08:22:22 -07:00
|
|
|
if(_evas_soft_gen_log_dom<0)
|
|
|
|
{
|
2010-10-07 16:46:42 -07:00
|
|
|
EINA_LOG_ERR("Can not create a module log domain.");
|
|
|
|
return 0;
|
2009-10-22 08:22:22 -07:00
|
|
|
}
|
2006-03-02 01:16:46 -08:00
|
|
|
em->functions = (void *)(&func);
|
2009-07-30 09:45:15 -07:00
|
|
|
cpunum = eina_cpu_count();
|
2006-03-02 00:06:10 -08:00
|
|
|
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-03-02 00:06:10 -08:00
|
|
|
{
|
2009-10-22 08:22:22 -07:00
|
|
|
eina_log_domain_unregister(_evas_soft_gen_log_dom);
|
2006-03-02 00:06:10 -08:00
|
|
|
}
|
|
|
|
|
2009-06-16 06:01:36 -07:00
|
|
|
static Evas_Module_Api evas_modapi =
|
2006-03-02 00:06:10 -08:00
|
|
|
{
|
2009-06-16 06:01:36 -07:00
|
|
|
EVAS_MODULE_API_VERSION,
|
|
|
|
"software_generic",
|
|
|
|
"none",
|
|
|
|
{
|
|
|
|
module_open,
|
|
|
|
module_close
|
|
|
|
}
|
2006-03-02 00:06:10 -08:00
|
|
|
};
|
2009-06-16 06:01:36 -07:00
|
|
|
|
|
|
|
EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_generic);
|
|
|
|
|
|
|
|
#ifndef EVAS_STATIC_BUILD_SOFTWARE_GENERIC
|
|
|
|
EVAS_EINA_MODULE_DEFINE(engine, software_generic);
|
|
|
|
#endif
|