xref: /aosp_15_r20/external/libpng/contrib/libtests/fakepng.c (revision a67afe4df73cf47866eedc69947994b8ff839aba)
1*a67afe4dSAndroid Build Coastguard Worker /* Fake a PNG - just write it out directly.
2*a67afe4dSAndroid Build Coastguard Worker  *
3*a67afe4dSAndroid Build Coastguard Worker  * COPYRIGHT: Written by John Cunningham Bowler, 2014.
4*a67afe4dSAndroid Build Coastguard Worker  * To the extent possible under law, the author has waived all copyright and
5*a67afe4dSAndroid Build Coastguard Worker  * related or neighboring rights to this work.  This work is published from:
6*a67afe4dSAndroid Build Coastguard Worker  * United States.
7*a67afe4dSAndroid Build Coastguard Worker  *
8*a67afe4dSAndroid Build Coastguard Worker  */
9*a67afe4dSAndroid Build Coastguard Worker 
10*a67afe4dSAndroid Build Coastguard Worker #include <stdio.h>
11*a67afe4dSAndroid Build Coastguard Worker #include <zlib.h> /* for crc32 */
12*a67afe4dSAndroid Build Coastguard Worker 
13*a67afe4dSAndroid Build Coastguard Worker void
put_uLong(uLong val)14*a67afe4dSAndroid Build Coastguard Worker put_uLong(uLong val)
15*a67afe4dSAndroid Build Coastguard Worker {
16*a67afe4dSAndroid Build Coastguard Worker    putchar(val >> 24);
17*a67afe4dSAndroid Build Coastguard Worker    putchar(val >> 16);
18*a67afe4dSAndroid Build Coastguard Worker    putchar(val >>  8);
19*a67afe4dSAndroid Build Coastguard Worker    putchar(val >>  0);
20*a67afe4dSAndroid Build Coastguard Worker }
21*a67afe4dSAndroid Build Coastguard Worker 
22*a67afe4dSAndroid Build Coastguard Worker void
put_chunk(const unsigned char * chunk,uInt length)23*a67afe4dSAndroid Build Coastguard Worker put_chunk(const unsigned char *chunk, uInt length)
24*a67afe4dSAndroid Build Coastguard Worker {
25*a67afe4dSAndroid Build Coastguard Worker    uLong crc;
26*a67afe4dSAndroid Build Coastguard Worker 
27*a67afe4dSAndroid Build Coastguard Worker    put_uLong(length-4); /* Exclude the tag */
28*a67afe4dSAndroid Build Coastguard Worker 
29*a67afe4dSAndroid Build Coastguard Worker    fwrite(chunk, length, 1, stdout);
30*a67afe4dSAndroid Build Coastguard Worker 
31*a67afe4dSAndroid Build Coastguard Worker    crc = crc32(0, Z_NULL, 0);
32*a67afe4dSAndroid Build Coastguard Worker    put_uLong(crc32(crc, chunk, length));
33*a67afe4dSAndroid Build Coastguard Worker }
34*a67afe4dSAndroid Build Coastguard Worker 
35*a67afe4dSAndroid Build Coastguard Worker const unsigned char signature[] =
36*a67afe4dSAndroid Build Coastguard Worker {
37*a67afe4dSAndroid Build Coastguard Worker    137, 80, 78, 71, 13, 10, 26, 10
38*a67afe4dSAndroid Build Coastguard Worker };
39*a67afe4dSAndroid Build Coastguard Worker 
40*a67afe4dSAndroid Build Coastguard Worker const unsigned char IHDR[] =
41*a67afe4dSAndroid Build Coastguard Worker {
42*a67afe4dSAndroid Build Coastguard Worker    73, 72, 68, 82, /* IHDR */
43*a67afe4dSAndroid Build Coastguard Worker    0, 0, 0, 1, /* width */
44*a67afe4dSAndroid Build Coastguard Worker    0, 0, 0, 1, /* height */
45*a67afe4dSAndroid Build Coastguard Worker    1, /* bit depth */
46*a67afe4dSAndroid Build Coastguard Worker    0, /* color type: greyscale */
47*a67afe4dSAndroid Build Coastguard Worker    0, /* compression method */
48*a67afe4dSAndroid Build Coastguard Worker    0, /* filter method */
49*a67afe4dSAndroid Build Coastguard Worker    0  /* interlace method: none */
50*a67afe4dSAndroid Build Coastguard Worker };
51*a67afe4dSAndroid Build Coastguard Worker 
52*a67afe4dSAndroid Build Coastguard Worker const unsigned char unknown[] =
53*a67afe4dSAndroid Build Coastguard Worker {
54*a67afe4dSAndroid Build Coastguard Worker    'u', 'n', 'K', 'n' /* "unKn" - private safe to copy */
55*a67afe4dSAndroid Build Coastguard Worker };
56*a67afe4dSAndroid Build Coastguard Worker 
57*a67afe4dSAndroid Build Coastguard Worker int
main(void)58*a67afe4dSAndroid Build Coastguard Worker main(void)
59*a67afe4dSAndroid Build Coastguard Worker {
60*a67afe4dSAndroid Build Coastguard Worker    fwrite(signature, sizeof signature, 1, stdout);
61*a67afe4dSAndroid Build Coastguard Worker    put_chunk(IHDR, sizeof IHDR);
62*a67afe4dSAndroid Build Coastguard Worker 
63*a67afe4dSAndroid Build Coastguard Worker    for (;;)
64*a67afe4dSAndroid Build Coastguard Worker       put_chunk(unknown, sizeof unknown);
65*a67afe4dSAndroid Build Coastguard Worker }
66