void pngquant_tiny(FILE *src, FILE *dest) { liq_attr *attr; liq_result *rv; liq_image *input_image = NULL; png24_image input_png = {}; png8_image output_png = {}; attr = liq_attr_create(); read_image(attr, src, &input_png, &input_image); rv = liq_quantize_image(attr, input_image); liq_set_output_gamma(rv, GAMMA); prepare_output_image(rv, input_image, &output_png); liq_write_remapped_image_rows(rv, input_image, output_png.row_pointers); set_palette(rv, &output_png); output_png.fast_compression = FAST_COMPRESSION; rwpng_write_image8(dest, &output_png); liq_result_destroy(rv); liq_image_destroy(input_image); png24_image_destroy(&input_png); png8_image_destroy(&output_png); }
static pngquant_error write_image(png8_image *output_image, png24_image *output_image24, const char *outname, struct pngquant_options *options) { FILE *outfile; if (options->using_stdin) { set_binary_mode(stdout); outfile = stdout; if (output_image) { verbose_printf(options, " writing %d-color image to stdout", output_image->num_palette); } else { verbose_printf(options, " writing truecolor image to stdout"); } } else { if ((outfile = fopen(outname, "wb")) == NULL) { fprintf(stderr, " error: cannot open %s for writing\n", outname); return CANT_WRITE_ERROR; } const char *outfilename = strrchr(outname, '/'); if (outfilename) { outfilename++; } else { outfilename = outname; } if (output_image) { verbose_printf(options, " writing %d-color image as %s", output_image->num_palette, outfilename); } else { verbose_printf(options, " writing truecolor image as %s", outfilename); } } pngquant_error retval; #pragma omp critical (libpng) { if (output_image) { retval = rwpng_write_image8(outfile, output_image); } else { retval = rwpng_write_image24(outfile, output_image24); } } if (retval && retval != TOO_LARGE_FILE) { fprintf(stderr, " error: failed writing image to %s\n", outname); } if (!options->using_stdin) { fclose(outfile); } return retval; }
static pngquant_error write_image(png8_image *output_image, png24_image *output_image24, const char *outname, struct pngquant_options *options) { FILE *outfile; char *tempname = NULL; if (options->using_stdout) { set_binary_mode(stdout); outfile = stdout; if (output_image) { verbose_printf(options, " writing %d-color image to stdout", output_image->num_palette); } else { verbose_printf(options, " writing truecolor image to stdout"); } } else { tempname = temp_filename(outname); if (!tempname) return OUT_OF_MEMORY_ERROR; if ((outfile = fopen(tempname, "wb")) == NULL) { fprintf(stderr, " error: cannot open '%s' for writing\n", tempname); free(tempname); return CANT_WRITE_ERROR; } if (output_image) { verbose_printf(options, " writing %d-color image as %s", output_image->num_palette, filename_part(outname)); } else { verbose_printf(options, " writing truecolor image as %s", filename_part(outname)); } } pngquant_error retval; #pragma omp critical (libpng) { if (output_image) { retval = rwpng_write_image8(outfile, output_image); } else { retval = rwpng_write_image24(outfile, output_image24); } } if (!options->using_stdout) { fclose(outfile); if (SUCCESS == retval) { // Image has been written to a temporary file and then moved over destination. // This makes replacement atomic and avoids damaging destination file on write error. if (!replace_file(tempname, outname, options->force)) { retval = CANT_WRITE_ERROR; } } if (retval) { unlink(tempname); } } free(tempname); if (retval && retval != TOO_LARGE_FILE) { fprintf(stderr, " error: failed writing image to %s\n", outname); } return retval; }