Do not use fullscreen in the development version.
[cascardo/movie.git] / movie.c
diff --git a/movie.c b/movie.c
index 42310e6..f279449 100644 (file)
--- a/movie.c
+++ b/movie.c
 #define WIDTH 800
 #define HEIGHT 600
 
+#include <stdio.h>
+#include <stdlib.h>
 #include <SDL.h>
 #include <SDL_image.h>
 
+#define SWAP(x, y) do { \
+       x ^= y; y ^= x; x ^= y; \
+       } while (0)
+
+#define ABS(x) ((x) < 0 ? -(x) : (x))
+
 #define IS_CENTER(cx, cy, x, y) \
        ((x + WIDTH/2 == cx) && (y + HEIGHT/2 == cy))
 
-SDL_Rect points[] = {
-  {400, 300, 800, 600},
-  {450, 350, 800, 600}
-};
+SDL_Rect *points;
+int psize;
+
+void
+ReadPoints (char *filename)
+{
+  FILE *file;
+  char *buffer;
+  char *next;
+  size_t len;
+  int i;
+  file = fopen (filename, "r");
+  fscanf (file, "%d\n", &psize);
+  points = malloc (sizeof (SDL_Rect) * psize);
+  if (points == NULL)
+    abort ();
+  buffer = NULL;
+  len = 0;
+  for (i = 0; i < psize; i++)
+  {
+    getline (&buffer, &len, file);
+    points[i].x = strtol (buffer, &next, 0);
+    points[i].y = strtol (next+1, NULL, 0);
+  }
+  fclose (file);
+}
 
 SDL_Rect *
 GetNextPoint (void)
 {
   static SDL_Rect rect = {0, 0, WIDTH, HEIGHT};
-  static int cur = 0;
-  int dx, dy;
+  static int cur = -1;
+  static int inc, err, thre, swap;
+  static int x1, y1, x2, y2;
+  static int x, y;
   int next;
-  next = (cur + 1) % (sizeof (points) / sizeof (SDL_Rect));
-  if (IS_CENTER (points[next].x, points[next].y, rect.x, rect.y))
+  next = (cur + 1) % psize;
+  if (IS_CENTER (points[next].x, points[next].y, rect.x, rect.y) || cur == -1)
   {
     cur = next;
-    next = (cur + 1) % (sizeof (points) / sizeof (SDL_Rect));
+    next = (cur + 1) % psize;
+    err = 0;
+    swap = 0;
+    x1 = points[cur].x;
+    y1 = points[cur].y;
+    x2 = points[next].x;
+    y2 = points[next].y;
+    inc = y2 - y1;
+    thre = x2 - x1;
+    if (ABS (inc) > ABS (thre))
+    {
+      SWAP (inc, thre);
+      SWAP (x1, y1);
+      SWAP (x2, y2);
+      swap = 1;
+    }
+    x = x1;
+    y = y1;
+  }
+  rect.x = (swap ? y : x) - WIDTH/2;
+  rect.y = (swap ? x : y) - HEIGHT/2;
+  (x2 < x1) ? x-- : x++;
+  err += ABS (inc);
+  if (err >= ABS (thre))
+  {
+    err -= ABS (thre);
+    y += (inc < 0) ? -1 : 1;
   }
-  dx = (points[next].x > points[cur].x) ? 1 : -1;
-  dy = (points[next].y > points[cur].y) ? 1 : -1;
-  rect.x = (rect.x + dx) % WIDTH;
-  rect.y = (rect.y + dy) % HEIGHT;
   return &rect;
 }
 
@@ -73,8 +127,9 @@ main (int argc, char **argv)
   SDL_Surface *screen;
   SDL_Surface *image;
   SDL_Event event;
+  ReadPoints ("pro-gnu");
   SDL_Init (SDL_INIT_VIDEO | SDL_INIT_TIMER);
-  screen = SDL_SetVideoMode (800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
+  screen = SDL_SetVideoMode (800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
   image = IMG_Load ("/home/cascardo/fotos/debconf.jpg");
   SDL_AddTimer (0, ShowNext, NULL);
   while (SDL_WaitEvent (&event))
@@ -86,5 +141,6 @@ main (int argc, char **argv)
   }
   SDL_FreeSurface (image);
   SDL_Quit ();
+  free (points);
   return 0;
 }