mirror of
https://github.com/GRRLIB/GRRLIB.git
synced 2024-11-22 15:02:20 +00:00
[CHG] libpng is now distributed with code and not a complied library
This commit is contained in:
parent
899f7f1d47
commit
de118ab6f2
24 changed files with 22885 additions and 14 deletions
|
@ -13,6 +13,17 @@ cd jpeg
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
Rem -- PNG & PNGU libraries
|
Rem -- PNG & PNGU libraries
|
||||||
|
echo.
|
||||||
|
echo ---------------------------------------------------------------------------
|
||||||
|
echo Building PNGU Library...
|
||||||
|
echo.
|
||||||
|
cd png
|
||||||
|
make clean -s
|
||||||
|
if errorlevel 1 goto error
|
||||||
|
make all
|
||||||
|
if errorlevel 1 goto error
|
||||||
|
cd ..
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo ---------------------------------------------------------------------------
|
echo ---------------------------------------------------------------------------
|
||||||
echo Installing PNG Library...
|
echo Installing PNG Library...
|
||||||
|
@ -27,7 +38,7 @@ echo ---------------------------------------------------------------------------
|
||||||
echo Building PNGU Library...
|
echo Building PNGU Library...
|
||||||
echo.
|
echo.
|
||||||
cd pngu
|
cd pngu
|
||||||
make clean
|
make clean -s
|
||||||
if errorlevel 1 goto error
|
if errorlevel 1 goto error
|
||||||
make all
|
make all
|
||||||
if errorlevel 1 goto error
|
if errorlevel 1 goto error
|
||||||
|
|
|
@ -12,6 +12,13 @@ pushd jpeg
|
||||||
popd
|
popd
|
||||||
|
|
||||||
# PNG & PNGU libraries
|
# PNG & PNGU libraries
|
||||||
|
echo -e "\n--------------------------------------------------------------------"
|
||||||
|
echo -e "Building PNG Library...\n"
|
||||||
|
cd png
|
||||||
|
make clean
|
||||||
|
make all
|
||||||
|
cd ..
|
||||||
|
|
||||||
echo -e "\n--------------------------------------------------------------------"
|
echo -e "\n--------------------------------------------------------------------"
|
||||||
echo -e "Installing PNG Library...\n"
|
echo -e "Installing PNG Library...\n"
|
||||||
cd png
|
cd png
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Quick'n'dirty makefile [BC]
|
# Quick'n'dirty makefile [BC] v2
|
||||||
|
|
||||||
ifeq ($(strip $(DEVKITPPC)),)
|
ifeq ($(strip $(DEVKITPPC)),)
|
||||||
$(error "Use export DEVKITPPC=<path to>devkitPPC and try again")
|
$(error "Use export DEVKITPPC=<path to>devkitPPC and try again")
|
||||||
|
@ -8,20 +8,32 @@ ifeq ($(strip $(DEVKITPRO)),)
|
||||||
$(error "Use export DEVKITPRO=<path to>devkitPRO and try again")
|
$(error "Use export DEVKITPRO=<path to>devkitPRO and try again")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
OGC := $(DEVKITPRO)/libogc
|
PREFIX := $(DEVKITPPC)/bin/powerpc-eabi-
|
||||||
|
CC := $(PREFIX)gcc
|
||||||
|
AR := $(PREFIX)ar
|
||||||
|
|
||||||
HDR := $(shell ls include/*.h)
|
INCD := $(DEVKITPRO)/libogc/include
|
||||||
ARC := $(shell ls lib/wii/*.a)
|
LIBD := $(DEVKITPRO)/libogc/lib/wii
|
||||||
|
|
||||||
.PHONY : all install
|
MACHDEP := -DGEKKO -mrvl -mcpu=750 -meabi -mhard-float
|
||||||
|
CFLAGS := -O2 -Wall $(MACHDEP) -I $(INCD)
|
||||||
|
|
||||||
all :
|
LIB := png
|
||||||
@echo -e "\nWe must track down the svn repo for the source"
|
SRC := $(shell ls *.c)
|
||||||
@echo " and add it as an SVN Vendor Branch"
|
OBJ := $(patsubst %.c,%.o,$(SRC))
|
||||||
@echo " http://svnbook.red-bean.com/en/1.1/ch07s05.html"
|
ARC := lib$(LIB).a
|
||||||
@echo "...For now, all you get is precompiled libraries"
|
HDR := $(LIB).h $(LIB)conf.h
|
||||||
|
|
||||||
|
all : $(OBJ)
|
||||||
|
$(AR) -r $(ARC) $(OBJ)
|
||||||
|
|
||||||
|
clean :
|
||||||
|
rm -f $(OBJ) $(ARC)
|
||||||
|
|
||||||
install :
|
install :
|
||||||
mkdir -p $(OGC)/lib/wii/ $(OGC)/include/
|
mkdir -p $(LIBD) $(INCD)
|
||||||
cp -rf $(ARC) $(OGC)/lib/wii/
|
cp -f $(ARC) $(LIBD)/
|
||||||
cp -rf $(HDR) $(OGC)/include/
|
cp -f $(HDR) $(INCD)/
|
||||||
|
|
||||||
|
%.o : %.c
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
Binary file not shown.
926
GRRLIB/lib/png/png.c
Normal file
926
GRRLIB/lib/png/png.c
Normal file
|
@ -0,0 +1,926 @@
|
||||||
|
|
||||||
|
/* png.c - location for general purpose libpng functions
|
||||||
|
*
|
||||||
|
* Last changed in libpng 1.2.39 [August 13, 2009]
|
||||||
|
* Copyright (c) 1998-2009 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.)
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PNG_INTERNAL
|
||||||
|
#define PNG_NO_EXTERN
|
||||||
|
#include "png.h"
|
||||||
|
|
||||||
|
/* Generate a compiler error if there is an old png.h in the search path. */
|
||||||
|
typedef version_1_2_40 Your_png_h_is_not_version_1_2_40;
|
||||||
|
|
||||||
|
/* Version information for C files. This had better match the version
|
||||||
|
* string defined in png.h. */
|
||||||
|
|
||||||
|
#ifdef PNG_USE_GLOBAL_ARRAYS
|
||||||
|
/* png_libpng_ver was changed to a function in version 1.0.5c */
|
||||||
|
PNG_CONST char png_libpng_ver[18] = PNG_LIBPNG_VER_STRING;
|
||||||
|
|
||||||
|
#ifdef PNG_READ_SUPPORTED
|
||||||
|
|
||||||
|
/* png_sig was changed to a function in version 1.0.5c */
|
||||||
|
/* Place to hold the signature string for a PNG file. */
|
||||||
|
PNG_CONST png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10};
|
||||||
|
#endif /* PNG_READ_SUPPORTED */
|
||||||
|
|
||||||
|
/* Invoke global declarations for constant strings for known chunk types */
|
||||||
|
PNG_IHDR;
|
||||||
|
PNG_IDAT;
|
||||||
|
PNG_IEND;
|
||||||
|
PNG_PLTE;
|
||||||
|
PNG_bKGD;
|
||||||
|
PNG_cHRM;
|
||||||
|
PNG_gAMA;
|
||||||
|
PNG_hIST;
|
||||||
|
PNG_iCCP;
|
||||||
|
PNG_iTXt;
|
||||||
|
PNG_oFFs;
|
||||||
|
PNG_pCAL;
|
||||||
|
PNG_sCAL;
|
||||||
|
PNG_pHYs;
|
||||||
|
PNG_sBIT;
|
||||||
|
PNG_sPLT;
|
||||||
|
PNG_sRGB;
|
||||||
|
PNG_tEXt;
|
||||||
|
PNG_tIME;
|
||||||
|
PNG_tRNS;
|
||||||
|
PNG_zTXt;
|
||||||
|
|
||||||
|
#ifdef PNG_READ_SUPPORTED
|
||||||
|
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
||||||
|
|
||||||
|
/* Start of interlace block */
|
||||||
|
PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
|
||||||
|
|
||||||
|
/* Offset to next interlace block */
|
||||||
|
PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
|
||||||
|
|
||||||
|
/* Start of interlace block in the y direction */
|
||||||
|
PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
|
||||||
|
|
||||||
|
/* Offset to next interlace block in the y direction */
|
||||||
|
PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
|
||||||
|
|
||||||
|
/* Height of interlace block. This is not currently used - if you need
|
||||||
|
* it, uncomment it here and in png.h
|
||||||
|
PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Mask to determine which pixels are valid in a pass */
|
||||||
|
PNG_CONST int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
|
||||||
|
|
||||||
|
/* Mask to determine which pixels to overwrite while displaying */
|
||||||
|
PNG_CONST int FARDATA png_pass_dsp_mask[]
|
||||||
|
= {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
|
||||||
|
|
||||||
|
#endif /* PNG_READ_SUPPORTED */
|
||||||
|
#endif /* PNG_USE_GLOBAL_ARRAYS */
|
||||||
|
|
||||||
|
/* Tells libpng that we have already handled the first "num_bytes" bytes
|
||||||
|
* of the PNG file signature. If the PNG data is embedded into another
|
||||||
|
* stream we can set num_bytes = 8 so that libpng will not attempt to read
|
||||||
|
* or write any of the magic bytes before it starts on the IHDR.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef PNG_READ_SUPPORTED
|
||||||
|
void PNGAPI
|
||||||
|
png_set_sig_bytes(png_structp png_ptr, int num_bytes)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
png_debug(1, "in png_set_sig_bytes");
|
||||||
|
if (num_bytes > 8)
|
||||||
|
png_error(png_ptr, "Too many bytes for PNG signature.");
|
||||||
|
|
||||||
|
png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Checks whether the supplied bytes match the PNG signature. We allow
|
||||||
|
* checking less than the full 8-byte signature so that those apps that
|
||||||
|
* already read the first few bytes of a file to determine the file type
|
||||||
|
* can simply check the remaining bytes for extra assurance. Returns
|
||||||
|
* an integer less than, equal to, or greater than zero if sig is found,
|
||||||
|
* respectively, to be less than, to match, or be greater than the correct
|
||||||
|
* PNG signature (this is the same behaviour as strcmp, memcmp, etc).
|
||||||
|
*/
|
||||||
|
int PNGAPI
|
||||||
|
png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check)
|
||||||
|
{
|
||||||
|
png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
|
||||||
|
if (num_to_check > 8)
|
||||||
|
num_to_check = 8;
|
||||||
|
else if (num_to_check < 1)
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
if (start > 7)
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
if (start + num_to_check > 8)
|
||||||
|
num_to_check = 8 - start;
|
||||||
|
|
||||||
|
return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
|
||||||
|
/* (Obsolete) function to check signature bytes. It does not allow one
|
||||||
|
* to check a partial signature. This function might be removed in the
|
||||||
|
* future - use png_sig_cmp(). Returns true (nonzero) if the file is PNG.
|
||||||
|
*/
|
||||||
|
int PNGAPI
|
||||||
|
png_check_sig(png_bytep sig, int num)
|
||||||
|
{
|
||||||
|
return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* PNG_READ_SUPPORTED */
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||||
|
/* Function to allocate memory for zlib and clear it to 0. */
|
||||||
|
#ifdef PNG_1_0_X
|
||||||
|
voidpf PNGAPI
|
||||||
|
#else
|
||||||
|
voidpf /* PRIVATE */
|
||||||
|
#endif
|
||||||
|
png_zalloc(voidpf png_ptr, uInt items, uInt size)
|
||||||
|
{
|
||||||
|
png_voidp ptr;
|
||||||
|
png_structp p=(png_structp)png_ptr;
|
||||||
|
png_uint_32 save_flags=p->flags;
|
||||||
|
png_uint_32 num_bytes;
|
||||||
|
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return (NULL);
|
||||||
|
if (items > PNG_UINT_32_MAX/size)
|
||||||
|
{
|
||||||
|
png_warning (p, "Potential overflow in png_zalloc()");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
num_bytes = (png_uint_32)items * size;
|
||||||
|
|
||||||
|
p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
|
||||||
|
ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes);
|
||||||
|
p->flags=save_flags;
|
||||||
|
|
||||||
|
#if defined(PNG_1_0_X) && !defined(PNG_NO_ZALLOC_ZERO)
|
||||||
|
if (ptr == NULL)
|
||||||
|
return ((voidpf)ptr);
|
||||||
|
|
||||||
|
if (num_bytes > (png_uint_32)0x8000L)
|
||||||
|
{
|
||||||
|
png_memset(ptr, 0, (png_size_t)0x8000L);
|
||||||
|
png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0,
|
||||||
|
(png_size_t)(num_bytes - (png_uint_32)0x8000L));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_memset(ptr, 0, (png_size_t)num_bytes);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return ((voidpf)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Function to free memory for zlib */
|
||||||
|
#ifdef PNG_1_0_X
|
||||||
|
void PNGAPI
|
||||||
|
#else
|
||||||
|
void /* PRIVATE */
|
||||||
|
#endif
|
||||||
|
png_zfree(voidpf png_ptr, voidpf ptr)
|
||||||
|
{
|
||||||
|
png_free((png_structp)png_ptr, (png_voidp)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset the CRC variable to 32 bits of 1's. Care must be taken
|
||||||
|
* in case CRC is > 32 bits to leave the top bits 0.
|
||||||
|
*/
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_reset_crc(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_ptr->crc = crc32(0, Z_NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculate the CRC over a section of data. We can only pass as
|
||||||
|
* much data to this routine as the largest single buffer size. We
|
||||||
|
* also check that this data will actually be used before going to the
|
||||||
|
* trouble of calculating it.
|
||||||
|
*/
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length)
|
||||||
|
{
|
||||||
|
int need_crc = 1;
|
||||||
|
|
||||||
|
if (png_ptr->chunk_name[0] & 0x20) /* ancillary */
|
||||||
|
{
|
||||||
|
if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
|
||||||
|
(PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
|
||||||
|
need_crc = 0;
|
||||||
|
}
|
||||||
|
else /* critical */
|
||||||
|
{
|
||||||
|
if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
|
||||||
|
need_crc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (need_crc)
|
||||||
|
png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate the memory for an info_struct for the application. We don't
|
||||||
|
* really need the png_ptr, but it could potentially be useful in the
|
||||||
|
* future. This should be used in favour of malloc(png_sizeof(png_info))
|
||||||
|
* and png_info_init() so that applications that want to use a shared
|
||||||
|
* libpng don't have to be recompiled if png_info changes size.
|
||||||
|
*/
|
||||||
|
png_infop PNGAPI
|
||||||
|
png_create_info_struct(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_infop info_ptr;
|
||||||
|
|
||||||
|
png_debug(1, "in png_create_info_struct");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return (NULL);
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO,
|
||||||
|
png_ptr->malloc_fn, png_ptr->mem_ptr);
|
||||||
|
#else
|
||||||
|
info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
|
||||||
|
#endif
|
||||||
|
if (info_ptr != NULL)
|
||||||
|
png_info_init_3(&info_ptr, png_sizeof(png_info));
|
||||||
|
|
||||||
|
return (info_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function frees the memory associated with a single info struct.
|
||||||
|
* Normally, one would use either png_destroy_read_struct() or
|
||||||
|
* png_destroy_write_struct() to free an info struct, but this may be
|
||||||
|
* useful for some applications.
|
||||||
|
*/
|
||||||
|
void PNGAPI
|
||||||
|
png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr)
|
||||||
|
{
|
||||||
|
png_infop info_ptr = NULL;
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
png_debug(1, "in png_destroy_info_struct");
|
||||||
|
if (info_ptr_ptr != NULL)
|
||||||
|
info_ptr = *info_ptr_ptr;
|
||||||
|
|
||||||
|
if (info_ptr != NULL)
|
||||||
|
{
|
||||||
|
png_info_destroy(png_ptr, info_ptr);
|
||||||
|
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn,
|
||||||
|
png_ptr->mem_ptr);
|
||||||
|
#else
|
||||||
|
png_destroy_struct((png_voidp)info_ptr);
|
||||||
|
#endif
|
||||||
|
*info_ptr_ptr = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize the info structure. This is now an internal function (0.89)
|
||||||
|
* and applications using it are urged to use png_create_info_struct()
|
||||||
|
* instead.
|
||||||
|
*/
|
||||||
|
#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
|
||||||
|
#undef png_info_init
|
||||||
|
void PNGAPI
|
||||||
|
png_info_init(png_infop info_ptr)
|
||||||
|
{
|
||||||
|
/* We only come here via pre-1.0.12-compiled applications */
|
||||||
|
png_info_init_3(&info_ptr, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void PNGAPI
|
||||||
|
png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)
|
||||||
|
{
|
||||||
|
png_infop info_ptr = *ptr_ptr;
|
||||||
|
|
||||||
|
if (info_ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
png_debug(1, "in png_info_init_3");
|
||||||
|
|
||||||
|
if (png_sizeof(png_info) > png_info_struct_size)
|
||||||
|
{
|
||||||
|
png_destroy_struct(info_ptr);
|
||||||
|
info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
|
||||||
|
*ptr_ptr = info_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set everything to 0 */
|
||||||
|
png_memset(info_ptr, 0, png_sizeof(png_info));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
void PNGAPI
|
||||||
|
png_data_freer(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
int freer, png_uint_32 mask)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_data_freer");
|
||||||
|
if (png_ptr == NULL || info_ptr == NULL)
|
||||||
|
return;
|
||||||
|
if (freer == PNG_DESTROY_WILL_FREE_DATA)
|
||||||
|
info_ptr->free_me |= mask;
|
||||||
|
else if (freer == PNG_USER_WILL_FREE_DATA)
|
||||||
|
info_ptr->free_me &= ~mask;
|
||||||
|
else
|
||||||
|
png_warning(png_ptr,
|
||||||
|
"Unknown freer parameter in png_data_freer.");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void PNGAPI
|
||||||
|
png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
|
||||||
|
int num)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_free_data");
|
||||||
|
if (png_ptr == NULL || info_ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#if defined(PNG_TEXT_SUPPORTED)
|
||||||
|
/* Free text item num or (if num == -1) all text items */
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
|
||||||
|
#else
|
||||||
|
if (mask & PNG_FREE_TEXT)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (num != -1)
|
||||||
|
{
|
||||||
|
if (info_ptr->text && info_ptr->text[num].key)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->text[num].key);
|
||||||
|
info_ptr->text[num].key = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < info_ptr->num_text; i++)
|
||||||
|
png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i);
|
||||||
|
png_free(png_ptr, info_ptr->text);
|
||||||
|
info_ptr->text = NULL;
|
||||||
|
info_ptr->num_text=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_tRNS_SUPPORTED)
|
||||||
|
/* Free any tRNS entry */
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)
|
||||||
|
#else
|
||||||
|
if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->trans);
|
||||||
|
info_ptr->trans = NULL;
|
||||||
|
info_ptr->valid &= ~PNG_INFO_tRNS;
|
||||||
|
#ifndef PNG_FREE_ME_SUPPORTED
|
||||||
|
png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_sCAL_SUPPORTED)
|
||||||
|
/* Free any sCAL entry */
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
|
||||||
|
#else
|
||||||
|
if (mask & PNG_FREE_SCAL)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
|
||||||
|
png_free(png_ptr, info_ptr->scal_s_width);
|
||||||
|
png_free(png_ptr, info_ptr->scal_s_height);
|
||||||
|
info_ptr->scal_s_width = NULL;
|
||||||
|
info_ptr->scal_s_height = NULL;
|
||||||
|
#endif
|
||||||
|
info_ptr->valid &= ~PNG_INFO_sCAL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_pCAL_SUPPORTED)
|
||||||
|
/* Free any pCAL entry */
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)
|
||||||
|
#else
|
||||||
|
if (mask & PNG_FREE_PCAL)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->pcal_purpose);
|
||||||
|
png_free(png_ptr, info_ptr->pcal_units);
|
||||||
|
info_ptr->pcal_purpose = NULL;
|
||||||
|
info_ptr->pcal_units = NULL;
|
||||||
|
if (info_ptr->pcal_params != NULL)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->pcal_params[i]);
|
||||||
|
info_ptr->pcal_params[i]=NULL;
|
||||||
|
}
|
||||||
|
png_free(png_ptr, info_ptr->pcal_params);
|
||||||
|
info_ptr->pcal_params = NULL;
|
||||||
|
}
|
||||||
|
info_ptr->valid &= ~PNG_INFO_pCAL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_iCCP_SUPPORTED)
|
||||||
|
/* Free any iCCP entry */
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
|
||||||
|
#else
|
||||||
|
if (mask & PNG_FREE_ICCP)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->iccp_name);
|
||||||
|
png_free(png_ptr, info_ptr->iccp_profile);
|
||||||
|
info_ptr->iccp_name = NULL;
|
||||||
|
info_ptr->iccp_profile = NULL;
|
||||||
|
info_ptr->valid &= ~PNG_INFO_iCCP;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_sPLT_SUPPORTED)
|
||||||
|
/* Free a given sPLT entry, or (if num == -1) all sPLT entries */
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)
|
||||||
|
#else
|
||||||
|
if (mask & PNG_FREE_SPLT)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (num != -1)
|
||||||
|
{
|
||||||
|
if (info_ptr->splt_palettes)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->splt_palettes[num].name);
|
||||||
|
png_free(png_ptr, info_ptr->splt_palettes[num].entries);
|
||||||
|
info_ptr->splt_palettes[num].name = NULL;
|
||||||
|
info_ptr->splt_palettes[num].entries = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (info_ptr->splt_palettes_num)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
|
||||||
|
png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
|
||||||
|
|
||||||
|
png_free(png_ptr, info_ptr->splt_palettes);
|
||||||
|
info_ptr->splt_palettes = NULL;
|
||||||
|
info_ptr->splt_palettes_num = 0;
|
||||||
|
}
|
||||||
|
info_ptr->valid &= ~PNG_INFO_sPLT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
|
||||||
|
if (png_ptr->unknown_chunk.data)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, png_ptr->unknown_chunk.data);
|
||||||
|
png_ptr->unknown_chunk.data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
|
||||||
|
#else
|
||||||
|
if (mask & PNG_FREE_UNKN)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (num != -1)
|
||||||
|
{
|
||||||
|
if (info_ptr->unknown_chunks)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->unknown_chunks[num].data);
|
||||||
|
info_ptr->unknown_chunks[num].data = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (info_ptr->unknown_chunks_num)
|
||||||
|
{
|
||||||
|
for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++)
|
||||||
|
png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
|
||||||
|
|
||||||
|
png_free(png_ptr, info_ptr->unknown_chunks);
|
||||||
|
info_ptr->unknown_chunks = NULL;
|
||||||
|
info_ptr->unknown_chunks_num = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_hIST_SUPPORTED)
|
||||||
|
/* Free any hIST entry */
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
if ((mask & PNG_FREE_HIST) & info_ptr->free_me)
|
||||||
|
#else
|
||||||
|
if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->hist);
|
||||||
|
info_ptr->hist = NULL;
|
||||||
|
info_ptr->valid &= ~PNG_INFO_hIST;
|
||||||
|
#ifndef PNG_FREE_ME_SUPPORTED
|
||||||
|
png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Free any PLTE entry that was internally allocated */
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
|
||||||
|
#else
|
||||||
|
if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
png_zfree(png_ptr, info_ptr->palette);
|
||||||
|
info_ptr->palette = NULL;
|
||||||
|
info_ptr->valid &= ~PNG_INFO_PLTE;
|
||||||
|
#ifndef PNG_FREE_ME_SUPPORTED
|
||||||
|
png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
|
||||||
|
#endif
|
||||||
|
info_ptr->num_palette = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_INFO_IMAGE_SUPPORTED)
|
||||||
|
/* Free any image bits attached to the info structure */
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
|
||||||
|
#else
|
||||||
|
if (mask & PNG_FREE_ROWS)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (info_ptr->row_pointers)
|
||||||
|
{
|
||||||
|
int row;
|
||||||
|
for (row = 0; row < (int)info_ptr->height; row++)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, info_ptr->row_pointers[row]);
|
||||||
|
info_ptr->row_pointers[row]=NULL;
|
||||||
|
}
|
||||||
|
png_free(png_ptr, info_ptr->row_pointers);
|
||||||
|
info_ptr->row_pointers=NULL;
|
||||||
|
}
|
||||||
|
info_ptr->valid &= ~PNG_INFO_IDAT;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PNG_FREE_ME_SUPPORTED
|
||||||
|
if (num == -1)
|
||||||
|
info_ptr->free_me &= ~mask;
|
||||||
|
else
|
||||||
|
info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is an internal routine to free any memory that the info struct is
|
||||||
|
* pointing to before re-using it or freeing the struct itself. Recall
|
||||||
|
* that png_free() checks for NULL pointers for us.
|
||||||
|
*/
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_info_destroy(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_info_destroy");
|
||||||
|
|
||||||
|
png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
|
||||||
|
|
||||||
|
#if defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
|
||||||
|
if (png_ptr->num_chunk_list)
|
||||||
|
{
|
||||||
|
png_free(png_ptr, png_ptr->chunk_list);
|
||||||
|
png_ptr->chunk_list=NULL;
|
||||||
|
png_ptr->num_chunk_list = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
png_info_init_3(&info_ptr, png_sizeof(png_info));
|
||||||
|
}
|
||||||
|
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
|
||||||
|
|
||||||
|
/* This function returns a pointer to the io_ptr associated with the user
|
||||||
|
* functions. The application should free any memory associated with this
|
||||||
|
* pointer before png_write_destroy() or png_read_destroy() are called.
|
||||||
|
*/
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_get_io_ptr(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return (NULL);
|
||||||
|
return (png_ptr->io_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||||
|
#if !defined(PNG_NO_STDIO)
|
||||||
|
/* Initialize the default input/output functions for the PNG file. If you
|
||||||
|
* use your own read or write routines, you can call either png_set_read_fn()
|
||||||
|
* or png_set_write_fn() instead of png_init_io(). If you have defined
|
||||||
|
* PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't
|
||||||
|
* necessarily available.
|
||||||
|
*/
|
||||||
|
void PNGAPI
|
||||||
|
png_init_io(png_structp png_ptr, png_FILE_p fp)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_init_io");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
png_ptr->io_ptr = (png_voidp)fp;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_TIME_RFC1123_SUPPORTED)
|
||||||
|
/* Convert the supplied time into an RFC 1123 string suitable for use in
|
||||||
|
* a "Creation Time" or other text-based time string.
|
||||||
|
*/
|
||||||
|
png_charp PNGAPI
|
||||||
|
png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
|
||||||
|
{
|
||||||
|
static PNG_CONST char short_months[12][4] =
|
||||||
|
{"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||||
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||||
|
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return (NULL);
|
||||||
|
if (png_ptr->time_buffer == NULL)
|
||||||
|
{
|
||||||
|
png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29*
|
||||||
|
png_sizeof(char)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_WIN32_WCE)
|
||||||
|
{
|
||||||
|
wchar_t time_buf[29];
|
||||||
|
wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"),
|
||||||
|
ptime->day % 32, short_months[(ptime->month - 1) % 12],
|
||||||
|
ptime->year, ptime->hour % 24, ptime->minute % 60,
|
||||||
|
ptime->second % 61);
|
||||||
|
WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29,
|
||||||
|
NULL, NULL);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#ifdef USE_FAR_KEYWORD
|
||||||
|
{
|
||||||
|
char near_time_buf[29];
|
||||||
|
png_snprintf6(near_time_buf, 29, "%d %s %d %02d:%02d:%02d +0000",
|
||||||
|
ptime->day % 32, short_months[(ptime->month - 1) % 12],
|
||||||
|
ptime->year, ptime->hour % 24, ptime->minute % 60,
|
||||||
|
ptime->second % 61);
|
||||||
|
png_memcpy(png_ptr->time_buffer, near_time_buf,
|
||||||
|
29*png_sizeof(char));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
png_snprintf6(png_ptr->time_buffer, 29, "%d %s %d %02d:%02d:%02d +0000",
|
||||||
|
ptime->day % 32, short_months[(ptime->month - 1) % 12],
|
||||||
|
ptime->year, ptime->hour % 24, ptime->minute % 60,
|
||||||
|
ptime->second % 61);
|
||||||
|
#endif
|
||||||
|
#endif /* _WIN32_WCE */
|
||||||
|
return ((png_charp)png_ptr->time_buffer);
|
||||||
|
}
|
||||||
|
#endif /* PNG_TIME_RFC1123_SUPPORTED */
|
||||||
|
|
||||||
|
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
|
||||||
|
|
||||||
|
png_charp PNGAPI
|
||||||
|
png_get_copyright(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */
|
||||||
|
return ((png_charp) "\n libpng version 1.2.40 - September 10, 2009\n\
|
||||||
|
Copyright (c) 1998-2009 Glenn Randers-Pehrson\n\
|
||||||
|
Copyright (c) 1996-1997 Andreas Dilger\n\
|
||||||
|
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The following return the library version as a short string in the
|
||||||
|
* format 1.0.0 through 99.99.99zz. To get the version of *.h files
|
||||||
|
* used with your application, print out PNG_LIBPNG_VER_STRING, which
|
||||||
|
* is defined in png.h.
|
||||||
|
* Note: now there is no difference between png_get_libpng_ver() and
|
||||||
|
* png_get_header_ver(). Due to the version_nn_nn_nn typedef guard,
|
||||||
|
* it is guaranteed that png.c uses the correct version of png.h.
|
||||||
|
*/
|
||||||
|
png_charp PNGAPI
|
||||||
|
png_get_libpng_ver(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
/* Version of *.c files used when building libpng */
|
||||||
|
png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */
|
||||||
|
return ((png_charp) PNG_LIBPNG_VER_STRING);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_charp PNGAPI
|
||||||
|
png_get_header_ver(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
/* Version of *.h files used when building libpng */
|
||||||
|
png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */
|
||||||
|
return ((png_charp) PNG_LIBPNG_VER_STRING);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_charp PNGAPI
|
||||||
|
png_get_header_version(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
/* Returns longer string containing both version and date */
|
||||||
|
png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */
|
||||||
|
return ((png_charp) PNG_HEADER_VERSION_STRING
|
||||||
|
#ifndef PNG_READ_SUPPORTED
|
||||||
|
" (NO READ SUPPORT)"
|
||||||
|
#endif
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||||
|
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||||
|
int PNGAPI
|
||||||
|
png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name)
|
||||||
|
{
|
||||||
|
/* Check chunk_name and return "keep" value if it's on the list, else 0 */
|
||||||
|
int i;
|
||||||
|
png_bytep p;
|
||||||
|
if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0)
|
||||||
|
return 0;
|
||||||
|
p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5;
|
||||||
|
for (i = png_ptr->num_chunk_list; i; i--, p -= 5)
|
||||||
|
if (!png_memcmp(chunk_name, p, 4))
|
||||||
|
return ((int)*(p + 4));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This function, added to libpng-1.0.6g, is untested. */
|
||||||
|
int PNGAPI
|
||||||
|
png_reset_zstream(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return Z_STREAM_ERROR;
|
||||||
|
return (inflateReset(&png_ptr->zstream));
|
||||||
|
}
|
||||||
|
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
|
||||||
|
|
||||||
|
/* This function was added to libpng-1.0.7 */
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_access_version_number(void)
|
||||||
|
{
|
||||||
|
/* Version of *.c files used when building libpng */
|
||||||
|
return((png_uint_32) PNG_LIBPNG_VER);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SUPPORTED) && defined(PNG_ASSEMBLER_CODE_SUPPORTED)
|
||||||
|
#if !defined(PNG_1_0_X)
|
||||||
|
/* This function was added to libpng 1.2.0 */
|
||||||
|
int PNGAPI
|
||||||
|
png_mmx_support(void)
|
||||||
|
{
|
||||||
|
/* Obsolete, to be removed from libpng-1.4.0 */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif /* PNG_1_0_X */
|
||||||
|
#endif /* PNG_READ_SUPPORTED && PNG_ASSEMBLER_CODE_SUPPORTED */
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||||
|
#ifdef PNG_SIZE_T
|
||||||
|
/* Added at libpng version 1.2.6 */
|
||||||
|
PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size));
|
||||||
|
png_size_t PNGAPI
|
||||||
|
png_convert_size(size_t size)
|
||||||
|
{
|
||||||
|
if (size > (png_size_t)-1)
|
||||||
|
PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */
|
||||||
|
return ((png_size_t)size);
|
||||||
|
}
|
||||||
|
#endif /* PNG_SIZE_T */
|
||||||
|
|
||||||
|
/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */
|
||||||
|
#if defined(PNG_cHRM_SUPPORTED)
|
||||||
|
#if !defined(PNG_NO_CHECK_cHRM)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Multiply two 32-bit numbers, V1 and V2, using 32-bit
|
||||||
|
* arithmetic, to produce a 64 bit result in the HI/LO words.
|
||||||
|
*
|
||||||
|
* A B
|
||||||
|
* x C D
|
||||||
|
* ------
|
||||||
|
* AD || BD
|
||||||
|
* AC || CB || 0
|
||||||
|
*
|
||||||
|
* where A and B are the high and low 16-bit words of V1,
|
||||||
|
* C and D are the 16-bit words of V2, AD is the product of
|
||||||
|
* A and D, and X || Y is (X << 16) + Y.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_64bit_product (long v1, long v2, unsigned long *hi_product,
|
||||||
|
unsigned long *lo_product)
|
||||||
|
{
|
||||||
|
int a, b, c, d;
|
||||||
|
long lo, hi, x, y;
|
||||||
|
|
||||||
|
a = (v1 >> 16) & 0xffff;
|
||||||
|
b = v1 & 0xffff;
|
||||||
|
c = (v2 >> 16) & 0xffff;
|
||||||
|
d = v2 & 0xffff;
|
||||||
|
|
||||||
|
lo = b * d; /* BD */
|
||||||
|
x = a * d + c * b; /* AD + CB */
|
||||||
|
y = ((lo >> 16) & 0xffff) + x;
|
||||||
|
|
||||||
|
lo = (lo & 0xffff) | ((y & 0xffff) << 16);
|
||||||
|
hi = (y >> 16) & 0xffff;
|
||||||
|
|
||||||
|
hi += a * c; /* AC */
|
||||||
|
|
||||||
|
*hi_product = (unsigned long)hi;
|
||||||
|
*lo_product = (unsigned long)lo;
|
||||||
|
}
|
||||||
|
|
||||||
|
int /* PRIVATE */
|
||||||
|
png_check_cHRM_fixed(png_structp png_ptr,
|
||||||
|
png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
|
||||||
|
png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
|
||||||
|
png_fixed_point blue_x, png_fixed_point blue_y)
|
||||||
|
{
|
||||||
|
int ret = 1;
|
||||||
|
unsigned long xy_hi,xy_lo,yx_hi,yx_lo;
|
||||||
|
|
||||||
|
png_debug(1, "in function png_check_cHRM_fixed");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (white_x < 0 || white_y <= 0 ||
|
||||||
|
red_x < 0 || red_y < 0 ||
|
||||||
|
green_x < 0 || green_y < 0 ||
|
||||||
|
blue_x < 0 || blue_y < 0)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr,
|
||||||
|
"Ignoring attempt to set negative chromaticity value");
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
if (white_x > (png_fixed_point) PNG_UINT_31_MAX ||
|
||||||
|
white_y > (png_fixed_point) PNG_UINT_31_MAX ||
|
||||||
|
red_x > (png_fixed_point) PNG_UINT_31_MAX ||
|
||||||
|
red_y > (png_fixed_point) PNG_UINT_31_MAX ||
|
||||||
|
green_x > (png_fixed_point) PNG_UINT_31_MAX ||
|
||||||
|
green_y > (png_fixed_point) PNG_UINT_31_MAX ||
|
||||||
|
blue_x > (png_fixed_point) PNG_UINT_31_MAX ||
|
||||||
|
blue_y > (png_fixed_point) PNG_UINT_31_MAX )
|
||||||
|
{
|
||||||
|
png_warning(png_ptr,
|
||||||
|
"Ignoring attempt to set chromaticity value exceeding 21474.83");
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
if (white_x > 100000L - white_y)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Invalid cHRM white point");
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
if (red_x > 100000L - red_y)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Invalid cHRM red point");
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
if (green_x > 100000L - green_y)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Invalid cHRM green point");
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
if (blue_x > 100000L - blue_y)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Invalid cHRM blue point");
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
png_64bit_product(green_x - red_x, blue_y - red_y, &xy_hi, &xy_lo);
|
||||||
|
png_64bit_product(green_y - red_y, blue_x - red_x, &yx_hi, &yx_lo);
|
||||||
|
|
||||||
|
if (xy_hi == yx_hi && xy_lo == yx_lo)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr,
|
||||||
|
"Ignoring attempt to set cHRM RGB triangle with zero area");
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* NO_PNG_CHECK_cHRM */
|
||||||
|
#endif /* PNG_cHRM_SUPPORTED */
|
||||||
|
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
|
364
GRRLIB/lib/png/pngerror.c
Normal file
364
GRRLIB/lib/png/pngerror.c
Normal file
|
@ -0,0 +1,364 @@
|
||||||
|
|
||||||
|
/* pngerror.c - stub functions for i/o and memory allocation
|
||||||
|
*
|
||||||
|
* Last changed in libpng 1.2.37 [June 4, 2009]
|
||||||
|
* Copyright (c) 1998-2009 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.)
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*
|
||||||
|
* This file provides a location for all error handling. Users who
|
||||||
|
* need special error handling are expected to write replacement functions
|
||||||
|
* and use png_set_error_fn() to use those functions. See the instructions
|
||||||
|
* at each function.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PNG_INTERNAL
|
||||||
|
#include "png.h"
|
||||||
|
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||||
|
|
||||||
|
static void /* PRIVATE */
|
||||||
|
png_default_error PNGARG((png_structp png_ptr,
|
||||||
|
png_const_charp error_message));
|
||||||
|
#ifndef PNG_NO_WARNINGS
|
||||||
|
static void /* PRIVATE */
|
||||||
|
png_default_warning PNGARG((png_structp png_ptr,
|
||||||
|
png_const_charp warning_message));
|
||||||
|
#endif /* PNG_NO_WARNINGS */
|
||||||
|
|
||||||
|
/* This function is called whenever there is a fatal error. This function
|
||||||
|
* should not be changed. If there is a need to handle errors differently,
|
||||||
|
* you should supply a replacement error function and use png_set_error_fn()
|
||||||
|
* to replace the error function at run-time.
|
||||||
|
*/
|
||||||
|
#ifndef PNG_NO_ERROR_TEXT
|
||||||
|
void PNGAPI
|
||||||
|
png_error(png_structp png_ptr, png_const_charp error_message)
|
||||||
|
{
|
||||||
|
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||||
|
char msg[16];
|
||||||
|
if (png_ptr != NULL)
|
||||||
|
{
|
||||||
|
if (png_ptr->flags&
|
||||||
|
(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))
|
||||||
|
{
|
||||||
|
if (*error_message == '#')
|
||||||
|
{
|
||||||
|
/* Strip "#nnnn " from beginning of error message. */
|
||||||
|
int offset;
|
||||||
|
for (offset = 1; offset<15; offset++)
|
||||||
|
if (error_message[offset] == ' ')
|
||||||
|
break;
|
||||||
|
if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < offset - 1; i++)
|
||||||
|
msg[i] = error_message[i + 1];
|
||||||
|
msg[i - 1] = '\0';
|
||||||
|
error_message = msg;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
error_message += offset;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
|
||||||
|
{
|
||||||
|
msg[0] = '0';
|
||||||
|
msg[1] = '\0';
|
||||||
|
error_message = msg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (png_ptr != NULL && png_ptr->error_fn != NULL)
|
||||||
|
(*(png_ptr->error_fn))(png_ptr, error_message);
|
||||||
|
|
||||||
|
/* If the custom handler doesn't exist, or if it returns,
|
||||||
|
use the default handler, which will not return. */
|
||||||
|
png_default_error(png_ptr, error_message);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void PNGAPI
|
||||||
|
png_err(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && png_ptr->error_fn != NULL)
|
||||||
|
(*(png_ptr->error_fn))(png_ptr, '\0');
|
||||||
|
|
||||||
|
/* If the custom handler doesn't exist, or if it returns,
|
||||||
|
use the default handler, which will not return. */
|
||||||
|
png_default_error(png_ptr, '\0');
|
||||||
|
}
|
||||||
|
#endif /* PNG_NO_ERROR_TEXT */
|
||||||
|
|
||||||
|
#ifndef PNG_NO_WARNINGS
|
||||||
|
/* This function is called whenever there is a non-fatal error. This function
|
||||||
|
* should not be changed. If there is a need to handle warnings differently,
|
||||||
|
* you should supply a replacement warning function and use
|
||||||
|
* png_set_error_fn() to replace the warning function at run-time.
|
||||||
|
*/
|
||||||
|
void PNGAPI
|
||||||
|
png_warning(png_structp png_ptr, png_const_charp warning_message)
|
||||||
|
{
|
||||||
|
int offset = 0;
|
||||||
|
if (png_ptr != NULL)
|
||||||
|
{
|
||||||
|
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||||
|
if (png_ptr->flags&
|
||||||
|
(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (*warning_message == '#')
|
||||||
|
{
|
||||||
|
for (offset = 1; offset < 15; offset++)
|
||||||
|
if (warning_message[offset] == ' ')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (png_ptr != NULL && png_ptr->warning_fn != NULL)
|
||||||
|
(*(png_ptr->warning_fn))(png_ptr, warning_message + offset);
|
||||||
|
else
|
||||||
|
png_default_warning(png_ptr, warning_message + offset);
|
||||||
|
}
|
||||||
|
#endif /* PNG_NO_WARNINGS */
|
||||||
|
|
||||||
|
|
||||||
|
/* These utilities are used internally to build an error message that relates
|
||||||
|
* to the current chunk. The chunk name comes from png_ptr->chunk_name,
|
||||||
|
* this is used to prefix the message. The message is limited in length
|
||||||
|
* to 63 bytes, the name characters are output as hex digits wrapped in []
|
||||||
|
* if the character is invalid.
|
||||||
|
*/
|
||||||
|
#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97))
|
||||||
|
static PNG_CONST char png_digit[16] = {
|
||||||
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F'
|
||||||
|
};
|
||||||
|
|
||||||
|
#define PNG_MAX_ERROR_TEXT 64
|
||||||
|
|
||||||
|
#if !defined(PNG_NO_WARNINGS) || !defined(PNG_NO_ERROR_TEXT)
|
||||||
|
static void /* PRIVATE */
|
||||||
|
png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
|
||||||
|
error_message)
|
||||||
|
{
|
||||||
|
int iout = 0, iin = 0;
|
||||||
|
|
||||||
|
while (iin < 4)
|
||||||
|
{
|
||||||
|
int c = png_ptr->chunk_name[iin++];
|
||||||
|
if (isnonalpha(c))
|
||||||
|
{
|
||||||
|
buffer[iout++] = '[';
|
||||||
|
buffer[iout++] = png_digit[(c & 0xf0) >> 4];
|
||||||
|
buffer[iout++] = png_digit[c & 0x0f];
|
||||||
|
buffer[iout++] = ']';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer[iout++] = (png_byte)c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error_message == NULL)
|
||||||
|
buffer[iout] = '\0';
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer[iout++] = ':';
|
||||||
|
buffer[iout++] = ' ';
|
||||||
|
png_memcpy(buffer + iout, error_message, PNG_MAX_ERROR_TEXT);
|
||||||
|
buffer[iout + PNG_MAX_ERROR_TEXT - 1] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_READ_SUPPORTED
|
||||||
|
void PNGAPI
|
||||||
|
png_chunk_error(png_structp png_ptr, png_const_charp error_message)
|
||||||
|
{
|
||||||
|
char msg[18+PNG_MAX_ERROR_TEXT];
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
png_error(png_ptr, error_message);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_format_buffer(png_ptr, msg, error_message);
|
||||||
|
png_error(png_ptr, msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* PNG_READ_SUPPORTED */
|
||||||
|
#endif /* !defined(PNG_NO_WARNINGS) || !defined(PNG_NO_ERROR_TEXT) */
|
||||||
|
|
||||||
|
#ifndef PNG_NO_WARNINGS
|
||||||
|
void PNGAPI
|
||||||
|
png_chunk_warning(png_structp png_ptr, png_const_charp warning_message)
|
||||||
|
{
|
||||||
|
char msg[18+PNG_MAX_ERROR_TEXT];
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
png_warning(png_ptr, warning_message);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_format_buffer(png_ptr, msg, warning_message);
|
||||||
|
png_warning(png_ptr, msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* PNG_NO_WARNINGS */
|
||||||
|
|
||||||
|
|
||||||
|
/* This is the default error handling function. Note that replacements for
|
||||||
|
* this function MUST NOT RETURN, or the program will likely crash. This
|
||||||
|
* function is used by default, or if the program supplies NULL for the
|
||||||
|
* error function pointer in png_set_error_fn().
|
||||||
|
*/
|
||||||
|
static void /* PRIVATE */
|
||||||
|
png_default_error(png_structp png_ptr, png_const_charp error_message)
|
||||||
|
{
|
||||||
|
#ifndef PNG_NO_CONSOLE_IO
|
||||||
|
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||||
|
if (*error_message == '#')
|
||||||
|
{
|
||||||
|
/* Strip "#nnnn " from beginning of error message. */
|
||||||
|
int offset;
|
||||||
|
char error_number[16];
|
||||||
|
for (offset = 0; offset<15; offset++)
|
||||||
|
{
|
||||||
|
error_number[offset] = error_message[offset + 1];
|
||||||
|
if (error_message[offset] == ' ')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ((offset > 1) && (offset < 15))
|
||||||
|
{
|
||||||
|
error_number[offset - 1] = '\0';
|
||||||
|
fprintf(stderr, "libpng error no. %s: %s",
|
||||||
|
error_number, error_message + offset + 1);
|
||||||
|
fprintf(stderr, PNG_STRING_NEWLINE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "libpng error: %s, offset=%d",
|
||||||
|
error_message, offset);
|
||||||
|
fprintf(stderr, PNG_STRING_NEWLINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
fprintf(stderr, "libpng error: %s", error_message);
|
||||||
|
fprintf(stderr, PNG_STRING_NEWLINE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PNG_SETJMP_SUPPORTED
|
||||||
|
if (png_ptr)
|
||||||
|
{
|
||||||
|
# ifdef USE_FAR_KEYWORD
|
||||||
|
{
|
||||||
|
jmp_buf jmpbuf;
|
||||||
|
png_memcpy(jmpbuf, png_ptr->jmpbuf, png_sizeof(jmp_buf));
|
||||||
|
longjmp(jmpbuf, 1);
|
||||||
|
}
|
||||||
|
# else
|
||||||
|
longjmp(png_ptr->jmpbuf, 1);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
PNG_ABORT();
|
||||||
|
#endif
|
||||||
|
#ifdef PNG_NO_CONSOLE_IO
|
||||||
|
error_message = error_message; /* Make compiler happy */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef PNG_NO_WARNINGS
|
||||||
|
/* This function is called when there is a warning, but the library thinks
|
||||||
|
* it can continue anyway. Replacement functions don't have to do anything
|
||||||
|
* here if you don't want them to. In the default configuration, png_ptr is
|
||||||
|
* not used, but it is passed in case it may be useful.
|
||||||
|
*/
|
||||||
|
static void /* PRIVATE */
|
||||||
|
png_default_warning(png_structp png_ptr, png_const_charp warning_message)
|
||||||
|
{
|
||||||
|
#ifndef PNG_NO_CONSOLE_IO
|
||||||
|
# ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||||
|
if (*warning_message == '#')
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
char warning_number[16];
|
||||||
|
for (offset = 0; offset < 15; offset++)
|
||||||
|
{
|
||||||
|
warning_number[offset] = warning_message[offset + 1];
|
||||||
|
if (warning_message[offset] == ' ')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ((offset > 1) && (offset < 15))
|
||||||
|
{
|
||||||
|
warning_number[offset + 1] = '\0';
|
||||||
|
fprintf(stderr, "libpng warning no. %s: %s",
|
||||||
|
warning_number, warning_message + offset);
|
||||||
|
fprintf(stderr, PNG_STRING_NEWLINE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "libpng warning: %s",
|
||||||
|
warning_message);
|
||||||
|
fprintf(stderr, PNG_STRING_NEWLINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
fprintf(stderr, "libpng warning: %s", warning_message);
|
||||||
|
fprintf(stderr, PNG_STRING_NEWLINE);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
warning_message = warning_message; /* Make compiler happy */
|
||||||
|
#endif
|
||||||
|
png_ptr = png_ptr; /* Make compiler happy */
|
||||||
|
}
|
||||||
|
#endif /* PNG_NO_WARNINGS */
|
||||||
|
|
||||||
|
/* This function is called when the application wants to use another method
|
||||||
|
* of handling errors and warnings. Note that the error function MUST NOT
|
||||||
|
* return to the calling routine or serious problems will occur. The return
|
||||||
|
* method used in the default routine calls longjmp(png_ptr->jmpbuf, 1)
|
||||||
|
*/
|
||||||
|
void PNGAPI
|
||||||
|
png_set_error_fn(png_structp png_ptr, png_voidp error_ptr,
|
||||||
|
png_error_ptr error_fn, png_error_ptr warning_fn)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
png_ptr->error_ptr = error_ptr;
|
||||||
|
png_ptr->error_fn = error_fn;
|
||||||
|
png_ptr->warning_fn = warning_fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* This function returns a pointer to the error_ptr associated with the user
|
||||||
|
* functions. The application should free any memory associated with this
|
||||||
|
* pointer before png_write_destroy and png_read_destroy are called.
|
||||||
|
*/
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_get_error_ptr(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return NULL;
|
||||||
|
return ((png_voidp)png_ptr->error_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||||
|
void PNGAPI
|
||||||
|
png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL)
|
||||||
|
{
|
||||||
|
png_ptr->flags &=
|
||||||
|
((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
|
103
GRRLIB/lib/png/pnggccrd.c
Normal file
103
GRRLIB/lib/png/pnggccrd.c
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
/* pnggccrd.c was removed from libpng-1.2.20. */
|
||||||
|
|
||||||
|
/* This code snippet is for use by configure's compilation test. */
|
||||||
|
|
||||||
|
#if (!defined _MSC_VER) && \
|
||||||
|
defined(PNG_ASSEMBLER_CODE_SUPPORTED) && \
|
||||||
|
defined(PNG_MMX_CODE_SUPPORTED)
|
||||||
|
|
||||||
|
int PNGAPI png_dummy_mmx_support(void);
|
||||||
|
|
||||||
|
static int _mmx_supported = 2; // 0: no MMX; 1: MMX supported; 2: not tested
|
||||||
|
|
||||||
|
int PNGAPI
|
||||||
|
png_dummy_mmx_support(void) __attribute__((noinline));
|
||||||
|
|
||||||
|
int PNGAPI
|
||||||
|
png_dummy_mmx_support(void)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
#if defined(PNG_MMX_CODE_SUPPORTED) // superfluous, but what the heck
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
#if defined(__x86_64__)
|
||||||
|
"pushq %%rbx \n\t" // rbx gets clobbered by CPUID instruction
|
||||||
|
"pushq %%rcx \n\t" // so does rcx...
|
||||||
|
"pushq %%rdx \n\t" // ...and rdx (but rcx & rdx safe on Linux)
|
||||||
|
"pushfq \n\t" // save Eflag to stack
|
||||||
|
"popq %%rax \n\t" // get Eflag from stack into rax
|
||||||
|
"movq %%rax, %%rcx \n\t" // make another copy of Eflag in rcx
|
||||||
|
"xorl $0x200000, %%eax \n\t" // toggle ID bit in Eflag (i.e., bit 21)
|
||||||
|
"pushq %%rax \n\t" // save modified Eflag back to stack
|
||||||
|
"popfq \n\t" // restore modified value to Eflag reg
|
||||||
|
"pushfq \n\t" // save Eflag to stack
|
||||||
|
"popq %%rax \n\t" // get Eflag from stack
|
||||||
|
"pushq %%rcx \n\t" // save original Eflag to stack
|
||||||
|
"popfq \n\t" // restore original Eflag
|
||||||
|
#else
|
||||||
|
"pushl %%ebx \n\t" // ebx gets clobbered by CPUID instruction
|
||||||
|
"pushl %%ecx \n\t" // so does ecx...
|
||||||
|
"pushl %%edx \n\t" // ...and edx (but ecx & edx safe on Linux)
|
||||||
|
"pushfl \n\t" // save Eflag to stack
|
||||||
|
"popl %%eax \n\t" // get Eflag from stack into eax
|
||||||
|
"movl %%eax, %%ecx \n\t" // make another copy of Eflag in ecx
|
||||||
|
"xorl $0x200000, %%eax \n\t" // toggle ID bit in Eflag (i.e., bit 21)
|
||||||
|
"pushl %%eax \n\t" // save modified Eflag back to stack
|
||||||
|
"popfl \n\t" // restore modified value to Eflag reg
|
||||||
|
"pushfl \n\t" // save Eflag to stack
|
||||||
|
"popl %%eax \n\t" // get Eflag from stack
|
||||||
|
"pushl %%ecx \n\t" // save original Eflag to stack
|
||||||
|
"popfl \n\t" // restore original Eflag
|
||||||
|
#endif
|
||||||
|
"xorl %%ecx, %%eax \n\t" // compare new Eflag with original Eflag
|
||||||
|
"jz 0f \n\t" // if same, CPUID instr. is not supported
|
||||||
|
|
||||||
|
"xorl %%eax, %%eax \n\t" // set eax to zero
|
||||||
|
// ".byte 0x0f, 0xa2 \n\t" // CPUID instruction (two-byte opcode)
|
||||||
|
"cpuid \n\t" // get the CPU identification info
|
||||||
|
"cmpl $1, %%eax \n\t" // make sure eax return non-zero value
|
||||||
|
"jl 0f \n\t" // if eax is zero, MMX is not supported
|
||||||
|
|
||||||
|
"xorl %%eax, %%eax \n\t" // set eax to zero and...
|
||||||
|
"incl %%eax \n\t" // ...increment eax to 1. This pair is
|
||||||
|
// faster than the instruction "mov eax, 1"
|
||||||
|
"cpuid \n\t" // get the CPU identification info again
|
||||||
|
"andl $0x800000, %%edx \n\t" // mask out all bits but MMX bit (23)
|
||||||
|
"cmpl $0, %%edx \n\t" // 0 = MMX not supported
|
||||||
|
"jz 0f \n\t" // non-zero = yes, MMX IS supported
|
||||||
|
|
||||||
|
"movl $1, %%eax \n\t" // set return value to 1
|
||||||
|
"jmp 1f \n\t" // DONE: have MMX support
|
||||||
|
|
||||||
|
"0: \n\t" // .NOT_SUPPORTED: target label for jump instructions
|
||||||
|
"movl $0, %%eax \n\t" // set return value to 0
|
||||||
|
"1: \n\t" // .RETURN: target label for jump instructions
|
||||||
|
#if defined(__x86_64__)
|
||||||
|
"popq %%rdx \n\t" // restore rdx
|
||||||
|
"popq %%rcx \n\t" // restore rcx
|
||||||
|
"popq %%rbx \n\t" // restore rbx
|
||||||
|
#else
|
||||||
|
"popl %%edx \n\t" // restore edx
|
||||||
|
"popl %%ecx \n\t" // restore ecx
|
||||||
|
"popl %%ebx \n\t" // restore ebx
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// "ret \n\t" // DONE: no MMX support
|
||||||
|
// (fall through to standard C "ret")
|
||||||
|
|
||||||
|
: "=a" (result) // output list
|
||||||
|
|
||||||
|
: // any variables used on input (none)
|
||||||
|
|
||||||
|
// no clobber list
|
||||||
|
// , "%ebx", "%ecx", "%edx" // GRR: we handle these manually
|
||||||
|
// , "memory" // if write to a variable gcc thought was in a reg
|
||||||
|
// , "cc" // "condition codes" (flag bits)
|
||||||
|
);
|
||||||
|
_mmx_supported = result;
|
||||||
|
#else
|
||||||
|
_mmx_supported = 0;
|
||||||
|
#endif /* PNG_MMX_CODE_SUPPORTED */
|
||||||
|
|
||||||
|
return _mmx_supported;
|
||||||
|
}
|
||||||
|
#endif
|
943
GRRLIB/lib/png/pngget.c
Normal file
943
GRRLIB/lib/png/pngget.c
Normal file
|
@ -0,0 +1,943 @@
|
||||||
|
|
||||||
|
/* pngget.c - retrieval of values from info struct
|
||||||
|
*
|
||||||
|
* Last changed in libpng 1.2.37 [June 4, 2009]
|
||||||
|
* Copyright (c) 1998-2009 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.)
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PNG_INTERNAL
|
||||||
|
#include "png.h"
|
||||||
|
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||||
|
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return(info_ptr->valid & flag);
|
||||||
|
|
||||||
|
else
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_rowbytes(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return(info_ptr->rowbytes);
|
||||||
|
|
||||||
|
else
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_INFO_IMAGE_SUPPORTED)
|
||||||
|
png_bytepp PNGAPI
|
||||||
|
png_get_rows(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return(info_ptr->row_pointers);
|
||||||
|
|
||||||
|
else
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PNG_EASY_ACCESS_SUPPORTED
|
||||||
|
/* Easy access to info, added in libpng-0.99 */
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_image_width(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return info_ptr->width;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_image_height(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return info_ptr->height;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_byte PNGAPI
|
||||||
|
png_get_bit_depth(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return info_ptr->bit_depth;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_byte PNGAPI
|
||||||
|
png_get_color_type(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return info_ptr->color_type;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_byte PNGAPI
|
||||||
|
png_get_filter_type(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return info_ptr->filter_type;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_byte PNGAPI
|
||||||
|
png_get_interlace_type(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return info_ptr->interlace_type;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_byte PNGAPI
|
||||||
|
png_get_compression_type(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return info_ptr->compression_type;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
#if defined(PNG_pHYs_SUPPORTED)
|
||||||
|
if (info_ptr->valid & PNG_INFO_pHYs)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "png_get_x_pixels_per_meter");
|
||||||
|
|
||||||
|
if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
else
|
||||||
|
return (info_ptr->x_pixels_per_unit);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return (0);
|
||||||
|
#endif
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
#if defined(PNG_pHYs_SUPPORTED)
|
||||||
|
if (info_ptr->valid & PNG_INFO_pHYs)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "png_get_y_pixels_per_meter");
|
||||||
|
|
||||||
|
if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
else
|
||||||
|
return (info_ptr->y_pixels_per_unit);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return (0);
|
||||||
|
#endif
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
#if defined(PNG_pHYs_SUPPORTED)
|
||||||
|
if (info_ptr->valid & PNG_INFO_pHYs)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter");
|
||||||
|
|
||||||
|
if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER ||
|
||||||
|
info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
else
|
||||||
|
return (info_ptr->x_pixels_per_unit);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return (0);
|
||||||
|
#endif
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||||
|
float PNGAPI
|
||||||
|
png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
#if defined(PNG_pHYs_SUPPORTED)
|
||||||
|
|
||||||
|
if (info_ptr->valid & PNG_INFO_pHYs)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio");
|
||||||
|
if (info_ptr->x_pixels_per_unit == 0)
|
||||||
|
return ((float)0.0);
|
||||||
|
else
|
||||||
|
return ((float)((float)info_ptr->y_pixels_per_unit
|
||||||
|
/(float)info_ptr->x_pixels_per_unit));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return (0.0);
|
||||||
|
#endif
|
||||||
|
return ((float)0.0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
png_int_32 PNGAPI
|
||||||
|
png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
#if defined(PNG_oFFs_SUPPORTED)
|
||||||
|
|
||||||
|
if (info_ptr->valid & PNG_INFO_oFFs)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
|
||||||
|
|
||||||
|
if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
else
|
||||||
|
return (info_ptr->x_offset);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return (0);
|
||||||
|
#endif
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_int_32 PNGAPI
|
||||||
|
png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
|
||||||
|
#if defined(PNG_oFFs_SUPPORTED)
|
||||||
|
if (info_ptr->valid & PNG_INFO_oFFs)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
|
||||||
|
|
||||||
|
if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
else
|
||||||
|
return (info_ptr->y_offset);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return (0);
|
||||||
|
#endif
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_int_32 PNGAPI
|
||||||
|
png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
|
||||||
|
#if defined(PNG_oFFs_SUPPORTED)
|
||||||
|
if (info_ptr->valid & PNG_INFO_oFFs)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
|
||||||
|
|
||||||
|
if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
else
|
||||||
|
return (info_ptr->x_offset);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return (0);
|
||||||
|
#endif
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_int_32 PNGAPI
|
||||||
|
png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
|
||||||
|
#if defined(PNG_oFFs_SUPPORTED)
|
||||||
|
if (info_ptr->valid & PNG_INFO_oFFs)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
|
||||||
|
|
||||||
|
if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
else
|
||||||
|
return (info_ptr->y_offset);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return (0);
|
||||||
|
#endif
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr)
|
||||||
|
*.0254 +.5));
|
||||||
|
}
|
||||||
|
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr)
|
||||||
|
*.0254 +.5));
|
||||||
|
}
|
||||||
|
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr)
|
||||||
|
*.0254 +.5));
|
||||||
|
}
|
||||||
|
|
||||||
|
float PNGAPI
|
||||||
|
png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
return ((float)png_get_x_offset_microns(png_ptr, info_ptr)
|
||||||
|
*.00003937);
|
||||||
|
}
|
||||||
|
|
||||||
|
float PNGAPI
|
||||||
|
png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
return ((float)png_get_y_offset_microns(png_ptr, info_ptr)
|
||||||
|
*.00003937);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_pHYs_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
|
||||||
|
{
|
||||||
|
png_uint_32 retval = 0;
|
||||||
|
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "pHYs");
|
||||||
|
if (res_x != NULL)
|
||||||
|
{
|
||||||
|
*res_x = info_ptr->x_pixels_per_unit;
|
||||||
|
retval |= PNG_INFO_pHYs;
|
||||||
|
}
|
||||||
|
if (res_y != NULL)
|
||||||
|
{
|
||||||
|
*res_y = info_ptr->y_pixels_per_unit;
|
||||||
|
retval |= PNG_INFO_pHYs;
|
||||||
|
}
|
||||||
|
if (unit_type != NULL)
|
||||||
|
{
|
||||||
|
*unit_type = (int)info_ptr->phys_unit_type;
|
||||||
|
retval |= PNG_INFO_pHYs;
|
||||||
|
if (*unit_type == 1)
|
||||||
|
{
|
||||||
|
if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50);
|
||||||
|
if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (retval);
|
||||||
|
}
|
||||||
|
#endif /* PNG_pHYs_SUPPORTED */
|
||||||
|
#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */
|
||||||
|
|
||||||
|
/* png_get_channels really belongs in here, too, but it's been around longer */
|
||||||
|
|
||||||
|
#endif /* PNG_EASY_ACCESS_SUPPORTED */
|
||||||
|
|
||||||
|
png_byte PNGAPI
|
||||||
|
png_get_channels(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return(info_ptr->channels);
|
||||||
|
else
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_bytep PNGAPI
|
||||||
|
png_get_signature(png_structp png_ptr, png_infop info_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL)
|
||||||
|
return(info_ptr->signature);
|
||||||
|
else
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_bKGD_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_bKGD(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_color_16p *background)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)
|
||||||
|
&& background != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "bKGD");
|
||||||
|
*background = &(info_ptr->background);
|
||||||
|
return (PNG_INFO_bKGD);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_cHRM_SUPPORTED)
|
||||||
|
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_cHRM(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
double *white_x, double *white_y, double *red_x, double *red_y,
|
||||||
|
double *green_x, double *green_y, double *blue_x, double *blue_y)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "cHRM");
|
||||||
|
if (white_x != NULL)
|
||||||
|
*white_x = (double)info_ptr->x_white;
|
||||||
|
if (white_y != NULL)
|
||||||
|
*white_y = (double)info_ptr->y_white;
|
||||||
|
if (red_x != NULL)
|
||||||
|
*red_x = (double)info_ptr->x_red;
|
||||||
|
if (red_y != NULL)
|
||||||
|
*red_y = (double)info_ptr->y_red;
|
||||||
|
if (green_x != NULL)
|
||||||
|
*green_x = (double)info_ptr->x_green;
|
||||||
|
if (green_y != NULL)
|
||||||
|
*green_y = (double)info_ptr->y_green;
|
||||||
|
if (blue_x != NULL)
|
||||||
|
*blue_x = (double)info_ptr->x_blue;
|
||||||
|
if (blue_y != NULL)
|
||||||
|
*blue_y = (double)info_ptr->y_blue;
|
||||||
|
return (PNG_INFO_cHRM);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef PNG_FIXED_POINT_SUPPORTED
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x,
|
||||||
|
png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y,
|
||||||
|
png_fixed_point *blue_x, png_fixed_point *blue_y)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "cHRM");
|
||||||
|
if (white_x != NULL)
|
||||||
|
*white_x = info_ptr->int_x_white;
|
||||||
|
if (white_y != NULL)
|
||||||
|
*white_y = info_ptr->int_y_white;
|
||||||
|
if (red_x != NULL)
|
||||||
|
*red_x = info_ptr->int_x_red;
|
||||||
|
if (red_y != NULL)
|
||||||
|
*red_y = info_ptr->int_y_red;
|
||||||
|
if (green_x != NULL)
|
||||||
|
*green_x = info_ptr->int_x_green;
|
||||||
|
if (green_y != NULL)
|
||||||
|
*green_y = info_ptr->int_y_green;
|
||||||
|
if (blue_x != NULL)
|
||||||
|
*blue_x = info_ptr->int_x_blue;
|
||||||
|
if (blue_y != NULL)
|
||||||
|
*blue_y = info_ptr->int_y_blue;
|
||||||
|
return (PNG_INFO_cHRM);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_gAMA_SUPPORTED)
|
||||||
|
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
|
||||||
|
&& file_gamma != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "gAMA");
|
||||||
|
*file_gamma = (double)info_ptr->gamma;
|
||||||
|
return (PNG_INFO_gAMA);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef PNG_FIXED_POINT_SUPPORTED
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_fixed_point *int_file_gamma)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
|
||||||
|
&& int_file_gamma != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "gAMA");
|
||||||
|
*int_file_gamma = info_ptr->int_gamma;
|
||||||
|
return (PNG_INFO_gAMA);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_sRGB_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)
|
||||||
|
&& file_srgb_intent != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "sRGB");
|
||||||
|
*file_srgb_intent = (int)info_ptr->srgb_intent;
|
||||||
|
return (PNG_INFO_sRGB);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_iCCP_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_iCCP(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_charpp name, int *compression_type,
|
||||||
|
png_charpp profile, png_uint_32 *proflen)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)
|
||||||
|
&& name != NULL && profile != NULL && proflen != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "iCCP");
|
||||||
|
*name = info_ptr->iccp_name;
|
||||||
|
*profile = info_ptr->iccp_profile;
|
||||||
|
/* Compression_type is a dummy so the API won't have to change
|
||||||
|
* if we introduce multiple compression types later.
|
||||||
|
*/
|
||||||
|
*proflen = (int)info_ptr->iccp_proflen;
|
||||||
|
*compression_type = (int)info_ptr->iccp_compression;
|
||||||
|
return (PNG_INFO_iCCP);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_sPLT_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_sPLT(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_sPLT_tpp spalettes)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)
|
||||||
|
{
|
||||||
|
*spalettes = info_ptr->splt_palettes;
|
||||||
|
return ((png_uint_32)info_ptr->splt_palettes_num);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_hIST_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)
|
||||||
|
&& hist != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "hIST");
|
||||||
|
*hist = info_ptr->hist;
|
||||||
|
return (PNG_INFO_hIST);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_IHDR(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_uint_32 *width, png_uint_32 *height, int *bit_depth,
|
||||||
|
int *color_type, int *interlace_type, int *compression_type,
|
||||||
|
int *filter_type)
|
||||||
|
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL &&
|
||||||
|
bit_depth != NULL && color_type != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "IHDR");
|
||||||
|
*width = info_ptr->width;
|
||||||
|
*height = info_ptr->height;
|
||||||
|
*bit_depth = info_ptr->bit_depth;
|
||||||
|
if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16)
|
||||||
|
png_error(png_ptr, "Invalid bit depth");
|
||||||
|
|
||||||
|
*color_type = info_ptr->color_type;
|
||||||
|
|
||||||
|
if (info_ptr->color_type > 6)
|
||||||
|
png_error(png_ptr, "Invalid color type");
|
||||||
|
|
||||||
|
if (compression_type != NULL)
|
||||||
|
*compression_type = info_ptr->compression_type;
|
||||||
|
|
||||||
|
if (filter_type != NULL)
|
||||||
|
*filter_type = info_ptr->filter_type;
|
||||||
|
|
||||||
|
if (interlace_type != NULL)
|
||||||
|
*interlace_type = info_ptr->interlace_type;
|
||||||
|
|
||||||
|
/* Check for potential overflow of rowbytes */
|
||||||
|
if (*width == 0 || *width > PNG_UINT_31_MAX)
|
||||||
|
png_error(png_ptr, "Invalid image width");
|
||||||
|
|
||||||
|
if (*height == 0 || *height > PNG_UINT_31_MAX)
|
||||||
|
png_error(png_ptr, "Invalid image height");
|
||||||
|
|
||||||
|
if (info_ptr->width > (PNG_UINT_32_MAX
|
||||||
|
>> 3) /* 8-byte RGBA pixels */
|
||||||
|
- 64 /* bigrowbuf hack */
|
||||||
|
- 1 /* filter byte */
|
||||||
|
- 7*8 /* rounding of width to multiple of 8 pixels */
|
||||||
|
- 8) /* extra max_pixel_depth pad */
|
||||||
|
{
|
||||||
|
png_warning(png_ptr,
|
||||||
|
"Width too large for libpng to process image data.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_oFFs_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_oFFs(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)
|
||||||
|
&& offset_x != NULL && offset_y != NULL && unit_type != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "oFFs");
|
||||||
|
*offset_x = info_ptr->x_offset;
|
||||||
|
*offset_y = info_ptr->y_offset;
|
||||||
|
*unit_type = (int)info_ptr->offset_unit_type;
|
||||||
|
return (PNG_INFO_oFFs);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_pCAL_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_pCAL(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams,
|
||||||
|
png_charp *units, png_charpp *params)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)
|
||||||
|
&& purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
|
||||||
|
nparams != NULL && units != NULL && params != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "pCAL");
|
||||||
|
*purpose = info_ptr->pcal_purpose;
|
||||||
|
*X0 = info_ptr->pcal_X0;
|
||||||
|
*X1 = info_ptr->pcal_X1;
|
||||||
|
*type = (int)info_ptr->pcal_type;
|
||||||
|
*nparams = (int)info_ptr->pcal_nparams;
|
||||||
|
*units = info_ptr->pcal_units;
|
||||||
|
*params = info_ptr->pcal_params;
|
||||||
|
return (PNG_INFO_pCAL);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_sCAL_SUPPORTED)
|
||||||
|
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_sCAL(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
int *unit, double *width, double *height)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL &&
|
||||||
|
(info_ptr->valid & PNG_INFO_sCAL))
|
||||||
|
{
|
||||||
|
*unit = info_ptr->scal_unit;
|
||||||
|
*width = info_ptr->scal_pixel_width;
|
||||||
|
*height = info_ptr->scal_pixel_height;
|
||||||
|
return (PNG_INFO_sCAL);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#ifdef PNG_FIXED_POINT_SUPPORTED
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
int *unit, png_charpp width, png_charpp height)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL &&
|
||||||
|
(info_ptr->valid & PNG_INFO_sCAL))
|
||||||
|
{
|
||||||
|
*unit = info_ptr->scal_unit;
|
||||||
|
*width = info_ptr->scal_s_width;
|
||||||
|
*height = info_ptr->scal_s_height;
|
||||||
|
return (PNG_INFO_sCAL);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_pHYs_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_pHYs(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
|
||||||
|
{
|
||||||
|
png_uint_32 retval = 0;
|
||||||
|
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL &&
|
||||||
|
(info_ptr->valid & PNG_INFO_pHYs))
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "pHYs");
|
||||||
|
|
||||||
|
if (res_x != NULL)
|
||||||
|
{
|
||||||
|
*res_x = info_ptr->x_pixels_per_unit;
|
||||||
|
retval |= PNG_INFO_pHYs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res_y != NULL)
|
||||||
|
{
|
||||||
|
*res_y = info_ptr->y_pixels_per_unit;
|
||||||
|
retval |= PNG_INFO_pHYs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unit_type != NULL)
|
||||||
|
{
|
||||||
|
*unit_type = (int)info_ptr->phys_unit_type;
|
||||||
|
retval |= PNG_INFO_pHYs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (retval);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette,
|
||||||
|
int *num_palette)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE)
|
||||||
|
&& palette != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "PLTE");
|
||||||
|
*palette = info_ptr->palette;
|
||||||
|
*num_palette = info_ptr->num_palette;
|
||||||
|
png_debug1(3, "num_palette = %d", *num_palette);
|
||||||
|
return (PNG_INFO_PLTE);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_sBIT_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)
|
||||||
|
&& sig_bit != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "sBIT");
|
||||||
|
*sig_bit = &(info_ptr->sig_bit);
|
||||||
|
return (PNG_INFO_sBIT);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_TEXT_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,
|
||||||
|
int *num_text)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function",
|
||||||
|
(png_ptr->chunk_name[0] == '\0' ? "text"
|
||||||
|
: (png_const_charp)png_ptr->chunk_name));
|
||||||
|
|
||||||
|
if (text_ptr != NULL)
|
||||||
|
*text_ptr = info_ptr->text;
|
||||||
|
|
||||||
|
if (num_text != NULL)
|
||||||
|
*num_text = info_ptr->num_text;
|
||||||
|
|
||||||
|
return ((png_uint_32)info_ptr->num_text);
|
||||||
|
}
|
||||||
|
if (num_text != NULL)
|
||||||
|
*num_text = 0;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_tIME_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)
|
||||||
|
&& mod_time != NULL)
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "tIME");
|
||||||
|
*mod_time = &(info_ptr->mod_time);
|
||||||
|
return (PNG_INFO_tIME);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_tRNS_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_tRNS(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_bytep *trans, int *num_trans, png_color_16p *trans_values)
|
||||||
|
{
|
||||||
|
png_uint_32 retval = 0;
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
|
||||||
|
{
|
||||||
|
png_debug1(1, "in %s retrieval function", "tRNS");
|
||||||
|
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
|
||||||
|
{
|
||||||
|
if (trans != NULL)
|
||||||
|
{
|
||||||
|
*trans = info_ptr->trans;
|
||||||
|
retval |= PNG_INFO_tRNS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trans_values != NULL)
|
||||||
|
*trans_values = &(info_ptr->trans_values);
|
||||||
|
}
|
||||||
|
else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */
|
||||||
|
{
|
||||||
|
if (trans_values != NULL)
|
||||||
|
{
|
||||||
|
*trans_values = &(info_ptr->trans_values);
|
||||||
|
retval |= PNG_INFO_tRNS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trans != NULL)
|
||||||
|
*trans = NULL;
|
||||||
|
}
|
||||||
|
if (num_trans != NULL)
|
||||||
|
{
|
||||||
|
*num_trans = info_ptr->num_trans;
|
||||||
|
retval |= PNG_INFO_tRNS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (retval);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr,
|
||||||
|
png_unknown_chunkpp unknowns)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL)
|
||||||
|
{
|
||||||
|
*unknowns = info_ptr->unknown_chunks;
|
||||||
|
return ((png_uint_32)info_ptr->unknown_chunks_num);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
|
||||||
|
png_byte PNGAPI
|
||||||
|
png_get_rgb_to_gray_status (png_structp png_ptr)
|
||||||
|
{
|
||||||
|
return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_USER_CHUNKS_SUPPORTED)
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_get_user_chunk_ptr(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
return (png_ptr? png_ptr->user_chunk_ptr : NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PNG_WRITE_SUPPORTED
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_compression_buffer_size(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
return (png_uint_32)(png_ptr? png_ptr->zbuf_size : 0L);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
|
||||||
|
#ifndef PNG_1_0_X
|
||||||
|
/* This function was added to libpng 1.2.0 and should exist by default */
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_asm_flags (png_structp png_ptr)
|
||||||
|
{
|
||||||
|
/* Obsolete, to be removed from libpng-1.4.0 */
|
||||||
|
return (png_ptr? 0L: 0L);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function was added to libpng 1.2.0 and should exist by default */
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_asm_flagmask (int flag_select)
|
||||||
|
{
|
||||||
|
/* Obsolete, to be removed from libpng-1.4.0 */
|
||||||
|
flag_select=flag_select;
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */
|
||||||
|
/* This function was added to libpng 1.2.0 */
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_mmx_flagmask (int flag_select, int *compilerID)
|
||||||
|
{
|
||||||
|
/* Obsolete, to be removed from libpng-1.4.0 */
|
||||||
|
flag_select=flag_select;
|
||||||
|
*compilerID = -1; /* unknown (i.e., no asm/MMX code compiled) */
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function was added to libpng 1.2.0 */
|
||||||
|
png_byte PNGAPI
|
||||||
|
png_get_mmx_bitdepth_threshold (png_structp png_ptr)
|
||||||
|
{
|
||||||
|
/* Obsolete, to be removed from libpng-1.4.0 */
|
||||||
|
return (png_ptr? 0: 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function was added to libpng 1.2.0 */
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_mmx_rowbytes_threshold (png_structp png_ptr)
|
||||||
|
{
|
||||||
|
/* Obsolete, to be removed from libpng-1.4.0 */
|
||||||
|
return (png_ptr? 0L: 0L);
|
||||||
|
}
|
||||||
|
#endif /* ?PNG_1_0_X */
|
||||||
|
#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */
|
||||||
|
|
||||||
|
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
||||||
|
/* These functions were added to libpng 1.2.6 */
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_user_width_max (png_structp png_ptr)
|
||||||
|
{
|
||||||
|
return (png_ptr? png_ptr->user_width_max : 0);
|
||||||
|
}
|
||||||
|
png_uint_32 PNGAPI
|
||||||
|
png_get_user_height_max (png_structp png_ptr)
|
||||||
|
{
|
||||||
|
return (png_ptr? png_ptr->user_height_max : 0);
|
||||||
|
}
|
||||||
|
#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
|
620
GRRLIB/lib/png/pngmem.c
Normal file
620
GRRLIB/lib/png/pngmem.c
Normal file
|
@ -0,0 +1,620 @@
|
||||||
|
|
||||||
|
/* pngmem.c - stub functions for memory allocation
|
||||||
|
*
|
||||||
|
* Last changed in libpng 1.2.37 [June 4, 2009]
|
||||||
|
* Copyright (c) 1998-2009 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.)
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*
|
||||||
|
* This file provides a location for all memory allocation. Users who
|
||||||
|
* need special memory handling are expected to supply replacement
|
||||||
|
* functions for png_malloc() and png_free(), and to use
|
||||||
|
* png_create_read_struct_2() and png_create_write_struct_2() to
|
||||||
|
* identify the replacement functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PNG_INTERNAL
|
||||||
|
#include "png.h"
|
||||||
|
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||||
|
|
||||||
|
/* Borland DOS special memory handler */
|
||||||
|
#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
|
||||||
|
/* If you change this, be sure to change the one in png.h also */
|
||||||
|
|
||||||
|
/* Allocate memory for a png_struct. The malloc and memset can be replaced
|
||||||
|
by a single call to calloc() if this is thought to improve performance. */
|
||||||
|
png_voidp /* PRIVATE */
|
||||||
|
png_create_struct(int type)
|
||||||
|
{
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_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_voidp mem_ptr)
|
||||||
|
{
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
png_size_t size;
|
||||||
|
png_voidp struct_ptr;
|
||||||
|
|
||||||
|
if (type == PNG_STRUCT_INFO)
|
||||||
|
size = png_sizeof(png_info);
|
||||||
|
else if (type == PNG_STRUCT_PNG)
|
||||||
|
size = png_sizeof(png_struct);
|
||||||
|
else
|
||||||
|
return (png_get_copyright(NULL));
|
||||||
|
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
if (malloc_fn != NULL)
|
||||||
|
{
|
||||||
|
png_struct dummy_struct;
|
||||||
|
png_structp png_ptr = &dummy_struct;
|
||||||
|
png_ptr->mem_ptr=mem_ptr;
|
||||||
|
struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
struct_ptr = (png_voidp)farmalloc(size);
|
||||||
|
if (struct_ptr != NULL)
|
||||||
|
png_memset(struct_ptr, 0, size);
|
||||||
|
return (struct_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free memory allocated by a png_create_struct() call */
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_destroy_struct(png_voidp struct_ptr)
|
||||||
|
{
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
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_voidp mem_ptr)
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
if (struct_ptr != NULL)
|
||||||
|
{
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
if (free_fn != NULL)
|
||||||
|
{
|
||||||
|
png_struct dummy_struct;
|
||||||
|
png_structp png_ptr = &dummy_struct;
|
||||||
|
png_ptr->mem_ptr=mem_ptr;
|
||||||
|
(*(free_fn))(png_ptr, struct_ptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
farfree (struct_ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate memory. For reasonable files, size should never exceed
|
||||||
|
* 64K. However, zlib may allocate more then 64K if you don't tell
|
||||||
|
* it not to. See zconf.h and png.h for more information. zlib does
|
||||||
|
* need to allocate exactly 64K, so whatever you call here must
|
||||||
|
* have the ability to do that.
|
||||||
|
*
|
||||||
|
* Borland seems to have a problem in DOS mode for exactly 64K.
|
||||||
|
* It gives you a segment with an offset of 8 (perhaps to store its
|
||||||
|
* memory stuff). zlib doesn't like this at all, so we have to
|
||||||
|
* detect and deal with it. This code should not be needed in
|
||||||
|
* Windows or OS/2 modes, and only in 16 bit mode. This code has
|
||||||
|
* been updated by Alexander Lehmann for version 0.89 to waste less
|
||||||
|
* memory.
|
||||||
|
*
|
||||||
|
* Note that we can't use png_size_t for the "size" declaration,
|
||||||
|
* since on some systems a png_size_t is a 16-bit quantity, and as a
|
||||||
|
* result, we would be truncating potentially larger memory requests
|
||||||
|
* (which should cause a fatal error) and introducing major problems.
|
||||||
|
*/
|
||||||
|
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_malloc(png_structp png_ptr, png_uint_32 size)
|
||||||
|
{
|
||||||
|
png_voidp ret;
|
||||||
|
|
||||||
|
if (png_ptr == NULL || size == 0)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
if (png_ptr->malloc_fn != NULL)
|
||||||
|
ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
|
||||||
|
else
|
||||||
|
ret = (png_malloc_default(png_ptr, size));
|
||||||
|
if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
|
||||||
|
png_error(png_ptr, "Out of memory!");
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_malloc_default(png_structp png_ptr, png_uint_32 size)
|
||||||
|
{
|
||||||
|
png_voidp ret;
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
|
||||||
|
if (png_ptr == NULL || size == 0)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
#ifdef PNG_MAX_MALLOC_64K
|
||||||
|
if (size > (png_uint_32)65536L)
|
||||||
|
{
|
||||||
|
png_warning(png_ptr, "Cannot Allocate > 64K");
|
||||||
|
ret = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (size != (size_t)size)
|
||||||
|
ret = NULL;
|
||||||
|
else if (size == (png_uint_32)65536L)
|
||||||
|
{
|
||||||
|
if (png_ptr->offset_table == NULL)
|
||||||
|
{
|
||||||
|
/* Try to see if we need to do any of this fancy stuff */
|
||||||
|
ret = farmalloc(size);
|
||||||
|
if (ret == NULL || ((png_size_t)ret & 0xffff))
|
||||||
|
{
|
||||||
|
int num_blocks;
|
||||||
|
png_uint_32 total_size;
|
||||||
|
png_bytep table;
|
||||||
|
int i;
|
||||||
|
png_byte huge * hptr;
|
||||||
|
|
||||||
|
if (ret != NULL)
|
||||||
|
{
|
||||||
|
farfree(ret);
|
||||||
|
ret = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (png_ptr->zlib_window_bits > 14)
|
||||||
|
num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14));
|
||||||
|
else
|
||||||
|
num_blocks = 1;
|
||||||
|
if (png_ptr->zlib_mem_level >= 7)
|
||||||
|
num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7));
|
||||||
|
else
|
||||||
|
num_blocks++;
|
||||||
|
|
||||||
|
total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16;
|
||||||
|
|
||||||
|
table = farmalloc(total_size);
|
||||||
|
|
||||||
|
if (table == NULL)
|
||||||
|
{
|
||||||
|
#ifndef PNG_USER_MEM_SUPPORTED
|
||||||
|
if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
|
||||||
|
png_error(png_ptr, "Out Of Memory."); /* Note "O" and "M" */
|
||||||
|
else
|
||||||
|
png_warning(png_ptr, "Out Of Memory.");
|
||||||
|
#endif
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((png_size_t)table & 0xfff0)
|
||||||
|
{
|
||||||
|
#ifndef PNG_USER_MEM_SUPPORTED
|
||||||
|
if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
|
||||||
|
png_error(png_ptr,
|
||||||
|
"Farmalloc didn't return normalized pointer");
|
||||||
|
else
|
||||||
|
png_warning(png_ptr,
|
||||||
|
"Farmalloc didn't return normalized pointer");
|
||||||
|
#endif
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_ptr->offset_table = table;
|
||||||
|
png_ptr->offset_table_ptr = farmalloc(num_blocks *
|
||||||
|
png_sizeof(png_bytep));
|
||||||
|
|
||||||
|
if (png_ptr->offset_table_ptr == NULL)
|
||||||
|
{
|
||||||
|
#ifndef PNG_USER_MEM_SUPPORTED
|
||||||
|
if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
|
||||||
|
png_error(png_ptr, "Out Of memory."); /* Note "O" and "M" */
|
||||||
|
else
|
||||||
|
png_warning(png_ptr, "Out Of memory.");
|
||||||
|
#endif
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
hptr = (png_byte huge *)table;
|
||||||
|
if ((png_size_t)hptr & 0xf)
|
||||||
|
{
|
||||||
|
hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L);
|
||||||
|
hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */
|
||||||
|
}
|
||||||
|
for (i = 0; i < num_blocks; i++)
|
||||||
|
{
|
||||||
|
png_ptr->offset_table_ptr[i] = (png_bytep)hptr;
|
||||||
|
hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */
|
||||||
|
}
|
||||||
|
|
||||||
|
png_ptr->offset_table_number = num_blocks;
|
||||||
|
png_ptr->offset_table_count = 0;
|
||||||
|
png_ptr->offset_table_count_free = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (png_ptr->offset_table_count >= png_ptr->offset_table_number)
|
||||||
|
{
|
||||||
|
#ifndef PNG_USER_MEM_SUPPORTED
|
||||||
|
if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
|
||||||
|
png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */
|
||||||
|
else
|
||||||
|
png_warning(png_ptr, "Out of Memory.");
|
||||||
|
#endif
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret = farmalloc(size);
|
||||||
|
|
||||||
|
#ifndef PNG_USER_MEM_SUPPORTED
|
||||||
|
if (ret == NULL)
|
||||||
|
{
|
||||||
|
if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
|
||||||
|
png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */
|
||||||
|
else
|
||||||
|
png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free a pointer allocated by png_malloc(). In the default
|
||||||
|
* configuration, png_ptr is not used, but is passed in case it
|
||||||
|
* is needed. If ptr is NULL, return without taking any action.
|
||||||
|
*/
|
||||||
|
void PNGAPI
|
||||||
|
png_free(png_structp png_ptr, png_voidp ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL || ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
if (png_ptr->free_fn != NULL)
|
||||||
|
{
|
||||||
|
(*(png_ptr->free_fn))(png_ptr, ptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
png_free_default(png_ptr, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PNGAPI
|
||||||
|
png_free_default(png_structp png_ptr, png_voidp ptr)
|
||||||
|
{
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
|
||||||
|
if (png_ptr == NULL || ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (png_ptr->offset_table != NULL)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < png_ptr->offset_table_count; i++)
|
||||||
|
{
|
||||||
|
if (ptr == png_ptr->offset_table_ptr[i])
|
||||||
|
{
|
||||||
|
ptr = NULL;
|
||||||
|
png_ptr->offset_table_count_free++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (png_ptr->offset_table_count_free == png_ptr->offset_table_count)
|
||||||
|
{
|
||||||
|
farfree(png_ptr->offset_table);
|
||||||
|
farfree(png_ptr->offset_table_ptr);
|
||||||
|
png_ptr->offset_table = NULL;
|
||||||
|
png_ptr->offset_table_ptr = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ptr != NULL)
|
||||||
|
{
|
||||||
|
farfree(ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* Not the Borland DOS special memory handler */
|
||||||
|
|
||||||
|
/* 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(int type)
|
||||||
|
{
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_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_voidp mem_ptr)
|
||||||
|
{
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
png_size_t size;
|
||||||
|
png_voidp struct_ptr;
|
||||||
|
|
||||||
|
if (type == PNG_STRUCT_INFO)
|
||||||
|
size = png_sizeof(png_info);
|
||||||
|
else if (type == PNG_STRUCT_PNG)
|
||||||
|
size = png_sizeof(png_struct);
|
||||||
|
else
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
if (malloc_fn != NULL)
|
||||||
|
{
|
||||||
|
png_struct dummy_struct;
|
||||||
|
png_structp png_ptr = &dummy_struct;
|
||||||
|
png_ptr->mem_ptr=mem_ptr;
|
||||||
|
struct_ptr = (*(malloc_fn))(png_ptr, size);
|
||||||
|
if (struct_ptr != NULL)
|
||||||
|
png_memset(struct_ptr, 0, size);
|
||||||
|
return (struct_ptr);
|
||||||
|
}
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
|
||||||
|
#if defined(__TURBOC__) && !defined(__FLAT__)
|
||||||
|
struct_ptr = (png_voidp)farmalloc(size);
|
||||||
|
#else
|
||||||
|
# if defined(_MSC_VER) && defined(MAXSEG_64K)
|
||||||
|
struct_ptr = (png_voidp)halloc(size, 1);
|
||||||
|
# else
|
||||||
|
struct_ptr = (png_voidp)malloc(size);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
if (struct_ptr != NULL)
|
||||||
|
png_memset(struct_ptr, 0, size);
|
||||||
|
|
||||||
|
return (struct_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Free memory allocated by a png_create_struct() call */
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_destroy_struct(png_voidp struct_ptr)
|
||||||
|
{
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
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_voidp mem_ptr)
|
||||||
|
{
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
if (struct_ptr != NULL)
|
||||||
|
{
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
if (free_fn != NULL)
|
||||||
|
{
|
||||||
|
png_struct dummy_struct;
|
||||||
|
png_structp png_ptr = &dummy_struct;
|
||||||
|
png_ptr->mem_ptr=mem_ptr;
|
||||||
|
(*(free_fn))(png_ptr, struct_ptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
#if defined(__TURBOC__) && !defined(__FLAT__)
|
||||||
|
farfree(struct_ptr);
|
||||||
|
#else
|
||||||
|
# if defined(_MSC_VER) && defined(MAXSEG_64K)
|
||||||
|
hfree(struct_ptr);
|
||||||
|
# else
|
||||||
|
free(struct_ptr);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate memory. For reasonable files, size should never exceed
|
||||||
|
* 64K. However, zlib may allocate more then 64K if you don't tell
|
||||||
|
* it not to. See zconf.h and png.h for more information. zlib does
|
||||||
|
* need to allocate exactly 64K, so whatever you call here must
|
||||||
|
* have the ability to do that.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_malloc(png_structp png_ptr, png_uint_32 size)
|
||||||
|
{
|
||||||
|
png_voidp ret;
|
||||||
|
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
if (png_ptr == NULL || size == 0)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
if (png_ptr->malloc_fn != NULL)
|
||||||
|
ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
|
||||||
|
else
|
||||||
|
ret = (png_malloc_default(png_ptr, size));
|
||||||
|
if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
|
||||||
|
png_error(png_ptr, "Out of Memory!");
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_malloc_default(png_structp png_ptr, png_uint_32 size)
|
||||||
|
{
|
||||||
|
png_voidp ret;
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
|
||||||
|
if (png_ptr == NULL || size == 0)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
#ifdef PNG_MAX_MALLOC_64K
|
||||||
|
if (size > (png_uint_32)65536L)
|
||||||
|
{
|
||||||
|
#ifndef PNG_USER_MEM_SUPPORTED
|
||||||
|
if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
|
||||||
|
png_error(png_ptr, "Cannot Allocate > 64K");
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Check for overflow */
|
||||||
|
#if defined(__TURBOC__) && !defined(__FLAT__)
|
||||||
|
if (size != (unsigned long)size)
|
||||||
|
ret = NULL;
|
||||||
|
else
|
||||||
|
ret = farmalloc(size);
|
||||||
|
#else
|
||||||
|
# if defined(_MSC_VER) && defined(MAXSEG_64K)
|
||||||
|
if (size != (unsigned long)size)
|
||||||
|
ret = NULL;
|
||||||
|
else
|
||||||
|
ret = halloc(size, 1);
|
||||||
|
# else
|
||||||
|
if (size != (size_t)size)
|
||||||
|
ret = NULL;
|
||||||
|
else
|
||||||
|
ret = malloc((size_t)size);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PNG_USER_MEM_SUPPORTED
|
||||||
|
if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
|
||||||
|
png_error(png_ptr, "Out of Memory");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free a pointer allocated by png_malloc(). If ptr is NULL, return
|
||||||
|
* without taking any action.
|
||||||
|
*/
|
||||||
|
void PNGAPI
|
||||||
|
png_free(png_structp png_ptr, png_voidp ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL || ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
if (png_ptr->free_fn != NULL)
|
||||||
|
{
|
||||||
|
(*(png_ptr->free_fn))(png_ptr, ptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
png_free_default(png_ptr, ptr);
|
||||||
|
}
|
||||||
|
void PNGAPI
|
||||||
|
png_free_default(png_structp png_ptr, png_voidp ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL || ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
|
||||||
|
#if defined(__TURBOC__) && !defined(__FLAT__)
|
||||||
|
farfree(ptr);
|
||||||
|
#else
|
||||||
|
# if defined(_MSC_VER) && defined(MAXSEG_64K)
|
||||||
|
hfree(ptr);
|
||||||
|
# else
|
||||||
|
free(ptr);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* Not Borland DOS special memory handler */
|
||||||
|
|
||||||
|
#if defined(PNG_1_0_X)
|
||||||
|
# define png_malloc_warn png_malloc
|
||||||
|
#else
|
||||||
|
/* This function was added at libpng version 1.2.3. The png_malloc_warn()
|
||||||
|
* function will set up png_malloc() to issue a png_warning and return NULL
|
||||||
|
* instead of issuing a png_error, if it fails to allocate the requested
|
||||||
|
* memory.
|
||||||
|
*/
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_malloc_warn(png_structp png_ptr, png_uint_32 size)
|
||||||
|
{
|
||||||
|
png_voidp ptr;
|
||||||
|
png_uint_32 save_flags;
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
save_flags = png_ptr->flags;
|
||||||
|
png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
|
||||||
|
ptr = (png_voidp)png_malloc((png_structp)png_ptr, size);
|
||||||
|
png_ptr->flags=save_flags;
|
||||||
|
return(ptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2,
|
||||||
|
png_uint_32 length)
|
||||||
|
{
|
||||||
|
png_size_t size;
|
||||||
|
|
||||||
|
size = (png_size_t)length;
|
||||||
|
if ((png_uint_32)size != length)
|
||||||
|
png_error(png_ptr, "Overflow in png_memcpy_check.");
|
||||||
|
|
||||||
|
return(png_memcpy (s1, s2, size));
|
||||||
|
}
|
||||||
|
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_memset_check (png_structp png_ptr, png_voidp s1, int value,
|
||||||
|
png_uint_32 length)
|
||||||
|
{
|
||||||
|
png_size_t size;
|
||||||
|
|
||||||
|
size = (png_size_t)length;
|
||||||
|
if ((png_uint_32)size != length)
|
||||||
|
png_error(png_ptr, "Overflow in png_memset_check.");
|
||||||
|
|
||||||
|
return (png_memset (s1, value, size));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
|
/* This function is called when the application wants to use another method
|
||||||
|
* of allocating and freeing memory.
|
||||||
|
*/
|
||||||
|
void PNGAPI
|
||||||
|
png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr
|
||||||
|
malloc_fn, png_free_ptr free_fn)
|
||||||
|
{
|
||||||
|
if (png_ptr != NULL)
|
||||||
|
{
|
||||||
|
png_ptr->mem_ptr = mem_ptr;
|
||||||
|
png_ptr->malloc_fn = malloc_fn;
|
||||||
|
png_ptr->free_fn = free_fn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function returns a pointer to the mem_ptr associated with the user
|
||||||
|
* functions. The application should free any memory associated with this
|
||||||
|
* pointer before png_write_destroy and png_read_destroy are called.
|
||||||
|
*/
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_get_mem_ptr(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return (NULL);
|
||||||
|
return ((png_voidp)png_ptr->mem_ptr);
|
||||||
|
}
|
||||||
|
#endif /* PNG_USER_MEM_SUPPORTED */
|
||||||
|
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
|
1727
GRRLIB/lib/png/pngpread.c
Normal file
1727
GRRLIB/lib/png/pngpread.c
Normal file
File diff suppressed because it is too large
Load diff
1473
GRRLIB/lib/png/pngread.c
Normal file
1473
GRRLIB/lib/png/pngread.c
Normal file
File diff suppressed because it is too large
Load diff
177
GRRLIB/lib/png/pngrio.c
Normal file
177
GRRLIB/lib/png/pngrio.c
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
|
||||||
|
/* pngrio.c - functions for data input
|
||||||
|
*
|
||||||
|
* Last changed in libpng 1.2.37 [June 4, 2009]
|
||||||
|
* Copyright (c) 1998-2009 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.)
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*
|
||||||
|
* This file provides a location for all input. Users who need
|
||||||
|
* special handling are expected to write a function that has the same
|
||||||
|
* arguments as this and performs a similar function, but that possibly
|
||||||
|
* has a different input method. Note that you shouldn't change this
|
||||||
|
* function, but rather write a replacement function and then make
|
||||||
|
* libpng use it at run time with png_set_read_fn(...).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PNG_INTERNAL
|
||||||
|
#include "png.h"
|
||||||
|
#if defined(PNG_READ_SUPPORTED)
|
||||||
|
|
||||||
|
/* Read the data from whatever input you are using. The default routine
|
||||||
|
* reads from a file pointer. Note that this routine sometimes gets called
|
||||||
|
* with very small lengths, so you should implement some kind of simple
|
||||||
|
* buffering if you are using unbuffered reads. This should never be asked
|
||||||
|
* to read more then 64K on a 16 bit machine.
|
||||||
|
*/
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||||
|
{
|
||||||
|
png_debug1(4, "reading %d bytes", (int)length);
|
||||||
|
if (png_ptr->read_data_fn != NULL)
|
||||||
|
(*(png_ptr->read_data_fn))(png_ptr, data, length);
|
||||||
|
else
|
||||||
|
png_error(png_ptr, "Call to NULL read function");
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined(PNG_NO_STDIO)
|
||||||
|
/* This is the function that does the actual reading of data. If you are
|
||||||
|
* not reading from a standard C stream, you should create a replacement
|
||||||
|
* read_data function and use it at run time with png_set_read_fn(), rather
|
||||||
|
* than changing the library.
|
||||||
|
*/
|
||||||
|
#ifndef USE_FAR_KEYWORD
|
||||||
|
void PNGAPI
|
||||||
|
png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||||
|
{
|
||||||
|
png_size_t check;
|
||||||
|
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
/* fread() returns 0 on error, so it is OK to store this in a png_size_t
|
||||||
|
* instead of an int, which is what fread() actually returns.
|
||||||
|
*/
|
||||||
|
#if defined(_WIN32_WCE)
|
||||||
|
if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
|
||||||
|
check = 0;
|
||||||
|
#else
|
||||||
|
check = (png_size_t)fread(data, (png_size_t)1, length,
|
||||||
|
(png_FILE_p)png_ptr->io_ptr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (check != length)
|
||||||
|
png_error(png_ptr, "Read Error");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* This is the model-independent version. Since the standard I/O library
|
||||||
|
can't handle far buffers in the medium and small models, we have to copy
|
||||||
|
the data.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define NEAR_BUF_SIZE 1024
|
||||||
|
#define MIN(a,b) (a <= b ? a : b)
|
||||||
|
|
||||||
|
static void PNGAPI
|
||||||
|
png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||||
|
{
|
||||||
|
int check;
|
||||||
|
png_byte *n_data;
|
||||||
|
png_FILE_p io_ptr;
|
||||||
|
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
/* Check if data really is near. If so, use usual code. */
|
||||||
|
n_data = (png_byte *)CVT_PTR_NOCHECK(data);
|
||||||
|
io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
|
||||||
|
if ((png_bytep)n_data == data)
|
||||||
|
{
|
||||||
|
#if defined(_WIN32_WCE)
|
||||||
|
if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
|
||||||
|
check = 0;
|
||||||
|
#else
|
||||||
|
check = fread(n_data, 1, length, io_ptr);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_byte buf[NEAR_BUF_SIZE];
|
||||||
|
png_size_t read, remaining, err;
|
||||||
|
check = 0;
|
||||||
|
remaining = length;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
read = MIN(NEAR_BUF_SIZE, remaining);
|
||||||
|
#if defined(_WIN32_WCE)
|
||||||
|
if ( !ReadFile((HANDLE)(io_ptr), buf, read, &err, NULL) )
|
||||||
|
err = 0;
|
||||||
|
#else
|
||||||
|
err = fread(buf, (png_size_t)1, read, io_ptr);
|
||||||
|
#endif
|
||||||
|
png_memcpy(data, buf, read); /* copy far buffer to near buffer */
|
||||||
|
if (err != read)
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
check += err;
|
||||||
|
data += read;
|
||||||
|
remaining -= read;
|
||||||
|
}
|
||||||
|
while (remaining != 0);
|
||||||
|
}
|
||||||
|
if ((png_uint_32)check != (png_uint_32)length)
|
||||||
|
png_error(png_ptr, "read Error");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This function allows the application to supply a new input function
|
||||||
|
* for libpng if standard C streams aren't being used.
|
||||||
|
*
|
||||||
|
* This function takes as its arguments:
|
||||||
|
* png_ptr - pointer to a png input data structure
|
||||||
|
* io_ptr - pointer to user supplied structure containing info about
|
||||||
|
* the input functions. May be NULL.
|
||||||
|
* read_data_fn - pointer to a new input function that takes as its
|
||||||
|
* arguments a pointer to a png_struct, a pointer to
|
||||||
|
* a location where input data can be stored, and a 32-bit
|
||||||
|
* unsigned int that is the number of bytes to be read.
|
||||||
|
* To exit and output any fatal error messages the new write
|
||||||
|
* function should call png_error(png_ptr, "Error msg").
|
||||||
|
* May be NULL, in which case libpng's default function will
|
||||||
|
* be used.
|
||||||
|
*/
|
||||||
|
void PNGAPI
|
||||||
|
png_set_read_fn(png_structp png_ptr, png_voidp io_ptr,
|
||||||
|
png_rw_ptr read_data_fn)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
png_ptr->io_ptr = io_ptr;
|
||||||
|
|
||||||
|
#if !defined(PNG_NO_STDIO)
|
||||||
|
if (read_data_fn != NULL)
|
||||||
|
png_ptr->read_data_fn = read_data_fn;
|
||||||
|
else
|
||||||
|
png_ptr->read_data_fn = png_default_read_data;
|
||||||
|
#else
|
||||||
|
png_ptr->read_data_fn = read_data_fn;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* It is an error to write to a read device */
|
||||||
|
if (png_ptr->write_data_fn != NULL)
|
||||||
|
{
|
||||||
|
png_ptr->write_data_fn = NULL;
|
||||||
|
png_warning(png_ptr,
|
||||||
|
"It's an error to set both read_data_fn and write_data_fn in the ");
|
||||||
|
png_warning(png_ptr,
|
||||||
|
"same structure. Resetting write_data_fn to NULL.");
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
|
||||||
|
png_ptr->output_flush_fn = NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif /* PNG_READ_SUPPORTED */
|
4381
GRRLIB/lib/png/pngrtran.c
Normal file
4381
GRRLIB/lib/png/pngrtran.c
Normal file
File diff suppressed because it is too large
Load diff
3252
GRRLIB/lib/png/pngrutil.c
Normal file
3252
GRRLIB/lib/png/pngrutil.c
Normal file
File diff suppressed because it is too large
Load diff
1285
GRRLIB/lib/png/pngset.c
Normal file
1285
GRRLIB/lib/png/pngset.c
Normal file
File diff suppressed because it is too large
Load diff
1692
GRRLIB/lib/png/pngtest.c
Normal file
1692
GRRLIB/lib/png/pngtest.c
Normal file
File diff suppressed because it is too large
Load diff
677
GRRLIB/lib/png/pngtrans.c
Normal file
677
GRRLIB/lib/png/pngtrans.c
Normal file
|
@ -0,0 +1,677 @@
|
||||||
|
|
||||||
|
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
|
||||||
|
*
|
||||||
|
* Last changed in libpng 1.2.36 [May 14, 2009]
|
||||||
|
* Copyright (c) 1998-2009 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.)
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PNG_INTERNAL
|
||||||
|
#include "png.h"
|
||||||
|
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
|
||||||
|
|
||||||
|
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
|
||||||
|
/* Turn on BGR-to-RGB mapping */
|
||||||
|
void PNGAPI
|
||||||
|
png_set_bgr(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_bgr");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
png_ptr->transformations |= PNG_BGR;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
|
||||||
|
/* Turn on 16 bit byte swapping */
|
||||||
|
void PNGAPI
|
||||||
|
png_set_swap(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_swap");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
if (png_ptr->bit_depth == 16)
|
||||||
|
png_ptr->transformations |= PNG_SWAP_BYTES;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
|
||||||
|
/* Turn on pixel packing */
|
||||||
|
void PNGAPI
|
||||||
|
png_set_packing(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_packing");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
if (png_ptr->bit_depth < 8)
|
||||||
|
{
|
||||||
|
png_ptr->transformations |= PNG_PACK;
|
||||||
|
png_ptr->usr_bit_depth = 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
|
||||||
|
/* Turn on packed pixel swapping */
|
||||||
|
void PNGAPI
|
||||||
|
png_set_packswap(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_packswap");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
if (png_ptr->bit_depth < 8)
|
||||||
|
png_ptr->transformations |= PNG_PACKSWAP;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
|
||||||
|
void PNGAPI
|
||||||
|
png_set_shift(png_structp png_ptr, png_color_8p true_bits)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_shift");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
png_ptr->transformations |= PNG_SHIFT;
|
||||||
|
png_ptr->shift = *true_bits;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
|
||||||
|
defined(PNG_WRITE_INTERLACING_SUPPORTED)
|
||||||
|
int PNGAPI
|
||||||
|
png_set_interlace_handling(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_interlace handling");
|
||||||
|
if (png_ptr && png_ptr->interlaced)
|
||||||
|
{
|
||||||
|
png_ptr->transformations |= PNG_INTERLACE;
|
||||||
|
return (7);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
|
||||||
|
/* Add a filler byte on read, or remove a filler or alpha byte on write.
|
||||||
|
* The filler type has changed in v0.95 to allow future 2-byte fillers
|
||||||
|
* for 48-bit input data, as well as to avoid problems with some compilers
|
||||||
|
* that don't like bytes as parameters.
|
||||||
|
*/
|
||||||
|
void PNGAPI
|
||||||
|
png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_filler");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
png_ptr->transformations |= PNG_FILLER;
|
||||||
|
png_ptr->filler = (png_byte)filler;
|
||||||
|
if (filler_loc == PNG_FILLER_AFTER)
|
||||||
|
png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
|
||||||
|
else
|
||||||
|
png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
|
||||||
|
|
||||||
|
/* This should probably go in the "do_read_filler" routine.
|
||||||
|
* I attempted to do that in libpng-1.0.1a but that caused problems
|
||||||
|
* so I restored it in libpng-1.0.2a
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
|
||||||
|
{
|
||||||
|
png_ptr->usr_channels = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Also I added this in libpng-1.0.2a (what happens when we expand
|
||||||
|
* a less-than-8-bit grayscale to GA? */
|
||||||
|
|
||||||
|
if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
|
||||||
|
{
|
||||||
|
png_ptr->usr_channels = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined(PNG_1_0_X)
|
||||||
|
/* Added to libpng-1.2.7 */
|
||||||
|
void PNGAPI
|
||||||
|
png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_add_alpha");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
png_set_filler(png_ptr, filler, filler_loc);
|
||||||
|
png_ptr->transformations |= PNG_ADD_ALPHA;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
|
||||||
|
defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
|
||||||
|
void PNGAPI
|
||||||
|
png_set_swap_alpha(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_swap_alpha");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
png_ptr->transformations |= PNG_SWAP_ALPHA;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
|
||||||
|
defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
|
||||||
|
void PNGAPI
|
||||||
|
png_set_invert_alpha(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_invert_alpha");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
png_ptr->transformations |= PNG_INVERT_ALPHA;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
|
||||||
|
void PNGAPI
|
||||||
|
png_set_invert_mono(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_invert_mono");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
png_ptr->transformations |= PNG_INVERT_MONO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Invert monochrome grayscale data */
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_do_invert(png_row_infop row_info, png_bytep row)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_do_invert");
|
||||||
|
/* This test removed from libpng version 1.0.13 and 1.2.0:
|
||||||
|
* if (row_info->bit_depth == 1 &&
|
||||||
|
*/
|
||||||
|
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||||
|
if (row == NULL || row_info == NULL)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
|
||||||
|
{
|
||||||
|
png_bytep rp = row;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 istop = row_info->rowbytes;
|
||||||
|
|
||||||
|
for (i = 0; i < istop; i++)
|
||||||
|
{
|
||||||
|
*rp = (png_byte)(~(*rp));
|
||||||
|
rp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
|
||||||
|
row_info->bit_depth == 8)
|
||||||
|
{
|
||||||
|
png_bytep rp = row;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 istop = row_info->rowbytes;
|
||||||
|
|
||||||
|
for (i = 0; i < istop; i+=2)
|
||||||
|
{
|
||||||
|
*rp = (png_byte)(~(*rp));
|
||||||
|
rp+=2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
|
||||||
|
row_info->bit_depth == 16)
|
||||||
|
{
|
||||||
|
png_bytep rp = row;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 istop = row_info->rowbytes;
|
||||||
|
|
||||||
|
for (i = 0; i < istop; i+=4)
|
||||||
|
{
|
||||||
|
*rp = (png_byte)(~(*rp));
|
||||||
|
*(rp+1) = (png_byte)(~(*(rp+1)));
|
||||||
|
rp+=4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
|
||||||
|
/* Swaps byte order on 16 bit depth images */
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_do_swap(png_row_infop row_info, png_bytep row)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_do_swap");
|
||||||
|
if (
|
||||||
|
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||||
|
row != NULL && row_info != NULL &&
|
||||||
|
#endif
|
||||||
|
row_info->bit_depth == 16)
|
||||||
|
{
|
||||||
|
png_bytep rp = row;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 istop= row_info->width * row_info->channels;
|
||||||
|
|
||||||
|
for (i = 0; i < istop; i++, rp += 2)
|
||||||
|
{
|
||||||
|
png_byte t = *rp;
|
||||||
|
*rp = *(rp + 1);
|
||||||
|
*(rp + 1) = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
|
||||||
|
static PNG_CONST png_byte onebppswaptable[256] = {
|
||||||
|
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
|
||||||
|
0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
|
||||||
|
0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
|
||||||
|
0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
|
||||||
|
0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
|
||||||
|
0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
|
||||||
|
0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
|
||||||
|
0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
|
||||||
|
0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
|
||||||
|
0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
|
||||||
|
0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
|
||||||
|
0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
|
||||||
|
0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
|
||||||
|
0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
|
||||||
|
0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
|
||||||
|
0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
|
||||||
|
0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
|
||||||
|
0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
|
||||||
|
0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
|
||||||
|
0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
|
||||||
|
0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
|
||||||
|
0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
|
||||||
|
0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
|
||||||
|
0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
|
||||||
|
0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
|
||||||
|
0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
|
||||||
|
0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
|
||||||
|
0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
|
||||||
|
0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
|
||||||
|
0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
|
||||||
|
0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
|
||||||
|
0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static PNG_CONST png_byte twobppswaptable[256] = {
|
||||||
|
0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
|
||||||
|
0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
|
||||||
|
0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
|
||||||
|
0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
|
||||||
|
0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
|
||||||
|
0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
|
||||||
|
0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
|
||||||
|
0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
|
||||||
|
0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
|
||||||
|
0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
|
||||||
|
0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
|
||||||
|
0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
|
||||||
|
0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
|
||||||
|
0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
|
||||||
|
0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
|
||||||
|
0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
|
||||||
|
0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
|
||||||
|
0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
|
||||||
|
0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
|
||||||
|
0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
|
||||||
|
0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
|
||||||
|
0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
|
||||||
|
0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
|
||||||
|
0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
|
||||||
|
0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
|
||||||
|
0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
|
||||||
|
0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
|
||||||
|
0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
|
||||||
|
0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
|
||||||
|
0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
|
||||||
|
0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
|
||||||
|
0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static PNG_CONST png_byte fourbppswaptable[256] = {
|
||||||
|
0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
|
||||||
|
0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
|
||||||
|
0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
|
||||||
|
0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
|
||||||
|
0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
|
||||||
|
0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
|
||||||
|
0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
|
||||||
|
0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
|
||||||
|
0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
|
||||||
|
0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
|
||||||
|
0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
|
||||||
|
0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
|
||||||
|
0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
|
||||||
|
0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
|
||||||
|
0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
|
||||||
|
0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
|
||||||
|
0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
|
||||||
|
0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
|
||||||
|
0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
|
||||||
|
0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
|
||||||
|
0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
|
||||||
|
0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
|
||||||
|
0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
|
||||||
|
0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
|
||||||
|
0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
|
||||||
|
0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
|
||||||
|
0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
|
||||||
|
0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
|
||||||
|
0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
|
||||||
|
0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
|
||||||
|
0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
|
||||||
|
0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Swaps pixel packing order within bytes */
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_do_packswap(png_row_infop row_info, png_bytep row)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_do_packswap");
|
||||||
|
if (
|
||||||
|
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||||
|
row != NULL && row_info != NULL &&
|
||||||
|
#endif
|
||||||
|
row_info->bit_depth < 8)
|
||||||
|
{
|
||||||
|
png_bytep rp, end, table;
|
||||||
|
|
||||||
|
end = row + row_info->rowbytes;
|
||||||
|
|
||||||
|
if (row_info->bit_depth == 1)
|
||||||
|
table = (png_bytep)onebppswaptable;
|
||||||
|
else if (row_info->bit_depth == 2)
|
||||||
|
table = (png_bytep)twobppswaptable;
|
||||||
|
else if (row_info->bit_depth == 4)
|
||||||
|
table = (png_bytep)fourbppswaptable;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (rp = row; rp < end; rp++)
|
||||||
|
*rp = table[*rp];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
|
||||||
|
|
||||||
|
#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
|
||||||
|
defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
|
||||||
|
/* Remove filler or alpha byte(s) */
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_do_strip_filler");
|
||||||
|
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||||
|
if (row != NULL && row_info != NULL)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
png_bytep sp=row;
|
||||||
|
png_bytep dp=row;
|
||||||
|
png_uint_32 row_width=row_info->width;
|
||||||
|
png_uint_32 i;
|
||||||
|
|
||||||
|
if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
|
||||||
|
(row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
|
||||||
|
(flags & PNG_FLAG_STRIP_ALPHA))) &&
|
||||||
|
row_info->channels == 4)
|
||||||
|
{
|
||||||
|
if (row_info->bit_depth == 8)
|
||||||
|
{
|
||||||
|
/* This converts from RGBX or RGBA to RGB */
|
||||||
|
if (flags & PNG_FLAG_FILLER_AFTER)
|
||||||
|
{
|
||||||
|
dp+=3; sp+=4;
|
||||||
|
for (i = 1; i < row_width; i++)
|
||||||
|
{
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
sp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* This converts from XRGB or ARGB to RGB */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i = 0; i < row_width; i++)
|
||||||
|
{
|
||||||
|
sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row_info->pixel_depth = 24;
|
||||||
|
row_info->rowbytes = row_width * 3;
|
||||||
|
}
|
||||||
|
else /* if (row_info->bit_depth == 16) */
|
||||||
|
{
|
||||||
|
if (flags & PNG_FLAG_FILLER_AFTER)
|
||||||
|
{
|
||||||
|
/* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
|
||||||
|
sp += 8; dp += 6;
|
||||||
|
for (i = 1; i < row_width; i++)
|
||||||
|
{
|
||||||
|
/* This could be (although png_memcpy is probably slower):
|
||||||
|
png_memcpy(dp, sp, 6);
|
||||||
|
sp += 8;
|
||||||
|
dp += 6;
|
||||||
|
*/
|
||||||
|
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
sp += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
|
||||||
|
for (i = 0; i < row_width; i++)
|
||||||
|
{
|
||||||
|
/* This could be (although png_memcpy is probably slower):
|
||||||
|
png_memcpy(dp, sp, 6);
|
||||||
|
sp += 8;
|
||||||
|
dp += 6;
|
||||||
|
*/
|
||||||
|
|
||||||
|
sp+=2;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row_info->pixel_depth = 48;
|
||||||
|
row_info->rowbytes = row_width * 6;
|
||||||
|
}
|
||||||
|
row_info->channels = 3;
|
||||||
|
}
|
||||||
|
else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
|
||||||
|
(row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
|
||||||
|
(flags & PNG_FLAG_STRIP_ALPHA))) &&
|
||||||
|
row_info->channels == 2)
|
||||||
|
{
|
||||||
|
if (row_info->bit_depth == 8)
|
||||||
|
{
|
||||||
|
/* This converts from GX or GA to G */
|
||||||
|
if (flags & PNG_FLAG_FILLER_AFTER)
|
||||||
|
{
|
||||||
|
for (i = 0; i < row_width; i++)
|
||||||
|
{
|
||||||
|
*dp++ = *sp++;
|
||||||
|
sp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* This converts from XG or AG to G */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i = 0; i < row_width; i++)
|
||||||
|
{
|
||||||
|
sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row_info->pixel_depth = 8;
|
||||||
|
row_info->rowbytes = row_width;
|
||||||
|
}
|
||||||
|
else /* if (row_info->bit_depth == 16) */
|
||||||
|
{
|
||||||
|
if (flags & PNG_FLAG_FILLER_AFTER)
|
||||||
|
{
|
||||||
|
/* This converts from GGXX or GGAA to GG */
|
||||||
|
sp += 4; dp += 2;
|
||||||
|
for (i = 1; i < row_width; i++)
|
||||||
|
{
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
sp += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* This converts from XXGG or AAGG to GG */
|
||||||
|
for (i = 0; i < row_width; i++)
|
||||||
|
{
|
||||||
|
sp += 2;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
*dp++ = *sp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row_info->pixel_depth = 16;
|
||||||
|
row_info->rowbytes = row_width * 2;
|
||||||
|
}
|
||||||
|
row_info->channels = 1;
|
||||||
|
}
|
||||||
|
if (flags & PNG_FLAG_STRIP_ALPHA)
|
||||||
|
row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
|
||||||
|
/* Swaps red and blue bytes within a pixel */
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_do_bgr(png_row_infop row_info, png_bytep row)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_do_bgr");
|
||||||
|
if (
|
||||||
|
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||||
|
row != NULL && row_info != NULL &&
|
||||||
|
#endif
|
||||||
|
(row_info->color_type & PNG_COLOR_MASK_COLOR))
|
||||||
|
{
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
if (row_info->bit_depth == 8)
|
||||||
|
{
|
||||||
|
if (row_info->color_type == PNG_COLOR_TYPE_RGB)
|
||||||
|
{
|
||||||
|
png_bytep rp;
|
||||||
|
png_uint_32 i;
|
||||||
|
|
||||||
|
for (i = 0, rp = row; i < row_width; i++, rp += 3)
|
||||||
|
{
|
||||||
|
png_byte save = *rp;
|
||||||
|
*rp = *(rp + 2);
|
||||||
|
*(rp + 2) = save;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||||
|
{
|
||||||
|
png_bytep rp;
|
||||||
|
png_uint_32 i;
|
||||||
|
|
||||||
|
for (i = 0, rp = row; i < row_width; i++, rp += 4)
|
||||||
|
{
|
||||||
|
png_byte save = *rp;
|
||||||
|
*rp = *(rp + 2);
|
||||||
|
*(rp + 2) = save;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (row_info->bit_depth == 16)
|
||||||
|
{
|
||||||
|
if (row_info->color_type == PNG_COLOR_TYPE_RGB)
|
||||||
|
{
|
||||||
|
png_bytep rp;
|
||||||
|
png_uint_32 i;
|
||||||
|
|
||||||
|
for (i = 0, rp = row; i < row_width; i++, rp += 6)
|
||||||
|
{
|
||||||
|
png_byte save = *rp;
|
||||||
|
*rp = *(rp + 4);
|
||||||
|
*(rp + 4) = save;
|
||||||
|
save = *(rp + 1);
|
||||||
|
*(rp + 1) = *(rp + 5);
|
||||||
|
*(rp + 5) = save;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||||
|
{
|
||||||
|
png_bytep rp;
|
||||||
|
png_uint_32 i;
|
||||||
|
|
||||||
|
for (i = 0, rp = row; i < row_width; i++, rp += 8)
|
||||||
|
{
|
||||||
|
png_byte save = *rp;
|
||||||
|
*rp = *(rp + 4);
|
||||||
|
*(rp + 4) = save;
|
||||||
|
save = *(rp + 1);
|
||||||
|
*(rp + 1) = *(rp + 5);
|
||||||
|
*(rp + 5) = save;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
|
||||||
|
|
||||||
|
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
|
||||||
|
defined(PNG_LEGACY_SUPPORTED) || \
|
||||||
|
defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
|
||||||
|
void PNGAPI
|
||||||
|
png_set_user_transform_info(png_structp png_ptr, png_voidp
|
||||||
|
user_transform_ptr, int user_transform_depth, int user_transform_channels)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_set_user_transform_info");
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
|
||||||
|
png_ptr->user_transform_ptr = user_transform_ptr;
|
||||||
|
png_ptr->user_transform_depth = (png_byte)user_transform_depth;
|
||||||
|
png_ptr->user_transform_channels = (png_byte)user_transform_channels;
|
||||||
|
#else
|
||||||
|
if (user_transform_ptr || user_transform_depth || user_transform_channels)
|
||||||
|
png_warning(png_ptr,
|
||||||
|
"This version of libpng does not support user transform info");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This function returns a pointer to the user_transform_ptr associated with
|
||||||
|
* the user transform functions. The application should free any memory
|
||||||
|
* associated with this pointer before png_write_destroy and png_read_destroy
|
||||||
|
* are called.
|
||||||
|
*/
|
||||||
|
png_voidp PNGAPI
|
||||||
|
png_get_user_transform_ptr(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return (NULL);
|
||||||
|
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
|
||||||
|
return ((png_voidp)png_ptr->user_transform_ptr);
|
||||||
|
#else
|
||||||
|
return (NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
|
1
GRRLIB/lib/png/pngvcrd.c
Normal file
1
GRRLIB/lib/png/pngvcrd.c
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/* pnggvrd.c was removed from libpng-1.2.20. */
|
259
GRRLIB/lib/png/pngwio.c
Normal file
259
GRRLIB/lib/png/pngwio.c
Normal file
|
@ -0,0 +1,259 @@
|
||||||
|
|
||||||
|
/* pngwio.c - functions for data output
|
||||||
|
*
|
||||||
|
* Last changed in libpng 1.2.37 [June 4, 2009]
|
||||||
|
* Copyright (c) 1998-2009 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.)
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*
|
||||||
|
* This file provides a location for all output. Users who need
|
||||||
|
* special handling are expected to write functions that have the same
|
||||||
|
* arguments as these and perform similar functions, but that possibly
|
||||||
|
* use different output methods. Note that you shouldn't change these
|
||||||
|
* functions, but rather write replacement functions and then change
|
||||||
|
* them at run time with png_set_write_fn(...).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PNG_INTERNAL
|
||||||
|
#include "png.h"
|
||||||
|
#ifdef PNG_WRITE_SUPPORTED
|
||||||
|
|
||||||
|
/* Write the data to whatever output you are using. The default routine
|
||||||
|
* writes to a file pointer. Note that this routine sometimes gets called
|
||||||
|
* with very small lengths, so you should implement some kind of simple
|
||||||
|
* buffering if you are using unbuffered writes. This should never be asked
|
||||||
|
* to write more than 64K on a 16 bit machine.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||||
|
{
|
||||||
|
if (png_ptr->write_data_fn != NULL )
|
||||||
|
(*(png_ptr->write_data_fn))(png_ptr, data, length);
|
||||||
|
else
|
||||||
|
png_error(png_ptr, "Call to NULL write function");
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined(PNG_NO_STDIO)
|
||||||
|
/* This is the function that does the actual writing of data. If you are
|
||||||
|
* not writing to a standard C stream, you should create a replacement
|
||||||
|
* write_data function and use it at run time with png_set_write_fn(), rather
|
||||||
|
* than changing the library.
|
||||||
|
*/
|
||||||
|
#ifndef USE_FAR_KEYWORD
|
||||||
|
void PNGAPI
|
||||||
|
png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||||
|
{
|
||||||
|
png_uint_32 check;
|
||||||
|
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
#if defined(_WIN32_WCE)
|
||||||
|
if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
|
||||||
|
check = 0;
|
||||||
|
#else
|
||||||
|
check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr));
|
||||||
|
#endif
|
||||||
|
if (check != length)
|
||||||
|
png_error(png_ptr, "Write Error");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* This is the model-independent version. Since the standard I/O library
|
||||||
|
* can't handle far buffers in the medium and small models, we have to copy
|
||||||
|
* the data.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define NEAR_BUF_SIZE 1024
|
||||||
|
#define MIN(a,b) (a <= b ? a : b)
|
||||||
|
|
||||||
|
void PNGAPI
|
||||||
|
png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
||||||
|
{
|
||||||
|
png_uint_32 check;
|
||||||
|
png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */
|
||||||
|
png_FILE_p io_ptr;
|
||||||
|
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
/* Check if data really is near. If so, use usual code. */
|
||||||
|
near_data = (png_byte *)CVT_PTR_NOCHECK(data);
|
||||||
|
io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
|
||||||
|
if ((png_bytep)near_data == data)
|
||||||
|
{
|
||||||
|
#if defined(_WIN32_WCE)
|
||||||
|
if ( !WriteFile(io_ptr, near_data, length, &check, NULL) )
|
||||||
|
check = 0;
|
||||||
|
#else
|
||||||
|
check = fwrite(near_data, 1, length, io_ptr);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_byte buf[NEAR_BUF_SIZE];
|
||||||
|
png_size_t written, remaining, err;
|
||||||
|
check = 0;
|
||||||
|
remaining = length;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
written = MIN(NEAR_BUF_SIZE, remaining);
|
||||||
|
png_memcpy(buf, data, written); /* Copy far buffer to near buffer */
|
||||||
|
#if defined(_WIN32_WCE)
|
||||||
|
if ( !WriteFile(io_ptr, buf, written, &err, NULL) )
|
||||||
|
err = 0;
|
||||||
|
#else
|
||||||
|
err = fwrite(buf, 1, written, io_ptr);
|
||||||
|
#endif
|
||||||
|
if (err != written)
|
||||||
|
break;
|
||||||
|
|
||||||
|
else
|
||||||
|
check += err;
|
||||||
|
|
||||||
|
data += written;
|
||||||
|
remaining -= written;
|
||||||
|
}
|
||||||
|
while (remaining != 0);
|
||||||
|
}
|
||||||
|
if (check != length)
|
||||||
|
png_error(png_ptr, "Write Error");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This function is called to output any data pending writing (normally
|
||||||
|
* to disk). After png_flush is called, there should be no data pending
|
||||||
|
* writing in any buffers.
|
||||||
|
*/
|
||||||
|
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_flush(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
if (png_ptr->output_flush_fn != NULL)
|
||||||
|
(*(png_ptr->output_flush_fn))(png_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined(PNG_NO_STDIO)
|
||||||
|
void PNGAPI
|
||||||
|
png_default_flush(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
#if !defined(_WIN32_WCE)
|
||||||
|
png_FILE_p io_ptr;
|
||||||
|
#endif
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
#if !defined(_WIN32_WCE)
|
||||||
|
io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr));
|
||||||
|
fflush(io_ptr);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This function allows the application to supply new output functions for
|
||||||
|
* libpng if standard C streams aren't being used.
|
||||||
|
*
|
||||||
|
* This function takes as its arguments:
|
||||||
|
* png_ptr - pointer to a png output data structure
|
||||||
|
* io_ptr - pointer to user supplied structure containing info about
|
||||||
|
* the output functions. May be NULL.
|
||||||
|
* write_data_fn - pointer to a new output function that takes as its
|
||||||
|
* arguments a pointer to a png_struct, a pointer to
|
||||||
|
* data to be written, and a 32-bit unsigned int that is
|
||||||
|
* the number of bytes to be written. The new write
|
||||||
|
* function should call png_error(png_ptr, "Error msg")
|
||||||
|
* to exit and output any fatal error messages. May be
|
||||||
|
* NULL, in which case libpng's default function will
|
||||||
|
* be used.
|
||||||
|
* flush_data_fn - pointer to a new flush function that takes as its
|
||||||
|
* arguments a pointer to a png_struct. After a call to
|
||||||
|
* the flush function, there should be no data in any buffers
|
||||||
|
* or pending transmission. If the output method doesn't do
|
||||||
|
* any buffering of ouput, a function prototype must still be
|
||||||
|
* supplied although it doesn't have to do anything. If
|
||||||
|
* PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile
|
||||||
|
* time, output_flush_fn will be ignored, although it must be
|
||||||
|
* supplied for compatibility. May be NULL, in which case
|
||||||
|
* libpng's default function will be used, if
|
||||||
|
* PNG_WRITE_FLUSH_SUPPORTED is defined. This is not
|
||||||
|
* a good idea if io_ptr does not point to a standard
|
||||||
|
* *FILE structure.
|
||||||
|
*/
|
||||||
|
void PNGAPI
|
||||||
|
png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
|
||||||
|
png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)
|
||||||
|
{
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
png_ptr->io_ptr = io_ptr;
|
||||||
|
|
||||||
|
#if !defined(PNG_NO_STDIO)
|
||||||
|
if (write_data_fn != NULL)
|
||||||
|
png_ptr->write_data_fn = write_data_fn;
|
||||||
|
|
||||||
|
else
|
||||||
|
png_ptr->write_data_fn = png_default_write_data;
|
||||||
|
#else
|
||||||
|
png_ptr->write_data_fn = write_data_fn;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
|
||||||
|
#if !defined(PNG_NO_STDIO)
|
||||||
|
if (output_flush_fn != NULL)
|
||||||
|
png_ptr->output_flush_fn = output_flush_fn;
|
||||||
|
|
||||||
|
else
|
||||||
|
png_ptr->output_flush_fn = png_default_flush;
|
||||||
|
#else
|
||||||
|
png_ptr->output_flush_fn = output_flush_fn;
|
||||||
|
#endif
|
||||||
|
#endif /* PNG_WRITE_FLUSH_SUPPORTED */
|
||||||
|
|
||||||
|
/* It is an error to read while writing a png file */
|
||||||
|
if (png_ptr->read_data_fn != NULL)
|
||||||
|
{
|
||||||
|
png_ptr->read_data_fn = NULL;
|
||||||
|
png_warning(png_ptr,
|
||||||
|
"Attempted to set both read_data_fn and write_data_fn in");
|
||||||
|
png_warning(png_ptr,
|
||||||
|
"the same structure. Resetting read_data_fn to NULL.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(USE_FAR_KEYWORD)
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
void *png_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 *png_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
|
||||||
|
#endif /* PNG_WRITE_SUPPORTED */
|
1561
GRRLIB/lib/png/pngwrite.c
Normal file
1561
GRRLIB/lib/png/pngwrite.c
Normal file
File diff suppressed because it is too large
Load diff
575
GRRLIB/lib/png/pngwtran.c
Normal file
575
GRRLIB/lib/png/pngwtran.c
Normal file
|
@ -0,0 +1,575 @@
|
||||||
|
|
||||||
|
/* pngwtran.c - transforms the data in a row for PNG writers
|
||||||
|
*
|
||||||
|
* Last changed in libpng 1.2.37 [June 4, 2009]
|
||||||
|
* Copyright (c) 1998-2009 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.)
|
||||||
|
*
|
||||||
|
* This code is released under the libpng license.
|
||||||
|
* For conditions of distribution and use, see the disclaimer
|
||||||
|
* and license in png.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PNG_INTERNAL
|
||||||
|
#include "png.h"
|
||||||
|
#ifdef PNG_WRITE_SUPPORTED
|
||||||
|
|
||||||
|
/* Transform the data according to the user's wishes. The order of
|
||||||
|
* transformations is significant.
|
||||||
|
*/
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_do_write_transformations(png_structp png_ptr)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_do_write_transformations");
|
||||||
|
|
||||||
|
if (png_ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
|
||||||
|
if (png_ptr->transformations & PNG_USER_TRANSFORM)
|
||||||
|
if (png_ptr->write_user_transform_fn != NULL)
|
||||||
|
(*(png_ptr->write_user_transform_fn)) /* User write transform function */
|
||||||
|
(png_ptr, /* png_ptr */
|
||||||
|
&(png_ptr->row_info), /* row_info: */
|
||||||
|
/* png_uint_32 width; width of row */
|
||||||
|
/* png_uint_32 rowbytes; number of bytes in row */
|
||||||
|
/* png_byte color_type; color type of pixels */
|
||||||
|
/* png_byte bit_depth; bit depth of samples */
|
||||||
|
/* png_byte channels; number of channels (1-4) */
|
||||||
|
/* png_byte pixel_depth; bits per pixel (depth*channels) */
|
||||||
|
png_ptr->row_buf + 1); /* start of pixel data for row */
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_WRITE_FILLER_SUPPORTED)
|
||||||
|
if (png_ptr->transformations & PNG_FILLER)
|
||||||
|
png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1,
|
||||||
|
png_ptr->flags);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_WRITE_PACKSWAP_SUPPORTED)
|
||||||
|
if (png_ptr->transformations & PNG_PACKSWAP)
|
||||||
|
png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_WRITE_PACK_SUPPORTED)
|
||||||
|
if (png_ptr->transformations & PNG_PACK)
|
||||||
|
png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1,
|
||||||
|
(png_uint_32)png_ptr->bit_depth);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_WRITE_SWAP_SUPPORTED)
|
||||||
|
if (png_ptr->transformations & PNG_SWAP_BYTES)
|
||||||
|
png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_WRITE_SHIFT_SUPPORTED)
|
||||||
|
if (png_ptr->transformations & PNG_SHIFT)
|
||||||
|
png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1,
|
||||||
|
&(png_ptr->shift));
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
|
||||||
|
if (png_ptr->transformations & PNG_SWAP_ALPHA)
|
||||||
|
png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
|
||||||
|
if (png_ptr->transformations & PNG_INVERT_ALPHA)
|
||||||
|
png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_WRITE_BGR_SUPPORTED)
|
||||||
|
if (png_ptr->transformations & PNG_BGR)
|
||||||
|
png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||||
|
#endif
|
||||||
|
#if defined(PNG_WRITE_INVERT_SUPPORTED)
|
||||||
|
if (png_ptr->transformations & PNG_INVERT_MONO)
|
||||||
|
png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(PNG_WRITE_PACK_SUPPORTED)
|
||||||
|
/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The
|
||||||
|
* row_info bit depth should be 8 (one pixel per byte). The channels
|
||||||
|
* should be 1 (this only happens on grayscale and paletted images).
|
||||||
|
*/
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_do_pack");
|
||||||
|
if (row_info->bit_depth == 8 &&
|
||||||
|
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||||
|
row != NULL && row_info != NULL &&
|
||||||
|
#endif
|
||||||
|
row_info->channels == 1)
|
||||||
|
{
|
||||||
|
switch ((int)bit_depth)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
png_bytep sp, dp;
|
||||||
|
int mask, v;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
|
sp = row;
|
||||||
|
dp = row;
|
||||||
|
mask = 0x80;
|
||||||
|
v = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < row_width; i++)
|
||||||
|
{
|
||||||
|
if (*sp != 0)
|
||||||
|
v |= mask;
|
||||||
|
sp++;
|
||||||
|
if (mask > 1)
|
||||||
|
mask >>= 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mask = 0x80;
|
||||||
|
*dp = (png_byte)v;
|
||||||
|
dp++;
|
||||||
|
v = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mask != 0x80)
|
||||||
|
*dp = (png_byte)v;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
png_bytep sp, dp;
|
||||||
|
int shift, v;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
|
sp = row;
|
||||||
|
dp = row;
|
||||||
|
shift = 6;
|
||||||
|
v = 0;
|
||||||
|
for (i = 0; i < row_width; i++)
|
||||||
|
{
|
||||||
|
png_byte value;
|
||||||
|
|
||||||
|
value = (png_byte)(*sp & 0x03);
|
||||||
|
v |= (value << shift);
|
||||||
|
if (shift == 0)
|
||||||
|
{
|
||||||
|
shift = 6;
|
||||||
|
*dp = (png_byte)v;
|
||||||
|
dp++;
|
||||||
|
v = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
shift -= 2;
|
||||||
|
sp++;
|
||||||
|
}
|
||||||
|
if (shift != 6)
|
||||||
|
*dp = (png_byte)v;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
png_bytep sp, dp;
|
||||||
|
int shift, v;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
|
sp = row;
|
||||||
|
dp = row;
|
||||||
|
shift = 4;
|
||||||
|
v = 0;
|
||||||
|
for (i = 0; i < row_width; i++)
|
||||||
|
{
|
||||||
|
png_byte value;
|
||||||
|
|
||||||
|
value = (png_byte)(*sp & 0x0f);
|
||||||
|
v |= (value << shift);
|
||||||
|
|
||||||
|
if (shift == 0)
|
||||||
|
{
|
||||||
|
shift = 4;
|
||||||
|
*dp = (png_byte)v;
|
||||||
|
dp++;
|
||||||
|
v = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
shift -= 4;
|
||||||
|
|
||||||
|
sp++;
|
||||||
|
}
|
||||||
|
if (shift != 4)
|
||||||
|
*dp = (png_byte)v;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row_info->bit_depth = (png_byte)bit_depth;
|
||||||
|
row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels);
|
||||||
|
row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,
|
||||||
|
row_info->width);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_WRITE_SHIFT_SUPPORTED)
|
||||||
|
/* Shift pixel values to take advantage of whole range. Pass the
|
||||||
|
* true number of bits in bit_depth. The row should be packed
|
||||||
|
* according to row_info->bit_depth. Thus, if you had a row of
|
||||||
|
* bit depth 4, but the pixels only had values from 0 to 7, you
|
||||||
|
* would pass 3 as bit_depth, and this routine would translate the
|
||||||
|
* data to 0 to 15.
|
||||||
|
*/
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_do_shift");
|
||||||
|
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||||
|
if (row != NULL && row_info != NULL &&
|
||||||
|
#else
|
||||||
|
if (
|
||||||
|
#endif
|
||||||
|
row_info->color_type != PNG_COLOR_TYPE_PALETTE)
|
||||||
|
{
|
||||||
|
int shift_start[4], shift_dec[4];
|
||||||
|
int channels = 0;
|
||||||
|
|
||||||
|
if (row_info->color_type & PNG_COLOR_MASK_COLOR)
|
||||||
|
{
|
||||||
|
shift_start[channels] = row_info->bit_depth - bit_depth->red;
|
||||||
|
shift_dec[channels] = bit_depth->red;
|
||||||
|
channels++;
|
||||||
|
shift_start[channels] = row_info->bit_depth - bit_depth->green;
|
||||||
|
shift_dec[channels] = bit_depth->green;
|
||||||
|
channels++;
|
||||||
|
shift_start[channels] = row_info->bit_depth - bit_depth->blue;
|
||||||
|
shift_dec[channels] = bit_depth->blue;
|
||||||
|
channels++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
shift_start[channels] = row_info->bit_depth - bit_depth->gray;
|
||||||
|
shift_dec[channels] = bit_depth->gray;
|
||||||
|
channels++;
|
||||||
|
}
|
||||||
|
if (row_info->color_type & PNG_COLOR_MASK_ALPHA)
|
||||||
|
{
|
||||||
|
shift_start[channels] = row_info->bit_depth - bit_depth->alpha;
|
||||||
|
shift_dec[channels] = bit_depth->alpha;
|
||||||
|
channels++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* With low row depths, could only be grayscale, so one channel */
|
||||||
|
if (row_info->bit_depth < 8)
|
||||||
|
{
|
||||||
|
png_bytep bp = row;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_byte mask;
|
||||||
|
png_uint_32 row_bytes = row_info->rowbytes;
|
||||||
|
|
||||||
|
if (bit_depth->gray == 1 && row_info->bit_depth == 2)
|
||||||
|
mask = 0x55;
|
||||||
|
else if (row_info->bit_depth == 4 && bit_depth->gray == 3)
|
||||||
|
mask = 0x11;
|
||||||
|
else
|
||||||
|
mask = 0xff;
|
||||||
|
|
||||||
|
for (i = 0; i < row_bytes; i++, bp++)
|
||||||
|
{
|
||||||
|
png_uint_16 v;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
v = *bp;
|
||||||
|
*bp = 0;
|
||||||
|
for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0])
|
||||||
|
{
|
||||||
|
if (j > 0)
|
||||||
|
*bp |= (png_byte)((v << j) & 0xff);
|
||||||
|
else
|
||||||
|
*bp |= (png_byte)((v >> (-j)) & mask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (row_info->bit_depth == 8)
|
||||||
|
{
|
||||||
|
png_bytep bp = row;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 istop = channels * row_info->width;
|
||||||
|
|
||||||
|
for (i = 0; i < istop; i++, bp++)
|
||||||
|
{
|
||||||
|
|
||||||
|
png_uint_16 v;
|
||||||
|
int j;
|
||||||
|
int c = (int)(i%channels);
|
||||||
|
|
||||||
|
v = *bp;
|
||||||
|
*bp = 0;
|
||||||
|
for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
|
||||||
|
{
|
||||||
|
if (j > 0)
|
||||||
|
*bp |= (png_byte)((v << j) & 0xff);
|
||||||
|
else
|
||||||
|
*bp |= (png_byte)((v >> (-j)) & 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_bytep bp;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 istop = channels * row_info->width;
|
||||||
|
|
||||||
|
for (bp = row, i = 0; i < istop; i++)
|
||||||
|
{
|
||||||
|
int c = (int)(i%channels);
|
||||||
|
png_uint_16 value, v;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1));
|
||||||
|
value = 0;
|
||||||
|
for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
|
||||||
|
{
|
||||||
|
if (j > 0)
|
||||||
|
value |= (png_uint_16)((v << j) & (png_uint_16)0xffff);
|
||||||
|
else
|
||||||
|
value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff);
|
||||||
|
}
|
||||||
|
*bp++ = (png_byte)(value >> 8);
|
||||||
|
*bp++ = (png_byte)(value & 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_do_write_swap_alpha");
|
||||||
|
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||||
|
if (row != NULL && row_info != NULL)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||||
|
{
|
||||||
|
/* This converts from ARGB to RGBA */
|
||||||
|
if (row_info->bit_depth == 8)
|
||||||
|
{
|
||||||
|
png_bytep sp, dp;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||||
|
{
|
||||||
|
png_byte save = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = save;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* This converts from AARRGGBB to RRGGBBAA */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_bytep sp, dp;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
|
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||||
|
{
|
||||||
|
png_byte save[2];
|
||||||
|
save[0] = *(sp++);
|
||||||
|
save[1] = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = save[0];
|
||||||
|
*(dp++) = save[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||||
|
{
|
||||||
|
/* This converts from AG to GA */
|
||||||
|
if (row_info->bit_depth == 8)
|
||||||
|
{
|
||||||
|
png_bytep sp, dp;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
|
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||||
|
{
|
||||||
|
png_byte save = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = save;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* This converts from AAGG to GGAA */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_bytep sp, dp;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
|
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||||
|
{
|
||||||
|
png_byte save[2];
|
||||||
|
save[0] = *(sp++);
|
||||||
|
save[1] = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = save[0];
|
||||||
|
*(dp++) = save[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_do_write_invert_alpha");
|
||||||
|
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||||
|
if (row != NULL && row_info != NULL)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||||
|
{
|
||||||
|
/* This inverts the alpha channel in RGBA */
|
||||||
|
if (row_info->bit_depth == 8)
|
||||||
|
{
|
||||||
|
png_bytep sp, dp;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||||
|
{
|
||||||
|
/* Does nothing
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*/
|
||||||
|
sp+=3; dp = sp;
|
||||||
|
*(dp++) = (png_byte)(255 - *(sp++));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* This inverts the alpha channel in RRGGBBAA */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_bytep sp, dp;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
|
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||||
|
{
|
||||||
|
/* Does nothing
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*/
|
||||||
|
sp+=6; dp = sp;
|
||||||
|
*(dp++) = (png_byte)(255 - *(sp++));
|
||||||
|
*(dp++) = (png_byte)(255 - *(sp++));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||||
|
{
|
||||||
|
/* This inverts the alpha channel in GA */
|
||||||
|
if (row_info->bit_depth == 8)
|
||||||
|
{
|
||||||
|
png_bytep sp, dp;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
|
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||||
|
{
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = (png_byte)(255 - *(sp++));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* This inverts the alpha channel in GGAA */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
png_bytep sp, dp;
|
||||||
|
png_uint_32 i;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
|
||||||
|
for (i = 0, sp = dp = row; i < row_width; i++)
|
||||||
|
{
|
||||||
|
/* Does nothing
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*(dp++) = *(sp++);
|
||||||
|
*/
|
||||||
|
sp+=2; dp = sp;
|
||||||
|
*(dp++) = (png_byte)(255 - *(sp++));
|
||||||
|
*(dp++) = (png_byte)(255 - *(sp++));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PNG_MNG_FEATURES_SUPPORTED)
|
||||||
|
/* Undoes intrapixel differencing */
|
||||||
|
void /* PRIVATE */
|
||||||
|
png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
|
||||||
|
{
|
||||||
|
png_debug(1, "in png_do_write_intrapixel");
|
||||||
|
if (
|
||||||
|
#if defined(PNG_USELESS_TESTS_SUPPORTED)
|
||||||
|
row != NULL && row_info != NULL &&
|
||||||
|
#endif
|
||||||
|
(row_info->color_type & PNG_COLOR_MASK_COLOR))
|
||||||
|
{
|
||||||
|
int bytes_per_pixel;
|
||||||
|
png_uint_32 row_width = row_info->width;
|
||||||
|
if (row_info->bit_depth == 8)
|
||||||
|
{
|
||||||
|
png_bytep rp;
|
||||||
|
png_uint_32 i;
|
||||||
|
|
||||||
|
if (row_info->color_type == PNG_COLOR_TYPE_RGB)
|
||||||
|
bytes_per_pixel = 3;
|
||||||
|
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||||
|
bytes_per_pixel = 4;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
|
||||||
|
{
|
||||||
|
*(rp) = (png_byte)((*rp - *(rp+1))&0xff);
|
||||||
|
*(rp+2) = (png_byte)((*(rp+2) - *(rp+1))&0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (row_info->bit_depth == 16)
|
||||||
|
{
|
||||||
|
png_bytep rp;
|
||||||
|
png_uint_32 i;
|
||||||
|
|
||||||
|
if (row_info->color_type == PNG_COLOR_TYPE_RGB)
|
||||||
|
bytes_per_pixel = 6;
|
||||||
|
else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
||||||
|
bytes_per_pixel = 8;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
|
||||||
|
{
|
||||||
|
png_uint_32 s0 = (*(rp ) << 8) | *(rp+1);
|
||||||
|
png_uint_32 s1 = (*(rp+2) << 8) | *(rp+3);
|
||||||
|
png_uint_32 s2 = (*(rp+4) << 8) | *(rp+5);
|
||||||
|
png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL);
|
||||||
|
png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL);
|
||||||
|
*(rp ) = (png_byte)((red >> 8) & 0xff);
|
||||||
|
*(rp+1) = (png_byte)(red & 0xff);
|
||||||
|
*(rp+4) = (png_byte)((blue >> 8) & 0xff);
|
||||||
|
*(rp+5) = (png_byte)(blue & 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* PNG_MNG_FEATURES_SUPPORTED */
|
||||||
|
#endif /* PNG_WRITE_SUPPORTED */
|
2825
GRRLIB/lib/png/pngwutil.c
Normal file
2825
GRRLIB/lib/png/pngwutil.c
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue