X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=movie.c;h=448341aa2d7a15d36eb37babb90a3119b5323589;hb=ff1e09b1b7086123fbaf7c9219d1784838b776ea;hp=42310e665d5575e9ffb9c37ebb528d814eb46eb3;hpb=6568397392b0f65e2c68b8b8a417e27cc952aac5;p=cascardo%2Fmovie.git diff --git a/movie.c b/movie.c index 42310e6..448341a 100644 --- a/movie.c +++ b/movie.c @@ -18,73 +18,166 @@ #define WIDTH 800 #define HEIGHT 600 +#define FPS (25) +#define FRAME_INTERVAL (1000/FPS) +#include + +#include +#include #include #include +#define SWAP(x, y) do { \ + x ^= y; y ^= x; x ^= y; \ + } while (0) + #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} -}; +GArray *points; +GPtrArray *names; -SDL_Rect * -GetNextPoint (void) +void +InsertLine (GArray *points, SDL_Rect *src, SDL_Rect *dst) { - static SDL_Rect rect = {0, 0, WIDTH, HEIGHT}; - static int cur = 0; - int dx, dy; - int next; - next = (cur + 1) % (sizeof (points) / sizeof (SDL_Rect)); - if (IS_CENTER (points[next].x, points[next].y, rect.x, rect.y)) + SDL_Rect rect; + int inc, err, thre, swap; + int x1, y1, x2, y2; + int x, y; + rect.w = WIDTH; + rect.h = HEIGHT; + 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)) { - cur = next; - next = (cur + 1) % (sizeof (points) / sizeof (SDL_Rect)); + 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++) + { + 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; + } } - 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 ▭ } void -ShowPoint (SDL_Surface *screen, SDL_Surface *image, SDL_Rect *rect) +ReadPoints (char *filename) { - SDL_BlitSurface (image, rect, screen, NULL); - SDL_UpdateRect (screen, 0, 0, 0, 0); + FILE *file; + char *buffer; + char *next; + size_t len; + ssize_t r; + int i = 0; + SDL_Rect last; + SDL_Rect rect; + file = fopen (filename, "r"); + points = g_array_new (FALSE, TRUE, sizeof (SDL_Rect)); + names = g_ptr_array_new (); + buffer = NULL; + len = 0; + rect.x = rect.y = rect.w = rect.h = 0; + 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); + if (i > 0) + InsertLine (points, &last, &rect); + while (isspace (*next)) next++; + g_ptr_array_add (names, strdup (next)); + last = rect; + i++; + } + fclose (file); } -Uint32 -ShowNext (Uint32 interval, void *data) +void +ShowPoint (SDL_Surface *screen, SDL_Surface *image, SDL_Rect center, double scale) { - SDL_UserEvent event; - event.type = SDL_USEREVENT; - event.code = 0; - SDL_PushEvent ((SDL_Event *) &event); - return 33; + center.x = (center.x * scale) - WIDTH/2; + center.y = (center.y * scale) - HEIGHT/2; + center.w = WIDTH; + center.h = HEIGHT; + SDL_BlitSurface (image, ¢er, screen, NULL); + SDL_UpdateRect (screen, 0, 0, 0, 0); } +#define SCALE 2.0 + int main (int argc, char **argv) { SDL_Surface *screen; SDL_Surface *image; + SDL_Surface *scaled_image; + SDL_Rect rect; SDL_Event event; + Uint32 last, now, deslast, start; + int i, des, desl; + 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)) + scaled_image = CairoScale (image, SCALE); + start = deslast = last = SDL_GetTicks (); + desl = des = i = 0; + while (1) { - if (event.type == SDL_KEYDOWN) - break; - else if (event.type == SDL_USEREVENT) - ShowPoint (screen, image, GetNextPoint ()); + if (SDL_PollEvent (&event)) + { + if (event.type == SDL_KEYDOWN) + break; + } + now = SDL_GetTicks (); + /* skip */ + while (now > last + FRAME_INTERVAL) + { + last += FRAME_INTERVAL; + i++; + } + last = now; + if (now > deslast + 1000) + { + printf ("%f %f %d\n", (double) des / (double) (now - start) * 1000, (double) (des - desl) / (double) (now - deslast) * 1000, i - des); + desl = des; + deslast = now; + } + if (i > points->len) + { + des -= i; + i = 0; + } + rect = g_array_index (points, SDL_Rect, i); + ShowPoint (screen, scaled_image, rect, SCALE); + SDL_Delay (FRAME_INTERVAL - (now - last)); + i++; + des++; } SDL_FreeSurface (image); SDL_Quit (); + g_array_free (points, TRUE); + for (i = 0; i < names->len; i++) + free (g_ptr_array_index (names, i)); + g_ptr_array_free (names, TRUE); return 0; }