1ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik/* Fake a PNG - just write it out directly. */
2ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <stdio.h>
3ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <zlib.h> /* for crc32 */
4ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
5ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikvoid
6ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikput_uLong(uLong val)
7ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik{
8ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   putchar(val >> 24);
9ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   putchar(val >> 16);
10ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   putchar(val >>  8);
11ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   putchar(val >>  0);
12ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik}
13ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
14ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikvoid
15ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikput_chunk(const unsigned char *chunk, uInt length)
16ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik{
17ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   uLong crc;
18ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
19ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   put_uLong(length-4); /* Exclude the tag */
20ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
21ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   fwrite(chunk, length, 1, stdout);
22ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
23ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   crc = crc32(0, Z_NULL, 0);
24ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   put_uLong(crc32(crc, chunk, length));
25ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik}
26ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
27ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikconst unsigned char signature[] =
28ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik{
29ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   137, 80, 78, 71, 13, 10, 26, 10
30ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik};
31ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
32ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikconst unsigned char IHDR[] =
33ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik{
34ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   73, 72, 68, 82, /* IHDR */
35ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   0, 0, 0, 1, /* width */
36ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   0, 0, 0, 1, /* height */
37ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   1, /* bit depth */
38ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   0, /* color type: greyscale */
39ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   0, /* compression method */
40ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   0, /* filter method */
41ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   0  /* interlace method: none */
42ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik};
43ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
44ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikconst unsigned char unknown[] =
45ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik{
46ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   'u', 'n', 'K', 'n' /* "unKn" - private safe to copy */
47ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik};
48ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
49ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikint
50ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikmain(void)
51ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik{
52ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   fwrite(signature, sizeof signature, 1, stdout);
53ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   put_chunk(IHDR, sizeof IHDR);
54ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik
55ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik   for(;;)
56ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik      put_chunk(unknown, sizeof unknown);
57ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik}
58