Enlightenment CVS committal Author : raster Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/lib/engines/xrender_x11 Modified Files: evas_engine.c evas_engine_image.c evas_engine_ximage.c evas_engine_xrender.c Log Message: fix segv in shared data chunks =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/engines/xrender_x11/evas_engine.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- evas_engine.c 8 Oct 2005 14:16:03 -0000 1.9 +++ evas_engine.c 9 Oct 2005 02:06:52 -0000 1.10 @@ -74,7 +74,14 @@ static void evas_engine_xrender_x11_font_cache_set(void *data, int bytes); static int evas_engine_xrender_x11_font_cache_get(void *data); -typedef struct _Render_Engine Render_Engine; +typedef struct _Render_Engine Render_Engine; +typedef struct _Render_Engine_Update Render_Engine_Update; + +struct _Render_Engine_Update +{ + int x, y, w, h; + Xrender_Surface *surface; +}; struct _Render_Engine { @@ -92,6 +99,8 @@ Tilebuf_Rect *rects; Evas_Object_List *cur_rect; int end : 1; + + Evas_List *updates; }; Evas_Func evas_engine_xrender_x11_func = @@ -257,6 +266,15 @@ re = (Render_Engine *)data; evas_common_font_shutdown(); evas_common_image_shutdown(); + while (re->updates) + { + Render_Engine_Update *reu; + + reu = re->updates->data; + re->updates = evas_list_remove_list(re->updates, re->updates); + _xr_render_surface_free(reu->surface); + free(reu); + } if (re->tb) evas_common_tilebuf_free(re->tb); if (re->output) _xr_render_surface_free(re->output); if (re->mask_output) _xr_render_surface_free(re->mask_output); @@ -371,30 +389,17 @@ evas_engine_xrender_x11_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) { Render_Engine *re; + Render_Engine_Update *reu; re = (Render_Engine *)data; - if (re->mask_output) - { - Xrender_Surface *tsurf; - - _xr_render_surface_copy((Xrender_Surface *)surface, re->output, 0, 0, - x, y, w, h); - tsurf = _xr_render_surface_new(re->xinf, w, h, re->xinf->fmt1, 1); - if (tsurf) - { - _xr_render_surface_copy((Xrender_Surface *)surface, tsurf, 0, 0, - 0, 0, w, h); - _xr_render_surface_copy(tsurf, re->mask_output, 0, 0, - x, y, w, h); - _xr_render_surface_free(tsurf); - } - } - else - { - _xr_render_surface_copy((Xrender_Surface *)surface, re->output, 0, 0, - x, y, w, h); - } - _xr_render_surface_free((Xrender_Surface *)surface); + reu = malloc(sizeof(Render_Engine_Update)); + if (!reu) return; + reu->x = x; + reu->y = y; + reu->w = w; + reu->h = h; + reu->surface = (Xrender_Surface *)surface; + re->updates = evas_list_append(re->updates, reu); } static void @@ -403,6 +408,36 @@ Render_Engine *re; re = (Render_Engine *)data; + while (re->updates) + { + Render_Engine_Update *reu; + + reu = re->updates->data; + re->updates = evas_list_remove_list(re->updates, re->updates); + if (re->mask_output) + { + Xrender_Surface *tsurf; + + _xr_render_surface_copy(reu->surface, re->output, 0, 0, + reu->x, reu->y, reu->w, reu->h); + tsurf = _xr_render_surface_new(re->xinf, reu->w, reu->h, re->xinf->fmt1, 1); + if (tsurf) + { + _xr_render_surface_copy(reu->surface, tsurf, 0, 0, + 0, 0, reu->w, reu->h); + _xr_render_surface_copy(tsurf, re->mask_output, 0, 0, + reu->x, reu->y, reu->w, reu->h); + _xr_render_surface_free(tsurf); + } + } + else + { + _xr_render_surface_copy(reu->surface, re->output, 0, 0, + reu->x, reu->y, reu->w, reu->h); + } + _xr_render_surface_free(reu->surface); + free(reu); + } XSync(re->disp, False); _xr_image_info_pool_flush(re->xinf, 0, 0); } @@ -621,10 +656,12 @@ evas_engine_xrender_x11_image_load(void *data, char *file, char *key, int *error) { Render_Engine *re; + XR_Image *im; re = (Render_Engine *)data; *error = 0; - return _xre_image_load(re->xinf, file, key); + im = _xre_image_load(re->xinf, file, key); + return im; } static void * @@ -690,6 +727,7 @@ image = _xre_image_copy((XR_Image *)old_image); if (image) { + ((XR_Image *)image)->alpha = old_image->alpha; _xre_image_free(old_image); } else @@ -708,21 +746,7 @@ re = (Render_Engine *)data; if (!image) return image; - if (((XR_Image *)image)->references > 1) - { - XR_Image *old_image; - - old_image = (XR_Image *)image; - image = _xre_image_copy((XR_Image *)old_image); - if (image) - { - _xre_image_free(old_image); - } - else - image = old_image; - } - else - _xre_image_dirty((XR_Image *)image); + _xre_image_dirty((XR_Image *)image); _xre_image_region_dirty((XR_Image *)image, x, y, w, h); return image; } @@ -744,6 +768,7 @@ image = _xre_image_copy((XR_Image *)old_image); if (image) { + ((XR_Image *)image)->alpha = old_image->alpha; _xre_image_free(old_image); } else @@ -769,20 +794,27 @@ old_image = (XR_Image *)image; image = _xre_image_data_find(image_data); - if (!image) + if (image != old_image) { - image = _xre_image_new_from_data(old_image->xinf, old_image->w, old_image->h, image_data); - if (image) + 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); + } } else { - _xre_image_free(old_image); + _xre_image_free(image); } } return image; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/engines/xrender_x11/evas_engine_image.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- evas_engine_image.c 8 Oct 2005 14:16:03 -0000 1.6 +++ evas_engine_image.c 9 Oct 2005 02:06:52 -0000 1.7 @@ -238,6 +238,7 @@ if (im->fkey) _xr_image_hash = evas_hash_del(_xr_image_hash, im->fkey, im); im->dirty = 1; + __xre_image_dirty_hash_add(im); } XR_Image * @@ -426,7 +427,12 @@ _xr_render_surface_free(im->surface); im->surface = NULL; } - _xre_image_dirty(im); + if (!im->dirty) + { + if (im->fkey) + _xr_image_hash = evas_hash_del(_xr_image_hash, im->fkey, im); + im->dirty = 1; + } if (im->updates) { evas_common_tilebuf_free(im->updates); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/engines/xrender_x11/evas_engine_ximage.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_engine_ximage.c 8 Oct 2005 14:59:45 -0000 1.2 +++ evas_engine_ximage.c 9 Oct 2005 02:06:52 -0000 1.3 @@ -88,8 +88,8 @@ XSync(xinf->disp, False); XSetErrorHandler((XErrorHandler)ph); if (!_x_err) xinf->can_do_shm = 1; + shmdt(shm_info.shmaddr); } - shmdt(shm_info.shmaddr); shmctl(shm_info.shmid, IPC_RMID, 0); } XDestroyImage(xim); @@ -177,8 +177,8 @@ XSync(xim->xinf->disp, False); XSetErrorHandler((XErrorHandler)ph); if (!_x_err) goto xim_ok; + shmdt(xim->shm_info->shmaddr); } - shmdt(xim->shm_info->shmaddr); shmctl(xim->shm_info->shmid, IPC_RMID, 0); } XDestroyImage(xim->xim); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/engines/xrender_x11/evas_engine_xrender.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- evas_engine_xrender.c 8 Oct 2005 14:59:45 -0000 1.7 +++ evas_engine_xrender.c 9 Oct 2005 02:06:52 -0000 1.8 @@ -1,4 +1,5 @@ #include "evas_common.h" +#include "evas_macros.h" #include "evas_private.h" #include "evas_engine.h" #include "evas_engine_api_xrender_x11.h" @@ -285,19 +286,37 @@ XRenderPictureAttributes att; Picture mask; int r, g, b, a, op; + int sf; if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return; - xf.matrix[0][0] = (0x10000 * sw) / w; + + sf = MAX(sw, sh); +#define BMAX 26 + if (sf <= 8 ) sf = 1 << (BMAX - 3); + else if (sf <= 16 ) sf = 1 << (BMAX - 4); + else if (sf <= 32 ) sf = 1 << (BMAX - 5); + else if (sf <= 64 ) sf = 1 << (BMAX - 6); + else if (sf <= 128 ) sf = 1 << (BMAX - 7); + else if (sf <= 256 ) sf = 1 << (BMAX - 8); + else if (sf <= 512 ) sf = 1 << (BMAX - 9); + else if (sf <= 1024 ) sf = 1 << (BMAX - 10); + else if (sf <= 2048 ) sf = 1 << (BMAX - 11); + else if (sf <= 4096 ) sf = 1 << (BMAX - 12); + else if (sf <= 8192 ) sf = 1 << (BMAX - 13); + else if (sf <= 16384) sf = 1 << (BMAX - 14); + else sf = 1 << (BMAX - 15); + + xf.matrix[0][0] = (sf * sw) / w; xf.matrix[0][1] = 0; xf.matrix[0][2] = 0; xf.matrix[1][0] = 0; - xf.matrix[1][1] = (0x10000 * sh) / h; + xf.matrix[1][1] = (sf * sh) / h; xf.matrix[1][2] = 0; xf.matrix[2][0] = 0; xf.matrix[2][1] = 0; - xf.matrix[2][2] = 0x10000; + xf.matrix[2][2] = sf; op = PictOpSrc; if (srs->alpha) op = PictOpOver; ------------------------------------------------------- This SF.Net email is sponsored by: Power Architecture Resource Center: Free content, downloads, discussions, and more. http://solutions.newsforge.com/ibmarch.tmpl _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs