From 15537fb20d508181d2573b6e593c89870a37e4d9 Mon Sep 17 00:00:00 2001 From: James Bursa Date: Sun, 21 Mar 2004 12:50:10 +0000 Subject: [project @ 2004-03-21 12:50:10 by bursa] Animation support, not yet optimised. svn path=/import/netsurf/; revision=641 --- content/content.h | 1 + desktop/browser.c | 7 +++++++ render/html.c | 5 +++++ riscos/gif.c | 39 ++++++++++++++++++++++++++++++++------- riscos/gif.h | 10 ++++------ 5 files changed, 49 insertions(+), 13 deletions(-) diff --git a/content/content.h b/content/content.h index 5520453a8..48a5c1300 100644 --- a/content/content.h +++ b/content/content.h @@ -65,6 +65,7 @@ typedef enum { CONTENT_MSG_STATUS, /**< new status string */ CONTENT_MSG_REDIRECT, /**< replacement URL */ CONTENT_MSG_REFORMAT, /**< content_reformat done */ + CONTENT_MSG_REDRAW, /**< needs redraw (eg. new animation frame) */ #ifdef WITH_AUTH CONTENT_MSG_AUTH /**< authentication required */ #endif diff --git a/desktop/browser.c b/desktop/browser.c index 3d554bd0b..64edaf728 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -276,6 +276,10 @@ void browser_window_callback(content_msg msg, struct content *c, browser_window_update(bw, false); break; + case CONTENT_MSG_REDRAW: + gui_window_redraw_window(bw->window); + break; + #ifdef WITH_AUTH case CONTENT_MSG_AUTH: gui_401login_open(bw, c, error); @@ -474,6 +478,9 @@ void download_window_callback(content_msg msg, struct content *c, case CONTENT_MSG_REFORMAT: break; + case CONTENT_MSG_REDRAW: + break; + #ifdef WITH_AUTH case CONTENT_MSG_AUTH: break; diff --git a/render/html.c b/render/html.c index 5a6d4dd0c..4e095d408 100644 --- a/render/html.c +++ b/render/html.c @@ -641,6 +641,11 @@ void html_object_callback(content_msg msg, struct content *object, case CONTENT_MSG_REFORMAT: break; + case CONTENT_MSG_REDRAW: + /** \todo send up box coordinates */ + content_broadcast(c, CONTENT_MSG_REDRAW, 0); + break; + #ifdef WITH_AUTH case CONTENT_MSG_AUTH: c->data.html.object[i].content = 0; diff --git a/riscos/gif.c b/riscos/gif.c index e0043fdfc..ddd0856e0 100644 --- a/riscos/gif.c +++ b/riscos/gif.c @@ -22,6 +22,7 @@ #include "netsurf/utils/config.h" #include "netsurf/content/content.h" #include "netsurf/riscos/gif.h" +#include "netsurf/riscos/gui.h" #include "netsurf/riscos/options.h" #include "netsurf/riscos/tinct.h" #include "netsurf/utils/log.h" @@ -56,6 +57,9 @@ static bool nsgif_decompress_frame(struct content *c, anim *p_gif_animation, unsigned int cur_frame); +static void nsgif_animate(void *p); +static osspriteop_header *nsgif_get_sprite_address(struct content *c, + unsigned int frame); static void CompressSpriteLine( pixel *dest, const pixel *src, int n, int bpp ); static void CompressMaskLine( pixel *dest, const pixel *src, int n, int bpp ); @@ -224,6 +228,9 @@ int nsgif_convert(struct content *c, unsigned int iwidth, unsigned int iheight) } */ + if (c->data.gif.animate_gif) + schedule(frame_delays[0], nsgif_animate, c); + /* Exit as a success */ return 0; @@ -367,7 +374,7 @@ void nsgif_redraw(struct content *c, long x, long y, /* Hack - animate as if 4cs have passed every redraw */ - nsgif_animate(c, 4); +/* nsgif_animate(c, 4); */ /* Check if we need to expand the current frame to 32bpp */ @@ -412,13 +419,30 @@ void nsgif_destroy(struct content *c) { /** Performs any necessary animation. @param c The content to animate - @param advance_time The number of cs to move the animation forwards - @return 0 for no further scheduling as the animation has finished, or - >0 to indicate the number of cs until the next animation frame, or - <0 to indicate that an animation has occured. The absolute value - indicates the number of cs until the next animation frame. */ -int nsgif_animate(struct content *c, unsigned int advance_time) { +void nsgif_animate(void *p) +{ + struct content *c = p; + + /* at the moment just advance by one frame */ + c->data.gif.current_frame++; + if (c->data.gif.current_frame == c->data.gif.total_frames) { + if (!c->data.gif.loop_gif) { + c->data.gif.current_frame--; + c->data.gif.animate_gif = false; + return; + } else + c->data.gif.current_frame = 0; + } + + schedule(c->data.gif.frame_transitions[c->data.gif.current_frame], + nsgif_animate, c); + + content_broadcast(c, CONTENT_MSG_REDRAW, 0); +} + + +#if 0 unsigned int max_frame; unsigned int cur_frame; unsigned int old_frame; @@ -478,6 +502,7 @@ int nsgif_animate(struct content *c, unsigned int advance_time) { return (advance_time - delay_values[cur_frame]); } } +#endif diff --git a/riscos/gif.h b/riscos/gif.h index 4bdadfce6..c175cc868 100644 --- a/riscos/gif.h +++ b/riscos/gif.h @@ -19,7 +19,7 @@ struct content_gif_data { /* The sprite area containing the 8bpp frames. */ osspriteop_area *sprite_area; - + /* The sprite header of the current 32bpp image. */ osspriteop_header *buffer_header; @@ -27,7 +27,7 @@ struct content_gif_data { /** The current frame number of the GIF to display, [0...(max-1)] */ unsigned int current_frame; - + /** The current frame that we hold a 32bpp version of [0...(max-1)] */ unsigned int expanded_frame; @@ -39,7 +39,7 @@ struct content_gif_data { /** Whether the GIF should loop */ bool loop_gif; - + /** The number of cs unprocessed as the next transition has not yet occurred. */ @@ -52,18 +52,16 @@ struct content_gif_data { /** An array of times (in cs) for the frame transitions between each frame */ unsigned int *frame_transitions; - + }; void nsgif_init(void); void nsgif_create(struct content *c, const char *params[]); int nsgif_convert(struct content *c, unsigned int width, unsigned int height); void nsgif_destroy(struct content *c); -int nsgif_animate(struct content *c, unsigned int advance_time); void nsgif_redraw(struct content *c, long x, long y, unsigned long width, unsigned long height, long clip_x0, long clip_y0, long clip_x1, long clip_y1, float scale); -osspriteop_header *nsgif_get_sprite_address(struct content *c, unsigned int frame); #endif -- cgit v1.2.3