X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=gdk.c;h=d364a279d8a318876a804a8475447d502019c105;hb=24dfd5c23bd1cf944fc3bb9cc5b188a9a60f5801;hp=e8e62611c0fb679b454755d590442e5e934b7011;hpb=43377c110266e5816faceb61dfd578ede3ded9a1;p=cascardo%2Fmovie.git diff --git a/gdk.c b/gdk.c index e8e6261..d364a27 100644 --- a/gdk.c +++ b/gdk.c @@ -23,9 +23,11 @@ struct ctx { + GtkWidget *draw; GdkPixbuf *picture; GArray *points; int i; + gboolean move; }; #define FILENAME "/home/cascardo/fotos/debconf.jpg" @@ -35,8 +37,11 @@ struct ctx gboolean queue (gpointer data) { - gtk_widget_queue_draw (GTK_WIDGET (data)); - return TRUE; + struct ctx *ctx; + ctx = (struct ctx *) data; + gtk_widget_queue_draw (GTK_WIDGET (ctx->draw)); + ctx->move = TRUE; + return FALSE; } gboolean @@ -45,21 +50,40 @@ expose (GtkWidget *widget, GdkEventExpose *event, gpointer data) GdkPixbuf *screen; struct ctx *ctx; Point point; + int w, h; ctx = (struct ctx *) data; - ctx->i = (ctx->i >= ctx->points->len) ? 0 : ctx->i + 1; + gdk_drawable_get_size (GDK_DRAWABLE (event->window), &w, &h); + if (ctx->move) + ctx->i = (ctx->i >= ctx->points->len) ? 0 : ctx->i + 1; point = g_array_index (ctx->points, Point, ctx->i); screen = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, event->area.width, event->area.height); gdk_pixbuf_scale (ctx->picture, screen, 0, 0, event->area.width, event->area.height, - -point.x + event->area.width/2, -point.y + event->area.height/2, - 1.0, 1.0, GDK_INTERP_HYPER); - gdk_draw_pixbuf (widget->window, NULL, screen, 0, 0, 0, 0, -1, -1, + -point.x + w/2 - event->area.x, + -point.y + h/2 - event->area.y, + point.rx, point.ry, GDK_INTERP_BILINEAR); + gdk_draw_pixbuf (widget->window, NULL, screen, 0, 0, + event->area.x, event->area.y, + event->area.width, event->area.height, GDK_RGB_DITHER_NONE, 0, 0); gdk_pixbuf_unref (screen); + if (point.name) + { + if (ctx->move) + g_timeout_add (3000, queue, ctx); + } + else + { + if (ctx->move) + g_timeout_add (10, queue, ctx); + } + ctx->move = FALSE; return FALSE; } +#define FPF 40 + int main (int argc, char **argv) { @@ -69,7 +93,6 @@ main (int argc, char **argv) int bits_per_sample; int width, height; GtkWidget *window; - GtkWidget *draw; struct ctx ctx; gtk_init (&argc, &argv); if (argc < 2) @@ -77,6 +100,8 @@ main (int argc, char **argv) else filename = argv[1]; ctx.points = ReadPoints ("pro-gnu"); + ctx.points = drop_dup_frames (ctx.points, FPF); + rescale_points (ctx.points, get_scales (FPF)); ctx.picture = gdk_pixbuf_new_from_file (filename, NULL); ctx.i = ctx.points->len; colorspace = gdk_pixbuf_get_colorspace (ctx.picture); @@ -87,13 +112,13 @@ main (int argc, char **argv) window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); - draw = gtk_drawing_area_new (); - gtk_widget_set_size_request (draw, width, height); - gtk_container_add (GTK_CONTAINER (window), draw); + ctx.draw = gtk_drawing_area_new (); + gtk_widget_set_size_request (ctx.draw, width, height); + gtk_container_add (GTK_CONTAINER (window), ctx.draw); gtk_widget_show_all (window); - g_signal_connect (G_OBJECT (draw), "expose_event", + g_signal_connect (G_OBJECT (ctx.draw), "expose_event", G_CALLBACK (expose), &ctx); - g_timeout_add (10, queue, draw); + g_timeout_add (10, queue, &ctx); gtk_main (); gdk_pixbuf_unref (ctx.picture); return 0;