5 PNG
*loadPng (string fname
) {
7 return readPng(cast(ubyte[])read(fname
));
11 Chunk
clone (Chunk
*cc
) {
14 res
.type
[] = cc
.type
[];
15 res
.payload
= cc
.payload
.dup
;
16 res
.checksum
= cc
.checksum
;
20 void main (string
[] args
) {
21 assert(args
.length
== 3);
22 auto png
= loadPng(args
[1]);
23 Chunk grab
= png
.getChunk("grAb").clone
;
24 if (grab
.size
!= 8) assert(0);
26 int ofsx
= grab
.payload
[3]|
(grab
.payload
[2]<<8)|
(grab
.payload
[1]<<16)|
(grab
.payload
[0]<<24);
27 int ofsy
= grab
.payload
[4+3]|
(grab
.payload
[4+2]<<8)|
(grab
.payload
[4+1]<<16)|
(grab
.payload
[4+0]<<24);
28 writeln(" offset: (", ofsx
, ", ", ofsy
, ")");
30 auto destpng
= loadPng(args
[2]);
31 foreach (ref const cc
; destpng
.chunks
) {
32 if (cast(const(char)[])cc
.type
[] == "grAb") {
33 //writeln(" ", cc.payload);
34 int ofsx
= cc
.payload
[3]|
(cc
.payload
[2]<<8)|
(cc
.payload
[1]<<16)|
(cc
.payload
[0]<<24);
35 int ofsy
= cc
.payload
[4+3]|
(cc
.payload
[4+2]<<8)|
(cc
.payload
[4+1]<<16)|
(cc
.payload
[4+0]<<24);
36 writeln(" offset: (", ofsx
, ", ", ofsy
, ")");
40 destpng
.insertChunk(&grab
, true);
43 std
.file
.write(args
[2], writePng(destpng
));