[evas_gl] fix reference counting
authorJoogab Yun <joogab.yun@samsung.com>
Fri, 23 Dec 2016 12:29:37 +0000 (21:29 +0900)
committerWonki Kim <wonki_.kim@samsung.com>
Mon, 2 Jan 2017 07:27:06 +0000 (16:27 +0900)
     -  if using elm_image_orient_set in genlist then 3D memory is increased
        so, crash happend

sample code:
{
Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
itc->item_style = strdup("full");
itc->func.content_get = _content_get_cb;
}

static Evas_Object *_content_get_cb(void *data, Evas_Object *obj, const
char *part)
{
if (strcmp(part, "elm.swallow.content"))
return NULL;

int i = (int)(intptr_t)data;

Evas_Object *img = elm_image_add(obj);
elm_image_file_set(img, img_path[i%6], NULL);
elm_image_preload_disabled_set(img, EINA_TRUE);
elm_image_orient_set(img, ELM_IMAGE_ORIENT_90);
evas_object_size_hint_min_set(img, 500, 500);

return img;
}

Change-Id: I12d0b734650066e851ea612ed68971e08b83fdd4

src/modules/evas/engines/gl_generic/evas_engine.c

index d98a84c4ffdc0677662add06decd3c0a806ea3e1..1de44bce186a0eb3c571ebb3a42e2016035453c9 100644 (file)
@@ -983,7 +983,7 @@ eng_image_orient_set(void *data, void *image, Evas_Image_Orient orient)
 {
    Render_Engine_GL_Generic *re = data;
    Evas_GL_Image *im;
-   Evas_GL_Image *im_new;
+   Evas_GL_Image *im_new = NULL;
 
    if (!image) return NULL;
    im = image;
@@ -993,7 +993,8 @@ eng_image_orient_set(void *data, void *image, Evas_Image_Orient orient)
 
    evas_gl_common_image_update(im->gc, im);
 
-   im_new = evas_gl_common_image_new(im->gc, im->w, im->h, im->alpha, im->cs.space);
+   if (im->im)
+      im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->w, im->h, im->im->image.data, im->alpha, im->cs.space);
    if (!im_new) return im;
 
    im_new->load_opts = im->load_opts;
@@ -1009,9 +1010,6 @@ eng_image_orient_set(void *data, void *image, Evas_Image_Orient orient)
 
    im_new->orient = orient;
    im_new->rotated = EINA_TRUE;
-   im_new->tex = im->tex;
-   im_new->tex->references++;
-   im_new->tex->pt->references++;
 
    evas_gl_common_image_free(im);
    return im_new;