summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2021-11-02 14:20:05 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2021-11-02 14:21:49 +0000
commit496870618e9977cfcac4b0433bf17b6e8e4d2434 (patch)
treedb1bfa686b7158b116a84a30c9ce3f1bb7c422f7
parent8b30f0709564df422c549cccc1a7868588c30a67 (diff)
downloadlibnsgif-496870618e9977cfcac4b0433bf17b6e8e4d2434.tar.gz
libnsgif-496870618e9977cfcac4b0433bf17b6e8e4d2434.tar.bz2
GIF: Clear: Pass frame structure instead of index.
-rw-r--r--src/libnsgif.c41
1 files changed, 19 insertions, 22 deletions
diff --git a/src/libnsgif.c b/src/libnsgif.c
index a12e128..4739b18 100644
--- a/src/libnsgif.c
+++ b/src/libnsgif.c
@@ -834,13 +834,15 @@ gif__decode(gif_animation *gif,
}
/**
- * decode a gif frame
+ * Clear a gif frame.
*
- * \param gif gif animation context.
- * \param frame The frame number to decode.
+ * \param[in] gif The gif object we're decoding.
+ * \param[in] frame The frame to clear.
+ * \return GIF_OK on success, appropriate error otherwise.
*/
-static gif_result
-gif_clear_frame(gif_animation *gif, uint32_t frame)
+static gif_result gif_clear_frame(
+ struct gif_animation *gif,
+ struct gif_frame *frame)
{
uint8_t *gif_data, *gif_end;
int gif_bytes;
@@ -850,20 +852,15 @@ gif_clear_frame(gif_animation *gif, uint32_t frame)
uint32_t save_buffer_position;
uint32_t return_value = 0;
- assert(gif->frames[frame].disposal_method == GIF_FRAME_CLEAR);
+ assert(frame->disposal_method == GIF_FRAME_CLEAR);
/* Ensure this frame is supposed to be decoded */
- if (gif->frames[frame].display == false) {
+ if (frame->display == false) {
return GIF_OK;
}
- /* Ensure the frame is in range to decode */
- if (frame > gif->frame_count_partial) {
- return GIF_INSUFFICIENT_DATA;
- }
-
/* Get the start of our frame data and the end of the GIF data */
- gif_data = gif->gif_data + gif->frames[frame].frame_pointer;
+ gif_data = gif->gif_data + frame->frame_pointer;
gif_end = gif->gif_data + gif->buffer_size;
gif_bytes = (gif_end - gif_data);
@@ -872,27 +869,27 @@ gif_clear_frame(gif_animation *gif, uint32_t frame)
gif->buffer_position = gif_data - gif->gif_data;
/* Skip any extensions because they have already been processed */
- return_value = gif__parse_frame_extensions(gif, &gif->frames[frame], false);
+ return_value = gif__parse_frame_extensions(gif, frame, false);
if (return_value != GIF_OK) {
goto gif_decode_frame_exit;
}
- return_value = gif__parse_image_descriptor(gif, &gif->frames[frame], false);
+ return_value = gif__parse_image_descriptor(gif, frame, false);
if (return_value != GIF_OK) {
return return_value;
}
- return_value = gif__parse_colour_table(gif, &gif->frames[frame], true);
+ return_value = gif__parse_colour_table(gif, frame, true);
if (return_value != GIF_OK) {
return return_value;
}
gif_data = gif->gif_data + gif->buffer_position;
gif_bytes = (gif_end - gif_data);
- offset_x = gif->frames[frame].redraw_x;
- offset_y = gif->frames[frame].redraw_y;
- width = gif->frames[frame].redraw_width;
- height = gif->frames[frame].redraw_height;
+ offset_x = frame->redraw_x;
+ offset_y = frame->redraw_y;
+ width = frame->redraw_width;
+ height = frame->redraw_height;
colour_table = gif->colour_table;
@@ -919,7 +916,7 @@ gif_clear_frame(gif_animation *gif, uint32_t frame)
for (uint32_t y = 0; y < height; y++) {
uint32_t *frame_scanline;
frame_scanline = frame_data + offset_x + ((offset_y + y) * gif->width);
- if (gif->frames[frame].transparency) {
+ if (frame->transparency) {
memset(frame_scanline,
GIF_TRANSPARENT_COLOUR,
width * 4);
@@ -1063,7 +1060,7 @@ gif_internal_decode_frame(gif_animation *gif,
/* memset((char*)frame_data, colour_table[gif->background_index], gif->width * gif->height * sizeof(int)); */
} else if ((frame != 0) &&
(gif->frames[frame - 1].disposal_method == GIF_FRAME_CLEAR)) {
- return_value = gif_clear_frame(gif, frame - 1);
+ return_value = gif_clear_frame(gif, &gif->frames[frame - 1]);
if (return_value != GIF_OK) {
goto gif_decode_frame_exit;
}