From c0f18cd43453fff2a174955f17cbe91808aa6118 Mon Sep 17 00:00:00 2001 From: Richard Wilson Date: Tue, 5 Oct 2004 22:38:02 +0000 Subject: [project @ 2004-10-05 22:38:02 by rjw] GIF opacity test is now applied to all GIFs. Background colour redraw is optimised out for opaque, repeating images. svn path=/import/netsurf/; revision=1305 --- image/gifread.c | 28 ++++++++++++++++++++++------ riscos/htmlredraw.c | 8 +++++++- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/image/gifread.c b/image/gifread.c index cc3050a16..5fbfe83d4 100644 --- a/image/gifread.c +++ b/image/gifread.c @@ -655,7 +655,10 @@ int gif_decode_frame(struct gif_animation *gif, unsigned int frame) { /* Ensure we have some data */ gif_data = gif->gif_data + gif->buffer_position; - if ((gif_end - gif_data) < 10) return GIF_INSUFFICIENT_FRAME_DATA; + if ((gif_end - gif_data) < 10) { + return_value = GIF_INSUFFICIENT_FRAME_DATA; + break; + } /* Decode the extensions */ @@ -667,7 +670,10 @@ int gif_decode_frame(struct gif_animation *gif, unsigned int frame) { /* Check we've enough data for the extension then header */ - if ((gif_end - gif_data) < (int)(extension_size + 13)) return GIF_INSUFFICIENT_FRAME_DATA; + if ((gif_end - gif_data) < (int)(extension_size + 13)) { + return_value = GIF_INSUFFICIENT_FRAME_DATA; + break; + } /* Graphic control extension - store the frame delay. */ @@ -685,14 +691,20 @@ int gif_decode_frame(struct gif_animation *gif, unsigned int frame) { */ while (gif_data[0] != 0x00) { gif_data += gif_data[0] + 1; - if ((gif_end - gif_data) < 10) return GIF_INSUFFICIENT_FRAME_DATA; + if ((gif_end - gif_data) < 10) { + return_value = GIF_INSUFFICIENT_FRAME_DATA; + break; + } } gif_data++; } /* Decode the header */ - if (gif_data[0] != 0x2c) return GIF_DATA_ERROR; + if (gif_data[0] != 0x2c) { + return_value = GIF_DATA_ERROR; + break; + } offset_x = gif_data[1] | (gif_data[2] << 8); offset_y = gif_data[3] | (gif_data[4] << 8); width = gif_data[5] | (gif_data[6] << 8); @@ -702,7 +714,8 @@ int gif_decode_frame(struct gif_animation *gif, unsigned int frame) { modified since initialisation. */ if ((offset_x + width > gif->width) || (offset_y + height > gif->height)) { - return GIF_DATA_ERROR; + return_value = GIF_DATA_ERROR; + break; } /* Decode the flags @@ -719,7 +732,10 @@ int gif_decode_frame(struct gif_animation *gif, unsigned int frame) { /* Set up the colour table */ if (flags & 0x80) { - if (gif_bytes < (int)(3 * colour_table_size)) return GIF_INSUFFICIENT_FRAME_DATA; + if (gif_bytes < (int)(3 * colour_table_size)) { + return_value = GIF_INSUFFICIENT_FRAME_DATA; + break; + } colour_table = gif->local_colour_table; if (!clear_image) { for (index = 0; index < colour_table_size; index++) { diff --git a/riscos/htmlredraw.c b/riscos/htmlredraw.c index 3ddd08e1d..20dfddae6 100644 --- a/riscos/htmlredraw.c +++ b/riscos/htmlredraw.c @@ -294,7 +294,13 @@ bool html_redraw_box(struct box *box, int py1 = y < y1 ? y : y1; /* background colour */ - if (box->style->background_color != TRANSPARENT) { + if ((box->style->background_color != TRANSPARENT) && + /* don't redraw background if there is an image covering it */ + ((box->style->background_repeat != CSS_BACKGROUND_REPEAT_REPEAT) || + (box->background->bitmap == NULL) || + (ro_gui_current_redraw_gui == NULL) || + (!ro_gui_current_redraw_gui->option.background_images) || + (!box->background->bitmap->opaque))) { if (ro_gui_redraw_box_depth > 2) { error = xcolourtrans_set_gcol( box->style->background_color << 8, -- cgit v1.2.3