18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngwio.c - functions for data output
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Last changed in libpng 1.2.13 November 13, 2006
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * For conditions of distribution and use, see copyright notice in png.h
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 1998-2006 Glenn Randers-Pehrson
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This file provides a location for all output.  Users who need
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * special handling are expected to write functions that have the same
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * arguments as these and perform similar functions, but that possibly
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * use different output methods.  Note that you shouldn't change these
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * functions, but rather write replacement functions and then change
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * them at run time with png_set_write_fn(...).
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h"
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PNG_WRITE_SUPPORTED
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Write the data to whatever output you are using.  The default routine
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   writes to a file pointer.  Note that this routine sometimes gets called
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   with very small lengths, so you should implement some kind of simple
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   buffering if you are using unbuffered writes.  This should never be asked
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   to write more than 64K on a 16 bit machine.  */
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->write_data_fn != NULL )
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->write_data_fn))(png_ptr, data, length);
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr, "Call to NULL write function");
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_NO_STDIO)
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This is the function that does the actual writing of data.  If you are
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   not writing to a standard C stream, you should create a replacement
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   write_data function and use it at run time with png_set_write_fn(), rather
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   than changing the library. */
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef USE_FAR_KEYWORD
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_uint_32 check;
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(_WIN32_WCE)
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      check = 0;
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr));
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (check != length)
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr, "Write Error");
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this is the model-independent version. Since the standard I/O library
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   can't handle far buffers in the medium and small models, we have to copy
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   the data.
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define NEAR_BUF_SIZE 1024
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MIN(a,b) (a <= b ? a : b)
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_uint_32 check;
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_byte *near_data;  /* Needs to be "png_byte *" instead of "png_bytep" */
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_FILE_p io_ptr;
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Check if data really is near. If so, use usual code. */
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   near_data = (png_byte *)CVT_PTR_NOCHECK(data);
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if ((png_bytep)near_data == data)
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(_WIN32_WCE)
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if ( !WriteFile(io_ptr, near_data, length, &check, NULL) )
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         check = 0;
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      check = fwrite(near_data, 1, length, io_ptr);
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_byte buf[NEAR_BUF_SIZE];
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_size_t written, remaining, err;
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      check = 0;
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      remaining = length;
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      do
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         written = MIN(NEAR_BUF_SIZE, remaining);
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_memcpy(buf, data, written); /* copy far buffer to near buffer */
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(_WIN32_WCE)
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if ( !WriteFile(io_ptr, buf, written, &err, NULL) )
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            err = 0;
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         err = fwrite(buf, 1, written, io_ptr);
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (err != written)
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            check += err;
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         data += written;
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         remaining -= written;
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      while (remaining != 0);
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (check != length)
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_error(png_ptr, "Write Error");
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function is called to output any data pending writing (normally
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   to disk).  After png_flush is called, there should be no data pending
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   writing in any buffers. */
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_FLUSH_SUPPORTED)
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_flush(png_structp png_ptr)
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->output_flush_fn != NULL)
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      (*(png_ptr->output_flush_fn))(png_ptr);
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_NO_STDIO)
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_default_flush(png_structp png_ptr)
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(_WIN32_WCE)
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_FILE_p io_ptr;
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(_WIN32_WCE)
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr));
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (io_ptr != NULL)
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      fflush(io_ptr);
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function allows the application to supply new output functions for
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   libpng if standard C streams aren't being used.
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   This function takes as its arguments:
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr       - pointer to a png output data structure
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   io_ptr        - pointer to user supplied structure containing info about
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   the output functions.  May be NULL.
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   write_data_fn - pointer to a new output function that takes as its
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   arguments a pointer to a png_struct, a pointer to
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   data to be written, and a 32-bit unsigned int that is
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   the number of bytes to be written.  The new write
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   function should call png_error(png_ptr, "Error msg")
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   to exit and output any fatal error messages.
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   flush_data_fn - pointer to a new flush function that takes as its
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   arguments a pointer to a png_struct.  After a call to
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   the flush function, there should be no data in any buffers
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   or pending transmission.  If the output method doesn't do
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   any buffering of ouput, a function prototype must still be
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   supplied although it doesn't have to do anything.  If
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   time, output_flush_fn will be ignored, although it must be
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   supplied for compatibility. */
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(png_ptr == NULL) return;
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->io_ptr = io_ptr;
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_NO_STDIO)
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (write_data_fn != NULL)
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->write_data_fn = write_data_fn;
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->write_data_fn = png_default_write_data;
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->write_data_fn = write_data_fn;
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_FLUSH_SUPPORTED)
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_NO_STDIO)
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (output_flush_fn != NULL)
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->output_flush_fn = output_flush_fn;
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->output_flush_fn = png_default_flush;
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->output_flush_fn = output_flush_fn;
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_WRITE_FLUSH_SUPPORTED */
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* It is an error to read while writing a png file */
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->read_data_fn != NULL)
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->read_data_fn = NULL;
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr,
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         "Attempted to set both read_data_fn and write_data_fn in");
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr,
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         "the same structure.  Resetting read_data_fn to NULL.");
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(USE_FAR_KEYWORD)
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(_MSC_VER)
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check)
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   void *near_ptr;
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   void FAR *far_ptr;
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   FP_OFF(near_ptr) = FP_OFF(ptr);
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   far_ptr = (void FAR *)near_ptr;
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(check != 0)
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if(FP_SEG(ptr) != FP_SEG(far_ptr))
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr,"segment lost in conversion");
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return(near_ptr);
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  else
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check)
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   void *near_ptr;
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   void FAR *far_ptr;
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   near_ptr = (void FAR *)ptr;
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   far_ptr = (void FAR *)near_ptr;
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if(check != 0)
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if(far_ptr != ptr)
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_error(png_ptr,"segment lost in conversion");
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return(near_ptr);
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#   endif
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#   endif
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_WRITE_SUPPORTED */
235