From 6ee3f802a4acfff4a71cfc9b231fa214d969807b Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 3 Mar 2009 16:24:41 -0600 Subject: [PATCH] initial support for parsing in png files and a test image --- basis/images/png/authors.txt | 1 + basis/images/png/png-tests.factor | 7 +++++ basis/images/png/png.factor | 41 ++++++++++++++++++++++++++++++ basis/images/test-images/rgb.png | Bin 0 -> 4279 bytes 4 files changed, 49 insertions(+) create mode 100755 basis/images/png/authors.txt create mode 100755 basis/images/png/png-tests.factor create mode 100755 basis/images/png/png.factor create mode 100755 basis/images/test-images/rgb.png diff --git a/basis/images/png/authors.txt b/basis/images/png/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/basis/images/png/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/basis/images/png/png-tests.factor b/basis/images/png/png-tests.factor new file mode 100755 index 0000000000..0effa3c3d1 --- /dev/null +++ b/basis/images/png/png-tests.factor @@ -0,0 +1,7 @@ +! Copyright (C) 2009 Doug Coleman. +! See http://factorcode.org/license.txt for BSD license. +USING: tools.test images.png ; +IN: images.png.tests + +: png-test-path ( -- path ) + "vocab:images/test-images/rgb.png" ; \ No newline at end of file diff --git a/basis/images/png/png.factor b/basis/images/png/png.factor new file mode 100755 index 0000000000..0965a13ad6 --- /dev/null +++ b/basis/images/png/png.factor @@ -0,0 +1,41 @@ +! Copyright (C) 2009 Doug Coleman. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors constructors images io io.binary io.encodings.ascii +io.encodings.binary io.encodings.string io.files io.files.info kernel +sequences io.streams.limited ; +IN: images.png + +TUPLE: png-image < image chunks ; + +CONSTRUCTOR: png-image ( -- image ) +V{ } clone >>chunks ; + +TUPLE: png-chunk length type data crc ; + +CONSTRUCTOR: png-chunk ( -- png-chunk ) ; + +CONSTANT: png-header B{ HEX: 89 HEX: 50 HEX: 4e HEX: 47 HEX: 0d HEX: 0a HEX: 1a HEX: 0a } + +ERROR: bad-png-header header ; + +: read-png-header ( -- ) + 8 read dup png-header sequence= [ + bad-png-header + ] unless drop ; + +: read-png-chunks ( image -- image ) + + 4 read be> >>length + 4 read ascii decode >>type + dup length>> read >>data + 4 read >>crc + [ over chunks>> push ] + [ type>> ] bi "IEND" = + [ read-png-chunks ] unless ; + +: load-png ( path -- image ) + [ binary ] [ file-info size>> ] bi stream-throws [ + + read-png-header + read-png-chunks + ] with-input-stream ; diff --git a/basis/images/test-images/rgb.png b/basis/images/test-images/rgb.png new file mode 100755 index 0000000000000000000000000000000000000000..d34914a5ece671e69f9116f466bdae5468da240d GIT binary patch literal 4279 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 V23Ci%u|ErdwWWhat(kA~e*p#CmN@_b literal 0 HcmV?d00001