diff --git a/legacy/evas/src/lib/engines/gl_common/evas_gl_context.c b/legacy/evas/src/lib/engines/gl_common/evas_gl_context.c index a3e1cd5f1f..c6ba1390d1 100644 --- a/legacy/evas/src/lib/engines/gl_common/evas_gl_context.c +++ b/legacy/evas/src/lib/engines/gl_common/evas_gl_context.c @@ -65,10 +65,6 @@ evas_gl_common_context_use(Evas_GL_Context *gc) { if (strstr(ext, "GL_SGIS_generate_mipmap")) gc->ext.sgis_generate_mipmap = 1; if (strstr(ext, "GL_NV_texture_rectangle")) gc->ext.nv_texture_rectangle = 1; - /* technically this should work, as its a compatible */ - /* implementation of the nvidia texture_rectangle extension */ - /* since the #define value is the same as is the description */ - /* it was fixed in the latest (3.2.5) fglrx drivers */ if (strstr(ext, "GL_EXT_texture_rectangle")) gc->ext.nv_texture_rectangle = 1; printf("GL EXT supported: GL_SGIS_generate_mipmap = %x\n", gc->ext.sgis_generate_mipmap); printf("GL EXT supported: GL_NV_texture_rectangle = %x\n", gc->ext.nv_texture_rectangle); diff --git a/legacy/evas/src/lib/engines/gl_common/evas_gl_image.c b/legacy/evas/src/lib/engines/gl_common/evas_gl_image.c index 2a2bdc71dd..5661626f40 100644 --- a/legacy/evas/src/lib/engines/gl_common/evas_gl_image.c +++ b/legacy/evas/src/lib/engines/gl_common/evas_gl_image.c @@ -172,7 +172,8 @@ evas_gl_common_image_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, Evas_GL_Im oh = (dh * im->tex->th) / sh; evas_gl_common_context_texture_set(gc, im->tex, smooth, ow, oh); if ((!im->tex->have_mipmaps) && (smooth) && - ((im->tex->uw < im->tex->tw) || (im->tex->uh < im->tex->th))) + ((im->tex->uw < im->tex->tw) || (im->tex->uh < im->tex->th)) && + (!gc->ext.sgis_generate_mipmap)) evas_gl_common_texture_mipmaps_build(im->tex, im->im, smooth); if (im->tex->not_power_of_two) @@ -204,9 +205,19 @@ evas_gl_common_image_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, Evas_GL_Im evas_gl_common_context_write_buf_set(gc, GL_BACK); glBegin(GL_QUADS); - glTexCoord2d(tx1, ty1); glVertex2i(dx , dy ); - glTexCoord2d(tx2, ty1); glVertex2i(dx + dw, dy ); - glTexCoord2d(tx2, ty2); glVertex2i(dx + dw, dy + dh); - glTexCoord2d(tx1, ty2); glVertex2i(dx , dy + dh); + if (im->tex->not_power_of_two) + { + glTexCoord2d(tx1, ty1); glVertex2i(dx , dy ); + glTexCoord2d(tx2, ty1); glVertex2i(dx + dw, dy ); + glTexCoord2d(tx2, ty2); glVertex2i(dx + dw, dy + dh); + glTexCoord2d(tx1, ty2); glVertex2i(dx , dy + dh); + } + else + { + glTexCoord2d(tx1, ty1); glVertex2f(dx , dy ); + glTexCoord2d(tx2, ty1); glVertex2f(dx + dw + 0.5, dy ); + glTexCoord2d(tx2, ty2); glVertex2f(dx + dw + 0.5, dy + dh + 0.5); + glTexCoord2d(tx1, ty2); glVertex2f(dx , dy + dh + 0.5); + } glEnd(); } diff --git a/legacy/evas/src/lib/engines/gl_common/evas_gl_texture.c b/legacy/evas/src/lib/engines/gl_common/evas_gl_texture.c index e6604259e8..9a996fb668 100644 --- a/legacy/evas/src/lib/engines/gl_common/evas_gl_texture.c +++ b/legacy/evas/src/lib/engines/gl_common/evas_gl_texture.c @@ -68,12 +68,13 @@ evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im, int smooth) glEnable(GL_TEXTURE_2D); glGenTextures(1, &(tex->texture)); glBindTexture(GL_TEXTURE_2D, tex->texture); - if (gc->texture) gc->texture->references--; gc->texture = tex; gc->change.texture = 1; tex->references++; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 8); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); diff --git a/legacy/evas/src/lib/engines/xrender_x11/evas_engine.c b/legacy/evas/src/lib/engines/xrender_x11/evas_engine.c index 0bad71c808..47031e49d9 100644 --- a/legacy/evas/src/lib/engines/xrender_x11/evas_engine.c +++ b/legacy/evas/src/lib/engines/xrender_x11/evas_engine.c @@ -772,14 +772,22 @@ evas_engine_xrender_x11_image_data_put(void *data, void *image, DATA32 *image_da XR_Image *old_image; old_image = (XR_Image *)image; - image = _xre_image_new_from_data(old_image->xinf, old_image->w, old_image->h, image_data); - if (image) + image = _xre_image_data_find(image_data); + if (!image) { - ((XR_Image *)image)->alpha = old_image->alpha; - _xre_image_free(old_image); + image = _xre_image_new_from_data(old_image->xinf, old_image->w, old_image->h, image_data); + if (image) + { + ((XR_Image *)image)->alpha = old_image->alpha; + _xre_image_free(old_image); + } + else + image = old_image; } else - image = old_image; + { + _xre_image_free(old_image); + } } return image; } diff --git a/legacy/evas/src/lib/engines/xrender_x11/evas_engine.h b/legacy/evas/src/lib/engines/xrender_x11/evas_engine.h index d6e469b1c6..3080f1725e 100644 --- a/legacy/evas/src/lib/engines/xrender_x11/evas_engine.h +++ b/legacy/evas/src/lib/engines/xrender_x11/evas_engine.h @@ -111,6 +111,7 @@ void _xre_image_region_dirty(XR_Image *im, int x, int y, int w, int h); void _xre_image_dirty(XR_Image *im); XR_Image *_xre_image_copy(XR_Image *im); void *_xre_image_data_get(XR_Image *im); +XR_Image *_xre_image_data_find(void *data); void _xre_image_data_put(XR_Image *im, void *data); void _xre_image_alpha_set(XR_Image *im, int alpha); int _xre_image_alpha_get(XR_Image *im); diff --git a/legacy/evas/src/lib/engines/xrender_x11/evas_engine_image.c b/legacy/evas/src/lib/engines/xrender_x11/evas_engine_image.c index 77bb31c0c5..ebe5774035 100644 --- a/legacy/evas/src/lib/engines/xrender_x11/evas_engine_image.c +++ b/legacy/evas/src/lib/engines/xrender_x11/evas_engine_image.c @@ -8,6 +8,36 @@ static Evas_Hash *_xr_image_hash = NULL; static int _xr_image_cache_size = 0; static int _xr_image_cache_usage = 0; static Evas_List *_xr_image_cache = NULL; +static Evas_Hash *_xr_image_dirty_hash = NULL; + +static void +__xre_image_dirty_hash_add(XR_Image *im) +{ + char buf[64]; + + if (!im->data) return; + snprintf(buf, sizeof(buf), "%p", im->data); + _xr_image_dirty_hash = evas_hash_add(_xr_image_dirty_hash, buf, im); +} + +static void +__xre_image_dirty_hash_del(XR_Image *im) +{ + char buf[64]; + + if (!im->data) return; + snprintf(buf, sizeof(buf), "%p", im->data); + _xr_image_dirty_hash = evas_hash_del(_xr_image_dirty_hash, buf, im); +} + +static XR_Image * +__xre_image_dirty_hash_find(void *data) +{ + char buf[64]; + + snprintf(buf, sizeof(buf), "%p", data); + return evas_hash_find(_xr_image_dirty_hash, buf); +} static XR_Image * __xre_image_find(char *fkey) @@ -91,6 +121,7 @@ _xre_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data) im->data = data; im->alpha = 1; im->dirty = 1; + __xre_image_dirty_hash_add(im); return im; } @@ -99,6 +130,39 @@ _xre_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data) { XR_Image *im; + im = calloc(1, sizeof(XR_Image)); + if (!im) return NULL; + im->data = malloc(w * h * 4); + if (!im->data) + { + free(im); + return NULL; + } + if (data) + { + Gfx_Func_Blend_Src_Dst func; + + func = evas_common_draw_func_copy_get(w * h, 0); + if (func) func(data, im->data, w * h); + evas_common_cpu_end_opt(); + } + im->w = w; + im->h = h; + im->references = 1; + im->xinf = xinf; + im->xinf->references++; + im->free_data = 1; + im->alpha = 1; + im->dirty = 1; + __xre_image_dirty_hash_add(im); + return im; +} + +XR_Image * +_xre_image_new(Ximage_Info *xinf, int w, int h) +{ + XR_Image *im; + im = calloc(1, sizeof(XR_Image)); if (!im) return NULL; im->data = malloc(w * h * 4); @@ -113,42 +177,9 @@ _xre_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data) im->xinf = xinf; im->xinf->references++; im->free_data = 1; - - if (data) - { - Gfx_Func_Blend_Src_Dst func; - - func = evas_common_draw_func_copy_get(w * h, 0); - if (func) func(data, im->data, w * h); - evas_common_cpu_end_opt(); - } - - im->alpha = 1; - im->dirty = 1; - return im; -} - -XR_Image * -_xre_image_new(Ximage_Info *xinf, int w, int h) -{ - XR_Image *im; - - im = calloc(1, sizeof(XR_Image)); - if (!im) return NULL; - im->xinf = xinf; - im->xinf->references++; - im->w = w; - im->h = h; - im->references = 1; - im->data = malloc(w * h * 4); - if (!im->data) - { - im->xinf->references--; - free(im); - } - im->free_data = 1; im->alpha = 1; im->dirty = 1; + __xre_image_dirty_hash_add(im); return im; } @@ -159,6 +190,7 @@ __xre_image_real_free(XR_Image *im) if (im->key) free(im->key); if (im->fkey) free(im->fkey); if (im->im) evas_common_image_unref(im->im); + if ((im->data) && (im->dirty)) __xre_image_dirty_hash_del(im); if ((im->free_data) && (im->data)) free(im->data); if (im->surface) _xr_render_surface_free(im->surface); if (im->format) free(im->format); @@ -283,8 +315,10 @@ _xre_image_resize(XR_Image *im, int w, int h) } evas_common_cpu_end_opt(); } + __xre_image_dirty_hash_del(im); free(im->data); im->data = data; + __xre_image_dirty_hash_add(im); } else if (im->im) { @@ -312,12 +346,19 @@ _xre_image_resize(XR_Image *im, int w, int h) evas_common_blit_rectangle(im_old, im->im, 0, 0, ww, hh, 0, 0); evas_common_cpu_end_opt(); } + im->free_data = 1; + im->data = im->im->image->data; + im->im->image->data = NULL; + evas_common_image_unref(im->im); + im->im = NULL; evas_common_image_unref(im_old); + __xre_image_dirty_hash_add(im); } else { im->data = malloc(w * h * 4); im->free_data = 1; + __xre_image_dirty_hash_add(im); } im->w = w; im->h = h; @@ -341,6 +382,16 @@ _xre_image_data_get(XR_Image *im) return data; } +XR_Image * +_xre_image_data_find(void *data) +{ + XR_Image *im; + + im = __xre_image_dirty_hash_find(data); + if (im) im->references++; + return im; +} + void _xre_image_data_put(XR_Image *im, void *data) { @@ -351,6 +402,7 @@ _xre_image_data_put(XR_Image *im, void *data) { imdata = im->data; if (data == imdata) return; + __xre_image_dirty_hash_del(im); if (im->free_data) free(im->data); } else @@ -364,6 +416,7 @@ _xre_image_data_put(XR_Image *im, void *data) } } im->data = data; + __xre_image_dirty_hash_add(im); im->free_data = 0; if (im->surface) {