Procházet zdrojové kódy

fix bmp-bpp when requested size is too small

David Rose před 24 roky
rodič
revize
dd02eeba07
1 změnil soubory, kde provedl 19 přidání a 5 odebrání
  1. 19 5
      panda/src/pnmimagetypes/pnmFileTypeBMPWriter.cxx

+ 19 - 5
panda/src/pnmimagetypes/pnmFileTypeBMPWriter.cxx

@@ -48,6 +48,9 @@ extern "C" {
  * without express or implied warranty.
  * without express or implied warranty.
  *
  *
  * $Log$
  * $Log$
+ * Revision 1.6  2001/08/02 21:26:39  drose
+ * fix bmp-bpp when requested size is too small
+ *
  * Revision 1.5  2001/08/02 20:01:58  drose
  * Revision 1.5  2001/08/02 20:01:58  drose
  * add bmp-bpp
  * add bmp-bpp
  *
  *
@@ -459,9 +462,15 @@ BMPEncode(
         unsigned long   nbyte = 0;
         unsigned long   nbyte = 0;
 
 
         bpp = bmp_bpp;
         bpp = bmp_bpp;
+        int needs_bpp = colorstobpp(colors);
+        if (bpp != 0 && bpp < needs_bpp) {
+          pnmimage_bmp_cat.info()
+            << "too many colors for " << bmp_bpp << "-bit image.\n";
+          bpp = 0;
+        }
 
 
         if (bpp == 0) {
         if (bpp == 0) {
-          bpp = colorstobpp(colors);
+          bpp = needs_bpp;
 
 
           /*
           /*
            * I have found empirically at least one BMP-displaying program
            * I have found empirically at least one BMP-displaying program
@@ -487,7 +496,8 @@ BMPEncode(
             }
             }
         }
         }
 
 
-        pm_message("Using %d bits per pixel", bpp);
+        pnmimage_bmp_cat.info()
+          << "Using " << bpp << " bits per pixel.\n";
 
 
         nbyte += BMPwritefileheader(fp, classv, bpp, x, y);
         nbyte += BMPwritefileheader(fp, classv, bpp, x, y);
         nbyte += BMPwriteinfoheader(fp, classv, bpp, x, y);
         nbyte += BMPwriteinfoheader(fp, classv, bpp, x, y);
@@ -521,7 +531,8 @@ BMPEncode24(
         unsigned long   nbyte = 0;
         unsigned long   nbyte = 0;
         int             bpp = 24;
         int             bpp = 24;
 
 
-        pm_message("Using %d bits per pixel", bpp);
+        pnmimage_bmp_cat.info()
+          << "Using " << bpp << " bits per pixel.\n";
 
 
         nbyte += BMPwritefileheader(fp, classv, bpp, x, y);
         nbyte += BMPwritefileheader(fp, classv, bpp, x, y);
         nbyte += BMPwriteinfoheader(fp, classv, bpp, x, y);
         nbyte += BMPwriteinfoheader(fp, classv, bpp, x, y);
@@ -624,8 +635,11 @@ write_data(xel *array, xelval *) {
     BMPEncode24(_file, classv, _x_size, _y_size, pixels);
     BMPEncode24(_file, classv, _x_size, _y_size, pixels);
 
 
   } else if (chv == (colorhist_vector) 0) {
   } else if (chv == (colorhist_vector) 0) {
-    pnmimage_bmp_cat.debug()
-      << "too many colors; generating 24-bit BMP file\n";
+    if (bmp_bpp != 0) {
+      // Even though we asked for fewer bits, we have to settle for 24-bit.
+      pnmimage_bmp_cat.info()
+        << "too many colors for " << bmp_bpp << "-bit image.\n";
+    }
 
 
     BMPEncode24(_file, classv, _x_size, _y_size, pixels);
     BMPEncode24(_file, classv, _x_size, _y_size, pixels);