summaryrefslogtreecommitdiff
path: root/gdk-pixbuf/io-png.c
diff options
context:
space:
mode:
authorMark Crichton <crichton@src.gnome.org>1999-07-30 15:34:18 +0000
committerMark Crichton <crichton@src.gnome.org>1999-07-30 15:34:18 +0000
commit0899b4718ba6f9a3ba9decc966a7714f185c2baf (patch)
treeb023c74efc65716cfa1583cd105df6f06c4c48a7 /gdk-pixbuf/io-png.c
parent3d679818a0929b0ec7a8013d9be3cc0163fe557e (diff)
downloadgtk+-0899b4718ba6f9a3ba9decc966a7714f185c2baf.tar.gz
For some wierd reason, the commit yesterday didn't get everything. (99% of
For some wierd reason, the commit yesterday didn't get everything. (99% of the added code was MISSING) Wierd. Mark
Diffstat (limited to 'gdk-pixbuf/io-png.c')
-rw-r--r--gdk-pixbuf/io-png.c68
1 files changed, 67 insertions, 1 deletions
diff --git a/gdk-pixbuf/io-png.c b/gdk-pixbuf/io-png.c
index ec14380951..ed5bfca50b 100644
--- a/gdk-pixbuf/io-png.c
+++ b/gdk-pixbuf/io-png.c
@@ -166,4 +166,70 @@ GdkPixBuf *image_load(FILE * f)
int image_save(GdkPixBuf *pixbuf, FILE *file)
{
- png_structp,
+ png_structp png_ptr;
+ png_infop info_ptr;
+ art_u8 *data;
+ gint y, h, w;
+ png_bytep row_ptr;
+ png_color_8 sig_bit;
+ gint type;
+
+ g_return_val_if_fail(f != NULL, NULL);
+ g_return_val_if_fail(pixbuf != NULL, NULL);
+
+ h = pixbuf->art_pixbuf->height;
+ w = pixbuf->art_pixbuf->width;
+
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
+ NULL, NULL, NULL);
+ if (png_ptr == NULL) {
+ fclose(file);
+ return NULL;
+ }
+
+ info_ptr = png_create_info_struct(png_ptr);
+ if (info_ptr == NULL) {
+ fclose(file);
+ png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
+ return NULL;
+ }
+
+ if (setjmp(png_ptr->jmpbuf)) {
+ fclose(file);
+ png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
+ return NULL;
+ }
+
+ png_init_io(png_ptr, file);
+ if (pixbuf->art_pixbuf->has_alpha) {
+ sig_bit.alpha = 8;
+ type = PNG_COLOR_TYPE_RGB_ALPHA;
+ } else {
+ sig_bit.alpha = 0;
+ type = PNG_COLOR_TYPE_RGB;
+ }
+
+ sig_bit.red = sig_bit.green = sig_bit.blue = 8;
+ png_set_IHDR(png_ptr, info_ptr, w, h, 8, type, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
+ png_set_sBIT(png_ptr, info_ptr, &sig_bit);
+ png_write_info(png_ptr, info_ptr);
+ png_set_shift(png_ptr, &sig_bit);
+ png_set_packing(png_ptr);
+
+ data = pixbuf->art_pixbuf->pixels;
+
+ for (y = 0; y < h; y++) {
+ if (pixbuf->art_pixbuf->has_alpha)
+ row_ptr[y] = data + (w * y * 4);
+ else
+ row_ptr[y] = data + (w * y * 3);
+ }
+
+ png_write_image(png_ptr, row_ptr);
+ png_write_end(png_ptr, info_ptr);
+ png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
+
+ return TRUE;
+}
+