20 unsigned char *stream_ptr;
47 ptr = mem->stream_ptr;
48 offset = mem->stream_len;
49 memcpy(ptr + offset, data, length);
50 mem->stream_len += length;
83 g2int j, bytes, pnglen, bit_depth;
86 png_bytep **row_pointers;
90 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL,
95 info_ptr = png_create_info_struct(png_ptr);
98 png_destroy_write_struct(&png_ptr,(png_infopp)NULL);
103 if (setjmp(png_jmpbuf(png_ptr)))
105 png_destroy_write_struct(&png_ptr, &info_ptr);
110 write_io_ptr.stream_ptr = (png_voidp)pngbuf;
111 write_io_ptr.stream_len = 0;
114 png_set_write_fn(png_ptr, (png_voidp)&write_io_ptr, (png_rw_ptr)
user_write_data,
119 color_type = PNG_COLOR_TYPE_GRAY;
123 color_type = PNG_COLOR_TYPE_RGB;
125 else if (*nbits == 32)
128 color_type = PNG_COLOR_TYPE_RGB_ALPHA;
130 png_set_IHDR(png_ptr, info_ptr, *width, *height,
131 bit_depth, color_type, PNG_INTERLACE_NONE,
132 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
136 row_pointers = malloc((*height) *
sizeof(png_bytep));
137 for (
j = 0;
j < *height;
j++)
138 row_pointers[
j] = (png_bytep *)(data+(
j * (*width) * bytes));
139 png_set_rows(png_ptr, info_ptr, (png_bytepp)row_pointers);
142 png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
145 png_destroy_write_struct(&png_ptr, &info_ptr);
147 pnglen = write_io_ptr.stream_len;
int enc_png(char *data, g2int *width, g2int *height, g2int *nbits, char *pngbuf)
create png_structs to write png stream into memory.
struct png_stream png_stream
location to write PNG stream.
static void user_write_data(png_structp png_ptr, png_bytep data, png_uint_32 length)
Custom write function used to that libpng will write to memory location instead of a file on disk.
int g2int
Long integer type.
static void user_flush_data(png_structp png_ptr)
Dummy Custom flush function.