: write2 ( n -- ) 2 >le write ;
: write4 ( n -- ) 4 >le write ;
-TUPLE: bitmap-image < image ;
+SINGLETON: bitmap-image
+"bmp" bitmap-image register-image-class
TUPLE: loading-bitmap
magic size reserved1 reserved2 offset header-length width
[ unknown-component-order ]
} case ;
-: loading-bitmap>image ( image loading-bitmap -- bitmap-image )
+M: bitmap-image load-image* ( path bitmap-image -- bitmap )
+ drop load-bitmap
+ [ image new ] dip
{
[ loading-bitmap>bytes >>bitmap ]
[ [ width>> ] [ height>> abs ] bi 2array >>dim ]
[ bitmap>component-order >>component-order ]
} cleave ;
-M: bitmap-image load-image* ( path loading-bitmap -- bitmap )
- swap load-bitmap loading-bitmap>image ;
-
-"bmp" bitmap-image register-image-class
-
PRIVATE>
: bitmap>color-index ( bitmap -- byte-array )
: has-alpha? ( image -- ? ) component-order>> alpha-channel? ;
-GENERIC: load-image* ( path tuple -- image )
-
-: make-image ( bitmap -- image )
- ! bitmap is a sequence of sequences of pixels which are RGBA
- <image>
- over [ first length ] [ length ] bi 2array >>dim
- RGBA >>component-order
- swap concat concat B{ } like >>bitmap ;
+GENERIC: load-image* ( path class -- image )
<PRIVATE
math.constants math.functions math.matrices math.order\r
math.ranges math.vectors memoize multiline namespaces\r
sequences sequences.deep images.loader ;\r
+QUALIFIED-WITH: bitstreams bs\r
IN: images.jpeg\r
\r
-QUALIFIED-WITH: bitstreams bs\r
+SINGLETON: jpeg-image\r
+{ "jpg" "jpeg" } [ jpeg-image register-image-class ] each\r
\r
-TUPLE: jpeg-image < image\r
+TUPLE: loading-jpeg < image\r
{ headers }\r
{ bitstream }\r
{ color-info initial: { f f f f } }\r
\r
<PRIVATE\r
\r
-CONSTRUCTOR: jpeg-image ( headers bitstream -- image ) ;\r
+CONSTRUCTOR: loading-jpeg ( headers bitstream -- image ) ;\r
\r
SINGLETONS: SOF DHT DAC RST SOI EOI SOS DQT DNL DRI DHP EXP\r
APP JPG COM TEM RES ;\r
\r
CONSTRUCTOR: jpeg-color-info ( h v quant-table -- jpeg-color-info ) ;\r
\r
-: jpeg> ( -- jpeg-image ) jpeg-image get ;\r
+: jpeg> ( -- jpeg-image ) loading-jpeg get ;\r
\r
: apply-diff ( dc color -- dc' )\r
[ diff>> + dup ] [ (>>diff) ] bi ;\r
binary [\r
parse-marker { SOI } assert=\r
parse-headers\r
- contents <jpeg-image>\r
+ contents <loading-jpeg>\r
] with-file-reader\r
- dup jpeg-image [\r
+ dup loading-jpeg [\r
baseline-parse\r
baseline-decompress\r
jpeg> bitmap>> 3 <groups> [ color-transform ] change-each\r
\r
M: jpeg-image load-image* ( path jpeg-image -- bitmap )\r
drop load-jpeg ;\r
-\r
-{ "jpg" "jpeg" } [ jpeg-image register-image-class ] each\r
ERROR: unknown-image-extension extension ;
<PRIVATE
+
SYMBOL: types
types [ H{ } clone ] initialize
: image-class ( path -- class )
file-extension >lower types get ?at
[ unknown-image-extension ] unless ;
+
PRIVATE>
: register-image-class ( extension class -- )
swap types get set-at ;
: load-image ( path -- image )
- dup image-class new load-image* ;
+ dup image-class load-image* ;
images.loader ;
IN: images.png
-TUPLE: png-image < image chunks
+SINGLETON: png-image
+"png" png-image register-image-class
+
+TUPLE: loading-png < image chunks
width height bit-depth color-type compression-method
filter-method interlace-method uncompressed ;
-CONSTRUCTOR: png-image ( -- image )
-V{ } clone >>chunks ;
+CONSTRUCTOR: loading-png ( -- image )
+ V{ } clone >>chunks ;
TUPLE: png-chunk length type data ;
: load-png ( path -- image )
binary stream-throws <limited-file-reader> [
- <png-image>
+ <loading-png>
read-png-header
read-png-chunks
parse-ihdr-chunk
M: png-image load-image*
drop load-png ;
-
-"png" png-image register-image-class
images.loader ;
IN: images.tiff
-TUPLE: tiff-image < image ;
+SINGLETON: tiff-image
TUPLE: parsed-tiff endianness the-answer ifd-offset ifds ;
CONSTRUCTOR: parsed-tiff ( -- tiff ) V{ } clone >>ifds ;
[ unknown-component-order ]
} case ;
-: normalize-alpha-data ( seq -- byte-array )
- B{ } like dup
- byte-array>float-array
- 4 <sliced-groups>
- [
- dup fourth dup 0 = [
- 2drop
- ] [
- [ 3 head-slice ] dip '[ _ / ] change-each
- ] if
- ] each ;
-
: handle-alpha-data ( ifd -- ifd )
dup extra-samples find-tag {
{ extra-samples-associated-alpha-data [ ] }
[ [ image-width find-tag ] [ image-length find-tag ] bi 2array ]
[ ifd-component-order f ]
[ bitmap>> ]
- } cleave tiff-image boa ;
+ } cleave image boa ;
: tiff>image ( image -- image )
ifds>> [ ifd>image ] map first ;