Enlightenment CVS committal

Author  : tilman
Project : misc
Module  : enthrall

Dir     : misc/enthrall/src


Modified Files:
        enthrall.c 


Log Message:
use the x damage extension to only take screenshots of areas that changed since 
the last grab

===================================================================
RCS file: /cvs/e/misc/enthrall/src/enthrall.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- enthrall.c  11 Oct 2006 19:02:19 -0000      1.9
+++ enthrall.c  12 Oct 2006 18:24:11 -0000      1.10
@@ -1,5 +1,5 @@
 /*
- * $Id: enthrall.c,v 1.9 2006/10/11 19:02:19 tilman Exp $
+ * $Id: enthrall.c,v 1.10 2006/10/12 18:24:11 tilman Exp $
  *
  * Copyright (C) 2004 Tilman Sauerbeck (tilman at code-monkey de)
  *
@@ -45,6 +45,13 @@
  */
 #define FILE_FMT "enthrall_dump%.5lu"
 
+#define IMG_FROM_RECT(r) \
+       imlib_create_image_from_drawable (0, \
+                                         (r).x, (r).y, (r).width, (r).height, \
+                                         true)
+#define MIN(a, b) (a) < (b) ? (a) : (b)
+#define MAX(a, b) (a) > (b) ? (a) : (b)
+
 typedef struct {
        Ecore_X_Display *disp;
 
@@ -62,6 +69,11 @@
                int w, h;
        } cursor;
 
+       Imlib_Image prev_img;
+       Ecore_X_Rectangle damage;
+       bool damage_valid;
+       char last_written[PATH_MAX];
+
        unsigned long frame_count;
 } Enthrall;
 
@@ -69,7 +81,7 @@
 on_timer (void *udata)
 {
        Enthrall *e = udata;
-       Imlib_Image im;
+       Imlib_Image tmp;
        Bool b;
        int ptr_x = 0, ptr_y = 0, unused1;
        unsigned int unused2;
@@ -84,10 +96,27 @@
        snprintf (buf, sizeof (buf), "%s/"FILE_FMT".jpeg",
                  e->output_dir, e->frame_count);
 
-       im = imlib_create_image_from_drawable (0, 0, 0,
-                                              e->window.w, e->window.h,
-                                              true);
-       imlib_context_set_image (im);
+       /* was there any change at all?
+        * if not, just link the last written frame to the current.
+        */
+       if (!e->damage_valid) {
+               symlink (e->last_written, buf);
+               goto out;
+       }
+
+       /* grab the damaged rectangle */
+       tmp = IMG_FROM_RECT (e->damage);
+
+       /* and blend it onto the previous shot */
+       imlib_blend_image_onto_image (tmp, true,
+                                     0, 0, e->damage.width, e->damage.height,
+                                     e->damage.x, e->damage.y,
+                                     e->damage.width, e->damage.height);
+
+       /* free the temporary grab */
+       imlib_context_set_image (tmp);
+       imlib_free_image ();
+       imlib_context_set_image (e->prev_img);
 
        /* if we have a cursor, find out where it's at */
        if (e->cursor.id) {
@@ -105,13 +134,51 @@
        imlib_image_set_format ("jpeg");
 
        imlib_save_image (buf);
-       imlib_free_image ();
+       strcpy (e->last_written, buf);
 
+       e->damage_valid = false;
+
+out:
        e->frame_count++;
 
        return 1; /* keep going */
 }
 
+static inline void
+combine_rects (Ecore_X_Rectangle *a, Ecore_X_Rectangle *b)
+{
+       int ax2 = a->x + a->width;
+       int ay2 = a->y + a->height;
+
+       int bx2 = b->x + b->width;
+       int by2 = b->y + b->height;
+
+       a->x = MIN (a->x, b->x);
+       a->y = MIN (a->y, b->y);
+
+       a->width = MAX (ax2, bx2) - a->x;
+       a->height = MAX (ay2, by2) - a->y;
+}
+
+static int
+on_damage (void *udata, int type, void *event)
+{
+       Enthrall *e = udata;
+       Ecore_X_Event_Damage *ev = event;
+
+       if (e->damage_valid)
+               combine_rects (&e->damage, &ev->area);
+       else {
+               e->damage.x = ev->area.x;
+               e->damage.y = ev->area.y;
+               e->damage.width = ev->area.width;
+               e->damage.height = ev->area.height;
+               e->damage_valid = true;
+       }
+
+       return 0;
+}
+
 static void
 show_usage ()
 {
@@ -237,6 +304,12 @@
        ecore_init ();
        ecore_x_init (NULL);
 
+       if (!ecore_x_damage_query ()) {
+               fprintf (stderr, "Error: X damage extension not available.\n");
+
+               return EXIT_FAILURE;
+       }
+
        start = ecore_time_get ();
 
        e.disp = ecore_x_display_get ();
@@ -251,10 +324,24 @@
        ecore_x_window_geometry_get (e.window.id, NULL, NULL,
                                     &e.window.w, &e.window.h);
 
+       ecore_x_damage_new (e.window.id,
+                               ECORE_X_DAMAGE_REPORT_RAW_RECTANGLES);
+
        init_imlib (&e);
 
        ecore_timer_add (1.0 / e.fps, on_timer, &e);
 
+       ecore_event_handler_add (ECORE_X_EVENT_DAMAGE_NOTIFY,
+                                on_damage, &e);
+
+       e.damage.x = e.damage.y = 0;
+       e.damage.width = e.window.w;
+       e.damage.height = e.window.h;
+       e.damage_valid = true;
+
+       e.prev_img = IMG_FROM_RECT (e.damage);
+       imlib_context_set_image (e.prev_img);
+
        ecore_main_loop_begin ();
 
        ecore_x_shutdown ();
@@ -264,6 +351,9 @@
                imlib_context_set_image (e.cursor.id);
                imlib_free_image ();
        }
+
+       imlib_context_set_image (e.prev_img);
+       imlib_free_image ();
 
        printf ("Wrote %lu frames in %f seconds.\n\n", e.frame_count,
                ecore_time_get () - start);



-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to