]> gitweb.factorcode.org Git - factor.git/commitdiff
support lzw uncompression in images.tiff
authorDoug Coleman <doug.coleman@gmail.com>
Thu, 12 Feb 2009 23:44:15 +0000 (17:44 -0600)
committerDoug Coleman <doug.coleman@gmail.com>
Thu, 12 Feb 2009 23:44:15 +0000 (17:44 -0600)
basis/images/images.factor
basis/images/tiff/tiff.factor

index a2d90cc131f4e1067995d6e1fcd5c5bc04c0223d..46c0936644458e6bda7d971e093add1503fa0ca6 100644 (file)
@@ -17,8 +17,7 @@ GENERIC: load-image* ( path tuple -- image )
         { RGBA [ ] }
         { BGRA [
             [
-                [ 4 <sliced-groups> [ [ 0 3 ] dip <slice> reverse-here ] each ]
-                [ RGBA >>component-order ] bi
+                4 <sliced-groups> dup [ [ 0 3 ] dip <slice> reverse-here ] each
             ] change-bitmap
         ] }
         { RGB [
index b4daf675f1de8db988374af268e671231d809e47..0b749d0adeea82751bbb144e20da69753fccd7b1 100755 (executable)
@@ -3,7 +3,7 @@
 USING: accessors combinators io io.encodings.binary io.files kernel
 pack endian constructors sequences arrays math.order math.parser
 prettyprint classes io.binary assocs math math.bitwise byte-arrays
-grouping images ;
+grouping images compression.lzw fry ;
 IN: images.tiff
 
 TUPLE: tiff-image < image ;
@@ -256,6 +256,20 @@ ERROR: bad-small-ifd-type n ;
     dup ifd-entries>>
     [ process-ifd-entry swap ] H{ } map>assoc >>processed-tags ;
 
+ERROR: unhandled-compression compression ;
+
+: (uncompress-strips) ( strips compression -- uncompressed-strips )
+    {
+        { compression-none [ ] }
+        { compression-lzw [ [ lzw-uncompress ] map ] }
+        [ unhandled-compression ]
+    } case ;
+
+: uncompress-strips ( ifd -- ifd )
+    dup '[
+        _ compression find-tag (uncompress-strips)
+    ] change-strips ;
+
 : strips>bitmap ( ifd -- ifd )
     dup strips>> concat >>bitmap ;
 
@@ -284,7 +298,11 @@ ERROR: unknown-component-order ifd ;
         <parsed-tiff>
         read-header dup endianness>> [
             read-ifds
-            dup ifds>> [ process-ifd read-strips strips>bitmap drop ] each
+            dup ifds>> [
+                process-ifd read-strips
+                uncompress-strips
+                strips>bitmap drop
+            ] each
         ] with-endianness
     ] with-file-reader ;