http://code.google.com/p/gnuxaos/issues/detail?id=55 --- src/util/png.c +++ src/util/png.c @@ -3,6 +3,7 @@ #include #ifdef USE_PNG #include +#include #endif #include #include @@ -31,6 +32,9 @@ png_structp png_ptr; png_infop info_ptr; png_color palette[256]; + png_color_8 sig_bit; + int color_type; + int bit_depth; volatile unsigned short a = 255; volatile unsigned char *b = (volatile unsigned char *) &a; #ifdef _undefined_ @@ -59,7 +63,7 @@ png_destroy_write_struct(&png_ptr, (png_infopp) NULL); return "No memory to create png info structure"; } - if (setjmp(png_ptr->jmpbuf)) { + if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_write_struct(&png_ptr, &info_ptr); fclose(file); return strerror(errno); @@ -78,57 +82,70 @@ png_set_compression_window_bits(png_ptr, 15); png_set_compression_method(png_ptr, 8); - info_ptr->width = image->width; - info_ptr->height = image->height; - /*info_ptr->gamma=1.0; */ - info_ptr->gamma = 0.5; - info_ptr->valid |= PNG_INFO_gAMA | PNG_INFO_pHYs; - info_ptr->x_pixels_per_unit = (png_uint_32) (100 / image->pixelwidth); - info_ptr->y_pixels_per_unit = (png_uint_32) (100 / image->pixelheight); + switch (image->palette->type) + { + case C256: + color_type = PNG_COLOR_TYPE_PALETTE; + bit_depth = image->bytesperpixel * 8; + break; + case SMALLITER: + case LARGEITER: + case GRAYSCALE: + color_type = PNG_COLOR_TYPE_GRAY; + bit_depth = image->bytesperpixel * 8; + break; + case TRUECOLOR: + case TRUECOLOR24: + case TRUECOLOR16: + color_type = PNG_COLOR_TYPE_RGB; + bit_depth = 8; + break; + } + png_set_IHDR (png_ptr, info_ptr, image->width, image->height, bit_depth, + color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, + PNG_FILTER_TYPE_BASE); switch (image->palette->type) { case C256: { int i; - info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; - info_ptr->bit_depth = image->bytesperpixel * 8; - info_ptr->palette = palette; - info_ptr->valid |= PNG_INFO_PLTE; + png_color png_palette[257]; + int png_num_palette; for (i = 0; i < image->palette->end; i++) - info_ptr->palette[i].red = image->palette->rgb[i][0], - info_ptr->palette[i].green = image->palette->rgb[i][1], - info_ptr->palette[i].blue = image->palette->rgb[i][2], - info_ptr->num_palette = image->palette->end; + png_palette[i].red = image->palette->rgb[i][0], + png_palette[i].green = image->palette->rgb[i][1], + png_palette[i].blue = image->palette->rgb[i][2], + png_num_palette = image->palette->end; + png_set_PLTE(png_ptr, info_ptr, png_palette, png_num_palette); } break; - case SMALLITER: - case LARGEITER: - case GRAYSCALE: - info_ptr->color_type = PNG_COLOR_TYPE_GRAY; - info_ptr->bit_depth = image->bytesperpixel * 8; - break; case TRUECOLOR: case TRUECOLOR24: case TRUECOLOR16: - info_ptr->color_type = PNG_COLOR_TYPE_RGB; - info_ptr->bit_depth = 8; - info_ptr->sig_bit.red = 8 - image->palette->info.truec.rprec; - info_ptr->sig_bit.green = 8 - image->palette->info.truec.gprec; - info_ptr->sig_bit.blue = 8 - image->palette->info.truec.bprec; + sig_bit.red = 8 - image->palette->info.truec.rprec; + sig_bit.green = 8 - image->palette->info.truec.gprec; + sig_bit.blue = 8 - image->palette->info.truec.bprec; + png_set_sBIT(png_ptr, info_ptr, &sig_bit); break; } - info_ptr->interlace_type = 0; + + png_write_info (png_ptr, info_ptr); + #ifdef _undefined_ png_set_text(png_ptr, info_ptr, comments, sizeof(comments) / sizeof(png_text)); #endif - png_write_info(png_ptr, info_ptr); + png_set_gAMA(png_ptr, info_ptr, 0.5 /* 1.0 */); + png_set_pHYs(png_ptr, info_ptr, (png_uint_32) (100 / image->pixelwidth), + (png_uint_32) (100 / image->pixelheight), + PNG_RESOLUTION_UNKNOWN); + /*png_set_filler(png_ptr,0,PNG_FILLER_AFTER); */ png_set_packing(png_ptr); if (image->palette->type & (TRUECOLOR | TRUECOLOR24 | TRUECOLOR16)) - png_set_shift(png_ptr, &(info_ptr->sig_bit)); + png_set_shift (png_ptr, &sig_bit); if (*b == 255) png_set_swap(png_ptr); png_set_bgr(png_ptr);