If picture does no exist, warn and exit
[cascardo/movie.git] / movie.c
diff --git a/movie.c b/movie.c
index 8bba5ac..ec850ad 100644 (file)
--- a/movie.c
+++ b/movie.c
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#define _GNU_SOURCE
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <math.h>
 
-#include <SDL.h>
-#include <SDL_image.h>
+#include "point.h"
 
-int
-main (int argc, char **argv)
+#define SWAP(x, y) do { \
+       x ^= y; y ^= x; x ^= y; \
+       } while (0)
+
+void
+InsertLine (GArray *points, Point *src, Point *dst)
 {
-  SDL_Surface *image;
-  SDL_Surface *screen;
-  SDL_Event event;
-  SDL_Init (SDL_INIT_VIDEO | SDL_INIT_TIMER);
-  screen = SDL_SetVideoMode (800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
-  image = IMG_Load ("/home/cascardo/fotos/debconf.jpg");
-  SDL_BlitSurface (image, NULL, screen, NULL);
-  SDL_UpdateRect (screen, 0, 0, 0, 0);
-  while (SDL_WaitEvent (&event))
+  Point rect;
+  int inc, err, thre, swap;
+  int x1, y1, x2, y2;
+  int x, y;
+  rect.name = NULL;
+  err = 0;
+  swap = 0;
+  x1 = src->x;
+  y1 = src->y;
+  x2 = dst->x;
+  y2 = dst->y;
+  inc = y2 - y1;
+  thre = x2 - x1;
+  if (ABS (inc) > ABS (thre))
+  {
+    SWAP (inc, thre);
+    SWAP (x1, y1);
+    SWAP (x2, y2);
+    swap = 1;
+  }
+  for (y = y1, x = x1; (x2 < x1) ? (x >= x2) : (x <= x2); (x2 < x1) ? x-- : x++)
   {
-    if (event.type == SDL_KEYDOWN)
-      break;
+    rect.x = (swap ? y : x);
+    rect.y = (swap ? x : y);
+    g_array_append_val (points, rect);
+    err += ABS (inc);
+    if (err >= ABS (thre))
+    {
+      err -= ABS (thre);
+      y += (inc < 0) ? -1 : 1;
+    }
   }
-  SDL_FreeSurface (image);
-  SDL_Quit ();
-  return 0;
+}
+
+GArray *
+ReadPoints (char *filename)
+{
+  GArray *points;
+  FILE *file;
+  char *buffer;
+  char *next;
+  size_t len;
+  ssize_t r;
+  int i = 0;
+  Point last;
+  Point rect;
+  file = fopen (filename, "r");
+  if (file == NULL)
+    {
+      fprintf (stderr, "Could not open file %s\n", filename);
+      exit (1);
+    }
+  points = g_array_new (FALSE, TRUE, sizeof (Point));
+  buffer = NULL;
+  len = 0;
+  rect.x = rect.y = 0;
+  rect.name = NULL;
+  last = rect;
+  while (!feof (file))
+  {
+    r = getline (&buffer, &len, file);
+    buffer[r - 1] = '\0';
+    rect.x = strtol (buffer, &next, 0);
+    rect.y = strtol (next+1, &next, 0);
+    strtol (next, &next, 0);
+    while (isspace (*next)) next++;
+    rect.name = g_strdup (next);
+    if (i > 0)
+      InsertLine (points, &last, &rect);
+    g_array_append_val (points, rect);
+    last = rect;
+    i++;
+  }
+  fclose (file);
+  return points;
+}
+
+GArray *
+drop_dup_frames (GArray *points, int n)
+{
+  GArray *frames;
+  Point *point;
+  Point *next;
+  int i;
+  int j;
+  int inc;
+  int thre;
+  int err;
+  inc = n;
+  frames = g_array_new (FALSE, TRUE, sizeof (Point));
+  for (i = 0; i < points->len;)
+    {
+      j = i + 1;
+      point = next = &(g_array_index (points, Point, j));
+      while (next->name == NULL && j < points->len)
+        {
+         j++;
+          next = &(g_array_index (points, Point, j));
+       }
+      thre = j - i;
+      err = 0;
+      g_array_append_val (frames, g_array_index (points, Point, i));
+      for (; i < j; i++)
+        {
+         err += inc;
+         while (err > thre)
+           {
+             err -= thre;
+              g_array_append_val (frames, g_array_index (points, Point, i));
+           }
+       }
+    }
+  return frames;
+}
+
+GArray *
+get_scales (int n)
+{
+  GArray *scales;
+  double scale;
+  double factor;
+  scales = g_array_new (FALSE, TRUE, sizeof (double));
+  factor = pow (4.0, 1.0/((double) n/2));
+  factor = 1.0/factor;
+  for (scale = 4.00; scale > 1.0 && scales->len < n/2; scale *= factor)
+    scales = g_array_append_val (scales, scale);
+  factor = 1.0/factor;
+  for (scale = 1.0; scale < 4.0 && scales->len < n; scale *= factor)
+    scales = g_array_append_val (scales, scale);
+  return scales;
+}
+
+void
+rescale_points (GArray *points, GArray *scales)
+{
+  Point *point;
+  double scale;
+  int i;
+  for (i = 0; i < points->len; i++)
+    {
+      point = &(g_array_index (points, Point, i));
+      scale = g_array_index (scales, double, (i % scales->len));
+      point->rx = scale;
+      point->ry = scale;
+      point->x *= point->rx;
+      point->y *= point->ry;
+    }
 }