[libpng16] Removed need for -Wno-cast-align with clang.  clang correctly warns

on alignment increasing pointer casts when -Wcast-align is passed. This
fixes the cases clang warns about either (pngread.c) by eliminating the
casts from png_bytep to png_uint_16p or, for pngrutil.c where the cast
is previously verified or pngstest.c where it is OK by introducing new
png_aligncast macros to do the cast in a way that clang accepts.
diff --git a/ANNOUNCE b/ANNOUNCE
index 33dc63e..dda8517 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,5 +1,5 @@
 
-Libpng 1.6.0beta22 - April 28, 2012
+Libpng 1.6.0beta22 - April 30, 2012
 
 This is not intended to be a public release.  It will be replaced
 within a few weeks by a public version or by another test version.
@@ -360,7 +360,13 @@
   Added -lssp_nonshared in a comment in scripts/makefile.freebsd
     and changed deprecated NOOBJ and NOPROFILE to NO_OBJ and NO_PROFILE.
 
-Version 1.6.0beta22 [April 28, 2012]
+Version 1.6.0beta22 [April 30, 2012]
+  Removed need for -Wno-cast-align with clang.  clang correctly warns on
+    alignment increasing pointer casts when -Wcast-align is passed. This
+    fixes the cases clang warns about either (pngread.c) by eliminating the
+    casts from png_bytep to png_uint_16p or, for pngrutil.c where the cast
+    is previously verified or pngstest.c where it is OK by introducing new
+    png_aligncast macros to do the cast in a way that clang accepts.
 
 Send comments/corrections/commendations to png-mng-implement at lists.sf.net
 (subscription required; visit
diff --git a/CHANGES b/CHANGES
index 37e20f3..771c53e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4111,7 +4111,13 @@
   Added -lssp_nonshared in a comment in scripts/makefile.freebsd
     and changed deprecated NOOBJ and NOPROFILE to NO_OBJ and NO_PROFILE.
 
-Version 1.6.0beta22 [April 28, 2012]
+Version 1.6.0beta22 [April 30, 2012]
+  Removed need for -Wno-cast-align with clang.  clang correctly warns on
+    alignment increasing pointer casts when -Wcast-align is passed. This
+    fixes the cases clang warns about either (pngread.c) by eliminating the
+    casts from png_bytep to png_uint_16p or, for pngrutil.c where the cast
+    is previously verified or pngstest.c where it is OK by introducing new
+    png_aligncast macros to do the cast in a way that clang accepts.
 
 Send comments/corrections/commendations to png-mng-implement at lists.sf.net
 (subscription required; visit
diff --git a/png.c b/png.c
index f93f93c..95cbbb5 100644
--- a/png.c
+++ b/png.c
@@ -747,13 +747,13 @@
 #else
 #  ifdef __STDC__
    return PNG_STRING_NEWLINE \
-     "libpng version 1.6.0beta22 - April 28, 2012" PNG_STRING_NEWLINE \
+     "libpng version 1.6.0beta22 - April 30, 2012" PNG_STRING_NEWLINE \
      "Copyright (c) 1998-2012 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
      "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
      "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
      PNG_STRING_NEWLINE;
 #  else
-      return "libpng version 1.6.0beta22 - April 28, 2012\
+      return "libpng version 1.6.0beta22 - April 30, 2012\
       Copyright (c) 1998-2012 Glenn Randers-Pehrson\
       Copyright (c) 1996-1997 Andreas Dilger\
       Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
diff --git a/png.h b/png.h
index 8255479..7ae10eb 100644
--- a/png.h
+++ b/png.h
@@ -1,7 +1,7 @@
 
 /* png.h - header file for PNG reference library
  *
- * libpng version 1.6.0beta22 - April 28, 2012
+ * libpng version 1.6.0beta22 - April 30, 2012
  * Copyright (c) 1998-2012 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
@@ -11,7 +11,7 @@
  * Authors and maintainers:
  *   libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
  *   libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
- *   libpng versions 0.97, January 1998, through 1.6.0beta22 - April 28, 2012: Glenn
+ *   libpng versions 0.97, January 1998, through 1.6.0beta22 - April 30, 2012: Glenn
  *   See also "Contributing Authors", below.
  *
  * Note about libpng version numbers:
@@ -198,7 +198,7 @@
  *
  * This code is released under the libpng license.
  *
- * libpng versions 1.2.6, August 15, 2004, through 1.6.0beta22, April 28, 2012, are
+ * libpng versions 1.2.6, August 15, 2004, through 1.6.0beta22, April 30, 2012, are
  * Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson, and are
  * distributed according to the same disclaimer and license as libpng-1.2.5
  * with the following individual added to the list of Contributing Authors:
@@ -310,7 +310,7 @@
  * Y2K compliance in libpng:
  * =========================
  *
- *    April 28, 2012
+ *    April 30, 2012
  *
  *    Since the PNG Development group is an ad-hoc body, we can't make
  *    an official declaration.
@@ -376,7 +376,7 @@
 /* Version information for png.h - this should match the version in png.c */
 #define PNG_LIBPNG_VER_STRING "1.6.0beta22"
 #define PNG_HEADER_VERSION_STRING \
-     " libpng version 1.6.0beta22 - April 28, 2012\n"
+     " libpng version 1.6.0beta22 - April 30, 2012\n"
 
 #define PNG_LIBPNG_VER_SONUM   16
 #define PNG_LIBPNG_VER_DLLNUM  16
diff --git a/pngconf.h b/pngconf.h
index e7265f7..1b69728 100644
--- a/pngconf.h
+++ b/pngconf.h
@@ -1,7 +1,7 @@
 
 /* pngconf.h - machine configurable file for libpng
  *
- * libpng version 1.6.0beta22 - April 28, 2012
+ * libpng version 1.6.0beta22 - April 30, 2012
  *
  * Copyright (c) 1998-2012 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pngpriv.h b/pngpriv.h
index 8ec7dce..e09a10e 100644
--- a/pngpriv.h
+++ b/pngpriv.h
@@ -312,9 +312,15 @@
 #ifdef __cplusplus
 #  define png_voidcast(type, value) static_cast<type>(value)
 #  define png_constcast(type, value) const_cast<type>(value)
+#  define png_aligncast(type, value) \
+   static_cast<type>(static_cast<void*>(value))
+#  define png_aligncastconst(type, value) \
+   static_cast<type>(static_cast<const void*>(value))
 #else
 #  define png_voidcast(type, value) (value)
 #  define png_constcast(type, value) ((type)(value))
+#  define png_aligncast(type, value) ((void*)(value))
+#  define png_aligncastconst(type, value) ((const void*)(value))
 #endif /* __cplusplus */
 
 /* Some fixed point APIs are still required even if not exported because
diff --git a/pngread.c b/pngread.c
index 3996041..a0ab6f3 100644
--- a/pngread.c
+++ b/pngread.c
@@ -1145,8 +1145,8 @@
    png_voidp  colormap;
    png_const_colorp background;
    /* Local variables: */
-   png_bytep       local_row;
-   png_bytep       first_row;
+   png_voidp       local_row;
+   png_voidp       first_row;
    ptrdiff_t       row_bytes;           /* step between rows */
    int             file_encoding;       /* E_ values above */
    png_fixed_point gamma_to_linear;     /* For E_FILE, reciprocal of gamma */
@@ -2771,7 +2771,7 @@
       png_uint_32  height = image->height;
       png_uint_32  width = image->width;
       int          proc = display->colormap_processing;
-      png_bytep    first_row = display->first_row;
+      png_bytep    first_row = png_voidcast(png_bytep, display->first_row);
       ptrdiff_t    step_row = display->row_bytes;
       int pass;
 
@@ -2801,7 +2801,7 @@
 
          for (; y<height; y += stepy)
          {
-            png_bytep inrow = display->local_row;
+            png_bytep inrow = png_voidcast(png_bytep, display->local_row);
             png_bytep outrow = first_row + y * step_row;
             png_const_bytep end_row = outrow + width;
 
@@ -3011,14 +3011,18 @@
     * size libpng requires and call the relevant processing routine safely.
     */
    {
-      png_bytep first_row = png_voidcast(png_bytep, display->buffer);
+      png_voidp first_row = display->buffer;
       ptrdiff_t row_bytes = display->row_stride;
 
       /* The following expression is designed to work correctly whether it gives
        * a signed or an unsigned result.
        */
       if (row_bytes < 0)
-         first_row += (image->height-1) * (-row_bytes);
+      {
+         char *ptr = png_voidcast(char*, first_row);
+         ptr += (image->height-1) * (-row_bytes);
+         first_row = png_voidcast(png_voidp, ptr);
+      }
 
       display->first_row = first_row;
       display->row_bytes = row_bytes;
@@ -3027,8 +3031,7 @@
    if (passes == 0)
    {
       int result;
-      png_bytep row = png_voidcast(png_bytep, png_malloc(png_ptr,
-         png_get_rowbytes(png_ptr, info_ptr)));
+      png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
 
       display->local_row = row;
       result = png_safe_execute(image, png_image_read_and_map, display);
@@ -3045,7 +3048,7 @@
       while (--passes >= 0)
       {
          png_uint_32      y = image->height;
-         png_bytep        row = display->first_row;
+         png_bytep        row = png_voidcast(png_bytep, display->first_row);
 
          while (y-- > 0)
          {
@@ -3086,7 +3089,6 @@
    {
       png_uint_32  height = image->height;
       png_uint_32  width = image->width;
-      png_bytep    first_row = display->first_row;
       ptrdiff_t    step_row = display->row_bytes;
       unsigned int channels = (image->format & PNG_FORMAT_FLAG_COLOR) ? 3 : 1;
       int pass;
@@ -3118,13 +3120,17 @@
 
          for (; y<height; y += stepy)
          {
-            png_bytep inrow = display->local_row;
-            png_bytep outrow = first_row + y * step_row;
-            png_const_bytep end_row = outrow + width * channels;
+            png_bytep inrow = png_voidcast(png_bytep, display->local_row);
+            png_bytep outrow;
+            png_const_bytep end_row;
 
             /* Read the row, which is packed: */
             png_read_row(png_ptr, inrow, NULL);
 
+            outrow = png_voidcast(png_bytep, display->first_row);
+            outrow += y * step_row;
+            end_row = outrow + width * channels;
+
             /* Now do the composition on each pixel in this row. */
             outrow += startx;
             for (; outrow < end_row; outrow += stepx)
@@ -3242,12 +3248,13 @@
           * Unlike the code above ALPHA_OPTIMIZED has *not* been done.
           */
          {
-            png_bytep first_row = display->first_row;
+            png_bytep first_row = png_voidcast(png_bytep, display->first_row);
             ptrdiff_t step_row = display->row_bytes;
 
             for (pass = 0; pass < passes; ++pass)
             {
-               png_bytep        row = display->first_row;
+               png_bytep        row = png_voidcast(png_bytep,
+                                                   display->first_row);
                unsigned int     startx, stepx, stepy;
                png_uint_32      y;
 
@@ -3274,7 +3281,8 @@
                {
                   for (; y<height; y += stepy)
                   {
-                     png_bytep inrow = display->local_row;
+                     png_bytep inrow = png_voidcast(png_bytep,
+                        display->local_row);
                      png_bytep outrow = first_row + y * step_row;
                      png_const_bytep end_row = outrow + width;
 
@@ -3318,7 +3326,8 @@
 
                   for (; y<height; y += stepy)
                   {
-                     png_bytep inrow = display->local_row;
+                     png_bytep inrow = png_voidcast(png_bytep,
+                        display->local_row);
                      png_bytep outrow = first_row + y * step_row;
                      png_const_bytep end_row = outrow + width;
 
@@ -3364,8 +3373,12 @@
           * handles the alpha-first option.
           */
          {
-            png_bytep    first_row = display->first_row;
-            ptrdiff_t    step_row = display->row_bytes;
+            png_uint_16p first_row = png_voidcast(png_uint_16p,
+               display->first_row);
+            /* The division by two is safe because the caller passed in a
+             * stride which was multiplied by 2 (below) to get row_bytes.
+             */
+            ptrdiff_t    step_row = display->row_bytes / 2;
             int preserve_alpha = (image->format & PNG_FORMAT_FLAG_ALPHA) != 0;
             unsigned int outchannels = 1+preserve_alpha;
             int swap_alpha = 0;
@@ -3403,12 +3416,13 @@
                for (; y<height; y += stepy)
                {
                   png_const_uint_16p inrow;
-                  png_uint_16p outrow = (png_uint_16p)(first_row + y*step_row);
+                  png_uint_16p outrow = first_row + y*step_row;
                   png_uint_16p end_row = outrow + width * outchannels;
 
                   /* Read the row, which is packed: */
-                  png_read_row(png_ptr, display->local_row, NULL);
-                  inrow = (png_const_uint_16p)display->local_row;
+                  png_read_row(png_ptr, png_voidcast(png_bytep,
+                     display->local_row), NULL);
+                  inrow = png_voidcast(png_const_uint_16p, display->local_row);
 
                   /* Now do the pre-multiplication on each pixel in this row.
                    */
@@ -3806,7 +3820,7 @@
     * display acts as a flag.
     */
    {
-      png_bytep first_row = png_voidcast(png_bytep, display->buffer);
+      png_voidp first_row = display->buffer;
       ptrdiff_t row_bytes = display->row_stride;
 
       if (linear)
@@ -3816,7 +3830,11 @@
        * a signed or an unsigned result.
        */
       if (row_bytes < 0)
-         first_row += (image->height-1) * (-row_bytes);
+      {
+         char *ptr = png_voidcast(char*, first_row);
+         ptr += (image->height-1) * (-row_bytes);
+         first_row = png_voidcast(png_voidp, ptr);
+      }
 
       display->first_row = first_row;
       display->row_bytes = row_bytes;
@@ -3825,8 +3843,7 @@
    if (do_local_compose)
    {
       int result;
-      png_bytep row = png_voidcast(png_bytep, png_malloc(png_ptr,
-         png_get_rowbytes(png_ptr, info_ptr)));
+      png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
 
       display->local_row = row;
       result = png_safe_execute(image, png_image_read_composite, display);
@@ -3839,8 +3856,7 @@
    else if (do_local_background == 2)
    {
       int result;
-      png_bytep row = png_voidcast(png_bytep, png_malloc(png_ptr,
-         png_get_rowbytes(png_ptr, info_ptr)));
+      png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
 
       display->local_row = row;
       result = png_safe_execute(image, png_image_read_background, display);
@@ -3857,7 +3873,7 @@
       while (--passes >= 0)
       {
          png_uint_32      y = image->height;
-         png_bytep        row = display->first_row;
+         png_bytep        row = png_voidcast(png_bytep, display->first_row);
 
          while (y-- > 0)
          {
diff --git a/pngrutil.c b/pngrutil.c
index efcac78..75e7d58 100644
--- a/pngrutil.c
+++ b/pngrutil.c
@@ -3261,8 +3261,9 @@
                      bytes_to_copy % sizeof (png_uint_32) == 0 &&
                      bytes_to_jump % sizeof (png_uint_32) == 0)
                   {
-                     png_uint_32p dp32 = (png_uint_32p)dp;
-                     png_const_uint_32p sp32 = (png_const_uint_32p)sp;
+                     png_uint_32p dp32 = png_aligncast(png_uint_32p,dp);
+                     png_const_uint_32p sp32 = png_aligncastconst(
+                        png_const_uint_32p, sp);
                      unsigned int skip = (bytes_to_jump-bytes_to_copy) /
                         sizeof (png_uint_32);
 
@@ -3302,8 +3303,9 @@
                    */
                   else
                   {
-                     png_uint_16p dp16 = (png_uint_16p)dp;
-                     png_const_uint_16p sp16 = (png_const_uint_16p)sp;
+                     png_uint_16p dp16 = png_aligncast(png_uint_16p, dp);
+                     png_const_uint_16p sp16 = png_aligncastconst(
+                        png_const_uint_16p, sp);
                      unsigned int skip = (bytes_to_jump-bytes_to_copy) /
                         sizeof (png_uint_16);