login

<     >

2018-01-24 19:44:55 (UTC-02:00)

Marcel Rodrigues <marcelgmr@gmail.com>

Reset LZW table as soon as it's filled up.

diff --git a/gifenc.c b/gifenc.c
index c156f4e..9a35203 100644
--- a/gifenc.c
+++ b/gifenc.c
@@ -49,6 +49,17 @@ new_node(uint16_t key, int degree)
     return node;
 }
 
+static Node *
+new_trie(int degree, int *nkeys)
+{
+    Node *root = new_node(0, degree);
+    /* Create nodes for single pixels. */
+    for (*nkeys = 0; *nkeys < degree; (*nkeys)++)
+        root->children[*nkeys] = new_node(*nkeys, degree);
+    *nkeys += 2; /* skip clear code and stop code */
+    return root;
+}
+
 static void
 del_trie(Node *root, int degree)
 {
@@ -175,12 +186,7 @@ put_image(ge_GIF *gif, uint16_t w, uint16_t h, uint16_t x, uint16_t y)
     write_num(gif->fd, w);
     write_num(gif->fd, h);
     write(gif->fd, (uint8_t []) {0x00, gif->depth}, 2);
-    root = new_node(0, degree);
-    /* Create nodes for single pixels. */
-    for (nkeys = 0; nkeys < degree; nkeys++)
-        root->children[nkeys] = new_node(nkeys, degree);
-    node = root;
-    nkeys += 2; /* skip clear code and stop code */
+    root = node = new_trie(degree, &nkeys);
     key_size = gif->depth + 1;
     put_key(gif, degree, key_size); /* clear code */
     for (i = y; i < y+h; i++) {
@@ -195,6 +201,11 @@ put_image(ge_GIF *gif, uint16_t w, uint16_t h, uint16_t x, uint16_t y)
                     if (nkeys == (1 << key_size))
                         key_size++;
                     node->children[pixel] = new_node(nkeys++, degree);
+                } else {
+                    put_key(gif, degree, key_size); /* clear code */
+                    del_trie(root, degree);
+                    root = node = new_trie(degree, &nkeys);
+                    key_size = gif->depth + 1;
                 }
                 node = root->children[pixel];
             }