[PATCH 3/9] png: Add additional pixel formats

Adrian Johnson ajohnson at redneon.com
Wed Aug 10 02:18:15 PDT 2011


RGBA is required for images with transparency. GRAY and MONOCHROME
allow PNGWriter write more compact PNG files when the images is known
to be all gray or monochrome.
---
 goo/PNGWriter.cc |   30 ++++++++++++++++++++++++++----
 goo/PNGWriter.h  |   15 +++++++++++++--
 2 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/goo/PNGWriter.cc b/goo/PNGWriter.cc
index 400c515..1cabfc5 100644
--- a/goo/PNGWriter.cc
+++ b/goo/PNGWriter.cc
@@ -21,7 +21,7 @@
 
 #include "poppler/Error.h"
 
-PNGWriter::PNGWriter()
+PNGWriter::PNGWriter(Format formatA) : format(formatA)
 {
 }
 
@@ -61,8 +61,26 @@ bool PNGWriter::init(FILE *f, int width, int height, int hDPI, int vDPI)
 	// Set up the type of PNG image and the compression level
 	png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
 
-	png_byte bit_depth = 8;
-	png_byte color_type = PNG_COLOR_TYPE_RGB;
+	png_byte bit_depth;
+	png_byte color_type;
+	switch (format) {
+	  case RGB:
+	    bit_depth = 8;
+	    color_type = PNG_COLOR_TYPE_RGB;
+	    break;
+	  case RGBA:
+	    bit_depth = 8;
+	    color_type = PNG_COLOR_TYPE_RGB_ALPHA;
+	    break;
+	  case GRAY:
+	    bit_depth = 8;
+	    color_type = PNG_COLOR_TYPE_GRAY;
+	    break;
+	  case MONOCHROME:
+	    bit_depth = 1;
+	    color_type = PNG_COLOR_TYPE_GRAY;
+	    break;
+	}
 	png_byte interlace_type = PNG_INTERLACE_NONE;
 
 	png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, interlace_type, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
@@ -74,7 +92,11 @@ bool PNGWriter::init(FILE *f, int width, int height, int hDPI, int vDPI)
 		error(-1, "error during writing png info bytes");
 		return false;
 	}
-	
+
+	// pack 1 pixel/byte rows into 8 pixels/byte
+	if (format == MONOCHROME)
+	  png_set_packing(png_ptr);
+
 	return true;
 }
 
diff --git a/goo/PNGWriter.h b/goo/PNGWriter.h
index 0f79bf9..1d2b7ca 100644
--- a/goo/PNGWriter.h
+++ b/goo/PNGWriter.h
@@ -23,13 +23,23 @@
 #include <png.h>
 #include "ImgWriter.h"
 
+
+
 class PNGWriter : public ImgWriter
 {
 	public:
-		PNGWriter();
+
+  /* RGB        - 3 bytes/pixel
+   * RGBA       - 4 bytes/pixel
+   * GRAY       - 1 byte/pixel
+   * MONOCHROME - 1 byte/pixel. PNGWriter will bitpack to 8 pixels/byte
+   */
+  enum Format { RGB, RGBA, GRAY, MONOCHROME };
+
+		PNGWriter(Format format = RGB);
 		~PNGWriter();
 		
-		bool init(FILE *f, int width, int height, int hDPI, int vDPI);
+  bool init(FILE *f, int width, int height, int hDPI, int vDPI);
 		
 		bool writePointers(unsigned char **rowPointers, int rowCount);
 		bool writeRow(unsigned char **row);
@@ -37,6 +47,7 @@ class PNGWriter : public ImgWriter
 		bool close();
 	
 	private:
+  Format format;
 		png_structp png_ptr;
 		png_infop info_ptr;
 };
-- 
1.7.4.1


--------------010100010407070709080108
Content-Type: text/x-patch;
 name="0004-png-add-support-for-embedding-ICC-profile.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0004-png-add-support-for-embedding-ICC-profile.patch"



More information about the poppler mailing list