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