Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_x


Modified Files:
      Tag: SPLIT
        Ecore_X.h ecore_x.c 


Log Message:


added basic cursor support.
in theory this api supports full ARGB cursors but for now reduces them to 1
color regardless. later on making it use XCursor if you have it might be a
good idea.

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Attic/Ecore_X.h,v
retrieving revision 1.1.2.31
retrieving revision 1.1.2.32
diff -u -3 -r1.1.2.31 -r1.1.2.32
--- Ecore_X.h   4 Sep 2003 21:07:49 -0000       1.1.2.31
+++ Ecore_X.h   19 Sep 2003 01:47:28 -0000      1.1.2.32
@@ -11,6 +11,7 @@
 typedef Ecore_X_ID   Ecore_X_Atom;
 typedef Ecore_X_ID   Ecore_X_Colormap;
 typedef Ecore_X_ID   Ecore_X_Time;
+typedef Ecore_X_ID   Ecore_X_Cursor;
 typedef void         Ecore_X_Display;
 
 #ifdef __cplusplus
@@ -521,7 +522,12 @@
                                     void (*func) (void *data, Ecore_X_Reply *reply, 
void *reply_data),
                                     void *data);
        
-   
+   Ecore_X_Cursor
+     ecore_x_cursor_new(Ecore_X_Window win, int *pixels, int w, int h, int hot_x, int 
hot_y);
+   void
+     ecore_x_cursor_free(Ecore_X_Cursor c);
+   void
+     ecore_x_cursor_set(Ecore_X_Window win, Ecore_X_Cursor c);
 #ifdef __cplusplus
 }
 #endif
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Attic/ecore_x.c,v
retrieving revision 1.1.2.22
retrieving revision 1.1.2.23
diff -u -3 -r1.1.2.22 -r1.1.2.23
--- ecore_x.c   25 May 2003 09:43:39 -0000      1.1.2.22
+++ ecore_x.c   19 Sep 2003 01:47:29 -0000      1.1.2.23
@@ -634,6 +634,157 @@
    return reply;
 }
 
+Ecore_X_Cursor
+ecore_x_cursor_new(Ecore_X_Window win, int *pixels, int w, int h, int hot_x, int 
hot_y)
+{
+   XColor c1, c2;
+   Cursor c;
+   Pixmap pmap, mask;
+   GC gc;
+   XGCValues gcv;
+   XImage *xim;
+   unsigned int *pix;
+   int fr, fg, fb, br, bg, bb;
+   int brightest = 0;
+   int darkest = 255 * 3;
+   int x, y;
+   const int dither[2][2] =
+     { 
+         {0, 2},
+         {3, 1}
+     };
+
+   
+   pmap = XCreatePixmap(_ecore_x_disp, win, w, h, 1);
+   mask = XCreatePixmap(_ecore_x_disp, win, w, h, 1);
+   xim = XCreateImage(_ecore_x_disp, 
+                     DefaultVisual(_ecore_x_disp, 0), 
+                     1, ZPixmap, 0, NULL, w, h, 32, 0);
+   xim->data = malloc(xim->bytes_per_line * xim->height);
+   
+   fr = 0x00; fg = 0x00; fb = 0x00;
+   br = 0xff; bg = 0xff; bb = 0xff;
+   pix = pixels;
+   for (y = 0; y < h; y++)
+     {
+       for (x = 0; x < w; x++)
+         {
+            int r, g, b, a;
+            
+            a = (pix[0] >> 24) & 0xff;
+            r = (pix[0] >> 16) & 0xff;
+            g = (pix[0] >> 8 ) & 0xff;
+            b = (pix[0]      ) & 0xff;
+            if (a > 0)
+              {
+                 if ((r + g + b) > brightest)
+                   {
+                      brightest = r + g + b; 
+                      br = r;
+                      bg = g;
+                      bb = b;
+                   }
+                 if ((r + g + b) < darkest)
+                   {
+                      darkest = r + g + b; 
+                      fr = r;
+                      fg = g;
+                      fb = b;
+                   }
+              }
+            pix++;
+         }
+     }
+   
+   pix = pixels;
+   for (y = 0; y < h; y++)
+     {
+       for (x = 0; x < w; x++)
+         {
+            int v;
+            int r, g, b;
+            int d1, d2;
+            
+            r = (pix[0] >> 16) & 0xff;
+            g = (pix[0] >> 8 ) & 0xff;
+            b = (pix[0]      ) & 0xff;
+            d1 = 
+              ((r - fr) * (r - fr)) +
+              ((g - fg) * (g - fg)) +
+              ((b - fb) * (b - fb));
+            d2 = 
+              ((r - br) * (r - br)) +
+              ((g - bg) * (g - bg)) +
+              ((b - bb) * (b - bb));
+            v = (((d2 * 255) / (d1 + d2)) * 5) / 256;
+            if (v > dither[x & 0x1][y & 0x1]) v = 1;
+            else v = 0;
+            XPutPixel(xim, x, y, v);
+            pix++;
+         }
+     }
+   gc = XCreateGC(_ecore_x_disp, pmap, 0, &gcv);
+   XPutImage(_ecore_x_disp, pmap, gc, xim, 0, 0, 0, 0, w, h);   
+   XFreeGC(_ecore_x_disp, gc);
+
+   pix = pixels;
+   for (y = 0; y < h; y++)
+     {
+       for (x = 0; x < w; x++)
+         {
+            int v;
+            
+            v = (((pix[0] >> 24) & 0xff) * 5) / 256;
+            if (v > dither[x & 0x1][y & 0x1]) v = 1;
+            else v = 0;
+            XPutPixel(xim, x, y, v);
+            pix++;
+         }
+     }
+   gc = XCreateGC(_ecore_x_disp, mask, 0, &gcv);
+   XPutImage(_ecore_x_disp, mask, gc, xim, 0, 0, 0, 0, w, h);   
+   XFreeGC(_ecore_x_disp, gc);
+
+   free(xim->data);
+   xim->data = NULL;
+   XDestroyImage(xim);
+   
+   c1.pixel = 0;
+   c1.red   = fr << 8 | fr;
+   c1.green = fg << 8 | fg;
+   c1.blue  = fb << 8 | fb;
+   c1.flags = DoRed | DoGreen | DoBlue;
+   
+   c2.pixel = 0;
+   c2.red   = br << 8 | br;
+   c2.green = bg << 8 | bg;
+   c2.blue  = bb << 8 | bb;
+   c2.flags = DoRed | DoGreen | DoBlue;   
+   
+   c = XCreatePixmapCursor(_ecore_x_disp, 
+                          pmap, mask, 
+                          &c1, &c2, 
+                          hot_x, hot_y);   
+   XFreePixmap(_ecore_x_disp, pmap);
+   XFreePixmap(_ecore_x_disp, mask);
+   return c;
+}
+
+void
+ecore_x_cursor_free(Ecore_X_Cursor c)
+{
+   XFreeCursor(_ecore_x_disp, c);
+}
+
+void
+ecore_x_cursor_set(Ecore_X_Window win, Ecore_X_Cursor c)
+{
+   if (c == 0)
+     XUndefineCursor(_ecore_x_disp, win);
+   else
+     XDefineCursor(_ecore_x_disp, win, c);
+}
+
 /*****************************************************************************/
 /*****************************************************************************/
 /*****************************************************************************/




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to