--- libharu-RELEASE_2_2_0/src/hpdf_image_png.c.orig	2009-02-12 11:48:56.000000000 +0100
+++ libharu-RELEASE_2_2_0/src/hpdf_image_png.c	2013-05-28 20:29:19.000000000 +0200
@@ -109,14 +109,15 @@
                          png_infop    info_ptr)
 {
     png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr);
+    png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
     png_bytep* row_pointers = HPDF_GetMem (image->mmgr,
-                info_ptr->height * sizeof (png_bytep));
+                height * sizeof (png_bytep));
 
     if (row_pointers) {
         HPDF_UINT i;
 
-        HPDF_MemSet (row_pointers, 0, info_ptr->height * sizeof (png_bytep));
-        for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
+        HPDF_MemSet (row_pointers, 0, height * sizeof (png_bytep));
+        for (i = 0; i < (HPDF_UINT)height; i++) {
             row_pointers[i] = HPDF_GetMem (image->mmgr, len);
 
             if (image->error->error_no != HPDF_OK)
@@ -126,7 +127,7 @@
         if (image->error->error_no == HPDF_OK) {
             png_read_image(png_ptr, row_pointers);
             if (image->error->error_no == HPDF_OK) {       /* add this line */
-                for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
+                for (i = 0; i < (HPDF_UINT)height; i++) {
                     if (HPDF_Stream_Write (image->stream, row_pointers[i], len) !=
                             HPDF_OK)
                         break;
@@ -135,7 +136,7 @@
         }
 
         /* clean up */
-        for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
+        for (i = 0; i < (HPDF_UINT)height; i++) {
             HPDF_FreeMem (image->mmgr, row_pointers[i]);
         }
 
@@ -151,12 +152,13 @@
               png_infop    info_ptr)
 {
     png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr);
+    png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
     png_bytep buf_ptr = HPDF_GetMem (image->mmgr, len);
 
     if (buf_ptr) {
         HPDF_UINT i;
 
-        for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
+        for (i = 0; i < (HPDF_UINT)height; i++) {
             png_read_rows(png_ptr, (png_byte**)&buf_ptr, NULL, 1);
             if (image->error->error_no != HPDF_OK)
                 break;
@@ -182,14 +184,16 @@
 	HPDF_STATUS ret = HPDF_OK;
 	HPDF_UINT i, j;
 	png_bytep *row_ptr;
+    png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
+    png_uint_32 width = png_get_image_width(png_ptr, info_ptr);
 
-	row_ptr = HPDF_GetMem (image->mmgr, info_ptr->height * sizeof(png_bytep));
+    row_ptr = HPDF_GetMem (image->mmgr, height * sizeof(png_bytep));
 	if (!row_ptr) {
 		return HPDF_FAILD_TO_ALLOC_MEM;
 	} else {
 		png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr);
 
-		for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
+        for (i = 0; i < (HPDF_UINT)height; i++) {
 			row_ptr[i] = HPDF_GetMem(image->mmgr, len);
 			if (!row_ptr[i]) {
 				for (; i >= 0; i--) {
@@ -207,19 +211,19 @@
 		goto Error;
 	}
 
-	for (j = 0; j < info_ptr->height; j++) {
-		for (i = 0; i < info_ptr->width; i++) {
-			smask_data[info_ptr->width * j + i] = (row_ptr[j][i] < num_trans) ? trans[row_ptr[j][i]] : 0xFF;
+   for (j = 0; j < height; j++) {
+     for (i = 0; i < width; i++) {
+       smask_data[width * j + i] = (row_ptr[j][i] < num_trans) ? trans[row_ptr[j][i]] : 0xFF;
 		}
 
-		if (HPDF_Stream_Write (image->stream, row_ptr[j], info_ptr->width) != HPDF_OK) {
+     if (HPDF_Stream_Write (image->stream, row_ptr[j], width) != HPDF_OK) {
 			ret = HPDF_FILE_IO_ERROR;
 			goto Error;
 		}
 	}
 
 Error:
-	for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
+    for (i = 0; i < (HPDF_UINT)height; i++) {
 		HPDF_FreeMem (image->mmgr, row_ptr[i]);
 	}
 
@@ -238,6 +242,8 @@
 	HPDF_UINT i, j;
 	png_bytep *row_ptr, row;
 	png_byte color_type;
+    png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
+    png_uint_32 width = png_get_image_width(png_ptr, info_ptr);
 
 	color_type = png_get_color_type(png_ptr, info_ptr);
 
@@ -245,13 +251,13 @@
 		return HPDF_INVALID_PNG_IMAGE;
 	}
 
-	row_ptr = HPDF_GetMem (image->mmgr, info_ptr->height * sizeof(png_bytep));
+    row_ptr = HPDF_GetMem (image->mmgr, height * sizeof(png_bytep));
 	if (!row_ptr) {
 		return HPDF_FAILD_TO_ALLOC_MEM;
 	} else {
 		png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr);
 
-		for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
+      for (i = 0; i < (HPDF_UINT)height; i++) {
 			row_ptr[i] = HPDF_GetMem(image->mmgr, len);
 			if (!row_ptr[i]) {
 				for (; i >= 0; i--) {
@@ -271,12 +277,12 @@
 
 	switch (color_type) {
 		case PNG_COLOR_TYPE_RGB_ALPHA:
-			row_len = 3 * info_ptr->width * sizeof(png_byte);
-			for (j = 0; j < info_ptr->height; j++) {
-				for (i = 0; i < info_ptr->width; i++) {
+        row_len = 3 * width * sizeof(png_byte);
+        for (j = 0; j < height; j++) {
+          for (i = 0; i < width; i++) {
 					row = row_ptr[j];
 					memmove(row + (3 * i), row + (4*i), 3);
-					smask_data[info_ptr->width * j + i] = row[4 * i + 3];
+                    smask_data[width * j + i] = row[4 * i + 3];
 				}
 
 				if (HPDF_Stream_Write (image->stream, row, row_len) != HPDF_OK) {
@@ -286,12 +292,12 @@
 			}
 			break;
 		case PNG_COLOR_TYPE_GRAY_ALPHA:
-			row_len = info_ptr->width * sizeof(png_byte);
-			for (j = 0; j < info_ptr->height; j++) {
-				for (i = 0; i < info_ptr->width; i++) {
+        row_len = width * sizeof(png_byte);
+        for (j = 0; j < height; j++) {
+          for (i = 0; i < width; i++) {
 					row = row_ptr[j];
 					row[i] = row[2 * i];
-					smask_data[info_ptr->width * j + i] = row[2 * i + 1];
+                    smask_data[width * j + i] = row[2 * i + 1];
 				}
 
 				if (HPDF_Stream_Write (image->stream, row, row_len) != HPDF_OK) {
@@ -306,7 +312,7 @@
 	}
 
 Error:
-	for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
+    for (i = 0; i < (HPDF_UINT)height; i++) {
 		HPDF_FreeMem (image->mmgr, row_ptr[i]);
 	}
 
@@ -415,7 +421,8 @@
 
 {
 	HPDF_STATUS ret = HPDF_OK;
-
+    png_uint_32 width, height;
+    int bit_depth, color_type;
 	png_structp png_ptr = NULL;
 	png_infop info_ptr = NULL;
 
@@ -447,8 +454,10 @@
 		goto Exit;
 	}
 
+    png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL);
+ 
 	/* 16bit images are not supported. */
-	if (info_ptr->bit_depth == 16) {
+    if (bit_depth == 16) {
 		png_set_strip_16(png_ptr);
 	}
 
@@ -458,7 +467,7 @@
 	}
 
 	/* check palette-based images for transparent areas and load them immediately if found */
-	if (xref && PNG_COLOR_TYPE_PALETTE & info_ptr->color_type) {
+    if (xref && PNG_COLOR_TYPE_PALETTE & color_type) {
 		png_bytep trans;
 		int num_trans;
 		HPDF_Dict smask;
@@ -478,10 +487,10 @@
 		smask->header.obj_class |= HPDF_OSUBCLASS_XOBJECT;
 		ret = HPDF_Dict_AddName (smask, "Type", "XObject");
 		ret += HPDF_Dict_AddName (smask, "Subtype", "Image");
-		ret += HPDF_Dict_AddNumber (smask, "Width", (HPDF_UINT)info_ptr->width);
-		ret += HPDF_Dict_AddNumber (smask, "Height", (HPDF_UINT)info_ptr->height);
+        ret += HPDF_Dict_AddNumber (smask, "Width", (HPDF_UINT)width);
+        ret += HPDF_Dict_AddNumber (smask, "Height", (HPDF_UINT)height);
 		ret += HPDF_Dict_AddName (smask, "ColorSpace", "DeviceGray");
-		ret += HPDF_Dict_AddNumber (smask, "BitsPerComponent", (HPDF_UINT)info_ptr->bit_depth);
+        ret += HPDF_Dict_AddNumber (smask, "BitsPerComponent", (HPDF_UINT)bit_depth);
 
 		if (ret != HPDF_OK) {
 			HPDF_Dict_Free(smask);
@@ -489,7 +498,7 @@
 			goto Exit;
 		}
 
-		smask_data = HPDF_GetMem(image->mmgr, info_ptr->width * info_ptr->height);
+        smask_data = HPDF_GetMem(image->mmgr, width * height);
 		if (!smask_data) {
 			HPDF_Dict_Free(smask);
 			ret = HPDF_FAILD_TO_ALLOC_MEM;
@@ -503,7 +512,7 @@
 			goto Exit;
 		}
 
-		if (HPDF_Stream_Write(smask->stream, smask_data, info_ptr->width * info_ptr->height) != HPDF_OK) {
+        if (HPDF_Stream_Write(smask->stream, smask_data, width * height) != HPDF_OK) {
 			HPDF_FreeMem(image->mmgr, smask_data);
 			HPDF_Dict_Free(smask);
 			ret = HPDF_FILE_IO_ERROR;
@@ -513,9 +522,9 @@
 
 
 		ret += CreatePallet(image, png_ptr, info_ptr);
-		ret += HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)info_ptr->width);
-		ret += HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)info_ptr->height);
-		ret += HPDF_Dict_AddNumber (image, "BitsPerComponent",	(HPDF_UINT)info_ptr->bit_depth);
+        ret += HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)width);
+        ret += HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)height);
+        ret += HPDF_Dict_AddNumber (image, "BitsPerComponent",  (HPDF_UINT)bit_depth);
 		ret += HPDF_Dict_Add (image, "SMask", smask);
 
 		png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
@@ -526,7 +535,7 @@
 
 	/* read images with alpha channel right away 
 	   we have to do this because image transparent mask must be added to the Xref */
-	if (xref && PNG_COLOR_MASK_ALPHA & info_ptr->color_type) {
+    if (xref && PNG_COLOR_MASK_ALPHA & color_type) {
 		HPDF_Dict smask;
 		png_bytep smask_data;
 
@@ -539,10 +548,10 @@
 		smask->header.obj_class |= HPDF_OSUBCLASS_XOBJECT;
 		ret = HPDF_Dict_AddName (smask, "Type", "XObject");
 		ret += HPDF_Dict_AddName (smask, "Subtype", "Image");
-		ret += HPDF_Dict_AddNumber (smask, "Width", (HPDF_UINT)info_ptr->width);
-		ret += HPDF_Dict_AddNumber (smask, "Height", (HPDF_UINT)info_ptr->height);
-		ret += HPDF_Dict_AddName (smask, "ColorSpace", "DeviceGray");
-		ret += HPDF_Dict_AddNumber (smask, "BitsPerComponent", (HPDF_UINT)info_ptr->bit_depth);
+        ret += HPDF_Dict_AddNumber (smask, "Width", (HPDF_UINT)width);
+        ret += HPDF_Dict_AddNumber (smask, "Height", (HPDF_UINT)height);
+        ret += HPDF_Dict_AddName (smask, "ColorSpace", "DeviceGray");
+        ret += HPDF_Dict_AddNumber (smask, "BitsPerComponent", (HPDF_UINT)bit_depth);
 
 		if (ret != HPDF_OK) {
 			HPDF_Dict_Free(smask);
@@ -550,7 +559,7 @@
 			goto Exit;
 		}
 
-		smask_data = HPDF_GetMem(image->mmgr, info_ptr->width * info_ptr->height);
+        smask_data = HPDF_GetMem(image->mmgr, width * height);
 		if (!smask_data) {
 			HPDF_Dict_Free(smask);
 			ret = HPDF_FAILD_TO_ALLOC_MEM;
@@ -564,7 +573,7 @@
 			goto Exit;
 		}
 
-		if (HPDF_Stream_Write(smask->stream, smask_data, info_ptr->width * info_ptr->height) != HPDF_OK) {
+        if (HPDF_Stream_Write(smask->stream, smask_data, width * height) != HPDF_OK) {
 			HPDF_FreeMem(image->mmgr, smask_data);
 			HPDF_Dict_Free(smask);
 			ret = HPDF_FILE_IO_ERROR;
@@ -573,9 +582,9 @@
 		HPDF_FreeMem(image->mmgr, smask_data);
 
 		ret += HPDF_Dict_AddName (image, "ColorSpace", "DeviceRGB");
-		ret += HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)info_ptr->width);
-		ret += HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)info_ptr->height);
-		ret += HPDF_Dict_AddNumber (image, "BitsPerComponent",	(HPDF_UINT)info_ptr->bit_depth);
+		ret += HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)width);
+		ret += HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)height);
+		ret += HPDF_Dict_AddNumber (image, "BitsPerComponent",	(HPDF_UINT)bit_depth);
 		ret += HPDF_Dict_Add (image, "SMask", smask);
 
 		png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
@@ -585,9 +594,9 @@
 	/* if the image has color palette, copy the pallet of the image to
 	 * create color map.
 	 */
-	if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+	if (color_type == PNG_COLOR_TYPE_PALETTE)
 		ret = CreatePallet(image, png_ptr, info_ptr);
-	else if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY)
+    else if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
 		ret = HPDF_Dict_AddName (image, "ColorSpace", "DeviceGray");
 	else
 		ret = HPDF_Dict_AddName (image, "ColorSpace", "DeviceRGB");
@@ -613,16 +622,16 @@
 	}
 
 	/* setting the info of the image. */
-	if (HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)info_ptr->width)
+	if (HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)width)
 			!= HPDF_OK)
 		goto Exit;
 
-	if (HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)info_ptr->height)
+	if (HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)height)
 			!= HPDF_OK)
 		goto Exit;
 
 	if (HPDF_Dict_AddNumber (image, "BitsPerComponent",
-				(HPDF_UINT)info_ptr->bit_depth) != HPDF_OK)
+				(HPDF_UINT)bit_depth) != HPDF_OK)
 		goto Exit;
 
 	/* clean up */
