diff options
Diffstat (limited to 'converter')
-rw-r--r-- | converter/other/pngtopnm.c | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/converter/other/pngtopnm.c b/converter/other/pngtopnm.c index b32bb682..38b9aab6 100644 --- a/converter/other/pngtopnm.c +++ b/converter/other/pngtopnm.c @@ -81,7 +81,7 @@ struct cmdlineInfo { }; -typedef struct pngcolor { +typedef struct { /*---------------------------------------------------------------------------- A color in a format compatible with the PNG library. @@ -202,6 +202,14 @@ _get_png_val (png_byte ** const pp, +static bool +isGrayscale(pngcolor const color) { + + return color.r == color.g && color.r == color.b; +} + + + static void setXel(xel * const xelP, pngcolor const foreground, @@ -789,10 +797,12 @@ imageHasColor(png_info * const info_ptr) { static void determineOutputType(png_info * const info_ptr, enum alpha_handling const alphaHandling, + pngcolor const bgColor, xelval const maxval, int * const pnmTypeP) { - if (alphaHandling != ALPHA_ONLY && imageHasColor(info_ptr)) + if (alphaHandling != ALPHA_ONLY && + (imageHasColor(info_ptr) || !isGrayscale(bgColor))) *pnmTypeP = PPM_TYPE; else { if (maxval > 1) @@ -805,11 +815,11 @@ determineOutputType(png_info * const info_ptr, static void -getBackgroundColor(png_info * const info_ptr, - const char * const requestedColor, - float const totalgamma, - xelval const maxval, - struct pngcolor * const bgColorP) { +getBackgroundColor(png_info * const info_ptr, + const char * const requestedColor, + float const totalgamma, + xelval const maxval, + pngcolor * const bgColorP) { /*---------------------------------------------------------------------------- Figure out what the background color should be. If the user requested a particular color ('requestedColor' not null), that's the one. @@ -822,19 +832,11 @@ getBackgroundColor(png_info * const info_ptr, which is a bit arbitrary. */ pixel const backcolor = ppm_parsecolor(requestedColor, maxval); - switch (info_ptr->color_type) { - case PNG_COLOR_TYPE_GRAY: - case PNG_COLOR_TYPE_GRAY_ALPHA: - bgColorP->r = bgColorP->g = bgColorP->b = PNM_GET1(backcolor); - break; - case PNG_COLOR_TYPE_PALETTE: - case PNG_COLOR_TYPE_RGB: - case PNG_COLOR_TYPE_RGB_ALPHA: - bgColorP->r = PPM_GETR(backcolor); - bgColorP->g = PPM_GETG(backcolor); - bgColorP->b = PPM_GETB(backcolor); - break; - } + + bgColorP->r = PPM_GETR(backcolor); + bgColorP->g = PPM_GETG(backcolor); + bgColorP->b = PPM_GETB(backcolor); + } else if (info_ptr->valid & PNG_INFO_bKGD) { /* didn't manage to get libpng to work (bugs?) concerning background processing, therefore we do our own. @@ -1060,7 +1062,7 @@ convertpng(FILE * const ifp, } } - determineOutputType(info_ptr, cmdline.alpha, maxval, &pnm_type); + determineOutputType(info_ptr, cmdline.alpha, bgColor, maxval, &pnm_type); writePnm(stdout, maxval, pnm_type, info_ptr, png_image, bgColor, cmdline.alpha, totalgamma); |