]> gitweb.factorcode.org Git - factor.git/commitdiff
compression.lzw: fix for gif89a decoding - maximum code size is 12 bits.
authorJohn Benediktsson <mrjbq7@gmail.com>
Thu, 27 Jan 2011 05:06:43 +0000 (21:06 -0800)
committerJohn Benediktsson <mrjbq7@gmail.com>
Thu, 27 Jan 2011 05:06:43 +0000 (21:06 -0800)
basis/compression/lzw/lzw.factor

index f61a02c01b2e6b9c4ca3b21538e7df885ad55e92..248700b08ce09ef6f8e8ea7b8b41b0a95ed9c5e8 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors combinators io kernel math namespaces
-sequences vectors ;
+USING: accessors combinators io kernel math math.order
+namespaces sequences vectors ;
 QUALIFIED-WITH: bitstreams bs
 IN: compression.lzw
 
@@ -62,8 +62,13 @@ GENERIC: code-space-full? ( lzw -- ? )
 M: tiff-lzw code-space-full? size-and-limit 1 - = ;
 M: gif-lzw code-space-full? size-and-limit = ;
 
+GENERIC: increment-code-size ( lzw -- lzw )
+
+M: lzw increment-code-size [ 1 + ] change-code-size ;
+M: gif-lzw increment-code-size [ 1 + 12 min ] change-code-size ;
+
 : maybe-increment-code-size ( lzw -- lzw )
-    dup code-space-full? [ [ 1 + ] change-code-size ] when ;
+    dup code-space-full? [ increment-code-size ] when ;
 
 : add-to-table ( seq lzw -- )
     [ table>> push ]
@@ -108,7 +113,7 @@ DEFER: lzw-uncompress-char
             [ output>> push-all ] [ add-to-table ] 2bi
         ] [ code>old-code ] bi
     ] if ;
-    
+
 : lzw-uncompress-char ( lzw -- )
     [ >>code handle-uncompress-code lzw-uncompress-char ]
     lzw-process-next-code ;