X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=movie.c;h=08531feac06f387cbbead9e31f6f76f03b34dbc7;hb=dacb100ef24f4c8ad4de8de0d7368c0d9e32cabb;hp=42310e665d5575e9ffb9c37ebb528d814eb46eb3;hpb=6568397392b0f65e2c68b8b8a417e27cc952aac5;p=cascardo%2Fmovie.git diff --git a/movie.c b/movie.c index 42310e6..08531fe 100644 --- a/movie.c +++ b/movie.c @@ -16,75 +16,162 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define WIDTH 800 -#define HEIGHT 600 +#define _GNU_SOURCE +#include +#include +#include +#include +#include -#include -#include +#include "point.h" -#define IS_CENTER(cx, cy, x, y) \ - ((x + WIDTH/2 == cx) && (y + HEIGHT/2 == cy)) +#define SWAP(x, y) do { \ + x ^= y; y ^= x; x ^= y; \ + } while (0) -SDL_Rect points[] = { - {400, 300, 800, 600}, - {450, 350, 800, 600} -}; +void +InsertLine (GArray *points, Point *src, Point *dst) +{ + 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++) + { + 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_Rect * -GetNextPoint (void) +GArray * +ReadPoints (char *filename) { - 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)) + 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"); + 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)) { - cur = next; - next = (cur + 1) % (sizeof (points) / sizeof (SDL_Rect)); + 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++; } - 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 ▭ + fclose (file); + return points; } -void -ShowPoint (SDL_Surface *screen, SDL_Surface *image, SDL_Rect *rect) +GArray * +drop_dup_frames (GArray *points, int n) { - SDL_BlitSurface (image, rect, screen, NULL); - SDL_UpdateRect (screen, 0, 0, 0, 0); + 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; } -Uint32 -ShowNext (Uint32 interval, void *data) +GArray * +get_scales (int n) { - SDL_UserEvent event; - event.type = SDL_USEREVENT; - event.code = 0; - SDL_PushEvent ((SDL_Event *) &event); - return 33; + 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; } -int -main (int argc, char **argv) +void +rescale_points (GArray *points, GArray *scales) { - SDL_Surface *screen; - SDL_Surface *image; - 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_AddTimer (0, ShowNext, NULL); - while (SDL_WaitEvent (&event)) - { - if (event.type == SDL_KEYDOWN) - break; - else if (event.type == SDL_USEREVENT) - ShowPoint (screen, image, GetNextPoint ()); - } - SDL_FreeSurface (image); - SDL_Quit (); - return 0; + 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; + } }