]> git.cworth.org Git - apitrace/commitdiff
Optimize Image::writePNM.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Tue, 6 Sep 2011 08:19:57 +0000 (09:19 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Tue, 6 Sep 2011 08:19:57 +0000 (09:19 +0100)
image_pnm.cpp

index 44ae624cfa425032364b6c81d6a0bcd856f2b684..82c2dde81c6603ec8fceb1d9e8c21babf20f5fef 100644 (file)
@@ -26,7 +26,7 @@
 
 
 #include <assert.h>
-#include <stdint.h>
+#include <string.h>
 
 #include "image.hpp"
 
@@ -55,15 +55,29 @@ Image::writePNM(std::ostream &os, const char *comment) const {
             os.write((const char *)row, width*channels);
         }
     } else {
-        unsigned char pixel[3] = {0, 0, 0};
-        for (row = start(); row != end(); row += stride()) {
-            for (unsigned x = 0; x < width; ++x) {
-                for (unsigned channel = 0; channel < channels; ++channel) {
-                    pixel[channel] = row[x*channels + channel];
+        unsigned char *pixels = new unsigned char[width*3];
+        if (channels == 4) {
+            for (row = start(); row != end(); row += stride()) {
+                for (unsigned x = 0; x < width; ++x) {
+                    pixels[x*3 + 0] = row[x*4 + 0];
+                    pixels[x*3 + 1] = row[x*4 + 1];
+                    pixels[x*3 + 2] = row[x*4 + 2];
+                }
+                os.write((const char *)pixels, width*3);
+            }
+        } else if (channels == 2) {
+            for (row = start(); row != end(); row += stride()) {
+                for (unsigned x = 0; x < width; ++x) {
+                    pixels[x*3 + 0] = row[x*2 + 0];
+                    pixels[x*3 + 1] = row[x*2 + 1];
+                    pixels[x*3 + 2] = 0;
                 }
-                os.write((const char *)pixel, sizeof pixel);
+                os.write((const char *)pixels, width*3);
             }
+        } else {
+            assert(0);
         }
+        delete [] pixels;
     }
 }