X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=gdk.c;h=98981a8811cbcbe1dd728af887f6960295515cc8;hb=e3d84ac43698bb9b4555f5e648d7bb9fff117c8b;hp=e8e62611c0fb679b454755d590442e5e934b7011;hpb=43377c110266e5816faceb61dfd578ede3ded9a1;p=cascardo%2Fmovie.git diff --git a/gdk.c b/gdk.c index e8e6261..98981a8 100644 --- a/gdk.c +++ b/gdk.c @@ -23,9 +23,13 @@ struct ctx { + GtkWidget *draw; GdkPixbuf *picture; GArray *points; int i; + gboolean move; + GdkGC *gc; + PangoAttrList *list; }; #define FILENAME "/home/cascardo/fotos/debconf.jpg" @@ -35,8 +39,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 +52,48 @@ 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) + { + PangoLayout *layout; + int pw, ph; + layout = gtk_widget_create_pango_layout (ctx->draw, point.name); + pango_layout_set_attributes (layout, ctx->list); + pango_layout_get_pixel_size (layout, &pw, &ph); + gdk_draw_layout (widget->window, ctx->gc, (WIDTH - pw) / 2, + HEIGHT - ph - 20, layout); + g_object_unref (layout); + 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,14 +103,18 @@ main (int argc, char **argv) int bits_per_sample; int width, height; GtkWidget *window; - GtkWidget *draw; struct ctx ctx; + GdkColor Yellow; + GdkColor Black; + PangoAttribute *attr; gtk_init (&argc, &argv); if (argc < 2) filename = FILENAME; 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 +125,27 @@ 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); + Yellow.red = 0xFFFF; + Yellow.green = 0xFFFF; + Yellow.blue = 0; + Black.red = 0; + Black.green = 0; + Black.blue = 0; + ctx.gc = gdk_gc_new (ctx.draw->window); + gdk_gc_set_rgb_fg_color (ctx.gc, &Yellow); + gdk_gc_set_rgb_bg_color (ctx.gc, &Black); + ctx.list = pango_attr_list_new (); + attr = pango_attr_size_new (32 * PANGO_SCALE); + pango_attr_list_insert (ctx.list, attr); + attr = pango_attr_weight_new (PANGO_WEIGHT_SEMIBOLD); + pango_attr_list_insert (ctx.list, attr); + g_timeout_add (10, queue, &ctx); gtk_main (); gdk_pixbuf_unref (ctx.picture); return 0;