summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/content.h1
-rw-r--r--desktop/browser.c7
-rw-r--r--render/html.c5
-rw-r--r--riscos/gif.c39
-rw-r--r--riscos/gif.h10
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