handle indexed color pngs

db4
Doug Coleman 2009-10-08 20:55:53 -05:00
parent 796b1c8977
commit 8556476b76
1 changed files with 23 additions and 9 deletions

View File

@ -3,7 +3,8 @@
USING: accessors arrays checksums checksums.crc32 combinators USING: accessors arrays checksums checksums.crc32 combinators
compression.inflate fry grouping images images.loader io compression.inflate fry grouping images images.loader io
io.binary io.encodings.ascii io.encodings.string kernel locals io.binary io.encodings.ascii io.encodings.string kernel locals
math math.bitwise math.ranges sequences sorting assocs ; math math.bitwise math.ranges sequences sorting assocs
math.functions ;
QUALIFIED-WITH: bitstreams bs QUALIFIED-WITH: bitstreams bs
IN: images.png IN: images.png
@ -65,6 +66,9 @@ ERROR: bad-checksum ;
: find-chunk ( loading-png string -- chunk ) : find-chunk ( loading-png string -- chunk )
[ chunks>> ] dip '[ type>> _ = ] find nip ; [ chunks>> ] dip '[ type>> _ = ] find nip ;
: find-chunks ( loading-png string -- chunk )
[ chunks>> ] dip '[ type>> _ = ] filter ;
: parse-ihdr-chunk ( loading-png -- loading-png ) : parse-ihdr-chunk ( loading-png -- loading-png )
dup "IHDR" find-chunk data>> { dup "IHDR" find-chunk data>> {
[ [ 0 4 ] dip subseq be> >>width ] [ [ 0 4 ] dip subseq be> >>width ]
@ -77,8 +81,7 @@ ERROR: bad-checksum ;
} cleave ; } cleave ;
: find-compressed-bytes ( loading-png -- bytes ) : find-compressed-bytes ( loading-png -- bytes )
chunks>> [ type>> "IDAT" = ] filter "IDAT" find-chunks [ data>> ] map concat ;
[ data>> ] map concat ;
ERROR: unknown-color-type n ; ERROR: unknown-color-type n ;
ERROR: unimplemented-color-type image ; ERROR: unimplemented-color-type image ;
@ -91,6 +94,7 @@ ERROR: unimplemented-color-type image ;
{ greyscale [ 1 ] } { greyscale [ 1 ] }
{ truecolor [ 3 ] } { truecolor [ 3 ] }
{ greyscale-alpha [ 2 ] } { greyscale-alpha [ 2 ] }
{ indexed-color [ 1 ] }
{ truecolor-alpha [ 4 ] } { truecolor-alpha [ 4 ] }
[ unknown-color-type ] [ unknown-color-type ]
} case ; inline } case ; inline
@ -160,6 +164,7 @@ ERROR: unimplemented-interlace ;
height [ height [
8 bs bs:read 8 bs bs:read
count [ depth bs bs:read ] replicate swap prefix count [ depth bs bs:read ] replicate swap prefix
8 bs bs:align
] replicate ] replicate
#components bit-depth 16 = [ 2 * ] when reverse-png-filter ; #components bit-depth 16 = [ 2 * ] when reverse-png-filter ;
@ -191,6 +196,20 @@ ERROR: unknown-component-type n ;
: decode-greyscale ( loading-png -- byte-array ) : decode-greyscale ( loading-png -- byte-array )
[ raw-bytes ] keep scale-greyscale ; [ raw-bytes ] keep scale-greyscale ;
: decode-greyscale-alpha ( loading-image -- byte-array )
[ raw-bytes ] [ bit-depth>> ] bi 16 = [
4 group [ first4 [ swap ] 2dip 4array ] map B{ } concat-as
] when ;
ERROR: invalid-PLTE array ;
: verify-PLTE ( seq -- seq )
dup length 3 divisor? [ invalid-PLTE ] unless ;
: decode-indexed-color ( loading-image -- byte-array )
[ raw-bytes ] keep "PLTE" find-chunk data>> verify-PLTE
3 group '[ _ nth ] { } map-as B{ } concat-as ; inline
ERROR: invalid-color-type/bit-depth loading-png ; ERROR: invalid-color-type/bit-depth loading-png ;
@ -213,11 +232,6 @@ ERROR: invalid-color-type/bit-depth loading-png ;
: validate-truecolor-alpha ( loading-png -- loading-png ) : validate-truecolor-alpha ( loading-png -- loading-png )
{ 8 16 } validate-bit-depth ; { 8 16 } validate-bit-depth ;
: decode-greyscale-alpha ( loading-image -- byte-array' )
[ raw-bytes ] [ bit-depth>> ] bi 16 = [
4 group [ first4 [ swap ] 2dip 4array ] map B{ } concat-as
] when ;
: loading-png>bitmap ( loading-png -- bytes component-order ) : loading-png>bitmap ( loading-png -- bytes component-order )
dup color-type>> { dup color-type>> {
{ greyscale [ { greyscale [
@ -227,7 +241,7 @@ ERROR: invalid-color-type/bit-depth loading-png ;
validate-truecolor raw-bytes RGB validate-truecolor raw-bytes RGB
] } ] }
{ indexed-color [ { indexed-color [
validate-indexed-color unimplemented-color-type validate-indexed-color decode-indexed-color RGB
] } ] }
{ greyscale-alpha [ { greyscale-alpha [
validate-greyscale-alpha decode-greyscale-alpha LA validate-greyscale-alpha decode-greyscale-alpha LA