pngquant_error rwpng_write_image8(FILE *outfile, png8_image *mainprog_ptr) { png_structp png_ptr; png_infop info_ptr; pngquant_error retval = rwpng_write_image_init((png_image*)mainprog_ptr, &png_ptr, &info_ptr, outfile); if (retval) return retval; /* set the image parameters appropriately */ int sample_depth; if (mainprog_ptr->num_palette <= 2) sample_depth = 1; else if (mainprog_ptr->num_palette <= 4) sample_depth = 2; else if (mainprog_ptr->num_palette <= 16) sample_depth = 4; else sample_depth = 8; png_set_IHDR(png_ptr, info_ptr, mainprog_ptr->width, mainprog_ptr->height, sample_depth, PNG_COLOR_TYPE_PALETTE, 0, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_BASE); png_set_PLTE(png_ptr, info_ptr, &mainprog_ptr->palette[0], mainprog_ptr->num_palette); if (mainprog_ptr->num_trans > 0) png_set_tRNS(png_ptr, info_ptr, mainprog_ptr->trans, mainprog_ptr->num_trans, NULL); rwpng_write_end(&info_ptr, &png_ptr, (png_image*)mainprog_ptr); return SUCCESS; }
pngquant_error rwpng_write_image8(FILE *outfile, png8_image *mainprog_ptr) { png_structp png_ptr; png_infop info_ptr; pngquant_error retval = rwpng_write_image_init((rwpng_png_image*)mainprog_ptr, &png_ptr, &info_ptr, mainprog_ptr->fast_compression); if (retval) return retval; struct rwpng_write_data write_data; if (mainprog_ptr->maximum_file_size) { write_data = (struct rwpng_write_data){ .buffer = malloc(mainprog_ptr->maximum_file_size), .bytes_left = mainprog_ptr->maximum_file_size, }; if (!write_data.buffer) return PNG_OUT_OF_MEMORY_ERROR; png_set_write_fn(png_ptr, &write_data, user_write_data, user_flush_data); } else {
pngquant_error rwpng_write_image24(FILE *outfile, png24_image *mainprog_ptr) { png_structp png_ptr; png_infop info_ptr; pngquant_error retval = rwpng_write_image_init((png_image*)mainprog_ptr, &png_ptr, &info_ptr, outfile); if (retval) return retval; png_set_IHDR(png_ptr, info_ptr, mainprog_ptr->width, mainprog_ptr->height, 8, PNG_COLOR_TYPE_RGB_ALPHA, 0, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_BASE); rwpng_write_end(&info_ptr, &png_ptr, (png_image*)mainprog_ptr); return SUCCESS; }
pngquant_error rwpng_write_image8(FILE *outfile, png8_image *mainprog_ptr) { png_structp png_ptr; png_infop info_ptr; pngquant_error retval = rwpng_write_image_init((png_image*)mainprog_ptr, &png_ptr, &info_ptr, outfile); if (retval) return retval; // Palette images generally don't gain anything from filtering png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, PNG_FILTER_VALUE_NONE); rwpng_set_gamma(info_ptr, png_ptr, mainprog_ptr->gamma); /* set the image parameters appropriately */ int sample_depth; if (mainprog_ptr->num_palette <= 2) sample_depth = 1; else if (mainprog_ptr->num_palette <= 4) sample_depth = 2; else if (mainprog_ptr->num_palette <= 16) sample_depth = 4; else sample_depth = 8; png_set_IHDR(png_ptr, info_ptr, mainprog_ptr->width, mainprog_ptr->height, sample_depth, PNG_COLOR_TYPE_PALETTE, 0, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_BASE); png_set_PLTE(png_ptr, info_ptr, &mainprog_ptr->palette[0], mainprog_ptr->num_palette); if (mainprog_ptr->num_trans > 0) png_set_tRNS(png_ptr, info_ptr, mainprog_ptr->trans, mainprog_ptr->num_trans, NULL); png_bytepp row_pointers = rwpng_create_row_pointers(info_ptr, png_ptr, mainprog_ptr->indexed_data, mainprog_ptr->height, mainprog_ptr->width); rwpng_write_end(&info_ptr, &png_ptr, row_pointers); free(row_pointers); return SUCCESS; }
pngquant_error write_image(write_info *output_image,const char *filename,const char *newext,int force,int using_stdin) { FILE *outfile; if (using_stdin) { set_binary_mode(stdout); outfile = stdout; } else { char *outname = add_filename_extension(filename,newext); if (!force) { if ((outfile = fopen(outname, "rb")) != NULL) { fprintf(stderr, " error: %s exists; not overwriting\n", outname); fclose(outfile); free(outname); return NOT_OVERWRITING_ERROR; } } if ((outfile = fopen(outname, "wb")) == NULL) { fprintf(stderr, " error: cannot open %s for writing\n", outname); free(outname); return CANT_WRITE_ERROR; } free(outname); } pngquant_error retval = rwpng_write_image_init(outfile, output_image); if (retval) { fprintf(stderr, " rwpng_write_image_init() error\n"); if (!using_stdin) fclose(outfile); return retval; } /* write entire interlaced palette PNG */ retval = rwpng_write_image_whole(output_image); if (!using_stdin) fclose(outfile); /* now we're done with the OUTPUT data and row_pointers, too */ return retval; }
pngquant_error rwpng_write_image24(FILE *outfile, png24_image *mainprog_ptr) { png_structp png_ptr; png_infop info_ptr; pngquant_error retval = rwpng_write_image_init((png_image*)mainprog_ptr, &png_ptr, &info_ptr, outfile); if (retval) return retval; rwpng_set_gamma(info_ptr, png_ptr, mainprog_ptr->gamma); png_set_IHDR(png_ptr, info_ptr, mainprog_ptr->width, mainprog_ptr->height, 8, PNG_COLOR_TYPE_RGB_ALPHA, 0, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_BASE); png_bytepp row_pointers = rwpng_create_row_pointers(info_ptr, png_ptr, mainprog_ptr->rgba_data, mainprog_ptr->height, 0); rwpng_write_end(&info_ptr, &png_ptr, row_pointers); free(row_pointers); return SUCCESS; }