Enlightenment CVS committal

Author  : ningerso
Project : misc
Module  : enthrall

Dir     : misc/enthrall/src


Modified Files:
        enthrall.c 


Log Message:
Provide alternate capture method for displays without damage extension.
Catch failure to capture image, close file and exit.
Remove stale comment from when enthrall saved to image files.

===================================================================
RCS file: /cvs/e/misc/enthrall/src/enthrall.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- enthrall.c  22 Oct 2006 19:12:21 -0000      1.13
+++ enthrall.c  15 Feb 2007 04:24:43 -0000      1.14
@@ -40,11 +40,6 @@
 
 #define VERSION "0.0.2"
 
-/* FIXME: should be configurable, but i'm too lazy to add the necessary
- * sanity checks :)
- */
-#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, \
@@ -52,7 +47,8 @@
 #define MIN(a, b) (a) < (b) ? (a) : (b)
 #define MAX(a, b) (a) > (b) ? (a) : (b)
 
-typedef struct {
+typedef struct Enthrall Enthrall;
+struct Enthrall {
        Ecore_X_Display *disp;
 
        struct {
@@ -75,40 +71,28 @@
        EnthrallTheora theora;
 
        uint8_t *y, *u, *v;
-} Enthrall;
+       int (*render)(Enthrall *e);
+};
 
 static int
-on_timer (void *udata)
+render_damage(Enthrall *e)
 {
-       Enthrall *e = udata;
        Imlib_Image tmp;
-       Bool b;
-       int ptr_x = 0, ptr_y = 0, unused1;
-       unsigned int unused2;
-       uint32_t *data;
-       Window dw, childw = None;
-
-       /* FIXME: check whether e->window.id still points to a
-        *        valid window. not sure whether this really should be
-        *        done every time we enter this function.
-        */
+       int result = 0;
 
        /* was there any change at all?
         * if not, just link the last written frame to the current.
         */
        if (!e->damage_valid) {
-               /* FIXME:
-                * According to this ticket
-                * https://trac.xiph.org/changeset/11119
-                * it seems we can just put in an empty packet to repeat
-                * the last frame.
-                */
-               enthrall_theora_encode_frame (&e->theora, false);
                goto out;
        }
 
        /* grab the damaged rectangle */
        tmp = IMG_FROM_RECT (e->damage);
+       if (!tmp) {
+               result = -1;
+               goto out;
+       }
 
        /* and blend it onto the previous shot */
        imlib_blend_image_onto_image (tmp, true, 0, 0,
@@ -121,6 +105,73 @@
        imlib_context_set_image (tmp);
        imlib_free_image ();
        imlib_context_set_image (e->prev_img);
+       e->damage_valid = false;
+
+out:
+       e->frame_count++;
+       return result;
+}
+
+static int
+render_nodamage(Enthrall *e)
+{
+       Imlib_Image tmp;
+       Ecore_X_Rectangle update;
+       int result = 0;
+
+       update.x = 0;
+       update.y = 0;
+       update.width = e->window.w;
+       update.height = e->window.h;
+
+       /* grab the current rectangle */
+       tmp = IMG_FROM_RECT (update);
+       if (!tmp) {
+               result = -1;
+               goto out;
+       }
+
+       /* and blend it onto the previous shot */
+       imlib_blend_image_onto_image (tmp, true, 0, 0,
+                                     update.width, update.height,
+                                     update.x + e->window.offset_x,
+                                     update.y + e->window.offset_y,
+                                     update.width, update.height);
+
+       /* free the temporary grab */
+       imlib_context_set_image (tmp);
+       imlib_free_image ();
+       imlib_context_set_image (e->prev_img);
+
+out:
+       e->frame_count++;
+       return result;
+}
+
+static int
+on_timer (void *udata)
+{
+       Bool b;
+       int result;
+       uint32_t *data;
+       bool final_frame;
+       int ptr_x = 0, ptr_y = 0, unused1;
+       unsigned int unused2;
+       Window dw, childw = None;
+       Enthrall *e = udata;
+
+       /* FIXME: check whether e->window.id still points to a
+        *        valid window. not sure whether this really should be
+        *        done every time we enter this function.
+        */
+       final_frame = false;
+
+       result = e->render(e);
+       if (result < 0) {
+               final_frame = true;
+               fprintf(stderr, "Failed to render frame... exiting.\n");
+               goto out;
+       }
 
        /* if we have a cursor, find out where it's at */
        if (e->cursor.id) {
@@ -139,12 +190,16 @@
        rgb2yuv420 (data, e->window.w16, e->window.h16, e->y, e->u, e->v);
        imlib_image_put_back_data (data);
 
-       enthrall_theora_encode_frame (&e->theora, false);
-
-       e->damage_valid = false;
-
 out:
-       e->frame_count++;
+       /* FIXME:
+        * According to this ticket
+        * https://trac.xiph.org/changeset/11119
+        * it seems we can just put in an empty packet to repeat
+        * the last frame.
+        */
+       enthrall_theora_encode_frame (&e->theora, final_frame);
+       if (result < 0)
+               exit(result);
 
        return 1; /* keep going */
 }
@@ -298,11 +353,17 @@
        ecore_init ();
        ecore_x_init (NULL);
 
-       if (!ecore_x_damage_query ()) {
-               fprintf (stderr, "Error: X damage extension not available.\n");
-
-               return EXIT_FAILURE;
+       /*
+        * Setup our render callback based on whether we support the damage
+        * extension on this display.
+        */
+       if (ecore_x_damage_query ()) {
+               e.render = render_damage;
+               ecore_x_damage_new (e.window.id,
+                                       ECORE_X_DAMAGE_REPORT_RAW_RECTANGLES);
        }
+       else
+               e.render = render_nodamage;
 
        start = ecore_time_get ();
 
@@ -315,11 +376,7 @@
                e.cursor.h = imlib_image_get_height ();
        }
 
-       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);
+       ecore_x_window_size_get (e.window.id, &e.window.w, &e.window.h);
 
        init_imlib (&e);
 



-------------------------------------------------------------------------
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