mirror of
				https://github.com/pocoproject/poco.git
				synced 2025-10-23 08:31:43 +02:00 
			
		
		
		
	update(libpng): Version 1.6.43 (#4582)
This commit is contained in:
		
							
								
								
									
										4921
									
								
								PDF/src/png.c
									
									
									
									
									
								
							
							
						
						
									
										4921
									
								
								PDF/src/png.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1352
									
								
								PDF/src/pngget.c
									
									
									
									
									
								
							
							
						
						
									
										1352
									
								
								PDF/src/pngget.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										724
									
								
								PDF/src/pngmem.c
									
									
									
									
									
								
							
							
						
						
									
										724
									
								
								PDF/src/pngmem.c
									
									
									
									
									
								
							| @@ -1,11 +1,14 @@ | ||||
|  | ||||
| /* pngmem.c - stub functions for memory allocation | ||||
|  * | ||||
|  * Last changed in libpng 1.2.13 November 13, 2006 | ||||
|  * For conditions of distribution and use, see copyright notice in png.h | ||||
|  * Copyright (c) 1998-2006 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.) | ||||
|  * Copyright (c) 2018 Cosmin Truta | ||||
|  * Copyright (c) 1998-2002,2004,2006-2014,2016 Glenn Randers-Pehrson | ||||
|  * Copyright (c) 1996-1997 Andreas Dilger | ||||
|  * 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 | ||||
| @@ -14,569 +17,239 @@ | ||||
|  * identify the replacement functions. | ||||
|  */ | ||||
|  | ||||
| #define PNG_INTERNAL | ||||
| #include "png.h" | ||||
| #include "pngpriv.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 */ | ||||
| /* Free a png_struct */ | ||||
| void /* PRIVATE */ | ||||
| png_destroy_struct(png_voidp struct_ptr) | ||||
| png_destroy_png_struct(png_structrp png_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) | ||||
|    if (png_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); | ||||
|       /* png_free might call png_error and may certainly call | ||||
|        * png_get_mem_ptr, so fake a temporary png_struct to support this. | ||||
|        */ | ||||
|       png_struct dummy_struct = *png_ptr; | ||||
|       memset(png_ptr, 0, (sizeof *png_ptr)); | ||||
|       png_free(&dummy_struct, png_ptr); | ||||
|  | ||||
| #     ifdef PNG_SETJMP_SUPPORTED | ||||
|          /* We may have a jmp_buf left to deallocate. */ | ||||
|          png_free_jmpbuf(&dummy_struct); | ||||
| #     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 | ||||
|  * 64K.  However, zlib may allocate more than 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_FUNCTION(png_voidp,PNGAPI | ||||
| png_calloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) | ||||
| { | ||||
|    png_voidp ret; | ||||
|  | ||||
|    if (png_ptr == NULL || size == 0) | ||||
|       return (NULL); | ||||
|    ret = png_malloc(png_ptr, size); | ||||
|  | ||||
| #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); | ||||
|    if (ret != NULL) | ||||
|       memset(ret, 0, size); | ||||
|  | ||||
|    return ret; | ||||
| } | ||||
|  | ||||
| png_voidp PNGAPI | ||||
| png_malloc_default(png_structp png_ptr, png_uint_32 size) | ||||
| /* png_malloc_base, an internal function added at libpng 1.6.0, does the work of | ||||
|  * allocating memory, taking into account limits and PNG_USER_MEM_SUPPORTED. | ||||
|  * Checking and error handling must happen outside this routine; it returns NULL | ||||
|  * if the allocation cannot be done (for any reason.) | ||||
|  */ | ||||
| PNG_FUNCTION(png_voidp /* PRIVATE */, | ||||
| png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size), | ||||
|     PNG_ALLOCATED) | ||||
| { | ||||
|    /* Moved to png_malloc_base from png_malloc_default in 1.6.0; the DOS | ||||
|     * allocators have also been removed in 1.6.0, so any 16-bit system now has | ||||
|     * to implement a user memory handler.  This checks to be sure it isn't | ||||
|     * called with big numbers. | ||||
|     */ | ||||
| #ifndef PNG_USER_MEM_SUPPORTED | ||||
|    PNG_UNUSED(png_ptr) | ||||
| #endif | ||||
|  | ||||
|    /* Some compilers complain that this is always true.  However, it | ||||
|     * can be false when integer overflow happens. | ||||
|     */ | ||||
|    if (size > 0 && size <= PNG_SIZE_MAX | ||||
| #     ifdef PNG_MAX_MALLOC_64K | ||||
|          && size <= 65536U | ||||
| #     endif | ||||
|       ) | ||||
|    { | ||||
| #ifdef PNG_USER_MEM_SUPPORTED | ||||
|       if (png_ptr != NULL && png_ptr->malloc_fn != NULL) | ||||
|          return png_ptr->malloc_fn(png_constcast(png_structrp,png_ptr), size); | ||||
|  | ||||
|       else | ||||
| #endif | ||||
|          return malloc((size_t)size); /* checked for truncation above */ | ||||
|    } | ||||
|  | ||||
|    else | ||||
|       return NULL; | ||||
| } | ||||
|  | ||||
| #if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\ | ||||
|    defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) | ||||
| /* This is really here only to work round a spurious warning in GCC 4.6 and 4.7 | ||||
|  * that arises because of the checks in png_realloc_array that are repeated in | ||||
|  * png_malloc_array. | ||||
|  */ | ||||
| static png_voidp | ||||
| png_malloc_array_checked(png_const_structrp png_ptr, int nelements, | ||||
|     size_t element_size) | ||||
| { | ||||
|    png_alloc_size_t req = (png_alloc_size_t)nelements; /* known to be > 0 */ | ||||
|  | ||||
|    if (req <= PNG_SIZE_MAX/element_size) | ||||
|       return png_malloc_base(png_ptr, req * element_size); | ||||
|  | ||||
|    /* The failure case when the request is too large */ | ||||
|    return NULL; | ||||
| } | ||||
|  | ||||
| PNG_FUNCTION(png_voidp /* PRIVATE */, | ||||
| png_malloc_array,(png_const_structrp png_ptr, int nelements, | ||||
|     size_t element_size),PNG_ALLOCATED) | ||||
| { | ||||
|    if (nelements <= 0 || element_size == 0) | ||||
|       png_error(png_ptr, "internal error: array alloc"); | ||||
|  | ||||
|    return png_malloc_array_checked(png_ptr, nelements, element_size); | ||||
| } | ||||
|  | ||||
| PNG_FUNCTION(png_voidp /* PRIVATE */, | ||||
| png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array, | ||||
|     int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED) | ||||
| { | ||||
|    /* These are internal errors: */ | ||||
|    if (add_elements <= 0 || element_size == 0 || old_elements < 0 || | ||||
|       (old_array == NULL && old_elements > 0)) | ||||
|       png_error(png_ptr, "internal error: array realloc"); | ||||
|  | ||||
|    /* Check for overflow on the elements count (so the caller does not have to | ||||
|     * check.) | ||||
|     */ | ||||
|    if (add_elements <= INT_MAX - old_elements) | ||||
|    { | ||||
|       png_voidp new_array = png_malloc_array_checked(png_ptr, | ||||
|           old_elements+add_elements, element_size); | ||||
|  | ||||
|       if (new_array != NULL) | ||||
|       { | ||||
|          /* Because png_malloc_array worked the size calculations below cannot | ||||
|           * overflow. | ||||
|           */ | ||||
|          if (old_elements > 0) | ||||
|             memcpy(new_array, old_array, element_size*(unsigned)old_elements); | ||||
|  | ||||
|          memset((char*)new_array + element_size*(unsigned)old_elements, 0, | ||||
|              element_size*(unsigned)add_elements); | ||||
|  | ||||
|          return new_array; | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    return NULL; /* error */ | ||||
| } | ||||
| #endif /* TEXT || sPLT || STORE_UNKNOWN_CHUNKS */ | ||||
|  | ||||
| /* Various functions that have different error handling are derived from this. | ||||
|  * png_malloc always exists, but if PNG_USER_MEM_SUPPORTED is defined a separate | ||||
|  * function png_malloc_default is also provided. | ||||
|  */ | ||||
| PNG_FUNCTION(png_voidp,PNGAPI | ||||
| png_malloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) | ||||
| { | ||||
|    png_voidp ret; | ||||
| #endif /* PNG_USER_MEM_SUPPORTED */ | ||||
|  | ||||
|    if (png_ptr == NULL || size == 0) | ||||
|       return (NULL); | ||||
|    if (png_ptr == NULL) | ||||
|       return NULL; | ||||
|  | ||||
| #ifdef PNG_MAX_MALLOC_64K | ||||
|    if (size > (png_uint_32)65536L) | ||||
|    { | ||||
|       png_warning(png_ptr, "Cannot Allocate > 64K"); | ||||
|       ret = NULL; | ||||
|    } | ||||
|    else | ||||
| #endif | ||||
|    ret = png_malloc_base(png_ptr, size); | ||||
|  | ||||
|    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 | ||||
|        png_error(png_ptr, "Out of memory"); /* 'm' means png_malloc */ | ||||
|  | ||||
|    return (ret); | ||||
|    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) 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_FUNCTION(png_voidp,PNGAPI | ||||
| png_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size), | ||||
|     PNG_ALLOCATED PNG_DEPRECATED) | ||||
| { | ||||
|    png_voidp ret; | ||||
|  | ||||
| #ifdef PNG_USER_MEM_SUPPORTED | ||||
|    if (png_ptr == NULL || size == 0) | ||||
|       return (NULL); | ||||
|    if (png_ptr == NULL) | ||||
|       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); | ||||
|    /* Passing 'NULL' here bypasses the application provided memory handler. */ | ||||
|    ret = png_malloc_base(NULL/*use malloc*/, size); | ||||
|  | ||||
|    if (ret == NULL) | ||||
|       png_error(png_ptr, "Out of Memory"); /* 'M' means png_malloc_default */ | ||||
|  | ||||
|    return ret; | ||||
| } | ||||
| #endif /* USER_MEM */ | ||||
|  | ||||
| png_voidp PNGAPI | ||||
| png_malloc_default(png_structp png_ptr, png_uint_32 size) | ||||
| /* This function was added at libpng version 1.2.3.  The png_malloc_warn() | ||||
|  * function will issue a png_warning and return NULL instead of issuing a | ||||
|  * png_error, if it fails to allocate the requested memory. | ||||
|  */ | ||||
| PNG_FUNCTION(png_voidp,PNGAPI | ||||
| png_malloc_warn,(png_const_structrp png_ptr, png_alloc_size_t size), | ||||
|     PNG_ALLOCATED) | ||||
| { | ||||
|    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) | ||||
|    if (png_ptr != NULL) | ||||
|    { | ||||
| #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; | ||||
|       png_voidp ret = png_malloc_base(png_ptr, size); | ||||
|  | ||||
|       if (ret != NULL) | ||||
|          return ret; | ||||
|  | ||||
|       png_warning(png_ptr, "Out of memory"); | ||||
|    } | ||||
| #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); | ||||
|    return NULL; | ||||
| } | ||||
|  | ||||
| /* Free a pointer allocated by png_malloc().  If ptr is NULL, return | ||||
|    without taking any action. */ | ||||
|  * without taking any action. | ||||
|  */ | ||||
| void PNGAPI | ||||
| png_free(png_structp png_ptr, png_voidp ptr) | ||||
| png_free(png_const_structrp 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); | ||||
|       png_ptr->free_fn(png_constcast(png_structrp,png_ptr), ptr); | ||||
|  | ||||
|    else | ||||
|       png_free_default(png_ptr, ptr); | ||||
| } | ||||
| void PNGAPI | ||||
| png_free_default(png_structp png_ptr, png_voidp ptr) | ||||
|  | ||||
| PNG_FUNCTION(void,PNGAPI | ||||
| png_free_default,(png_const_structrp png_ptr, png_voidp ptr),PNG_DEPRECATED) | ||||
| { | ||||
|    if (png_ptr == NULL || ptr == NULL) | ||||
|       return; | ||||
| #endif /* USER_MEM */ | ||||
|  | ||||
| #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 | ||||
| @@ -584,13 +257,14 @@ png_memset_check (png_structp png_ptr, png_voidp s1, int value, | ||||
|  * of allocating and freeing memory. | ||||
|  */ | ||||
| void PNGAPI | ||||
| png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr | ||||
| png_set_mem_fn(png_structrp 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; | ||||
|    if (png_ptr != NULL) | ||||
|    { | ||||
|       png_ptr->mem_ptr = mem_ptr; | ||||
|       png_ptr->malloc_fn = malloc_fn; | ||||
|       png_ptr->free_fn = free_fn; | ||||
|    } | ||||
| } | ||||
|  | ||||
| @@ -599,10 +273,12 @@ png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr | ||||
|  * pointer before png_write_destroy and png_read_destroy are called. | ||||
|  */ | ||||
| png_voidp PNGAPI | ||||
| png_get_mem_ptr(png_structp png_ptr) | ||||
| png_get_mem_ptr(png_const_structrp png_ptr) | ||||
| { | ||||
|    if(png_ptr == NULL) return (NULL); | ||||
|    return ((png_voidp)png_ptr->mem_ptr); | ||||
|    if (png_ptr == NULL) | ||||
|       return NULL; | ||||
|  | ||||
|    return png_ptr->mem_ptr; | ||||
| } | ||||
| #endif /* PNG_USER_MEM_SUPPORTED */ | ||||
| #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ | ||||
| #endif /* USER_MEM */ | ||||
| #endif /* READ || WRITE */ | ||||
|   | ||||
							
								
								
									
										1626
									
								
								PDF/src/pngpread.c
									
									
									
									
									
								
							
							
						
						
									
										1626
									
								
								PDF/src/pngpread.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4747
									
								
								PDF/src/pngread.c
									
									
									
									
									
								
							
							
						
						
									
										4747
									
								
								PDF/src/pngread.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										173
									
								
								PDF/src/pngrio.c
									
									
									
									
									
								
							
							
						
						
									
										173
									
								
								PDF/src/pngrio.c
									
									
									
									
									
								
							| @@ -1,11 +1,14 @@ | ||||
|  | ||||
| /* pngrio.c - functions for data input | ||||
|  * | ||||
|  * Last changed in libpng 1.2.13 November 13, 2006 | ||||
|  * For conditions of distribution and use, see copyright notice in png.h | ||||
|  * Copyright (c) 1998-2006 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.) | ||||
|  * Copyright (c) 2018 Cosmin Truta | ||||
|  * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson | ||||
|  * Copyright (c) 1996-1997 Andreas Dilger | ||||
|  * 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 | ||||
| @@ -15,153 +18,103 @@ | ||||
|  * libpng use it at run time with png_set_read_fn(...). | ||||
|  */ | ||||
|  | ||||
| #define PNG_INTERNAL | ||||
| #include "png.h" | ||||
| #include "pngpriv.h" | ||||
|  | ||||
| #if defined(PNG_READ_SUPPORTED) | ||||
| #ifdef 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. */ | ||||
|  * 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 than 64K on a 16-bit machine. | ||||
|  */ | ||||
| void /* PRIVATE */ | ||||
| png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) | ||||
| png_read_data(png_structrp png_ptr, png_bytep data, size_t length) | ||||
| { | ||||
|    png_debug1(4,"reading %d bytes\n", (int)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) | ||||
| #ifdef PNG_STDIO_SUPPORTED | ||||
| /* 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) | ||||
|  * 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. | ||||
|  */ | ||||
| void PNGCBAPI | ||||
| png_default_read_data(png_structp png_ptr, png_bytep data, size_t length) | ||||
| { | ||||
|    png_size_t check; | ||||
|    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 | ||||
|    if (png_ptr == NULL) | ||||
|       return; | ||||
|  | ||||
|    /* fread() returns 0 on error, so it is OK to store this in a 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 | ||||
|    check = fread(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr)); | ||||
|  | ||||
|    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"). */ | ||||
|  * 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) | ||||
| png_set_read_fn(png_structrp png_ptr, png_voidp io_ptr, | ||||
|     png_rw_ptr read_data_fn) | ||||
| { | ||||
|    if(png_ptr == NULL) return; | ||||
|    if (png_ptr == NULL) | ||||
|       return; | ||||
|  | ||||
|    png_ptr->io_ptr = io_ptr; | ||||
|  | ||||
| #if !defined(PNG_NO_STDIO) | ||||
| #ifdef PNG_STDIO_SUPPORTED | ||||
|    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 | ||||
|  | ||||
| #ifdef PNG_WRITE_SUPPORTED | ||||
|    /* 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."); | ||||
|           "Can't set both read_data_fn and write_data_fn in the" | ||||
|           " same structure"); | ||||
|    } | ||||
| #endif | ||||
|  | ||||
| #if defined(PNG_WRITE_FLUSH_SUPPORTED) | ||||
| #ifdef PNG_WRITE_FLUSH_SUPPORTED | ||||
|    png_ptr->output_flush_fn = NULL; | ||||
| #endif | ||||
| } | ||||
| #endif /* PNG_READ_SUPPORTED */ | ||||
| #endif /* READ */ | ||||
|   | ||||
							
								
								
									
										6192
									
								
								PDF/src/pngrtran.c
									
									
									
									
									
								
							
							
						
						
									
										6192
									
								
								PDF/src/pngrtran.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										5422
									
								
								PDF/src/pngrutil.c
									
									
									
									
									
								
							
							
						
						
									
										5422
									
								
								PDF/src/pngrutil.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2321
									
								
								PDF/src/pngset.c
									
									
									
									
									
								
							
							
						
						
									
										2321
									
								
								PDF/src/pngset.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2227
									
								
								PDF/src/pngtest.c
									
									
									
									
									
								
							
							
						
						
									
										2227
									
								
								PDF/src/pngtest.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										264
									
								
								PDF/src/pngwio.c
									
									
									
									
									
								
							
							
						
						
									
										264
									
								
								PDF/src/pngwio.c
									
									
									
									
									
								
							| @@ -1,11 +1,14 @@ | ||||
|  | ||||
| /* pngwio.c - functions for data output | ||||
|  * | ||||
|  * Last changed in libpng 1.2.13 November 13, 2006 | ||||
|  * For conditions of distribution and use, see copyright notice in png.h | ||||
|  * Copyright (c) 1998-2006 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.) | ||||
|  * Copyright (c) 2018 Cosmin Truta | ||||
|  * Copyright (c) 1998-2002,2004,2006-2014,2016,2018 Glenn Randers-Pehrson | ||||
|  * Copyright (c) 1996-1997 Andreas Dilger | ||||
|  * 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 | ||||
| @@ -15,220 +18,151 @@ | ||||
|  * them at run time with png_set_write_fn(...). | ||||
|  */ | ||||
|  | ||||
| #define PNG_INTERNAL | ||||
| #include "png.h" | ||||
| #include "pngpriv.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.  */ | ||||
|  * 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) | ||||
| png_write_data(png_structrp png_ptr, png_const_bytep data, size_t length) | ||||
| { | ||||
|    /* NOTE: write_data_fn must not change the buffer! */ | ||||
|    if (png_ptr->write_data_fn != NULL ) | ||||
|       (*(png_ptr->write_data_fn))(png_ptr, data, length); | ||||
|       (*(png_ptr->write_data_fn))(png_ptr, png_constcast(png_bytep,data), | ||||
|           length); | ||||
|  | ||||
|    else | ||||
|       png_error(png_ptr, "Call to NULL write function"); | ||||
| } | ||||
|  | ||||
| #if !defined(PNG_NO_STDIO) | ||||
| #ifdef PNG_STDIO_SUPPORTED | ||||
| /* 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) | ||||
|  * 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. | ||||
|  */ | ||||
| void PNGCBAPI | ||||
| png_default_write_data(png_structp png_ptr, png_bytep data, size_t length) | ||||
| { | ||||
|    png_uint_32 check; | ||||
|    size_t check; | ||||
|  | ||||
|    if (png_ptr == NULL) | ||||
|       return; | ||||
|  | ||||
|    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) | ||||
|  * to disk).  After png_flush is called, there should be no data pending | ||||
|  * writing in any buffers. | ||||
|  */ | ||||
| #ifdef PNG_WRITE_FLUSH_SUPPORTED | ||||
| void /* PRIVATE */ | ||||
| png_flush(png_structp png_ptr) | ||||
| png_flush(png_structrp png_ptr) | ||||
| { | ||||
|    if (png_ptr->output_flush_fn != NULL) | ||||
|       (*(png_ptr->output_flush_fn))(png_ptr); | ||||
| } | ||||
|  | ||||
| #if !defined(PNG_NO_STDIO) | ||||
| void PNGAPI | ||||
| #  ifdef PNG_STDIO_SUPPORTED | ||||
| void PNGCBAPI | ||||
| 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)); | ||||
|    if (io_ptr != NULL) | ||||
|       fflush(io_ptr); | ||||
| #endif | ||||
|  | ||||
|    if (png_ptr == NULL) | ||||
|       return; | ||||
|  | ||||
|    io_ptr = png_voidcast(png_FILE_p, (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. | ||||
|    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. */ | ||||
|  * 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 output, 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) | ||||
| png_set_write_fn(png_structrp png_ptr, png_voidp io_ptr, | ||||
|     png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn) | ||||
| { | ||||
|    if(png_ptr == NULL) return; | ||||
|    if (png_ptr == NULL) | ||||
|       return; | ||||
|  | ||||
|    png_ptr->io_ptr = io_ptr; | ||||
|  | ||||
| #if !defined(PNG_NO_STDIO) | ||||
| #ifdef PNG_STDIO_SUPPORTED | ||||
|    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) | ||||
| #ifdef PNG_WRITE_FLUSH_SUPPORTED | ||||
| #  ifdef PNG_STDIO_SUPPORTED | ||||
|  | ||||
|    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 */ | ||||
|  | ||||
| #  else | ||||
|    png_ptr->output_flush_fn = output_flush_fn; | ||||
| #  endif | ||||
| #else | ||||
|    PNG_UNUSED(output_flush_fn) | ||||
| #endif /* WRITE_FLUSH */ | ||||
|  | ||||
| #ifdef PNG_READ_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); | ||||
|       png_warning(png_ptr, | ||||
|           "Can't set both read_data_fn and write_data_fn in the" | ||||
|           " same structure"); | ||||
|    } | ||||
| #endif | ||||
| } | ||||
| #  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 */ | ||||
| #endif /* WRITE */ | ||||
|   | ||||
							
								
								
									
										2928
									
								
								PDF/src/pngwrite.c
									
									
									
									
									
								
							
							
						
						
									
										2928
									
								
								PDF/src/pngwrite.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,96 +1,32 @@ | ||||
|  | ||||
| /* pngwtran.c - transforms the data in a row for PNG writers | ||||
|  * | ||||
|  * Last changed in libpng 1.2.9 April 14, 2006 | ||||
|  * For conditions of distribution and use, see copyright notice in png.h | ||||
|  * Copyright (c) 1998-2006 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.) | ||||
|  * Copyright (c) 2018 Cosmin Truta | ||||
|  * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson | ||||
|  * Copyright (c) 1996-1997 Andreas Dilger | ||||
|  * 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" | ||||
| #include "pngpriv.h" | ||||
|  | ||||
| #ifdef PNG_WRITE_SUPPORTED | ||||
| #ifdef PNG_WRITE_TRANSFORMS_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\n"); | ||||
|  | ||||
|    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) | ||||
| #ifdef 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 */ | ||||
| static void | ||||
| png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) | ||||
| { | ||||
|    png_debug(1, "in png_do_pack\n"); | ||||
|    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) | ||||
| @@ -111,9 +47,12 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) | ||||
|             { | ||||
|                if (*sp != 0) | ||||
|                   v |= mask; | ||||
|  | ||||
|                sp++; | ||||
|  | ||||
|                if (mask > 1) | ||||
|                   mask >>= 1; | ||||
|  | ||||
|                else | ||||
|                { | ||||
|                   mask = 0x80; | ||||
| @@ -122,14 +61,18 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) | ||||
|                   v = 0; | ||||
|                } | ||||
|             } | ||||
|  | ||||
|             if (mask != 0x80) | ||||
|                *dp = (png_byte)v; | ||||
|  | ||||
|             break; | ||||
|          } | ||||
|  | ||||
|          case 2: | ||||
|          { | ||||
|             png_bytep sp, dp; | ||||
|             int shift, v; | ||||
|             unsigned int shift; | ||||
|             int v; | ||||
|             png_uint_32 i; | ||||
|             png_uint_32 row_width = row_info->width; | ||||
|  | ||||
| @@ -137,12 +80,14 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) | ||||
|             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; | ||||
| @@ -150,18 +95,24 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) | ||||
|                   dp++; | ||||
|                   v = 0; | ||||
|                } | ||||
|  | ||||
|                else | ||||
|                   shift -= 2; | ||||
|  | ||||
|                sp++; | ||||
|             } | ||||
|  | ||||
|             if (shift != 6) | ||||
|                *dp = (png_byte)v; | ||||
|  | ||||
|             break; | ||||
|          } | ||||
|  | ||||
|          case 4: | ||||
|          { | ||||
|             png_bytep sp, dp; | ||||
|             int shift, v; | ||||
|             unsigned int shift; | ||||
|             int v; | ||||
|             png_uint_32 i; | ||||
|             png_uint_32 row_width = row_info->width; | ||||
|  | ||||
| @@ -169,6 +120,7 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) | ||||
|             dp = row; | ||||
|             shift = 4; | ||||
|             v = 0; | ||||
|  | ||||
|             for (i = 0; i < row_width; i++) | ||||
|             { | ||||
|                png_byte value; | ||||
| @@ -183,25 +135,32 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) | ||||
|                   dp++; | ||||
|                   v = 0; | ||||
|                } | ||||
|  | ||||
|                else | ||||
|                   shift -= 4; | ||||
|  | ||||
|                sp++; | ||||
|             } | ||||
|  | ||||
|             if (shift != 4) | ||||
|                *dp = (png_byte)v; | ||||
|  | ||||
|             break; | ||||
|          } | ||||
|  | ||||
|          default: | ||||
|             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); | ||||
|           row_info->width); | ||||
|    } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #if defined(PNG_WRITE_SHIFT_SUPPORTED) | ||||
| #ifdef 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 | ||||
| @@ -209,76 +168,84 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) | ||||
|  * 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) | ||||
| static void | ||||
| png_do_shift(png_row_infop row_info, png_bytep row, | ||||
|     png_const_color_8p bit_depth) | ||||
| { | ||||
|    png_debug(1, "in png_do_shift\n"); | ||||
| #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||
|    if (row != NULL && row_info != NULL && | ||||
| #else | ||||
|    if ( | ||||
| #endif | ||||
|       row_info->color_type != PNG_COLOR_TYPE_PALETTE) | ||||
|    png_debug(1, "in png_do_shift"); | ||||
|  | ||||
|    if (row_info->color_type != PNG_COLOR_TYPE_PALETTE) | ||||
|    { | ||||
|       int shift_start[4], shift_dec[4]; | ||||
|       int channels = 0; | ||||
|       unsigned int channels = 0; | ||||
|  | ||||
|       if (row_info->color_type & PNG_COLOR_MASK_COLOR) | ||||
|       if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0) | ||||
|       { | ||||
|          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) | ||||
|  | ||||
|       if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0) | ||||
|       { | ||||
|          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 */ | ||||
|       /* 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; | ||||
|          size_t i; | ||||
|          unsigned int mask; | ||||
|          size_t 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; | ||||
|             unsigned int v, out; | ||||
|  | ||||
|             v = *bp; | ||||
|             *bp = 0; | ||||
|             out = 0; | ||||
|  | ||||
|             for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) | ||||
|             { | ||||
|                if (j > 0) | ||||
|                   *bp |= (png_byte)((v << j) & 0xff); | ||||
|                   out |= v << j; | ||||
|  | ||||
|                else | ||||
|                   *bp |= (png_byte)((v >> (-j)) & mask); | ||||
|                   out |= (v >> (-j)) & mask; | ||||
|             } | ||||
|  | ||||
|             *bp = (png_byte)(out & 0xff); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       else if (row_info->bit_depth == 8) | ||||
|       { | ||||
|          png_bytep bp = row; | ||||
| @@ -287,22 +254,26 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) | ||||
|  | ||||
|          for (i = 0; i < istop; i++, bp++) | ||||
|          { | ||||
|  | ||||
|             png_uint_16 v; | ||||
|             unsigned int c = i%channels; | ||||
|             int j; | ||||
|             int c = (int)(i%channels); | ||||
|             unsigned int v, out; | ||||
|  | ||||
|             v = *bp; | ||||
|             *bp = 0; | ||||
|             out = 0; | ||||
|  | ||||
|             for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) | ||||
|             { | ||||
|                if (j > 0) | ||||
|                   *bp |= (png_byte)((v << j) & 0xff); | ||||
|                   out |= v << j; | ||||
|  | ||||
|                else | ||||
|                   *bp |= (png_byte)((v >> (-j)) & 0xff); | ||||
|                   out |= v >> (-j); | ||||
|             } | ||||
|  | ||||
|             *bp = (png_byte)(out & 0xff); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|       else | ||||
|       { | ||||
|          png_bytep bp; | ||||
| @@ -311,20 +282,22 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) | ||||
|  | ||||
|          for (bp = row, i = 0; i < istop; i++) | ||||
|          { | ||||
|             int c = (int)(i%channels); | ||||
|             png_uint_16 value, v; | ||||
|             unsigned int c = i%channels; | ||||
|             int j; | ||||
|             unsigned int value, v; | ||||
|  | ||||
|             v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1)); | ||||
|             v = png_get_uint_16(bp); | ||||
|             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); | ||||
|                   value |= v << j; | ||||
|  | ||||
|                else | ||||
|                   value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff); | ||||
|                   value |= v >> (-j); | ||||
|             } | ||||
|             *bp++ = (png_byte)(value >> 8); | ||||
|             *bp++ = (png_byte)((value >> 8) & 0xff); | ||||
|             *bp++ = (png_byte)(value & 0xff); | ||||
|          } | ||||
|       } | ||||
| @@ -332,23 +305,22 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) | ||||
| void /* PRIVATE */ | ||||
| #ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED | ||||
| static void | ||||
| png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) | ||||
| { | ||||
|    png_debug(1, "in png_do_write_swap_alpha\n"); | ||||
| #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||
|    if (row != NULL && row_info != NULL) | ||||
| #endif | ||||
|    png_debug(1, "in png_do_write_swap_alpha"); | ||||
|  | ||||
|    { | ||||
|       if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||
|       { | ||||
|          /* This converts from ARGB to RGBA */ | ||||
|          if (row_info->bit_depth == 8) | ||||
|          { | ||||
|             /* This converts from ARGB to RGBA */ | ||||
|             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++); | ||||
| @@ -358,9 +330,11 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) | ||||
|                *(dp++) = save; | ||||
|             } | ||||
|          } | ||||
|          /* This converts from AARRGGBB to RRGGBBAA */ | ||||
|  | ||||
| #ifdef PNG_WRITE_16BIT_SUPPORTED | ||||
|          else | ||||
|          { | ||||
|             /* This converts from AARRGGBB to RRGGBBAA */ | ||||
|             png_bytep sp, dp; | ||||
|             png_uint_32 i; | ||||
|             png_uint_32 row_width = row_info->width; | ||||
| @@ -380,12 +354,14 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) | ||||
|                *(dp++) = save[1]; | ||||
|             } | ||||
|          } | ||||
| #endif /* WRITE_16BIT */ | ||||
|       } | ||||
|  | ||||
|       else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||
|       { | ||||
|          /* This converts from AG to GA */ | ||||
|          if (row_info->bit_depth == 8) | ||||
|          { | ||||
|             /* This converts from AG to GA */ | ||||
|             png_bytep sp, dp; | ||||
|             png_uint_32 i; | ||||
|             png_uint_32 row_width = row_info->width; | ||||
| @@ -397,9 +373,11 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) | ||||
|                *(dp++) = save; | ||||
|             } | ||||
|          } | ||||
|          /* This converts from AAGG to GGAA */ | ||||
|  | ||||
| #ifdef PNG_WRITE_16BIT_SUPPORTED | ||||
|          else | ||||
|          { | ||||
|             /* This converts from AAGG to GGAA */ | ||||
|             png_bytep sp, dp; | ||||
|             png_uint_32 i; | ||||
|             png_uint_32 row_width = row_info->width; | ||||
| @@ -415,49 +393,51 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) | ||||
|                *(dp++) = save[1]; | ||||
|             } | ||||
|          } | ||||
| #endif /* WRITE_16BIT */ | ||||
|       } | ||||
|    } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) | ||||
| void /* PRIVATE */ | ||||
| #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED | ||||
| static void | ||||
| png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) | ||||
| { | ||||
|    png_debug(1, "in png_do_write_invert_alpha\n"); | ||||
| #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||
|    if (row != NULL && row_info != NULL) | ||||
| #endif | ||||
|    png_debug(1, "in png_do_write_invert_alpha"); | ||||
|  | ||||
|    { | ||||
|       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 | ||||
|          { | ||||
|             /* This inverts the alpha channel in RGBA */ | ||||
|             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 | ||||
|                /* Does nothing | ||||
|                *(dp++) = *(sp++); | ||||
|                *(dp++) = *(sp++); | ||||
|                *(dp++) = *(sp++); | ||||
|                */ | ||||
|                sp+=3; dp = sp; | ||||
|                *dp = (png_byte)(255 - *(sp++)); | ||||
|             } | ||||
|          } | ||||
|  | ||||
| #ifdef PNG_WRITE_16BIT_SUPPORTED | ||||
|          else | ||||
|          { | ||||
|             /* This inverts the alpha channel in RRGGBBAA */ | ||||
|             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++); | ||||
| @@ -467,15 +447,17 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) | ||||
|                */ | ||||
|                sp+=6; dp = sp; | ||||
|                *(dp++) = (png_byte)(255 - *(sp++)); | ||||
|                *(dp++) = (png_byte)(255 - *(sp++)); | ||||
|                *dp     = (png_byte)(255 - *(sp++)); | ||||
|             } | ||||
|          } | ||||
| #endif /* WRITE_16BIT */ | ||||
|       } | ||||
|  | ||||
|       else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||
|       { | ||||
|          /* This inverts the alpha channel in GA */ | ||||
|          if (row_info->bit_depth == 8) | ||||
|          { | ||||
|             /* This inverts the alpha channel in GA */ | ||||
|             png_bytep sp, dp; | ||||
|             png_uint_32 i; | ||||
|             png_uint_32 row_width = row_info->width; | ||||
| @@ -486,87 +468,108 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) | ||||
|                *(dp++) = (png_byte)(255 - *(sp++)); | ||||
|             } | ||||
|          } | ||||
|          /* This inverts the alpha channel in GGAA */ | ||||
|  | ||||
| #ifdef PNG_WRITE_16BIT_SUPPORTED | ||||
|          else | ||||
|          { | ||||
|             /* This inverts the alpha channel in GGAA */ | ||||
|             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 | ||||
|                /* Does nothing | ||||
|                *(dp++) = *(sp++); | ||||
|                *(dp++) = *(sp++); | ||||
|                */ | ||||
|                sp+=2; dp = sp; | ||||
|                *(dp++) = (png_byte)(255 - *(sp++)); | ||||
|                *(dp++) = (png_byte)(255 - *(sp++)); | ||||
|                *dp     = (png_byte)(255 - *(sp++)); | ||||
|             } | ||||
|          } | ||||
| #endif /* WRITE_16BIT */ | ||||
|       } | ||||
|    } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #if defined(PNG_MNG_FEATURES_SUPPORTED) | ||||
| /* undoes intrapixel differencing  */ | ||||
| /* Transform the data according to the user's wishes.  The order of | ||||
|  * transformations is significant. | ||||
|  */ | ||||
| void /* PRIVATE */ | ||||
| png_do_write_intrapixel(png_row_infop row_info, png_bytep row) | ||||
| png_do_write_transformations(png_structrp png_ptr, png_row_infop row_info) | ||||
| { | ||||
|    png_debug(1, "in png_do_write_intrapixel\n"); | ||||
|    if ( | ||||
| #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||
|        row != NULL && row_info != NULL && | ||||
|    png_debug(1, "in png_do_write_transformations"); | ||||
|  | ||||
|    if (png_ptr == NULL) | ||||
|       return; | ||||
|  | ||||
| #ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED | ||||
|    if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0) | ||||
|       if (png_ptr->write_user_transform_fn != NULL) | ||||
|          (*(png_ptr->write_user_transform_fn)) /* User write transform | ||||
|                                                  function */ | ||||
|              (png_ptr,  /* png_ptr */ | ||||
|              row_info,  /* row_info: */ | ||||
|                 /*  png_uint_32 width;       width of row */ | ||||
|                 /*  size_t 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 | ||||
|        (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; | ||||
| #ifdef PNG_WRITE_FILLER_SUPPORTED | ||||
|    if ((png_ptr->transformations & PNG_FILLER) != 0) | ||||
|       png_do_strip_channel(row_info, png_ptr->row_buf + 1, | ||||
|           !(png_ptr->flags & PNG_FLAG_FILLER_AFTER)); | ||||
| #endif | ||||
|  | ||||
|          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; | ||||
| #ifdef PNG_WRITE_PACKSWAP_SUPPORTED | ||||
|    if ((png_ptr->transformations & PNG_PACKSWAP) != 0) | ||||
|       png_do_packswap(row_info, png_ptr->row_buf + 1); | ||||
| #endif | ||||
|  | ||||
|          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; | ||||
| #ifdef PNG_WRITE_PACK_SUPPORTED | ||||
|    if ((png_ptr->transformations & PNG_PACK) != 0) | ||||
|       png_do_pack(row_info, png_ptr->row_buf + 1, | ||||
|           (png_uint_32)png_ptr->bit_depth); | ||||
| #endif | ||||
|  | ||||
|          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); | ||||
|          } | ||||
|       } | ||||
|    } | ||||
| #ifdef PNG_WRITE_SWAP_SUPPORTED | ||||
| #  ifdef PNG_16BIT_SUPPORTED | ||||
|    if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0) | ||||
|       png_do_swap(row_info, png_ptr->row_buf + 1); | ||||
| #  endif | ||||
| #endif | ||||
|  | ||||
| #ifdef PNG_WRITE_SHIFT_SUPPORTED | ||||
|    if ((png_ptr->transformations & PNG_SHIFT) != 0) | ||||
|       png_do_shift(row_info, png_ptr->row_buf + 1, | ||||
|            &(png_ptr->shift)); | ||||
| #endif | ||||
|  | ||||
| #ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED | ||||
|    if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0) | ||||
|       png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1); | ||||
| #endif | ||||
|  | ||||
| #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED | ||||
|    if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0) | ||||
|       png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1); | ||||
| #endif | ||||
|  | ||||
| #ifdef PNG_WRITE_BGR_SUPPORTED | ||||
|    if ((png_ptr->transformations & PNG_BGR) != 0) | ||||
|       png_do_bgr(row_info, png_ptr->row_buf + 1); | ||||
| #endif | ||||
|  | ||||
| #ifdef PNG_WRITE_INVERT_SUPPORTED | ||||
|    if ((png_ptr->transformations & PNG_INVERT_MONO) != 0) | ||||
|       png_do_invert(row_info, png_ptr->row_buf + 1); | ||||
| #endif | ||||
| } | ||||
| #endif /* PNG_MNG_FEATURES_SUPPORTED */ | ||||
| #endif /* PNG_WRITE_SUPPORTED */ | ||||
| #endif /* WRITE_TRANSFORMS */ | ||||
| #endif /* WRITE */ | ||||
|   | ||||
							
								
								
									
										3697
									
								
								PDF/src/pngwutil.c
									
									
									
									
									
								
							
							
						
						
									
										3697
									
								
								PDF/src/pngwutil.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user
	 Matej Kenda
					Matej Kenda