Skip to content

Commit

Permalink
Separated mainprog_info into read_info and write_info
Browse files Browse the repository at this point in the history
  • Loading branch information
kornelski committed Feb 17, 2011
1 parent 45d4406 commit b155880
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 35 deletions.
26 changes: 9 additions & 17 deletions pngquant.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ int main(int argc, char *argv[])
return latest_error;
}

int set_palette(mainprog_info *rwpng_info, int newcolors, int* remap, acolorhist_vector acolormap)
int set_palette(write_info *rwpng_info, int newcolors, int* remap, acolorhist_vector acolormap)
{
/*
** Step 3.4 [GRR]: set the bit-depth appropriately, given the actual
Expand Down Expand Up @@ -306,7 +306,7 @@ int set_palette(mainprog_info *rwpng_info, int newcolors, int* remap, acolorhist
return 0;
}

int remap_to_palette(mainprog_info *input_image, mainprog_info *output_image, int floyd, double min_opaque_val, int ie_bug, int newcolors, int* remap, acolorhist_vector acolormap)
int remap_to_palette(read_info *input_image, write_info *output_image, int floyd, double min_opaque_val, int ie_bug, int newcolors, int* remap, acolorhist_vector acolormap)
{
uch *pQ;
rgb_pixel *pP;
Expand Down Expand Up @@ -505,7 +505,7 @@ char *add_filename_extension(const char *filename, const char *newext)
return outname;
}

pngquant_error write_image(mainprog_info *output_image,const char *filename,const char *newext,int force,int using_stdin)
pngquant_error write_image(write_info *output_image,const char *filename,const char *newext,int force,int using_stdin)
{
FILE *outfile;
if (using_stdin) {
Expand Down Expand Up @@ -556,7 +556,7 @@ pngquant_error write_image(mainprog_info *output_image,const char *filename,cons
return retval;
}

pngquant_error read_image(mainprog_info *input_image, const char *filename, int using_stdin)
pngquant_error read_image(read_info *input_image, const char *filename, int using_stdin)
{
/* can't do much if we don't have an input file...but don't reopen stdin */

Expand Down Expand Up @@ -599,7 +599,7 @@ pngquant_error read_image(mainprog_info *input_image, const char *filename, int
return retval;
}

acolorhist_vector histogram(mainprog_info *input_image, int reqcolors, int *colors)
acolorhist_vector histogram(read_info *input_image, int reqcolors, int *colors)
{
acolorhist_vector achv;
int ignorebits=0;
Expand Down Expand Up @@ -628,7 +628,7 @@ acolorhist_vector histogram(mainprog_info *input_image, int reqcolors, int *colo
return achv;
}

float modify_alpha(mainprog_info *input_image, int ie_bug)
float modify_alpha(read_info *input_image, int ie_bug)
{
/* IE6 makes colors with even slightest transparency completely transparent,
thus to improve situation in IE, make colors that are less than ~10% transparent
Expand Down Expand Up @@ -683,7 +683,7 @@ float modify_alpha(mainprog_info *input_image, int ie_bug)

pngquant_error pngquant(const char *filename, const char *newext, int floyd, int force, int using_stdin, int reqcolors, int ie_bug)
{
mainprog_info input_image = {0};
read_info input_image = {0};
float min_opaque_val;

pngquant_error retval = read_image(&input_image, filename,using_stdin);
Expand Down Expand Up @@ -715,7 +715,7 @@ pngquant_error pngquant(const char *filename, const char *newext, int floyd, int
/* sort palette by (estimated) popularity */
qsort(acolormap, newcolors, sizeof(acolormap[0]), valuecompare);

mainprog_info output_image = {0};
write_info output_image = {0};
output_image.width = input_image.width;
output_image.height = input_image.height;
output_image.gamma = input_image.gamma;
Expand All @@ -736,15 +736,7 @@ pngquant_error pngquant(const char *filename, const char *newext, int floyd, int
output_image.row_pointers = malloc(output_image.height * sizeof(output_image.row_pointers[0]));

if (!output_image.indexed_data || !output_image.row_pointers) {
fprintf(stderr,
" insufficient memory for indexed data and/or row pointers\n");

if (input_image.row_pointers)
free(input_image.row_pointers);
if (input_image.rgba_data)
free(input_image.rgba_data);
if (input_image.indexed_data)
free(input_image.indexed_data);
fprintf(stderr, " insufficient memory for indexed data and/or row pointers\n");
return OUT_OF_MEMORY_ERROR;
}

Expand Down
14 changes: 7 additions & 7 deletions rwpng.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ void rwpng_version_info(void)
26 = wrong PNG color type (no alpha channel)
*/

int rwpng_read_image(FILE *infile, mainprog_info *mainprog_ptr)
int rwpng_read_image(FILE *infile, read_info *mainprog_ptr)
{
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
Expand Down Expand Up @@ -170,7 +170,7 @@ int rwpng_read_image(FILE *infile, mainprog_info *mainprog_ptr)
png_read_update_info(png_ptr, info_ptr);

mainprog_ptr->rowbytes = rowbytes = png_get_rowbytes(png_ptr, info_ptr);
mainprog_ptr->channels = (int)png_get_channels(png_ptr, info_ptr);
//mainprog_ptr->channels = (int)png_get_channels(png_ptr, info_ptr);

if ((mainprog_ptr->rgba_data = malloc(rowbytes*mainprog_ptr->height)) == NULL) {
fprintf(stderr, "pngquant readpng: unable to allocate image data\n");
Expand Down Expand Up @@ -222,7 +222,7 @@ int rwpng_read_image(FILE *infile, mainprog_info *mainprog_ptr)
35 = libpng error (via longjmp())
*/

int rwpng_write_image_init(FILE *outfile, mainprog_info *mainprog_ptr)
int rwpng_write_image_init(FILE *outfile, write_info *mainprog_ptr)
{
png_structp png_ptr; /* note: temporary variables! */
png_infop info_ptr;
Expand Down Expand Up @@ -395,7 +395,7 @@ int rwpng_write_image_init(FILE *outfile, mainprog_info *mainprog_ptr)

/* returns 0 for success, 45 for libpng (longjmp) problem */

int rwpng_write_image_whole(mainprog_info *mainprog_ptr)
int rwpng_write_image_whole(write_info *mainprog_ptr)
{
png_structp png_ptr = (png_structp)mainprog_ptr->png_ptr;
png_infop info_ptr = (png_infop)mainprog_ptr->info_ptr;
Expand Down Expand Up @@ -437,7 +437,7 @@ int rwpng_write_image_whole(mainprog_info *mainprog_ptr)
/* this routine is called only for non-interlaced images */
/* returns 0 if succeeds, 55 if libpng problem */

int rwpng_write_image_row(mainprog_info *mainprog_ptr)
int rwpng_write_image_row(write_info *mainprog_ptr)
{
png_structp png_ptr = (png_structp)mainprog_ptr->png_ptr;
png_infop info_ptr = (png_infop)mainprog_ptr->info_ptr;
Expand Down Expand Up @@ -468,7 +468,7 @@ int rwpng_write_image_row(mainprog_info *mainprog_ptr)
/* this routine is called only after rwpng_write_image_row() */
/* returns 0 if succeeds, 65 if libpng problem */

int rwpng_write_image_finish(mainprog_info *mainprog_ptr)
int rwpng_write_image_finish(write_info *mainprog_ptr)
{
png_structp png_ptr = (png_structp)mainprog_ptr->png_ptr;
png_infop info_ptr = (png_infop)mainprog_ptr->info_ptr;
Expand Down Expand Up @@ -502,7 +502,7 @@ int rwpng_write_image_finish(mainprog_info *mainprog_ptr)

static void rwpng_error_handler(png_structp png_ptr, png_const_charp msg)
{
mainprog_info *mainprog_ptr;
write_info *mainprog_ptr;

/* This function, aside from the extra step of retrieving the "error
* pointer" (below) and the fact that it exists within the application
Expand Down
32 changes: 21 additions & 11 deletions rwpng.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,37 +69,47 @@ typedef enum {
LIBPNG_WRITE_WHOLE_ERROR = 45,
} pngquant_error;

typedef struct _mainprog_info {
typedef struct {
jmp_buf jmpbuf; /* read/write */
double gamma;
void *png_ptr; /* read/write */
void *info_ptr; /* read/write */
rwpng_color palette[256]; /* write */
int interlaced; /* read/write */
png_uint_32 width; /* read/write */
png_uint_32 height; /* read/write */
png_uint_32 rowbytes; /* read */
unsigned char *rgba_data; /* read */
unsigned char **row_pointers; /* read/write */
} read_info;

typedef struct {
jmp_buf jmpbuf; /* read/write */
double gamma;
void *png_ptr; /* read/write */
void *info_ptr; /* read/write */
rwpng_color palette[256]; /* write */
int interlaced; /* read/write */
int channels; /* read (currently not used) */
int sample_depth; /* write */
int num_palette; /* write */
int num_trans; /* write */
png_uint_32 width; /* read/write */
png_uint_32 height; /* read/write */
png_uint_32 rowbytes; /* read */
unsigned char trans[256]; /* write */
unsigned char *rgba_data; /* read */
unsigned char *indexed_data; /* write */
unsigned char **row_pointers; /* read/write */
} mainprog_info;
} write_info;


/* prototypes for public functions in rwpng.c */

void rwpng_version_info(void);

int rwpng_read_image(FILE *infile, mainprog_info *mainprog_ptr);
int rwpng_read_image(FILE *infile, read_info *mainprog_ptr);

int rwpng_write_image_init(FILE *outfile, mainprog_info *mainprog_ptr);
int rwpng_write_image_init(FILE *outfile, write_info *mainprog_ptr);

int rwpng_write_image_whole(mainprog_info *mainprog_ptr);
int rwpng_write_image_whole(write_info *mainprog_ptr);

int rwpng_write_image_row(mainprog_info *mainprog_ptr);
int rwpng_write_image_row(write_info *mainprog_ptr);

int rwpng_write_image_finish(mainprog_info *mainprog_ptr);
int rwpng_write_image_finish(write_info *mainprog_ptr);

0 comments on commit b155880

Please sign in to comment.