45 ptr = (
void *)mem->stream_ptr;
46 offset = mem->stream_len;
47 memcpy(data, ptr + offset, length);
48 mem->stream_len += length;
69 ptr = mem->stream_ptr;
70 offset = mem->stream_len;
71 memcpy(ptr + offset, data, length);
72 mem->stream_len += length;
103 int interlace, color, compres, filter, bit_depth;
104 g2int j, k, n, bytes;
106 png_infop info_ptr, end_info;
107 png_bytepp row_pointers;
109 png_uint_32 h32, w32;
112 if (png_sig_cmp(pngbuf, 0, 8) != 0)
116 if (!(png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL,
120 if (!(info_ptr = png_create_info_struct(png_ptr)))
122 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
126 if (!(end_info = png_create_info_struct(png_ptr)))
128 png_destroy_read_struct(&png_ptr, (png_infopp)info_ptr, (png_infopp)NULL);
133 if (setjmp(png_jmpbuf(png_ptr)))
135 png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
140 read_io_ptr.stream_ptr = (png_voidp)pngbuf;
141 read_io_ptr.stream_len = 0;
144 png_set_read_fn(png_ptr, (png_voidp)&read_io_ptr, (png_rw_ptr)
user_read_data);
147 png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
150 row_pointers = png_get_rows(png_ptr, info_ptr);
155 (void)png_get_IHDR(png_ptr, info_ptr, &w32, &h32,
156 &bit_depth, &color, &interlace, &compres, &filter);
167 if (color == PNG_COLOR_TYPE_RGB)
169 else if (color == PNG_COLOR_TYPE_RGB_ALPHA)
174 bytes = (*width * bit_depth) / 8;
175 if ((*width * bit_depth) % 8 != 0)
179 for (j = 0; j < *height; j++)
181 for (k = 0; k < bytes; k++)
183 cout[n] = *(row_pointers[j] + k);
189 png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
208 unsigned char *pngbuf)
211 g2int j, bytes, pnglen, bit_depth;
214 png_bytep **row_pointers;
218 if (!(png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)))
221 if (!(info_ptr = png_create_info_struct(png_ptr)))
223 png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
228 if (setjmp(png_jmpbuf(png_ptr)))
230 png_destroy_write_struct(&png_ptr, &info_ptr);
235 write_io_ptr.stream_ptr = (png_voidp)pngbuf;
236 write_io_ptr.stream_len = 0;
239 png_set_write_fn(png_ptr, (png_voidp)&write_io_ptr, (png_rw_ptr)
user_write_data,
244 color_type = PNG_COLOR_TYPE_GRAY;
248 color_type = PNG_COLOR_TYPE_RGB;
250 else if (nbits == 32)
253 color_type = PNG_COLOR_TYPE_RGB_ALPHA;
255 png_set_IHDR(png_ptr, info_ptr, width, height,
256 bit_depth, color_type, PNG_INTERLACE_NONE,
257 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
260 bytes = (width * nbits) / 8;
261 if ((width * nbits) % 8 != 0)
266 row_pointers = malloc(height *
sizeof(png_bytep));
267 for (j = 0; j < height; j++)
268 row_pointers[j] = (png_bytep *)(data + (j * bytes));
270 png_set_rows(png_ptr, info_ptr, (png_bytepp)row_pointers);
273 png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
276 png_destroy_write_struct(&png_ptr, &info_ptr);
278 pnglen = write_io_ptr.stream_len;
void user_read_data(png_structp, png_bytep, png_uint_32)
Custom read function used so that libpng will read a PNG stream from memory instead of a file on disk...
void user_write_data(png_structp, png_bytep, png_uint_32)
Custom write function used to that libpng will write to memory location instead of a file on disk.