Imported from libpng-1.2.0beta3.tar
diff --git a/pngmem.c b/pngmem.c
index bff23d7..9a065a1 100644
--- a/pngmem.c
+++ b/pngmem.c
@@ -1,7 +1,7 @@
 
 /* pngmem.c - stub functions for memory allocation
  *
- * libpng 1.2.0beta2 - May 7, 2001
+ * libpng 1.2.0beta3 - May 18, 2001
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998-2001 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
@@ -27,12 +27,12 @@
 png_create_struct(int type)
 {
 #ifdef PNG_USER_MEM_SUPPORTED
-   return (png_create_struct_2(type, NULL));
+   return (png_create_struct_2(type, NULL, NULL));
 }
 
 /* Alternate version of png_create_struct, for use with user-defined malloc. */
 png_voidp /* PRIVATE */
-png_create_struct_2(int type, png_malloc_ptr malloc_fn)
+png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
 {
 #endif /* PNG_USER_MEM_SUPPORTED */
    png_size_t size;
@@ -48,9 +48,18 @@
 #ifdef PNG_USER_MEM_SUPPORTED
    if(malloc_fn != NULL)
    {
-      if ((struct_ptr = (*(malloc_fn))(NULL, size)) != NULL)
+      if (mem_ptr != NULL)
+      {
+         png_struct dummy_struct;
+         png_structp png_ptr = &dummy_struct;
+         png_ptr->mem_ptr=mem_ptr;
+         struct_ptr = (*(malloc_fn))(png_ptr, size);
+      }
+      else
+         struct_ptr = (*(malloc_fn))(NULL, size);
+      if (struct_ptr != NULL)
          png_memset(struct_ptr, 0, size);
-         return (struct_ptr);
+      return (struct_ptr);
    }
 #endif /* PNG_USER_MEM_SUPPORTED */
    if ((struct_ptr = (png_voidp)farmalloc(size)) != NULL)
@@ -66,12 +75,13 @@
 png_destroy_struct(png_voidp struct_ptr)
 {
 #ifdef PNG_USER_MEM_SUPPORTED
-   png_destroy_struct_2(struct_ptr, (png_free_ptr)NULL);
+   png_destroy_struct_2(struct_ptr, (png_free_ptr)NULL, (png_voidp)NULL);
 }
 
 /* Free memory allocated by a png_create_struct() call */
 void /* PRIVATE */
-png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn)
+png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
+    png_voidp mem_ptr)
 {
 #endif
    if (struct_ptr != NULL)
@@ -81,6 +91,7 @@
       {
          png_struct dummy_struct;
          png_structp png_ptr = &dummy_struct;
+         png_ptr->mem_ptr=mem_ptr;
          (*(free_fn))(png_ptr, struct_ptr);
          return;
       }
@@ -286,14 +297,14 @@
 png_create_struct(int type)
 {
 #ifdef PNG_USER_MEM_SUPPORTED
-   return (png_create_struct_2(type, NULL));
+   return (png_create_struct_2(type, NULL, NULL));
 }
 
 /* Allocate memory for a png_struct or a png_info.  The malloc and
    memset can be replaced by a single call to calloc() if this is thought
    to improve performance noticably.*/
 png_voidp /* PRIVATE */
-png_create_struct_2(int type, png_malloc_ptr malloc_fn)
+png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
 {
 #endif /* PNG_USER_MEM_SUPPORTED */
    png_size_t size;
@@ -309,7 +320,16 @@
 #ifdef PNG_USER_MEM_SUPPORTED
    if(malloc_fn != NULL)
    {
-      if ((struct_ptr = (*(malloc_fn))(NULL, size)) != NULL)
+      if (mem_ptr != NULL)
+      {
+         png_struct dummy_struct;
+         png_structp png_ptr = &dummy_struct;
+         png_ptr->mem_ptr=mem_ptr;
+         struct_ptr = (*(malloc_fn))(png_ptr, size);
+      }
+      else
+         struct_ptr = (*(malloc_fn))(NULL, size);
+      if (struct_ptr != NULL)
          png_memset(struct_ptr, 0, size);
       return (struct_ptr);
    }
@@ -337,12 +357,13 @@
 png_destroy_struct(png_voidp struct_ptr)
 {
 #ifdef PNG_USER_MEM_SUPPORTED
-   png_destroy_struct_2(struct_ptr, (png_free_ptr)NULL);
+   png_destroy_struct_2(struct_ptr, (png_free_ptr)NULL, (png_voidp)NULL);
 }
 
 /* Free memory allocated by a png_create_struct() call */
 void /* PRIVATE */
-png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn)
+png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
+    png_voidp mem_ptr)
 {
 #endif /* PNG_USER_MEM_SUPPORTED */
    if (struct_ptr != NULL)
@@ -352,6 +373,7 @@
       {
          png_struct dummy_struct;
          png_structp png_ptr = &dummy_struct;
+         png_ptr->mem_ptr=mem_ptr;
          (*(free_fn))(png_ptr, struct_ptr);
          return;
       }