From 8b5871e9d8abdbcdbad4db3892dec09e53213ca0 Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Wed, 23 Sep 2009 12:06:25 -0400
Subject: [PATCH 01/18] images.gif: fixed image-descriptor parse bug

---
 extra/images/gif/gif.factor | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/extra/images/gif/gif.factor b/extra/images/gif/gif.factor
index 9e1bc347b2..cbe7fa5f3a 100644
--- a/extra/images/gif/gif.factor
+++ b/extra/images/gif/gif.factor
@@ -42,7 +42,7 @@ packed delay-time color-index
 block-terminator ;
 
 TUPLE: image-descriptor
-separator left top width height flags ;
+left top width height flags lzw-min-code-size ;
 
 TUPLE: plain-text-extension
 introducer label block-size text-grid-left text-grid-top text-grid-width
@@ -92,12 +92,12 @@ M: input-port stream-peek1
 
 : read-image-descriptor ( -- image-descriptor )
     \ image-descriptor new
-        1 read le> >>separator
         2 read le> >>left
         2 read le> >>top
         2 read le> >>width
         2 read le> >>height
-        1 read le> >>flags ;
+        1 read le> >>flags
+        1 read le> >>lzw-min-code-size ;
 
 : read-graphic-control-extension ( -- graphic-control-extension )
     \ graphics-control-extension new

From 3cbf48cae7305054163fc3174a279d43820223fb Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Wed, 23 Sep 2009 12:06:49 -0400
Subject: [PATCH 02/18] images.gif: added unit tests

---
 extra/images/gif/gif-tests.factor             |  29 ++++++++++++++++++
 extra/images/testing/check-256-colors.gif     | Bin 0 -> 1227 bytes
 extra/images/testing/monochrome.gif           | Bin 0 -> 45 bytes
 .../images/testing/symbol-word-16-colors.gif  | Bin 0 -> 142 bytes
 4 files changed, 29 insertions(+)
 create mode 100644 extra/images/gif/gif-tests.factor
 create mode 100644 extra/images/testing/check-256-colors.gif
 create mode 100644 extra/images/testing/monochrome.gif
 create mode 100644 extra/images/testing/symbol-word-16-colors.gif

diff --git a/extra/images/gif/gif-tests.factor b/extra/images/gif/gif-tests.factor
new file mode 100644
index 0000000000..1c4a80107e
--- /dev/null
+++ b/extra/images/gif/gif-tests.factor
@@ -0,0 +1,29 @@
+! Copyright (C) 2009 Keith Lazuka.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors images.gif io io.encodings.binary io.files
+math namespaces sequences tools.test math.bitwise ;
+IN: images.gif.tests
+
+: path>gif ( path -- loading-gif )
+    binary [ input-stream get load-gif ] with-file-reader ;
+
+: gif-example1 ( -- loading-gif )
+    "resource:extra/images/testing/symbol-word-16-colors.gif" path>gif ;
+
+: gif-example2 ( -- loading-gif )
+    "resource:extra/images/testing/check-256-colors.gif" path>gif ;
+
+: gif-example3 ( -- loading-gif )
+    "resource:extra/images/testing/monochrome.gif" path>gif ;
+
+: declared-num-colors ( gif -- n ) flags>> 3 bits 1 + 2^ ;
+: actual-num-colors ( gif -- n ) global-color-table>> length 3 /i ;
+
+[ 16 ] [ gif-example1 actual-num-colors ] unit-test
+[ 16 ] [ gif-example1 declared-num-colors ] unit-test
+
+[ 256 ] [ gif-example2 actual-num-colors ] unit-test
+[ 256 ] [ gif-example2 declared-num-colors ] unit-test
+
+[ 2 ] [ gif-example3 actual-num-colors ] unit-test
+[ 2 ] [ gif-example3 declared-num-colors ] unit-test
diff --git a/extra/images/testing/check-256-colors.gif b/extra/images/testing/check-256-colors.gif
new file mode 100644
index 0000000000000000000000000000000000000000..df83efaf55df781953fb2cce13186bb95c2ddfd4
GIT binary patch
literal 1227
zcmZ?wbhEHblw*)(_|Cu}nI<WfEhSSdBUde_kSniHD6g2MsFkj+k)^Jmt*c(9s#&9M
zn4x2qYiyloZc=AxS!8ZoZ0T5J<5lMBTk7Fa>FQVI6<FyNQ6H?(q@diXtU5(iZMK^B
z9Br+oT3V~LbT;eg?bfqcU}3z;*kHeb{can>Lx#qujjhjGJ1n<%pY9&q7!cbS9^V?}
zxXsabi*IsQd`f3RR&Q$2+`O`>#TC;^>ZVr~EKPSl=j?sf+v$Rn_eJlJD<QGhViQg$
zq+Lr(y^)%8E2r>ae(9mo!rO%n$7?38>YKKD(uA!&bGOW1vTeb#-AmT(UA=kl`Yro5
z^c-q#xZlwFpta{w&$K7gW<Q<1=KAt&M>g*~vUT6_UAs?h+k0x)raSAl-rltP;<hDE
z7B7CWc;(X-YhJG2_-Os+CmXlD+_vx0p1p7P9=pE(z~g;KP8~dS@xaL|$Io6pb>jZf
z^Y>3(xO(>To%7djUcPzv+L6bHj=ns6`r+}jPfne9f8xTUv)3P9x%u?k{fBoSJ-z?n
z)x9Ur9zA{e_~o1DZ{EFn`{DJ6Pw&2b{rvsM_a8sL|NHmv%$YL`qk#4yp!k!8k%6Iu
zK?h_NC{HkO{9_R0l=0ZGz_F>F=jO?v7Yh!zx3k>c+1PU7a5wA!E1Zj!I$e7tel9RH
zPHCL#tf2o*($bZM$y6g)%4UlYuc(X^-<nR%;s*=uQ%?k3OiXfaGPM=tb5fpiyi-^v
z?$eu0j`K70ZRgGVA&}6ya0%1b9!_VLqrt**OgDbqn0#THK|slzrwR-VtPY<1b2*(;
zkKg2B<Vnc*RGPMMWe49$Mq#!S!2--o78XJ$7A~~Q)e;st(z+(*1cTO`5)BXj=}NH`
za+{c+b;n;2x@55=v)yloxbZ(8o-I$gCkii6Pbieo;G1im($rJY@N~74esEC>gU-U8
zj!p&JCMYT&%@34pR9YGK^V8#&HU`0U3Su44J-hhi9WwrIaOhrW6|&^P3kC+J$zPcT
zFR}2j@qB3HR2L~_P7nDrL5#_LgXwKKHxmU0c8<0HC+Reghfc938Eis|kro9DIW?X<
zI4W*8r@T?Va-*RmgY<$E&U~^g7Z{`yRMptI*>W5Xaq??j4CwDT;;6trK{9|j&Vx&Y
notrC#fq~7&%~C*GjNw3oP;2JQ8&W(C>S|8DC$0rMFjxZs@K%pL

literal 0
HcmV?d00001

diff --git a/extra/images/testing/monochrome.gif b/extra/images/testing/monochrome.gif
new file mode 100644
index 0000000000000000000000000000000000000000..de74e65eb1d6f01b022983cc4e24a5f3e0315a1c
GIT binary patch
literal 45
ycmZ?wbhEHb<Y3@nXkcLY|NlP&1A`6_1Nj^b3`{&d{VTg4yq9QUyu!`JU=0BDfD2y$

literal 0
HcmV?d00001

diff --git a/extra/images/testing/symbol-word-16-colors.gif b/extra/images/testing/symbol-word-16-colors.gif
new file mode 100644
index 0000000000000000000000000000000000000000..e097fdcc386b483c604a4dd2af8604e35ae9b310
GIT binary patch
literal 142
zcmZ?wbhEHb6krfw*vtR~|E(D&+cC^>WLWCLu-c7bqX)xQPli=q3_E=p4h1rt4q><w
z%CM?|q2d4k|3KA>KUp{#82A}<Kw3d&FtAvEIO(~1uf_AD)9bn>sU)iLIVwzuaN^it
s&~we=j>V)1j-WpW?k#nHBgr#;zFwn&h*8UmFP}St*57!e%*0>~03)k0K>z>%

literal 0
HcmV?d00001


From e9c780ba28b63306c468f201d71adb601e4403e6 Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Thu, 24 Sep 2009 14:54:35 -0400
Subject: [PATCH 03/18] images.gif: Decompression now works. Still need to
 implement transparency and merge with TIFF LZW code

---
 extra/compression/lzw-gif/lzw-gif.factor      | 116 ++++++++++++++++++
 extra/images/gif/gif-tests.factor             |  29 ++++-
 extra/images/gif/gif.factor                   |  37 ++++--
 extra/images/testing/monochrome.gif           | Bin 45 -> 51 bytes
 extra/images/testing/noise.bmp                | Bin 0 -> 49208 bytes
 extra/images/testing/noise.gif                | Bin 0 -> 21181 bytes
 .../images/testing/symbol-word-16-colors.gif  | Bin 142 -> 0 bytes
 extra/images/testing/symbol-word.gif          | Bin 0 -> 129 bytes
 8 files changed, 169 insertions(+), 13 deletions(-)
 create mode 100644 extra/compression/lzw-gif/lzw-gif.factor
 create mode 100644 extra/images/testing/noise.bmp
 create mode 100644 extra/images/testing/noise.gif
 delete mode 100644 extra/images/testing/symbol-word-16-colors.gif
 create mode 100644 extra/images/testing/symbol-word.gif

diff --git a/extra/compression/lzw-gif/lzw-gif.factor b/extra/compression/lzw-gif/lzw-gif.factor
new file mode 100644
index 0000000000..1d98fdd4ee
--- /dev/null
+++ b/extra/compression/lzw-gif/lzw-gif.factor
@@ -0,0 +1,116 @@
+! Copyright (C) 2009 Doug Coleman, Keith Lazuka
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors combinators io kernel math namespaces
+prettyprint sequences vectors ;
+QUALIFIED-WITH: bitstreams bs
+IN: compression.lzw-gif
+
+SYMBOL: clear-code
+4 clear-code set-global
+
+SYMBOL: end-of-information
+5 end-of-information set-global
+
+TUPLE: lzw input output table code old-code initial-code-size code-size ;
+
+SYMBOL: table-full
+
+: initial-uncompress-table ( -- seq )
+    end-of-information get 1 + iota [ 1vector ] V{ } map-as ;
+
+: reset-lzw-uncompress ( lzw -- lzw )
+    initial-uncompress-table >>table
+    dup initial-code-size>> >>code-size ;
+
+: <lzw-uncompress> ( code-size input -- obj )
+    lzw new
+        swap >>input
+        swap >>initial-code-size
+        dup initial-code-size>> >>code-size
+        BV{ } clone >>output
+        reset-lzw-uncompress ;
+
+ERROR: not-in-table value ;
+
+: lookup-old-code ( lzw -- vector )
+    [ old-code>> ] [ table>> ] bi nth ;
+
+: lookup-code ( lzw -- vector )
+    [ code>> ] [ table>> ] bi nth ;
+
+: code-in-table? ( lzw -- ? )
+    [ code>> ] [ table>> length ] bi < ;
+
+: code>old-code ( lzw -- lzw )
+    dup code>> >>old-code ;
+
+: write-code ( lzw -- )
+    [ lookup-code ] [ output>> ] bi push-all ;
+
+: maybe-increment-code-size ( lzw -- lzw )
+    dup [ table>> length ] [ code-size>> 2^ ] bi =
+    [ [ 1 + ] change-code-size ] when ;
+
+: add-to-table ( seq lzw -- )
+    [ table>> push ]
+    [ maybe-increment-code-size 2drop ] 2bi ;
+
+: lzw-read ( lzw -- lzw n )
+    [ ] [ code-size>> ] [ input>> ] tri bs:read ;
+
+DEFER: lzw-uncompress-char
+: handle-clear-code ( lzw -- )
+    reset-lzw-uncompress
+    lzw-read dup end-of-information get = [
+        2drop
+    ] [
+        >>code
+        [ write-code ]
+        [ code>old-code ] bi
+        lzw-uncompress-char
+    ] if ;
+
+: handle-uncompress-code ( lzw -- lzw )
+    dup code-in-table? [
+        [ write-code ]
+        [
+            [
+                [ lookup-old-code ]
+                [ lookup-code first ] bi suffix
+            ] [ add-to-table ] bi
+        ] [ code>old-code ] tri
+    ] [
+        [
+            [ lookup-old-code dup first suffix ] keep
+            [ output>> push-all ] [ add-to-table ] 2bi
+        ] [ code>old-code ] bi
+    ] if ;
+    
+: lzw-uncompress-char ( lzw -- )
+    lzw-read [
+        >>code
+        dup code>> end-of-information get = [
+            drop
+        ] [
+            dup code>> clear-code get = [
+                handle-clear-code
+            ] [
+                handle-uncompress-code
+                lzw-uncompress-char
+            ] if
+        ] if
+    ] [
+        drop
+    ] if* ;
+
+: register-special-codes ( first-code-size -- )
+    [
+        1 - 2^ dup clear-code set
+        1 + end-of-information set
+    ] keep ;
+
+: lzw-uncompress ( code-size seq -- byte-array )
+    [ register-special-codes ] dip
+    bs:<lsb0-bit-reader>
+    <lzw-uncompress>
+    [ lzw-uncompress-char ] [ output>> ] bi ;
diff --git a/extra/images/gif/gif-tests.factor b/extra/images/gif/gif-tests.factor
index 1c4a80107e..609f98c693 100644
--- a/extra/images/gif/gif-tests.factor
+++ b/extra/images/gif/gif-tests.factor
@@ -1,14 +1,16 @@
 ! Copyright (C) 2009 Keith Lazuka.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors images.gif io io.encodings.binary io.files
-math namespaces sequences tools.test math.bitwise ;
+USING: accessors bitstreams compression.lzw-gif images.gif io
+io.encodings.binary io.files kernel math math.bitwise
+math.parser namespaces prettyprint sequences tools.test ;
+QUALIFIED-WITH: bitstreams bs
 IN: images.gif.tests
 
 : path>gif ( path -- loading-gif )
     binary [ input-stream get load-gif ] with-file-reader ;
 
 : gif-example1 ( -- loading-gif )
-    "resource:extra/images/testing/symbol-word-16-colors.gif" path>gif ;
+    "resource:extra/images/testing/symbol-word.gif" path>gif ;
 
 : gif-example2 ( -- loading-gif )
     "resource:extra/images/testing/check-256-colors.gif" path>gif ;
@@ -16,6 +18,9 @@ IN: images.gif.tests
 : gif-example3 ( -- loading-gif )
     "resource:extra/images/testing/monochrome.gif" path>gif ;
 
+: gif-example4 ( -- loading-gif )
+    "resource:extra/images/testing/noise.gif" path>gif ;
+
 : declared-num-colors ( gif -- n ) flags>> 3 bits 1 + 2^ ;
 : actual-num-colors ( gif -- n ) global-color-table>> length 3 /i ;
 
@@ -27,3 +32,21 @@ IN: images.gif.tests
 
 [ 2 ] [ gif-example3 actual-num-colors ] unit-test
 [ 2 ] [ gif-example3 declared-num-colors ] unit-test
+
+: >index-stream ( gif -- seq )
+    [ image-descriptor>> first-code-size>> ]
+    [ compressed-bytes>> ] bi
+    lzw-uncompress ;
+
+[
+    BV{
+        0 0 0 0 0 0
+        1 0 0 0 0 1
+        1 1 0 0 1 1
+        1 1 1 1 1 1
+        1 0 1 1 0 1
+        1 0 0 0 0 1
+    }
+] [ gif-example3 >index-stream ] unit-test
+
+
diff --git a/extra/images/gif/gif.factor b/extra/images/gif/gif.factor
index cbe7fa5f3a..4744f55a6b 100644
--- a/extra/images/gif/gif.factor
+++ b/extra/images/gif/gif.factor
@@ -1,11 +1,11 @@
 ! Copyrigt (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays combinators constructors destructors
-images images.loader io io.binary io.buffers
-io.encodings.binary io.encodings.string io.encodings.utf8
-io.files io.files.info io.ports io.streams.limited kernel make
-math math.bitwise math.functions multiline namespaces
-prettyprint sequences ;
+USING: accessors arrays assocs combinators compression.lzw-gif
+constructors destructors grouping images images.loader io
+io.binary io.buffers io.encodings.binary io.encodings.string
+io.encodings.utf8 io.files io.files.info io.ports
+io.streams.limited kernel make math math.bitwise math.functions
+multiline namespaces prettyprint sequences ;
 IN: images.gif
 
 SINGLETON: gif-image
@@ -42,7 +42,7 @@ packed delay-time color-index
 block-terminator ;
 
 TUPLE: image-descriptor
-left top width height flags lzw-min-code-size ;
+left top width height flags first-code-size ;
 
 TUPLE: plain-text-extension
 introducer label block-size text-grid-left text-grid-top text-grid-width
@@ -97,7 +97,7 @@ M: input-port stream-peek1
         2 read le> >>width
         2 read le> >>height
         1 read le> >>flags
-        1 read le> >>lzw-min-code-size ;
+        1 read le> 1 + >>first-code-size ;
 
 : read-graphic-control-extension ( -- graphic-control-extension )
     \ graphics-control-extension new
@@ -152,7 +152,7 @@ ERROR: unimplemented message ;
 
 : read-global-color-table ( loading-gif -- loading-gif )
     dup color-table? [
-        dup color-table-size read >>global-color-table
+        dup color-table-size read 3 group >>global-color-table
     ] when ;
 
 : maybe-read-local-color-table ( loading-gif -- loading-gif )
@@ -220,8 +220,25 @@ ERROR: unhandled-data byte ;
         } case
     ] with-input-stream ;
 
+: decompress ( loading-gif -- indexes )
+    [ image-descriptor>> first-code-size>> ]
+    [ compressed-bytes>> ] bi
+    lzw-uncompress ;
+
+: apply-palette ( indexes palette -- bitmap )
+    [ nth 255 suffix ] curry V{ } map-as concat ;
+
+: dimensions ( loading-gif -- dim )
+    [ image-descriptor>> width>> ] [ image-descriptor>> height>> ] bi 2array ;
+
 : loading-gif>image ( loading-gif -- image )
-    ;
+    [ <image> ] dip
+    [ dimensions >>dim ]
+    [ drop RGBA >>component-order ubyte-components >>component-type ]
+    [
+        [ decompress ] [ global-color-table>> ] bi
+        apply-palette >>bitmap
+    ] tri ;
 
 ERROR: loading-gif-error gif-image ;
 
diff --git a/extra/images/testing/monochrome.gif b/extra/images/testing/monochrome.gif
index de74e65eb1d6f01b022983cc4e24a5f3e0315a1c..b0875faa615f2aca084f2ebe35449caa7224af85 100644
GIT binary patch
literal 51
zcmZ?wbhEHbWMg1sXkcLY|NlP&1B2pE79h#MpaUX6G7L;yE%NLKkMW0RtzclV1^^lk
B3U~kj

literal 45
ycmZ?wbhEHb<Y3@nXkcLY|NlP&1A`6_1Nj^b3`{&d{VTg4yq9QUyu!`JU=0BDfD2y$

diff --git a/extra/images/testing/noise.bmp b/extra/images/testing/noise.bmp
new file mode 100644
index 0000000000000000000000000000000000000000..8e47f143ddbc135c05ed58c80e9aac4cb272be7a
GIT binary patch
literal 49208
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

literal 0
HcmV?d00001

diff --git a/extra/images/testing/noise.gif b/extra/images/testing/noise.gif
new file mode 100644
index 0000000000000000000000000000000000000000..31dffae42bb599a820a1e0ecc335fbb8201e8fa4
GIT binary patch
literal 21181
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
Q+!m=i!SJ<H0AS7k1ChQizyJUM

literal 0
HcmV?d00001

diff --git a/extra/images/testing/symbol-word-16-colors.gif b/extra/images/testing/symbol-word-16-colors.gif
deleted file mode 100644
index e097fdcc386b483c604a4dd2af8604e35ae9b310..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 142
zcmZ?wbhEHb6krfw*vtR~|E(D&+cC^>WLWCLu-c7bqX)xQPli=q3_E=p4h1rt4q><w
z%CM?|q2d4k|3KA>KUp{#82A}<Kw3d&FtAvEIO(~1uf_AD)9bn>sU)iLIVwzuaN^it
s&~we=j>V)1j-WpW?k#nHBgr#;zFwn&h*8UmFP}St*57!e%*0>~03)k0K>z>%

diff --git a/extra/images/testing/symbol-word.gif b/extra/images/testing/symbol-word.gif
new file mode 100644
index 0000000000000000000000000000000000000000..101a48a880cb33a5c1f26cfd6761b9d347216bbf
GIT binary patch
literal 129
zcmZ?wbhEHb<YM4r*vtR~|E(D&+cC^>WLWCLu-c7bqX)xQPli=q3_E=p4h1rt4q><w
z%CM?|q2d4k|3KA>KUo+V82A}<Kw3d&FtF%-IO#flkJr*Eg;I_R1wl?6D-3dOKiKEd
eq~Mx+{`{KrZ6B`~&RkfaDA7M%Nl}uK!5RRzvnn6}

literal 0
HcmV?d00001


From bb7114305417b1adee9eadc8a5076412b64f6440 Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Fri, 25 Sep 2009 09:33:48 -0400
Subject: [PATCH 04/18] images.gif: added transparent pixel support

---
 extra/images/gif/gif.factor | 30 +++++++++++++++++++++---------
 1 file changed, 21 insertions(+), 9 deletions(-)

diff --git a/extra/images/gif/gif.factor b/extra/images/gif/gif.factor
index 4744f55a6b..6672ff456c 100644
--- a/extra/images/gif/gif.factor
+++ b/extra/images/gif/gif.factor
@@ -37,9 +37,7 @@ ERROR: unknown-extension n ;
 ERROR: gif-unexpected-eof ;
 
 TUPLE: graphics-control-extension
-label block-size raw-data
-packed delay-time color-index
-block-terminator ;
+flags delay-time transparent-color-index ;
 
 TUPLE: image-descriptor
 left top width height flags first-code-size ;
@@ -67,6 +65,8 @@ CONSTANT: graphic-control-extension HEX: f9
 CONSTANT: comment-extension HEX: fe
 CONSTANT: application-extension HEX: ff
 CONSTANT: trailer HEX: 3b
+CONSTANT: graphic-control-extension-block-size HEX: 04
+CONSTANT: block-terminator HEX: 00
 
 : <loading-gif> ( -- loading-gif )
     \ loading-gif new
@@ -101,9 +101,11 @@ M: input-port stream-peek1
 
 : read-graphic-control-extension ( -- graphic-control-extension )
     \ graphics-control-extension new
-        1 read le> [ >>block-size ] [ read ] bi
-        >>raw-data
-        1 read le> >>block-terminator ;
+        1 read le> graphic-control-extension-block-size assert=
+        1 read le> >>flags
+        2 read le> >>delay-time
+        1 read le> >>transparent-color-index
+        1 read le> block-terminator assert= ;
 
 : read-plain-text-extension ( -- plain-text-extension )
     \ plain-text-extension new
@@ -147,6 +149,8 @@ ERROR: unimplemented message ;
 : interlaced? ( image -- ? ) flags>> 6 bit? ; inline
 : sort? ( image -- ? ) flags>> 5 bit? ; inline
 : color-table-size ( image -- ? ) flags>> 3 bits 1 + 2^ 3 * ; inline
+: transparency? ( image -- ? )
+    graphic-control-extensions>> first flags>> 0 bit? ; inline
 
 : color-resolution ( image -- ? ) flags>> -4 shift 3 bits ; inline
 
@@ -225,18 +229,26 @@ ERROR: unhandled-data byte ;
     [ compressed-bytes>> ] bi
     lzw-uncompress ;
 
-: apply-palette ( indexes palette -- bitmap )
-    [ nth 255 suffix ] curry V{ } map-as concat ;
+: colorize ( index palette transparent-index/f -- seq )
+    pick = [ 2drop B{ 0 0 0 0 } ] [ nth 255 suffix ] if ;
+
+: apply-palette ( indexes palette transparent-index/f -- bitmap )
+    [ colorize ] 2curry V{ } map-as concat ;
 
 : dimensions ( loading-gif -- dim )
     [ image-descriptor>> width>> ] [ image-descriptor>> height>> ] bi 2array ;
 
+: ?transparent-color-index ( loading-gif -- index/f )
+    dup transparency?
+    [ graphic-control-extensions>> first transparent-color-index>> ]
+    [ drop f ] if ;
+
 : loading-gif>image ( loading-gif -- image )
     [ <image> ] dip
     [ dimensions >>dim ]
     [ drop RGBA >>component-order ubyte-components >>component-type ]
     [
-        [ decompress ] [ global-color-table>> ] bi
+        [ decompress ] [ global-color-table>> ] [ ?transparent-color-index ] tri
         apply-palette >>bitmap
     ] tri ;
 

From c0a8334d98ace4de8cd8697b20f1dd5d71f9d9f4 Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Fri, 25 Sep 2009 09:34:29 -0400
Subject: [PATCH 05/18] images.gif: added more tests

---
 extra/images/gif/gif-tests.factor             |  51 ++++++++++++++++--
 extra/images/testing/alpha.gif                | Bin 0 -> 44 bytes
 extra/images/testing/astronaut_animation.gif  | Bin 0 -> 10316 bytes
 .../{check-256-colors.gif => checkmark.gif}   | Bin
 .../testing/{symbol-word.gif => circle.gif}   | Bin
 5 files changed, 47 insertions(+), 4 deletions(-)
 create mode 100644 extra/images/testing/alpha.gif
 create mode 100644 extra/images/testing/astronaut_animation.gif
 rename extra/images/testing/{check-256-colors.gif => checkmark.gif} (100%)
 rename extra/images/testing/{symbol-word.gif => circle.gif} (100%)

diff --git a/extra/images/gif/gif-tests.factor b/extra/images/gif/gif-tests.factor
index 609f98c693..b62565ffbc 100644
--- a/extra/images/gif/gif-tests.factor
+++ b/extra/images/gif/gif-tests.factor
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors bitstreams compression.lzw-gif images.gif io
 io.encodings.binary io.files kernel math math.bitwise
-math.parser namespaces prettyprint sequences tools.test ;
+math.parser namespaces prettyprint sequences tools.test images.viewer ;
 QUALIFIED-WITH: bitstreams bs
 IN: images.gif.tests
 
@@ -10,10 +10,10 @@ IN: images.gif.tests
     binary [ input-stream get load-gif ] with-file-reader ;
 
 : gif-example1 ( -- loading-gif )
-    "resource:extra/images/testing/symbol-word.gif" path>gif ;
+    "resource:extra/images/testing/circle.gif" path>gif ;
 
 : gif-example2 ( -- loading-gif )
-    "resource:extra/images/testing/check-256-colors.gif" path>gif ;
+    "resource:extra/images/testing/checkmark.gif" path>gif ;
 
 : gif-example3 ( -- loading-gif )
     "resource:extra/images/testing/monochrome.gif" path>gif ;
@@ -21,8 +21,21 @@ IN: images.gif.tests
 : gif-example4 ( -- loading-gif )
     "resource:extra/images/testing/noise.gif" path>gif ;
 
+: gif-example5 ( -- loading-gif )
+    "resource:extra/images/testing/alpha.gif" path>gif ;
+
+: gif-example6 ( -- loading-gif )
+    "resource:extra/images/testing/astronaut_animation.gif" path>gif ;
+
+: gif-all. ( -- )
+    {
+        gif-example1 gif-example2 gif-example3 gif-example4 gif-example5
+        gif-example6
+    }
+    [ execute( -- gif ) loading-gif>image image. ] each ;
+
 : declared-num-colors ( gif -- n ) flags>> 3 bits 1 + 2^ ;
-: actual-num-colors ( gif -- n ) global-color-table>> length 3 /i ;
+: actual-num-colors ( gif -- n ) global-color-table>> length ;
 
 [ 16 ] [ gif-example1 actual-num-colors ] unit-test
 [ 16 ] [ gif-example1 declared-num-colors ] unit-test
@@ -49,4 +62,34 @@ IN: images.gif.tests
     }
 ] [ gif-example3 >index-stream ] unit-test
 
+[
+    B{
+        255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+        0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 255
+        0 0 0 255 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 255 0 0 0 255
+        0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255
+        0 0 0 255 255 255 255 255 0 0 0 255 0 0 0 255 255 255 255 255 0 0 0 255
+        0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 255
+    }
+] [ gif-example3 loading-gif>image bitmap>> ] unit-test
 
+[
+    BV{
+        0 1
+        1 0
+    }
+] [ gif-example5 >index-stream ] unit-test
+
+[
+    B{
+        255 000 000 255     000 000 000 000
+        000 000 000 000     255 000 000 255
+    }
+] [ gif-example5 loading-gif>image bitmap>> ] unit-test
+
+[ 100 ] [ gif-example1 >index-stream length ] unit-test
+[ 870 ] [ gif-example2 >index-stream length ] unit-test
+[ 16384 ] [ gif-example4 >index-stream length ] unit-test
+
+! example6 is a GIF animation and the first frame contains 1768 pixels
+[ 1768 ] [ gif-example6 >index-stream length ] unit-test
diff --git a/extra/images/testing/alpha.gif b/extra/images/testing/alpha.gif
new file mode 100644
index 0000000000000000000000000000000000000000..c4c38bdaf02a8625fbdbdde2796402d669449261
GIT binary patch
literal 44
scmZ?wbhEHbWMW`qXkcXc&j137KUo+V7#JCJKpc<^0~50g6Dxx?0F_V$2mk;8

literal 0
HcmV?d00001

diff --git a/extra/images/testing/astronaut_animation.gif b/extra/images/testing/astronaut_animation.gif
new file mode 100644
index 0000000000000000000000000000000000000000..8c768480fea417aa54f0a60ca54711bf28c2f8f2
GIT binary patch
literal 10316
zcmY*<cT`hZ`*k`Ap(TVOgcwRNfe;9UK!|~mP(n2#O#}^1DG_NRB5DGmcR`w<p^AtY
z5EOf;0yaQYa4evr43=SRgN~!W%=f;tzIo4I_ujScUH3d^@AK?upU2(9&7KiX1qcC4
zfWHSE4%hvA80s4SJxG5KDv3&^(QG*kMu@F#ilLz=hvBEVVQ?56j+>jCpQlTRpKDN1
zP_(CKil=9Mi07`rzyp4M@sUA$W4Fe{#OzOr*|%?B1BoPIFmeL|+B`k0A|vznMds~K
zZ8&hCN)lfzIZ!7_X)8X^R&^jhKfk`JxUR0Qvo5c#zV>Qc@tL-&%crYOojTQjrtQ+D
zOJn_QcgFh1$H$*OxHCUL|N7~JH*enj_19mDpEvx8^mX;$!gc1mT2rjRz`q}Tg&@=c
zP5|=Xllyy`P}ooTi9{Y*uWY<Ec|z!LVyYw6^GwLuxvsRE?=r40$kM$j$L=ooW!z4<
z{A_g~)A#Hz?^q|EKJ@x6lTM?NX><l-CzFN&fdFLy5Q-9A3MwqG!$g*rVG(7O!1Bnt
zIt2D)IHvtfIVc?0-HnPkcP3JLp-k3r84yir=>}n=7&IIdcnfd~fx|^H#WV^Ii@{>2
z=cdV_`yCm~!Uq%z`ROzUjirolJ)B`rawxR2wz9Bzf-|xFGAB(X<l%5;zVZbdW4B@*
zs^{C~&EV&%EV?|b?qN8$P&*^4L)Qb8bKJl(kT<m$spM?_JR@~#;rYu_Z0@TiA~n3s
z=qH&P#$T14>^P32+fS{2?e#3%$O?6l{$6!=`lKC+46SPUwJJ&@_fT^9?Xi0&!DpL3
z01P>h*uae@wO)2&fHK|Gv2C**=LsZ;_`UIsIP_vc;rAI^!2$q82CLxN<@gW4&RqxI
zt_s)yF&L(-vYgW<5<{RwcdKJx+n<3U${K(xgsiApMDQ}})&-I1PTxfrd;S7D>(sAP
z7Z)^~)5IY=*mh<Mh6Y9Gc_TPcidXpv#}I>qF8Cz&SrrX!kjk46($pkfITM4;U-zi5
z%udVew7sQ}9z>#u?zt|vIA|MYW}66{A$#VtEHWH-?D$I?XSb%BCDpcqH~+j7dqbQT
zPSf96F@waUPT`>N{J9|&%Ty6a*Q7Nu3nmT?k|$w_(m|Mh%u6U@1E9`W350cbhN#i3
zoOMZa!5sYb!ueK+W+-3@u_4upPg^*n1FYVZ)dQ?B2+l4^PoOfykZ|cRr+y_Jk5loA
zkgI0UKQZ9BQH1QK@-R4h+;&XHu2!|3^&sjLb;jOOmwYOSDG08b3U`=?Z*Igt6llQU
z>+>}@P_6uLT<AK91_-V~*4Ut86)cm32=L7uxUob4LRKDf4s>`1uTbll<HZnVtBC32
z&H0X<Ie47*pIqsE&to}Fd7Z`*d|oCZs3`}V@l<^wq_E(GB=`HN&0AMK%m?&xAr5@m
z_5lIUZB08%Q*|w^$<p_sM$a?Do1+)^401Q-d&|quzuA5DWhQBip0J1{(+9;B08rz)
z9^>dpcrGB8tGn;9uEwpLUJX31{AMUP-@8T^wGjY>SpHlM(%tJUfGAZF1Z-WrHsE*l
z(RKWf27Gsm&$IqPKJFU-pPkA8U4S0I{U3H>zGRHHCeM9j?7Q36=iUP71~^MheR?4P
zPe_qZYQaNxX|Afk`1Sg&09fMOoK2oLz4%#JU}km@C=4f&><lZ&#_T#=0)QnsC6oY<
zI+1I#LAZJv4g~_X1EDCKG>Ji{$;f0J_VnpqFLx%3epW{5J>Q4H?hAF|`#P9!jJLjP
zZFTOnK8fylg)_k-k*ww{sn4l|%U0%8J6}3^+?Sxgf#PdTwKU&A_F<Zvqxq~ywu29x
z!N?6)Vm?hSn&c^|_-4LM{5?`24?)?u^(~5XT??<2%I2)CUR2<i#N`(}a4-mt$ah^}
z4~j~R=Y;rtwqbkT&l)PjMAvgx-WaxFUtfnuRfnh^p090HE`rWfVpT920`}=Z8&JDZ
zzQd>1t@<oY?<e&hJPAli4O3g+Qm|Fe9~^Vv&&2#bq%-a9vh6_Oqchm*w-)7cs7%l@
zq`i!8dc()`wr`eN+4W%5Hjbu`dl#AJZ4K*m;jLDEGSlg~^l|||Pu#hc5!&B6@KWp4
znPO79tb)5*pXP;`Su;p`6|2uI^%A>g=Y#+eh4=NIpf93V&Kc!D^CsIMpL#~k%7EO(
zP4bbLh4P-k14l5+o&(8?VzVB|{c^z$lu0Oi2zK_?(404lhaZFzdDA}1-va*743K(Q
z4MM@_q@Nr+tvkJ2y;Xg!oOLwQ1mMFs{z8^6;rQA*q`pvK=p!pR0)XkJ+C!4!gV*Xg
z_loHTNr*?FZI<`eh!W1#{O9YC{NBiyXs`1wMH>EY1@#!iVgMJ}hM?*R3FR`jj&VMI
zNJ)h(d!@cESPlTM4;DG=SjahEWueso?g4Uob?DwfyizgJJYj!~WnbvJVx-mM<PHwG
z7gSVp+T@{^<xGqxH|cEZw?@vNb;@1|Z4O_DJ8qmRj5`%Jz{eiWJ$|8+*w5KTKq<Sr
zXE%9TIn32;;#`3Bc<BB@lx4k>pT>~a3g4<zbZ_j4bE%(P>S!J?a|wdM<>ZUG>?3yU
ziyq(m;nCbSuaO;z9j5~?yEOiei}$di`(O3?esd3sJBX>o9ByldM21kkB<X*c^>nXy
zg#iD}B`pP)JpSR*_s^N*VM!C;zs8VD^M)sF&(eT`n^2d~hY?Y4lJ;H@uO?pETL%P!
z?anx+Z0+l=k9?+#4nu`w4jxn_u$;84@WNf#IAJLwjw32eJxVTwl^=CdPzeEQ10qm3
z+zAG~n?|FMJ8|a(;S467cDARtzY{xjfx~lTS+Xw6XjWF|I*CL&kH%s0Smq|yj!bLn
zB9%aA(nwT$9-Zto=Sa{uvEtb*nwt~dnU>~gho_IOzF7<h7n$5jH=I~p%%Y~a9T_N(
z=xV0w<6<^KDzn`v+B-t8-h4$>(hBQ;%+}R11W6z;NDS>2XlK?@EdEL{+faP>XN{v~
z)tjUd{gUIbOw$~X@Kbj|Afu_dp6r-116wGD$H%t=!A_u<rIkv~=F^VC;t$HUnt9!!
zNVarmaf}*#N90bU2<d4c9J~Eu@1has76{rcwD>%#T66<Tg!A-ZL@0tB#X3G?BR*-0
zO)oV&w^bLaMhOffJq`lo+?cX{AGdE51|8Y9!zpcg^60Tg^nvQa`boF$!0X4>N=3i0
zA>p{my(Z@+I^li@Uu0#LlCpO2IiruWYJXCzqr2^;&kG)f)|p%Gd|ciXZ`64Y?a;+{
zK87ez-B7-8Ov$5B+Zn7AI`s@qq78^C=hi+oK+yiu1ufNfeimc#l>1L0RMVS3nB^M9
z<G3&Sd<xIelqTkEH1V!{grUeZfjMgBJjoui#@N=9w|uGcUe|odb4>KWk>O$&^q|+C
zb8~)ZW`DyUlNb)5AoQrurvb0H<56Ec<H9omS#U#vNW4L}oX>$9isWovvV7GPtU|`S
zz}L$e97Lz>pbD)odS@7>|M%u~H3_r!Eu|d!k>gf5bY*Cb*V_-uv<k;xBc-mv4=39y
z^e%ASJBcS>o^12fQEru{`|s%N(aVd|?alHyroSl{?N;*nAgu7rweISoGT&FvaotOJ
zrljj;_XBd>UBBp3*?rrhWerNO*E=nXt1iwcR*Bz4P%F8IHEUS0HbOyd`|9tp>o+wN
zCO8ffa8|>&A2|sA^T)zH@Q3XvOpq6?4P)#*vJEi2Ius=z2;zw?P!$#^$iEq-_isk^
zO$YO~m5vLQV=<ysvsL@Eo7r-!Mz`+UBy*i*Ptrn@png1~ccyP@<C5%Bvf4rQwXEMV
zcODADiFaa?<8zaeor(Y@9MJ(_egzE+0|7zDV5qbTCweQ*%^ip1RWMr5w4UU3p7vp}
znDhZzn}S_9qFyA6#$m7=SvDqg7Q@cQhH68;Xm3t+m>6|pIyw>!Oe~&FO;d^EbW1ax
zr*!g@XDosN`I!UF{r)q?;J9Nl20W0RW3c}AwcGL4*-+KJs)uD#K^|8ELBQtt`H3Q+
zvNU*OzQ!Pata5{0@~1%~F%V3o`sLS20eJ=h9l!KndjWTUuE&MPeTy=GeWn<kskZ#7
zt^IB#D)7)RNz-gG2*g7#^6|#rdd#6$@c0+cMG%l2;=}hjf!twg+a{hDfshe<Ds)X4
z;}fps;KxHta<Ne%4Qm|{UGayGl1^)vsK*cxF9zy(WbkLqaJ9KLJ%QTg?4xLX%1n8(
zVN>s>!c)4J|0=%eItG!j=B97Vozo;RpQ3Sh2D2?fuN|XZUg}y+yvHo{9*gx-DuQEr
zb@nYIZ>eA%;@-wU(admF{kLL6=jRZ_E_eIc{yFK81TFAi-c&Q}D&(WQ69=JdVNFBI
z=B?mOW^NeML5LPM4Vq;p<!>`<f4d+C>-Y<P7HBF3>OQeNw$wa~0BbM1ASr!TFf(k_
zz;MdFCt39gxbgg=qM+sU$Rx*a4<jj2f1%Z*!VNdnX|7A#>4Bsb6Q(Q$RjWg)wrjfz
zxUE-KK`;}MVHO;pDVKw^;62W8!zu&_9<CP4Rn{fTL>j_tfNXZBD10*R;E&Znik)eY
zOI61@(#W=Qtqdqx74>SK)Ykfen3$RIs>Qj+^x}f%#W^0K(#4mwHTMFo&qT9BFZ`5r
zv-U+Z&8Ft(b;$N&Xjzks2>Pt^%*>F9@AMhHPMab6qWK9|zS1VWn==6NUX*wd<ZFjc
zI%7e<HQC99HBm=USFae}@Bn8L9U<Nn+o6O@-m-YMae&s8<Vp!mG!6Kp*E~-N5n83K
z8P-?@a|7A+-1GRjJqaDCtV4dNH5a=iam5#yyZn#fGg45B_fL{~J6%fGPnt0C15CxV
zdT6<w-R!w{-O`+F>K(s4+L=*sdQB;}_ts|WNmatW3yI$XwtZgiAxESg2E;pM?*`>M
zk%6gDaW0*VMOC8^2n?<wp3Y!O86LDfjS(l9os1TGTf-htFBXeov9XC^Z{JFz(1@0f
zj&59*qdm!Fh-GJU*M`U(H@CFBLF3$WWS9^r!`9|6Oo+n_qKW-*rPD7=g5Cn1$?6>W
zOsC*(Jf=8(D@~WBN<}5%!!a11pa6_i*Vs59s5sRO1S`o6v9FrgVxX4IX13-BHbh$=
z^<G-L(Cp;{wK63xD}*Ej3<)LU*`n&74Nx^*!SbN#jXE5ZoO*<`6O?h9JuemDJAh`y
z2GjDDmGNs}gtCyN5&rUIH^nq#fo(Wg-Be5b<oRcLwvzfbV)`eZm=mgo4J~#UmAKuz
zn$MV$S7fgqF~~)IECv+iT(fAlUkx3Y$ho??tz%Bw=4rEZ8SSwnffKpST)yvJ@A&I<
zUg;snv;lz1G0l>+=0E3K2CMD53Ic@7Qrm{zTQ4`*2kb{h!Vm{4O-qaM;lsJ;0A4w-
zB4X{B0evGMzj+aq_v-`xZ1Z4js=5w|o_^ZzOo)2W=cNU(x_N#cDAV$B^Cr=kE<T45
zP{n>KtbF|0!$LnsIw<aX68IAtwKpu^AlWB#2yDRsMCzzYr2}O#pEBK^6*3xvZx#_a
zpVyaOzn_gO&1tiqJK*%)Xfn&c7NE#GRU(jplg=JS5{mI4ur?nE-b)Rgkb^kItAk2L
z#j8W`^q#Tj0s|r51z{@6!XX!y=9E<lsWXv<>YJxq64ZbF`imgex?-|yAA%a=$fi_G
z=3~DsM>LgY<acOzSShV*bNSvLa>9w{fIZ1g|Mtwh(DBl#6D?n5(&IWSZYvsR^qgah
zFWRmw(@xKPEA4ifs?<L?_{BIr`3i_DL0<pCg`R6kTM60Ct&#_tZn2-%F^v#uX;*Mn
z2!0ppQ~=!?&-D_m6Ey4mM<uTD{;lI^i-0~?kOsS4e#KX%?KfaR)CUppyV@X-#|vos
z4II^j)DCv}U#(}Nppol8G*W22Yfrn!g+I#qQFmVnaj_WBh+~5Jj(}!!RN{Wna_W$l
zw%-gr@LOZT&zUv$kSRaUc)vJ39GjIZ$rZzP7wk{lR{}(prRGA*7&KTe0w>(9D3!1%
zSUVJj#o;>1C%7z6`WA)Y+o^CZI=e1m`#J7@Hd`)`Z*-l}G@&pYnL;L?YGQNO+J^dw
z)K4MV*z=e;H=ZSlWXrR)d}K*<XPHw;4!oCqy8bPm1DQaumz8IAOZsrMNkTYv(6uVh
zQJAg^AI(uEDqM+G0P2N(o>t1++WXnAAibUlkImNB0bQ0maW1@aGayuFds=Jpa2D9-
zr@Hm-II$d>1q5PZ-cA)H7KxQY&ts<0dyAABy=uOUJKsMg1|tr^0p|VkiK?ElbwoT~
zOag-J;U0+qU@#oTYkxA>FBH4F6yq%TBG(69G&Nxeav*;jnD+5evUAG@=nz!RpF|L?
zx<p+xlBsSR1y93KrG{^gvKLMp(FayIw<Df+1~ex+G*x&YLzOSEe%Bgpo~*ek`DG=!
z!gkB=Px>kQ-m5IOt6n>LdbShWbZ(w}C7~ka0|@4;UKYC&qP4nT6HVgL1pSjjNSL{w
zaG4)He9iXge!+SuDh4lx5&V-t2ooV**&M{C1EH!stHJc&8f8+|o$0cl)frkw9r$d6
z#PP|4FzEw11T7dJIiw2X6(U<{QZ`r~>mC|?IX%l&`}DvKi0Y17;uO_tZt8{0<;~Ul
z<{TNn$mNQ^VYEg6W(`7gzsx8KWmq)@qJ;cli_PtGWO8^w)&FxLWNav>ST1i=@fQu&
zMDWLeumj5CEl9sFBPTV^`+q58XW@)rG&$wZM3-&DWfv8>2zPnye!)Q8Gn+aXj_h#K
zSa+<TR&6m>^up&WsnyA(4orFPL5k~)7#VBPZJ*K2b#0ohjuqA|bgrD*8D-{Ynj8S^
zDu^JzIekuhdbzohX0>jNl%)0hLm+65syW~-g4P*?hWb$<QK?OrT?gJIh}rs%9-}S+
z;U)m!=6bEBQEz&{;QNb9p7({CAy_Fz6NQx~qMZNb4Jre00DXl!_#ba@?c=&K-iy-l
zDAN<ywx@(hjB5N%cfVOl+bT$`p7@Y%AEOq1^;K~}-1&xghmfQKp5xGO?!+`F8VU-<
zQRoFUY^ErUhQKoT%wqB$W<j85{+?qV45nkGB6}QTG8r^F&7Y2HJ9*NLb*ht2F5Pmm
z>%#Q`g%61G??eGAu!5msK?VRw_j9SE;{fxIetC?^V{jjALp)xZ2R_A-Dcy8NA^qj6
zM?eGyyAtg*Kp_(-<FDqutbjXe{eBB+P!!hOEP#fwHv67Px{mrjq<;X9_k#fO&e{Vv
z2H8L*nB~#l=}pc}wlI#iY~S4|u&NHKvA0LYKmHQ}_10TEH}*OwlidDwZc!!|)givD
zd93!aA+4SVLd{>=#QB3aUwm{kk637-v*|SFulh8$q{^w+dMOUj^-$)!D_PoOmY}|k
zPK5O92b3M>Y+}p>uRK@M*Dmfve~A;ww}8oh(*rJp08k}%*%wx5zv;=OlV{e!)33W9
z_T~JTZ6uihvrZjG&$(tg*iD7SUstoOdzcpfOJ9LXey7|j2QF)TP;}`EA_vH|qb)>Q
ze_I6sJM0@be*BissXoU(To^RI1_8k!L@QVn;O+gxFONF?^tttC&&3T-G7(pR>mvd$
zD*eKTIUIeU!4A-x(8u~8eQHn*4Uii66Wr`2!8pi=a=;=A1r&+Diyi}fZrRBxk(fXg
z&DcR6RLSYS^GK%eytoDDpjKg6ly-{_O<nf>-(tZ~0VciwfQdi%H<+UKjALINnR?m#
zYjMayx^_T}`Swcs-7mWi94cegq`z4?Uc%De^|pys#L7H$9l2$hOy3iXi}$Btv-YqK
zN5)ciWZ)?N3>JeCU0X|Uq|;6)jA(L|Z(UPkb2H^k>seW7V_Z&KYtFy`cHn|j3l@by
zVX&i^8{-q>m-}JRyLS;Y_wJz{3_iFqN=86IQ<#>i7de<acVQ^p<0-@lgZAPXv=sw=
z0)-)*$WyRrdfLlXHyInEldQbg>xTM{ERQrHf9=)VMf1qJM)3Wnf;ki4(c1eT63IhX
z8BUiDz9?7o*N!kmy7FrFJktOJLCfasaDyUh_{~y+e4R*nI%TMvq*~2>t*gv<{k3xE
zLW9UH^3cm!_}h9G5GdSf07~=n?efX`7bTGZFkl_P{=bx5UZ+<wYHU5|uU1#kimqR<
zC;7iFi)%DB^4UP+pvwAZduvVwCg0gE`;?zkKl~{BueBezJ`M<qP}<EwDHT9PSReoh
zM7Yt*kCH=huySY^hl~Z4qf)q(;A{*Q#lhlGf>VudWE3<z>d3aU7cjXlu=6{DIf{r}
zhzgO9A~3L#^Mi;QUkV?q@C`9DsJU5B28&Lae<Z|FX!Dd1y5lN~`38m|KYy_l!dU(5
z#}C$n*!k%fC!E)Rh2d!SYL8J_$QPeu>}7)M1v(q<q}Y$-4irI<zEyT*RT^c+8(zUZ
zl9d>hPQtl4=R|k4GDu2S)vq8^)gN^Z(RYOVKelP=(frH;>cOwd3{XEyE=N#Tc>0+t
zi5-&~i}!u8vjo?4>hXuCahG29_4HYI=;MO>ws~#YK3Q)OmNBQF^7z(KdMrpy`0>?K
zuMfiSvl9bJQ_YF@p1vT>{_Znwcc53Z)3@XGUF(OVx4&qf3Z6P%F=Kxvs0-QC8F};l
zMZ0$~X=lT41O|0$<vnwXyMNQ?%38cOM&4!p;dVpl3(BEC^_p*A+?&!{HT!fs>;2QW
znKM70`r^tp^m4MZUZuMv1ytz8uH2icTnZax-98{VaKd!cNdr~4E#cNZCr36NrJ7<y
zvxaazKNaPQJMpyTK*RKe#C=av|Gi5i0ZIy&*y6vCnA2B4;zi=?_!XBMI%nt4kq%$o
zS-DFux9=LxC-&pCQN{MNw2`O-F=aEZBsi=O>pqukyEP4ra>syxc^EoQh>Lc_<mJ1e
zDu5_D8RJA|_~hkQSDpaEXk?UP_l^Tef%V*~iZ&b~>olt(SH`K5f^k?F6hUK>f!*%d
zqred;7)mC?T7d3|2Ot<|3I)3_g;ma9+6PU;prDstTs?d3#PSmq<?RGe&Vhlky(gZ4
zW)h=GgJpZ5_5&TJchxS1tWBxd+ZTgX)la}uQ+U85HtH+(>9u1+ImmLgEoLgOnxZ}Q
zXrWb6D6;b;1m$u*>Z|pu@gD*M15@}!Q_OS)MYsm(ywff&<&rS(>@7&%(hjtVmFU$r
zNvXj7%f=k#hQNkr&1o;$=yq@Akm<Vn%J1I<Ror_#^SH-Y3E5)tyD#!V;3<!5TZdK&
z6TxJpKBGzx+yd2%tj~`9wEQMNS#wLtzMYfz=Fh3unPewP%L_OyBkc!h+bv#Vkb3RI
z9Ti_IgLc=-vv0h-y2WGSzTiG-({_K4+ua>fZcXRN`hhpQrhWH0lIugk^LGzj9kL``
z0?pms{&mn$I$W}R`~B8E_pWk(gTl_}9GUqs_7`{7?yl%7kSG!9@6N8=^Crm#pT3Kl
zKDvK3?2jt(TaOEk=>LU;x&jioe-ifrjXc<$q^~U)m0KLCAnFHNEczTogcEP^o=0ar
zsa5O_9)nBC7b@U%lj~16KKgxe<!c6uX}6w>-{_dnWRSTiC_UeiNoSf8oM=YOL-`B}
z!U+pQFe?hkx;P6$`w<$-2?fJ6R4{42nDTbkSquz@YCC_t6m|JLMIC{FsgEC~lM!L`
z{v#CJBP@n;g^mq_(#|l+k8qF4bR6c!+vnIr1K8I%GWqc>SQr9Vy2U6e-VLCebKspy
z)K+45(@+jjt^I`v8Zk_Q8p0M5%k-foTOj$G2&(h>6ih=f=GV3&H*HGr6q|H2;wETT
z``Wge?A+dr+^}HBt<?)aj*e5Xce0Ch$1nvoLq*S&fK(6JaXHZyGs6|x^w46=A0p7T
z%<VOEQbUVih%&Z+-s^xQchhCY)UQu2kDNs6RJFcaI$&bzsGr}K6x@(t^u#dZ-H+YV
z2|dxJUhTm6v95Ekl~7gWCZ1}?mYvNx|E@-m03F40VE<W;mj5ir3thCgvf*O5vT;^c
zzb;<429YH&SAq1ompQXz4(Hv;YVxx0hGxMTe(<QgaDJ5gp%4TVl9A2Dz~HbF7%Zm9
z2?2*fF?Dr&vQc>mOiK&Sno4&?L5^_ktO+<A_FNy<!~ln(GjNA63Wto2MQLLCdPf^z
zT6Q!VOQE=|Dw7qdj@*l=tVGxuldo89WX;u~&Y!DWU|AVp>2{9G@1c**ktxXy^bsQ&
zd<?V$txidu76givp+L=G%$4dr`Xv%9j(XX&prv6y<q#mM0)MmB2HKlHail=G$WZ5N
z)Ffw%3eXqPXJB|Scgy7Fy7$R}TRBH|P98ILUWytzePVOV5s7tEc=j0AS9nNSDtott
z($NX4`c7)E?Aq-@=v`R-c#^1=INdHr)@-V7Xtl?G%y9X&Z4UyZ1Z#`p{mVK*0t^&U
zCjArT7aDnEEq=Nl<YN<UR^jD8(D0L(%~DL+@pxxZuqgzX#b&nZjscxt>Z0aOzcY4l
z)X7i=0uLepIXNJgy~!L{JU6#IXFCUw7LmjORa9(A17RZLFcJWQUSAP_5G5av@4(U!
z=hAYqyV5Xwp$I)h7DW+M2910HsE2|n+?Eyu3X3K(9PMo^&GgB7I9;3%3Wd8ijn%t@
z#k|E}d+0dI)XNLgzhW3nmg8UFe^4?@KFY=O_Bubmkv>gF>XvK+Z@m>)o!B&#OHb{o
zJb4RHa#%~}y{zX>V>y;$@^XRN0^=4rrY(pDhq&tcT;Wu0({oqk&s-+?eY!IUs!X8!
zkBn<q29N5H{5sfr;5^6N(d18SHQ+ot!8S2}Hr6<*RNK?Bw7;o8LS4_ZYd-(?p)s{c
z;n&+1K=6B%zNyd(8$Ohyr2b7XLi~j*DKa*FTKa|>F=C@{m+<K$Ud+umCRA$?1;cJ|
zbwrG0;lc}5;6`pBLbt`x9f1G^%NJfpcmr)+GBt@BhDt?t$l2anRy})l8U(LBQrp(0
z&Of(Hvx1fJP2<eNx}T;Tv3%8*R;nCc{MSCQ%kz{!zB+@Wjh_h%8`g89;i@_a6{RPc
zPTv=g8EpOzC`^Q!tZ~z>8*(JDDd&?T;t^8MP2nAb&3ec8=n;DsgpjeZCd{>?hNET#
zH53q73IDeqMFI>JaB=)ET<nWoARutk1Qv9hFOtr;x|{{9d{`&lFWdTV(<){TeHZd|
z9m*Zd*G4{SpOMel;upr;PliAbMPnjR2pA?g8Ha%(5V%~J2g9+(5err1Lw_s+3dPcD
zYnZsWV;U}}5O5_p-O;|kpUy<VE;ne9F-kC{e9Sp(OG^{Wb2Jnj%4=?(Mqt_>GBNcE
zX9M^Qfn_=}8LybjEP67G?~$lbW&^M247#G>;yUaZ@OZ-!c7*uO<ExouJ!egR9;nX;
zx^XITP@FXi$Dtj(N3!xeAnthQEs|2KYLP(=CSUqaBd0id=V!Jnv|ULJyK%Y71{F5>
zlkkP|Ik7^+6sg0=q&HFT%sSM5o$`qATY1!Wkd|1H;@p-O;O%p;<IT6v@oHw_HzOto
zk51U*Hu^TjKZ<NGIq#KltM>Qj{(;{8fmdRtP3j7@4h^r=I!AB|Ob`6AeX`=d`Neg4
z2%7>jm%L4{`oKuAq3(yL`Vk)&KbX~j+GJ#&FkahlygtU;A}Tfg%1ioOfw#q`Llz^s
ziR-JD-r66}UQ<64AGS<Oh|5b^;he}2IW`oi8my(y`mSZ4QpeE~<cU8(l6<t0OKt7S
z5G)gA>>?6;7@8sI;)C&!%$unXw*@l?@C)k3S2RLWo^Bn(s9s^|XiL}u7w&2>;5Dsy
z%^%^tcQj((vBCN69Ur%Zu!KC9{8Mc%;9?7O-V<-i4?s)7NZsp){&x{}m;l_299Tel
zZYwE^ATf}p+%K;TH**CKqcp3R!H<u;xMgpoN!Cr|*?WBlp}l+*%^o(#Iv_U<;Q*4v
zJRi<icq1E)X3*Gj;N1!rAy~=I`)!XqU?190F7>k-jM4R4`|8r{YV}Cc3gx2)r9PQp
zK-<5QyE1^FD5G5d3tZmYucg<v|9$FG;;3)2>kX-K4p$OE1Y83EZ{+NT0mR2uGk^F^
z4%0<%&QB~lsi&(GUA`a^F_{tpG!dJVgGw)yq&sDo?kFyYDf)Dr7_{U}D6XDKrzpAt
zI)I08IC3<zrA6Uv;jkC5UFR_uoBlqpv=5<-lF8?<VlWiO=IcCrf?b@ojRMI8GC|Rh
zv(bazEms)G8!X&ys8mZT!Oh{FwL7DmPuAH$aknrbc*d~9e{(HNcTC&Jm>JeanrKwa
zEz5xuYS#RW0qKHaFgn-MehQvDoj(Srb#;U?%sAJHjL@kCfFTH}h6v`JYCdw$`zIJ1
z%<hOa=O_+qicN`ZIh1TpsWxR5(tcG32b@lx8w5Wn#W9mz<b|`Mt!|KU%4q!&LQxxZ
zL0iMh1Q^(hN)Hi7x5SAr9?dQGVY5X*?M+u_th^TX2#n%SCY!mvFqK@7y;&SUklybJ
zL)AJaJO^?7ly5jbdp^_zX~5njy0G8P2O>yOlZn=G12uW*Egcy1$YB^1nDQ4nMcI63
z!iIC_ziY8sL%RAcxsgrbU>I^sY0c;4q%LpzZ@96DMgz<|EGU@QieF^cC^<b~cHw(~
zcVMa}Jp4VMBv+9$L?>nefZb4@I0W;X`w#@~WhlA>RE{Tdlv?MEeg@>AW8@2&8V`=(
zlwkh$gOJ43)f2q&#DycpD56XS`*@m@tz;lG(p0)4%Zf}gfGvr=>5qq$Gkx(MMHU>H
zyis++%A?-<=-$;ab+TY9QYlfSF$A|u5{Wg?!Yv>K-U^^(XJm!n1?Ln4hCnJ38L&1Q
z6B)thl-m^{39E=k@0SeB67?u)MS?juH{&TiWEw|6O)r|hRHtanFQ$0k@_Sr)Ej2DX
z@tV+X#b;HE8)cE0s;61S6?haj`5bpp>wb*LGmpJ=Nggk|ZfzK!SNlpsyDR$BC3Dp6
zRV&}l;NV@D{)%+GzKQ!fwvOh$b#e>8XJ}MSKswRYf~^^4kmVk*q?VKbnzK&w_jztz
z5pXRSzjro<<3D;<GYZ9js}8k-O$?_0t;c?(aFe6MQ=_Bs5&QA3k;2%-lxVz5?5^0<
za3S7fclfT@gkAVkR0hKyk9QUd@qV$pVp3D^e$gq>$!XD16uhc3chBzK(aDjqiWh{j
mk<kf?4}_<M#|pzEgo>+FyrQ9x68)bqM^Pg8>{e9<F#ivJf-r~x

literal 0
HcmV?d00001

diff --git a/extra/images/testing/check-256-colors.gif b/extra/images/testing/checkmark.gif
similarity index 100%
rename from extra/images/testing/check-256-colors.gif
rename to extra/images/testing/checkmark.gif
diff --git a/extra/images/testing/symbol-word.gif b/extra/images/testing/circle.gif
similarity index 100%
rename from extra/images/testing/symbol-word.gif
rename to extra/images/testing/circle.gif

From e006b6296240c706f5e02ebd1ec2eccc4b242182 Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Fri, 25 Sep 2009 11:12:40 -0400
Subject: [PATCH 06/18] gif: preparing for LZW re-integration with TIFF

---
 extra/compression/lzw-gif/lzw-gif.factor | 19 +++++++++++--------
 extra/images/gif/gif-tests.factor        |  6 +++---
 extra/images/gif/gif.factor              |  6 +++---
 3 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/extra/compression/lzw-gif/lzw-gif.factor b/extra/compression/lzw-gif/lzw-gif.factor
index 1d98fdd4ee..01e94d5114 100644
--- a/extra/compression/lzw-gif/lzw-gif.factor
+++ b/extra/compression/lzw-gif/lzw-gif.factor
@@ -13,8 +13,6 @@ SYMBOL: end-of-information
 
 TUPLE: lzw input output table code old-code initial-code-size code-size ;
 
-SYMBOL: table-full
-
 : initial-uncompress-table ( -- seq )
     end-of-information get 1 + iota [ 1vector ] V{ } map-as ;
 
@@ -22,11 +20,11 @@ SYMBOL: table-full
     initial-uncompress-table >>table
     dup initial-code-size>> >>code-size ;
 
-: <lzw-uncompress> ( code-size input -- obj )
+: <lzw-uncompress> ( input code-size -- obj )
     lzw new
-        swap >>input
         swap >>initial-code-size
         dup initial-code-size>> >>code-size
+        swap >>input
         BV{ } clone >>output
         reset-lzw-uncompress ;
 
@@ -103,14 +101,19 @@ DEFER: lzw-uncompress-char
         drop
     ] if* ;
 
-: register-special-codes ( first-code-size -- )
+: register-special-codes ( first-code-size -- first-code-size )
     [
         1 - 2^ dup clear-code set
         1 + end-of-information set
     ] keep ;
 
-: lzw-uncompress ( code-size seq -- byte-array )
-    [ register-special-codes ] dip
-    bs:<lsb0-bit-reader>
+: lzw-uncompress ( bitstream code-size -- byte-array )
+    register-special-codes
     <lzw-uncompress>
     [ lzw-uncompress-char ] [ output>> ] bi ;
+
+: lzw-uncompress-msb0 ( seq code-size -- byte-array )
+    [ bs:<msb0-bit-reader> ] dip lzw-uncompress ;
+
+: lzw-uncompress-lsb0 ( seq code-size -- byte-array )
+    [ bs:<lsb0-bit-reader> ] dip lzw-uncompress ;
diff --git a/extra/images/gif/gif-tests.factor b/extra/images/gif/gif-tests.factor
index b62565ffbc..629ab300d4 100644
--- a/extra/images/gif/gif-tests.factor
+++ b/extra/images/gif/gif-tests.factor
@@ -47,9 +47,9 @@ IN: images.gif.tests
 [ 2 ] [ gif-example3 declared-num-colors ] unit-test
 
 : >index-stream ( gif -- seq )
-    [ image-descriptor>> first-code-size>> ]
-    [ compressed-bytes>> ] bi
-    lzw-uncompress ;
+    [ compressed-bytes>> ]
+    [ image-descriptor>> first-code-size>> ] bi
+    lzw-uncompress-lsb0 ;
 
 [
     BV{
diff --git a/extra/images/gif/gif.factor b/extra/images/gif/gif.factor
index 6672ff456c..8652e049e0 100644
--- a/extra/images/gif/gif.factor
+++ b/extra/images/gif/gif.factor
@@ -225,9 +225,9 @@ ERROR: unhandled-data byte ;
     ] with-input-stream ;
 
 : decompress ( loading-gif -- indexes )
-    [ image-descriptor>> first-code-size>> ]
-    [ compressed-bytes>> ] bi
-    lzw-uncompress ;
+    [ compressed-bytes>> ]
+    [ image-descriptor>> first-code-size>> ] bi
+    lzw-uncompress-lsb0 ;
 
 : colorize ( index palette transparent-index/f -- seq )
     pick = [ 2drop B{ 0 0 0 0 } ] [ nth 255 suffix ] if ;

From 64c93d873fa71d2a443c00b3244ed09424cb523a Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Fri, 25 Sep 2009 15:12:44 -0400
Subject: [PATCH 07/18] lzw: integrating with gif and tiff

---
 basis/compression/lzw/lzw.factor         |  77 ++++++++++++++---------
 basis/images/tiff/tiff-tests.factor      |  44 +++++++++++--
 basis/images/tiff/tiff.factor            |   5 +-
 extra/compression/lzw-gif/lzw-gif.factor |   9 ++-
 extra/images/testing/alpha.tiff          | Bin 0 -> 23492 bytes
 extra/images/testing/bi.tiff             | Bin 0 -> 8872 bytes
 extra/images/testing/color_spectrum.tiff | Bin 0 -> 31484 bytes
 extra/images/testing/cube.tiff           | Bin 0 -> 936 bytes
 extra/images/testing/noise.tiff          | Bin 0 -> 83548 bytes
 extra/images/testing/small.tiff          | Bin 0 -> 27604 bytes
 extra/images/testing/square.tiff         | Bin 0 -> 660 bytes
 11 files changed, 97 insertions(+), 38 deletions(-)
 create mode 100644 extra/images/testing/alpha.tiff
 create mode 100644 extra/images/testing/bi.tiff
 create mode 100644 extra/images/testing/color_spectrum.tiff
 create mode 100644 extra/images/testing/cube.tiff
 create mode 100644 extra/images/testing/noise.tiff
 create mode 100644 extra/images/testing/small.tiff
 create mode 100644 extra/images/testing/square.tiff

diff --git a/basis/compression/lzw/lzw.factor b/basis/compression/lzw/lzw.factor
index 46a319662e..d186ad047c 100644
--- a/basis/compression/lzw/lzw.factor
+++ b/basis/compression/lzw/lzw.factor
@@ -1,39 +1,29 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.accessors assocs byte-arrays combinators
-io.encodings.binary io.streams.byte-array kernel math sequences
-vectors ;
+USING: accessors combinators io kernel math namespaces
+prettyprint sequences vectors ;
+QUALIFIED-WITH: bitstreams bs
 IN: compression.lzw
 
-QUALIFIED-WITH: bitstreams bs
+SYMBOL: clear-code
+4 clear-code set-global
 
-CONSTANT: clear-code 256
-CONSTANT: end-of-information 257
+SYMBOL: end-of-information
+5 end-of-information set-global
 
-TUPLE: lzw input output table code old-code ;
-
-SYMBOL: table-full
-
-: lzw-bit-width ( n -- n' )
-    {
-        { [ dup 510 <= ] [ drop 9 ] }
-        { [ dup 1022 <= ] [ drop 10 ] }
-        { [ dup 2046 <= ] [ drop 11 ] }
-        { [ dup 4094 <= ] [ drop 12 ] }
-        [ drop table-full ]
-    } cond ;
-
-: lzw-bit-width-uncompress ( lzw -- n )
-    table>> length lzw-bit-width ;
+TUPLE: lzw input output table code old-code initial-code-size code-size ;
 
 : initial-uncompress-table ( -- seq )
-    258 iota [ 1vector ] V{ } map-as ;
+    end-of-information get 1 + iota [ 1vector ] V{ } map-as ;
 
 : reset-lzw-uncompress ( lzw -- lzw )
-    initial-uncompress-table >>table ;
+    initial-uncompress-table >>table
+    dup initial-code-size>> >>code-size ;
 
-: <lzw-uncompress> ( input -- obj )
+: <lzw-uncompress> ( input code-size -- obj )
     lzw new
+        swap >>initial-code-size
+        dup initial-code-size>> >>code-size
         swap >>input
         BV{ } clone >>output
         reset-lzw-uncompress ;
@@ -55,15 +45,28 @@ ERROR: not-in-table value ;
 : write-code ( lzw -- )
     [ lookup-code ] [ output>> ] bi push-all ;
 
-: add-to-table ( seq lzw -- ) table>> push ;
+: kdebug ( lzw -- lzw )
+    dup "TIFF: incrementing code size " write
+    [ code-size>> pprint ] 
+    [ " table length " write table>> length pprint ] bi
+    nl ;
+
+: maybe-increment-code-size ( lzw -- lzw )
+    dup [ table>> length ] [ code-size>> 2^ 1 - ] bi =
+    [ kdebug [ 1 + ] change-code-size ] when ;
+
+: add-to-table ( seq lzw -- )
+    [ table>> push ]
+    [ maybe-increment-code-size 2drop ] 2bi ;
 
 : lzw-read ( lzw -- lzw n )
-    [ ] [ lzw-bit-width-uncompress ] [ input>> ] tri bs:read ;
+    [ ] [ code-size>> ] [ input>> ] tri bs:read ;
 
 DEFER: lzw-uncompress-char
 : handle-clear-code ( lzw -- )
+    "CLEAR CODE" print
     reset-lzw-uncompress
-    lzw-read dup end-of-information = [
+    lzw-read dup end-of-information get = [
         2drop
     ] [
         >>code
@@ -91,10 +94,10 @@ DEFER: lzw-uncompress-char
 : lzw-uncompress-char ( lzw -- )
     lzw-read [
         >>code
-        dup code>> end-of-information = [
+        dup code>> end-of-information get = [
             drop
         ] [
-            dup code>> clear-code = [
+            dup code>> clear-code get = [
                 handle-clear-code
             ] [
                 handle-uncompress-code
@@ -105,7 +108,19 @@ DEFER: lzw-uncompress-char
         drop
     ] if* ;
 
-: lzw-uncompress ( seq -- byte-array )
-    bs:<msb0-bit-reader>
+: register-special-codes ( first-code-size -- first-code-size )
+    [
+        1 - 2^ dup clear-code set
+        1 + end-of-information set
+    ] keep ;
+
+: lzw-uncompress ( bitstream code-size -- byte-array )
+    register-special-codes
     <lzw-uncompress>
     [ lzw-uncompress-char ] [ output>> ] bi ;
+
+: lzw-uncompress-msb0 ( seq code-size -- byte-array )
+    [ bs:<msb0-bit-reader> ] dip lzw-uncompress ;
+
+: lzw-uncompress-lsb0 ( seq code-size -- byte-array )
+    [ bs:<lsb0-bit-reader> ] dip lzw-uncompress ;
diff --git a/basis/images/tiff/tiff-tests.factor b/basis/images/tiff/tiff-tests.factor
index 9905e7ad79..7a27a98251 100755
--- a/basis/images/tiff/tiff-tests.factor
+++ b/basis/images/tiff/tiff-tests.factor
@@ -1,10 +1,44 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test images.tiff ;
+USING: accessors images.tiff images.viewer io
+io.encodings.binary io.files namespaces sequences tools.test ;
 IN: images.tiff.tests
 
-: tiff-test-path ( -- path )
-    "resource:extra/images/test-images/rgb.tiff" ;
+: path>tiff ( path -- tiff )
+    binary [ input-stream get load-tiff ] with-file-reader ;
+
+: tiff-example1 ( -- tiff )
+    "resource:extra/images/testing/square.tiff" path>tiff ;
+
+: tiff-example2 ( -- tiff )
+    "resource:extra/images/testing/cube.tiff" path>tiff ;
+
+: tiff-example3 ( -- tiff )
+    "resource:extra/images/testing/bi.tiff" path>tiff ;
+
+: tiff-example4 ( -- tiff )
+    "resource:extra/images/testing/noise.tiff" path>tiff ;
+
+: tiff-example5 ( -- tiff )
+    "resource:extra/images/testing/alpha.tiff" path>tiff ;
+
+: tiff-example6 ( -- tiff )
+    "resource:extra/images/testing/color_spectrum.tiff" path>tiff ;
+
+: tiff-example7 ( -- tiff )
+    "resource:extra/images/testing/small.tiff" path>tiff ;
+
+: tiff-all. ( -- )
+    {
+        tiff-example1 tiff-example2 tiff-example3 tiff-example4 tiff-example5
+        tiff-example6
+    }
+    [ execute( -- gif ) tiff>image image. ] each ;
+
+[ 1024 ] [ tiff-example1 ifds>> first bitmap>> length ] unit-test
+[ 1024 ] [ tiff-example2 ifds>> first bitmap>> length ] unit-test
+[ 131744 ] [ tiff-example3 ifds>> first bitmap>> length ] unit-test
+[ 49152 ] [ tiff-example4 ifds>> first bitmap>> length ] unit-test
+[ 16 ] [ tiff-example5 ifds>> first bitmap>> length ] unit-test
+[ 117504 ] [ tiff-example6 ifds>> first bitmap>> length ] unit-test
 
-: tiff-test-path2 ( -- path )
-    "resource:extra/images/test-images/octagon.tiff" ;
diff --git a/basis/images/tiff/tiff.factor b/basis/images/tiff/tiff.factor
index c589349dff..da03f455b5 100755
--- a/basis/images/tiff/tiff.factor
+++ b/basis/images/tiff/tiff.factor
@@ -434,10 +434,13 @@ ERROR: bad-small-ifd-type n ;
 
 ERROR: unhandled-compression compression ;
 
+: lzw-tiff-uncompress ( seq -- byte-array )
+    9 lzw-uncompress-msb0 ;
+
 : (uncompress-strips) ( strips compression -- uncompressed-strips )
     {
         { compression-none [ ] }
-        { compression-lzw [ [ lzw-uncompress ] map ] }
+        { compression-lzw [ [ lzw-tiff-uncompress ] map ] }
         [ unhandled-compression ]
     } case ;
 
diff --git a/extra/compression/lzw-gif/lzw-gif.factor b/extra/compression/lzw-gif/lzw-gif.factor
index 01e94d5114..8961abbf44 100644
--- a/extra/compression/lzw-gif/lzw-gif.factor
+++ b/extra/compression/lzw-gif/lzw-gif.factor
@@ -45,9 +45,15 @@ ERROR: not-in-table value ;
 : write-code ( lzw -- )
     [ lookup-code ] [ output>> ] bi push-all ;
 
+: kdebug ( lzw -- lzw )
+    dup "GIF: incrementing code size " write
+    [ code-size>> pprint ] 
+    [ " table length " write table>> length pprint ] bi
+    nl ;
+
 : maybe-increment-code-size ( lzw -- lzw )
     dup [ table>> length ] [ code-size>> 2^ ] bi =
-    [ [ 1 + ] change-code-size ] when ;
+    [ kdebug [ 1 + ] change-code-size ] when ;
 
 : add-to-table ( seq lzw -- )
     [ table>> push ]
@@ -58,6 +64,7 @@ ERROR: not-in-table value ;
 
 DEFER: lzw-uncompress-char
 : handle-clear-code ( lzw -- )
+    "CLEAR CODE" print
     reset-lzw-uncompress
     lzw-read dup end-of-information get = [
         2drop
diff --git a/extra/images/testing/alpha.tiff b/extra/images/testing/alpha.tiff
new file mode 100644
index 0000000000000000000000000000000000000000..27215d6f0f411c1746d71c4daae30cff6453d031
GIT binary patch
literal 23492
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
R`piF{n$3?jfkqaee*<IFeQE#z

literal 0
HcmV?d00001

diff --git a/extra/images/testing/bi.tiff b/extra/images/testing/bi.tiff
new file mode 100644
index 0000000000000000000000000000000000000000..ad0ce97cc0cfd91ba2c89acb3435cbf255f2de84
GIT binary patch
literal 8872
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
XZK9=>kdUAmzM%;>SW|OfY$*6YG-qSv

literal 0
HcmV?d00001

diff --git a/extra/images/testing/color_spectrum.tiff b/extra/images/testing/color_spectrum.tiff
new file mode 100644
index 0000000000000000000000000000000000000000..f596deb0f23491f310fe2d3bfacff380fbce2fda
GIT binary patch
literal 31484
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
a0RR92AfN*P1ONa40RR91hyVZp0000>>$`pc

literal 0
HcmV?d00001

diff --git a/extra/images/testing/cube.tiff b/extra/images/testing/cube.tiff
new file mode 100644
index 0000000000000000000000000000000000000000..eef52e32d8a421eabd24f55e70cf24d0ded05318
GIT binary patch
literal 936
zcmebD)MD^qVqj>nf8fBOBF4+!!g1<=@EMV%tiFyRx>tk$e&y(KQ}F+Bro<z%%`xDB
z0FMwm%cSE9eG^y;n_2y~i@g7OC(T^8nbSK#c#o(66Vt)u{s##S3`})<AM_vJBKYmg
zwEgoFICZA})@87Ku;}KV6rVVTxeHcIu<+U_!_c(o{ev5QeNUD($X{Av{BIpY^=StF
zQy~(MW1Bk9C<reR6=Ub{c4o|4_$HJ^zFm>;#STWkOHKNB1>6sB;tXoCFWTDuhbJI~
zVa|gU2Mp|@*w{mb4tFTr(6nf_n}5NHX&J}IeXVU5+^vOL7%aMY4lo$7urbsyID|S#
z$Z<$qXApC#P*C8ss5{kn`iIiT<1Cy!4;mao1W)XJJjYdS0-GAgd(Q3${mWYf-xMpX
z-Vw#Uz2O#zbhC$|Q`Uku##2p<51X&CEM(Vg_|cji{i<p1LxENAw!P}&sGjSg_^QZ0
z--4miWdQ@*^9F{FWX|R6mMuS8n@h}ow<yit#krm1;I*{v9}*Zi+d2<^D&P0Xh)bPy
zaZee8>_diy@+UMLZ=@@<H?C=7N}ME6vws2OgB*)zGncr_KP-qjwC~aa2X%#RolVVi
z+gf((pZG9=;h*=iJC`yh7H9E@FJIeT$Ju&9K}ujjZ_B%~Sw?RzFfcZJuFE^C)+p$#
z>>-h4+n_Ezhk-eJ^NQCD3;{+>p;uct801WzoXOt&de?@`nNM^b<`{4|q}Vkm331u3
zYGBBj6wLm+?3JQu;Iedq(m$IM&b>I0=D?tw#bu_jJaCqS{KL1KninXDFfcGOGcYnR
zFbDuKBNCel$YueGIWaRZFhj*zfqXV78<+qYxS(v1eqKf<2B2vSUO@GNj4WU?Ie>g2
zBsHQ?HppBtD7yj37Kf^L0U9dB$O_gQ2Q)_-%1#5aWsuC#fU<$Y42D2^t$=hMkYfuK
z2f57)Y9^4$5QHQS;&VV@QE6UYVp2}3ZdrbEVv=4-W?CA91J`vepb|zH?U|dHp6Z*J
yo|&AjV5VoHXP{tUu5W0hZ(yMiXlSO8QBqQ1rLSLJUapr3QVGOBm3sL_=?nmz#2CZ?

literal 0
HcmV?d00001

diff --git a/extra/images/testing/noise.tiff b/extra/images/testing/noise.tiff
new file mode 100644
index 0000000000000000000000000000000000000000..2958b0b838ee75c052dbacdc768bfe01dcb4de6f
GIT binary patch
literal 83548
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%0Ap;E`Y1%DWyoOzUpWNN!a5*0(zRjeD-!XHD`
z(sT@2yTugS1g7uE6ttgMuuFd7BYhpP+oS1<J2^OOV}rO};y?ATQM|7fR?p4J>{z91
zSOS^`FO}@jS!8=Mk5m!j$oy%?r1Trpx9KcCp`xtV)sd`$HJS#($NlRz@kPvhe3rYI
zEK97>vk4X6j9MRxh2o4&p@eVI8bWlrTx`EL_V2R3-ZY9yQ47D>9GP>{VDBq+su)_o
z2Xjm+)ibx!fyllA5NA77VhHBSK+@lx|MrbrJj=plP-q9j2JD`0aah9rqg)WS@W%Se
zLk%Jq0W`<~b`8>!hi3yFRWolqn(**%G8DMZoIdSI+I0}^gCV{cDb8(Kuz?tg!uvu2
z8J|B)uGk2i79Ij5O?kaEbaUO;f8D6&y;H}(sQmp*S0)T-+lwEZZ3Bm4jPyf0Xso|D
zUy}xxh8Mhlx&GtskcS2J@HU5p&z!DFz}G_|N4C$H81woNb87b{&)@A28a%>2kJ$+b
zakC*0>Wm-%Is=2(3IO9^*128jYC6Wc+T>I{cvHIA04x6V=it<oMnDojsaODof?1OH
zcV+Aie7H9qr9O?;8dzXC<I`;YY~J~^v3{|wD@45ABB;!HYs-pzu~4c9a@#?{?EpK}
z+`%{E4Ai3i8<OtC0$P>~yvD3OQI<>V6Xa%K6ke<Y3qbT``)+k#tJh5I*jlJg=?JTQ
zi+Cv_{N1lr_>eet*GG$qivFhgwKD2W;N6E>5YFw%Gtm797Tshw-C>-Zt-%l^ElShY
z;I)hN$!5<z)gG2u7xBW`Tu+`H2KH43;KwwX;QWgiRokq)__qK+`F?BcMBv+w6*W$K
z{54?bZWwg8Ga-WXecy=W{?&OgYyNG&32CdOi1XoW$6H7PVCtYjAGV3Q6ga%|W@`Px
zZyxuq-YwI!nLGKP(B9aTieNJ|z5_p2Fp~M3JvG(Frj@&)e83{Z-7qKU9G8XoPh7h)
zoY}fCqLd9=;-g(r**!qXoAeiM1JNv+LYINq3ryVysT0(^J6R>o81&S~^YA2mZzln)
zVl^8YZ&$w6*8n4~dgw+u$F!lp{$mWBEYYQeJpx``--bQj_tlBPm0Ea!U%83@?QXE+
zoGfsH8%44%5Rh3-pn>$k&`y013#{Kct%3|R6B(x~tIo4{b>4mHH<xMVI$ig!PBL!1
z-P+f&$fZ871B$jkBxU`MH1SA#<rc0aBNBr<g5{21tNmUhkh0FaK}0uXE#6C1qm?_`
z`gaI1%Gp5ocfVf!bot#wy&$oOVCwrz<E>8y7coqvLeO|yGy`lQe>pgzT1(AXK?X7w
z%=t#(T!-X69*jp`uf5i+d1rM^W%EP^jJn7h2P$_NL`|i;6&=|tX}hFP0nzV+<14qA
zB@;;;bL&m_J)N1a;Y(5Mnj;<&daQiQi3dy(zs=4lC0AcvM8~LJp8LC;HgjQSVtWQd
zEpyvgljGev@D>pSGU-l$l#Es?P(KffIF%uiBJL*OPdL#Zm6UHsB4F_VJm5lN4@v6X
znE-4?M95aENb3Tij}{v<!`Qw}dGG+fkFmFJnI5c$R}2y^7!!Rb@BsvC-vWpVe+{3s
zMO{V^i5@#}d)?i^fjF40pl8V(HQisw*65G=^hJ2u3;HO3MDd$H&Qw<OZiWNoQJp~m
zNG(^K&RRU&#oqIPQ-IyY+T)!4+R_dBV<h9+YivjfHW_Dd#9Wl0D5}@NS{jCAdL~ID
zwsbEbIrELM38*LoFz;r|hln|iPi|Zi0jrk)LTwCS#Kjm?1CE4FWbfR+K^T5N1g~ip
zLH0f%OK&G;54dZL7ZNTSriLlbkg#o@t`{Hwg+yp@C+YEyZvdkAb)2TCmU@7JtI(DD
zfLct*+RYkrz|Jhg<b$-jic>xstQ>1Mu#$TDo~^FRjpy!qU;ozI$1kS<V<hk?b_t}i
zGbLaECJ^~UUM>Bf0LmT!Y5~=VfV!~QXc}XhlXGXBmlWT0TKk2UIW7nuP=%k}#d56b
zU>=rtp$25YMHW{`nA=A)uFe4P?IH|F5d-*%28eJS)Dxk>=hkPNLr4R_{rn#!jv}G5
z=Dvf46myy(&Y4id{X9rJpvO0^kN~t5m7Ivv?C*`C&6Noal1FqSBV0T8>>(r64D4^S
z!HL1J&Nd!E+n18$y`kFLMFb$5w%23`7h8tN*~D429_**C_NUOTr*Lgw7VDzr2_Wz`
z5!AfYB-OW^J{H{$u)PwoBIr{=+?Kih6Vo#99LI>|^z5U6_$0_XF(1&r^kGYRS15Yd
z%KFd<kdo=*Y*P8xU?qX1%m5lUW0_~W!{U4Ghdh%80yWaMRGlizGl@QXGYXhrwjCt-
zJ}uoS1Cf~6hnCaH-JIosceQ}IzZVcs>;;s$iSVt|X!t&wqE>s%cTW2gL9~}q-FuSK
z!g@%W5IkAqk+_~WP-maH)ytVr47w%VtSPza3&8jGD3Mx!Yo%jq{*c=_FF-=C^FFC9
z_ZA<EQO^zVofAHR_(6A3Si1ImQSDT>J{gt7XlD@g7l?@wUYo8CCTv&-b8ao+H_Dd`
z0pwF6PXaa#Tu<oj-A=&(!x`WD2s1(fl#y36&?D5=&g1W_sQd=N3513r@2mkkNVfU%
zHrd<h`z;(oqt>1*{DLC)nt;d+v}yWYyKpZ@?}4YEB%#{@FLTM36Eo~Z{0p_dm;RX2
zu3X%if0SdsYzII+J~R4|fuHrD{w~lX+5jBB&z#$Y?@mx5Y4(IY)8I+4w;{g|LC>tV
zyCs<XpQ`t0=UnFkM#WhXxC^-X#g6yWJPp9n(^p$jqtQ<2>US62IxxSg@p$-!_#lpX
z_Y%5c9hp*b+#7lnYQKVv7^P|#JrKQ~T;rUgs&-SSU1)6Dop3<{ktQI^bSIa_rsNN~
zV9m2PV42S8O>kh!nfaRpdJiaH?Uvo2wE?4}WIgbXU_RZ?z-`n{UXZDNI`RH#&qhII
zZc79p?6ib-wL|cG((*0pQwaviF#!Cg0;g`NTK=h5vJ6nu!{(BtX+(L3<2B>i-(es;
z=vKtZEd%L+L>AB4*jv11fDx_1Hv?qfSPYv_BHDo)L=&ry)D0%64MR{_XACTRf6BBD
zM=#$c@ou89h+07~Sugpw_I>QtI@4l%`Q#OKEoaKbtaxftzpPG1XJ51^oLjr>{TOYo
z1cT0AM09P@urb)tkWK)1oaEh*zGqL%9x7KuF&23o-0F?C0^k6+k4WZTSbQCp_fNT3
zgovK9)$D_!9QJ4am-Vqu+#DCMhGA-ELNnO<E^mDXvG4tUlQL4=v>pWvz6L;KGJvUE
zJ;$uV_bmaiKqv{wXt_<(12?&fVQ2v8BMjeSeYh=51k25XZt_#4W7j=zS=eHwGq%^&
z)XOxd+o4(R&};&u9Y7L}DZshT<N*!BVn3Q@kZzW7Oniz6-`kYtG-m;ulIVJFB|s10
zZ_V9IY+h%Y7epf%MDFTKK0v_H^FA~_oo4_{emwyBB<_{1m;ex1B;a3Wz6Q9nzY?)r
z@E!j8PL6ue#o%1qGGNEO;VK(sfYWZ(I~)vgK3Ke)iREt6J8~V~AJ}Rq>(4|TQuKQ`
z=6<FOet+6ggrDhpFU~tlo2v(uq?ObeWPIo1Mp-T<;(6iwMD_TKramwIZpZ{?%*+iF
z!!#4@tS+1@$~b8{1Gr5rQIQL}(gVHh0$pLs7LiN>g6RNRuXmKOoyDQfavB5*o%?9y
z!x?`yN`g!se^n2{_ulu)Ewo#fW7pS17k7A^4RqpP@(^F}l7B=q#pXf$Tl!u=IPky(
z*j%y@wEz<xh8{#6=v~7d^2#!K%izfWL(#cMHF2$dc+X5Sxsrq=gb+e9;bug{fT)PK
z2?9n$j24wrY7-O<R4ppCDO#D_xrtHH;ynShXsxBzdZ@K_f~cvrHd<?`$M#InT53HW
zv>qF+2fz8&;xAZ>Kr*xE-S7MSo_&}mo2CCHLAH&ZNJieH`rn7Tkt$~rmd&y~MgxuD
z>M@4pcDx@`6Hk={SLDl`V#-mQ+F+6!3+)%<i3;p?EL9=$nGy&^98?@d)<*Sb$=r+T
ziC|)I2hilaW4eyy`*`Gl?6Q+njH;=Nt9_^>xpn;S$#las+E&Z`q<2bXE~_(LtO05t
zDWr}l_?P2-Wpd&k@kxnR-}*`?z09Smae5WFy#jiSm=8#){~xEf`hXxX8bj0zKwDH8
z<KZ9Vl5pIglgCpRMbK5T&xwGWtZ&b0^;ZuD(0LRPjyz7G=4lCS6rmiikx4c5C3H(W
zw+<wY3MpqAo)Je1;BcGVb}@?J{?X}-G97%PsZ1mvjK51SGk14#cl_wHv;3F2WHMqa
zWl_)RA^g*iQ{(&7Rh_>;#6f^vmhpyDHBY0%m$&+I#{d3=MgtcyHnO@7a{Z-D>b9CX
z$sw(R@C`XJ90$|Eg3}`N4XN#&lt+DX@`}Wl_OHC_uOvGGdJ>SYB=}AM^9u&FQpOsR
z`Ud1SxkU3q9iBTgbu#2$q#~4j;yllGIGWlS6DW!G)gxi9+*U7vYJ}h_r?QQECG`pp
zOU(I<z*U~FJuZw!Q<Xwr`OnbB7!XvATLb|0s|}ND8W|X1`OjV<6av!;6>)q{Q3pNJ
z^FwJn<|xa?Z=Pb_FENWpJ1Z_>^d?NMT>E&+@}kt_L4>@o_Foirv-y=h2(uA_-D>RZ
zF;FXNI<*y(s%=g+(WbI>#`@$b4+?YcE#r`-9NT7vpLV}3VpDxIjv4EFp`Zwre^g?s
z1XvM7SsCFWxi=l{s*KCay@N|3bEBxPMyzR%(f6ai<5Biyx8WY9hE#~1FVMVx0#^8P
zP_tNR+Z(58jrE^gS~(FTEpzl8vLRKBxjV*pEY376CfN!4<lLUiarf&{tvwZkPhhtg
zdiD*dvnISm2&^FO;Etq?ioA50Z3paIga&RhY$^bq{?T_bNmHU0lhJcvDYGq_G{VG)
z%6wBnDGE(6$7IKb*T%q3QGb@?_YsvpmrLF=-%VxsPOAKU9{(r`o{DV;nM0?!WTj%H
zuWM_CnyQl@t`{ff#^AY9$f_g)If3NyL!GFpgF!u21x|ADRUF&iH9l@EzCvw#5qE7F
zT$!8TXVjTqux*wDM2DDK1hDT@h|@AiEcNY2=+77LQ$MNzSfwN}SDyEa+%IMZ+5~~_
zyToR;sg^-1;%r4K^K*rNRAHtW;tq!I>kZ*4Yq8Kcv+iwhBF09<XjZeqk|Zcs6S)71
zndX}bE{)oE;!Ja{z$fD4VuZazeYa)PT;-qUTwl*xF>oS*s-@v930-#M*BLD<q}T{o
ze<faDAqZEfA*srYae!Pnen?2B0}ZT9x*ubnUT@18A6|bLpU<_}|H9pn`9ZAT66;^V
z*0gfS6IY={@8=zxnCLu80JUZ`fuiBs<S5fAbr_c(P0RJcQvLuZcv*%|XOMIG=G=rE
z%^bY;1K($LzJH2{7hSd&5JXdP(|O_bY7FKqJjExEv-Oi>v}<FAk8tr}?Sk}Z+zXQr
zqx{dU{$)wwLXCNHLSkjz<TK-`-?af5$9IgTgcWmo$}~P{cnON(TyoN8^A!QvrVgXA
znnoyGdyw?<b}nId+6C0(@nJ#z?jeAYD&KRqPcB;8|9!Ve3GqMjJyrmiYg*{hEQyAE
z31O*(bPC9GYQkV|9xCvGDF1F5NoT&=g;;Oug!QS|X`X+#G~h%1kLi$-!1Qfef38@s
zhz{%(m`Zq*kxTI7%@5V3PXJ39XHP?k=i@JL4w_F0zzGGGt^kSAzFTaX-?g2Lvkk(U
zRv}c%(of#MdiD755dam;#?Oj>_ojp+ahhXF(`xpQ45e#7WV)OH^-HJ>*q_MKUx_kd
z2-dI~qm;*-090~(f;cKy(teWX)9?MhP~3Gd%G0ymw^CZK;Q3S4|J}2tvk$?`rM4@I
zj!^&|OC+~XdYk^F?uyA95P4A?<|jb^-n)B<f2>)*pq^E7Mt<%7)}dU**Lgf&t}I+A
zz;`^t>Z43o6ydZVze}HS=ZgHztFkZT(O|lO5X-1G74_;I^FwM?XT15qanp*Z;XYt~
z85Q0=j;xvd_Puo)9fN9(f~Los6PdQrC~7T`(4o&d?gvt}{?3N5iA|kW`6AMNOO}lf
zsZCGR;nwXGAH}TVH&N!Roe8bv0n<$}Yd1f9=+(Sm#Ls%7#%BR+HJ9Ge>dT^i=|bXa
zd~#@yU-&Lj!w3f@z9PhL<PG139z7Rt{4Kuom&~1of<T=-EEQ{pQ?V^7_H`JgqVF#g
zppVBtT2anP7FO~VF`ZK>m`B-Tv5j&-$ZdPUcjc0jJU&?{ZfcA1UysY;i-8Pij7gnW
zV#CWMgk4MomFD%_fQe%|66KH7kmX7KPN@lix7zpHM%PTp6XF($nIC6YN}G1e{N)0_
zaWCwQ(Jup-VDD!~a%jBLjIzU5g}xuoQRxs~E7yC)nt?cy6q76aHSBoMAtZjsuJh}6
zt<KmpV;hwS<B2MHsNlpg`ZdgjPsWEMG2|jZw5c(i2bCzHm8a*eWhFZ0;VW10EFSb%
zqpwvRHoB>YDb#eW-kqcYubAoTNF*TIqH!hsed-+Bttl(-34HgN{>oYM8%(JA`jf&W
zjLiW#YFn++)+)eCSei_g{~_dG3pCdUD1hAC0>t05;blS!pqF~$^0Maqx^d}Ae!}fj
zC{&{YJuy_G(ASATSrXe-p)g+>I2eW1L<e*X$4ad+9WZwUs}cp!6G>Rbo8aX`PvVJ=
zNB!yhIxCbbw{Qcu-#_)~E+6Ab2|PZWtV+y1Upw$s;&S`Sy<$C$t=v8wmWznGPIrka
zun3}JPW$_$=Hug2C>beZ6FbzllR&dQ`^~knEexeUPZ3CF;-!$5D>oUV%tuh$MkYC`
z3dmIC6M=8pIue`Yr{ey82-{Cj|Cxls_Y(A+&b(hXDwN~H$`hR#z<(?r&w;^SC6Rx_
zJR&x&M*QY69}Ua>S~W&jt!=3q0yP7m*^3&;EPn+=cm>2}5p+{jU>B0Q#Zd3tvp3%N
z_p^W%`PPs^t&P*4jsrE;#L8k4r~sY$IT(i*(PJ1eaY-x@O5hK~oPQ0ni4(uM4>Sro
zdMgAXh3yEZd!@_{(lKbsan`L4@J=P*9;HBN;6DwWSF2ZiT3r6GbXSNqrjxNGtKl=Y
z3Bdnle3x(vE&QPt>W7x8)W6exj>?xH;}!F-#CyTrNnh=zSkKbdzO1IdO(FSb?!i6h
zF{pIUhlTqN0gSFJqEk0@9SS2me;8WKJodw?tRCh!g^6F0sW|V&vc_?f3ND_i)@G~)
zy1Q4?vP2)evvSrq52JG%RX{%djR${a9X=VC&beE1def=2Kh{JaT;4w71db&@f}7aw
z2f^kYu`Q|I1X+q|tm^Sf0~7?&6BOUw8$3#WyzjGzkE`a(d%x7q3ceZpWSB8Tr$6o!
zoC~8b=ji^`a<5kuvTUS_;eywUp+!+gq`$jIDy~dapS)QR?yKj>0I+Lg=lS`jgk(0s
zV>S<`Hh5ekaDmrXR=4cn(QC;(aK2hMj)3<R&fnvl_juYK5-f^iUL--a`qz_dyVXP9
z(yHATdslC|F#CSK{=;Lxn-0jktq+q9<r|u(5eP@y;6^O)6vpq@LOg<HyFO>!(O$Uv
zAmmlB<ND2`s@*2eIY|9m+~{h8F|l$g$A{E{JtpXGJPn%+?<1HIenTVD17>-TM8kj;
z2wty@Lp$o_{2@bS293nPf>z|@aQ=rlXYCjJDR5V`&}RaxPzqu+>_~~mr%28N`D!A0
z>ecsVQ<<i{T-MOq`h9al#R394`%BfhkJ-qo<jdEK(e8^DumQq3xq^;yjhl;4xW4F5
zRt{);XK$;Ty#?%<4HqXSP*6G>pt)zd;<?Y-XAqdKv!Nx$e#X)>5Sb2mca5-|hxE73
z4y8ieS%(h43y&lEuidIF#5k5^0Ae?ebpuZMszZ0E>p+s+2fw}V>%PJfJKZSeZpF9v
z&J$gn%AUbO!lSh)0Tpcq$lw5I@1lG7XA`~P?PRjAc)1<@X-kt3hZ5sk5nH>_^)V+G
zaP&RkHFOBTD>{%F?ZpzhC;N)&gGd@+<H0vL+iG+lSpaP6Y5<z*@}-Juot!IQ<-hfw
z`ZvnGkRZSrLx#h8a%T+E&ZogMaJ!TVGAmYZ`z>>NCO|~93U5JKtt9}~kCp=FU@t$T
z3L@zaZO&s{n6HB~dM?O~^d=&>yU$BhyUPif*bU;-zJ4r2yQ)X44y9#U-l5@z<Tdd)
z`|fmQ6`i;!YS#7ae1l16+*>H%mDq_?6erUMMs7=!_KVpC&vS}&d`8~DJMjQ!w)CZ_
z!%`y=y>Uvx<3<I+&?Ej)I-t`I56LInY*%wV@*QyJ+l>eEh9~6FgUX?H`cDQ^=R}5)
zN+TZ$m(TF@oq~~JROoe=G*>7k_xp7F{@NSU@6*L-@XfL7N@iV{c7%uR-xyn)HY;E_
z1t3$3L-bO>v;e8*?)nx}o{VYy+&GjorbT*7;;>Bt$rxaU>wn#)dtIEDJP-IDA_dPw
zitb^V*erPcd@wQjy!8wFC&`JI<ZA`K>;r;@Proea9Z}yMpD(F90@Q;qRp*E4P!eC@
zq!Q$T73<n4SvwALGn3>qcU1KQBpAh^2c0~kCI+xmS=}9Gv577}!QUcAFi8jrn0cRf
z@LabukQm=Y+ujLr-2+mWesq%kq$FY7*#&Ys_{F3)01cy1ID!Had?KZQY`ia@zGrWb
z>ouM5^seL%VBabn%4LM8j+bYEWc|er&ECR)0<bTJxRK@3?*^}0UlsvSvn@JVLlQpW
z>=&zqk8U*+9bZN#N^`ejRQv_4M~v}VbSgDr|Jd9F6C>JYTsf7X-c{W>K6cw*S3qH7
zG(a*MP~*L6b0Y7;MGPxP1Q>`F%E5pDQn;u6zI@XG0xbSQkLKiOpHF}-$|h`o=D>($
zZvViE?|Omq;$01c=*=ObBRZCm5%<wZoleJJ9I%YxCw08h6y6~X;8h9dO^0{Z_5-x{
zAj@$IwCY#PA9yt^O(r)wqbpv{ZY~*%g-7|sbNGVJE+VXn1h58+`XI&m7g}JuGVW6F
z6~S`T@<yuU_2J>8@#kMiq9Pk-(2xn!k<Mz?)o8!1eaU0|KEHY0kr~WT3S=iXIV;;U
zmTX^;N}c@(_^bfm!&6pSR?H&SkJAUwEHkC2BUoJ;&!4OQvt$>5a%kGM3c|7rw`wdo
zdTf?BQO5?Nt5x(SND46~x*@|5><h)>$!|H$r&0)z!ur7}YooKk5Z)#u_G65b>puj0
z3MCj3$6QDPbYbe6w|>1aEqo+rZTz<Y836D~?&K!jH`B)-$BF1CesbcGasFR!HhS%M
zF6(xeL&vs4=9L_eanCoTWgoHrjM|Q0h|i-Enu+7NmqP!Fp`=yl>h6V(>Qr%6UFlB$
z#@Ao(+b!staoYin^72E!D)1Eo0QRoV8}4OmvZuC;9P`pS4)xFgR}g(_N`WOy0tGc6
z(}gJ~bR{{o8dP9*Q9<YrCUm=ID{-3c1!jOG>K)|K83tiV1c_H-s-sV2up;+lc5S^2
zd%$7VHcc|OGngaEk^**g=beCjYi$vLgHHj_u4pN6E8T{h?~y&=40LuZ$sS~E>shny
zQ6Ia%>?^c$u;F3|%&>cPw9n<uBF&TO7oMdmF4RpHo9G8x*$wrORKyLWrsVbfTxAQc
z-1><sYMG@k=FaM5$h}$!$^Ycf?n9A(-{+u%`2fi-AVe!^1;xu~;w~RVx23EPmZF`<
zm$&xb6|f?Y)NK~&wrkCkNia=&p>A1}C~XE*`v=|Ae;q{EMmxzl15G?OkdIDec!~i;
z%-i+|R}fL>)x&bZwy-LPO!y?>XdQ<|*mk<Xw?LB}=lrWNy|Dei3*Nd5KU(+@;PN{4
z@<=r>UL0l&SH&SO;*W*BiC^p9<|SD)&9w_yB$)bjXk;!zfwa8Ovod}cfyOYAd=cD>
zvZV`~1NV_U-{ckNwGERXWBMGjjB~l81hS1rAMQ}8!^D}a5unSL$FQL%Zy$^vP3`Xm
z{QjOVc7={{J(1G{d$U7sa9RN%r+Xsf=v@)qH_IdGBc4BL2P<9Pa))URY%)OfQwZ0<
zwf#)5(i2(c>HwUv8Wq*hg#*WMgJXC+0hDx@&u*+IFmQPI3}9={(4&c-7$#Qk?wJ6a
zZ!vwp5#SvbJ{B%}&sEz%{BFss7as}&UF{N>q_s7*A6S6BOzR$g4P~!kmBla{b3N9#
z7?H)y&^UWfgX7)XwosNWc;dvok3Spg+PjFboBg)XTVf2rjjOe6sXh4SXY%o^q?awe
zXxH$3$driaCfKc3+i;A_t7J^1#UKqn3^>37M_D4^w(llln?e?MOA};W3vl4HZgx~Y
z)P@?IAO$tz%)U*;Ab=tpl8-HC>LyI-<=c(GIj@Op+(&~)_H{p@)@h89DU7ltM-SK4
zFC)MV8L=QYvhSFjHl)-f02!|lcphj4?00RUSs#q(Std5p!$e04SfB4hraf~8xzmdN
zJ{)-kjx2|Ij3=(eG=;htrkQjmjDfA@grvF-3orp&(=Apcljke3cdUiTrBGs<C$eZe
zJBDdkbHX4dxN|&_;{<!M$J9WW%0AL%B3HC7T`^6+9S2~$5kOwuS%VR6Oag<kE%d0q
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

literal 0
HcmV?d00001

diff --git a/extra/images/testing/small.tiff b/extra/images/testing/small.tiff
new file mode 100644
index 0000000000000000000000000000000000000000..7051d58218a7f1db0b7bc72983e76eae61c81ecf
GIT binary patch
literal 27604
zcmeG_33yY*)^n3IZPJ#ml&!#}EG>{WTeH%Zrb$Z!EiG*+izuYYZ5o=5EVKnwL_`Ii
zC?c{cf;?nV@aba_QCY=>2Z93bugF6{QQ;w?g7BZYNt!e*mAt3_hrZnQPR^V;=ggTi
zXU@#c?M$`WK`06#)CFBfEJOfAUj&neBOpTrzzl$yfJ*~HW&ob;g&9zmKzQWLu16@*
zi^p<1dtuC<62RNVOWzmp-H8ag-V9*q;e`bNrv}K$@WQw*A;Cbs;8PAXB7l<tt_C<a
zfMzFyK<9H1nhf|??`I**SDlBDb`F6)ClR^}VAF#ho!5cR&Icn=aSTE^6M+z}DEepS
zH7<%zN67c7GT3S;vb@gbvN`K)c2Zp_CQEgClNINYNFY!s;a4Ofg<@s4R4EptoS}_&
zoxYxOku{XjWX(<c?$tNaNRuHqZH%N;P-<6Gb*AEJ4ytn6$SVD`dcDGsHZ+f$)2M8;
z*e#SxM>bl_R;RKtH%*7@RsxLC{4|m#an<Lhd6XJkT288M4vNgq5@zZJVkwy|%@WC^
zGLe8smfEaj5miG96(lGrBSj)5)=*4(ue3ZaKsgRWt+GN><gF8OxoLGSmtD!{H#9V4
zHHfop4kKTvP$>8U5nm+A1d2>&lhvhb%(OcDdW87oXeg)NVY0hSP&JmTtFgIVxoK&*
zqL$0kID@{W9=qFNrfV_i`IMQmP*#_dFU%71TZ98|jzO=iwK*(0SDwkDGg5q)skSzU
z@5g%U$l>FP0~DcKi3J4Ve@($goxMdvt22x4i7dU%!iNITPS9FAKq}P^O6RgUs%$oM
zUWZPTgJrZL_ZujurHIn#TvQ(RuT1zANvd$~K_5akTPY9(2=Pz`$tblMOtnqz$-q7u
zC?kL}SO$2VLFdxll9WK&-=Q-~OFQlki-q5wpE+F>l;5S>?MP=;lbzyMP)?iMp{Ib{
z@736EphHSal^UDgjXhJV$#c6+2Blc4R;e^%QISd|(G&`WDuGa{7Ryv(jX*Az%Eff|
zwB~DVTqx68oi3eKPx)jPWQ$}461DW#WCrlHk*T2^rm2*n$YHb49&Xn;oD^<gZkn%!
zfx`+nkT#Lh6r_w;@@oxj!{=AVFV+xjw_6k&z~>j+VpM-4TZZ><HSTd-Y2VXuN!yW+
zvC1-s34B9`17DsnhmK9HZ~;xA>Br)}FuQ4b2-a}%g*f%H1{Mdij_a5;usE32&pFy^
za^;D<wFRMrxkf^>rcxS{k#Yi$M9LFMWN^#jR`5hp5l<w`h8uA5Y@S3cfLjPK;N@bT
zNFn8k1wx)!D2H3YlZfCJivS05WCFN>R)+HuD2H2|Efx(C7YO7<g%VMrR4NmTgmS4=
zEQe81C=tpfib7SPSMgSw1*@&av&0ya!Bv+h@zMvN+NCa`tj1t+FD{tAz~pk4Q;tfV
z#crm2J_ufq9Uo6LmDH5hSYLtJlqdJhQ2_a+(wrXF|AxXNxpn2<#@|fi9NHn(HjCXs
zIi1*nedY?p`8D;>)5{@PlsHU!t<^<2fZ6N*KCiktMX)T75wSVTO^uW}4`L^+Q!qZ5
zuiUJ&>KtmDwbo>GJ6aFE_R75czu5|bYBb#>Qs9!dkpg3tbQ8yFOfZ-DjNL9ipt1h)
zaW~-$zz6fGZDyOJ5|*PB4otMD08}t_s}Tj$m^7Q0El@}WbPA(bCKP#65smSrV!%s;
z9-3?(=91AVjCdH$fPoY+*>Z`1PGPhI3}YQqhz>F_#15PSJ){bp%7GG6T$dOk2~Ke>
zVu&y}1zt#LUWhN*!fYtTDQF9+2P30lIZhRzC!{ouLISW%gz++nMUX<o$`&d>CQdQ0
zLXLSAa!jL;V;Y5mrcnrK7)w*o(i93@qk@*Hz?z6)6~Ke2#)C-6lk#LdIZwd@(+Gt;
zp@=6G^Mu(vh;l$Al<^=W!a7|9ffC{*gir}YQwW9-Hz6Djk!z&c0<lV{C{&AKX;G9d
zQ5T4cq!NWjArz{mDsN}D>apM2!|lF@p7tlimg2U)-cqEby$zO_6du>@p#yx-U#wND
z%N@2_69iXh#jpZWTd0-_6;f%YC=1-UUAlJV6q}r|ByZyTLT&ql--CsxAb1Mnw>*aV
zcs#NB_e%Y0|6VnK+;Al!88>XMu(?9AKuE-4?+TkMBnyN@9QLlTxk9o)NW@|93Y#k=
z3xq@*_O7tGLb5<e#9{9Wn=2#>ghU+nuCTd6vOq}0Vebl?D<lhqL>%_6u(?9AKuE-4
z?+TkMBnyN@9QLlTxk9o)NW@|93Y#k=3xq@*_O7tGLb5<e#9{9Wn=2#>ghU+nuCTd6
zvOq}0Vebl?D<lhqL>%_6u(?9AKuE-4?+TkMBnyN@9QLlTxk9o)NW>j_7uUbBnX<xe
z<_6fdoC=$)@jh#Lfwq*zqPI~;w!-zNaq(v_PPoM1-F4OK>BblK8;<S3^vthtSyvLo
zTFm5B%7J&p<fg&q+BA}~>R|(`)tH+$x~eEsPH&LzqbXBYjVmuC?PmD1ezJUYL5WsP
zre*T^Dm!e$;`23C8nV1ZTUkZo4Z8fok!fV$W@a6xqWACup_30A4D6J{)l>q)GJzq>
z;4;A8$Q+OKR_XxOVA8wtxSX7Nswoe)0cUxH*&VPCJgXeGnibKTle5Z8i){|mG#l&&
zG{eTa96qK8HZObo{4NvTEuN+KY#{dWaA0R9h&KjQH`!L>q0QlY%eb5lMVefcMdfhl
zn*2g_I14HPqfe=u$oTbUVIiQjIZp=LzGwi;?NB4w^6H|B%sOL>MnDfnq>Pj!4>myh
zKw3e*Ps1F(Pi@%qeXBhYuq)G7Sxb}K?Z-btKeW>*Y;m92V0VlUyq&tDQm-?EEB|@A
zA*ewu0|D%R+l_;2h;k<AfIn3{YNt^xop4)5BcH-Sp7Y0#NH=L%OK;pJL&E8<sq)OT
zb{)+76HV4y+eF`N+TJW(URqwRDaW*G*uFSYXQ6!ID`4gfWgfZJ3BAMlv+az|$??sN
z*yO$$6T`Sw9kc?Ic$X0+lnZuo2d*l7{K0D-?;P3QH13~;g645f%cKo8w#?)KSg)p4
zCYw=5Tl|k}?VGeAz}8k>rujB7cW}qHTJ5O}lif}iWx&V^O7Hq3dj5abK-^IQ;|X%U
z^;ED^cU<II7K^h3*8{*oqa`wFD|En^`2Qbvw`e8^gMV^I2yS6pPoO(5Q-}}nzz;q2
z0^8T8H$lr}?R$WtHTpL505F9Xrbl?1{X<9Nwyxb#!~O^%+OPj;tL{%3qi?B&ZHMOn
zT##<xPJsRMMCn^=Vq0JMp9|A=yW!6ps&Ce~fN(v!lDr)rV1lO`@1v5cTnmrL_`7ZY
zD%$(lB@kqZU|D%<-{rdC6u&kSg6pK`Ydm**o^=Ccw>*P&^vK#)SKkw2u&NzN3Dnfb
z-&RrIcjm#G`V@t8e(?AFd0hHk!8e}w2&fo73Hb4T((fGx&}E(Ilum}u^uCdZrL*|G
zL?cbvttH=!mU@ZKbLbQj!t)-3OXuMfSxl22Pv^MwakUsEXwJ(twixkiYoWvpDVxR+
zUd*bc%UUoZ%!S57>Z6g+m`p#0miZ&(5wat6quq;n78kc$bmPA%!*#Rp(ZC4dwnDoZ
z`JUTrMJZqrS_ikc9A~X=vl%{UzG{clYPMO8kOyvrD66if2F^jnFvse)6i{$>D-}Qy
z1xQsbeB}^;LzQ-YpcJmfWG#b}%S^5&FBR@Ru0_|_8jG!q3e470FI6Pn9x=u;aL>2Z
zneN{pojJ7*_=cy_McK=0ChLKXZb(Zr@jEWu5(*BQv-z~fhY&{_D60)L^`jYMF)b~w
z0^W5PZ0?$TIC<E6v0QNW+pSlDxo%QLl)-!I-7QP&0<Lv4Y1{^zqh4#R`mMB!#`4PC
zu8;(Fq#!C$TU`O}5@$5qYINo*2OPDGU*T1oOPpRCbLw=?QX4*9lXgPdAF}DPB1qf%
z1MXZD<PXWtI*OvThZh%A8GWd+(^m&A5g$j5;3#dl=zMn!F}09*Mmf$Rgb&unHy1gP
z1?i9(ezK4YnNThKw73~S{>$rnG{VR4F9j%&z*o?Iv)FJ1v(?~i?IIO=mk`)!)vMr0
zYp+#lNhMUR&&qVZz-6;|%dsk`!dT}k$9cBXY|>Lc!w{|NiJ;4XC=u>RI-}JD)D>xT
z*xdG3C^o!2g(I^m7-_&0Q&@?m!z(YqK|WUJcG-qeRy+tP10WDS+15+U^$=qWF40<y
zBz*kd?PtQ_)m4RKtDvfYfYBOL>NHZVFl?RKRi!hw!gbP9W^)zQ=+Ziit4d3-<6?nP
zK6EQ$PMys$O=UJ2eU^&zG#=hPd(glcX`pI#ZnFzO&Qy2<)DAiR=AK5kCXcQ$(x>(X
z7&pNqzhGEP0kEKvHY>I@$7Qp_NOw{`$G~M=GdNNkY)p;K1rF5)9}Qhx7feo%stha)
z!71&C7<z$*J);fBUXKgY^D(OrogWP;f$bKDRLFpAs0LApMCGUsU>Dp@8p3ff=~pO7
zq(+qpPa{}fOmT_HYGc44vshgYd?ex6apTFzL-5BB92oB~oOF7py|l6jdjf*v3Q2r!
zA%?vd2>Ic-$4B1JEG{QWU%@SYCg|-B=u4s;=*0#&XdU3$0Gk_Jc8tfiNv^5KFg@!f
zJ3v8zyJEc21M_Ga51fx-gT)HNh=Fys8!QG4?*sUusct;Hm?Z$unQEdM0R8~rerC7D
z1TbEwBwHvQ#9J2bnSL%xUk9)N;21|$g&JTuhd(OD7y#D<z%KA}phaq%y@~F5GDANQ
zPO4YP$zrMje><L84q;vAFu?it7Q4>cgpjArm<uJgITMmbdy)<d1L!&eao>8%FO8!6
zj7T}?$N4$^INNHN1z=6ceAJJtS&GoM2jDMUKKA4KJp;Zu8=<X-1KN{<{UzYkeG{e6
z!Uk=*ewCnw^5#H5eOb7^mh&`8jVDl$*sJw$UaZ?eI`N6IWM;4v|Hq60Y6a-QgTvM-
z2mGlIMOK5C!5;`fcUui6JadyKYpYW~10?*1YylE5=<#a+lGa>D$rH0s{NZH8{N^BH
zB}F6Vgr}i|Xz8~SPBjD(gvRtf<MDfdp`1=zC5#1-WjIar<b%`|RixhSnCc;6;g1Md
z3B<v_ujmH<&Y~~MK$%E{WM~M=M}=rODnnIh9J&kXAxv4212v!-=sq+D%|nl(C(tsq
z60Je&(I)f~+J<(b-RMp9E_x3gL!Y2#bQ*n)E}$RKRe~TQiC7|u=tlG=`V)f*5g{k?
zh(e--s367>lL#YWCEUae;(lTtv5;6stRmJEe<NNYb`x(CM~IJzlf*gV-^9-hCL@NC
z%;?D&z~D3F3>9Mpql$4S!^oJzn8ujRc!aTpv6}HbV=H4f<6XuvMl<7U#%1`gA<@hf
zW*=rIQ_fT~%b4StwM+-|9_C!;V&-b*Cgu+20p|P6X6AY3Pb@YoiAAz9SwmRGtkEnz
zYYOWg)_m47);iW!);`wztdpz@tm_f65vdV_Ba{)^h_MmIh=zzc5sM?%Mr?`LA8{<=
zbi@yAHamr#&X%!@+2h!g+0)tc*-x=Ivv;wNuurisM@B|=iyR!88(9{qi*!ZKiCh}_
zeB>LEM<Y*1{umV<)jLWQRTMQo${IB*YH`$tsMn*8MxBYe%8BRn=O{U490R9`vw*XP
zvx9S(bDDFNo4`%y=5njJlezbCmvA?6_j5nxUW$&6PK#DVkBT-$&x~FY{bKZ6(I=yS
zib;$a6r+xr5aW({B<8u8T`?cUT#Aj29T1xzJ3iJG`$+8i*uAlz$NtzUsZ&-bZ6`yg
zdpj-fw6)XGPT$6H;`+y_;_ix@7PmO=<+#If=i@o?1LD>3y7+tIm&d;ne<J>JLQ;Y-
zp)A3YFh5~K!rKXF6C)D`Bo-zb5@#nqo47aeR1!0(Z<0DmpLBoHnxy?nr<2*q>B-vU
z$;tDQUr0Wbe4%q<=j_haof|tZ@BCWl<`ibifD~<tIb}i0ODV@we(ut<i>eFN<>4-y
zx*Y9trE8C_`CX~5bGvTtdaUcu-N<f*-RiqN)@@t2&$_d^59&Uudqel9yYKIQzDIJ8
zAwBdx=Jt50$H%FR)Iq5gsnb)RO+A=;xo5AQ!+P3#F73Iu=lNbKz4Cia?zO1b>%GqP
zPU@Z4+thne?>BmXMRq1tq?ueo?jtYsN$peI$K7XDpF@4FrlqHiPMejsIqkE)+`jU@
zwS5=$-P89%zux^y`_1ULvERr2IsN7R>-s<0|3LpM1JVbK8SvnMZ3E7xcTLx(PfOpJ
z{%J;R#?Xu@8LKls7|0$dA6P%|se$heVhoZDsvER?(BZ+1!P3E|!A}i7!i#{jnytLm
zyc3x*nX1gGnHw`tW~F46WX;Ojmh~;aAAdamG5!Jmb%8`+7OW9`B1{wx7tRvy5dK><
zNTe4n7kwa(6&H!`6>k?`%pROgWj~$$p(IICDtS<{NAinQCUr<RNzcjp$tKBG$WF+U
z<>m7E^0yQbiUP&Gik*s|lv1Tj`I7RxA(=z!hin*fHYYuY%2|_hDmN`xm%A#rIgiYn
zl=n<t^Uyv+bwgJV{UX0_z9D~Y{u$Lk)nwK4s&5Mf1&)F(1y|Hc_1)@S8m4BLX0GN?
zVPfIv!exb@7o`;$i#8Tr7$zAueb}zzh~g2&j}@QL_SEXN>$Mk#%ZA@QeBX$e5tSpB
zjrgKuP>G{tM=7Ipc<JM%pN{N5(mHZm87kA3Jzn-%d3yPj@>fT(N0pCSKI+Q~Va1G!
z1C>dY6Dv1V{!mp=wV>*g(HW!NqxV$DRZpm1UwvhaX3WAd&13mv?;iW^xbEXj<F=2F
z9A7<t?fA=g6yEW~9j7NqCd`>|{Lb_{8}EGkuI_i4?|N-w+(g~PmnTI`8Z&9bq-(k|
z-D=(C8g0#rnhSch{z?7UhJ3>!!#OIKT1cI#&8=Nnd)An1eB5}hZfM=&y7MNrX_@Kb
z<l@OICts;AtADQkhIx#6vn9$h$?}Rd(OPfaXX|Bav>mYzw$HIQPf<>JV#)=_2*+9{
z;k?ti-IWZBse|qe_XF;eQ}d=SpZa4%b;HYz360jqgH3~)9&S1_t!Ua`r?aN(r|+53
zXU2UqPTsA$d(}O}JvI02xwr4Vv+q4UbJ)yv_i^v5zwaNj1hW>-`u_eg_wSh9bN0;H
zrydygz{WY9<~Zh@cyP#rD<5J#WP0e(!{UdRK74(yVeUKg1oIZpyEb1x|DC@G|FYyS
zHy){d<j?}?f~Oy4KWcsS_+vvKTemP_;k1RP9xr`->mqW|+(q9%G4YAF7iTYC`6TyA
z_mj;_N|tP2+HdKjORp`fTXt-D!Sc;3Qdc~@;>uHor;a|I|MaGnJy*_K`SUZTXFgmt
zY}MA)16D77mi_G1XTMxiz2?AQ<$qnjw)@(7Ykzsp`dst6igo+e%hs>okh)>PM#e_>
z#&ge4c>cW?G%sx5l(}iu=9JCzUPLdtU;OHClm2%6r4cXfd0GDQroZ?9`-&||Tjp*h
zwl;0Ou&r)e^Y(GukGwMcl|4I#?AY>Z)~nC$?6Y(EYn@+P@H+SP*{|PtW7->+ciDHH
z-)-D|YR|+ypX?pG_k(?-_8r<kV*guj7QMOmfa<^-Z{@zV^KIqZue>9FXWP5dcefst
z9Nh8`$v?Ink{;T6Sax{(dy4mV9LYKI`q80BcfYTB|IH7yAG~{P<gp{iM<4(2#Do*g
z9~wS9`;qyhiyu$@`06J!KaKcw?q~6zE&e?9^VR<x_|MJF(&pDrYEB;fqVkJRPU%m5
z{V(UguAQF!W$c%W&-6aC{;cTi&T~cQ-uvo~uTFn$|N83rIo~9Fv*O!~Z~y*X{&xp2
zjJ<IBqT}L?f6u?v?b37KXMexva{1-Yf3W;;^~&5IyZyNCC;3kYejfAlnX3)gBCjp^
zW#BJ6u8+9>=?%+`8#9OQf)z41>c(sp5{yk1#c>|kySn_L<f7Q5hYG&9xcx0Q1ODq4
a@r>txa^d9#;~CHYtHRIP%m5g&aQz=j1b*cJ

literal 0
HcmV?d00001

diff --git a/extra/images/testing/square.tiff b/extra/images/testing/square.tiff
new file mode 100644
index 0000000000000000000000000000000000000000..16e94f70b88942617ab6b382855474b71b5580d7
GIT binary patch
literal 660
zcmebD)MBt<WMF8pf8fBOBF4+!;*=P$BSnejf7_9yK#LqZP4OO=MHht>Si?d(?3*Xf
zP~c!-s%A;(yc+yx)!$aPhbjhK9XbD+j8Z1-XkfT=pnm$KVhI_IDn=gxh1DN;1oD^}
zn4|*BA25FS-ZU>F|Fe@)r)^80gT|?lx%Fy{JQ3?ZH#_MkxjWo{KF#^h^SG8X3z-AB
zgibLm^E{@r{O7B?BKs5-5`<41{;S^Oykf(|KBH5N@dp`{#j5{uw|74E_y3i_@abIr
z!c7L%S7f3XEpEoY{?V4Z;=lU~rKrzslQ=3f?Jr5~Fx$qX$uP6%hxpGVAI6-c&luS1
zGCp0eUsf?8&P2q6QJ-6L{kt^+oYs#T7*xMK{_D1A{gD<0p$&%?F!1<2XAs|9`7dOK
zNB6ET4jrr2nGOmV9b`G!;l;!t!oa}D%m55L1_2;uL}D`m*(^XYBPIq0W~ewTkk1BX
z1BDs5plpzSUPdOc8CF0EK}Hs^nH)fIAtW`TP&UY1F(|tM$QFmHHwGFc#mEZQ3v?WV
zG?X0#WXm9#qXA_z1N9mL?X?2ZQ9w1eP;nrW!3%08kjW5)Bo5+pKw)xDVsWu<d45rf
zUP)$J8iNDZbuFMYBaHUUO-xVqO-#>B&Q>tfGto0pFfi9QG}1S)PzW?MQ^+VODX`Ml
UFE20G%LJ(eVxUUB{GxOQ0QB0WtpET3

literal 0
HcmV?d00001


From 8dec2070e5a8aa497fbb7a0817f22d1ef4fc5d1f Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Fri, 25 Sep 2009 16:51:47 -0400
Subject: [PATCH 08/18] compression.lzw: supports both TIFF and GIF

---
 basis/compression/lzw/lzw.factor         |  78 +++++++-------
 basis/images/tiff/tiff.factor            |   5 +-
 extra/compression/lzw-gif/lzw-gif.factor | 126 -----------------------
 extra/images/gif/gif-tests.factor        |   4 +-
 extra/images/gif/gif.factor              |   4 +-
 5 files changed, 46 insertions(+), 171 deletions(-)
 delete mode 100644 extra/compression/lzw-gif/lzw-gif.factor

diff --git a/basis/compression/lzw/lzw.factor b/basis/compression/lzw/lzw.factor
index d186ad047c..9fae7f4f40 100644
--- a/basis/compression/lzw/lzw.factor
+++ b/basis/compression/lzw/lzw.factor
@@ -5,28 +5,38 @@ prettyprint sequences vectors ;
 QUALIFIED-WITH: bitstreams bs
 IN: compression.lzw
 
-SYMBOL: clear-code
-4 clear-code set-global
+SYMBOL: current-lzw
 
-SYMBOL: end-of-information
-5 end-of-information set-global
+TUPLE: lzw
+input
+output
+table
+code
+old-code
+initial-code-size
+code-size
+clear-code
+end-of-information-code ;
 
-TUPLE: lzw input output table code old-code initial-code-size code-size ;
+TUPLE: tiff-lzw < lzw ;
+TUPLE: gif-lzw < lzw ;
 
 : initial-uncompress-table ( -- seq )
-    end-of-information get 1 + iota [ 1vector ] V{ } map-as ;
+    current-lzw get end-of-information-code>> 1 +
+    iota [ 1vector ] V{ } map-as ;
 
 : reset-lzw-uncompress ( lzw -- lzw )
     initial-uncompress-table >>table
     dup initial-code-size>> >>code-size ;
 
-: <lzw-uncompress> ( input code-size -- obj )
-    lzw new
-        swap >>initial-code-size
-        dup initial-code-size>> >>code-size
+: <lzw-uncompress> ( input code-size class -- obj )
+    new
+        swap >>code-size
+        dup code-size>> >>initial-code-size
+        dup code-size>> 1 - 2^ >>clear-code
+        dup clear-code>> 1 + >>end-of-information-code
         swap >>input
-        BV{ } clone >>output
-        reset-lzw-uncompress ;
+        BV{ } clone >>output ;
 
 ERROR: not-in-table value ;
 
@@ -45,15 +55,16 @@ ERROR: not-in-table value ;
 : write-code ( lzw -- )
     [ lookup-code ] [ output>> ] bi push-all ;
 
-: kdebug ( lzw -- lzw )
-    dup "TIFF: incrementing code size " write
-    [ code-size>> pprint ] 
-    [ " table length " write table>> length pprint ] bi
-    nl ;
+GENERIC: code-space-full? ( lzw -- ? )
+
+M: tiff-lzw code-space-full?
+    [ table>> length ] [ code-size>> 2^ 1 - ] bi = ;
+
+M: gif-lzw code-space-full?
+    [ table>> length ] [ code-size>> 2^ ] bi = ;
 
 : maybe-increment-code-size ( lzw -- lzw )
-    dup [ table>> length ] [ code-size>> 2^ 1 - ] bi =
-    [ kdebug [ 1 + ] change-code-size ] when ;
+    dup code-space-full? [ [ 1 + ] change-code-size ] when ;
 
 : add-to-table ( seq lzw -- )
     [ table>> push ]
@@ -64,9 +75,8 @@ ERROR: not-in-table value ;
 
 DEFER: lzw-uncompress-char
 : handle-clear-code ( lzw -- )
-    "CLEAR CODE" print
     reset-lzw-uncompress
-    lzw-read dup end-of-information get = [
+    lzw-read dup current-lzw get end-of-information-code>> = [
         2drop
     ] [
         >>code
@@ -94,10 +104,10 @@ DEFER: lzw-uncompress-char
 : lzw-uncompress-char ( lzw -- )
     lzw-read [
         >>code
-        dup code>> end-of-information get = [
+        dup code>> current-lzw get end-of-information-code>> = [
             drop
         ] [
-            dup code>> clear-code get = [
+            dup code>> current-lzw get clear-code>> = [
                 handle-clear-code
             ] [
                 handle-uncompress-code
@@ -108,19 +118,13 @@ DEFER: lzw-uncompress-char
         drop
     ] if* ;
 
-: register-special-codes ( first-code-size -- first-code-size )
-    [
-        1 - 2^ dup clear-code set
-        1 + end-of-information set
-    ] keep ;
+: lzw-uncompress ( bitstream code-size class -- byte-array )
+    <lzw-uncompress> dup current-lzw [
+        [ reset-lzw-uncompress drop ] [ lzw-uncompress-char ] [ output>> ] tri
+    ] with-variable ;
 
-: lzw-uncompress ( bitstream code-size -- byte-array )
-    register-special-codes
-    <lzw-uncompress>
-    [ lzw-uncompress-char ] [ output>> ] bi ;
+: tiff-lzw-uncompress ( seq -- byte-array )
+    bs:<msb0-bit-reader> 9 tiff-lzw lzw-uncompress ;
 
-: lzw-uncompress-msb0 ( seq code-size -- byte-array )
-    [ bs:<msb0-bit-reader> ] dip lzw-uncompress ;
-
-: lzw-uncompress-lsb0 ( seq code-size -- byte-array )
-    [ bs:<lsb0-bit-reader> ] dip lzw-uncompress ;
+: gif-lzw-uncompress ( seq code-size -- byte-array )
+    [ bs:<lsb0-bit-reader> ] dip gif-lzw lzw-uncompress ;
diff --git a/basis/images/tiff/tiff.factor b/basis/images/tiff/tiff.factor
index da03f455b5..d8f7b09ed7 100755
--- a/basis/images/tiff/tiff.factor
+++ b/basis/images/tiff/tiff.factor
@@ -434,13 +434,10 @@ ERROR: bad-small-ifd-type n ;
 
 ERROR: unhandled-compression compression ;
 
-: lzw-tiff-uncompress ( seq -- byte-array )
-    9 lzw-uncompress-msb0 ;
-
 : (uncompress-strips) ( strips compression -- uncompressed-strips )
     {
         { compression-none [ ] }
-        { compression-lzw [ [ lzw-tiff-uncompress ] map ] }
+        { compression-lzw [ [ tiff-lzw-uncompress ] map ] }
         [ unhandled-compression ]
     } case ;
 
diff --git a/extra/compression/lzw-gif/lzw-gif.factor b/extra/compression/lzw-gif/lzw-gif.factor
deleted file mode 100644
index 8961abbf44..0000000000
--- a/extra/compression/lzw-gif/lzw-gif.factor
+++ /dev/null
@@ -1,126 +0,0 @@
-! Copyright (C) 2009 Doug Coleman, Keith Lazuka
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors combinators io kernel math namespaces
-prettyprint sequences vectors ;
-QUALIFIED-WITH: bitstreams bs
-IN: compression.lzw-gif
-
-SYMBOL: clear-code
-4 clear-code set-global
-
-SYMBOL: end-of-information
-5 end-of-information set-global
-
-TUPLE: lzw input output table code old-code initial-code-size code-size ;
-
-: initial-uncompress-table ( -- seq )
-    end-of-information get 1 + iota [ 1vector ] V{ } map-as ;
-
-: reset-lzw-uncompress ( lzw -- lzw )
-    initial-uncompress-table >>table
-    dup initial-code-size>> >>code-size ;
-
-: <lzw-uncompress> ( input code-size -- obj )
-    lzw new
-        swap >>initial-code-size
-        dup initial-code-size>> >>code-size
-        swap >>input
-        BV{ } clone >>output
-        reset-lzw-uncompress ;
-
-ERROR: not-in-table value ;
-
-: lookup-old-code ( lzw -- vector )
-    [ old-code>> ] [ table>> ] bi nth ;
-
-: lookup-code ( lzw -- vector )
-    [ code>> ] [ table>> ] bi nth ;
-
-: code-in-table? ( lzw -- ? )
-    [ code>> ] [ table>> length ] bi < ;
-
-: code>old-code ( lzw -- lzw )
-    dup code>> >>old-code ;
-
-: write-code ( lzw -- )
-    [ lookup-code ] [ output>> ] bi push-all ;
-
-: kdebug ( lzw -- lzw )
-    dup "GIF: incrementing code size " write
-    [ code-size>> pprint ] 
-    [ " table length " write table>> length pprint ] bi
-    nl ;
-
-: maybe-increment-code-size ( lzw -- lzw )
-    dup [ table>> length ] [ code-size>> 2^ ] bi =
-    [ kdebug [ 1 + ] change-code-size ] when ;
-
-: add-to-table ( seq lzw -- )
-    [ table>> push ]
-    [ maybe-increment-code-size 2drop ] 2bi ;
-
-: lzw-read ( lzw -- lzw n )
-    [ ] [ code-size>> ] [ input>> ] tri bs:read ;
-
-DEFER: lzw-uncompress-char
-: handle-clear-code ( lzw -- )
-    "CLEAR CODE" print
-    reset-lzw-uncompress
-    lzw-read dup end-of-information get = [
-        2drop
-    ] [
-        >>code
-        [ write-code ]
-        [ code>old-code ] bi
-        lzw-uncompress-char
-    ] if ;
-
-: handle-uncompress-code ( lzw -- lzw )
-    dup code-in-table? [
-        [ write-code ]
-        [
-            [
-                [ lookup-old-code ]
-                [ lookup-code first ] bi suffix
-            ] [ add-to-table ] bi
-        ] [ code>old-code ] tri
-    ] [
-        [
-            [ lookup-old-code dup first suffix ] keep
-            [ output>> push-all ] [ add-to-table ] 2bi
-        ] [ code>old-code ] bi
-    ] if ;
-    
-: lzw-uncompress-char ( lzw -- )
-    lzw-read [
-        >>code
-        dup code>> end-of-information get = [
-            drop
-        ] [
-            dup code>> clear-code get = [
-                handle-clear-code
-            ] [
-                handle-uncompress-code
-                lzw-uncompress-char
-            ] if
-        ] if
-    ] [
-        drop
-    ] if* ;
-
-: register-special-codes ( first-code-size -- first-code-size )
-    [
-        1 - 2^ dup clear-code set
-        1 + end-of-information set
-    ] keep ;
-
-: lzw-uncompress ( bitstream code-size -- byte-array )
-    register-special-codes
-    <lzw-uncompress>
-    [ lzw-uncompress-char ] [ output>> ] bi ;
-
-: lzw-uncompress-msb0 ( seq code-size -- byte-array )
-    [ bs:<msb0-bit-reader> ] dip lzw-uncompress ;
-
-: lzw-uncompress-lsb0 ( seq code-size -- byte-array )
-    [ bs:<lsb0-bit-reader> ] dip lzw-uncompress ;
diff --git a/extra/images/gif/gif-tests.factor b/extra/images/gif/gif-tests.factor
index 629ab300d4..87ce507b2e 100644
--- a/extra/images/gif/gif-tests.factor
+++ b/extra/images/gif/gif-tests.factor
@@ -1,6 +1,6 @@
 ! Copyright (C) 2009 Keith Lazuka.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors bitstreams compression.lzw-gif images.gif io
+USING: accessors bitstreams compression.lzw images.gif io
 io.encodings.binary io.files kernel math math.bitwise
 math.parser namespaces prettyprint sequences tools.test images.viewer ;
 QUALIFIED-WITH: bitstreams bs
@@ -49,7 +49,7 @@ IN: images.gif.tests
 : >index-stream ( gif -- seq )
     [ compressed-bytes>> ]
     [ image-descriptor>> first-code-size>> ] bi
-    lzw-uncompress-lsb0 ;
+    gif-lzw-uncompress ;
 
 [
     BV{
diff --git a/extra/images/gif/gif.factor b/extra/images/gif/gif.factor
index 8652e049e0..c6b42a651f 100644
--- a/extra/images/gif/gif.factor
+++ b/extra/images/gif/gif.factor
@@ -1,6 +1,6 @@
 ! Copyrigt (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays assocs combinators compression.lzw-gif
+USING: accessors arrays assocs combinators compression.lzw
 constructors destructors grouping images images.loader io
 io.binary io.buffers io.encodings.binary io.encodings.string
 io.encodings.utf8 io.files io.files.info io.ports
@@ -227,7 +227,7 @@ ERROR: unhandled-data byte ;
 : decompress ( loading-gif -- indexes )
     [ compressed-bytes>> ]
     [ image-descriptor>> first-code-size>> ] bi
-    lzw-uncompress-lsb0 ;
+    gif-lzw-uncompress ;
 
 : colorize ( index palette transparent-index/f -- seq )
     pick = [ 2drop B{ 0 0 0 0 } ] [ nth 255 suffix ] if ;

From c1fbca15096e63b131e37deea05630a81061d76a Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Sat, 26 Sep 2009 13:09:12 -0400
Subject: [PATCH 09/18] compression.lzw: refactored and simplified

---
 basis/compression/lzw/lzw.factor | 48 +++++++++++++-------------------
 1 file changed, 20 insertions(+), 28 deletions(-)

diff --git a/basis/compression/lzw/lzw.factor b/basis/compression/lzw/lzw.factor
index 9fae7f4f40..43752584d3 100644
--- a/basis/compression/lzw/lzw.factor
+++ b/basis/compression/lzw/lzw.factor
@@ -5,8 +5,6 @@ prettyprint sequences vectors ;
 QUALIFIED-WITH: bitstreams bs
 IN: compression.lzw
 
-SYMBOL: current-lzw
-
 TUPLE: lzw
 input
 output
@@ -21,12 +19,11 @@ end-of-information-code ;
 TUPLE: tiff-lzw < lzw ;
 TUPLE: gif-lzw < lzw ;
 
-: initial-uncompress-table ( -- seq )
-    current-lzw get end-of-information-code>> 1 +
+: initial-uncompress-table ( size -- seq )
     iota [ 1vector ] V{ } map-as ;
 
 : reset-lzw-uncompress ( lzw -- lzw )
-    initial-uncompress-table >>table
+    dup end-of-information-code>> 1 + initial-uncompress-table >>table
     dup initial-code-size>> >>code-size ;
 
 : <lzw-uncompress> ( input code-size class -- obj )
@@ -36,7 +33,8 @@ TUPLE: gif-lzw < lzw ;
         dup code-size>> 1 - 2^ >>clear-code
         dup clear-code>> 1 + >>end-of-information-code
         swap >>input
-        BV{ } clone >>output ;
+        BV{ } clone >>output
+        reset-lzw-uncompress ;
 
 ERROR: not-in-table value ;
 
@@ -73,17 +71,26 @@ M: gif-lzw code-space-full?
 : lzw-read ( lzw -- lzw n )
     [ ] [ code-size>> ] [ input>> ] tri bs:read ;
 
+: end-of-information? ( lzw code -- ? ) swap end-of-information-code>> = ;
+: clear-code? ( lzw code -- ? ) swap clear-code>> = ;
+
+DEFER: handle-clear-code
+: lzw-read* ( lzw quot: ( lzw code -- ) -- )
+    [ lzw-read ] dip {
+        { [ 3dup drop end-of-information? ] [ 3drop ] }
+        { [ 3dup drop clear-code? ] [ 2drop handle-clear-code ] }
+        [ call( lzw code -- ) ]
+    } cond ; inline
+
 DEFER: lzw-uncompress-char
 : handle-clear-code ( lzw -- )
     reset-lzw-uncompress
-    lzw-read dup current-lzw get end-of-information-code>> = [
-        2drop
-    ] [
+    [
         >>code
         [ write-code ]
         [ code>old-code ] bi
         lzw-uncompress-char
-    ] if ;
+    ] lzw-read* ;
 
 : handle-uncompress-code ( lzw -- lzw )
     dup code-in-table? [
@@ -102,26 +109,11 @@ DEFER: lzw-uncompress-char
     ] if ;
     
 : lzw-uncompress-char ( lzw -- )
-    lzw-read [
-        >>code
-        dup code>> current-lzw get end-of-information-code>> = [
-            drop
-        ] [
-            dup code>> current-lzw get clear-code>> = [
-                handle-clear-code
-            ] [
-                handle-uncompress-code
-                lzw-uncompress-char
-            ] if
-        ] if
-    ] [
-        drop
-    ] if* ;
+    [ >>code handle-uncompress-code lzw-uncompress-char ] lzw-read* ;
 
 : lzw-uncompress ( bitstream code-size class -- byte-array )
-    <lzw-uncompress> dup current-lzw [
-        [ reset-lzw-uncompress drop ] [ lzw-uncompress-char ] [ output>> ] tri
-    ] with-variable ;
+    <lzw-uncompress>
+    [ lzw-uncompress-char ] [ output>> ] bi ;
 
 : tiff-lzw-uncompress ( seq -- byte-array )
     bs:<msb0-bit-reader> 9 tiff-lzw lzw-uncompress ;

From 474ecac48f29945879fd149cee40618c182e7b08 Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Sat, 26 Sep 2009 13:15:58 -0400
Subject: [PATCH 10/18] images.gif: renamed loading-gif>image to gif>image to
 match the TIFF vocab

---
 extra/images/gif/gif-tests.factor | 6 +++---
 extra/images/gif/gif.factor       | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/extra/images/gif/gif-tests.factor b/extra/images/gif/gif-tests.factor
index 87ce507b2e..1eeb420a04 100644
--- a/extra/images/gif/gif-tests.factor
+++ b/extra/images/gif/gif-tests.factor
@@ -32,7 +32,7 @@ IN: images.gif.tests
         gif-example1 gif-example2 gif-example3 gif-example4 gif-example5
         gif-example6
     }
-    [ execute( -- gif ) loading-gif>image image. ] each ;
+    [ execute( -- gif ) gif>image image. ] each ;
 
 : declared-num-colors ( gif -- n ) flags>> 3 bits 1 + 2^ ;
 : actual-num-colors ( gif -- n ) global-color-table>> length ;
@@ -71,7 +71,7 @@ IN: images.gif.tests
         0 0 0 255 255 255 255 255 0 0 0 255 0 0 0 255 255 255 255 255 0 0 0 255
         0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 255
     }
-] [ gif-example3 loading-gif>image bitmap>> ] unit-test
+] [ gif-example3 gif>image bitmap>> ] unit-test
 
 [
     BV{
@@ -85,7 +85,7 @@ IN: images.gif.tests
         255 000 000 255     000 000 000 000
         000 000 000 000     255 000 000 255
     }
-] [ gif-example5 loading-gif>image bitmap>> ] unit-test
+] [ gif-example5 gif>image bitmap>> ] unit-test
 
 [ 100 ] [ gif-example1 >index-stream length ] unit-test
 [ 870 ] [ gif-example2 >index-stream length ] unit-test
diff --git a/extra/images/gif/gif.factor b/extra/images/gif/gif.factor
index c6b42a651f..6af64be024 100644
--- a/extra/images/gif/gif.factor
+++ b/extra/images/gif/gif.factor
@@ -243,7 +243,7 @@ ERROR: unhandled-data byte ;
     [ graphic-control-extensions>> first transparent-color-index>> ]
     [ drop f ] if ;
 
-: loading-gif>image ( loading-gif -- image )
+: gif>image ( loading-gif -- image )
     [ <image> ] dip
     [ dimensions >>dim ]
     [ drop RGBA >>component-order ubyte-components >>component-type ]
@@ -258,4 +258,4 @@ ERROR: loading-gif-error gif-image ;
     dup loading?>> [ loading-gif-error ] when ;
 
 M: gif-image stream>image ( path gif-image -- image )
-    drop load-gif ensure-loaded loading-gif>image ;
+    drop load-gif ensure-loaded gif>image ;

From bdd47b99919dbf55c946349f0c206cc40d0a75ff Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Mon, 28 Sep 2009 08:47:03 -0400
Subject: [PATCH 11/18] help.markup: word link stack effect is now clickable

---
 basis/colors/constants/factor-colors.txt      |  1 +
 basis/help/markup/markup.factor               | 42 +++++++++----------
 basis/io/styles/styles.factor                 | 15 +++++--
 .../prettyprint/stylesheet/stylesheet.factor  |  3 +-
 4 files changed, 34 insertions(+), 27 deletions(-)

diff --git a/basis/colors/constants/factor-colors.txt b/basis/colors/constants/factor-colors.txt
index b8af9d3949..64a857a2a4 100644
--- a/basis/colors/constants/factor-colors.txt
+++ b/basis/colors/constants/factor-colors.txt
@@ -4,3 +4,4 @@
 172 167 147		FactorDarkTan
  81  91 105		FactorLightSlateBlue
  55  62  72		FactorDarkSlateBlue
+  0  51   0     FactorDarkGreen
diff --git a/basis/help/markup/markup.factor b/basis/help/markup/markup.factor
index 0201e86b3f..2377a6753a 100644
--- a/basis/help/markup/markup.factor
+++ b/basis/help/markup/markup.factor
@@ -1,6 +1,6 @@
 ! Copyright (C) 2005, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays assocs classes colors.constants
+USING: accessors arrays assocs classes colors colors.constants
 combinators definitions definitions.icons effects fry generic
 hashtables help.stylesheet help.topics io io.styles kernel make
 math namespaces parser present prettyprint
@@ -154,6 +154,9 @@ ALIAS: $slot $snippet
     1array \ $image prefix ;
 
 ! Some links
+
+<PRIVATE
+
 : write-link ( string object -- )
     link-style get [ write-object ] with-style ;
 
@@ -163,38 +166,35 @@ ALIAS: $slot $snippet
 : link-text ( topic -- )
     [ article-name ] keep write-link ;
 
-: link-effect ( topic -- )
-    dup word? [
-        stack-effect [ effect>string ] [ effect-style ] bi
-        [ write ] with-style
-    ] [ drop ] if ;
+GENERIC: link-long-text ( topic -- )
 
-: inter-cleave ( x seq between -- )
-    [ [ call( x -- ) ] with ] dip swap interleave ; inline
+M: topic link-long-text
+    [ article-title ] keep write-link ;
 
-: (($link)) ( topic words -- )
-    [ dup topic? [ >link ] unless ] dip
-    [ [ bl ] inter-cleave ] ($span) ; inline
+M: word link-long-text
+    dup presented associate [
+        [ article-name link-style get format ]
+        [ drop bl ]
+        [ stack-effect effect>string stack-effect-style get format ]
+        tri
+    ] with-nesting ;
 
-: ($link) ( topic -- )
-    { [ link-text ] } (($link)) ;
+: >topic ( obj -- topic ) dup topic? [ >link ] unless ;
 
+PRIVATE>
+
+: ($link) ( topic -- ) >topic link-text ;
 : $link ( element -- ) first ($link) ;
 
-: ($long-link) ( topic -- )
-    { [ link-text ] [ link-effect ] } (($link)) ;
-
+: ($long-link) ( topic -- ) >topic link-long-text ;
 : $long-link ( element -- ) first ($long-link) ;
 
 : ($pretty-link) ( topic -- )
-    { [ link-icon ] [ link-text ] } (($link)) ;
-
+    >topic [ link-icon ] [ drop bl ] [ link-text ] tri ;
 : $pretty-link ( element -- ) first ($pretty-link) ;
 
 : ($long-pretty-link) ( topic -- )
-    { [ link-icon ] [ link-text ] [ link-effect ] } (($link)) ;
-
-: $long-pretty-link ( element -- ) first ($long-pretty-link) ;
+    >topic [ link-icon ] [ drop bl ] [ link-long-text ] tri ;
 
 : <$pretty-link> ( definition -- element )
     1array \ $pretty-link prefix ;
diff --git a/basis/io/styles/styles.factor b/basis/io/styles/styles.factor
index b141d8d2f7..ae493be849 100644
--- a/basis/io/styles/styles.factor
+++ b/basis/io/styles/styles.factor
@@ -1,9 +1,10 @@
 ! Copyright (C) 2005, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: hashtables io io.streams.plain io.streams.string
-colors summary make accessors splitting math.order
-kernel namespaces assocs destructors strings sequences
-present fry strings.tables delegate delegate.protocols ;
+USING: accessors assocs colors colors.constants delegate
+delegate.protocols destructors fry hashtables io
+io.streams.plain io.streams.string kernel make math.order
+namespaces present sequences splitting strings strings.tables
+summary ;
 IN: io.styles
 
 GENERIC: stream-format ( str style stream -- )
@@ -162,3 +163,9 @@ M: input summary
 : write-object ( str obj -- ) presented associate format ;
 
 : write-image ( image -- ) [ "" ] dip image associate format ;
+
+SYMBOL: stack-effect-style
+H{
+    { foreground COLOR: FactorDarkGreen }
+    { font-style plain }
+} stack-effect-style set-global
diff --git a/basis/prettyprint/stylesheet/stylesheet.factor b/basis/prettyprint/stylesheet/stylesheet.factor
index 580049160d..42a701d60f 100644
--- a/basis/prettyprint/stylesheet/stylesheet.factor
+++ b/basis/prettyprint/stylesheet/stylesheet.factor
@@ -43,5 +43,4 @@ PRIVATE>
     dim-color colored-presentation-style ;
 
 : effect-style ( effect -- style )
-    0 0.2 0 1 <rgba> colored-presentation-style
-    { { font-style plain } } assoc-union ;
+    presented associate stack-effect-style get assoc-union ;

From 46a768befb890be5351d26e93a8088ddf3e2ce88 Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Sat, 26 Sep 2009 14:46:31 -0400
Subject: [PATCH 12/18] compression.lzw: added documentation

---
 basis/compression/lzw/authors.txt     |  3 +-
 basis/compression/lzw/lzw-docs.factor | 83 +++++++++++++++++++++++++++
 2 files changed, 85 insertions(+), 1 deletion(-)
 create mode 100644 basis/compression/lzw/lzw-docs.factor

diff --git a/basis/compression/lzw/authors.txt b/basis/compression/lzw/authors.txt
index b4bd0e7b35..14da4319b2 100644
--- a/basis/compression/lzw/authors.txt
+++ b/basis/compression/lzw/authors.txt
@@ -1 +1,2 @@
-Doug Coleman
\ No newline at end of file
+Doug Coleman
+Keith Lazuka
diff --git a/basis/compression/lzw/lzw-docs.factor b/basis/compression/lzw/lzw-docs.factor
new file mode 100644
index 0000000000..3e738a3649
--- /dev/null
+++ b/basis/compression/lzw/lzw-docs.factor
@@ -0,0 +1,83 @@
+! Copyright (C) 2009 Keith Lazuka
+! See http://factorcode.org/license.txt for BSD license.
+USING: bitstreams byte-arrays classes help.markup help.syntax
+kernel math quotations sequences ;
+IN: compression.lzw
+
+HELP: gif-lzw-uncompress
+{ $values
+    { "seq" sequence } { "code-size" integer }
+    { "byte-array" byte-array }
+}
+{ $description "Decompresses a sequence of LZW-compressed bytes obtained from a GIF file." } ;
+
+HELP: tiff-lzw-uncompress
+{ $values
+    { "seq" sequence }
+    { "byte-array" byte-array }
+}
+{ $description "Decompresses a sequence of LZW-compressed bytes obtained from a TIFF file." } ;
+
+HELP: lzw-read
+{ $values
+    { "lzw" lzw }
+    { "lzw" lzw } { "n" integer }
+}
+{ $description "Read the next LZW code." } ;
+
+HELP: lzw-read*
+{ $values
+    { "lzw" lzw } { "quot" quotation }
+}
+{ $description "Read the next LZW code and call " { $snippet "quot" } " with the lzw object and the LZW code only if the code is neither the Clear Code nor the End of Information Code. If it does read a Clear Code, this combinator will take care of handling the Clear Code for you." } ;
+
+HELP: <lzw-uncompress>
+{ $values
+    { "input" bit-reader } { "code-size" "number of bits" } { "class" class }
+    { "obj" object }
+}
+{ $description "Instantiate a new LZW decompressor." } ;
+
+HELP: code-space-full?
+{ $values
+    { "lzw" lzw }
+    { "?" boolean }
+}
+{ $description "Determines when to increment the variable length code's bit-width." } ;
+
+HELP: reset-lzw-uncompress
+{ $values
+    { "lzw" lzw }
+    { "lzw" lzw }
+}
+{ $description "Reset the LZW uncompressor state (either at initialization time or immediately after receiving a Clear Code). " } ;
+
+ARTICLE: "compression.lzw.differences" "LZW Differences between TIFF and GIF"
+{ $vocab-link "compression.lzw" }
+$nl
+"There are some subtle differences between the LZW algorithm used by TIFF and GIF images."
+{ $heading "Variable Length Codes" }
+"Both TIFF and GIF use a variation of the LZW algorithm that uses variable length codes. In both cases, the maximum code size is 12 bits. The initial code size, however, is different between the two formats. TIFF's initial code size is always 9 bits. GIF's initial code size is specified on a per-file basis at the beginning of the image descriptor block, with a minimum of 3 bits."
+$nl
+"TIFF and GIF each switch to the next code size using slightly different algorithms. GIF increments the code size as soon as the LZW string table's length is equal to 2**code-size, while TIFF increments the code size when the table's length is equal to 2**code-size - 1."
+{ $heading "Packing Bits into Bytes" }
+"TIFF and GIF LZW algorithms differ in how they pack the code bits into the byte stream. The least significant bit in a TIFF code is stored in the most significant bit of the bytestream, while the least significant bit in a GIF code is stored in the least significant bit of the bytestream."
+{ $heading "Special Codes" }
+"TIFF and GIF both add the concept of a 'Clear Code' and a 'End of Information Code' to the LZW algorithm. In both cases, the 'Clear Code' is equal to 2**(code-size - 1) and the 'End of Information Code' is equal to the Clear Code + 1. These 2 codes are reserved in the string table. So in both cases, the LZW string table is initialized to have a length equal to the End of Information Code + 1."
+;
+
+ARTICLE: "compression.lzw" "LZW Compression"
+{ $vocab-link "compression.lzw" }
+$nl
+"Implements both the TIFF and GIF variations of the LZW algorithm."
+{ $heading "Decompression" }
+{ $subsection tiff-lzw-uncompress }
+{ $subsection gif-lzw-uncompress }
+{ $heading "Compression" }
+"Compression has not yet been implemented."
+$nl
+"Implementation details:"
+{ $subsection "compression.lzw.differences" }
+;
+
+ABOUT: "compression.lzw"

From e7db217c1ff74b5dd1b225934fa55700cfb7b631 Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Sat, 26 Sep 2009 14:52:00 -0400
Subject: [PATCH 13/18] images.gif: added documentation

---
 extra/images/gif/authors.txt     |  2 ++
 extra/images/gif/gif-docs.factor | 12 ++++++++++++
 extra/images/gif/gif.factor      |  2 +-
 extra/images/gif/summary.txt     |  1 +
 4 files changed, 16 insertions(+), 1 deletion(-)
 create mode 100644 extra/images/gif/authors.txt
 create mode 100644 extra/images/gif/gif-docs.factor
 create mode 100644 extra/images/gif/summary.txt

diff --git a/extra/images/gif/authors.txt b/extra/images/gif/authors.txt
new file mode 100644
index 0000000000..14da4319b2
--- /dev/null
+++ b/extra/images/gif/authors.txt
@@ -0,0 +1,2 @@
+Doug Coleman
+Keith Lazuka
diff --git a/extra/images/gif/gif-docs.factor b/extra/images/gif/gif-docs.factor
new file mode 100644
index 0000000000..935e8f6beb
--- /dev/null
+++ b/extra/images/gif/gif-docs.factor
@@ -0,0 +1,12 @@
+! Copyright (C) 2009 Keith Lazuka.
+! See http://factorcode.org/license.txt for BSD license.
+USING: help.markup help.syntax kernel sequences ;
+IN: images.gif
+
+ARTICLE: "images.gif" "GIF Image Loader"
+{ $vocab-link "images.gif" }
+$nl
+{ $notes "Currently multi-frame GIF images are not supported." }
+;
+
+ABOUT: "images.gif"
diff --git a/extra/images/gif/gif.factor b/extra/images/gif/gif.factor
index 6af64be024..7301cc984f 100644
--- a/extra/images/gif/gif.factor
+++ b/extra/images/gif/gif.factor
@@ -1,4 +1,4 @@
-! Copyrigt (C) 2009 Doug Coleman.
+! Copyrigt (C) 2009 Doug Coleman, Keith Lazuka
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs combinators compression.lzw
 constructors destructors grouping images images.loader io
diff --git a/extra/images/gif/summary.txt b/extra/images/gif/summary.txt
new file mode 100644
index 0000000000..ff8fc71264
--- /dev/null
+++ b/extra/images/gif/summary.txt
@@ -0,0 +1 @@
+GIF image file format

From f5c4fbb10c9bc0038639f82e98fb8c9319ed92f7 Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Sat, 26 Sep 2009 15:17:52 -0400
Subject: [PATCH 14/18] compression.lzw: better naming

---
 basis/compression/lzw/lzw-docs.factor | 4 ++--
 basis/compression/lzw/lzw.factor      | 7 ++++---
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/basis/compression/lzw/lzw-docs.factor b/basis/compression/lzw/lzw-docs.factor
index 3e738a3649..c43a2d5a37 100644
--- a/basis/compression/lzw/lzw-docs.factor
+++ b/basis/compression/lzw/lzw-docs.factor
@@ -25,11 +25,11 @@ HELP: lzw-read
 }
 { $description "Read the next LZW code." } ;
 
-HELP: lzw-read*
+HELP: lzw-process-next-code
 { $values
     { "lzw" lzw } { "quot" quotation }
 }
-{ $description "Read the next LZW code and call " { $snippet "quot" } " with the lzw object and the LZW code only if the code is neither the Clear Code nor the End of Information Code. If it does read a Clear Code, this combinator will take care of handling the Clear Code for you." } ;
+{ $description "Read the next LZW code and, assuming that the code is neither the Clear Code nor the End of Information Code, conditionally processes it by calling " { $snippet "quot" } " with the lzw object and the LZW code. If it does read a Clear Code, this combinator will take care of handling the Clear Code for you." } ;
 
 HELP: <lzw-uncompress>
 { $values
diff --git a/basis/compression/lzw/lzw.factor b/basis/compression/lzw/lzw.factor
index 43752584d3..72de6f828c 100644
--- a/basis/compression/lzw/lzw.factor
+++ b/basis/compression/lzw/lzw.factor
@@ -75,7 +75,7 @@ M: gif-lzw code-space-full?
 : clear-code? ( lzw code -- ? ) swap clear-code>> = ;
 
 DEFER: handle-clear-code
-: lzw-read* ( lzw quot: ( lzw code -- ) -- )
+: lzw-process-next-code ( lzw quot: ( lzw code -- ) -- )
     [ lzw-read ] dip {
         { [ 3dup drop end-of-information? ] [ 3drop ] }
         { [ 3dup drop clear-code? ] [ 2drop handle-clear-code ] }
@@ -90,7 +90,7 @@ DEFER: lzw-uncompress-char
         [ write-code ]
         [ code>old-code ] bi
         lzw-uncompress-char
-    ] lzw-read* ;
+    ] lzw-process-next-code ;
 
 : handle-uncompress-code ( lzw -- lzw )
     dup code-in-table? [
@@ -109,7 +109,8 @@ DEFER: lzw-uncompress-char
     ] if ;
     
 : lzw-uncompress-char ( lzw -- )
-    [ >>code handle-uncompress-code lzw-uncompress-char ] lzw-read* ;
+    [ >>code handle-uncompress-code lzw-uncompress-char ]
+    lzw-process-next-code ;
 
 : lzw-uncompress ( bitstream code-size class -- byte-array )
     <lzw-uncompress>

From 47c2864de3711f780694bc4cf955b730ee4985f9 Mon Sep 17 00:00:00 2001
From: Keith Lazuka <klazuka@gmail.com>
Date: Sat, 26 Sep 2009 22:09:58 -0400
Subject: [PATCH 15/18] compression.lzw: additional refactoring

---
 basis/compression/lzw/lzw.factor | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/basis/compression/lzw/lzw.factor b/basis/compression/lzw/lzw.factor
index 72de6f828c..e017636009 100644
--- a/basis/compression/lzw/lzw.factor
+++ b/basis/compression/lzw/lzw.factor
@@ -55,11 +55,10 @@ ERROR: not-in-table value ;
 
 GENERIC: code-space-full? ( lzw -- ? )
 
-M: tiff-lzw code-space-full?
-    [ table>> length ] [ code-size>> 2^ 1 - ] bi = ;
+: size-and-limit ( lzw -- m n ) [ table>> length ] [ code-size>> 2^ ] bi ;
 
-M: gif-lzw code-space-full?
-    [ table>> length ] [ code-size>> 2^ ] bi = ;
+M: tiff-lzw code-space-full? size-and-limit 1 - = ;
+M: gif-lzw code-space-full? size-and-limit = ;
 
 : maybe-increment-code-size ( lzw -- lzw )
     dup code-space-full? [ [ 1 + ] change-code-size ] when ;

From cdc7b7e2c75546340bbbeab27a5fbd00f5c429e1 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Wed, 30 Sep 2009 05:00:36 -0500
Subject: [PATCH 16/18] Various minor compiler tweaks: Combine address
 calculation with dereferencing in alien accessors; convert SIMD XOR of a
 vector with itself into an XOR of the destination with itself; convert SIMD
 unbox of zero vector into XOR of the destination with itself; fix SIMD
 indexing on x86-64

---
 .../cfg/instructions/instructions.factor      | 57 +++++++++++++------
 .../cfg/intrinsics/alien/alien.factor         |  8 +--
 .../representations/representations.factor    | 23 +++++++-
 .../value-numbering/rewrite/rewrite.factor    | 27 +++++++++
 .../value-numbering-tests.factor              | 10 ++++
 basis/cpu/architecture/architecture.factor    | 42 ++++++++------
 basis/cpu/x86/x86.factor                      | 35 ++++++------
 7 files changed, 146 insertions(+), 56 deletions(-)

diff --git a/basis/compiler/cfg/instructions/instructions.factor b/basis/compiler/cfg/instructions/instructions.factor
index 97bdccf045..cf0f668db3 100644
--- a/basis/compiler/cfg/instructions/instructions.factor
+++ b/basis/compiler/cfg/instructions/instructions.factor
@@ -468,65 +468,88 @@ use: src/int-rep ;
 ! Alien accessors
 INSN: ##alien-unsigned-1
 def: dst/int-rep
-use: src/int-rep ;
+use: src/int-rep
+literal: offset ;
 
 INSN: ##alien-unsigned-2
 def: dst/int-rep
-use: src/int-rep ;
+use: src/int-rep
+literal: offset ;
 
 INSN: ##alien-unsigned-4
 def: dst/int-rep
-use: src/int-rep ;
+use: src/int-rep
+literal: offset ;
 
 INSN: ##alien-signed-1
 def: dst/int-rep
-use: src/int-rep ;
+use: src/int-rep
+literal: offset ;
 
 INSN: ##alien-signed-2
 def: dst/int-rep
-use: src/int-rep ;
+use: src/int-rep
+literal: offset ;
 
 INSN: ##alien-signed-4
 def: dst/int-rep
-use: src/int-rep ;
+use: src/int-rep
+literal: offset ;
 
 INSN: ##alien-cell
 def: dst/int-rep
-use: src/int-rep ;
+use: src/int-rep
+literal: offset ;
 
 INSN: ##alien-float
 def: dst/float-rep
-use: src/int-rep ;
+use: src/int-rep
+literal: offset ;
 
 INSN: ##alien-double
 def: dst/double-rep
-use: src/int-rep ;
+use: src/int-rep
+literal: offset ;
 
 INSN: ##alien-vector
 def: dst
 use: src/int-rep
-literal: rep ;
+literal: offset rep ;
 
 INSN: ##set-alien-integer-1
-use: src/int-rep value/int-rep ;
+use: src/int-rep
+literal: offset
+use: value/int-rep ;
 
 INSN: ##set-alien-integer-2
-use: src/int-rep value/int-rep ;
+use: src/int-rep
+literal: offset
+use: value/int-rep ;
 
 INSN: ##set-alien-integer-4
-use: src/int-rep value/int-rep ;
+use: src/int-rep
+literal: offset
+use: value/int-rep ;
 
 INSN: ##set-alien-cell
-use: src/int-rep value/int-rep ;
+use: src/int-rep
+literal: offset
+use: value/int-rep ;
 
 INSN: ##set-alien-float
-use: src/int-rep value/float-rep ;
+use: src/int-rep
+literal: offset
+use: value/float-rep ;
 
 INSN: ##set-alien-double
-use: src/int-rep value/double-rep ;
+use: src/int-rep
+literal: offset
+use: value/double-rep ;
 
 INSN: ##set-alien-vector
-use: src/int-rep value
+use: src/int-rep
+literal: offset
+use: value
 literal: rep ;
 
 ! Memory allocation
diff --git a/basis/compiler/cfg/intrinsics/alien/alien.factor b/basis/compiler/cfg/intrinsics/alien/alien.factor
index 2b903813a0..bc6baa21b7 100644
--- a/basis/compiler/cfg/intrinsics/alien/alien.factor
+++ b/basis/compiler/cfg/intrinsics/alien/alien.factor
@@ -33,10 +33,10 @@ IN: compiler.cfg.intrinsics.alien
     [ second class>> fixnum class<= ]
     bi and ;
 
-: prepare-alien-accessor ( info -- offset-vreg )
-    class>> [ 2inputs ^^untag-fixnum swap ] dip ^^unbox-c-ptr ^^add ;
+: prepare-alien-accessor ( info -- ptr-vreg offset )
+    class>> [ 2inputs ^^untag-fixnum swap ] dip ^^unbox-c-ptr ^^add 0 ;
 
-: prepare-alien-getter ( infos -- offset-vreg )
+: prepare-alien-getter ( infos -- ptr-vreg offset )
     first prepare-alien-accessor ;
 
 : inline-alien-getter ( node quot -- )
@@ -49,7 +49,7 @@ IN: compiler.cfg.intrinsics.alien
     [ third class>> fixnum class<= ]
     tri and and ;
 
-: prepare-alien-setter ( infos -- offset-vreg )
+: prepare-alien-setter ( infos -- ptr-vreg offset )
     second prepare-alien-accessor ;
 
 : inline-alien-integer-setter ( node quot -- )
diff --git a/basis/compiler/cfg/representations/representations.factor b/basis/compiler/cfg/representations/representations.factor
index f103a0195f..423f415742 100644
--- a/basis/compiler/cfg/representations/representations.factor
+++ b/basis/compiler/cfg/representations/representations.factor
@@ -1,8 +1,8 @@
 ! Copyright (C) 2009 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel fry accessors sequences assocs sets namespaces
-arrays combinators make locals deques dlists layouts
-cpu.architecture compiler.utilities
+arrays combinators combinators.short-circuit make locals deques
+dlists layouts cpu.architecture compiler.utilities
 compiler.cfg
 compiler.cfg.rpo
 compiler.cfg.hats
@@ -208,6 +208,25 @@ SYMBOL: phi-mappings
 M: ##phi conversions-for-insn
     [ , ] [ [ inputs>> values ] [ dst>> ] bi phi-mappings get set-at ] bi ;
 
+! When a literal zero vector is unboxed, we replace the ##load-reference
+! with a ##zero-vector instruction since this is more efficient.
+: convert-to-zero-vector? ( insn -- ? )
+    {
+        [ dst>> rep-of vector-rep? ]
+        [ obj>> B{ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } = ]
+    } 1&& ;
+
+: convert-to-zero-vector ( insn -- )
+    dst>> dup rep-of ##zero-vector ;
+
+M: ##load-reference conversions-for-insn
+    dup convert-to-zero-vector?
+    [ convert-to-zero-vector ] [ call-next-method ] if ;
+
+M: ##load-constant conversions-for-insn
+    dup convert-to-zero-vector?
+    [ convert-to-zero-vector ] [ call-next-method ] if ;
+
 M: vreg-insn conversions-for-insn
     [ compute-renaming-set ] [ perform-renaming ] bi ;
 
diff --git a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor
index 5759d7467a..d38c25a841 100755
--- a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor
+++ b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor
@@ -391,6 +391,29 @@ M: ##unbox-any-c-ptr rewrite
     dup src>> vreg>expr dup box-displaced-alien-expr?
     [ rewrite-unbox-displaced-alien ] [ 2drop f ] if ;
 
+! More efficient addressing for alien intrinsics
+: rewrite-alien-addressing ( insn -- insn' )
+    dup src>> vreg>expr dup add-imm-expr? [
+        [ src1>> vn>vreg ] [ src2>> vn>constant ] bi
+        [ >>src ] [ '[ _ + ] change-offset ] bi*
+    ] [ 2drop f ] if ;
+
+M: ##alien-unsigned-1 rewrite rewrite-alien-addressing ;
+M: ##alien-unsigned-2 rewrite rewrite-alien-addressing ;
+M: ##alien-unsigned-4 rewrite rewrite-alien-addressing ;
+M: ##alien-signed-1 rewrite rewrite-alien-addressing ;
+M: ##alien-signed-2 rewrite rewrite-alien-addressing ;
+M: ##alien-signed-4 rewrite rewrite-alien-addressing ;
+M: ##alien-float rewrite rewrite-alien-addressing ;
+M: ##alien-double rewrite rewrite-alien-addressing ;
+M: ##alien-vector rewrite rewrite-alien-addressing ;
+M: ##set-alien-integer-1 rewrite rewrite-alien-addressing ;
+M: ##set-alien-integer-2 rewrite rewrite-alien-addressing ;
+M: ##set-alien-integer-4 rewrite rewrite-alien-addressing ;
+M: ##set-alien-float rewrite rewrite-alien-addressing ;
+M: ##set-alien-double rewrite rewrite-alien-addressing ;
+M: ##set-alien-vector rewrite rewrite-alien-addressing ;
+
 ! Some lame constant folding for SIMD intrinsics. Eventually this
 ! should be redone completely.
 
@@ -431,3 +454,7 @@ M: ##shuffle-vector rewrite
 M: ##scalar>vector rewrite
     dup src>> vreg>expr dup constant-expr?
     [ fold-scalar>vector ] [ 2drop f ] if ;
+
+M: ##xor-vector rewrite
+    dup [ src1>> vreg>vn ] [ src2>> vreg>vn ] bi eq?
+    [ [ dst>> ] [ rep>> ] bi \ ##zero-vector new-insn ] [ drop f ] if ;
diff --git a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor
index 663a2f0193..7751cba039 100644
--- a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor
+++ b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor
@@ -1189,6 +1189,16 @@ cell 8 = [
     } value-numbering-step
 ] unit-test
 
+[
+    {
+        T{ ##zero-vector f 2 float-4-rep }
+    }
+] [
+    {
+        T{ ##xor-vector f 2 1 1 float-4-rep }
+    } value-numbering-step
+] unit-test
+
 : test-branch-folding ( insns -- insns' n )
     <basic-block>
     [ V{ 0 1 } clone >>successors basic-block set value-numbering-step ] keep
diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor
index 9d6f8fd662..3b1f57d08e 100644
--- a/basis/cpu/architecture/architecture.factor
+++ b/basis/cpu/architecture/architecture.factor
@@ -114,6 +114,14 @@ M: float-rep rep-size drop 4 ;
 M: double-rep rep-size drop 8 ;
 M: stack-params rep-size drop cell ;
 M: vector-rep rep-size drop 16 ;
+M: char-scalar-rep rep-size drop 1 ;
+M: uchar-scalar-rep rep-size drop 1 ;
+M: short-scalar-rep rep-size drop 2 ;
+M: ushort-scalar-rep rep-size drop 2 ;
+M: int-scalar-rep rep-size drop 4 ;
+M: uint-scalar-rep rep-size drop 4 ;
+M: longlong-scalar-rep rep-size drop 8 ;
+M: ulonglong-scalar-rep rep-size drop 8 ;
 
 GENERIC: rep-component-type ( rep -- n )
 
@@ -277,24 +285,24 @@ HOOK: %unbox-any-c-ptr cpu ( dst src temp -- )
 HOOK: %box-alien cpu ( dst src temp -- )
 HOOK: %box-displaced-alien cpu ( dst displacement base temp1 temp2 base-class -- )
 
-HOOK: %alien-unsigned-1 cpu ( dst src -- )
-HOOK: %alien-unsigned-2 cpu ( dst src -- )
-HOOK: %alien-unsigned-4 cpu ( dst src -- )
-HOOK: %alien-signed-1   cpu ( dst src -- )
-HOOK: %alien-signed-2   cpu ( dst src -- )
-HOOK: %alien-signed-4   cpu ( dst src -- )
-HOOK: %alien-cell       cpu ( dst src -- )
-HOOK: %alien-float      cpu ( dst src -- )
-HOOK: %alien-double     cpu ( dst src -- )
-HOOK: %alien-vector     cpu ( dst src rep -- )
+HOOK: %alien-unsigned-1 cpu ( dst src offset -- )
+HOOK: %alien-unsigned-2 cpu ( dst src offset -- )
+HOOK: %alien-unsigned-4 cpu ( dst src offset -- )
+HOOK: %alien-signed-1   cpu ( dst src offset -- )
+HOOK: %alien-signed-2   cpu ( dst src offset -- )
+HOOK: %alien-signed-4   cpu ( dst src offset -- )
+HOOK: %alien-cell       cpu ( dst src offset -- )
+HOOK: %alien-float      cpu ( dst src offset -- )
+HOOK: %alien-double     cpu ( dst src offset -- )
+HOOK: %alien-vector     cpu ( dst src offset rep -- )
 
-HOOK: %set-alien-integer-1 cpu ( ptr value -- )
-HOOK: %set-alien-integer-2 cpu ( ptr value -- )
-HOOK: %set-alien-integer-4 cpu ( ptr value -- )
-HOOK: %set-alien-cell      cpu ( ptr value -- )
-HOOK: %set-alien-float     cpu ( ptr value -- )
-HOOK: %set-alien-double    cpu ( ptr value -- )
-HOOK: %set-alien-vector    cpu ( ptr value rep -- )
+HOOK: %set-alien-integer-1 cpu ( ptr offset value -- )
+HOOK: %set-alien-integer-2 cpu ( ptr offset value -- )
+HOOK: %set-alien-integer-4 cpu ( ptr offset value -- )
+HOOK: %set-alien-cell      cpu ( ptr offset value -- )
+HOOK: %set-alien-float     cpu ( ptr offset value -- )
+HOOK: %set-alien-double    cpu ( ptr offset value -- )
+HOOK: %set-alien-vector    cpu ( ptr offset value rep -- )
 
 HOOK: %alien-global cpu ( dst symbol library -- )
 HOOK: %vm-field-ptr cpu ( dst fieldname -- )
diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor
index 14a382d6cf..eaaab19662 100644
--- a/basis/cpu/x86/x86.factor
+++ b/basis/cpu/x86/x86.factor
@@ -307,45 +307,45 @@ M:: x86 %set-string-nth-fast ( ch str index temp -- )
         temp string-offset [+] new-ch 8-bit-version-of MOV
     ] with-small-register ;
 
-:: %alien-integer-getter ( dst src size quot -- )
+:: %alien-integer-getter ( dst src offset size quot -- )
     dst { src } size [| new-dst |
-        new-dst dup size n-bit-version-of dup src [] MOV
+        new-dst dup size n-bit-version-of dup src offset [+] MOV
         quot call
         dst new-dst int-rep %copy
     ] with-small-register ; inline
 
-: %alien-unsigned-getter ( dst src size -- )
+: %alien-unsigned-getter ( dst src offset size -- )
     [ MOVZX ] %alien-integer-getter ; inline
 
 M: x86 %alien-unsigned-1 8 %alien-unsigned-getter ;
 M: x86 %alien-unsigned-2 16 %alien-unsigned-getter ;
 M: x86 %alien-unsigned-4 32 [ 2drop ] %alien-integer-getter ;
 
-: %alien-signed-getter ( dst src size -- )
+: %alien-signed-getter ( dst src offset size -- )
     [ MOVSX ] %alien-integer-getter ; inline
 
 M: x86 %alien-signed-1 8 %alien-signed-getter ;
 M: x86 %alien-signed-2 16 %alien-signed-getter ;
 M: x86 %alien-signed-4 32 %alien-signed-getter ;
 
-M: x86 %alien-cell [] MOV ;
-M: x86 %alien-float [] MOVSS ;
-M: x86 %alien-double [] MOVSD ;
-M: x86 %alien-vector [ [] ] dip %copy ;
+M: x86 %alien-cell [+] MOV ;
+M: x86 %alien-float [+] MOVSS ;
+M: x86 %alien-double [+] MOVSD ;
+M: x86 %alien-vector [ [+] ] dip %copy ;
 
-:: %alien-integer-setter ( ptr value size -- )
+:: %alien-integer-setter ( ptr offset value size -- )
     value { ptr } size [| new-value |
         new-value value int-rep %copy
-        ptr [] new-value size n-bit-version-of MOV
+        ptr offset [+] new-value size n-bit-version-of MOV
     ] with-small-register ; inline
 
 M: x86 %set-alien-integer-1 8 %alien-integer-setter ;
 M: x86 %set-alien-integer-2 16 %alien-integer-setter ;
 M: x86 %set-alien-integer-4 32 %alien-integer-setter ;
-M: x86 %set-alien-cell [ [] ] dip MOV ;
-M: x86 %set-alien-float [ [] ] dip MOVSS ;
-M: x86 %set-alien-double [ [] ] dip MOVSD ;
-M: x86 %set-alien-vector [ [] ] 2dip %copy ;
+M: x86 %set-alien-cell [ [+] ] dip MOV ;
+M: x86 %set-alien-float [ [+] ] dip MOVSS ;
+M: x86 %set-alien-double [ [+] ] dip MOVSD ;
+M: x86 %set-alien-vector [ [+] ] 2dip %copy ;
 
 : shift-count? ( reg -- ? ) { ECX RCX } memq? ;
 
@@ -1042,8 +1042,11 @@ M: x86 %shr-vector-reps
         { sse2? { short-8-rep ushort-8-rep int-4-rep uint-4-rep ulonglong-2-rep } }
     } available-reps ;
 
-M: x86 %integer>scalar drop MOVD ;
-M: x86 %scalar>integer drop MOVD ;
+: scalar-sized-reg ( reg rep -- reg' )
+    rep-size 8 * n-bit-version-of ;
+
+M: x86 %integer>scalar scalar-sized-reg MOVD ;
+M: x86 %scalar>integer swap [ scalar-sized-reg ] dip MOVD ;
 M: x86 %vector>scalar %copy ;
 M: x86 %scalar>vector %copy ;
 

From 4c856e51e1a0e43caeb12c1778b27f81e060e8fe Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Wed, 30 Sep 2009 05:00:50 -0500
Subject: [PATCH 17/18] math.matrices.simd: hack: replace 'first4' with '4
 firstn' since latter is open-coded

---
 extra/math/matrices/simd/simd.factor | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/extra/math/matrices/simd/simd.factor b/extra/math/matrices/simd/simd.factor
index 2769a783bc..014cd86265 100644
--- a/extra/math/matrices/simd/simd.factor
+++ b/extra/math/matrices/simd/simd.factor
@@ -20,7 +20,7 @@ M: matrix4 new-sequence 2drop matrix4 (struct) ; inline
 <PRIVATE
 
 : rows ( a -- a1 a2 a3 a4 )
-    rows>> first4 ; inline
+    rows>> 4 firstn ; inline
 
 :: set-rows ( c1 c2 c3 c4 c -- c )
     c rows>> :> rows

From b677822b76daf5b34a5788495f95ec8d0fb7c2ef Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Wed, 30 Sep 2009 05:09:20 -0500
Subject: [PATCH 18/18] compiler.cfg.value-numbering: fix overly-zealous
 ##compare-imm conversion

---
 .../value-numbering/rewrite/rewrite.factor    |  1 +
 .../value-numbering-tests.factor              | 28 +++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor
index d38c25a841..8e5e013606 100755
--- a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor
+++ b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor
@@ -16,6 +16,7 @@ IN: compiler.cfg.value-numbering.rewrite
 : vreg-small-constant? ( vreg -- ? )
     vreg>expr {
         [ constant-expr? ]
+        [ value>> fixnum? ]
         [ value>> small-enough? ]
     } 1&& ;
 
diff --git a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor
index 7751cba039..b2750da3fa 100644
--- a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor
+++ b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor
@@ -406,6 +406,20 @@ IN: compiler.cfg.value-numbering.tests
     } value-numbering-step trim-temps
 ] unit-test
 
+[
+    {
+        T{ ##peek f 0 D 0 }
+        T{ ##load-constant f 1 3.5 }
+        T{ ##compare f 2 0 1 cc= }
+    }
+] [
+    {
+        T{ ##peek f 0 D 0 }
+        T{ ##load-constant f 1 3.5 }
+        T{ ##compare f 2 0 1 cc= }
+    } value-numbering-step trim-temps
+] unit-test
+
 [
     {
         T{ ##peek f 0 D 0 }
@@ -434,6 +448,20 @@ IN: compiler.cfg.value-numbering.tests
     } value-numbering-step
 ] unit-test
 
+[
+    {
+        T{ ##peek f 0 D 0 }
+        T{ ##load-constant f 1 3.5 }
+        T{ ##compare-branch f 0 1 cc= }
+    }
+] [
+    {
+        T{ ##peek f 0 D 0 }
+        T{ ##load-constant f 1 3.5 }
+        T{ ##compare-branch f 0 1 cc= }
+    } value-numbering-step trim-temps
+] unit-test
+
 [
     {
         T{ ##peek f 0 D 0 }