Index: ImageMagick/trunk/coders/png.c
===================================================================
--- ImageMagick/trunk/coders/png.c	(revision 3845)
+++ ImageMagick/trunk/coders/png.c	(revision 3872)
@@ -1968,4 +1968,5 @@
     }
 #endif
+
   if (png_get_valid(ping,ping_info,PNG_INFO_PLTE))
     {
@@ -2884,7 +2885,10 @@
           (void) ConcatenateMagickString(value,text[i].text,length+2);
 
-          /* Don't save "density" property if we have a pHYs chunk */
-          if (LocaleCompare(text[i].key,"density") != 0 ||
-              !png_get_valid(ping,ping_info,PNG_INFO_pHYs))
+          /* Don't save "density" or "units" property if we have a pHYs
+           * chunk
+           */
+          if (!png_get_valid(ping,ping_info,PNG_INFO_pHYs) ||
+              (LocaleCompare(text[i].key,"density") != 0 &&
+              LocaleCompare(text[i].key,"units") != 0))
              (void) SetImageProperty(image,text[i].key,value);
 
@@ -7859,6 +7863,8 @@
         {
           ping_pHYs_unit_type=PNG_RESOLUTION_METER;
-          ping_pHYs_x_resolution=(png_uint_32) (100.0*image->x_resolution/2.54);
-          ping_pHYs_y_resolution=(png_uint_32) (100.0*image->y_resolution/2.54);
+          ping_pHYs_x_resolution=
+             (png_uint_32) ((100.0*image->x_resolution+0.5)/2.54);
+          ping_pHYs_y_resolution=
+             (png_uint_32) ((100.0*image->y_resolution+0.5)/2.54);
         }
 
@@ -7866,6 +7872,6 @@
         {
           ping_pHYs_unit_type=PNG_RESOLUTION_METER;
-          ping_pHYs_x_resolution=(png_uint_32) (100.0*image->x_resolution);
-          ping_pHYs_y_resolution=(png_uint_32) (100.0*image->y_resolution);
+          ping_pHYs_x_resolution=(png_uint_32) (100.0*image->x_resolution+0.5);
+          ping_pHYs_y_resolution=(png_uint_32) (100.0*image->y_resolution+0.5);
         }
 
@@ -7877,4 +7883,9 @@
         }
 
+      if (logging != MagickFalse)
+        (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+          "    Set up PNG pHYs chunk: xres: %.20g, yres: %.20g, units: %d.",
+          (double) ping_pHYs_x_resolution,(double) ping_pHYs_y_resolution,
+          (int) ping_pHYs_unit_type);
        ping_have_pHYs = MagickTrue;
     }
@@ -8663,5 +8674,6 @@
   }
 
-  if (ping_exclude_iCCP == MagickFalse || ping_exclude_zCCP == MagickFalse)
+  if ((ping_exclude_tEXt == MagickFalse || ping_exclude_zTXt == MagickFalse) &&
+     (ping_exclude_iCCP == MagickFalse || ping_exclude_zCCP == MagickFalse))
     {
       ResetImageProfileIterator(image);
@@ -8915,4 +8927,19 @@
              ping_pHYs_y_resolution,
              ping_pHYs_unit_type);
+
+          if (logging)
+            {
+              (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                   "    Setting up pHYs chunk");
+              (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                   "      x_resolution=%lu",
+                   (unsigned long) ping_pHYs_x_resolution);
+              (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                   "      y_resolution=%lu",
+                   (unsigned long) ping_pHYs_y_resolution);
+              (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                   "      unit_type=%lu",
+                   (unsigned long) ping_pHYs_unit_type);
+            }
         }
     }
@@ -9389,5 +9416,5 @@
     Generate text chunks.
   */
-  if (ping_exclude_tEXt == MagickFalse && ping_exclude_zTXt == MagickFalse)
+  if (ping_exclude_tEXt == MagickFalse || ping_exclude_zTXt == MagickFalse)
   {
     ResetImagePropertyIterator(image);
@@ -9399,6 +9426,7 @@
 
       value=GetImageProperty(image,property);
-      if (LocaleCompare(property,"density") != 0 ||
-          ping_exclude_pHYs != MagickFalse)
+      if (ping_exclude_pHYs != MagickFalse       ||
+          LocaleCompare(property,"density") != 0 ||
+          LocaleCompare(property,"units") != 0)
         {
         if (value != (const char *) NULL)
