static int read_user_chunk_callback(png_struct *png_ptr, png_unknown_chunkp chunk) { png_uint_32 *my_user_chunk_data; /* Return one of the following: * return (-n); chunk had an error * return (0); did not recognize * return (n); success * * The unknown chunk structure contains the chunk data: * png_byte name[5]; * png_byte *data; * png_size_t size; * * Note that libpng has already taken care of the CRC handling. */ if (chunk->name[0] == 115 && chunk->name[1] == 84 && /* s T */ chunk->name[2] == 69 && chunk->name[3] == 82) /* E R */ { /* Found sTER chunk */ if (chunk->size != 1) return (-1); /* Error return */ if (chunk->data[0] != 0 && chunk->data[0] != 1) return (-1); /* Invalid mode */ my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr); my_user_chunk_data[0]=chunk->data[0]+1; return (1); } if (chunk->name[0] != 118 || chunk->name[1] != 112 || /* v p */ chunk->name[2] != 65 || chunk->name[3] != 103) /* A g */ return (0); /* Did not recognize */ /* Found ImageMagick vpAg chunk */ if (chunk->size != 9) return (-1); /* Error return */ my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr); my_user_chunk_data[1]=png_get_uint_31(png_ptr, chunk->data); my_user_chunk_data[2]=png_get_uint_31(png_ptr, chunk->data + 4); my_user_chunk_data[3]=(png_uint_32)chunk->data[8]; return (1); }
static int sk_read_user_chunk(png_structp png_ptr, png_unknown_chunkp chunk) { SkImageDecoder::Peeker* peeker = (SkImageDecoder::Peeker*)png_get_user_chunk_ptr(png_ptr); // peek() returning true means continue decoding return peeker->peek((const char*)chunk->name, chunk->data, chunk->size) ? 1 : -1; }
//--------------------------------------------------------------------------- // read_chunk_callback static int __fastcall PNG_read_chunk_callback(png_structp png_ptr,png_unknown_chunkp chunk) { // handle vpAg chunk (this will contain the virtual page size of the image) // vpAg chunk can be embeded by ImageMagick -trim option etc. // we don't care about how the chunk bit properties are being provided. if( (chunk->name[0] == 0x76/*'v'*/ || chunk->name[0] == 0x56/*'V'*/) && (chunk->name[1] == 0x70/*'p'*/ || chunk->name[1] == 0x50/*'P'*/) && (chunk->name[2] == 0x61/*'a'*/ || chunk->name[2] == 0x41/*'A'*/) && (chunk->name[3] == 0x67/*'g'*/ || chunk->name[3] == 0x47/*'G'*/) && chunk->size >= 9) { TDeePNG * deepng = reinterpret_cast<TDeePNG *>(png_get_user_chunk_ptr(png_ptr)); // vpAg found /* uint32 width uint32 height uchar unit */ // be careful because the integers are stored in network byte order #define PNG_read_be32(a) (((unsigned long)(a)[0]<<24)+\ ((unsigned long)(a)[1]<<16)+((unsigned long)(a)[2]<<8)+\ ((unsigned long)(a)[3])) unsigned long width = PNG_read_be32(chunk->data+0); unsigned long height = PNG_read_be32(chunk->data+4); unsigned char unit = chunk->data[8]; // set vpag information deepng->SetVirtualPage(width, height, unit); return 1; // chunk read success } return 0; // did not recognize }
static int _loadPNGChunkHandler(png_structp png, png_unknown_chunkp chunk) { if (strcmp((const char*) chunk->name, "gbAs") != 0) { return 0; } struct GBASerializedState state; uLongf len = sizeof(state); uncompress((Bytef*) &state, &len, chunk->data, chunk->size); if (!GBADeserialize(png_get_user_chunk_ptr(png), &state)) { longjmp(png_jmpbuf(png), 1); } return 1; }
static int sk_read_user_chunk(png_structp png_ptr, png_unknown_chunkp chunk) { SkPngChunkReader* chunkReader = (SkPngChunkReader*)png_get_user_chunk_ptr(png_ptr); // readChunk() returning true means continue decoding return chunkReader->readChunk((const char*)chunk->name, chunk->data, chunk->size) ? 1 : -1; }