efl/src/modules/evas/engines/gl_common/evas_gl_image.c

1384 lines
43 KiB
C
Raw Normal View History

#include "evas_gl_private.h"
void
evas_gl_common_image_alloc_ensure(Evas_GL_Image *im)
{
if (!im->im) return;
im->im = (RGBA_Image *)evas_cache_image_size_set(&im->im->cache_entry,
im->w, im->h);
}
EAPI void
evas_gl_common_image_all_unload(Evas_Engine_GL_Context *gc)
{
Eina_List *l;
Evas_GL_Image *im;
EINA_LIST_FOREACH(gc->shared->images, l, im)
{
if (im->im)
evas_cache_image_unload_data(&im->im->cache_entry);
if (im->tex)
{
if (!im->tex->pt->dyn.img)
{
evas_gl_common_texture_free(im->tex, EINA_TRUE);
im->tex = NULL;
}
}
}
}
static void
_evas_gl_image_cache_trim(Evas_Engine_GL_Context *gc)
{
int size = evas_common_image_get_cache();
while (gc->shared->images_size > size)
{
Evas_GL_Image *im2;
Eina_List *l = NULL;
Eina_Bool removed = EINA_FALSE;
EINA_LIST_REVERSE_FOREACH(gc->shared->images, l, im2)
{
if (im2->references == 0)
{
im2->cached = 0;
im2->gc->shared->images =
eina_list_remove_list(im2->gc->shared->images, l);
im2->gc->shared->images_size -= (im2->csize);
evas_gl_common_image_free(im2);
l = NULL;
removed = EINA_TRUE;
break;
}
}
if (!removed || !gc->shared->images)
{
// still have referenced images - need to let others release
// refs on their own
break;
}
}
}
static Eina_Bool
_evas_gl_image_cache_add(Evas_GL_Image *im)
{
if (im->references == 0)
{
im->csize = im->w * im->h * 4;
im->gc->shared->images_size += im->csize;
_evas_gl_image_cache_trim(im->gc);
return EINA_TRUE;
}
else
{
im->gc->shared->images = eina_list_remove(im->gc->shared->images, im);
im->cached = 0;
}
return EINA_FALSE;
}
EAPI void
evas_gl_common_image_ref(Evas_GL_Image *im)
{
if (im->references == 0)
{
im->gc->shared->images_size -= (im->csize);
}
im->references++;
}
EAPI void
evas_gl_common_image_unref(Evas_GL_Image *im)
{
im->references--;
if (im->references == 0)
{
_evas_gl_image_cache_add(im);
}
}
static void
_evas_gl_cspace_list_fill(Evas_Engine_GL_Context *gc)
{
#define CS_APPEND(cs) gc->shared->info.cspaces = eina_list_append \
(gc->shared->info.cspaces, (void *) (intptr_t) cs)
if (gc->shared->info.etc2)
{
CS_APPEND(EVAS_COLORSPACE_RGBA8_ETC2_EAC);
CS_APPEND(EVAS_COLORSPACE_RGB8_ETC2);
CS_APPEND(EVAS_COLORSPACE_ETC1);
CS_APPEND(EVAS_COLORSPACE_ETC1_ALPHA);
}
else if (gc->shared->info.etc1)
{
CS_APPEND(EVAS_COLORSPACE_ETC1);
CS_APPEND(EVAS_COLORSPACE_ETC1_ALPHA);
}
if (gc->shared->info.s3tc)
{
CS_APPEND(EVAS_COLORSPACE_RGB_S3TC_DXT1);
CS_APPEND(EVAS_COLORSPACE_RGBA_S3TC_DXT1);
CS_APPEND(EVAS_COLORSPACE_RGBA_S3TC_DXT2);
CS_APPEND(EVAS_COLORSPACE_RGBA_S3TC_DXT3);
CS_APPEND(EVAS_COLORSPACE_RGBA_S3TC_DXT4);
CS_APPEND(EVAS_COLORSPACE_RGBA_S3TC_DXT5);
}
CS_APPEND(EVAS_COLORSPACE_GRY8);
CS_APPEND(EVAS_COLORSPACE_AGRY88);
CS_APPEND(EVAS_COLORSPACE_ARGB8888);
}
void
evas_gl_common_image_preload_done(void *data)
{
Evas_GL_Image *im = data;
if (im->im)
{
Evas_Colorspace cspace = EVAS_COLORSPACE_ARGB8888;
if (im->im->cache_entry.cspaces)
{
Evas_Colorspace cs;
unsigned int i;
Eina_List *l2;
void *ldata;
cspace = EVAS_COLORSPACE_ARGB8888;
for (i = 0;
im->im->cache_entry.cspaces[i] != EVAS_COLORSPACE_ARGB8888;
i++)
{
EINA_LIST_FOREACH(im->gc->shared->info.cspaces, l2, ldata)
{
cs = (Evas_Colorspace) (intptr_t) ldata;
if (cs == im->im->cache_entry.cspaces[i])
{
cspace = cs;
goto found_cspace;
}
}
}
found_cspace:
if (cspace == EVAS_COLORSPACE_ETC1 && im->gc->shared->info.etc2)
cspace = EVAS_COLORSPACE_RGB8_ETC2;
im->im->cache_entry.space = cspace;
}
im->cs.space = cspace;
im->orient = EVAS_IMAGE_ORIENT_NONE;
im->alpha = im->im->cache_entry.flags.alpha;
im->w = im->im->cache_entry.w;
im->h = im->im->cache_entry.h;
}
}
//FIXME: This is a hacky way. Need an proper interface...
void
evas_gl_common_image_preload_unwatch(Evas_GL_Image *im)
{
Eina_Inlist *l2;
Evas_Cache_Target *tg;
if (!im->im) return;
EINA_INLIST_FOREACH_SAFE(im->im->cache_entry.targets, l2, tg)
{
if ((tg->preloaded_cb != evas_gl_common_image_preload_done) || (tg->preloaded_data != im))
continue;
tg->delete_me = EINA_TRUE;
break;
}
}
Evas_GL_Image *
evas_gl_common_image_new_from_rgbaimage(Evas_Engine_GL_Context *gc, RGBA_Image *im_im,
Evas_Image_Load_Opts *lo, int *error)
{
Evas_GL_Image *im;
Eina_List *l;
Evas_Colorspace cspace = EVAS_COLORSPACE_ARGB8888;
/* i'd LOVe to do this, but we can't because we load to load header
* to get image size to know if its too big or not! so this disallows
* us to know that - photocam thus suffers
2011-10-25 05:14:48 -07:00
if (((int)im_im->cache_entry.w > gc->shared->info.max_texture_size) ||
((int)im_im->cache_entry.h > gc->shared->info.max_texture_size))
{
evas_cache_image_drop(&(im_im->cache_entry));
if (error) *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return NULL;
}
*/
if (error) *error = EVAS_LOAD_ERROR_NONE;
// FIXME: keep unreffed shared images around
EINA_LIST_FOREACH(gc->shared->images, l, im)
{
if (im->im == im_im)
{
evas_cache_image_drop(&(im_im->cache_entry));
gc->shared->images = eina_list_remove_list(gc->shared->images, l);
gc->shared->images = eina_list_prepend(gc->shared->images, im);
evas_gl_common_image_ref(im);
if (error) *error = EVAS_LOAD_ERROR_NONE;
return im;
}
}
2005-05-21 19:49:50 -07:00
im = calloc(1, sizeof(Evas_GL_Image));
if (!im)
{
evas_cache_image_drop(&(im_im->cache_entry));
if (error) *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return NULL;
}
if (im_im->cache_entry.cspaces)
{
Evas_Colorspace cs;
unsigned int i;
Eina_List *l2;
void *ldata;
if (!gc->shared->info.cspaces)
_evas_gl_cspace_list_fill(gc);
cspace = EVAS_COLORSPACE_ARGB8888;
for (i = 0; im_im->cache_entry.cspaces[i] != EVAS_COLORSPACE_ARGB8888; i++)
EINA_LIST_FOREACH(gc->shared->info.cspaces, l2, ldata)
{
cs = (Evas_Colorspace) (intptr_t) ldata;
if (cs == im_im->cache_entry.cspaces[i])
{
cspace = cs;
goto found_cspace;
}
}
found_cspace:
// ETC2 is backwards compatible with ETC1 but we prefer ETC2
if (cspace == EVAS_COLORSPACE_ETC1 && gc->shared->info.etc2)
cspace = EVAS_COLORSPACE_RGB8_ETC2;
im_im->cache_entry.space = cspace;
}
im->references = 1;
im->im = im_im;
im->gc = gc;
im->cached = 1;
im->cs.space = cspace;
im->orient = EVAS_IMAGE_ORIENT_NONE;
im->alpha = im->im->cache_entry.flags.alpha;
im->w = im->im->cache_entry.w;
im->h = im->im->cache_entry.h;
if (lo) im->load_opts = *lo;
gc->shared->images = eina_list_prepend(gc->shared->images, im);
return im;
}
Evas_GL_Image *
evas_gl_common_image_mmap(Evas_Engine_GL_Context *gc, Eina_File *f, const char *key, Evas_Image_Load_Opts *lo, int *error)
{
RGBA_Image *im_im;
im_im = evas_common_load_image_from_mmap(f, key, lo, error);
if (!im_im) return NULL;
return evas_gl_common_image_new_from_rgbaimage(gc, im_im, lo, error);
}
EAPI Evas_GL_Image *
evas_gl_common_image_new_from_data(Evas_Engine_GL_Context *gc, unsigned int w, unsigned int h, DATA32 *data, int alpha, Evas_Colorspace cspace)
{
Evas_GL_Image *im;
Eina_List *l;
2005-05-21 19:49:50 -07:00
2011-10-25 05:14:48 -07:00
if (((int)w > gc->shared->info.max_texture_size) ||
((int)h > gc->shared->info.max_texture_size))
return NULL;
if (data)
{
EINA_LIST_FOREACH(gc->shared->images, l, im)
{
if (((void *)(im->im->image.data) == (void *)data) &&
(im->im->cache_entry.w == w) &&
(im->im->cache_entry.h == h))
{
gc->shared->images = eina_list_remove_list(gc->shared->images, l);
gc->shared->images = eina_list_prepend(gc->shared->images, im);
evas_gl_common_image_ref(im);
return im;
}
}
}
im = calloc(1, sizeof(Evas_GL_Image));
if (!im) return NULL;
im->references = 1;
im->im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(),
w, h, data, alpha, cspace);
if (!im->im)
{
free(im);
return NULL;
}
im->gc = gc;
im->cs.space = cspace;
im->alpha = im->im->cache_entry.flags.alpha;
im->w = im->im->cache_entry.w;
im->h = im->im->cache_entry.h;
switch (cspace)
{
case EVAS_COLORSPACE_ARGB8888:
case EVAS_COLORSPACE_GRY8:
case EVAS_COLORSPACE_AGRY88:
break;
case EVAS_COLORSPACE_ETC1:
case EVAS_COLORSPACE_ETC1_ALPHA:
if (gc->shared->info.etc1 && !gc->shared->info.etc2) break;
ERR("We don't know what to do with ETC1 on this hardware. You need to add a software converter here.");
break;
case EVAS_COLORSPACE_RGB8_ETC2:
case EVAS_COLORSPACE_RGBA8_ETC2_EAC:
if (gc->shared->info.etc2) break;
ERR("We don't know what to do with ETC2 on this hardware. You need to add a software converter here.");
break;
case EVAS_COLORSPACE_YCBCR422P601_PL:
case EVAS_COLORSPACE_YCBCR422P709_PL:
im->cs.data = data;
im->cs.no_free = 1;
break;
default:
ERR("color space not supported: %d", cspace);
break;
}
return im;
}
Evas_GL_Image *
evas_gl_common_image_new_from_copied_data(Evas_Engine_GL_Context *gc, unsigned int w, unsigned int h, DATA32 *data, int alpha, Evas_Colorspace cspace)
{
Evas_GL_Image *im;
2005-05-21 19:49:50 -07:00
2011-10-25 05:14:48 -07:00
if (((int)w > gc->shared->info.max_texture_size) ||
((int)h > gc->shared->info.max_texture_size))
return NULL;
im = calloc(1, sizeof(Evas_GL_Image));
if (!im) return NULL;
im->references = 1;
im->im = (RGBA_Image *) evas_cache_image_copied_data(evas_common_image_cache_get(),
w, h, data, alpha, cspace);
if (!im->im)
{
free(im);
return NULL;
}
2003-09-11 21:15:20 -07:00
im->gc = gc;
im->cs.space = cspace;
im->alpha = im->im->cache_entry.flags.alpha;
im->w = im->im->cache_entry.w;
im->h = im->im->cache_entry.h;
switch (cspace)
{
case EVAS_COLORSPACE_ARGB8888:
case EVAS_COLORSPACE_GRY8:
case EVAS_COLORSPACE_AGRY88:
break;
case EVAS_COLORSPACE_ETC1:
case EVAS_COLORSPACE_ETC1_ALPHA:
if (gc->shared->info.etc1 && !gc->shared->info.etc2) break;
ERR("We don't know what to do with ETC1 on this hardware. You need to add a software converter here.");
break;
case EVAS_COLORSPACE_RGB8_ETC2:
case EVAS_COLORSPACE_RGBA8_ETC2_EAC:
if (gc->shared->info.etc2) break;
ERR("We don't know what to do with ETC2 on this hardware. You need to add a software converter here.");
break;
case EVAS_COLORSPACE_YCBCR422P601_PL:
case EVAS_COLORSPACE_YCBCR422P709_PL:
if (im->im->cache_entry.h > 0)
im->cs.data = calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2);
if ((data) && (im->cs.data))
memcpy(im->cs.data, data, im->im->cache_entry.h * sizeof(unsigned char *) * 2);
break;
default:
ERR("color space not supported: %d", cspace);
break;
}
return im;
}
Evas_GL_Image *
evas_gl_common_image_new(Evas_Engine_GL_Context *gc, unsigned int w, unsigned int h, int alpha, Evas_Colorspace cspace)
{
Evas_GL_Image *im;
2005-05-21 19:49:50 -07:00
2011-10-25 05:14:48 -07:00
if (((int)w > gc->shared->info.max_texture_size) ||
((int)h > gc->shared->info.max_texture_size))
return NULL;
im = calloc(1, sizeof(Evas_GL_Image));
if (!im) return NULL;
im->references = 1;
im->im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
if (!im->im)
{
free(im);
return NULL;
}
im->gc = gc;
im->im->cache_entry.flags.alpha = alpha ? 1 : 0;
im->cs.space = cspace;
im->alpha = im->im->cache_entry.flags.alpha;
im->im->cache_entry.w = w;
im->im->cache_entry.h = h;
im->w = im->im->cache_entry.w;
im->h = im->im->cache_entry.h;
evas_cache_image_colorspace(&im->im->cache_entry, cspace);
im->im = (RGBA_Image *)evas_cache_image_size_set(&im->im->cache_entry, w, h);
switch (cspace)
{
case EVAS_COLORSPACE_ARGB8888:
case EVAS_COLORSPACE_GRY8:
case EVAS_COLORSPACE_AGRY88:
break;
case EVAS_COLORSPACE_ETC1:
case EVAS_COLORSPACE_ETC1_ALPHA:
if (gc->shared->info.etc1 && !gc->shared->info.etc2) break;
ERR("We don't know what to do with ETC1 on this hardware. You need to add a software converter here.");
break;
case EVAS_COLORSPACE_RGB8_ETC2:
case EVAS_COLORSPACE_RGBA8_ETC2_EAC:
if (gc->shared->info.etc2) break;
ERR("We don't know what to do with ETC2 on this hardware. You need to add a software converter here.");
break;
case EVAS_COLORSPACE_YCBCR422P601_PL:
case EVAS_COLORSPACE_YCBCR422P709_PL:
case EVAS_COLORSPACE_YCBCR422601_PL:
case EVAS_COLORSPACE_YCBCR420NV12601_PL:
case EVAS_COLORSPACE_YCBCR420TM12601_PL:
// if (im->tex) evas_gl_common_texture_free(im->tex);
im->tex = NULL;
im->cs.no_free = 0;
if (im->im->cache_entry.h > 0)
im->cs.data = calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2);
break;
default:
abort();
break;
}
return im;
}
Evas_GL_Image *
evas_gl_common_image_alpha_set(Evas_GL_Image *im, int alpha)
{
if (!im) return NULL;
if (im->alpha == alpha) return im;
im->alpha = alpha;
if (!im->im) return im;
evas_gl_common_image_alloc_ensure(im);
evas_cache_image_load_data(&im->im->cache_entry);
im->im->cache_entry.flags.alpha = alpha ? 1 : 0;
if (im->tex) evas_gl_common_texture_free(im->tex, EINA_TRUE);
if (im->tex_only)
{
im->tex = evas_gl_common_texture_native_new(im->gc, im->w, im->h,
im->alpha, im);
}
else
{
im->tex = evas_gl_common_texture_new(im->gc, im->im, EINA_FALSE);
if (im->tex) evas_gl_common_texture_update(im->tex, im->im);
}
return im;
}
EAPI void
evas_gl_common_image_native_enable(Evas_GL_Image *im)
{
if (im->cs.data)
{
if (!im->cs.no_free) free(im->cs.data);
im->cs.data = NULL;
}
im->cs.no_free = 0;
if (im->cached)
{
if (im->references == 0)
im->gc->shared->images_size -= (im->csize);
im->gc->shared->images = eina_list_remove(im->gc->shared->images, im);
im->cached = 0;
}
if (im->im)
{
evas_cache_image_drop(&im->im->cache_entry);
im->im = NULL;
}
if (im->tex)
{
evas_gl_common_texture_free(im->tex, EINA_TRUE);
im->tex = NULL;
}
im->cs.space = EVAS_COLORSPACE_ARGB8888;
im->tex = evas_gl_common_texture_native_new(im->gc, im->w, im->h, im->alpha, im);
im->tex_only = 1;
}
EAPI void
evas_gl_common_image_native_disable(Evas_GL_Image *im)
{
if (im->im)
{
evas_cache_image_drop(&im->im->cache_entry);
im->im = NULL;
}
if (im->tex)
{
evas_gl_common_texture_free(im->tex, EINA_TRUE);
im->tex = NULL;
}
im->tex_only = 0;
im->im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
im->im->cache_entry.flags.alpha = im->alpha;
im->cs.space = EVAS_COLORSPACE_ARGB8888;
evas_cache_image_colorspace(&im->im->cache_entry, im->cs.space);
/*
im->im = (RGBA_Image *)evas_cache_image_size_set(&im->im->cache_entry, im->w, im->h);
if (!im->tex)
im->tex = evas_gl_common_texture_new(im->gc, im->im);
*/
}
void
evas_gl_common_image_scale_hint_set(Evas_GL_Image *im, int hint)
{
im->scale_hint = hint;
// FIXME: take advantage of this even in gl (eg if image is
// 1600x1200 but we always use it at 800x600 or even less - drop
// the texture res down for "non dynamic" stuff to save memory)
}
void
evas_gl_common_image_content_hint_set(Evas_GL_Image *im, int hint)
{
if (im->content_hint == hint) return;
im->content_hint = hint;
if (!im->gc) return;
if (!im->gc->shared->info.bgra) return;
// does not handle yuv yet.
// TODO: Check this list of cspaces
switch (im->cs.space)
{
case EVAS_COLORSPACE_YCBCR422P601_PL:
case EVAS_COLORSPACE_YCBCR422P709_PL:
case EVAS_COLORSPACE_RGB565_A5P:
case EVAS_COLORSPACE_YCBCR422601_PL:
case EVAS_COLORSPACE_YCBCR420NV12601_PL:
case EVAS_COLORSPACE_YCBCR420TM12601_PL:
case EVAS_COLORSPACE_ETC1_ALPHA:
return;
default: break;
}
if (im->content_hint == EVAS_IMAGE_CONTENT_HINT_DYNAMIC)
{
if ((!im->gc->shared->info.sec_image_map) &&
((!im->gc->shared->info.sec_tbm_surface) || (!im->gc->shared->info.egl_tbm_ext))) return;
if (im->cs.data)
{
if (!im->cs.no_free) free(im->cs.data);
im->cs.data = NULL;
}
im->cs.no_free = 0;
if (im->cached)
{
if (im->references == 0)
im->gc->shared->images_size -= im->csize;
im->gc->shared->images = eina_list_remove(im->gc->shared->images, im);
im->cached = 0;
}
if (im->im)
{
evas_cache_image_drop(&im->im->cache_entry);
im->im = NULL;
}
if (im->tex)
{
evas_gl_common_texture_free(im->tex, EINA_TRUE);
im->tex = NULL;
}
im->tex = evas_gl_common_texture_dynamic_new(im->gc, im);
im->tex_only = 1;
}
else
{
if (im->im)
{
evas_cache_image_drop(&im->im->cache_entry);
im->im = NULL;
}
if (im->tex)
{
evas_gl_common_texture_free(im->tex, EINA_TRUE);
im->tex = NULL;
}
im->tex_only = 0;
im->im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
im->im->cache_entry.flags.alpha = im->alpha;
im->im->cache_entry.space = im->cs.space;
evas_cache_image_colorspace(&im->im->cache_entry, im->cs.space);
im->im = (RGBA_Image *)evas_cache_image_size_set(&im->im->cache_entry, im->w, im->h);
if (!im->tex)
im->tex = evas_gl_common_texture_new(im->gc, im->im, EINA_FALSE);
}
}
void
evas_gl_common_image_cache_flush(Evas_Engine_GL_Context *gc)
{
_evas_gl_image_cache_trim(gc);
}
EAPI void
evas_gl_common_image_free(Evas_GL_Image *im)
{
if (!im) return;
im->references--;
if (im->references > 0) return;
if (im->gc && (im->gc->pipe[0].shader.surface == im))
evas_gl_common_context_target_surface_set(im->gc, im->gc->def_surface);
if (im->fglyph)
{
2018-04-04 19:10:43 -07:00
if (im->gc)
im->gc->font_glyph_images = eina_list_remove(im->gc->font_glyph_images, im);
im->fglyph->ext_dat = NULL;
im->fglyph->ext_dat_free = NULL;
}
if (im->gc)
evas_gl_common_context_flush(im->gc);
evas_gl_common_image_preload_unwatch(im);
if (im->scaled.origin)
{
evas_gl_common_image_free(im->scaled.origin);
im->scaled.origin = NULL;
}
if (im->native.func.free)
im->native.func.free(im);
if (im->cs.data)
{
if (!im->cs.no_free) free(im->cs.data);
}
if (im->cached)
{
if (_evas_gl_image_cache_add(im)) return;
}
gl_common: call evas_gl_common_texture_free() before dropping image cache texture_free() accesses struct members which can be freed if image cache entry reaches zero references @fix ==30989== Invalid read of size 1 ==30989== at 0x23BA2934: evas_gl_common_texture_free (evas_gl_texture.c:1506) ==30989== by 0x23BA9117: evas_gl_common_image_free (evas_gl_image.c:724) ==30989== by 0x23B80DA1: eng_image_data_put (evas_engine.c:988) ==30989== by 0x872681A: _evas_image_data_set (evas_object_image.c:1264) ==30989== by 0x87360B5: evas_obj_image_data_set (evas_image.eo.c:236) ==30989== by 0x8736B43: evas_object_image_data_set (evas_image.eo.c:741) ==30989== by 0x4820A4: e_comp_object_render (e_comp_object.c:3746) ==30989== by 0x477B92: _e_comp_object_pixels_get (e_comp_object.c:909) ==30989== by 0x872CF52: evas_process_dirty_pixels (evas_object_image.c:3154) ==30989== by 0x872DD16: _evas_image_render (evas_object_image.c:3389) ==30989== by 0x872DB01: evas_object_image_render (evas_object_image.c:3351) ==30989== by 0x879C524: evas_render_mapped (evas_render.c:1802) ==30989== by 0x879E82A: evas_render_updates_internal_loop (evas_render.c:2380) ==30989== by 0x87A005D: evas_render_updates_internal (evas_render.c:2770) ==30989== by 0x87A140D: evas_render_updates_internal_wait (evas_render.c:3122) ==30989== by 0x87A1502: _evas_canvas_render_updates (evas_render.c:3144) ==30989== by 0x871ED0D: evas_canvas_render_updates (evas_canvas.eo.c:354) ==30989== by 0x8720C5F: evas_render_updates (evas_canvas.eo.c:1089) ==30989== by 0x22F65C35: _ecore_evas_drm_render (ecore_evas_drm.c:1072) ==30989== by 0x7416F7B: _ecore_evas_idle_enter (ecore_evas.c:172) ==30989== by 0xDDE3577: _ecore_call_task_cb (ecore_private.h:282) ==30989== by 0xDDE3A5E: _ecore_idle_enterer_call (ecore_idle_enterer.c:174) ==30989== by 0xDDE836B: _ecore_main_loop_iterate_internal (ecore_main.c:2261) ==30989== by 0xDDE67B8: ecore_main_loop_begin (ecore_main.c:1284) ==30989== by 0x4407B6: main (e_main.c:1087) ==30989== Address 0x23a9e1d2 is 338 bytes inside a block of size 552 free'd ==30989== at 0x4C29E00: free (vg_replace_malloc.c:530) ==30989== by 0x882B2E2: _evas_common_rgba_image_delete (evas_image_main.c:343) ==30989== by 0x87B1E17: _evas_cache_image_entry_delete (evas_cache_image.c:205) ==30989== by 0x87B3C52: evas_cache_image_drop (evas_cache_image.c:950) ==30989== by 0x23BA90F5: evas_gl_common_image_free (evas_gl_image.c:722) ==30989== by 0x23B80DA1: eng_image_data_put (evas_engine.c:988) ==30989== by 0x872681A: _evas_image_data_set (evas_object_image.c:1264) ==30989== by 0x87360B5: evas_obj_image_data_set (evas_image.eo.c:236) ==30989== by 0x8736B43: evas_object_image_data_set (evas_image.eo.c:741) ==30989== by 0x4820A4: e_comp_object_render (e_comp_object.c:3746) ==30989== by 0x477B92: _e_comp_object_pixels_get (e_comp_object.c:909) ==30989== by 0x872CF52: evas_process_dirty_pixels (evas_object_image.c:3154) ==30989== by 0x872DD16: _evas_image_render (evas_object_image.c:3389) ==30989== by 0x872DB01: evas_object_image_render (evas_object_image.c:3351) ==30989== by 0x879C524: evas_render_mapped (evas_render.c:1802) ==30989== by 0x879E82A: evas_render_updates_internal_loop (evas_render.c:2380) ==30989== by 0x87A005D: evas_render_updates_internal (evas_render.c:2770) ==30989== by 0x87A140D: evas_render_updates_internal_wait (evas_render.c:3122) ==30989== by 0x87A1502: _evas_canvas_render_updates (evas_render.c:3144) ==30989== by 0x871ED0D: evas_canvas_render_updates (evas_canvas.eo.c:354) ==30989== by 0x8720C5F: evas_render_updates (evas_canvas.eo.c:1089) ==30989== by 0x22F65C35: _ecore_evas_drm_render (ecore_evas_drm.c:1072) ==30989== by 0x7416F7B: _ecore_evas_idle_enter (ecore_evas.c:172) ==30989== by 0xDDE3577: _ecore_call_task_cb (ecore_private.h:282) ==30989== by 0xDDE3A5E: _ecore_idle_enterer_call (ecore_idle_enterer.c:174) ==30989== by 0xDDE836B: _ecore_main_loop_iterate_internal (ecore_main.c:2261) ==30989== by 0xDDE67B8: ecore_main_loop_begin (ecore_main.c:1284) ==30989== by 0x4407B6: main (e_main.c:1087) ==30989== Block was alloc'd at ==30989== at 0x4C2AA98: calloc (vg_replace_malloc.c:711) ==30989== by 0x882B0A0: _evas_common_rgba_image_new (evas_image_main.c:295) ==30989== by 0x87B1F1B: _evas_cache_image_entry_new (evas_cache_image.c:253) ==30989== by 0x87B4170: evas_cache_image_data (evas_cache_image.c:1079) ==30989== by 0x23BA7EDE: evas_gl_common_image_new_from_data (evas_gl_image.c:333) ==30989== by 0x23B7F972: eng_image_new_from_data (evas_engine.c:531) ==30989== by 0x23B80D81: eng_image_data_put (evas_engine.c:984) ==30989== by 0x872681A: _evas_image_data_set (evas_object_image.c:1264) ==30989== by 0x87360B5: evas_obj_image_data_set (evas_image.eo.c:236) ==30989== by 0x8736B43: evas_object_image_data_set (evas_image.eo.c:741) ==30989== by 0x4820A4: e_comp_object_render (e_comp_object.c:3746) ==30989== by 0x477B92: _e_comp_object_pixels_get (e_comp_object.c:909) ==30989== by 0x872CF52: evas_process_dirty_pixels (evas_object_image.c:3154) ==30989== by 0x872DD16: _evas_image_render (evas_object_image.c:3389) ==30989== by 0x872DB01: evas_object_image_render (evas_object_image.c:3351) ==30989== by 0x879C524: evas_render_mapped (evas_render.c:1802) ==30989== by 0x879E82A: evas_render_updates_internal_loop (evas_render.c:2380) ==30989== by 0x87A005D: evas_render_updates_internal (evas_render.c:2770) ==30989== by 0x87A140D: evas_render_updates_internal_wait (evas_render.c:3122) ==30989== by 0x87A1502: _evas_canvas_render_updates (evas_render.c:3144) ==30989== by 0x871ED0D: evas_canvas_render_updates (evas_canvas.eo.c:354) ==30989== by 0x8720C5F: evas_render_updates (evas_canvas.eo.c:1089) ==30989== by 0x22F65C35: _ecore_evas_drm_render (ecore_evas_drm.c:1072) ==30989== by 0x7416F7B: _ecore_evas_idle_enter (ecore_evas.c:172) ==30989== by 0xDDE3577: _ecore_call_task_cb (ecore_private.h:282) ==30989== by 0xDDE3A5E: _ecore_idle_enterer_call (ecore_idle_enterer.c:174) ==30989== by 0xDDE836B: _ecore_main_loop_iterate_internal (ecore_main.c:2261) ==30989== by 0xDDE67B8: ecore_main_loop_begin (ecore_main.c:1284) ==30989== by 0x4407B6: main (e_main.c:1087) ==30989== ==30989== Invalid write of size 1 ==30989== at 0x23BA293E: evas_gl_common_texture_free (evas_gl_texture.c:1506) ==30989== by 0x23BA9117: evas_gl_common_image_free (evas_gl_image.c:724) ==30989== by 0x23B80DA1: eng_image_data_put (evas_engine.c:988) ==30989== by 0x872681A: _evas_image_data_set (evas_object_image.c:1264) ==30989== by 0x87360B5: evas_obj_image_data_set (evas_image.eo.c:236) ==30989== by 0x8736B43: evas_object_image_data_set (evas_image.eo.c:741) ==30989== by 0x4820A4: e_comp_object_render (e_comp_object.c:3746) ==30989== by 0x477B92: _e_comp_object_pixels_get (e_comp_object.c:909) ==30989== by 0x872CF52: evas_process_dirty_pixels (evas_object_image.c:3154) ==30989== by 0x872DD16: _evas_image_render (evas_object_image.c:3389) ==30989== by 0x872DB01: evas_object_image_render (evas_object_image.c:3351) ==30989== by 0x879C524: evas_render_mapped (evas_render.c:1802) ==30989== by 0x879E82A: evas_render_updates_internal_loop (evas_render.c:2380) ==30989== by 0x87A005D: evas_render_updates_internal (evas_render.c:2770) ==30989== by 0x87A140D: evas_render_updates_internal_wait (evas_render.c:3122) ==30989== by 0x87A1502: _evas_canvas_render_updates (evas_render.c:3144) ==30989== by 0x871ED0D: evas_canvas_render_updates (evas_canvas.eo.c:354) ==30989== by 0x8720C5F: evas_render_updates (evas_canvas.eo.c:1089) ==30989== by 0x22F65C35: _ecore_evas_drm_render (ecore_evas_drm.c:1072) ==30989== by 0x7416F7B: _ecore_evas_idle_enter (ecore_evas.c:172) ==30989== by 0xDDE3577: _ecore_call_task_cb (ecore_private.h:282) ==30989== by 0xDDE3A5E: _ecore_idle_enterer_call (ecore_idle_enterer.c:174) ==30989== by 0xDDE836B: _ecore_main_loop_iterate_internal (ecore_main.c:2261) ==30989== by 0xDDE67B8: ecore_main_loop_begin (ecore_main.c:1284) ==30989== by 0x4407B6: main (e_main.c:1087) ==30989== Address 0x23a9e1d2 is 338 bytes inside a block of size 552 free'd ==30989== at 0x4C29E00: free (vg_replace_malloc.c:530) ==30989== by 0x882B2E2: _evas_common_rgba_image_delete (evas_image_main.c:343) ==30989== by 0x87B1E17: _evas_cache_image_entry_delete (evas_cache_image.c:205) ==30989== by 0x87B3C52: evas_cache_image_drop (evas_cache_image.c:950) ==30989== by 0x23BA90F5: evas_gl_common_image_free (evas_gl_image.c:722) ==30989== by 0x23B80DA1: eng_image_data_put (evas_engine.c:988) ==30989== by 0x872681A: _evas_image_data_set (evas_object_image.c:1264) ==30989== by 0x87360B5: evas_obj_image_data_set (evas_image.eo.c:236) ==30989== by 0x8736B43: evas_object_image_data_set (evas_image.eo.c:741) ==30989== by 0x4820A4: e_comp_object_render (e_comp_object.c:3746) ==30989== by 0x477B92: _e_comp_object_pixels_get (e_comp_object.c:909) ==30989== by 0x872CF52: evas_process_dirty_pixels (evas_object_image.c:3154) ==30989== by 0x872DD16: _evas_image_render (evas_object_image.c:3389) ==30989== by 0x872DB01: evas_object_image_render (evas_object_image.c:3351) ==30989== by 0x879C524: evas_render_mapped (evas_render.c:1802) ==30989== by 0x879E82A: evas_render_updates_internal_loop (evas_render.c:2380) ==30989== by 0x87A005D: evas_render_updates_internal (evas_render.c:2770) ==30989== by 0x87A140D: evas_render_updates_internal_wait (evas_render.c:3122) ==30989== by 0x87A1502: _evas_canvas_render_updates (evas_render.c:3144) ==30989== by 0x871ED0D: evas_canvas_render_updates (evas_canvas.eo.c:354) ==30989== by 0x8720C5F: evas_render_updates (evas_canvas.eo.c:1089) ==30989== by 0x22F65C35: _ecore_evas_drm_render (ecore_evas_drm.c:1072) ==30989== by 0x7416F7B: _ecore_evas_idle_enter (ecore_evas.c:172) ==30989== by 0xDDE3577: _ecore_call_task_cb (ecore_private.h:282) ==30989== by 0xDDE3A5E: _ecore_idle_enterer_call (ecore_idle_enterer.c:174) ==30989== by 0xDDE836B: _ecore_main_loop_iterate_internal (ecore_main.c:2261) ==30989== by 0xDDE67B8: ecore_main_loop_begin (ecore_main.c:1284) ==30989== by 0x4407B6: main (e_main.c:1087) ==30989== Block was alloc'd at ==30989== at 0x4C2AA98: calloc (vg_replace_malloc.c:711) ==30989== by 0x882B0A0: _evas_common_rgba_image_new (evas_image_main.c:295) ==30989== by 0x87B1F1B: _evas_cache_image_entry_new (evas_cache_image.c:253) ==30989== by 0x87B4170: evas_cache_image_data (evas_cache_image.c:1079) ==30989== by 0x23BA7EDE: evas_gl_common_image_new_from_data (evas_gl_image.c:333) ==30989== by 0x23B7F972: eng_image_new_from_data (evas_engine.c:531) ==30989== by 0x23B80D81: eng_image_data_put (evas_engine.c:984) ==30989== by 0x872681A: _evas_image_data_set (evas_object_image.c:1264) ==30989== by 0x87360B5: evas_obj_image_data_set (evas_image.eo.c:236) ==30989== by 0x8736B43: evas_object_image_data_set (evas_image.eo.c:741) ==30989== by 0x4820A4: e_comp_object_render (e_comp_object.c:3746) ==30989== by 0x477B92: _e_comp_object_pixels_get (e_comp_object.c:909) ==30989== by 0x872CF52: evas_process_dirty_pixels (evas_object_image.c:3154) ==30989== by 0x872DD16: _evas_image_render (evas_object_image.c:3389) ==30989== by 0x872DB01: evas_object_image_render (evas_object_image.c:3351) ==30989== by 0x879C524: evas_render_mapped (evas_render.c:1802) ==30989== by 0x879E82A: evas_render_updates_internal_loop (evas_render.c:2380) ==30989== by 0x87A005D: evas_render_updates_internal (evas_render.c:2770) ==30989== by 0x87A140D: evas_render_updates_internal_wait (evas_render.c:3122) ==30989== by 0x87A1502: _evas_canvas_render_updates (evas_render.c:3144) ==30989== by 0x871ED0D: evas_canvas_render_updates (evas_canvas.eo.c:354) ==30989== by 0x8720C5F: evas_render_updates (evas_canvas.eo.c:1089) ==30989== by 0x22F65C35: _ecore_evas_drm_render (ecore_evas_drm.c:1072) ==30989== by 0x7416F7B: _ecore_evas_idle_enter (ecore_evas.c:172) ==30989== by 0xDDE3577: _ecore_call_task_cb (ecore_private.h:282) ==30989== by 0xDDE3A5E: _ecore_idle_enterer_call (ecore_idle_enterer.c:174) ==30989== by 0xDDE836B: _ecore_main_loop_iterate_internal (ecore_main.c:2261) ==30989== by 0xDDE67B8: ecore_main_loop_begin (ecore_main.c:1284) ==30989== by 0x4407B6: main (e_main.c:1087)
2016-03-11 13:04:56 -08:00
if (im->tex) evas_gl_common_texture_free(im->tex, EINA_TRUE);
if (im->im)
evas_cache_image_drop(&im->im->cache_entry);
free(im);
}
Evas_GL_Image *
evas_gl_common_image_surface_new(Evas_Engine_GL_Context *gc, unsigned int w, unsigned int h, int alpha, int stencil)
{
Evas_GL_Image *im;
2011-10-25 05:14:48 -07:00
if (((int)w > gc->shared->info.max_texture_size) ||
((int)h > gc->shared->info.max_texture_size))
return NULL;
im = calloc(1, sizeof(Evas_GL_Image));
if (!im) return NULL;
im->references = 1;
im->gc = gc;
im->cs.space = EVAS_COLORSPACE_ARGB8888;
im->alpha = alpha;
im->w = w;
im->h = h;
im->tex = evas_gl_common_texture_render_new(gc, w, h, alpha, stencil);
im->tex_only = 1;
return im;
}
Evas_GL_Image *
evas_gl_common_image_surface_noscale_new(Evas_Engine_GL_Context *gc, unsigned int w, unsigned int h, int alpha)
{
Evas_GL_Image *im;
if (((int)w > gc->shared->info.max_texture_size) ||
((int)h > gc->shared->info.max_texture_size))
return NULL;
im = calloc(1, sizeof(Evas_GL_Image));
if (!im) return NULL;
im->references = 1;
im->gc = gc;
im->cs.space = EVAS_COLORSPACE_ARGB8888;
im->alpha = alpha;
im->w = w;
im->h = h;
im->tex = evas_gl_common_texture_render_noscale_new(gc, w, h, alpha);
im->tex_only = 1;
return im;
}
void
evas_gl_common_image_dirty(Evas_GL_Image *im, unsigned int x, unsigned int y, unsigned int w, unsigned int h)
{
if ((w == 0) && (h == 0) && (x == 0) && (y == 0))
{
w = im->w;
h = im->h;
}
if (im->im)
{
evas_gl_common_image_alloc_ensure(im);
im->im = (RGBA_Image *)evas_cache_image_dirty(&im->im->cache_entry, x, y, w, h);
}
im->dirty = 1;
}
void
evas_gl_common_image_update(Evas_Engine_GL_Context *gc, Evas_GL_Image *im)
{
Image_Entry *ie;
if (!im->im) return;
ie = &im->im->cache_entry;
if (!im->tex && ie->preload) return;
evas_gl_common_image_alloc_ensure(im);
gl_common: fix invalid memory access Summary: code was added which ignores the comment explicitly warning not to do what was done here ref 9e01cf2698d5b24f440d696fd57d469cdc5a6b5f ref T6970 ==4829== Invalid read of size 1 ==4829== at 0x246D8F06: evas_gl_common_image_update (evas_gl_image.c:907) ==4829== by 0x246DAA7B: evas_gl_common_image_draw (evas_gl_image.c:1417) ==4829== by 0x246A2AB6: eng_image_draw (evas_engine.c:1240) ==4829== by 0x6A87842: _draw_image (evas_object_image.c:1403) ==4829== by 0x6A8A1BF: _evas_image_render (evas_object_image.c:2171) ==4829== by 0x6A890C1: evas_object_image_render (evas_object_image.c:1868) ==4829== by 0x6B09C82: evas_render_mapped (evas_render.c:2292) ==4829== by 0x6B0CE90: evas_render_updates_internal_loop (evas_render.c:3079) ==4829== by 0x6B0EACA: evas_render_updates_internal (evas_render.c:3522) ==4829== by 0x6B1087C: evas_render_updates_internal_wait (evas_render.c:3946) ==4829== by 0x6B10A4D: _evas_canvas_render_updates (evas_render.c:3971) ==4829== by 0x6A7A234: evas_canvas_render_updates (evas_canvas.eo.c:212) ==4829== by 0x6A7BBD4: evas_render_updates (evas_canvas.eo.c:758) ==4829== by 0x808A7D8: ecore_evas_render (ecore_evas.c:177) ==4829== by 0x808AA58: _ecore_evas_idle_enter (ecore_evas.c:284) ==4829== by 0x5CC1E46: _ecore_call_task_cb (ecore_private.h:442) ==4829== by 0x5CC1EAE: _ecore_factorized_idle_process (ecore_idler.c:35) ==4829== by 0xBFA4DD4: _event_callback_call (eo_base_class.c:1663) ==4829== by 0xBFA50A6: _efl_object_event_callback_call (eo_base_class.c:1747) ==4829== by 0xBFA514C: efl_event_callback_call (eo_base_class.c:1750) ==4829== by 0x5CC661B: _ecore_main_loop_iterate_internal (ecore_main.c:2352) ==4829== by 0x5CC3F65: _ecore_main_loop_begin (ecore_main.c:1175) ==4829== by 0x5CCC856: _efl_loop_begin (efl_loop.c:83) ==4829== by 0x5CCEF6D: efl_loop_begin (efl_loop.eo.c:28) ==4829== by 0x5CC40DF: ecore_main_loop_begin (ecore_main.c:1248) ==4829== by 0x5480EE: main (e_main.c:1090) ==4829== Address 0x2bfc30f8 is 328 bytes inside a block of size 560 free'd ==4829== at 0x4C30D18: free (vg_replace_malloc.c:530) ==4829== by 0x540AE91: _eina_freeq_free_do (eina_freeq.c:118) ==4829== by 0x540B7B0: eina_freeq_ptr_add (eina_freeq.c:372) ==4829== by 0x6BCD23C: _evas_common_rgba_image_delete (evas_image_main.c:555) ==4829== by 0x6B41538: _evas_cache_image_entry_delete (evas_cache_image.c:205) ==4829== by 0x6B43503: evas_cache_image_drop (evas_cache_image.c:945) ==4829== by 0x6B43F4F: evas_cache_image_size_set (evas_cache_image.c:1166) ==4829== by 0x246D6548: evas_gl_common_image_alloc_ensure (evas_gl_image.c:17) ==4829== by 0x246D8EA8: evas_gl_common_image_update (evas_gl_image.c:869) ==4829== by 0x246DAA7B: evas_gl_common_image_draw (evas_gl_image.c:1417) ==4829== by 0x246A2AB6: eng_image_draw (evas_engine.c:1240) ==4829== by 0x6A87842: _draw_image (evas_object_image.c:1403) ==4829== by 0x6A8A1BF: _evas_image_render (evas_object_image.c:2171) ==4829== by 0x6A890C1: evas_object_image_render (evas_object_image.c:1868) ==4829== by 0x6B09C82: evas_render_mapped (evas_render.c:2292) ==4829== by 0x6B0CE90: evas_render_updates_internal_loop (evas_render.c:3079) ==4829== by 0x6B0EACA: evas_render_updates_internal (evas_render.c:3522) ==4829== by 0x6B1087C: evas_render_updates_internal_wait (evas_render.c:3946) ==4829== by 0x6B10A4D: _evas_canvas_render_updates (evas_render.c:3971) ==4829== by 0x6A7A234: evas_canvas_render_updates (evas_canvas.eo.c:212) ==4829== by 0x6A7BBD4: evas_render_updates (evas_canvas.eo.c:758) ==4829== by 0x808A7D8: ecore_evas_render (ecore_evas.c:177) ==4829== by 0x808AA58: _ecore_evas_idle_enter (ecore_evas.c:284) ==4829== by 0x5CC1E46: _ecore_call_task_cb (ecore_private.h:442) ==4829== by 0x5CC1EAE: _ecore_factorized_idle_process (ecore_idler.c:35) ==4829== by 0xBFA4DD4: _event_callback_call (eo_base_class.c:1663) ==4829== by 0xBFA50A6: _efl_object_event_callback_call (eo_base_class.c:1747) ==4829== by 0xBFA514C: efl_event_callback_call (eo_base_class.c:1750) ==4829== by 0x5CC661B: _ecore_main_loop_iterate_internal (ecore_main.c:2352) ==4829== by 0x5CC3F65: _ecore_main_loop_begin (ecore_main.c:1175) ==4829== by 0x5CCC856: _efl_loop_begin (efl_loop.c:83) ==4829== by 0x5CCEF6D: efl_loop_begin (efl_loop.eo.c:28) ==4829== by 0x5CC40DF: ecore_main_loop_begin (ecore_main.c:1248) ==4829== by 0x5480EE: main (e_main.c:1090) ==4829== Block was alloc'd at ==4829== at 0x4C31A1E: calloc (vg_replace_malloc.c:711) ==4829== by 0x6BCCF2F: _evas_common_rgba_image_new (evas_image_main.c:509) ==4829== by 0x6B41588: _evas_cache_image_entry_new (evas_cache_image.c:261) ==4829== by 0x6B44861: evas_cache_image_empty (evas_cache_image.c:1447) ==4829== by 0x246D845B: evas_gl_common_image_native_disable (evas_gl_image.c:624) ==4829== by 0x253F3C09: eng_image_native_set (evas_engine.c:1234) ==4829== by 0x6A86204: _evas_image_native_surface_set (evas_object_image.c:1021) ==4829== by 0x6A7E110: evas_object_image_native_surface_set (evas_image_legacy.c:509) ==4829== by 0x6A8609A: _on_image_native_surface_del (evas_object_image.c:998) ==4829== by 0x6A55190: _eo_evas_object_cb (evas_callbacks.c:184) ==4829== by 0xBFA4EB7: _event_callback_call (eo_base_class.c:1686) ==4829== by 0xBFA51F8: _efl_object_event_callback_legacy_call (eo_base_class.c:1759) ==4829== by 0xBFA529E: efl_event_callback_legacy_call (eo_base_class.c:1762) ==4829== by 0x6A968ED: _efl_canvas_object_efl_object_event_callback_legacy_call (evas_object_main.c:1229) ==4829== by 0xBFA529E: efl_event_callback_legacy_call (eo_base_class.c:1762) ==4829== by 0x6A55C3D: evas_object_event_callback_call (evas_callbacks.c:413) ==4829== by 0x6A96D3E: _efl_canvas_object_efl_object_invalidate (evas_object_main.c:1279) ==4829== by 0xBFA7BAB: efl_invalidate (efl_object.eo.c:72) ==4829== by 0xBFA0A09: _efl_invalidate (eo_base_class.c:170) ==4829== by 0xBFA2737: _efl_object_parent_set (eo_base_class.c:734) ==4829== by 0xBFA6BDA: efl_parent_set (efl_object.eo.c:12) ==4829== by 0xBFA2537: efl_del (eo_base_class.c:686) ==4829== by 0x6A96082: evas_object_del (evas_object_main.c:1041) ==4829== by 0x2C9D519F: _bar_icon_preview_del (bar.c:762) ==4829== by 0x6A55190: _eo_evas_object_cb (evas_callbacks.c:184) ==4829== by 0xBFA4EB7: _event_callback_call (eo_base_class.c:1686) ==4829== by 0xBFA51F8: _efl_object_event_callback_legacy_call (eo_base_class.c:1759) ==4829== by 0xBFA529E: efl_event_callback_legacy_call (eo_base_class.c:1762) ==4829== by 0x6A968ED: _efl_canvas_object_efl_object_event_callback_legacy_call (evas_object_main.c:1229) ==4829== by 0xBFA529E: efl_event_callback_legacy_call (eo_base_class.c:1762) ==4829== by 0x6A55C3D: evas_object_event_callback_call (evas_callbacks.c:413) ==4829== by 0x6A96D3E: _efl_canvas_object_efl_object_invalidate (evas_object_main.c:1279) ==4829== by 0xBFA7BAB: efl_invalidate (efl_object.eo.c:72) ==4829== by 0x7BE9326: _efl_access_object_efl_object_invalidate (efl_access_object.c:634) ==4829== by 0xBFA7BAB: efl_invalidate (efl_object.eo.c:72) ==4829== by 0xBFA0A09: _efl_invalidate (eo_base_class.c:170) ==4829== by 0xBFA2737: _efl_object_parent_set (eo_base_class.c:734) ==4829== by 0xBFA6BDA: efl_parent_set (efl_object.eo.c:12) ==4829== by 0xBFA2537: efl_del (eo_base_class.c:686) ==4829== by 0x6A96082: evas_object_del (evas_object_main.c:1041) ==4829== by 0x7CD5F2C: _efl_ui_widget_efl_canvas_group_group_del (efl_ui_widget.c:855) ==4829== by 0x6AAD303: efl_canvas_group_del (evas_object_smart.c:1862) ==4829== by 0x7AFF104: _elm_box_efl_canvas_group_group_del (elm_box.c:362) ==4829== by 0x6AAD303: efl_canvas_group_del (evas_object_smart.c:1862) ==4829== by 0x6AABB79: evas_object_smart_del (evas_object_smart.c:1288) ==4829== by 0x6A97179: _efl_canvas_object_efl_object_invalidate (evas_object_main.c:1336) ==4829== by 0xBFA7BAB: efl_invalidate (efl_object.eo.c:72) ==4829== by 0x7BE9326: _efl_access_object_efl_object_invalidate (efl_access_object.c:634) ==4829== by 0xBFA7BAB: efl_invalidate (efl_object.eo.c:72) ==4829== by 0xBFA0A09: _efl_invalidate (eo_base_class.c:170) ==4829== by 0xBFA2737: _efl_object_parent_set (eo_base_class.c:734) ==4829== by 0xBFA6BDA: efl_parent_set (efl_object.eo.c:12) ==4829== by 0xBFA2537: efl_del (eo_base_class.c:686) ==4829== by 0x6A96082: evas_object_del (evas_object_main.c:1041) ==4829== by 0x2C9D41DA: _bar_icon_preview_hide (bar.c:450) ==4829== by 0x5CFE14C: _ecore_call_task_cb (ecore_private.h:442) ==4829== by 0x5CFE5C4: _ecore_timer_legacy_tick (ecore_timer.c:160) ==4829== by 0xBFA4DD4: _event_callback_call (eo_base_class.c:1663) ==4829== by 0xBFA50A6: _efl_object_event_callback_call (eo_base_class.c:1747) ==4829== by 0xBFA514C: efl_event_callback_call (eo_base_class.c:1750) ==4829== by 0x5CFF880: _efl_loop_timer_expired_call (ecore_timer.c:634) ==4829== by 0x5CFF6AF: _efl_loop_timer_expired_timers_call (ecore_timer.c:587) ==4829== by 0x5CC6522: _ecore_main_loop_iterate_internal (ecore_main.c:2317) ==4829== by 0x5CC3F65: _ecore_main_loop_begin (ecore_main.c:1175) ==4829== by 0x5CCC856: _efl_loop_begin (efl_loop.c:83) ==4829== by 0x5CCEF6D: efl_loop_begin (efl_loop.eo.c:28) ==4829== by 0x5CC40DF: ecore_main_loop_begin (ecore_main.c:1248) ==4829== by 0x5480EE: main (e_main.c:1090) Reviewers: ManMower Reviewed By: ManMower Subscribers: cedric, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D6234
2018-05-31 11:11:09 -07:00
// alloc ensure can change im->im, so only get the local variable later.
ie = &im->im->cache_entry;
/*
if ((im->cs.space == EVAS_COLORSPACE_YCBCR422P601_PL) ||
(im->cs.space == EVAS_COLORSPACE_YCBCR422P709_PL))
{
// SOFTWARE convert. do multi texture later
if ((im->cs.data) && (*((unsigned char **)im->cs.data)))
{
if (im->dirty || !im->im->image.data)
{
free(im->im->image.data);
im->im->image.data = malloc(im->im->cache_entry.w * im->im->cache_entry.h * sizeof(DATA32));
if (im->im->image.data)
evas_common_convert_yuv_422p_601_rgba(im->cs.data,
(void *)im->im->image.data,
im->im->cache_entry.w, im->im->cache_entry.h);
}
}
space = EVAS_COLORSPACE_ARGB8888;
}
else
*/
switch (im->cs.space)
{
case EVAS_COLORSPACE_ARGB8888:
case EVAS_COLORSPACE_GRY8:
case EVAS_COLORSPACE_AGRY88:
case EVAS_COLORSPACE_ETC1:
case EVAS_COLORSPACE_RGB8_ETC2:
case EVAS_COLORSPACE_RGBA8_ETC2_EAC:
case EVAS_COLORSPACE_RGB_S3TC_DXT1:
case EVAS_COLORSPACE_RGBA_S3TC_DXT1:
case EVAS_COLORSPACE_RGBA_S3TC_DXT2:
case EVAS_COLORSPACE_RGBA_S3TC_DXT3:
case EVAS_COLORSPACE_RGBA_S3TC_DXT4:
case EVAS_COLORSPACE_RGBA_S3TC_DXT5:
if ((im->tex) &&
((im->dirty) || (ie->animated.animated) || (ie->flags.updated_data)))
{
2018-09-02 23:19:02 -07:00
ie->load_error = evas_cache_image_load_data(ie);
evas_gl_common_texture_update(im->tex, im->im);
evas_cache_image_unload_data(ie);
}
2018-09-02 23:19:02 -07:00
else if (!im->tex &&
((ie->load_error == EVAS_LOAD_ERROR_NONE) ||
(ie->load_error == EVAS_LOAD_ERROR_CANCELLED)))
{
2018-09-02 23:19:02 -07:00
ie->load_error = evas_cache_image_load_data(ie);
im->tex = evas_gl_common_texture_new(gc, im->im, im->disable_atlas);
evas_cache_image_unload_data(ie);
}
ie->flags.updated_data = EINA_FALSE;
im->dirty = 0;
break;
case EVAS_COLORSPACE_ETC1_ALPHA:
if ((im->tex) && (im->dirty))
{
2018-09-02 23:19:02 -07:00
ie->load_error = evas_cache_image_load_data(ie);
evas_gl_common_texture_rgb_a_pair_update(im->tex, im->im);
evas_cache_image_unload_data(ie);
}
2018-09-02 23:19:02 -07:00
else if (!im->tex &&
((ie->load_error == EVAS_LOAD_ERROR_NONE) ||
(ie->load_error == EVAS_LOAD_ERROR_CANCELLED)))
{
2018-09-02 23:19:02 -07:00
ie->load_error = evas_cache_image_load_data(ie);
im->tex = evas_gl_common_texture_rgb_a_pair_new(gc, im->im);
evas_cache_image_unload_data(ie);
}
im->dirty = 0;
break;
case EVAS_COLORSPACE_YCBCR422P601_PL:
case EVAS_COLORSPACE_YCBCR422P709_PL:
if ((im->tex) && (im->dirty))
{
evas_gl_common_texture_yuv_update(im->tex, im->cs.data, ie->w, ie->h);
im->dirty = 0;
}
if ((!im->tex) && (im->cs.data) && (*((unsigned char **)im->cs.data)))
{
im->tex = evas_gl_common_texture_yuv_new(gc, im->cs.data, ie->w, ie->h);
im->dirty = 0;
}
break;
case EVAS_COLORSPACE_YCBCR422601_PL:
if ((im->tex) && (im->dirty))
{
evas_gl_common_texture_yuy2_update(im->tex, im->cs.data, ie->w, ie->h);
im->dirty = 0;
}
if ((!im->tex) && (im->cs.data) && (*((unsigned char **)im->cs.data)))
{
im->tex = evas_gl_common_texture_yuy2_new(gc, im->cs.data, ie->w, ie->h);
im->dirty = 0;
}
break;
case EVAS_COLORSPACE_YCBCR420NV12601_PL:
if ((im->tex) && (im->dirty))
{
evas_gl_common_texture_nv12_update(im->tex, im->cs.data, ie->w, ie->h);
im->dirty = 0;
}
if ((!im->tex) && (im->cs.data) && (*((unsigned char **)im->cs.data)))
{
im->tex = evas_gl_common_texture_nv12_new(gc, im->cs.data, ie->w, ie->h);
im->dirty = 0;
}
break;
case EVAS_COLORSPACE_YCBCR420TM12601_PL:
if ((im->tex) && (im->dirty))
{
evas_gl_common_texture_nv12tiled_update(im->tex, im->cs.data, ie->w, ie->h);
im->dirty = 0;
}
if ((!im->tex) && (im->cs.data) && (*((unsigned char **)im->cs.data)))
{
im->tex = evas_gl_common_texture_nv12tiled_new(gc, im->cs.data, ie->w, ie->h);
im->dirty = 0;
}
break;
default:
ERR("unhandled img format colorspace=%d", im->cs.space);
break;
}
}
Evas_GL_Image *
evas_gl_common_image_surface_update(Evas_GL_Image *im)
{
Evas_Engine_GL_Context *gc;
Evas_GL_Image *glim = NULL;
Eina_Bool alpha;
int w, h;
if (!im || !im->gc || !im->im || !im->im->image.data)
goto fail;
if (im->im->cache_entry.space == (Evas_Colorspace)EFL_GFX_COLORSPACE_ARGB8888)
alpha = EINA_FALSE;
else if (im->im->cache_entry.space == (Evas_Colorspace)EFL_GFX_COLORSPACE_GRY8)
alpha = EINA_TRUE;
else goto fail;
gc = im->gc;
w = im->im->cache_entry.w;
h = im->im->cache_entry.h;
glim = evas_gl_common_image_surface_new(gc, w, h, EINA_TRUE, EINA_FALSE);
if (!glim) goto fail;
if (alpha)
{
RGBA_Image *image;
uint32_t *rgba;
uint8_t *gry8;
int k;
image = evas_common_image_new(w, h, EINA_TRUE);
if (!image) goto fail;
rgba = image->image.data;
gry8 = im->im->image.data8;
for (k = 0; k < (w * h); k++)
{
const int c = *gry8++;
*rgba++ = ARGB_JOIN(c, c, c, c);
}
glim->im = image;
}
else
{
evas_cache_image_ref(&im->im->cache_entry);
glim->im = im->im;
}
glim->dirty = EINA_TRUE;
evas_gl_common_image_update(gc, glim);
evas_gl_common_image_free(im);
return glim;
fail:
ERR("Failed to update surface pixels!");
if (glim) evas_gl_common_image_free(glim);
return NULL;
}
Evas_GL_Image *
evas_gl_common_image_surface_detach(Evas_GL_Image *im)
{
if (!im || !im->im) return im;
evas_cache_image_drop(&im->im->cache_entry);
im->im = NULL;
return im;
}
Evas_GL_Image *
evas_gl_common_image_virtual_scaled_get(Evas_GL_Image *scaled, Evas_GL_Image *image,
int dst_w, int dst_h, Eina_Bool smooth)
{
Evas_GL_Image *dst = scaled, *newdst;
Evas_GL_Image *src = image;
Evas_Engine_GL_Context *gc;
Eina_Bool reffed = EINA_FALSE;
if (!src) return NULL;
// masking will work only with single texture images
switch (src->cs.space)
{
case EVAS_COLORSPACE_AGRY88:
case EVAS_COLORSPACE_ARGB8888:
case EVAS_COLORSPACE_GRY8:
case EVAS_COLORSPACE_RGBA8_ETC2_EAC:
case EVAS_COLORSPACE_RGBA_S3TC_DXT1:
case EVAS_COLORSPACE_RGBA_S3TC_DXT2:
case EVAS_COLORSPACE_RGBA_S3TC_DXT3:
case EVAS_COLORSPACE_RGBA_S3TC_DXT4:
case EVAS_COLORSPACE_RGBA_S3TC_DXT5:
break;
default:
DBG("cspace %d can't be used for masking's fast path", src->cs.space);
return NULL;
}
gc = src->gc;
if (dst && (dst->scaled.origin == src) &&
(dst->w == dst_w) && (dst->h == dst_h))
return dst;
evas_gl_common_image_update(gc, src);
if (!src->tex)
{
ERR("No source texture.");
return NULL;
}
newdst = calloc(1, sizeof(Evas_GL_Image));
if (!newdst) return NULL;
if (dst)
{
if (dst->scaled.origin == src)
{
if (dst->references == 1)
{
dst->w = dst_w;
dst->h = dst_h;
dst->scaled.smooth = smooth;
free(newdst);
return dst;
}
src->references++;
reffed = EINA_TRUE;
}
evas_gl_common_image_free(dst);
}
newdst->references = 1;
newdst->gc = gc;
newdst->cs.space = src->cs.space;
newdst->alpha = src->alpha;
newdst->w = dst_w;
newdst->h = dst_h;
newdst->tex = src->tex;
newdst->tex->references++;
newdst->tex_only = 1;
if (!reffed) src->references++;
newdst->scaled.origin = src;
newdst->scaled.smooth = smooth;
return newdst;
}
void
evas_gl_common_image_map_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im,
int npoints, RGBA_Map_Point *p, int smooth, int level EINA_UNUSED)
{
int mx = 0, my = 0, mw = 0, mh = 0;
RGBA_Draw_Context *dc = gc->dc;
Eina_Bool mask_smooth = EINA_FALSE;
Evas_GL_Image *mask = dc->clip.mask;
Evas_GL_Texture *mtex = NULL;
Eina_Bool mask_color = EINA_FALSE;
int r, g, b, a;
int c, cx, cy, cw, ch;
int offset = 0;
if (dc->mul.use)
{
a = (dc->mul.col >> 24) & 0xff;
r = (dc->mul.col >> 16) & 0xff;
g = (dc->mul.col >> 8 ) & 0xff;
b = (dc->mul.col ) & 0xff;
}
else
{
r = g = b = a = 255;
}
evas_gl_common_image_update(gc, im);
c = dc->clip.use;
cx = dc->clip.x; cy = dc->clip.y;
cw = dc->clip.w; ch = dc->clip.h;
if (!im->tex) return;
im->tex->im = im;
if (mask)
{
evas_gl_common_image_update(gc, mask);
mtex = mask->tex;
if (mtex && mtex->pt && mtex->pt->w && mtex->pt->h)
{
// canvas coords
mx = gc->dc->clip.mask_x;
my = gc->dc->clip.mask_y;
mw = mask->w;
mh = mask->h;
mask_smooth = mask->scaled.smooth;
mask_color = dc->clip.mask_color;
}
else mtex = NULL;
}
while (npoints >= 4)
{
evas_gl_common_context_image_map_push(gc, im->tex, npoints, &p[offset],
c, cx, cy, cw, ch,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
r, g, b, a, smooth, im->tex_only,
im->cs.space);
offset += 4;
npoints -= 4;
}
}
2005-05-21 19:49:50 -07:00
static void
_evas_gl_common_image_push(Evas_Engine_GL_Context *gc, Evas_GL_Image *im,
int dx, int dy, int dw, int dh,
int sx, int sy, int sw, int sh,
int cx, int cy, int cw, int ch,
int r, int g, int b, int a,
Evas_GL_Image *mask,
Eina_Bool smooth,
Eina_Bool yuv, Eina_Bool yuv_709,
Eina_Bool yuy2, Eina_Bool nv12,
Eina_Bool rgb_a_pair)
2013-09-09 02:59:21 -07:00
{
int mx = 0, my = 0, mw = 0, mh = 0;
2013-09-09 02:59:21 -07:00
double ssx, ssy, ssw, ssh;
Evas_GL_Texture *mtex = NULL;
Eina_Bool mask_smooth = EINA_FALSE;
Eina_Bool mask_color = EINA_FALSE;
2013-09-09 02:59:21 -07:00
int nx, ny, nw, nh;
nx = dx; ny = dy; nw = dw; nh = dh;
RECTS_CLIP_TO_RECT(nx, ny, nw, nh,
cx, cy, cw, ch);
if ((nw < 1) || (nh < 1)) return;
if (!im->tex) return;
if (mask)
{
evas_gl_common_image_update(gc, mask);
mtex = mask->tex;
if (mtex && mtex->pt && mtex->pt->w && mtex->pt->h)
{
// canvas coords
mx = gc->dc->clip.mask_x;
my = gc->dc->clip.mask_y;
mw = mask->w;
mh = mask->h;
mask_smooth = mask->scaled.smooth;
mask_color = gc->dc->clip.mask_color;
}
else mtex = NULL;
}
2013-09-09 02:59:21 -07:00
if ((nx == dx) && (ny == dy) && (nw == dw) && (nh == dh))
{
if (yuv)
2013-09-09 02:59:21 -07:00
evas_gl_common_context_yuv_push(gc,
im->tex,
sx, sy, sw, sh,
dx, dy, dw, dh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
2013-09-09 02:59:21 -07:00
r, g, b, a,
smooth);
else if (yuv_709)
evas_gl_common_context_yuv_709_push(gc,
im->tex,
sx, sy, sw, sh,
dx, dy, dw, dh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
r, g, b, a,
smooth);
2013-09-09 02:59:21 -07:00
else if (yuy2)
evas_gl_common_context_yuy2_push(gc,
im->tex,
sx, sy, sw, sh,
dx, dy, dw, dh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
2013-09-09 02:59:21 -07:00
r, g, b, a,
smooth);
else if (nv12)
evas_gl_common_context_nv12_push(gc,
im->tex,
sx, sy, sw, sh,
dx, dy, dw, dh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
2013-09-09 02:59:21 -07:00
r, g, b, a,
smooth);
else if (rgb_a_pair)
evas_gl_common_context_rgb_a_pair_push(gc,
im->tex,
sx, sy, sw, sh,
dx, dy, dw, dh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
r, g, b, a,
smooth);
2013-09-09 02:59:21 -07:00
else
evas_gl_common_context_image_push(gc,
im->tex,
sx, sy, sw, sh,
dx, dy, dw, dh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
2013-09-09 02:59:21 -07:00
r, g, b, a,
smooth, im->tex_only, EINA_FALSE);
2013-09-09 02:59:21 -07:00
return;
}
ssx = (double)sx + ((double)(sw * (nx - dx)) / (double)(dw));
ssy = (double)sy + ((double)(sh * (ny - dy)) / (double)(dh));
ssw = ((double)sw * (double)(nw)) / (double)(dw);
ssh = ((double)sh * (double)(nh)) / (double)(dh);
if (yuv)
2013-09-09 02:59:21 -07:00
evas_gl_common_context_yuv_push(gc,
im->tex,
ssx, ssy, ssw, ssh,
nx, ny, nw, nh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
2013-09-09 02:59:21 -07:00
r, g, b, a,
smooth);
else if (yuv_709)
evas_gl_common_context_yuv_709_push(gc,
im->tex,
ssx, ssy, ssw, ssh,
nx, ny, nw, nh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
r, g, b, a,
smooth);
2013-09-09 02:59:21 -07:00
else if (yuy2)
evas_gl_common_context_yuy2_push(gc,
im->tex,
ssx, ssy, ssw, ssh,
nx, ny, nw, nh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
2013-09-09 02:59:21 -07:00
r, g, b, a,
smooth);
else if (nv12)
evas_gl_common_context_nv12_push(gc,
im->tex,
ssx, ssy, ssw, ssh,
nx, ny, nw, nh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
2013-09-09 02:59:21 -07:00
r, g, b, a,
smooth);
else if (rgb_a_pair)
evas_gl_common_context_rgb_a_pair_push(gc,
im->tex,
ssx, ssy, ssw, ssh,
nx, ny, nw, nh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
r, g, b, a,
smooth);
2013-09-09 02:59:21 -07:00
else
evas_gl_common_context_image_push(gc,
im->tex,
ssx, ssy, ssw, ssh,
nx, ny, nw, nh,
mtex, mx, my, mw, mh, mask_smooth, mask_color,
2013-09-09 02:59:21 -07:00
r, g, b, a,
smooth, im->tex_only, EINA_FALSE);
2013-09-09 02:59:21 -07:00
}
void
evas_gl_common_image_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im,
int sx, int sy, int sw, int sh,
int dx, int dy, int dw, int dh,
int smooth)
{
RGBA_Draw_Context *dc;
int r, g, b, a;
Cutout_Rect *rct;
int c, cx, cy, cw, ch;
int i;
Eina_Bool yuv = EINA_FALSE;
Eina_Bool yuv_709 = EINA_FALSE;
Eina_Bool yuy2 = EINA_FALSE;
Eina_Bool nv12 = EINA_FALSE;
Eina_Bool rgb_a_pair = EINA_FALSE;
Evas_GL_Image *mask;
if (sw < 1) sw = 1;
if (sh < 1) sh = 1;
dc = gc->dc;
if (dc->mul.use)
{
a = (dc->mul.col >> 24) & 0xff;
r = (dc->mul.col >> 16) & 0xff;
g = (dc->mul.col >> 8 ) & 0xff;
b = (dc->mul.col ) & 0xff;
}
else
{
r = g = b = a = 255;
}
evas_gl_common_image_update(gc, im);
if (!im->tex)
{
evas_gl_common_rect_draw(gc, dx, dy, dw, dh);
return;
}
mask = gc->dc->clip.mask;
switch (im->cs.space)
{
case EVAS_COLORSPACE_YCBCR422P601_PL:
yuv = EINA_TRUE;
break;
case EVAS_COLORSPACE_YCBCR422P709_PL:
yuv_709 = EINA_TRUE;
break;
case EVAS_COLORSPACE_YCBCR422601_PL:
yuy2 = EINA_TRUE;
break;
case EVAS_COLORSPACE_YCBCR420NV12601_PL:
case EVAS_COLORSPACE_YCBCR420TM12601_PL:
nv12 = EINA_TRUE;
break;
case EVAS_COLORSPACE_ETC1_ALPHA:
rgb_a_pair = EINA_TRUE;
break;
default: break;
}
if ((sw == dw) && (sh == dh)) smooth = 0;
im->tex->im = im;
if ((!gc->dc->cutout.rects) ||
((gc->shared->info.tune.cutout.max > 0) &&
(gc->dc->cutout.active > gc->shared->info.tune.cutout.max)))
{
if (mask || gc->dc->clip.use)
{
_evas_gl_common_image_push(gc, im,
dx, dy, dw, dh,
sx, sy, sw, sh,
gc->dc->clip.x, gc->dc->clip.y,
gc->dc->clip.w, gc->dc->clip.h,
r, g, b, a,
mask,
smooth,
yuv, yuv_709, yuy2, nv12, rgb_a_pair);
}
else
{
_evas_gl_common_image_push(gc, im,
dx, dy, dw, dh,
sx, sy, sw, sh,
dx, dy, dw, dh,
r, g, b, a,
mask,
smooth,
yuv, yuv_709, yuy2, nv12, rgb_a_pair);
}
return;
}
/* save out clip info */
c = gc->dc->clip.use; cx = gc->dc->clip.x; cy = gc->dc->clip.y; cw = gc->dc->clip.w; ch = gc->dc->clip.h;
evas_common_draw_context_clip_clip(gc->dc, 0, 0, gc->shared->w, gc->shared->h);
evas_common_draw_context_clip_clip(gc->dc, dx, dy, dw, dh);
/* our clip is 0 size.. abort */
if ((gc->dc->clip.w <= 0) || (gc->dc->clip.h <= 0))
{
gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch;
return;
}
_evas_gl_common_cutout_rects = evas_common_draw_context_apply_cutouts(dc, _evas_gl_common_cutout_rects);
for (i = 0; i < _evas_gl_common_cutout_rects->active; ++i)
{
rct = _evas_gl_common_cutout_rects->rects + i;
2013-09-09 02:59:21 -07:00
_evas_gl_common_image_push(gc, im,
dx, dy, dw, dh,
sx, sy, sw, sh,
rct->x, rct->y, rct->w, rct->h,
r, g, b, a,
mask,
smooth,
yuv, yuv_709, yuy2, nv12, rgb_a_pair);
}
evas_common_draw_context_cutouts_free(_evas_gl_common_cutout_rects);
/* restore clip info */
gc->dc->clip.use = c; gc->dc->clip.x = cx; gc->dc->clip.y = cy; gc->dc->clip.w = cw; gc->dc->clip.h = ch;
}