From 030351ef876dd8571d2cb596f149c2c70b39bcaa Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sat, 26 Sep 2009 20:09:16 -0500 Subject: [PATCH] move the png filtering code to images.png --- basis/compression/inflate/inflate.factor | 42 +++--------------------- basis/images/png/png.factor | 35 +++++++++++++++++--- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/basis/compression/inflate/inflate.factor b/basis/compression/inflate/inflate.factor index fa3f4d1284..26b851cc1e 100644 --- a/basis/compression/inflate/inflate.factor +++ b/basis/compression/inflate/inflate.factor @@ -1,10 +1,9 @@ ! Copyright (C) 2009 Marc Fauconneau. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors arrays assocs byte-arrays -byte-vectors combinators fry grouping hashtables -compression.huffman images io.binary kernel locals -math math.bitwise math.order math.ranges multiline sequences -sorting ; +USING: accessors arrays assocs byte-vectors combinators +compression.huffman fry hashtables io.binary kernel locals math +math.bitwise math.order math.ranges sequences sorting ; +QUALIFIED-WITH: bitstreams bs IN: compression.inflate QUALIFIED-WITH: bitstreams bs @@ -177,42 +176,9 @@ CONSTANT: dist-table case ] [ produce ] keep call suffix concat ; - - ! [ produce ] keep dip swap suffix - -:: paeth ( a b c -- p ) - a b + c - { a b c } [ [ - abs ] keep 2array ] with map - sort-keys first second ; - -:: png-unfilter-line ( prev curr filter -- curr' ) - prev :> c - prev 3 tail-slice :> b - curr :> a - curr 3 tail-slice :> x - x length [0,b) - filter { - { 0 [ drop ] } - { 1 [ [| n | n x nth n a nth + 256 wrap n x set-nth ] each ] } - { 2 [ [| n | n x nth n b nth + 256 wrap n x set-nth ] each ] } - { 3 [ [| n | n x nth n a nth n b nth + 2/ + 256 wrap n x set-nth ] each ] } - { 4 [ [| n | n x nth n a nth n b nth n c nth paeth + 256 wrap n x set-nth ] each ] } - } case - curr 3 tail ; PRIVATE> -: reverse-png-filter' ( lines -- byte-array ) - [ first ] [ 1 tail ] [ map ] bi-curry@ bi nip - concat [ 128 + ] B{ } map-as ; - -: reverse-png-filter ( lines -- byte-array ) - dup first length 0 prefix - [ { 0 0 } prepend ] map - 2 clump [ - first2 dup [ third ] [ [ 0 2 ] dip set-nth ] bi - png-unfilter-line - ] map B{ } concat-as ; - : zlib-inflate ( bytes -- bytes ) bs: [ check-zlib-header ] [ inflate-loop ] bi diff --git a/basis/images/png/png.factor b/basis/images/png/png.factor index 8dde02687d..d0a001f3f6 100755 --- a/basis/images/png/png.factor +++ b/basis/images/png/png.factor @@ -1,9 +1,9 @@ ! Copyright (C) 2009 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors images io io.binary io.encodings.ascii -io.encodings.binary io.encodings.string io.files io.files.info kernel -sequences io.streams.limited fry combinators arrays math checksums -checksums.crc32 compression.inflate grouping byte-arrays images.loader ; +USING: accessors arrays checksums checksums.crc32 combinators +compression.inflate fry grouping images images.loader io +io.binary io.encodings.ascii io.encodings.string kernel locals +math math.bitwise math.ranges sequences sorting ; IN: images.png SINGLETON: png-image @@ -90,6 +90,33 @@ ERROR: unknown-filter-method image ; [ unknown-color-type ] } case ; +:: paeth ( a b c -- p ) + a b + c - { a b c } [ [ - abs ] keep 2array ] with map + sort-keys first second ; + +:: png-unfilter-line ( prev curr filter -- curr' ) + prev :> c + prev 3 tail-slice :> b + curr :> a + curr 3 tail-slice :> x + x length [0,b) + filter { + { filter-none [ drop ] } + { filter-sub [ [| n | n x nth n a nth + 256 wrap n x set-nth ] each ] } + { filter-up [ [| n | n x nth n b nth + 256 wrap n x set-nth ] each ] } + { filter-average [ [| n | n x nth n a nth n b nth + 2/ + 256 wrap n x set-nth ] each ] } + { filter-paeth [ [| n | n x nth n a nth n b nth n c nth paeth + 256 wrap n x set-nth ] each ] } + } case + curr 3 tail ; + +: reverse-png-filter ( lines -- byte-array ) + dup first length 0 prefix + [ { 0 0 } prepend ] map + 2 clump [ + first2 dup [ third ] [ [ 0 2 ] dip set-nth ] bi + png-unfilter-line + ] map B{ } concat-as ; + : filter-png ( groups loading-png -- byte-array ) filter-method>> { { filter-none [ reverse-png-filter ] }