Imported from libpng-0.90.tar
diff --git a/pngwio.c b/pngwio.c
index 904c319..9d6b413 100644
--- a/pngwio.c
+++ b/pngwio.c
@@ -1,10 +1,10 @@
 
 /* pngwio.c - functions for data output
 
-   libpng 1.0 beta 3 - version 0.89
+   libpng 1.0 beta 4 - version 0.90
    For conditions of distribution and use, see copyright notice in png.h
    Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
-   May 25, 1996
+   January 10, 1997
 
    This file provides a location for all output.  Users which need
    special handling are expected to write functions which have the same
@@ -57,29 +57,19 @@
 #define NEAR_BUF_SIZE 1024
 #define MIN(a,b) (a <= b ? a : b)
 
-#ifdef _MSC_VER
-/* for FP_OFF */
-#include <dos.h>
-#endif
-
 static void
 png_default_write_data(png_structp png_ptr, png_bytep data, png_uint_32 length)
 {
    png_uint_32 check;
    png_byte *n_data;
+   FILE *io_ptr;
 
    /* Check if data really is near. If so, use usual code. */
-#ifdef _MSC_VER
-   /* do it this way just to quiet warning */
-   FP_OFF(n_data) = FP_OFF(data);
-   if (FP_SEG(n_data) == FP_SEG(data))
-#else
-   /* this works in MSC also but with lost segment warning */
-   n_data = (png_byte *)data;
+   n_data = (png_byte *)CVT_PTR_NOCHECK(data);
+   io_ptr = (FILE *)CVT_PTR(png_ptr->io_ptr);
    if ((png_bytep)n_data == data)
-#endif
    {
-      check = fwrite(n_data, 1, (png_size_t)length, (FILE *)(png_ptr->io_ptr));
+      check = fwrite(n_data, 1, (png_size_t)length, io_ptr);
    }
    else
    {
@@ -91,7 +81,7 @@
       {
          written = MIN(NEAR_BUF_SIZE, remaining);
          png_memcpy(buf, data, written); /* copy far buffer to near buffer */
-         err = fwrite(buf, 1, written, (FILE *)(png_ptr->io_ptr));
+         err = fwrite(buf, 1, written, io_ptr);
          if (err != written)
             break;
          else
@@ -123,8 +113,10 @@
 static void
 png_default_flush(png_structp png_ptr)
 {
-   if ((FILE *)(png_ptr->io_ptr))
-      fflush((FILE *)(png_ptr->io_ptr));
+   FILE *io_ptr;
+   io_ptr = (FILE *)CVT_PTR((png_ptr->io_ptr));
+   if (io_ptr)
+      fflush(io_ptr);
 }
 #endif
 
@@ -172,3 +164,30 @@
    png_ptr->read_data_fn = NULL;
 }
 
+#if defined(USE_FAR_KEYWORD) 
+#if defined(_MSC_VER)   
+void *far_to_near(png_structp png_ptr,png_voidp ptr, int check)
+{
+   void *near_ptr;   
+   void FAR *far_ptr;
+   FP_OFF(near_ptr) = FP_OFF(ptr);
+   far_ptr = (void FAR *)near_ptr;
+   if(check != 0)
+      if(FP_SEG(ptr) != FP_SEG(far_ptr))
+         png_error(png_ptr,"segment lost in conversion");
+   return(near_ptr);
+}
+#  else
+void *far_to_near(png_structp png_ptr,png_voidp ptr, int check)
+{
+   void *near_ptr;   
+   void FAR *far_ptr;
+   near_ptr = (void FAR *)ptr;
+   far_ptr = (void FAR *)near_ptr;
+   if(check != 0)
+      if(far_ptr != ptr)
+         png_error(png_ptr,"segment lost in conversion");
+   return(near_ptr);
+}
+#   endif
+#   endif