2017-11-15 10:17:13 (UTC-02:00)
Marcel Rodrigues <marcelgmr@gmail.com>
Accept clear code anywhere on the image data stream.
diff --git a/gifdec.c b/gifdec.c index 9ca8483..1662957 100644 --- a/gifdec.c +++ b/gifdec.c @@ -265,7 +265,7 @@ static int read_image_data(gd_GIF *gif, uint16_t x, uint16_t y, uint16_t w) { uint8_t sub_len, shift, byte; - int key_size; + int init_key_size, key_size; int frm_off, str_len, p; uint16_t key, clear, stop; int ret; @@ -276,14 +276,17 @@ read_image_data(gd_GIF *gif, uint16_t x, uint16_t y, uint16_t w) key_size = (int) byte; clear = 1 << key_size; stop = clear + 1; + init_key_size = key_size + 1; table = new_table(key_size); - key_size++; sub_len = shift = 0; key = get_key(gif, key_size, &sub_len, &shift, &byte); /* clear code */ frm_off = 0; ret = 0; while (1) { - if (key != clear) { + if (key == clear) { + key_size = init_key_size; + table->nentries = (1 << key_size) + 2; + } else { ret = add_entry(&table, str_len + 1, key, entry.suffix); if (ret == -1) { free(table); @@ -291,6 +294,7 @@ read_image_data(gd_GIF *gif, uint16_t x, uint16_t y, uint16_t w) } } key = get_key(gif, key_size, &sub_len, &shift, &byte); + if (key == clear) continue; if (key == stop) break; if (ret == 1) key_size++; entry = table->entries[key];