|
|
} | } |
| |
#ifdef CONFIG_PNG_OUTPUT | #ifdef CONFIG_PNG_OUTPUT |
extern void png_write_init(); |
|
| |
int png_save(QEditScreen *s, const char *filename) | int png_save(QEditScreen *s, const char *filename) |
{ | { |
CFBContext *cfb = s->private; | CFBContext *cfb = s->private; |
png_struct * volatile png_ptr = NULL; |
png_structp png_ptr = NULL; |
png_info * volatile info_ptr = NULL; |
png_infop info_ptr = NULL; |
png_byte *row_ptr, *row_pointers[1], *row = NULL; | png_byte *row_ptr, *row_pointers[1], *row = NULL; |
int w, h, x, y; | int w, h, x, y; |
unsigned int r, g, b, v; | unsigned int r, g, b, v; |
|
|
row = malloc(3 * s->width); | row = malloc(3 * s->width); |
if (!row) | if (!row) |
goto fail; | goto fail; |
png_ptr = malloc(sizeof (png_struct)); |
png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); |
if (!png_ptr) | if (!png_ptr) |
goto fail; | goto fail; |
info_ptr = malloc(sizeof (png_info)); |
info_ptr = png_create_info_struct (png_ptr); |
if (!info_ptr) |
if (!info_ptr) { |
goto fail; |
png_destroy_write_struct(&png_ptr, (png_infopp)NULL); |
|
goto fail; |
|
} |
| |
f = fopen(filename, "w"); | f = fopen(filename, "w"); |
if (!f) | if (!f) |
goto fail; | goto fail; |
| |
if (setjmp(png_ptr->jmpbuf)) { | if (setjmp(png_ptr->jmpbuf)) { |
png_write_destroy(png_ptr); |
png_destroy_write_struct(&png_ptr, &info_ptr); |
fail: | fail: |
/* free pointers before returning. Make sure you clean up | /* free pointers before returning. Make sure you clean up |
anything else you've done. */ | anything else you've done. */ |
free(png_ptr); |
|
free(info_ptr); |
|
free(row); | free(row); |
if (f) | if (f) |
fclose(f); | fclose(f); |
return -1; | return -1; |
} | } |
| |
png_info_init(info_ptr); |
|
png_write_init(png_ptr); |
|
png_init_io(png_ptr, f); | png_init_io(png_ptr, f); |
| |
data = (unsigned int *)cfb->base; | data = (unsigned int *)cfb->base; |
|
|
data = (void *)((char *)data + cfb->wrap); | data = (void *)((char *)data + cfb->wrap); |
} | } |
png_write_end(png_ptr, info_ptr); | png_write_end(png_ptr, info_ptr); |
png_write_destroy(png_ptr); |
png_destroy_write_struct (&png_ptr, &info_ptr); |
| |
free(png_ptr); |
|
free(info_ptr); |
|
free(row); | free(row); |
fclose(f); | fclose(f); |
return 0; | return 0; |