about summary refs log tree commit diff
path: root/converter/other
diff options
context:
space:
mode:
authorgiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2008-07-13 23:34:49 +0000
committergiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2008-07-13 23:34:49 +0000
commit39a3b6d0fd7821eef8ec9392bdbfdb83bb356d1e (patch)
tree55515eeb68acbad8db7d29c2f7471f9be6d753ec /converter/other
parent09f70ec67186bb10dbd252650210bff2daa70ec7 (diff)
downloadnetpbm-mirror-39a3b6d0fd7821eef8ec9392bdbfdb83bb356d1e.tar.gz
netpbm-mirror-39a3b6d0fd7821eef8ec9392bdbfdb83bb356d1e.tar.xz
netpbm-mirror-39a3b6d0fd7821eef8ec9392bdbfdb83bb356d1e.zip
Release 10.35.47
git-svn-id: http://svn.code.sf.net/p/netpbm/code/stable@676 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter/other')
-rw-r--r--converter/other/pngtopnm.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/converter/other/pngtopnm.c b/converter/other/pngtopnm.c
index bb8afb8d..a393f966 100644
--- a/converter/other/pngtopnm.c
+++ b/converter/other/pngtopnm.c
@@ -200,6 +200,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,
@@ -745,10 +753,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)
@@ -778,19 +788,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.
@@ -1049,7 +1051,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);