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

Reply via email to