If picture does no exist, warn and exit
[cascardo/movie.git] / gdk.c
diff --git a/gdk.c b/gdk.c
index e8e6261..d9ed4cd 100644 (file)
--- a/gdk.c
+++ b/gdk.c
  */
 
 
+#include <stdio.h>
+#include <stdlib.h>
 #include <gtk/gtk.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include "point.h"
 
 struct ctx
 {
+  GtkWidget *draw;
   GdkPixbuf *picture;
   GArray *points;
   int i;
+  gboolean move;
+  GdkGC *gc;
+  GdkGC *gc2;
+  PangoAttrList *list;
 };
 
-#define FILENAME "/home/cascardo/fotos/debconf.jpg"
 #define WIDTH 800
 #define HEIGHT 600
 
 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,39 +54,94 @@ 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_rectangle (widget->window, ctx->gc2, TRUE,
+                          (WIDTH - pw - 8) / 2, HEIGHT - ph - 20, pw + 8, 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
+
+void
+usage ()
+{
+  fprintf (stderr, "movie picture dotsfile\n");
+  exit (0);
+}
+
 int
 main (int argc, char **argv)
 {
   char *filename;
+  char *dotsfile;
   GdkColorspace colorspace;
   gboolean has_alpha;
   int bits_per_sample;
   int width, height;
   GtkWidget *window;
-  GtkWidget *draw;
   struct ctx ctx;
+  GdkColor Yellow;
+  GdkColor Black;
+  PangoAttribute *attr;
+  GError *error;
   gtk_init (&argc, &argv);
-  if (argc < 2)
-    filename = FILENAME;
+  if (argc < 3)
+    {
+      usage ();
+    }
   else
-    filename = argv[1];
-  ctx.points = ReadPoints ("pro-gnu");
-  ctx.picture = gdk_pixbuf_new_from_file (filename, NULL);
+    {
+      filename = argv[1];
+      dotsfile = argv[2];
+    }
+  ctx.points = ReadPoints (dotsfile);
+  ctx.points = drop_dup_frames (ctx.points, FPF);
+  rescale_points (ctx.points, get_scales (FPF));
+  error = NULL;
+  ctx.picture = gdk_pixbuf_new_from_file (filename, &error);
+  if (ctx.picture == NULL)
+    {
+      fprintf (stderr, "Could not open picture %s: %s\n", filename,
+               error->message);
+      g_error_free (error);
+      exit (1);
+    }
   ctx.i = ctx.points->len;
   colorspace = gdk_pixbuf_get_colorspace (ctx.picture);
   has_alpha = gdk_pixbuf_get_has_alpha (ctx.picture);
@@ -87,13 +151,28 @@ 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);
+  ctx.gc2 = gdk_gc_new (ctx.draw->window);
+  gdk_gc_set_rgb_fg_color (ctx.gc2, &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;