From 46dffb9660446f82a481ba28ddb02b04f12f6810 Mon Sep 17 00:00:00 2001 From: "p.kosyh" Date: Wed, 10 Mar 2010 05:30:54 +0000 Subject: [PATCH] gif fixes, going to pic mouse events --- src/sdl-instead/graphics.c | 130 +++++++++++++++++++++++++++++-------- src/sdl-instead/graphics.h | 3 + 2 files changed, 106 insertions(+), 27 deletions(-) diff --git a/src/sdl-instead/graphics.c b/src/sdl-instead/graphics.c index e9a0407..e762b25 100644 --- a/src/sdl-instead/graphics.c +++ b/src/sdl-instead/graphics.c @@ -226,24 +226,53 @@ int gfx_parse_color ( struct _anigif_t; +struct agspawn { + SDL_Rect clip; + img_t bg; + int x; + int y; +}; +#define AGSPAWN_BLOCK 8 struct _anigif_t { struct _anigif_t *next; struct _anigif_t *prev; int cur_frame; int nr_frames; int loop; - int x; - int y; int drawn; int active; int delay; - img_t bg; - SDL_Rect clip; + int spawn_nr; + struct agspawn *spawn; AG_Frame frames[0]; }; typedef struct _anigif_t *anigif_t; +static int anigif_spawn(anigif_t ag, int x, int y, int w, int h) +{ + int nr; + SDL_Rect clip; + SDL_GetClipRect(screen, &clip); + //gfx_free_image(ag->bg); + if (!ag->spawn && !(ag->spawn = malloc(AGSPAWN_BLOCK * sizeof(struct agspawn)))) + return -1; + nr = ag->spawn_nr + 1; + if (!(nr % AGSPAWN_BLOCK)) { /* grow */ + void *p = realloc(ag->spawn, AGSPAWN_BLOCK * sizeof(struct agspawn) * + ((nr / AGSPAWN_BLOCK) + 1)); + if (!p) + return -1; + ag->spawn = p; + } + ag->spawn[ag->spawn_nr].x = x; + ag->spawn[ag->spawn_nr].y = y; + ag->spawn[ag->spawn_nr].clip = clip; + ag->spawn[ag->spawn_nr].bg = gfx_grab_screen(x, y, w, h); + ag->spawn_nr = nr; + return 0; +} + static anigif_t anim_gifs = NULL; static int anigif_drawn_nr = 0; @@ -263,23 +292,23 @@ static void anigif_disposal(anigif_t g) { SDL_Rect dest; SDL_Rect clip; - + int i = 0; img_t *img = NULL; AG_Frame *frame; frame = &g->frames[g->cur_frame]; SDL_GetClipRect(screen, &clip); - dest.x = g->x; - dest.y = g->y; + dest.x = 0; //g->x; + dest.y = 0; //g->y; switch (frame->disposal) { case AG_DISPOSE_NA: case AG_DISPOSE_NONE: /* just show next frame */ break; case AG_DISPOSE_RESTORE_BACKGROUND: - img = g->bg; - dest.w = Surf(img)->w; - dest.h = Surf(img)->h; +// img = g->bg; +// dest.w = Surf(img)->w; +// dest.h = Surf(img)->h; break; case AG_DISPOSE_RESTORE_PREVIOUS: if (g->cur_frame) { @@ -291,29 +320,44 @@ static void anigif_disposal(anigif_t g) } break; } - SDL_SetClipRect(screen, &g->clip); - if (img) { /* draw bg */ - SDL_BlitSurface(Surf(img), NULL, screen, &dest); + for (i = 0; i < g->spawn_nr; i++) { + SDL_Rect dst; + SDL_SetClipRect(screen, &g->spawn[i].clip); + dst = dest; + + dst.x += g->spawn[i].x; + dst.y += g->spawn[i].y; + if (frame->disposal == AG_DISPOSE_RESTORE_BACKGROUND) { + img = g->spawn[i].bg; + dst.w = Surf(img)->w; + dst.h = Surf(img)->h; + } + if (img) { /* draw bg */ + SDL_BlitSurface(Surf(img), NULL, screen, &dst); + } } SDL_SetClipRect(screen, &clip); } static void anigif_frame(anigif_t g) { + int i; SDL_Rect dest; SDL_Rect clip; AG_Frame *frame; frame = &g->frames[g->cur_frame]; SDL_GetClipRect(screen, &clip); - - dest.x = g->x + frame->x; - dest.y = g->y + frame->y; + dest.w = frame->surface->w; dest.h = frame->surface->h; - SDL_SetClipRect(screen, &g->clip); - SDL_BlitSurface(frame->surface, NULL, screen, &dest); + for (i = 0; i < g->spawn_nr; i++) { + dest.x = g->spawn[i].x + frame->x; + dest.y = g->spawn[i].y + frame->y; + SDL_SetClipRect(screen, &g->spawn[i].clip); + SDL_BlitSurface(frame->surface, NULL, screen, &dest); + } g->delay = timer_counter; SDL_SetClipRect(screen, &clip); } @@ -359,11 +403,22 @@ static anigif_t anigif_del(anigif_t g) return g; } +static void anigif_free_spawn(anigif_t g) +{ + int i; + for (i = 0; i < g->spawn_nr; i++) + gfx_free_image(g->spawn[i].bg); + if (g->spawn) { + free(g->spawn); + g->spawn = NULL; + g->spawn_nr = 0; + } +} static void anigif_free(anigif_t g) { AG_FreeSurfaces(g->frames, g->nr_frames); - gfx_free_image(g->bg); + anigif_free_spawn(g); free(g); } @@ -708,17 +763,11 @@ void gfx_draw(img_t p, int x, int y) dest.h = pixbuf->h; ag = is_anigif(pixbuf); if (ag) { - SDL_Rect clip; - SDL_GetClipRect(screen, &clip); - ag->clip = clip; - ag->x = x; - ag->y = y; + anigif_spawn(ag, x, y, dest.w, dest.w); if (!ag->drawn) anigif_drawn_nr ++; ag->drawn = 1; ag->active = 1; - gfx_free_image(ag->bg); - ag->bg = gfx_grab_screen(x, y, dest.w, dest.h); anigif_frame(ag); return; } @@ -742,6 +791,7 @@ void gfx_dispose_gif(img_t p) if (ag->drawn) anigif_drawn_nr --; ag->drawn = 0; + anigif_free_spawn(ag); } } @@ -799,13 +849,17 @@ int gfx_is_drawn_gifs(void) void gfx_update_gif(img_t img) { + int i = 0; anigif_t ag; ag = is_anigif(img); if (!ag) return; if (!ag->drawn || !ag->active) return; - gfx_update(ag->x, ag->y, gfx_img_w(img), gfx_img_h(img)); + for (i = 0; i < ag->spawn_nr; i++) { + gfx_update(ag->spawn[i].x, ag->spawn[i].y, + gfx_img_w(img), gfx_img_h(img)); + } } void gfx_draw_wh(img_t p, int x, int y, int w, int h) @@ -1533,6 +1587,24 @@ void _txt_layout_free(layout_t lay) layout->lines = NULL; } +word_t txt_layout_words(layout_t lay, word_t v) +{ + struct word *w = (struct word*)v; + struct layout *layout = (struct layout *)lay; + struct line *line; + if (!layout) + return NULL; + if (!w) { + if (!(line = layout->lines)) + return NULL; + w = line->words; + } else { + line = w->line; + w = w->next; + } + for (; !w && line->next; line = line->next, w = line->words); + return w; +} void txt_layout_free(layout_t lay) { struct layout *layout = (struct layout *)lay; @@ -1918,6 +1990,8 @@ void xref_update(xref_t pxref, int x, int y, clear_fn clear, update_fn update) void txt_layout_draw_ex(layout_t lay, struct line *line, int x, int y, int off, int height, clear_fn clear) { + void *v; + img_t img; struct layout *layout = (struct layout*)lay; // struct line *line; struct word *word; @@ -1925,6 +1999,8 @@ void txt_layout_draw_ex(layout_t lay, struct line *line, int x, int y, int off, // gfx_clip(x, y, layout->w, layout->h); if (!lay) return; + for (v = NULL; (img = txt_layout_images(lay, &v)); ) + gfx_dispose_gif(img); if (!line) line = layout->lines; for (; line; line= line->next) { diff --git a/src/sdl-instead/graphics.h b/src/sdl-instead/graphics.h index 83c7f9b..54f2df5 100644 --- a/src/sdl-instead/graphics.h +++ b/src/sdl-instead/graphics.h @@ -11,6 +11,8 @@ typedef void* fnt_t; typedef void* layout_t; typedef void* textbox_t; typedef void* xref_t; +typedef void* word_t; + typedef struct { int r; int g; @@ -96,6 +98,7 @@ extern void txt_layout_active_color(layout_t lay, color_t link); extern void txt_layout_link_style(layout_t lay, int style); extern int txt_layout_add_img(layout_t lay, const char *name, img_t img); extern img_t txt_layout_images(layout_t lay, void **v); /* enumerator */ +extern word_t txt_layout_words(layout_t lay, word_t w); /* enumerator */ extern void txt_layout_size(layout_t lay, int *w, int *h); extern textbox_t txt_box(int w, int h); extern layout_t txt_box_layout(textbox_t tbox);