Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/evas

Dir     : e17/libs/evas/src/modules/engines/xrender_x11


Modified Files:
        evas_engine.c evas_engine.h evas_engine_image.c 


Log Message:


colorspace work mostly. not complete.

===================================================================
RCS file: /cvs/e/e17/libs/evas/src/modules/engines/xrender_x11/evas_engine.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- evas_engine.c       17 Dec 2006 15:48:52 -0000      1.15
+++ evas_engine.c       29 Dec 2006 03:32:46 -0000      1.16
@@ -462,6 +462,130 @@
    _xre_gradient_draw(surface, context, gradient, x, y, w, h);
 }
 
+static int
+eng_image_alpha_get(void *data, void *image)
+{
+   if (!image) return 0;
+   return _xre_image_alpha_get((XR_Image *)image);
+}
+
+static int
+eng_image_colorspace_get(void *data, void *image)
+{
+   if (!image) return EVAS_COLORSPACE_ARGB8888;
+   return ((XR_Image *)image)->cs.space;
+}
+
+static void *
+eng_image_alpha_set(void *data, void *image, int has_alpha)
+{
+   XR_Image *im;
+   
+   im = (XR_Image *)image;
+   if (!im) return im;
+   if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im;
+   if (((im->alpha) && (has_alpha)) || ((!im->alpha) && (!has_alpha))) 
+     return im;
+   if (im->references > 1)
+     {
+       XR_Image *old_im;
+       
+       old_im = im;
+       im = _xre_image_copy(old_im);
+       if (im)
+         {
+            im->alpha = old_im->alpha;
+            _xre_image_free(old_im);
+         }
+       else
+         im = old_im;
+     }
+   else
+     _xre_image_dirty(im);
+   _xre_image_alpha_set(im, has_alpha);
+   return im;
+}
+
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+   if (!image) return image;
+   _xre_image_border_set((XR_Image *)image, l, r, t, b);
+   return image;
+}
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+   if (!image) return;
+   _xre_image_border_get((XR_Image *)image, l, r, t, b);
+}
+
+static const char *
+eng_image_comment_get(void *data, void *image, char *key)
+{
+   if (!image) return NULL;
+   return ((XR_Image *)image)->comment;
+}
+
+static char *
+eng_image_format_get(void *data, void *image)
+{
+   if (!image) return NULL;
+   return ((XR_Image *)image)->format;
+}
+
+static void
+eng_image_colorspace_set(void *data, void *image, int cspace)
+{
+   XR_Image *im;
+      
+   if (!image) return;
+   im = (XR_Image *)image;
+   if (im->cs.space == cspace) return;
+   switch (cspace)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (im->cs.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+            im->cs.data = NULL;
+            im->cs.no_free = 0;
+         }
+       if (im->im) evas_common_image_unref(im->im);
+       im->im = NULL;
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       if (im->im) evas_common_image_unref(im->im);
+       im->im = NULL;
+       if (im->cs.data)
+         {
+            if (!im->cs.no_free) free(im->cs.data);
+         }
+       im->cs.data = calloc(1, im->h * sizeof(unsigned char *) * 2);
+       im->cs.no_free = 0;
+       break;
+      default:
+       abort();
+       break;
+     }
+   im->cs.space = cspace;
+   _xre_image_dirty(im);
+   _xre_image_region_dirty(im, 0, 0, im->w, im->h);
+}
+
+static void
+eng_image_native_set(void *data, void *image, void *native)
+{
+}
+
+static void *
+eng_image_native_get(void *data, void *image)
+{
+   return NULL;
+}
+
 static void *
 eng_image_load(void *data, const char *file, const char *key, int *error, 
Evas_Image_Load_Opts *lo)
 {
@@ -514,29 +638,35 @@
 static void *
 eng_image_size_set(void *data, void *image, int w, int h)
 {
-   if (!image) return image;
+   XR_Image *im, *im_old;
+
+   if (!image) return NULL;
+   im_old = image;
+   if ((im_old) && (im_old->w == w) && (im_old->h == h))
+     return image;
    if ((w <= 0) || (h <= 0))
      {
        _xre_image_free((XR_Image *)image);
        return NULL;
      }
-   if (((XR_Image *)image)->references > 1)
+   if (im_old)
      {
-       XR_Image *old_image;
-
-       old_image = (XR_Image *)image;
-       image = _xre_image_copy((XR_Image *)old_image);
-       if (image)
+       if (im_old->references > 1)
          {
-            ((XR_Image *)image)->alpha = old_image->alpha;
-            _xre_image_free(old_image);
+            im = _xre_image_copy(im_old);
+            if (im)
+              {
+                 _xre_image_free(im_old);
+                 return im;
+              }
+            return image;
          }
-       else
-         image = old_image;
      }
    else
-     _xre_image_dirty((XR_Image *)image);
-   _xre_image_resize((XR_Image *)image, w, h);
+     {
+       _xre_image_dirty((XR_Image *)image);
+       _xre_image_resize((XR_Image *)image, w, h);
+     }
    return image;
 }
 
@@ -552,115 +682,113 @@
 static void *
 eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
 {
-   if (!image) return image;
-   if (to_write)
+   XR_Image *im;
+   
+   if (!image)
      {
-       if (((XR_Image *)image)->references > 1)
+       *image_data = NULL;
+       return NULL;
+     }
+   im = (XR_Image *)image;
+   if (im->im)
+     evas_common_load_image_data_from_file(im->im);
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       if (to_write)
          {
-            XR_Image *old_image;
-            
-            old_image = (XR_Image *)image;
-            image = _xre_image_copy((XR_Image *)old_image);
-            if (image)
+            if (im->references > 1)
               {
-                 ((XR_Image *)image)->alpha = old_image->alpha;
-                 _xre_image_free(old_image);
+                 XR_Image *im_old;
+                 
+                 im_old = im;
+                 im = _xre_image_copy(im_old);
+                 if (im)
+                   _xre_image_free(im_old);
+                 else
+                   im = im_old;
               }
             else
-              image = old_image;
+              _xre_image_dirty(im);
          }
-       else
-         _xre_image_dirty((XR_Image *)image);
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       break;
+      default:
+       abort();
+       break;
      }
-   if (image_data) *image_data = _xre_image_data_get((XR_Image *)image);
-   return image;
+   if (image_data) *image_data = _xre_image_data_get(im);
+   return im;
 }
 
 static void *
 eng_image_data_put(void *data, void *image, DATA32 *image_data)
 {
+   XR_Image *im;
+   
    if (!image) return image;
-   if (_xre_image_data_get((XR_Image *)image) != image_data)
+   im = (XR_Image *)image;
+   
+   switch (im->cs.space)
      {
-       XR_Image *old_image;
-
-       old_image = (XR_Image *)image;
-       image = _xre_image_data_find(image_data);
-       if (image != old_image)
+      case EVAS_COLORSPACE_ARGB8888:
+       if (_xre_image_data_get(im) != image_data)
          {
-            if (!image)
+            XR_Image *im_old;
+            
+            im_old = im;
+            image = _xre_image_data_find(image_data);
+            if (image != im_old)
               {
-                 image = _xre_image_new_from_data(old_image->xinf, 
old_image->w, old_image->h, image_data, old_image->alpha, 
EVAS_COLORSPACE_ARGB8888);
-                 if (image)
+                 if (!image)
                    {
-                      ((XR_Image *)image)->alpha = old_image->alpha;
-                      _xre_image_free(old_image);
+                      image = _xre_image_new_from_data(im_old->xinf, 
im_old->w, im_old->h, image_data, im_old->alpha, EVAS_COLORSPACE_ARGB8888);
+                      if (image)
+                        {
+                           ((XR_Image *)image)->alpha = im_old->alpha;
+                           _xre_image_free(im_old);
+                        }
+                      else
+                        image = im_old;
                    }
                  else
-                   image = old_image;
+                   {
+                      _xre_image_free(im_old);
+                   }
               }
             else
               {
-                 _xre_image_free(old_image);
+                 _xre_image_free(image);
+                 image = im_old;
               }
          }
-       else
-         {
-            _xre_image_free(image);
-         }
-     }
-   return image;
-}
-
-static void *
-eng_image_alpha_set(void *data, void *image, int has_alpha)
-{
-   if (!image) return image;
-   if (((((XR_Image *)image)->alpha) && (has_alpha)) ||
-       ((!((XR_Image *)image)->alpha) && (!has_alpha))) 
-     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)
-         {
-            ((XR_Image *)image)->alpha = old_image->alpha;
-            _xre_image_free(old_image);
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       if (_xre_image_data_get(im) != image_data)
+         {  
+            if (im->data)
+              {
+                 if (im->free_data) free(im->data);
+                 im->data = NULL;
+              }
+             if (im->cs.data)
+              {
+                 if (!im->cs.no_free) free(im->cs.data);
+              }
+            im->cs.data = image_data;
+            _xre_image_dirty(im);
          }
-       else
-         image = old_image;
+        break;
+      default:
+       abort();
+       break;
      }
-   else
-     _xre_image_dirty((XR_Image *)image);
-   _xre_image_alpha_set((XR_Image *)image, has_alpha);
    return image;
 }
 
-static int
-eng_image_alpha_get(void *data, void *image)
-{
-   if (!image) return 0;
-   return _xre_image_alpha_get((XR_Image *)image);
-}
-
-static void *
-eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
-{
-   if (!image) return image;
-   _xre_image_border_set((XR_Image *)image, l, r, t, b);
-   return image;
-}
-
-static void
-eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
-{
-   if (!image) return;
-   _xre_image_border_get((XR_Image *)image, l, r, t, b);
-}
-
 static void
 eng_image_draw(void *data, void *context, void *surface, void *image, int 
src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int 
dst_h, int smooth)
 {
@@ -673,42 +801,6 @@
                                  src_x, src_y, src_w, src_h,
                                  dst_x, dst_y, dst_w, dst_h,
                                  smooth);
-}
-
-static const char *
-eng_image_comment_get(void *data, void *image, char *key)
-{
-   if (!image) return NULL;
-   return ((XR_Image *)image)->comment;
-}
-
-static char *
-eng_image_format_get(void *data, void *image)
-{
-   if (!image) return NULL;
-   return ((XR_Image *)image)->format;
-}
-
-static void
-eng_image_colorspace_set(void *data, void *image, int cspace)
-{
-}
-
-static int
-eng_image_colorspace_get(void *data, void *image)
-{
-   return EVAS_COLORSPACE_ARGB8888;
-}
-
-static void
-eng_image_native_set(void *data, void *image, void *native)
-{
-}
-
-static void *
-eng_image_native_get(void *data, void *image)
-{
-   return NULL;
 }
 
 static void
===================================================================
RCS file: /cvs/e/e17/libs/evas/src/modules/engines/xrender_x11/evas_engine.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- evas_engine.h       17 Dec 2006 15:48:52 -0000      1.8
+++ evas_engine.h       29 Dec 2006 03:32:46 -0000      1.9
@@ -100,6 +100,11 @@
    const char      *comment;
    Tilebuf         *updates;
    RGBA_Image_Loadopts load_opts;
+   struct {
+      int           space;
+      void         *data;
+      unsigned char no_free : 1;
+   } cs;
    unsigned char    alpha : 1;
    unsigned char    dirty : 1;
    unsigned char    free_data : 1;
===================================================================
RCS file: 
/cvs/e/e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_image.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- evas_engine_image.c 17 Dec 2006 15:48:52 -0000      1.9
+++ evas_engine_image.c 29 Dec 2006 03:32:46 -0000      1.10
@@ -102,6 +102,7 @@
      }
    im->xinf = xinf;
    im->xinf->references++;
+   im->cs.space = EVAS_COLORSPACE_ARGB8888;
    im->fkey = strdup(buf);
    im->file = evas_stringshare_add(file);
    if (key) im->key = evas_stringshare_add(key);
@@ -125,11 +126,25 @@
    if (!im) return NULL;
    im->xinf = xinf;
    im->xinf->references++;
+   im->cs.space = cspace;
    im->w = w;
    im->h = h;
    im->references = 1;
-   im->data = data;
-   im->alpha = alpha;
+   switch (im->cs.space)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+       im->data = data;
+       im->alpha = alpha;
+       break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+       im->cs.data = data;
+       im->cs.no_free = 1;
+       break;
+      default:
+       abort();
+       break;
+     }
    im->dirty = 1;
    __xre_image_dirty_hash_add(im);
    return im;
@@ -142,27 +157,43 @@
 
    im = calloc(1, sizeof(XR_Image));
    if (!im) return NULL;
-   im->data = malloc(w * h * 4);
-   if (!im->data)
+   im->cs.space = cspace;
+   switch (im->cs.space)
      {
-       free(im);
-       return NULL;
-     }
-   if (data)
-     {
-       Gfx_Func_Copy func;
-       
-       func = evas_common_draw_func_copy_get(w * h, 0);
-       if (func) func(data, im->data, w * h);
-       evas_common_cpu_end_opt();
+      case EVAS_COLORSPACE_ARGB8888:
+       im->data = malloc(w * h * 4);
+       if (!im->data)
+         {
+            free(im);
+            return NULL;
+         }
+       if (data)
+         {
+            Gfx_Func_Copy 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 = alpha;
+       im->free_data = 1;
+        break;
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        im->cs.no_free = 0;
+        im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2);
+       if ((data) && (im->cs.data))
+         memcpy(im->cs.data, data, h * sizeof(unsigned char *) * 2);
+       break;
+      default:
+       abort();
+       break;
      }
    im->w = w;
    im->h = h;
    im->references = 1;
    im->xinf = xinf;
    im->xinf->references++;
-   im->free_data = 1;
-   im->alpha = alpha;
    im->dirty = 1;
    __xre_image_dirty_hash_add(im);
    return im;
@@ -184,6 +215,7 @@
    im->w = w;
    im->h = h;
    im->references = 1;
+   im->cs.space = EVAS_COLORSPACE_ARGB8888;
    im->xinf = xinf;
    im->xinf->references++;
    im->free_data = 1;
@@ -196,6 +228,10 @@
 static void
 __xre_image_real_free(XR_Image *im)
 {
+   if (im->cs.data)
+     {
+       if (!im->cs.no_free) free(im->cs.data);
+     }
    if (im->file) evas_stringshare_del(im->file);
    if (im->key) evas_stringshare_del(im->key);
    if (im->fkey) free(im->fkey);
@@ -257,6 +293,7 @@
    XR_Image *im2;
    void *data = NULL;
 
+   /* FIXME: colorspace support */
    if (im->data) data = im->data;
    else
      {
@@ -281,6 +318,7 @@
 void
 _xre_image_resize(XR_Image *im, int w, int h)
 {
+   /* FIXME: colorspace support */
    /* FIXME: ... */
    if ((w == im->w) && (h == im->h)) return;
    if (im->surface)
@@ -389,6 +427,7 @@
 {
    void *data = NULL;
    
+   /* FIXME: colorspace support */
    if (im->data) data = im->data;
    else
      {
@@ -420,6 +459,7 @@
 {
    void *imdata = NULL;
 
+   /* FIXME: colorspace support */
    if (!data) return;
    if (im->data)
      {
@@ -462,6 +502,7 @@
 void
 _xre_image_alpha_set(XR_Image *im, int alpha)
 {
+   /* FIXME: colorspace support */
    if (im->alpha == alpha) return;
    im->alpha = alpha;
    if (im->surface)
@@ -488,6 +529,10 @@
 int
 _xre_image_alpha_get(XR_Image *im)
 {
+   if (im->im)
+     {
+       if (im->im->cs.space != EVAS_COLORSPACE_ARGB8888) return 0;
+     }
    return im->alpha;
 }
 
@@ -519,6 +564,7 @@
 {
    void *data = NULL;
 
+   /* FIXME: colorspace support */
    if ((im->surface) && (!im->updates)) return;
    if (im->data) data = im->data;
    else



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to