mirror of
https://git.code.sf.net/p/libpng/code.git
synced 2025-07-10 18:04:09 +02:00
96 lines
1.6 KiB
C
96 lines
1.6 KiB
C
/* pngzopz2i */
|
|
|
|
/* Copyright 2013 Glenn Randers-Pehrson
|
|
* Released under the pngcrush license (equivalent to the libpng license)
|
|
*/
|
|
|
|
/* Usage:
|
|
* pngzop_zlib_to_idat < file.zlib > file_out.idat
|
|
*
|
|
* file.zlib is the zlib datastream from zopli --zlib file_in.idat
|
|
* file_out.idat is the zlib datastream enclosed in PNG IDAT chunks.
|
|
* This is a single file that may contain multiple IDAT chunks.
|
|
*
|
|
* To do: make the maximum IDAT chunk data length an option (currently fixed
|
|
* at 250000 bytes).
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <zlib.h> /* for crc32 */
|
|
|
|
void
|
|
put_uLong(uLong val)
|
|
{
|
|
putchar(val >> 24);
|
|
putchar(val >> 16);
|
|
putchar(val >> 8);
|
|
putchar(val >> 0);
|
|
}
|
|
|
|
void
|
|
put_chunk(const unsigned char *chunk, uInt length)
|
|
{
|
|
uLong crc;
|
|
|
|
put_uLong(length-4); /* Exclude the tag */
|
|
fwrite(chunk, 1, length, stdout);
|
|
|
|
crc = crc32(0, Z_NULL, 0);
|
|
put_uLong(crc32(crc, chunk, length));
|
|
}
|
|
|
|
int
|
|
main()
|
|
{
|
|
unsigned char buf[250000];
|
|
int c;
|
|
const unsigned char idat[] = { 73, 68, 65, 84 /* "IDAT" */ };
|
|
int n=6;
|
|
|
|
/* IDAT */
|
|
buf[0]=idat[0];
|
|
buf[1]=idat[1];
|
|
buf[2]=idat[2];
|
|
buf[3]=idat[3];
|
|
|
|
/* CMF */
|
|
c=getchar();
|
|
if (c != EOF)
|
|
buf[4]=(unsigned char) c;
|
|
|
|
/* FLAGS */
|
|
if (c != EOF)
|
|
{
|
|
c=getchar();
|
|
if (c != EOF)
|
|
buf[5]=(unsigned char) c;
|
|
}
|
|
|
|
if (c != EOF)
|
|
for(;;)
|
|
{
|
|
/* read up to n=250000 bytes */
|
|
|
|
c=getchar();
|
|
|
|
if (c != EOF)
|
|
{
|
|
buf[n]=(unsigned char) c;
|
|
n++;
|
|
}
|
|
|
|
if (c != EOF && n < 250000)
|
|
continue;
|
|
|
|
put_chunk(buf, n);
|
|
|
|
if (c == EOF)
|
|
break;
|
|
|
|
n=4;
|
|
}
|
|
}
|
|
|