mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	dep: Add libpng 1.6.43
This commit is contained in:
		
							parent
							
								
									250b1bea8f
								
							
						
					
					
						commit
						b749c483da
					
				|  | @ -2,10 +2,21 @@ if(ENABLE_SDL2) | |||
|   find_package(SDL2 2.30.0 REQUIRED) | ||||
| endif() | ||||
| if(NOT WIN32 AND NOT ANDROID) | ||||
|   find_package(CURL REQUIRED) | ||||
|   # From PCSX2: On macOS, Mono.framework contains an ancient version of libpng. We don't want that. | ||||
|   # Avoid it by telling cmake to avoid finding frameworks while we search for libpng. | ||||
|   if(APPLE) | ||||
|     set(FIND_FRAMEWORK_BACKUP ${CMAKE_FIND_FRAMEWORK}) | ||||
|     set(CMAKE_FIND_FRAMEWORK NEVER) | ||||
|   endif() | ||||
| 
 | ||||
|   find_package(Zstd REQUIRED) | ||||
| 	find_package(WebP REQUIRED) | ||||
|   find_package(WebP REQUIRED) | ||||
|   find_package(ZLIB REQUIRED) | ||||
|   find_package(PNG REQUIRED) | ||||
|   find_package(CURL REQUIRED) | ||||
|   if(APPLE) | ||||
|     set(CMAKE_FIND_FRAMEWORK ${FIND_FRAMEWORK_BACKUP}) | ||||
|   endif() | ||||
| endif() | ||||
| if(LINUX AND NOT ANDROID) | ||||
|   find_package(UDEV REQUIRED) | ||||
|  |  | |||
|  | @ -35,9 +35,8 @@ disable_compiler_warnings_for_target(rapidyaml) | |||
| # Build dependencies on Windows/Android. | ||||
| if(WIN32 OR ANDROID) | ||||
|   add_subdirectory(zlib EXCLUDE_FROM_ALL) | ||||
|   disable_compiler_warnings_for_target(zlib) | ||||
|   add_subdirectory(zstd EXCLUDE_FROM_ALL) | ||||
|   disable_compiler_warnings_for_target(zstd) | ||||
|   add_subdirectory(libpng EXCLUDE_FROM_ALL) | ||||
| endif() | ||||
| 
 | ||||
| if(ENABLE_CUBEB) | ||||
|  |  | |||
							
								
								
									
										63
									
								
								dep/libpng/ANNOUNCE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								dep/libpng/ANNOUNCE
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,63 @@ | |||
| libpng 1.6.43 - February 23, 2024 | ||||
| ================================= | ||||
| 
 | ||||
| This is a public release of libpng, intended for use in production code. | ||||
| 
 | ||||
| 
 | ||||
| Files available for download | ||||
| ---------------------------- | ||||
| 
 | ||||
| Source files with LF line endings (for Unix/Linux): | ||||
| 
 | ||||
|  * libpng-1.6.43.tar.xz (LZMA-compressed, recommended) | ||||
|  * libpng-1.6.43.tar.gz (deflate-compressed) | ||||
| 
 | ||||
| Source files with CRLF line endings (for Windows): | ||||
| 
 | ||||
|  * lpng1643.7z (LZMA-compressed, recommended) | ||||
|  * lpng1643.zip (deflate-compressed) | ||||
| 
 | ||||
| Other information: | ||||
| 
 | ||||
|  * README.md | ||||
|  * LICENSE.md | ||||
|  * AUTHORS.md | ||||
|  * TRADEMARK.md | ||||
| 
 | ||||
| 
 | ||||
| Changes from version 1.6.42 to version 1.6.43 | ||||
| --------------------------------------------- | ||||
| 
 | ||||
|  * Fixed the row width check in png_check_IHDR(). | ||||
|    This corrected a bug that was specific to the 16-bit platforms, | ||||
|    and removed a spurious compiler warning from the 64-bit builds. | ||||
|    (Reported by Jacek Caban; fixed by John Bowler) | ||||
|  * Added eXIf chunk support to the push-mode reader in pngpread.c. | ||||
|    (Contributed by Chris Blume) | ||||
|  * Added contrib/pngexif for the benefit of the users who would like | ||||
|    to inspect the content of eXIf chunks. | ||||
|  * Added contrib/conftest/basic.dfa, a basic build-time configuration. | ||||
|    (Contributed by John Bowler) | ||||
|  * Fixed a preprocessor condition in pngread.c that broke build-time | ||||
|    configurations like contrib/conftest/pngcp.dfa. | ||||
|    (Contributed by John Bowler) | ||||
|  * Added CMake build support for LoongArch LSX. | ||||
|    (Contributed by GuXiWei) | ||||
|  * Fixed a CMake build error that occurred under a peculiar state of the | ||||
|    dependency tree. This was a regression introduced in libpng-1.6.41. | ||||
|    (Contributed by Dan Rosser) | ||||
|  * Marked the installed libpng headers as system headers in CMake. | ||||
|    (Contributed by Benjamin Buch) | ||||
|  * Updated the build support for RISCOS. | ||||
|    (Contributed by Cameron Cawley) | ||||
|  * Updated the makefiles to allow cross-platform builds to initialize | ||||
|    conventional make variables like AR and ARFLAGS. | ||||
|  * Added various improvements to the CI scripts in areas like version | ||||
|    consistency verification and text linting. | ||||
|  * Added version consistency verification to pngtest.c also. | ||||
| 
 | ||||
| 
 | ||||
| Send comments/corrections/commendations to png-mng-implement at lists.sf.net. | ||||
| Subscription is required; visit | ||||
| https://lists.sourceforge.net/lists/listinfo/png-mng-implement | ||||
| to subscribe. | ||||
							
								
								
									
										61
									
								
								dep/libpng/AUTHORS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								dep/libpng/AUTHORS
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,61 @@ | |||
| PNG REFERENCE LIBRARY AUTHORS | ||||
| ============================= | ||||
| 
 | ||||
| This is the list of PNG Reference Library ("libpng") Contributing | ||||
| Authors, for copyright and licensing purposes. | ||||
| 
 | ||||
|  * Adam Richter | ||||
|  * Andreas Dilger | ||||
|  * Chris Blume | ||||
|  * Cosmin Truta | ||||
|  * Dave Martindale | ||||
|  * Eric S. Raymond | ||||
|  * Gilles Vollant | ||||
|  * Glenn Randers-Pehrson | ||||
|  * Greg Roelofs | ||||
|  * Guy Eric Schalnat | ||||
|  * James Yu | ||||
|  * John Bowler | ||||
|  * Kevin Bracey | ||||
|  * Magnus Holmgren | ||||
|  * Mandar Sahastrabuddhe | ||||
|  * Mans Rullgard | ||||
|  * Matt Sarett | ||||
|  * Mike Klein | ||||
|  * Pascal Massimino | ||||
|  * Paul Schmidt | ||||
|  * Philippe Antoine | ||||
|  * Qiang Zhou | ||||
|  * Sam Bushell | ||||
|  * Samuel Williams | ||||
|  * Simon-Pierre Cadieux | ||||
|  * Tim Wegner | ||||
|  * Tom Lane | ||||
|  * Tom Tanner | ||||
|  * Vadim Barkov | ||||
|  * Willem van Schaik | ||||
|  * Zhijie Liang | ||||
|  * Apple Inc. | ||||
|     - Zixu Wang (王子旭) | ||||
|  * Arm Holdings | ||||
|     - Richard Townsend | ||||
|  * Google Inc. | ||||
|     - Dan Field | ||||
|     - Leon Scroggins III | ||||
|     - Matt Sarett | ||||
|     - Mike Klein | ||||
|     - Sami Boukortt | ||||
|     - Wan-Teh Chang | ||||
|  * Loongson Technology Corporation Ltd. | ||||
|     - GuXiWei (顾希伟) | ||||
|     - JinBo (金波) | ||||
|     - ZhangLixia (张利霞) | ||||
| 
 | ||||
| The build projects, the build scripts, the test scripts, and other | ||||
| files in the "projects", "scripts" and "tests" directories, have | ||||
| other copyright owners, but are released under the libpng license. | ||||
| 
 | ||||
| Some files in the "ci" and "contrib" directories, as well as some | ||||
| of the tools-generated files that are distributed with libpng, have | ||||
| other copyright owners, and are released under other open source | ||||
| licenses. | ||||
							
								
								
									
										6202
									
								
								dep/libpng/CHANGES
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6202
									
								
								dep/libpng/CHANGES
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										39
									
								
								dep/libpng/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								dep/libpng/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,39 @@ | |||
| add_library(png | ||||
|   src/png.c | ||||
|   src/pngerror.c | ||||
|   src/pngget.c | ||||
|   src/pngmem.c | ||||
|   src/pngpread.c | ||||
|   src/pngread.c | ||||
|   src/pngrio.c | ||||
|   src/pngrtran.c | ||||
|   src/pngrutil.c | ||||
|   src/pngset.c | ||||
|   src/pngtrans.c | ||||
|   src/pngwio.c | ||||
|   src/pngwrite.c | ||||
|   src/pngwtran.c | ||||
|   src/pngwutil.c | ||||
| ) | ||||
| 
 | ||||
| if(CPU_ARCH_X64) | ||||
|   target_sources(png PRIVATE | ||||
|     src/intel/filter_sse2_intrinsics.c | ||||
|     src/intel/intel_init.c | ||||
|   ) | ||||
|   target_compile_definitions(png PRIVATE "PNG_INTEL_SSE") | ||||
| elseif(CPU_ARCH_ARM32 OR CPU_ARCH_ARM64) | ||||
|   target_sources(png PRIVATE | ||||
|     src/arm/arm_init.c | ||||
|     src/arm/filter_neon.S | ||||
|     src/arm/filter_neon_intrinsics.c | ||||
|     src/arm/palette_neon_intrinsics.c | ||||
|   ) | ||||
| endif() | ||||
| 
 | ||||
| target_link_libraries(png PRIVATE ZLIB::ZLIB) | ||||
| target_include_directories(png PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include") | ||||
| target_include_directories(png PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src") | ||||
| disable_compiler_warnings_for_target(png) | ||||
| 
 | ||||
| add_library(PNG::PNG ALIAS png) | ||||
							
								
								
									
										134
									
								
								dep/libpng/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								dep/libpng/LICENSE
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,134 @@ | |||
| COPYRIGHT NOTICE, DISCLAIMER, and LICENSE | ||||
| ========================================= | ||||
| 
 | ||||
| PNG Reference Library License version 2 | ||||
| --------------------------------------- | ||||
| 
 | ||||
|  * Copyright (c) 1995-2024 The PNG Reference Library Authors. | ||||
|  * Copyright (c) 2018-2024 Cosmin Truta. | ||||
|  * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. | ||||
|  * Copyright (c) 1996-1997 Andreas Dilger. | ||||
|  * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. | ||||
| 
 | ||||
| The software is supplied "as is", without warranty of any kind, | ||||
| express or implied, including, without limitation, the warranties | ||||
| of merchantability, fitness for a particular purpose, title, and | ||||
| non-infringement.  In no event shall the Copyright owners, or | ||||
| anyone distributing the software, be liable for any damages or | ||||
| other liability, whether in contract, tort or otherwise, arising | ||||
| from, out of, or in connection with the software, or the use or | ||||
| other dealings in the software, even if advised of the possibility | ||||
| of such damage. | ||||
| 
 | ||||
| Permission is hereby granted to use, copy, modify, and distribute | ||||
| this software, or portions hereof, for any purpose, without fee, | ||||
| subject to the following restrictions: | ||||
| 
 | ||||
|  1. The origin of this software must not be misrepresented; you | ||||
|     must not claim that you wrote the original software.  If you | ||||
|     use this software in a product, an acknowledgment in the product | ||||
|     documentation would be appreciated, but is not required. | ||||
| 
 | ||||
|  2. Altered source versions must be plainly marked as such, and must | ||||
|     not be misrepresented as being the original software. | ||||
| 
 | ||||
|  3. This Copyright notice may not be removed or altered from any | ||||
|     source or altered source distribution. | ||||
| 
 | ||||
| 
 | ||||
| PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) | ||||
| ----------------------------------------------------------------------- | ||||
| 
 | ||||
| libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are | ||||
| Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are | ||||
| derived from libpng-1.0.6, and are distributed according to the same | ||||
| disclaimer and license as libpng-1.0.6 with the following individuals | ||||
| added to the list of Contributing Authors: | ||||
| 
 | ||||
|     Simon-Pierre Cadieux | ||||
|     Eric S. Raymond | ||||
|     Mans Rullgard | ||||
|     Cosmin Truta | ||||
|     Gilles Vollant | ||||
|     James Yu | ||||
|     Mandar Sahastrabuddhe | ||||
|     Google Inc. | ||||
|     Vadim Barkov | ||||
| 
 | ||||
| and with the following additions to the disclaimer: | ||||
| 
 | ||||
|     There is no warranty against interference with your enjoyment of | ||||
|     the library or against infringement.  There is no warranty that our | ||||
|     efforts or the library will fulfill any of your particular purposes | ||||
|     or needs.  This library is provided with all faults, and the entire | ||||
|     risk of satisfactory quality, performance, accuracy, and effort is | ||||
|     with the user. | ||||
| 
 | ||||
| Some files in the "contrib" directory and some configure-generated | ||||
| files that are distributed with libpng have other copyright owners, and | ||||
| are released under other open source licenses. | ||||
| 
 | ||||
| libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are | ||||
| Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from | ||||
| libpng-0.96, and are distributed according to the same disclaimer and | ||||
| license as libpng-0.96, with the following individuals added to the | ||||
| list of Contributing Authors: | ||||
| 
 | ||||
|     Tom Lane | ||||
|     Glenn Randers-Pehrson | ||||
|     Willem van Schaik | ||||
| 
 | ||||
| libpng versions 0.89, June 1996, through 0.96, May 1997, are | ||||
| Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, | ||||
| and are distributed according to the same disclaimer and license as | ||||
| libpng-0.88, with the following individuals added to the list of | ||||
| Contributing Authors: | ||||
| 
 | ||||
|     John Bowler | ||||
|     Kevin Bracey | ||||
|     Sam Bushell | ||||
|     Magnus Holmgren | ||||
|     Greg Roelofs | ||||
|     Tom Tanner | ||||
| 
 | ||||
| Some files in the "scripts" directory have other copyright owners, | ||||
| but are released under this license. | ||||
| 
 | ||||
| libpng versions 0.5, May 1995, through 0.88, January 1996, are | ||||
| Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. | ||||
| 
 | ||||
| For the purposes of this copyright and license, "Contributing Authors" | ||||
| is defined as the following set of individuals: | ||||
| 
 | ||||
|     Andreas Dilger | ||||
|     Dave Martindale | ||||
|     Guy Eric Schalnat | ||||
|     Paul Schmidt | ||||
|     Tim Wegner | ||||
| 
 | ||||
| The PNG Reference Library is supplied "AS IS".  The Contributing | ||||
| Authors and Group 42, Inc. disclaim all warranties, expressed or | ||||
| implied, including, without limitation, the warranties of | ||||
| merchantability and of fitness for any purpose.  The Contributing | ||||
| Authors and Group 42, Inc. assume no liability for direct, indirect, | ||||
| incidental, special, exemplary, or consequential damages, which may | ||||
| result from the use of the PNG Reference Library, even if advised of | ||||
| the possibility of such damage. | ||||
| 
 | ||||
| Permission is hereby granted to use, copy, modify, and distribute this | ||||
| source code, or portions hereof, for any purpose, without fee, subject | ||||
| to the following restrictions: | ||||
| 
 | ||||
|  1. The origin of this source code must not be misrepresented. | ||||
| 
 | ||||
|  2. Altered versions must be plainly marked as such and must not | ||||
|     be misrepresented as being the original source. | ||||
| 
 | ||||
|  3. This Copyright notice may not be removed or altered from any | ||||
|     source or altered source distribution. | ||||
| 
 | ||||
| The Contributing Authors and Group 42, Inc. specifically permit, | ||||
| without fee, and encourage the use of this source code as a component | ||||
| to supporting the PNG file format in commercial products.  If you use | ||||
| this source code in a product, acknowledgment is not required but would | ||||
| be appreciated. | ||||
							
								
								
									
										184
									
								
								dep/libpng/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								dep/libpng/README
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,184 @@ | |||
| README for libpng version 1.6.43 | ||||
| ================================ | ||||
| 
 | ||||
| See the note about version numbers near the top of `png.h`. | ||||
| See `INSTALL` for instructions on how to install libpng. | ||||
| 
 | ||||
| Libpng comes in several distribution formats.  Get `libpng-*.tar.gz` | ||||
| or `libpng-*.tar.xz` if you want UNIX-style line endings in the text | ||||
| files, or `lpng*.7z` or `lpng*.zip` if you want DOS-style line endings. | ||||
| 
 | ||||
| For a detailed description on using libpng, read `libpng-manual.txt`. | ||||
| For examples of libpng in a program, see `example.c` and `pngtest.c`. | ||||
| For usage information and restrictions (what little they are) on libpng, | ||||
| see `png.h`.  For a description on using zlib (the compression library | ||||
| used by libpng) and zlib's restrictions, see `zlib.h`. | ||||
| 
 | ||||
| You should use zlib 1.0.4 or later to run this, but it _may_ work with | ||||
| versions as old as zlib 0.95.  Even so, there are bugs in older zlib | ||||
| versions which can cause the output of invalid compression streams for | ||||
| some images. | ||||
| 
 | ||||
| You should also note that zlib is a compression library that is useful | ||||
| for more things than just PNG files.  You can use zlib as a drop-in | ||||
| replacement for `fread()` and `fwrite()`, if you are so inclined. | ||||
| 
 | ||||
| zlib should be available at the same place that libpng is, or at | ||||
| https://zlib.net . | ||||
| 
 | ||||
| You may also want a copy of the PNG specification.  It is available | ||||
| as an RFC, a W3C Recommendation, and an ISO/IEC Standard.  You can find | ||||
| these at http://www.libpng.org/pub/png/pngdocs.html . | ||||
| 
 | ||||
| This code is currently being archived at https://libpng.sourceforge.io | ||||
| in the download area, and at http://libpng.download/src . | ||||
| 
 | ||||
| This release, based in a large way on Glenn's, Guy's and Andreas' | ||||
| earlier work, was created and will be supported by myself and the PNG | ||||
| development group. | ||||
| 
 | ||||
| Send comments, corrections and commendations to `png-mng-implement` | ||||
| at `lists.sourceforge.net`.  (Subscription is required; visit | ||||
| https://lists.sourceforge.net/lists/listinfo/png-mng-implement | ||||
| to subscribe.) | ||||
| 
 | ||||
| Send general questions about the PNG specification to `png-mng-misc` | ||||
| at `lists.sourceforge.net`.  (Subscription is required; visit | ||||
| https://lists.sourceforge.net/lists/listinfo/png-mng-misc | ||||
| to subscribe.) | ||||
| 
 | ||||
| Historical notes | ||||
| ---------------- | ||||
| 
 | ||||
| The libpng library has been in extensive use and testing since mid-1995. | ||||
| Version 0.89, published a year later, was the first official release. | ||||
| By late 1997, it had finally gotten to the stage where there hadn't | ||||
| been significant changes to the API in some time, and people have a bad | ||||
| feeling about libraries with versions below 1.0.  Version 1.0.0 was | ||||
| released in March 1998. | ||||
| 
 | ||||
| Note that some of the changes to the `png_info` structure render this | ||||
| version of the library binary incompatible with libpng-0.89 or | ||||
| earlier versions if you are using a shared library.  The type of the | ||||
| `filler` parameter for `png_set_filler()` has changed from `png_byte` | ||||
| to `png_uint_32`, which will affect shared-library applications that | ||||
| use this function. | ||||
| 
 | ||||
| To avoid problems with changes to the internals of the `info_struct`, | ||||
| new APIs have been made available in 0.95 to avoid direct application | ||||
| access to `info_ptr`.  These functions are the `png_set_<chunk>` and | ||||
| `png_get_<chunk>` functions.  These functions should be used when | ||||
| accessing/storing the `info_struct` data, rather than manipulating it | ||||
| directly, to avoid such problems in the future. | ||||
| 
 | ||||
| It is important to note that the APIs did not make current programs | ||||
| that access the info struct directly incompatible with the new | ||||
| library, through libpng-1.2.x.  In libpng-1.4.x, which was meant to | ||||
| be a transitional release, members of the `png_struct` and the | ||||
| `info_struct` can still be accessed, but the compiler will issue a | ||||
| warning about deprecated usage.  Since libpng-1.5.0, direct access | ||||
| to these structs is not allowed, and the definitions of the structs | ||||
| reside in private `pngstruct.h` and `pnginfo.h` header files that are | ||||
| not accessible to applications.  It is strongly suggested that new | ||||
| programs use the new APIs (as shown in `example.c` and `pngtest.c`), | ||||
| and older programs be converted to the new format, to facilitate | ||||
| upgrades in the future. | ||||
| 
 | ||||
| The additions since 0.89 include the ability to read from a PNG stream | ||||
| which has had some (or all) of the signature bytes read by the calling | ||||
| application.  This also allows the reading of embedded PNG streams that | ||||
| do not have the PNG file signature.  As well, it is now possible to set | ||||
| the library action on the detection of chunk CRC errors.  It is possible | ||||
| to set different actions based on whether the CRC error occurred in a | ||||
| critical or an ancillary chunk. | ||||
| 
 | ||||
| The additions since 0.90 include the ability to compile libpng as a | ||||
| Windows DLL, and new APIs for accessing data in the `info_struct`. | ||||
| Experimental functions included the ability to set weighting and cost | ||||
| factors for row filter selection, direct reads of integers from buffers | ||||
| on big-endian processors that support misaligned data access, faster | ||||
| methods of doing alpha composition, and more accurate 16-to-8 bit color | ||||
| conversion.  Some of these experimental functions, such as the weighted | ||||
| filter heuristics, have since been removed. | ||||
| 
 | ||||
| Files included in this distribution | ||||
| ----------------------------------- | ||||
| 
 | ||||
|     ANNOUNCE      =>  Announcement of this version, with recent changes | ||||
|     AUTHORS       =>  List of contributing authors | ||||
|     CHANGES       =>  Description of changes between libpng versions | ||||
|     INSTALL       =>  Instructions to install libpng | ||||
|     LICENSE       =>  License to use and redistribute libpng | ||||
|     README        =>  This file | ||||
|     TODO          =>  Things not implemented in the current library | ||||
|     TRADEMARK     =>  Trademark information | ||||
|     example.c     =>  Example code for using libpng functions | ||||
|     libpng.3      =>  Manual page for libpng (includes libpng-manual.txt) | ||||
|     libpng-manual.txt  =>  Description of libpng and its functions | ||||
|     libpngpf.3    =>  Manual page for libpng's private functions (deprecated) | ||||
|     png.5         =>  Manual page for the PNG format | ||||
|     png.c         =>  Basic interface functions common to library | ||||
|     png.h         =>  Library function and interface declarations (public) | ||||
|     pngpriv.h     =>  Library function and interface declarations (private) | ||||
|     pngconf.h     =>  System specific library configuration (public) | ||||
|     pngstruct.h   =>  png_struct declaration (private) | ||||
|     pnginfo.h     =>  png_info struct declaration (private) | ||||
|     pngdebug.h    =>  debugging macros (private) | ||||
|     pngerror.c    =>  Error/warning message I/O functions | ||||
|     pngget.c      =>  Functions for retrieving info from struct | ||||
|     pngmem.c      =>  Memory handling functions | ||||
|     pngbar.png    =>  PNG logo, 88x31 | ||||
|     pngnow.png    =>  PNG logo, 98x31 | ||||
|     pngpread.c    =>  Progressive reading functions | ||||
|     pngread.c     =>  Read data/helper high-level functions | ||||
|     pngrio.c      =>  Lowest-level data read I/O functions | ||||
|     pngrtran.c    =>  Read data transformation functions | ||||
|     pngrutil.c    =>  Read data utility functions | ||||
|     pngset.c      =>  Functions for storing data into the info_struct | ||||
|     pngtest.c     =>  Library test program | ||||
|     pngtest.png   =>  Library test sample image | ||||
|     pngtrans.c    =>  Common data transformation functions | ||||
|     pngwio.c      =>  Lowest-level write I/O functions | ||||
|     pngwrite.c    =>  High-level write functions | ||||
|     pngwtran.c    =>  Write data transformations | ||||
|     pngwutil.c    =>  Write utility functions | ||||
|     arm/          =>  Optimized code for ARM Neon | ||||
|     intel/        =>  Optimized code for INTEL SSE2 | ||||
|     loongarch/    =>  Optimized code for LoongArch LSX | ||||
|     mips/         =>  Optimized code for MIPS MSA and MIPS MMI | ||||
|     powerpc/      =>  Optimized code for PowerPC VSX | ||||
|     ci/           =>  Scripts for continuous integration | ||||
|     contrib/      =>  External contributions | ||||
|         arm-neon/     =>  Optimized code for the ARM-NEON platform | ||||
|         mips-msa/     =>  Optimized code for the MIPS-MSA platform | ||||
|         powerpc-vsx/  =>  Optimized code for the POWERPC-VSX platform | ||||
|         examples/     =>  Examples of libpng usage | ||||
|         gregbook/     =>  Source code for PNG reading and writing, from | ||||
|                           "PNG: The Definitive Guide" by Greg Roelofs, | ||||
|                           O'Reilly, 1999 | ||||
|         libtests/     =>  Test programs | ||||
|         oss-fuzz/     =>  Files used by the OSS-Fuzz project for fuzz-testing | ||||
|                           libpng | ||||
|         pngexif/      =>  Program to inspect the EXIF information in PNG files | ||||
|         pngminim/     =>  Minimal decoder, encoder, and progressive decoder | ||||
|                           programs demonstrating the use of pngusr.dfa | ||||
|         pngminus/     =>  Simple pnm2png and png2pnm programs | ||||
|         pngsuite/     =>  Test images | ||||
|         testpngs/     =>  Test images | ||||
|         tools/        =>  Various tools | ||||
|         visupng/      =>  VisualPng, a Windows viewer for PNG images | ||||
|     projects/     =>  Project files and workspaces for various IDEs | ||||
|         owatcom/      =>  OpenWatcom project | ||||
|         visualc71/    =>  Microsoft Visual C++ 7.1 workspace | ||||
|         vstudio/      =>  Microsoft Visual Studio workspace | ||||
|     scripts/      =>  Scripts and makefiles for building libpng | ||||
|                       (see scripts/README.txt for the complete list) | ||||
|     tests/        =>  Test scripts | ||||
| 
 | ||||
| Good luck, and happy coding! | ||||
| 
 | ||||
|  * Cosmin Truta (current maintainer, since 2018) | ||||
|  * Glenn Randers-Pehrson (former maintainer, 1998-2018) | ||||
|  * Andreas Eric Dilger (former maintainer, 1996-1997) | ||||
|  * Guy Eric Schalnat (original author and former maintainer, 1995-1996) | ||||
|    (formerly of Group 42, Inc.) | ||||
							
								
								
									
										23
									
								
								dep/libpng/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								dep/libpng/TODO
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | |||
| TODO - list of things to do for libpng: | ||||
| 
 | ||||
| * Fix all defects (duh!) | ||||
| * Better C++ wrapper / full C++ implementation (?) | ||||
| * Fix the problems with C++ and 'extern "C"'. | ||||
| * cHRM transformation. | ||||
| * Palette creation. | ||||
| * "grayscale->palette" transformation and "palette->grayscale" detection. | ||||
| * Improved dithering. | ||||
| * Multi-lingual error and warning message support. | ||||
| * Complete sRGB transformation.  (Currently it simply uses gamma=0.45455.) | ||||
| * Man pages for function calls. | ||||
| * Better documentation. | ||||
| * Better filter selection | ||||
|   (e.g., counting huffman bits/precompression; filter inertia; filter costs). | ||||
| * Histogram creation. | ||||
| * Text conversion between different code pages (e.g., Latin-1 -> Mac). | ||||
| * Avoid building gamma tables whenever possible. | ||||
| * Greater precision in changing to linear gamma for compositing against | ||||
|   background, and in doing rgb-to-gray transformations. | ||||
| * Investigate pre-incremented loop counters and other loop constructions. | ||||
| * Interpolated method of handling interlacing. | ||||
| * More validations for libpng transformations. | ||||
							
								
								
									
										8
									
								
								dep/libpng/TRADEMARK
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								dep/libpng/TRADEMARK
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | |||
| TRADEMARK | ||||
| ========= | ||||
| 
 | ||||
| The name "libpng" has not been registered by the Copyright owners | ||||
| as a trademark in any jurisdiction.  However, because libpng has | ||||
| been distributed and maintained world-wide, continually since 1995, | ||||
| the Copyright owners claim "common-law trademark protection" in any | ||||
| jurisdiction where common-law trademark is recognized. | ||||
							
								
								
									
										3250
									
								
								dep/libpng/include/png.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3250
									
								
								dep/libpng/include/png.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										623
									
								
								dep/libpng/include/pngconf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										623
									
								
								dep/libpng/include/pngconf.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,623 @@ | |||
| 
 | ||||
| /* pngconf.h - machine-configurable file for libpng
 | ||||
|  * | ||||
|  * libpng version 1.6.43 | ||||
|  * | ||||
|  * Copyright (c) 2018-2024 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 | ||||
|  * | ||||
|  * Any machine specific code is near the front of this file, so if you | ||||
|  * are configuring libpng for a machine, you may want to read the section | ||||
|  * starting here down to where it starts to typedef png_color, png_text, | ||||
|  * and png_info. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef PNGCONF_H | ||||
| #define PNGCONF_H | ||||
| 
 | ||||
| #ifndef PNG_BUILDING_SYMBOL_TABLE /* else includes may cause problems */ | ||||
| 
 | ||||
| /* From libpng 1.6.0 libpng requires an ANSI X3.159-1989 ("ISOC90") compliant C
 | ||||
|  * compiler for correct compilation.  The following header files are required by | ||||
|  * the standard.  If your compiler doesn't provide these header files, or they | ||||
|  * do not match the standard, you will need to provide/improve them. | ||||
|  */ | ||||
| #include <limits.h> | ||||
| #include <stddef.h> | ||||
| 
 | ||||
| /* Library header files.  These header files are all defined by ISOC90; libpng
 | ||||
|  * expects conformant implementations, however, an ISOC90 conformant system need | ||||
|  * not provide these header files if the functionality cannot be implemented. | ||||
|  * In this case it will be necessary to disable the relevant parts of libpng in | ||||
|  * the build of pnglibconf.h. | ||||
|  * | ||||
|  * Prior to 1.6.0 string.h was included here; the API changes in 1.6.0 to not | ||||
|  * include this unnecessary header file. | ||||
|  */ | ||||
| 
 | ||||
| #ifdef PNG_STDIO_SUPPORTED | ||||
|    /* Required for the definition of FILE: */ | ||||
| #  include <stdio.h> | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_SETJMP_SUPPORTED | ||||
|    /* Required for the definition of jmp_buf and the declaration of longjmp: */ | ||||
| #  include <setjmp.h> | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_CONVERT_tIME_SUPPORTED | ||||
|    /* Required for struct tm: */ | ||||
| #  include <time.h> | ||||
| #endif | ||||
| 
 | ||||
| #endif /* PNG_BUILDING_SYMBOL_TABLE */ | ||||
| 
 | ||||
| /* Prior to 1.6.0, it was possible to turn off 'const' in declarations,
 | ||||
|  * using PNG_NO_CONST.  This is no longer supported. | ||||
|  */ | ||||
| #define PNG_CONST const /* backward compatibility only */ | ||||
| 
 | ||||
| /* This controls optimization of the reading of 16-bit and 32-bit
 | ||||
|  * values from PNG files.  It can be set on a per-app-file basis: it | ||||
|  * just changes whether a macro is used when the function is called. | ||||
|  * The library builder sets the default; if read functions are not | ||||
|  * built into the library the macro implementation is forced on. | ||||
|  */ | ||||
| #ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED | ||||
| #  define PNG_USE_READ_MACROS | ||||
| #endif | ||||
| #if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS) | ||||
| #  if PNG_DEFAULT_READ_MACROS | ||||
| #    define PNG_USE_READ_MACROS | ||||
| #  endif | ||||
| #endif | ||||
| 
 | ||||
| /* COMPILER SPECIFIC OPTIONS.
 | ||||
|  * | ||||
|  * These options are provided so that a variety of difficult compilers | ||||
|  * can be used.  Some are fixed at build time (e.g. PNG_API_RULE | ||||
|  * below) but still have compiler specific implementations, others | ||||
|  * may be changed on a per-file basis when compiling against libpng. | ||||
|  */ | ||||
| 
 | ||||
| /* The PNGARG macro was used in versions of libpng prior to 1.6.0 to protect
 | ||||
|  * against legacy (pre ISOC90) compilers that did not understand function | ||||
|  * prototypes.  It is not required for modern C compilers. | ||||
|  */ | ||||
| #ifndef PNGARG | ||||
| #  define PNGARG(arglist) arglist | ||||
| #endif | ||||
| 
 | ||||
| /* Function calling conventions.
 | ||||
|  * ============================= | ||||
|  * Normally it is not necessary to specify to the compiler how to call | ||||
|  * a function - it just does it - however on x86 systems derived from | ||||
|  * Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems | ||||
|  * and some others) there are multiple ways to call a function and the | ||||
|  * default can be changed on the compiler command line.  For this reason | ||||
|  * libpng specifies the calling convention of every exported function and | ||||
|  * every function called via a user supplied function pointer.  This is | ||||
|  * done in this file by defining the following macros: | ||||
|  * | ||||
|  * PNGAPI    Calling convention for exported functions. | ||||
|  * PNGCBAPI  Calling convention for user provided (callback) functions. | ||||
|  * PNGCAPI   Calling convention used by the ANSI-C library (required | ||||
|  *           for longjmp callbacks and sometimes used internally to | ||||
|  *           specify the calling convention for zlib). | ||||
|  * | ||||
|  * These macros should never be overridden.  If it is necessary to | ||||
|  * change calling convention in a private build this can be done | ||||
|  * by setting PNG_API_RULE (which defaults to 0) to one of the values | ||||
|  * below to select the correct 'API' variants. | ||||
|  * | ||||
|  * PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout. | ||||
|  *                This is correct in every known environment. | ||||
|  * PNG_API_RULE=1 Use the operating system convention for PNGAPI and | ||||
|  *                the 'C' calling convention (from PNGCAPI) for | ||||
|  *                callbacks (PNGCBAPI).  This is no longer required | ||||
|  *                in any known environment - if it has to be used | ||||
|  *                please post an explanation of the problem to the | ||||
|  *                libpng mailing list. | ||||
|  * | ||||
|  * These cases only differ if the operating system does not use the C | ||||
|  * calling convention, at present this just means the above cases | ||||
|  * (x86 DOS/Windows systems) and, even then, this does not apply to | ||||
|  * Cygwin running on those systems. | ||||
|  * | ||||
|  * Note that the value must be defined in pnglibconf.h so that what | ||||
|  * the application uses to call the library matches the conventions | ||||
|  * set when building the library. | ||||
|  */ | ||||
| 
 | ||||
| /* Symbol export
 | ||||
|  * ============= | ||||
|  * When building a shared library it is almost always necessary to tell | ||||
|  * the compiler which symbols to export.  The png.h macro 'PNG_EXPORT' | ||||
|  * is used to mark the symbols.  On some systems these symbols can be | ||||
|  * extracted at link time and need no special processing by the compiler, | ||||
|  * on other systems the symbols are flagged by the compiler and just | ||||
|  * the declaration requires a special tag applied (unfortunately) in a | ||||
|  * compiler dependent way.  Some systems can do either. | ||||
|  * | ||||
|  * A small number of older systems also require a symbol from a DLL to | ||||
|  * be flagged to the program that calls it.  This is a problem because | ||||
|  * we do not know in the header file included by application code that | ||||
|  * the symbol will come from a shared library, as opposed to a statically | ||||
|  * linked one.  For this reason the application must tell us by setting | ||||
|  * the magic flag PNG_USE_DLL to turn on the special processing before | ||||
|  * it includes png.h. | ||||
|  * | ||||
|  * Four additional macros are used to make this happen: | ||||
|  * | ||||
|  * PNG_IMPEXP The magic (if any) to cause a symbol to be exported from | ||||
|  *            the build or imported if PNG_USE_DLL is set - compiler | ||||
|  *            and system specific. | ||||
|  * | ||||
|  * PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to | ||||
|  *                       'type', compiler specific. | ||||
|  * | ||||
|  * PNG_DLL_EXPORT Set to the magic to use during a libpng build to | ||||
|  *                make a symbol exported from the DLL.  Not used in the | ||||
|  *                public header files; see pngpriv.h for how it is used | ||||
|  *                in the libpng build. | ||||
|  * | ||||
|  * PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come | ||||
|  *                from a DLL - used to define PNG_IMPEXP when | ||||
|  *                PNG_USE_DLL is set. | ||||
|  */ | ||||
| 
 | ||||
| /* System specific discovery.
 | ||||
|  * ========================== | ||||
|  * This code is used at build time to find PNG_IMPEXP, the API settings | ||||
|  * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL | ||||
|  * import processing is possible.  On Windows systems it also sets | ||||
|  * compiler-specific macros to the values required to change the calling | ||||
|  * conventions of the various functions. | ||||
|  */ | ||||
| #if defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || \ | ||||
|     defined(__CYGWIN__) | ||||
|   /* Windows system (DOS doesn't support DLLs).  Includes builds under Cygwin or
 | ||||
|    * MinGW on any architecture currently supported by Windows.  Also includes | ||||
|    * Watcom builds but these need special treatment because they are not | ||||
|    * compatible with GCC or Visual C because of different calling conventions. | ||||
|    */ | ||||
| #  if PNG_API_RULE == 2 | ||||
|    /* If this line results in an error, either because __watcall is not
 | ||||
|     * understood or because of a redefine just below you cannot use *this* | ||||
|     * build of the library with the compiler you are using.  *This* build was | ||||
|     * build using Watcom and applications must also be built using Watcom! | ||||
|     */ | ||||
| #    define PNGCAPI __watcall | ||||
| #  endif | ||||
| 
 | ||||
| #  if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800)) | ||||
| #    define PNGCAPI __cdecl | ||||
| #    if PNG_API_RULE == 1 | ||||
|    /* If this line results in an error __stdcall is not understood and
 | ||||
|     * PNG_API_RULE should not have been set to '1'. | ||||
|     */ | ||||
| #      define PNGAPI __stdcall | ||||
| #    endif | ||||
| #  else | ||||
|    /* An older compiler, or one not detected (erroneously) above,
 | ||||
|     * if necessary override on the command line to get the correct | ||||
|     * variants for the compiler. | ||||
|     */ | ||||
| #    ifndef PNGCAPI | ||||
| #      define PNGCAPI _cdecl | ||||
| #    endif | ||||
| #    if PNG_API_RULE == 1 && !defined(PNGAPI) | ||||
| #      define PNGAPI _stdcall | ||||
| #    endif | ||||
| #  endif /* compiler/api */ | ||||
| 
 | ||||
|   /* NOTE: PNGCBAPI always defaults to PNGCAPI. */ | ||||
| 
 | ||||
| #  if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD) | ||||
| #     error "PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed" | ||||
| #  endif | ||||
| 
 | ||||
| #  if (defined(_MSC_VER) && _MSC_VER < 800) ||\ | ||||
|       (defined(__BORLANDC__) && __BORLANDC__ < 0x500) | ||||
|    /* older Borland and MSC
 | ||||
|     * compilers used '__export' and required this to be after | ||||
|     * the type. | ||||
|     */ | ||||
| #    ifndef PNG_EXPORT_TYPE | ||||
| #      define PNG_EXPORT_TYPE(type) type PNG_IMPEXP | ||||
| #    endif | ||||
| #    define PNG_DLL_EXPORT __export | ||||
| #  else /* newer compiler */ | ||||
| #    define PNG_DLL_EXPORT __declspec(dllexport) | ||||
| #    ifndef PNG_DLL_IMPORT | ||||
| #      define PNG_DLL_IMPORT __declspec(dllimport) | ||||
| #    endif | ||||
| #  endif /* compiler */ | ||||
| 
 | ||||
| #else /* !Windows */ | ||||
| #  if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) | ||||
| #    define PNGAPI _System | ||||
| #  else /* !Windows/x86 && !OS/2 */ | ||||
|    /* Use the defaults, or define PNG*API on the command line (but
 | ||||
|     * this will have to be done for every compile!) | ||||
|     */ | ||||
| #  endif /* other system, !OS/2 */ | ||||
| #endif /* !Windows/x86 */ | ||||
| 
 | ||||
| /* Now do all the defaulting . */ | ||||
| #ifndef PNGCAPI | ||||
| #  define PNGCAPI | ||||
| #endif | ||||
| #ifndef PNGCBAPI | ||||
| #  define PNGCBAPI PNGCAPI | ||||
| #endif | ||||
| #ifndef PNGAPI | ||||
| #  define PNGAPI PNGCAPI | ||||
| #endif | ||||
| 
 | ||||
| /* PNG_IMPEXP may be set on the compilation system command line or (if not set)
 | ||||
|  * then in an internal header file when building the library, otherwise (when | ||||
|  * using the library) it is set here. | ||||
|  */ | ||||
| #ifndef PNG_IMPEXP | ||||
| #  if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT) | ||||
|    /* This forces use of a DLL, disallowing static linking */ | ||||
| #    define PNG_IMPEXP PNG_DLL_IMPORT | ||||
| #  endif | ||||
| 
 | ||||
| #  ifndef PNG_IMPEXP | ||||
| #    define PNG_IMPEXP | ||||
| #  endif | ||||
| #endif | ||||
| 
 | ||||
| /* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat
 | ||||
|  * 'attributes' as a storage class - the attributes go at the start of the | ||||
|  * function definition, and attributes are always appended regardless of the | ||||
|  * compiler.  This considerably simplifies these macros but may cause problems | ||||
|  * if any compilers both need function attributes and fail to handle them as | ||||
|  * a storage class (this is unlikely.) | ||||
|  */ | ||||
| #ifndef PNG_FUNCTION | ||||
| #  define PNG_FUNCTION(type, name, args, attributes) attributes type name args | ||||
| #endif | ||||
| 
 | ||||
| #ifndef PNG_EXPORT_TYPE | ||||
| #  define PNG_EXPORT_TYPE(type) PNG_IMPEXP type | ||||
| #endif | ||||
| 
 | ||||
|    /* The ordinal value is only relevant when preprocessing png.h for symbol
 | ||||
|     * table entries, so we discard it here.  See the .dfn files in the | ||||
|     * scripts directory. | ||||
|     */ | ||||
| 
 | ||||
| #ifndef PNG_EXPORTA | ||||
| #  define PNG_EXPORTA(ordinal, type, name, args, attributes) \ | ||||
|       PNG_FUNCTION(PNG_EXPORT_TYPE(type), (PNGAPI name), PNGARG(args), \ | ||||
|       PNG_LINKAGE_API attributes) | ||||
| #endif | ||||
| 
 | ||||
| /* ANSI-C (C90) does not permit a macro to be invoked with an empty argument,
 | ||||
|  * so make something non-empty to satisfy the requirement: | ||||
|  */ | ||||
| #define PNG_EMPTY /*empty list*/ | ||||
| 
 | ||||
| #define PNG_EXPORT(ordinal, type, name, args) \ | ||||
|    PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY) | ||||
| 
 | ||||
| /* Use PNG_REMOVED to comment out a removed interface. */ | ||||
| #ifndef PNG_REMOVED | ||||
| #  define PNG_REMOVED(ordinal, type, name, args, attributes) | ||||
| #endif | ||||
| 
 | ||||
| #ifndef PNG_CALLBACK | ||||
| #  define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args) | ||||
| #endif | ||||
| 
 | ||||
| /* Support for compiler specific function attributes.  These are used
 | ||||
|  * so that where compiler support is available incorrect use of API | ||||
|  * functions in png.h will generate compiler warnings. | ||||
|  * | ||||
|  * Added at libpng-1.2.41. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef PNG_NO_PEDANTIC_WARNINGS | ||||
| #  ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED | ||||
| #    define PNG_PEDANTIC_WARNINGS_SUPPORTED | ||||
| #  endif | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED | ||||
|   /* Support for compiler specific function attributes.  These are used
 | ||||
|    * so that where compiler support is available, incorrect use of API | ||||
|    * functions in png.h will generate compiler warnings.  Added at libpng | ||||
|    * version 1.2.41.  Disabling these removes the warnings but may also produce | ||||
|    * less efficient code. | ||||
|    */ | ||||
| #  if defined(__clang__) && defined(__has_attribute) | ||||
|    /* Clang defines both __clang__ and __GNUC__. Check __clang__ first. */ | ||||
| #    if !defined(PNG_USE_RESULT) && __has_attribute(__warn_unused_result__) | ||||
| #      define PNG_USE_RESULT __attribute__((__warn_unused_result__)) | ||||
| #    endif | ||||
| #    if !defined(PNG_NORETURN) && __has_attribute(__noreturn__) | ||||
| #      define PNG_NORETURN __attribute__((__noreturn__)) | ||||
| #    endif | ||||
| #    if !defined(PNG_ALLOCATED) && __has_attribute(__malloc__) | ||||
| #      define PNG_ALLOCATED __attribute__((__malloc__)) | ||||
| #    endif | ||||
| #    if !defined(PNG_DEPRECATED) && __has_attribute(__deprecated__) | ||||
| #      define PNG_DEPRECATED __attribute__((__deprecated__)) | ||||
| #    endif | ||||
| #    if !defined(PNG_PRIVATE) | ||||
| #      ifdef __has_extension | ||||
| #        if __has_extension(attribute_unavailable_with_message) | ||||
| #          define PNG_PRIVATE __attribute__((__unavailable__(\ | ||||
|              "This function is not exported by libpng."))) | ||||
| #        endif | ||||
| #      endif | ||||
| #    endif | ||||
| #    ifndef PNG_RESTRICT | ||||
| #      define PNG_RESTRICT __restrict | ||||
| #    endif | ||||
| 
 | ||||
| #  elif defined(__GNUC__) | ||||
| #    ifndef PNG_USE_RESULT | ||||
| #      define PNG_USE_RESULT __attribute__((__warn_unused_result__)) | ||||
| #    endif | ||||
| #    ifndef PNG_NORETURN | ||||
| #      define PNG_NORETURN   __attribute__((__noreturn__)) | ||||
| #    endif | ||||
| #    if __GNUC__ >= 3 | ||||
| #      ifndef PNG_ALLOCATED | ||||
| #        define PNG_ALLOCATED  __attribute__((__malloc__)) | ||||
| #      endif | ||||
| #      ifndef PNG_DEPRECATED | ||||
| #        define PNG_DEPRECATED __attribute__((__deprecated__)) | ||||
| #      endif | ||||
| #      ifndef PNG_PRIVATE | ||||
| #        if 0 /* Doesn't work so we use deprecated instead*/ | ||||
| #          define PNG_PRIVATE \ | ||||
|             __attribute__((warning("This function is not exported by libpng."))) | ||||
| #        else | ||||
| #          define PNG_PRIVATE \ | ||||
|             __attribute__((__deprecated__)) | ||||
| #        endif | ||||
| #      endif | ||||
| #      if ((__GNUC__ > 3) || !defined(__GNUC_MINOR__) || (__GNUC_MINOR__ >= 1)) | ||||
| #        ifndef PNG_RESTRICT | ||||
| #          define PNG_RESTRICT __restrict | ||||
| #        endif | ||||
| #      endif /* __GNUC__.__GNUC_MINOR__ > 3.0 */ | ||||
| #    endif /* __GNUC__ >= 3 */ | ||||
| 
 | ||||
| #  elif defined(_MSC_VER)  && (_MSC_VER >= 1300) | ||||
| #    ifndef PNG_USE_RESULT | ||||
| #      define PNG_USE_RESULT /* not supported */ | ||||
| #    endif | ||||
| #    ifndef PNG_NORETURN | ||||
| #      define PNG_NORETURN   __declspec(noreturn) | ||||
| #    endif | ||||
| #    ifndef PNG_ALLOCATED | ||||
| #      if (_MSC_VER >= 1400) | ||||
| #        define PNG_ALLOCATED __declspec(restrict) | ||||
| #      endif | ||||
| #    endif | ||||
| #    ifndef PNG_DEPRECATED | ||||
| #      define PNG_DEPRECATED __declspec(deprecated) | ||||
| #    endif | ||||
| #    ifndef PNG_PRIVATE | ||||
| #      define PNG_PRIVATE __declspec(deprecated) | ||||
| #    endif | ||||
| #    ifndef PNG_RESTRICT | ||||
| #      if (_MSC_VER >= 1400) | ||||
| #        define PNG_RESTRICT __restrict | ||||
| #      endif | ||||
| #    endif | ||||
| 
 | ||||
| #  elif defined(__WATCOMC__) | ||||
| #    ifndef PNG_RESTRICT | ||||
| #      define PNG_RESTRICT __restrict | ||||
| #    endif | ||||
| #  endif | ||||
| #endif /* PNG_PEDANTIC_WARNINGS */ | ||||
| 
 | ||||
| #ifndef PNG_DEPRECATED | ||||
| #  define PNG_DEPRECATED  /* Use of this function is deprecated */ | ||||
| #endif | ||||
| #ifndef PNG_USE_RESULT | ||||
| #  define PNG_USE_RESULT  /* The result of this function must be checked */ | ||||
| #endif | ||||
| #ifndef PNG_NORETURN | ||||
| #  define PNG_NORETURN    /* This function does not return */ | ||||
| #endif | ||||
| #ifndef PNG_ALLOCATED | ||||
| #  define PNG_ALLOCATED   /* The result of the function is new memory */ | ||||
| #endif | ||||
| #ifndef PNG_PRIVATE | ||||
| #  define PNG_PRIVATE     /* This is a private libpng function */ | ||||
| #endif | ||||
| #ifndef PNG_RESTRICT | ||||
| #  define PNG_RESTRICT    /* The C99 "restrict" feature */ | ||||
| #endif | ||||
| 
 | ||||
| #ifndef PNG_FP_EXPORT     /* A floating point API. */ | ||||
| #  ifdef PNG_FLOATING_POINT_SUPPORTED | ||||
| #     define PNG_FP_EXPORT(ordinal, type, name, args)\ | ||||
|          PNG_EXPORT(ordinal, type, name, args); | ||||
| #  else                   /* No floating point APIs */ | ||||
| #     define PNG_FP_EXPORT(ordinal, type, name, args) | ||||
| #  endif | ||||
| #endif | ||||
| #ifndef PNG_FIXED_EXPORT  /* A fixed point API. */ | ||||
| #  ifdef PNG_FIXED_POINT_SUPPORTED | ||||
| #     define PNG_FIXED_EXPORT(ordinal, type, name, args)\ | ||||
|          PNG_EXPORT(ordinal, type, name, args); | ||||
| #  else                   /* No fixed point APIs */ | ||||
| #     define PNG_FIXED_EXPORT(ordinal, type, name, args) | ||||
| #  endif | ||||
| #endif | ||||
| 
 | ||||
| #ifndef PNG_BUILDING_SYMBOL_TABLE | ||||
| /* Some typedefs to get us started.  These should be safe on most of the common
 | ||||
|  * platforms. | ||||
|  * | ||||
|  * png_uint_32 and png_int_32 may, currently, be larger than required to hold a | ||||
|  * 32-bit value however this is not normally advisable. | ||||
|  * | ||||
|  * png_uint_16 and png_int_16 should always be two bytes in size - this is | ||||
|  * verified at library build time. | ||||
|  * | ||||
|  * png_byte must always be one byte in size. | ||||
|  * | ||||
|  * The checks below use constants from limits.h, as defined by the ISOC90 | ||||
|  * standard. | ||||
|  */ | ||||
| #if CHAR_BIT == 8 && UCHAR_MAX == 255 | ||||
|    typedef unsigned char png_byte; | ||||
| #else | ||||
| #  error "libpng requires 8-bit bytes" | ||||
| #endif | ||||
| 
 | ||||
| #if INT_MIN == -32768 && INT_MAX == 32767 | ||||
|    typedef int png_int_16; | ||||
| #elif SHRT_MIN == -32768 && SHRT_MAX == 32767 | ||||
|    typedef short png_int_16; | ||||
| #else | ||||
| #  error "libpng requires a signed 16-bit type" | ||||
| #endif | ||||
| 
 | ||||
| #if UINT_MAX == 65535 | ||||
|    typedef unsigned int png_uint_16; | ||||
| #elif USHRT_MAX == 65535 | ||||
|    typedef unsigned short png_uint_16; | ||||
| #else | ||||
| #  error "libpng requires an unsigned 16-bit type" | ||||
| #endif | ||||
| 
 | ||||
| #if INT_MIN < -2147483646 && INT_MAX > 2147483646 | ||||
|    typedef int png_int_32; | ||||
| #elif LONG_MIN < -2147483646 && LONG_MAX > 2147483646 | ||||
|    typedef long int png_int_32; | ||||
| #else | ||||
| #  error "libpng requires a signed 32-bit (or more) type" | ||||
| #endif | ||||
| 
 | ||||
| #if UINT_MAX > 4294967294U | ||||
|    typedef unsigned int png_uint_32; | ||||
| #elif ULONG_MAX > 4294967294U | ||||
|    typedef unsigned long int png_uint_32; | ||||
| #else | ||||
| #  error "libpng requires an unsigned 32-bit (or more) type" | ||||
| #endif | ||||
| 
 | ||||
| /* Prior to 1.6.0, it was possible to disable the use of size_t and ptrdiff_t.
 | ||||
|  * From 1.6.0 onwards, an ISO C90 compiler, as well as a standard-compliant | ||||
|  * behavior of sizeof and ptrdiff_t are required. | ||||
|  * The legacy typedefs are provided here for backwards compatibility. | ||||
|  */ | ||||
| typedef size_t png_size_t; | ||||
| typedef ptrdiff_t png_ptrdiff_t; | ||||
| 
 | ||||
| /* libpng needs to know the maximum value of 'size_t' and this controls the
 | ||||
|  * definition of png_alloc_size_t, below.  This maximum value of size_t limits | ||||
|  * but does not control the maximum allocations the library makes - there is | ||||
|  * direct application control of this through png_set_user_limits(). | ||||
|  */ | ||||
| #ifndef PNG_SMALL_SIZE_T | ||||
|    /* Compiler specific tests for systems where size_t is known to be less than
 | ||||
|     * 32 bits (some of these systems may no longer work because of the lack of | ||||
|     * 'far' support; see above.) | ||||
|     */ | ||||
| #  if (defined(__TURBOC__) && !defined(__FLAT__)) ||\ | ||||
|    (defined(_MSC_VER) && defined(MAXSEG_64K)) | ||||
| #     define PNG_SMALL_SIZE_T | ||||
| #  endif | ||||
| #endif | ||||
| 
 | ||||
| /* png_alloc_size_t is guaranteed to be no smaller than size_t, and no smaller
 | ||||
|  * than png_uint_32.  Casts from size_t or png_uint_32 to png_alloc_size_t are | ||||
|  * not necessary; in fact, it is recommended not to use them at all, so that | ||||
|  * the compiler can complain when something turns out to be problematic. | ||||
|  * | ||||
|  * Casts in the other direction (from png_alloc_size_t to size_t or | ||||
|  * png_uint_32) should be explicitly applied; however, we do not expect to | ||||
|  * encounter practical situations that require such conversions. | ||||
|  * | ||||
|  * PNG_SMALL_SIZE_T must be defined if the maximum value of size_t is less than | ||||
|  * 4294967295 - i.e. less than the maximum value of png_uint_32. | ||||
|  */ | ||||
| #ifdef PNG_SMALL_SIZE_T | ||||
|    typedef png_uint_32 png_alloc_size_t; | ||||
| #else | ||||
|    typedef size_t png_alloc_size_t; | ||||
| #endif | ||||
| 
 | ||||
| /* Prior to 1.6.0 libpng offered limited support for Microsoft C compiler
 | ||||
|  * implementations of Intel CPU specific support of user-mode segmented address | ||||
|  * spaces, where 16-bit pointers address more than 65536 bytes of memory using | ||||
|  * separate 'segment' registers.  The implementation requires two different | ||||
|  * types of pointer (only one of which includes the segment value.) | ||||
|  * | ||||
|  * If required this support is available in version 1.2 of libpng and may be | ||||
|  * available in versions through 1.5, although the correctness of the code has | ||||
|  * not been verified recently. | ||||
|  */ | ||||
| 
 | ||||
| /* Typedef for floating-point numbers that are converted to fixed-point with a
 | ||||
|  * multiple of 100,000, e.g., gamma | ||||
|  */ | ||||
| typedef png_int_32 png_fixed_point; | ||||
| 
 | ||||
| /* Add typedefs for pointers */ | ||||
| typedef void                  * png_voidp; | ||||
| typedef const void            * png_const_voidp; | ||||
| typedef png_byte              * png_bytep; | ||||
| typedef const png_byte        * png_const_bytep; | ||||
| typedef png_uint_32           * png_uint_32p; | ||||
| typedef const png_uint_32     * png_const_uint_32p; | ||||
| typedef png_int_32            * png_int_32p; | ||||
| typedef const png_int_32      * png_const_int_32p; | ||||
| typedef png_uint_16           * png_uint_16p; | ||||
| typedef const png_uint_16     * png_const_uint_16p; | ||||
| typedef png_int_16            * png_int_16p; | ||||
| typedef const png_int_16      * png_const_int_16p; | ||||
| typedef char                  * png_charp; | ||||
| typedef const char            * png_const_charp; | ||||
| typedef png_fixed_point       * png_fixed_point_p; | ||||
| typedef const png_fixed_point * png_const_fixed_point_p; | ||||
| typedef size_t                * png_size_tp; | ||||
| typedef const size_t          * png_const_size_tp; | ||||
| 
 | ||||
| #ifdef PNG_STDIO_SUPPORTED | ||||
| typedef FILE            * png_FILE_p; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_FLOATING_POINT_SUPPORTED | ||||
| typedef double       * png_doublep; | ||||
| typedef const double * png_const_doublep; | ||||
| #endif | ||||
| 
 | ||||
| /* Pointers to pointers; i.e. arrays */ | ||||
| typedef png_byte        * * png_bytepp; | ||||
| typedef png_uint_32     * * png_uint_32pp; | ||||
| typedef png_int_32      * * png_int_32pp; | ||||
| typedef png_uint_16     * * png_uint_16pp; | ||||
| typedef png_int_16      * * png_int_16pp; | ||||
| typedef const char      * * png_const_charpp; | ||||
| typedef char            * * png_charpp; | ||||
| typedef png_fixed_point * * png_fixed_point_pp; | ||||
| #ifdef PNG_FLOATING_POINT_SUPPORTED | ||||
| typedef double          * * png_doublepp; | ||||
| #endif | ||||
| 
 | ||||
| /* Pointers to pointers to pointers; i.e., pointer to array */ | ||||
| typedef char            * * * png_charppp; | ||||
| 
 | ||||
| #endif /* PNG_BUILDING_SYMBOL_TABLE */ | ||||
| 
 | ||||
| #endif /* PNGCONF_H */ | ||||
							
								
								
									
										224
									
								
								dep/libpng/include/pnglibconf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								dep/libpng/include/pnglibconf.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,224 @@ | |||
| /* pnglibconf.h - library build configuration */ | ||||
| 
 | ||||
| /* libpng version 1.6.43 */ | ||||
| 
 | ||||
| /* Copyright (c) 2018-2024 Cosmin Truta */ | ||||
| /* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */ | ||||
| 
 | ||||
| /* This code is released under the libpng license. */ | ||||
| /* For conditions of distribution and use, see the disclaimer */ | ||||
| /* and license in png.h */ | ||||
| 
 | ||||
| /* pnglibconf.h */ | ||||
| /* Machine generated file: DO NOT EDIT */ | ||||
| /* Derived from: scripts/pnglibconf.dfa */ | ||||
| #ifndef PNGLCONF_H | ||||
| #define PNGLCONF_H | ||||
| /* options */ | ||||
| #define PNG_16BIT_SUPPORTED | ||||
| #define PNG_ALIGNED_MEMORY_SUPPORTED | ||||
| /*#undef PNG_ARM_NEON_API_SUPPORTED*/ | ||||
| /*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/ | ||||
| #define PNG_BENIGN_ERRORS_SUPPORTED | ||||
| #define PNG_BENIGN_READ_ERRORS_SUPPORTED | ||||
| /*#undef PNG_BENIGN_WRITE_ERRORS_SUPPORTED*/ | ||||
| #define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED | ||||
| #define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED | ||||
| #define PNG_COLORSPACE_SUPPORTED | ||||
| #define PNG_CONSOLE_IO_SUPPORTED | ||||
| #define PNG_CONVERT_tIME_SUPPORTED | ||||
| /*#undef PNG_DISABLE_ADLER32_CHECK_SUPPORTED*/ | ||||
| #define PNG_EASY_ACCESS_SUPPORTED | ||||
| /*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ | ||||
| #define PNG_ERROR_TEXT_SUPPORTED | ||||
| #define PNG_FIXED_POINT_SUPPORTED | ||||
| #define PNG_FLOATING_ARITHMETIC_SUPPORTED | ||||
| #define PNG_FLOATING_POINT_SUPPORTED | ||||
| #define PNG_FORMAT_AFIRST_SUPPORTED | ||||
| #define PNG_FORMAT_BGR_SUPPORTED | ||||
| #define PNG_GAMMA_SUPPORTED | ||||
| #define PNG_GET_PALETTE_MAX_SUPPORTED | ||||
| #define PNG_HANDLE_AS_UNKNOWN_SUPPORTED | ||||
| #define PNG_INCH_CONVERSIONS_SUPPORTED | ||||
| #define PNG_INFO_IMAGE_SUPPORTED | ||||
| #define PNG_IO_STATE_SUPPORTED | ||||
| /*#undef PNG_MIPS_MMI_API_SUPPORTED*/ | ||||
| /*#undef PNG_MIPS_MMI_CHECK_SUPPORTED*/ | ||||
| /*#undef PNG_MIPS_MSA_API_SUPPORTED*/ | ||||
| /*#undef PNG_MIPS_MSA_CHECK_SUPPORTED*/ | ||||
| #define PNG_MNG_FEATURES_SUPPORTED | ||||
| #define PNG_POINTER_INDEXING_SUPPORTED | ||||
| /*#undef PNG_POWERPC_VSX_API_SUPPORTED*/ | ||||
| /*#undef PNG_POWERPC_VSX_CHECK_SUPPORTED*/ | ||||
| #define PNG_PROGRESSIVE_READ_SUPPORTED | ||||
| #define PNG_READ_16BIT_SUPPORTED | ||||
| #define PNG_READ_ALPHA_MODE_SUPPORTED | ||||
| #define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED | ||||
| #define PNG_READ_BACKGROUND_SUPPORTED | ||||
| #define PNG_READ_BGR_SUPPORTED | ||||
| #define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED | ||||
| #define PNG_READ_COMPOSITE_NODIV_SUPPORTED | ||||
| #define PNG_READ_COMPRESSED_TEXT_SUPPORTED | ||||
| #define PNG_READ_EXPAND_16_SUPPORTED | ||||
| #define PNG_READ_EXPAND_SUPPORTED | ||||
| #define PNG_READ_FILLER_SUPPORTED | ||||
| #define PNG_READ_GAMMA_SUPPORTED | ||||
| #define PNG_READ_GET_PALETTE_MAX_SUPPORTED | ||||
| #define PNG_READ_GRAY_TO_RGB_SUPPORTED | ||||
| #define PNG_READ_INTERLACING_SUPPORTED | ||||
| #define PNG_READ_INT_FUNCTIONS_SUPPORTED | ||||
| #define PNG_READ_INVERT_ALPHA_SUPPORTED | ||||
| #define PNG_READ_INVERT_SUPPORTED | ||||
| #define PNG_READ_OPT_PLTE_SUPPORTED | ||||
| #define PNG_READ_PACKSWAP_SUPPORTED | ||||
| #define PNG_READ_PACK_SUPPORTED | ||||
| #define PNG_READ_QUANTIZE_SUPPORTED | ||||
| #define PNG_READ_RGB_TO_GRAY_SUPPORTED | ||||
| #define PNG_READ_SCALE_16_TO_8_SUPPORTED | ||||
| #define PNG_READ_SHIFT_SUPPORTED | ||||
| #define PNG_READ_STRIP_16_TO_8_SUPPORTED | ||||
| #define PNG_READ_STRIP_ALPHA_SUPPORTED | ||||
| #define PNG_READ_SUPPORTED | ||||
| #define PNG_READ_SWAP_ALPHA_SUPPORTED | ||||
| #define PNG_READ_SWAP_SUPPORTED | ||||
| #define PNG_READ_TEXT_SUPPORTED | ||||
| #define PNG_READ_TRANSFORMS_SUPPORTED | ||||
| #define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED | ||||
| #define PNG_READ_USER_CHUNKS_SUPPORTED | ||||
| #define PNG_READ_USER_TRANSFORM_SUPPORTED | ||||
| #define PNG_READ_bKGD_SUPPORTED | ||||
| #define PNG_READ_cHRM_SUPPORTED | ||||
| #define PNG_READ_eXIf_SUPPORTED | ||||
| #define PNG_READ_gAMA_SUPPORTED | ||||
| #define PNG_READ_hIST_SUPPORTED | ||||
| #define PNG_READ_iCCP_SUPPORTED | ||||
| #define PNG_READ_iTXt_SUPPORTED | ||||
| #define PNG_READ_oFFs_SUPPORTED | ||||
| #define PNG_READ_pCAL_SUPPORTED | ||||
| #define PNG_READ_pHYs_SUPPORTED | ||||
| #define PNG_READ_sBIT_SUPPORTED | ||||
| #define PNG_READ_sCAL_SUPPORTED | ||||
| #define PNG_READ_sPLT_SUPPORTED | ||||
| #define PNG_READ_sRGB_SUPPORTED | ||||
| #define PNG_READ_tEXt_SUPPORTED | ||||
| #define PNG_READ_tIME_SUPPORTED | ||||
| #define PNG_READ_tRNS_SUPPORTED | ||||
| #define PNG_READ_zTXt_SUPPORTED | ||||
| #define PNG_SAVE_INT_32_SUPPORTED | ||||
| #define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED | ||||
| #define PNG_SEQUENTIAL_READ_SUPPORTED | ||||
| #define PNG_SETJMP_SUPPORTED | ||||
| #define PNG_SET_OPTION_SUPPORTED | ||||
| #define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED | ||||
| #define PNG_SET_USER_LIMITS_SUPPORTED | ||||
| #define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED | ||||
| #define PNG_SIMPLIFIED_READ_BGR_SUPPORTED | ||||
| #define PNG_SIMPLIFIED_READ_SUPPORTED | ||||
| #define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED | ||||
| #define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED | ||||
| #define PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED | ||||
| #define PNG_SIMPLIFIED_WRITE_SUPPORTED | ||||
| #define PNG_STDIO_SUPPORTED | ||||
| #define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED | ||||
| #define PNG_TEXT_SUPPORTED | ||||
| #define PNG_TIME_RFC1123_SUPPORTED | ||||
| #define PNG_UNKNOWN_CHUNKS_SUPPORTED | ||||
| #define PNG_USER_CHUNKS_SUPPORTED | ||||
| #define PNG_USER_LIMITS_SUPPORTED | ||||
| #define PNG_USER_MEM_SUPPORTED | ||||
| #define PNG_USER_TRANSFORM_INFO_SUPPORTED | ||||
| #define PNG_USER_TRANSFORM_PTR_SUPPORTED | ||||
| #define PNG_WARNINGS_SUPPORTED | ||||
| #define PNG_WRITE_16BIT_SUPPORTED | ||||
| #define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED | ||||
| #define PNG_WRITE_BGR_SUPPORTED | ||||
| #define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED | ||||
| #define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED | ||||
| #define PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED | ||||
| #define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED | ||||
| #define PNG_WRITE_FILLER_SUPPORTED | ||||
| #define PNG_WRITE_FILTER_SUPPORTED | ||||
| #define PNG_WRITE_FLUSH_SUPPORTED | ||||
| #define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED | ||||
| #define PNG_WRITE_INTERLACING_SUPPORTED | ||||
| #define PNG_WRITE_INT_FUNCTIONS_SUPPORTED | ||||
| #define PNG_WRITE_INVERT_ALPHA_SUPPORTED | ||||
| #define PNG_WRITE_INVERT_SUPPORTED | ||||
| #define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED | ||||
| #define PNG_WRITE_PACKSWAP_SUPPORTED | ||||
| #define PNG_WRITE_PACK_SUPPORTED | ||||
| #define PNG_WRITE_SHIFT_SUPPORTED | ||||
| #define PNG_WRITE_SUPPORTED | ||||
| #define PNG_WRITE_SWAP_ALPHA_SUPPORTED | ||||
| #define PNG_WRITE_SWAP_SUPPORTED | ||||
| #define PNG_WRITE_TEXT_SUPPORTED | ||||
| #define PNG_WRITE_TRANSFORMS_SUPPORTED | ||||
| #define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED | ||||
| #define PNG_WRITE_USER_TRANSFORM_SUPPORTED | ||||
| #define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED | ||||
| #define PNG_WRITE_bKGD_SUPPORTED | ||||
| #define PNG_WRITE_cHRM_SUPPORTED | ||||
| #define PNG_WRITE_eXIf_SUPPORTED | ||||
| #define PNG_WRITE_gAMA_SUPPORTED | ||||
| #define PNG_WRITE_hIST_SUPPORTED | ||||
| #define PNG_WRITE_iCCP_SUPPORTED | ||||
| #define PNG_WRITE_iTXt_SUPPORTED | ||||
| #define PNG_WRITE_oFFs_SUPPORTED | ||||
| #define PNG_WRITE_pCAL_SUPPORTED | ||||
| #define PNG_WRITE_pHYs_SUPPORTED | ||||
| #define PNG_WRITE_sBIT_SUPPORTED | ||||
| #define PNG_WRITE_sCAL_SUPPORTED | ||||
| #define PNG_WRITE_sPLT_SUPPORTED | ||||
| #define PNG_WRITE_sRGB_SUPPORTED | ||||
| #define PNG_WRITE_tEXt_SUPPORTED | ||||
| #define PNG_WRITE_tIME_SUPPORTED | ||||
| #define PNG_WRITE_tRNS_SUPPORTED | ||||
| #define PNG_WRITE_zTXt_SUPPORTED | ||||
| #define PNG_bKGD_SUPPORTED | ||||
| #define PNG_cHRM_SUPPORTED | ||||
| #define PNG_eXIf_SUPPORTED | ||||
| #define PNG_gAMA_SUPPORTED | ||||
| #define PNG_hIST_SUPPORTED | ||||
| #define PNG_iCCP_SUPPORTED | ||||
| #define PNG_iTXt_SUPPORTED | ||||
| #define PNG_oFFs_SUPPORTED | ||||
| #define PNG_pCAL_SUPPORTED | ||||
| #define PNG_pHYs_SUPPORTED | ||||
| #define PNG_sBIT_SUPPORTED | ||||
| #define PNG_sCAL_SUPPORTED | ||||
| #define PNG_sPLT_SUPPORTED | ||||
| #define PNG_sRGB_SUPPORTED | ||||
| #define PNG_tEXt_SUPPORTED | ||||
| #define PNG_tIME_SUPPORTED | ||||
| #define PNG_tRNS_SUPPORTED | ||||
| #define PNG_zTXt_SUPPORTED | ||||
| /* end of options */ | ||||
| /* settings */ | ||||
| #define PNG_API_RULE 0 | ||||
| #define PNG_DEFAULT_READ_MACROS 1 | ||||
| #define PNG_GAMMA_THRESHOLD_FIXED 5000 | ||||
| #define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE | ||||
| #define PNG_INFLATE_BUF_SIZE 1024 | ||||
| #define PNG_LINKAGE_API extern | ||||
| #define PNG_LINKAGE_CALLBACK extern | ||||
| #define PNG_LINKAGE_DATA extern | ||||
| #define PNG_LINKAGE_FUNCTION extern | ||||
| #define PNG_MAX_GAMMA_8 11 | ||||
| #define PNG_QUANTIZE_BLUE_BITS 5 | ||||
| #define PNG_QUANTIZE_GREEN_BITS 5 | ||||
| #define PNG_QUANTIZE_RED_BITS 5 | ||||
| #define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1) | ||||
| #define PNG_TEXT_Z_DEFAULT_STRATEGY 0 | ||||
| #define PNG_USER_CHUNK_CACHE_MAX 1000 | ||||
| #define PNG_USER_CHUNK_MALLOC_MAX 8000000 | ||||
| #define PNG_USER_HEIGHT_MAX 1000000 | ||||
| #define PNG_USER_WIDTH_MAX 1000000 | ||||
| #define PNG_ZBUF_SIZE 8192 | ||||
| #define PNG_ZLIB_VERNUM 0 /* unknown */ | ||||
| #define PNG_Z_DEFAULT_COMPRESSION (-1) | ||||
| #define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0 | ||||
| #define PNG_Z_DEFAULT_STRATEGY 1 | ||||
| #define PNG_sCAL_PRECISION 5 | ||||
| #define PNG_sRGB_PROFILE_CHECKS 2 | ||||
| /* end of settings */ | ||||
| #endif /* PNGLCONF_H */ | ||||
							
								
								
									
										61
									
								
								dep/libpng/libpng.vcxproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								dep/libpng/libpng.vcxproj
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,61 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <Import Project="..\msvc\vsprops\Configurations.props" /> | ||||
|   <PropertyGroup Label="Globals"> | ||||
|     <ProjectGuid>{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}</ProjectGuid> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="include\png.h" /> | ||||
|     <ClInclude Include="include\pngconf.h" /> | ||||
|     <ClInclude Include="include\pnglibconf.h" /> | ||||
|     <ClInclude Include="src\pngdebug.h" /> | ||||
|     <ClInclude Include="src\pnginfo.h" /> | ||||
|     <ClInclude Include="src\pngpriv.h" /> | ||||
|     <ClInclude Include="src\pngstruct.h" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="src\arm\arm_init.c"> | ||||
|       <ExcludedFromBuild Condition="'$(Platform)'!='ARM64'">true</ExcludedFromBuild> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\arm\filter_neon_intrinsics.c"> | ||||
|       <ExcludedFromBuild Condition="'$(Platform)'!='ARM64'">true</ExcludedFromBuild> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\arm\palette_neon_intrinsics.c"> | ||||
|       <ExcludedFromBuild Condition="'$(Platform)'!='ARM64'">true</ExcludedFromBuild> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\intel\filter_sse2_intrinsics.c"> | ||||
|       <ExcludedFromBuild Condition="'$(Platform)'!='x64'">true</ExcludedFromBuild> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\intel\intel_init.c"> | ||||
|       <ExcludedFromBuild Condition="'$(Platform)'!='x64'">true</ExcludedFromBuild> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\png.c" /> | ||||
|     <ClCompile Include="src\pngerror.c" /> | ||||
|     <ClCompile Include="src\pngget.c" /> | ||||
|     <ClCompile Include="src\pngmem.c" /> | ||||
|     <ClCompile Include="src\pngpread.c" /> | ||||
|     <ClCompile Include="src\pngread.c" /> | ||||
|     <ClCompile Include="src\pngrio.c" /> | ||||
|     <ClCompile Include="src\pngrtran.c" /> | ||||
|     <ClCompile Include="src\pngrutil.c" /> | ||||
|     <ClCompile Include="src\pngset.c" /> | ||||
|     <ClCompile Include="src\pngtrans.c" /> | ||||
|     <ClCompile Include="src\pngwio.c" /> | ||||
|     <ClCompile Include="src\pngwrite.c" /> | ||||
|     <ClCompile Include="src\pngwtran.c" /> | ||||
|     <ClCompile Include="src\pngwutil.c" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="..\zlib\zlib.vcxproj"> | ||||
|       <Project>{7ff9fdb9-d504-47db-a16a-b08071999620}</Project> | ||||
|     </ProjectReference> | ||||
|   </ItemGroup> | ||||
|   <Import Project="..\msvc\vsprops\StaticLibrary.props" /> | ||||
|   <ItemDefinitionGroup> | ||||
|     <ClCompile> | ||||
|       <WarningLevel>TurnOffAllWarnings</WarningLevel> | ||||
|       <AdditionalIncludeDirectories>$(ProjectDir)include;$(ProjectDir)src;$(ProjectDir)..\zlib\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|     </ClCompile> | ||||
|   </ItemDefinitionGroup> | ||||
|   <Import Project="..\msvc\vsprops\Targets.props" /> | ||||
| </Project> | ||||
							
								
								
									
										52
									
								
								dep/libpng/libpng.vcxproj.filters
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								dep/libpng/libpng.vcxproj.filters
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,52 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="include\pngconf.h" /> | ||||
|     <ClInclude Include="include\png.h" /> | ||||
|     <ClInclude Include="src\pngdebug.h" /> | ||||
|     <ClInclude Include="src\pnginfo.h" /> | ||||
|     <ClInclude Include="src\pngpriv.h" /> | ||||
|     <ClInclude Include="src\pngstruct.h" /> | ||||
|     <ClInclude Include="include\pnglibconf.h" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="src\png.c" /> | ||||
|     <ClCompile Include="src\pngerror.c" /> | ||||
|     <ClCompile Include="src\pngget.c" /> | ||||
|     <ClCompile Include="src\pngmem.c" /> | ||||
|     <ClCompile Include="src\pngpread.c" /> | ||||
|     <ClCompile Include="src\pngread.c" /> | ||||
|     <ClCompile Include="src\pngrio.c" /> | ||||
|     <ClCompile Include="src\pngrtran.c" /> | ||||
|     <ClCompile Include="src\pngrutil.c" /> | ||||
|     <ClCompile Include="src\pngset.c" /> | ||||
|     <ClCompile Include="src\pngtrans.c" /> | ||||
|     <ClCompile Include="src\pngwio.c" /> | ||||
|     <ClCompile Include="src\pngwrite.c" /> | ||||
|     <ClCompile Include="src\pngwtran.c" /> | ||||
|     <ClCompile Include="src\pngwutil.c" /> | ||||
|     <ClCompile Include="src\intel\intel_init.c"> | ||||
|       <Filter>intel</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\intel\filter_sse2_intrinsics.c"> | ||||
|       <Filter>intel</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\arm\filter_neon_intrinsics.c"> | ||||
|       <Filter>arm</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\arm\palette_neon_intrinsics.c"> | ||||
|       <Filter>arm</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\arm\arm_init.c"> | ||||
|       <Filter>arm</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <Filter Include="arm"> | ||||
|       <UniqueIdentifier>{9f24e95e-025d-4ed8-8c41-2fb1c7a36026}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="intel"> | ||||
|       <UniqueIdentifier>{8316b9c1-8c00-4bc8-ace7-c9b864890f2d}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
							
								
								
									
										139
									
								
								dep/libpng/src/arm/arm_init.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								dep/libpng/src/arm/arm_init.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,139 @@ | |||
| 
 | ||||
| /* arm_init.c - NEON optimised filter functions
 | ||||
|  * | ||||
|  * Copyright (c) 2018-2022 Cosmin Truta | ||||
|  * Copyright (c) 2014,2016 Glenn Randers-Pehrson | ||||
|  * Written by Mans Rullgard, 2011. | ||||
|  * | ||||
|  * This code is released under the libpng license. | ||||
|  * For conditions of distribution and use, see the disclaimer | ||||
|  * and license in png.h | ||||
|  */ | ||||
| 
 | ||||
| /* This module requires POSIX 1003.1 functions. */ | ||||
| #define _POSIX_SOURCE 1 | ||||
| 
 | ||||
| #include "../pngpriv.h" | ||||
| 
 | ||||
| #ifdef PNG_READ_SUPPORTED | ||||
| 
 | ||||
| #if PNG_ARM_NEON_OPT > 0 | ||||
| #ifdef PNG_ARM_NEON_CHECK_SUPPORTED /* Do run-time checks */ | ||||
| /* WARNING: it is strongly recommended that you do not build libpng with
 | ||||
|  * run-time checks for CPU features if at all possible.  In the case of the ARM | ||||
|  * NEON instructions there is no processor-specific way of detecting the | ||||
|  * presence of the required support, therefore run-time detection is extremely | ||||
|  * OS specific. | ||||
|  * | ||||
|  * You may set the macro PNG_ARM_NEON_FILE to the file name of file containing | ||||
|  * a fragment of C source code which defines the png_have_neon function.  There | ||||
|  * are a number of implementations in contrib/arm-neon, but the only one that | ||||
|  * has partial support is contrib/arm-neon/linux.c - a generic Linux | ||||
|  * implementation which reads /proc/cpufino. | ||||
|  */ | ||||
| #include <signal.h> /* for sig_atomic_t */ | ||||
| 
 | ||||
| #ifndef PNG_ARM_NEON_FILE | ||||
| #  if defined(__aarch64__) || defined(_M_ARM64) | ||||
|      /* ARM Neon is expected to be unconditionally available on ARM64. */ | ||||
| #    error "PNG_ARM_NEON_CHECK_SUPPORTED must not be defined on ARM64" | ||||
| #  elif defined(__ARM_NEON__) || defined(__ARM_NEON) | ||||
|      /* ARM Neon is expected to be available on the target CPU architecture. */ | ||||
| #    error "PNG_ARM_NEON_CHECK_SUPPORTED must not be defined on this CPU arch" | ||||
| #  elif defined(__linux__) | ||||
| #    define PNG_ARM_NEON_FILE "contrib/arm-neon/linux.c" | ||||
| #  else | ||||
| #    error "No support for run-time ARM Neon checking; use compile-time options" | ||||
| #  endif | ||||
| #endif | ||||
| 
 | ||||
| static int png_have_neon(png_structp png_ptr); | ||||
| #ifdef PNG_ARM_NEON_FILE | ||||
| #  include PNG_ARM_NEON_FILE | ||||
| #endif | ||||
| #endif /* PNG_ARM_NEON_CHECK_SUPPORTED */ | ||||
| 
 | ||||
| #ifndef PNG_ALIGNED_MEMORY_SUPPORTED | ||||
| #  error "ALIGNED_MEMORY is required; set: -DPNG_ALIGNED_MEMORY_SUPPORTED" | ||||
| #endif | ||||
| 
 | ||||
| void | ||||
| png_init_filter_functions_neon(png_structp pp, unsigned int bpp) | ||||
| { | ||||
|    /* The switch statement is compiled in for ARM_NEON_API, the call to
 | ||||
|     * png_have_neon is compiled in for ARM_NEON_CHECK.  If both are defined | ||||
|     * the check is only performed if the API has not set the NEON option on | ||||
|     * or off explicitly.  In this case the check controls what happens. | ||||
|     * | ||||
|     * If the CHECK is not compiled in and the option is UNSET the behavior prior | ||||
|     * to 1.6.7 was to use the NEON code - this was a bug caused by having the | ||||
|     * wrong order of the 'ON' and 'default' cases.  UNSET now defaults to OFF, | ||||
|     * as documented in png.h | ||||
|     */ | ||||
|    png_debug(1, "in png_init_filter_functions_neon"); | ||||
| #ifdef PNG_ARM_NEON_API_SUPPORTED | ||||
|    switch ((pp->options >> PNG_ARM_NEON) & 3) | ||||
|    { | ||||
|       case PNG_OPTION_UNSET: | ||||
|          /* Allow the run-time check to execute if it has been enabled -
 | ||||
|           * thus both API and CHECK can be turned on.  If it isn't supported | ||||
|           * this case will fall through to the 'default' below, which just | ||||
|           * returns. | ||||
|           */ | ||||
| #endif /* PNG_ARM_NEON_API_SUPPORTED */ | ||||
| #ifdef PNG_ARM_NEON_CHECK_SUPPORTED | ||||
|          { | ||||
|             static volatile sig_atomic_t no_neon = -1; /* not checked */ | ||||
| 
 | ||||
|             if (no_neon < 0) | ||||
|                no_neon = !png_have_neon(pp); | ||||
| 
 | ||||
|             if (no_neon) | ||||
|                return; | ||||
|          } | ||||
| #ifdef PNG_ARM_NEON_API_SUPPORTED | ||||
|          break; | ||||
| #endif | ||||
| #endif /* PNG_ARM_NEON_CHECK_SUPPORTED */ | ||||
| 
 | ||||
| #ifdef PNG_ARM_NEON_API_SUPPORTED | ||||
|       default: /* OFF or INVALID */ | ||||
|          return; | ||||
| 
 | ||||
|       case PNG_OPTION_ON: | ||||
|          /* Option turned on */ | ||||
|          break; | ||||
|    } | ||||
| #endif | ||||
| 
 | ||||
|    /* IMPORTANT: any new external functions used here must be declared using
 | ||||
|     * PNG_INTERNAL_FUNCTION in ../pngpriv.h.  This is required so that the | ||||
|     * 'prefix' option to configure works: | ||||
|     * | ||||
|     *    ./configure --with-libpng-prefix=foobar_ | ||||
|     * | ||||
|     * Verify you have got this right by running the above command, doing a build | ||||
|     * and examining pngprefix.h; it must contain a #define for every external | ||||
|     * function you add.  (Notice that this happens automatically for the | ||||
|     * initialization function.) | ||||
|     */ | ||||
|    pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up_neon; | ||||
| 
 | ||||
|    if (bpp == 3) | ||||
|    { | ||||
|       pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub3_neon; | ||||
|       pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg3_neon; | ||||
|       pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = | ||||
|          png_read_filter_row_paeth3_neon; | ||||
|    } | ||||
| 
 | ||||
|    else if (bpp == 4) | ||||
|    { | ||||
|       pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub4_neon; | ||||
|       pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg4_neon; | ||||
|       pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = | ||||
|           png_read_filter_row_paeth4_neon; | ||||
|    } | ||||
| } | ||||
| #endif /* PNG_ARM_NEON_OPT > 0 */ | ||||
| #endif /* READ */ | ||||
							
								
								
									
										253
									
								
								dep/libpng/src/arm/filter_neon.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										253
									
								
								dep/libpng/src/arm/filter_neon.S
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,253 @@ | |||
| 
 | ||||
| /* filter_neon.S - NEON optimised filter functions | ||||
|  * | ||||
|  * Copyright (c) 2018 Cosmin Truta | ||||
|  * Copyright (c) 2014,2017 Glenn Randers-Pehrson | ||||
|  * Written by Mans Rullgard, 2011. | ||||
|  * | ||||
|  * This code is released under the libpng license. | ||||
|  * For conditions of distribution and use, see the disclaimer | ||||
|  * and license in png.h | ||||
|  */ | ||||
| 
 | ||||
| /* This is required to get the symbol renames, which are #defines, and the | ||||
|  * definitions (or not) of PNG_ARM_NEON_OPT and PNG_ARM_NEON_IMPLEMENTATION. | ||||
|  */ | ||||
| #define PNG_VERSION_INFO_ONLY | ||||
| #include "../pngpriv.h" | ||||
| 
 | ||||
| #if (defined(__linux__) || defined(__FreeBSD__)) && defined(__ELF__) | ||||
| .section .note.GNU-stack,"",%progbits /* mark stack as non-executable */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_READ_SUPPORTED | ||||
| 
 | ||||
| /* Assembler NEON support - only works for 32-bit ARM (i.e. it does not work for | ||||
|  * ARM64).  The code in arm/filter_neon_intrinsics.c supports ARM64, however it | ||||
|  * only works if -mfpu=neon is specified on the GCC command line.  See pngpriv.h | ||||
|  * for the logic which sets PNG_USE_ARM_NEON_ASM: | ||||
|  */ | ||||
| #if PNG_ARM_NEON_IMPLEMENTATION == 2 /* hand-coded assembler */ | ||||
| 
 | ||||
| #if PNG_ARM_NEON_OPT > 0 | ||||
| 
 | ||||
| #ifdef __ELF__ | ||||
| #   define ELF | ||||
| #else | ||||
| #   define ELF @
 | ||||
| #endif | ||||
| 
 | ||||
|         .arch armv7-a | ||||
|         .fpu  neon
 | ||||
| 
 | ||||
| .macro  func    name, export=0 | ||||
|     .macro endfunc
 | ||||
| ELF     .size   \name, . - \name | ||||
|         .endfunc | ||||
|         .purgem endfunc
 | ||||
|     .endm | ||||
|         .text | ||||
| 
 | ||||
|         /* Explicitly specifying alignment here because some versions of | ||||
|          * GAS don't align code correctly.  This is harmless in correctly | ||||
|          * written versions of GAS. | ||||
|          */ | ||||
|         .align 2
 | ||||
| 
 | ||||
|     .if \export | ||||
|         .global \name | ||||
|     .endif | ||||
| ELF     .type   \name, STT_FUNC | ||||
|         .func   \name | ||||
| \name: | ||||
| .endm | ||||
| 
 | ||||
| func    png_read_filter_row_sub4_neon, export=1 | ||||
|         ldr             r3,  [r0, #4]           @ rowbytes
 | ||||
|         vmov.i8         d3,  #0 | ||||
| 1: | ||||
|         vld4.32         {d4[],d5[],d6[],d7[]},    [r1,:128] | ||||
|         vadd.u8         d0,  d3,  d4 | ||||
|         vadd.u8         d1,  d0,  d5 | ||||
|         vadd.u8         d2,  d1,  d6 | ||||
|         vadd.u8         d3,  d2,  d7 | ||||
|         vst4.32         {d0[0],d1[0],d2[0],d3[0]},[r1,:128]! | ||||
|         subs            r3,  r3,  #16 | ||||
|         bgt             1b | ||||
| 
 | ||||
|         bx              lr | ||||
| endfunc | ||||
| 
 | ||||
| func    png_read_filter_row_sub3_neon, export=1 | ||||
|         ldr             r3,  [r0, #4]           @ rowbytes
 | ||||
|         vmov.i8         d3,  #0 | ||||
|         mov             r0,  r1 | ||||
|         mov             r2,  #3 | ||||
|         mov             r12, #12 | ||||
|         vld1.8          {q11},    [r0], r12 | ||||
| 1: | ||||
|         vext.8          d5,  d22, d23, #3 | ||||
|         vadd.u8         d0,  d3,  d22 | ||||
|         vext.8          d6,  d22, d23, #6 | ||||
|         vadd.u8         d1,  d0,  d5 | ||||
|         vext.8          d7,  d23, d23, #1 | ||||
|         vld1.8          {q11},    [r0], r12 | ||||
|         vst1.32         {d0[0]},  [r1,:32], r2 | ||||
|         vadd.u8         d2,  d1,  d6 | ||||
|         vst1.32         {d1[0]},  [r1], r2 | ||||
|         vadd.u8         d3,  d2,  d7 | ||||
|         vst1.32         {d2[0]},  [r1], r2 | ||||
|         vst1.32         {d3[0]},  [r1], r2 | ||||
|         subs            r3,  r3,  #12 | ||||
|         bgt             1b | ||||
| 
 | ||||
|         bx              lr | ||||
| endfunc | ||||
| 
 | ||||
| func    png_read_filter_row_up_neon, export=1 | ||||
|         ldr             r3,  [r0, #4]           @ rowbytes
 | ||||
| 1: | ||||
|         vld1.8          {q0}, [r1,:128] | ||||
|         vld1.8          {q1}, [r2,:128]! | ||||
|         vadd.u8         q0,  q0,  q1 | ||||
|         vst1.8          {q0}, [r1,:128]! | ||||
|         subs            r3,  r3,  #16 | ||||
|         bgt             1b | ||||
| 
 | ||||
|         bx              lr | ||||
| endfunc | ||||
| 
 | ||||
| func    png_read_filter_row_avg4_neon, export=1 | ||||
|         ldr             r12, [r0, #4]           @ rowbytes
 | ||||
|         vmov.i8         d3,  #0 | ||||
| 1: | ||||
|         vld4.32         {d4[],d5[],d6[],d7[]},    [r1,:128] | ||||
|         vld4.32         {d16[],d17[],d18[],d19[]},[r2,:128]! | ||||
|         vhadd.u8        d0,  d3,  d16 | ||||
|         vadd.u8         d0,  d0,  d4 | ||||
|         vhadd.u8        d1,  d0,  d17 | ||||
|         vadd.u8         d1,  d1,  d5 | ||||
|         vhadd.u8        d2,  d1,  d18 | ||||
|         vadd.u8         d2,  d2,  d6 | ||||
|         vhadd.u8        d3,  d2,  d19 | ||||
|         vadd.u8         d3,  d3,  d7 | ||||
|         vst4.32         {d0[0],d1[0],d2[0],d3[0]},[r1,:128]! | ||||
|         subs            r12, r12, #16 | ||||
|         bgt             1b | ||||
| 
 | ||||
|         bx              lr | ||||
| endfunc | ||||
| 
 | ||||
| func    png_read_filter_row_avg3_neon, export=1 | ||||
|         push            {r4,lr} | ||||
|         ldr             r12, [r0, #4]           @ rowbytes
 | ||||
|         vmov.i8         d3,  #0 | ||||
|         mov             r0,  r1 | ||||
|         mov             r4,  #3 | ||||
|         mov             lr,  #12 | ||||
|         vld1.8          {q11},    [r0], lr | ||||
| 1: | ||||
|         vld1.8          {q10},    [r2], lr | ||||
|         vext.8          d5,  d22, d23, #3 | ||||
|         vhadd.u8        d0,  d3,  d20 | ||||
|         vext.8          d17, d20, d21, #3 | ||||
|         vadd.u8         d0,  d0,  d22 | ||||
|         vext.8          d6,  d22, d23, #6 | ||||
|         vhadd.u8        d1,  d0,  d17 | ||||
|         vext.8          d18, d20, d21, #6 | ||||
|         vadd.u8         d1,  d1,  d5 | ||||
|         vext.8          d7,  d23, d23, #1 | ||||
|         vld1.8          {q11},    [r0], lr | ||||
|         vst1.32         {d0[0]},  [r1,:32], r4 | ||||
|         vhadd.u8        d2,  d1,  d18 | ||||
|         vst1.32         {d1[0]},  [r1], r4 | ||||
|         vext.8          d19, d21, d21, #1 | ||||
|         vadd.u8         d2,  d2,  d6 | ||||
|         vhadd.u8        d3,  d2,  d19 | ||||
|         vst1.32         {d2[0]},  [r1], r4 | ||||
|         vadd.u8         d3,  d3,  d7 | ||||
|         vst1.32         {d3[0]},  [r1], r4 | ||||
|         subs            r12, r12, #12 | ||||
|         bgt             1b | ||||
| 
 | ||||
|         pop             {r4,pc} | ||||
| endfunc | ||||
| 
 | ||||
| .macro  paeth           rx,  ra,  rb,  rc | ||||
|         vaddl.u8        q12, \ra, \rb           @ a + b
 | ||||
|         vaddl.u8        q15, \rc, \rc           @ 2*c
 | ||||
|         vabdl.u8        q13, \rb, \rc           @ pa
 | ||||
|         vabdl.u8        q14, \ra, \rc           @ pb
 | ||||
|         vabd.u16        q15, q12, q15           @ pc
 | ||||
|         vcle.u16        q12, q13, q14           @ pa <= pb
 | ||||
|         vcle.u16        q13, q13, q15           @ pa <= pc
 | ||||
|         vcle.u16        q14, q14, q15           @ pb <= pc
 | ||||
|         vand            q12, q12, q13           @ pa <= pb && pa <= pc
 | ||||
|         vmovn.u16       d28, q14 | ||||
|         vmovn.u16       \rx, q12 | ||||
|         vbsl            d28, \rb, \rc | ||||
|         vbsl            \rx, \ra, d28 | ||||
| .endm | ||||
| 
 | ||||
| func    png_read_filter_row_paeth4_neon, export=1 | ||||
|         ldr             r12, [r0, #4]           @ rowbytes
 | ||||
|         vmov.i8         d3,  #0 | ||||
|         vmov.i8         d20, #0 | ||||
| 1: | ||||
|         vld4.32         {d4[],d5[],d6[],d7[]},    [r1,:128] | ||||
|         vld4.32         {d16[],d17[],d18[],d19[]},[r2,:128]! | ||||
|         paeth           d0,  d3,  d16, d20 | ||||
|         vadd.u8         d0,  d0,  d4 | ||||
|         paeth           d1,  d0,  d17, d16 | ||||
|         vadd.u8         d1,  d1,  d5 | ||||
|         paeth           d2,  d1,  d18, d17 | ||||
|         vadd.u8         d2,  d2,  d6 | ||||
|         paeth           d3,  d2,  d19, d18 | ||||
|         vmov            d20, d19 | ||||
|         vadd.u8         d3,  d3,  d7 | ||||
|         vst4.32         {d0[0],d1[0],d2[0],d3[0]},[r1,:128]! | ||||
|         subs            r12, r12, #16 | ||||
|         bgt             1b | ||||
| 
 | ||||
|         bx              lr | ||||
| endfunc | ||||
| 
 | ||||
| func    png_read_filter_row_paeth3_neon, export=1 | ||||
|         push            {r4,lr} | ||||
|         ldr             r12, [r0, #4]           @ rowbytes
 | ||||
|         vmov.i8         d3,  #0 | ||||
|         vmov.i8         d4,  #0 | ||||
|         mov             r0,  r1 | ||||
|         mov             r4,  #3 | ||||
|         mov             lr,  #12 | ||||
|         vld1.8          {q11},    [r0], lr | ||||
| 1: | ||||
|         vld1.8          {q10},    [r2], lr | ||||
|         paeth           d0,  d3,  d20, d4 | ||||
|         vext.8          d5,  d22, d23, #3 | ||||
|         vadd.u8         d0,  d0,  d22 | ||||
|         vext.8          d17, d20, d21, #3 | ||||
|         paeth           d1,  d0,  d17, d20 | ||||
|         vst1.32         {d0[0]},  [r1,:32], r4 | ||||
|         vext.8          d6,  d22, d23, #6 | ||||
|         vadd.u8         d1,  d1,  d5 | ||||
|         vext.8          d18, d20, d21, #6 | ||||
|         paeth           d2,  d1,  d18, d17 | ||||
|         vext.8          d7,  d23, d23, #1 | ||||
|         vld1.8          {q11},    [r0], lr | ||||
|         vst1.32         {d1[0]},  [r1], r4 | ||||
|         vadd.u8         d2,  d2,  d6 | ||||
|         vext.8          d19, d21, d21, #1 | ||||
|         paeth           d3,  d2,  d19, d18 | ||||
|         vst1.32         {d2[0]},  [r1], r4 | ||||
|         vmov            d4,  d19 | ||||
|         vadd.u8         d3,  d3,  d7 | ||||
|         vst1.32         {d3[0]},  [r1], r4 | ||||
|         subs            r12, r12, #12 | ||||
|         bgt             1b | ||||
| 
 | ||||
|         pop             {r4,pc} | ||||
| endfunc | ||||
| #endif /* PNG_ARM_NEON_OPT > 0 */ | ||||
| #endif /* PNG_ARM_NEON_IMPLEMENTATION == 2 (assembler) */ | ||||
| #endif /* READ */ | ||||
							
								
								
									
										402
									
								
								dep/libpng/src/arm/filter_neon_intrinsics.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										402
									
								
								dep/libpng/src/arm/filter_neon_intrinsics.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,402 @@ | |||
| 
 | ||||
| /* filter_neon_intrinsics.c - NEON optimised filter functions
 | ||||
|  * | ||||
|  * Copyright (c) 2018 Cosmin Truta | ||||
|  * Copyright (c) 2014,2016 Glenn Randers-Pehrson | ||||
|  * Written by James Yu <james.yu at linaro.org>, October 2013. | ||||
|  * Based on filter_neon.S, written by Mans Rullgard, 2011. | ||||
|  * | ||||
|  * This code is released under the libpng license. | ||||
|  * For conditions of distribution and use, see the disclaimer | ||||
|  * and license in png.h | ||||
|  */ | ||||
| 
 | ||||
| #include "../pngpriv.h" | ||||
| 
 | ||||
| #ifdef PNG_READ_SUPPORTED | ||||
| 
 | ||||
| /* This code requires -mfpu=neon on the command line: */ | ||||
| #if PNG_ARM_NEON_IMPLEMENTATION == 1 /* intrinsics code from pngpriv.h */ | ||||
| 
 | ||||
| #if defined(_MSC_VER) && !defined(__clang__) && defined(_M_ARM64) | ||||
| #  include <arm64_neon.h> | ||||
| #else | ||||
| #  include <arm_neon.h> | ||||
| #endif | ||||
| 
 | ||||
| /* libpng row pointers are not necessarily aligned to any particular boundary,
 | ||||
|  * however this code will only work with appropriate alignment.  arm/arm_init.c | ||||
|  * checks for this (and will not compile unless it is done). This code uses | ||||
|  * variants of png_aligncast to avoid compiler warnings. | ||||
|  */ | ||||
| #define png_ptr(type,pointer) png_aligncast(type *,pointer) | ||||
| #define png_ptrc(type,pointer) png_aligncastconst(const type *,pointer) | ||||
| 
 | ||||
| /* The following relies on a variable 'temp_pointer' being declared with type
 | ||||
|  * 'type'.  This is written this way just to hide the GCC strict aliasing | ||||
|  * warning; note that the code is safe because there never is an alias between | ||||
|  * the input and output pointers. | ||||
|  * | ||||
|  * When compiling with MSVC ARM64, the png_ldr macro can't be passed directly | ||||
|  * to vst4_lane_u32, because of an internal compiler error inside MSVC. | ||||
|  * To avoid this compiler bug, we use a temporary variable (vdest_val) to store | ||||
|  * the result of png_ldr. | ||||
|  */ | ||||
| #define png_ldr(type,pointer)\ | ||||
|    (temp_pointer = png_ptr(type,pointer), *temp_pointer) | ||||
| 
 | ||||
| #if PNG_ARM_NEON_OPT > 0 | ||||
| 
 | ||||
| void | ||||
| png_read_filter_row_up_neon(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev_row) | ||||
| { | ||||
|    png_bytep rp = row; | ||||
|    png_bytep rp_stop = row + row_info->rowbytes; | ||||
|    png_const_bytep pp = prev_row; | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_up_neon"); | ||||
| 
 | ||||
|    for (; rp < rp_stop; rp += 16, pp += 16) | ||||
|    { | ||||
|       uint8x16_t qrp, qpp; | ||||
| 
 | ||||
|       qrp = vld1q_u8(rp); | ||||
|       qpp = vld1q_u8(pp); | ||||
|       qrp = vaddq_u8(qrp, qpp); | ||||
|       vst1q_u8(rp, qrp); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void | ||||
| png_read_filter_row_sub3_neon(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev_row) | ||||
| { | ||||
|    png_bytep rp = row; | ||||
|    png_bytep rp_stop = row + row_info->rowbytes; | ||||
| 
 | ||||
|    uint8x16_t vtmp = vld1q_u8(rp); | ||||
|    uint8x8x2_t *vrpt = png_ptr(uint8x8x2_t, &vtmp); | ||||
|    uint8x8x2_t vrp = *vrpt; | ||||
| 
 | ||||
|    uint8x8x4_t vdest; | ||||
|    vdest.val[3] = vdup_n_u8(0); | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_sub3_neon"); | ||||
| 
 | ||||
|    for (; rp < rp_stop;) | ||||
|    { | ||||
|       uint8x8_t vtmp1, vtmp2; | ||||
|       uint32x2_t *temp_pointer; | ||||
| 
 | ||||
|       vtmp1 = vext_u8(vrp.val[0], vrp.val[1], 3); | ||||
|       vdest.val[0] = vadd_u8(vdest.val[3], vrp.val[0]); | ||||
|       vtmp2 = vext_u8(vrp.val[0], vrp.val[1], 6); | ||||
|       vdest.val[1] = vadd_u8(vdest.val[0], vtmp1); | ||||
| 
 | ||||
|       vtmp1 = vext_u8(vrp.val[1], vrp.val[1], 1); | ||||
|       vdest.val[2] = vadd_u8(vdest.val[1], vtmp2); | ||||
|       vdest.val[3] = vadd_u8(vdest.val[2], vtmp1); | ||||
| 
 | ||||
|       vtmp = vld1q_u8(rp + 12); | ||||
|       vrpt = png_ptr(uint8x8x2_t, &vtmp); | ||||
|       vrp = *vrpt; | ||||
| 
 | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[0]), 0); | ||||
|       rp += 3; | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[1]), 0); | ||||
|       rp += 3; | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[2]), 0); | ||||
|       rp += 3; | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[3]), 0); | ||||
|       rp += 3; | ||||
|    } | ||||
| 
 | ||||
|    PNG_UNUSED(prev_row) | ||||
| } | ||||
| 
 | ||||
| void | ||||
| png_read_filter_row_sub4_neon(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev_row) | ||||
| { | ||||
|    png_bytep rp = row; | ||||
|    png_bytep rp_stop = row + row_info->rowbytes; | ||||
| 
 | ||||
|    uint8x8x4_t vdest; | ||||
|    vdest.val[3] = vdup_n_u8(0); | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_sub4_neon"); | ||||
| 
 | ||||
|    for (; rp < rp_stop; rp += 16) | ||||
|    { | ||||
|       uint32x2x4_t vtmp = vld4_u32(png_ptr(uint32_t,rp)); | ||||
|       uint8x8x4_t *vrpt = png_ptr(uint8x8x4_t,&vtmp); | ||||
|       uint8x8x4_t vrp = *vrpt; | ||||
|       uint32x2x4_t *temp_pointer; | ||||
|       uint32x2x4_t vdest_val; | ||||
| 
 | ||||
|       vdest.val[0] = vadd_u8(vdest.val[3], vrp.val[0]); | ||||
|       vdest.val[1] = vadd_u8(vdest.val[0], vrp.val[1]); | ||||
|       vdest.val[2] = vadd_u8(vdest.val[1], vrp.val[2]); | ||||
|       vdest.val[3] = vadd_u8(vdest.val[2], vrp.val[3]); | ||||
| 
 | ||||
|       vdest_val = png_ldr(uint32x2x4_t, &vdest); | ||||
|       vst4_lane_u32(png_ptr(uint32_t,rp), vdest_val, 0); | ||||
|    } | ||||
| 
 | ||||
|    PNG_UNUSED(prev_row) | ||||
| } | ||||
| 
 | ||||
| void | ||||
| png_read_filter_row_avg3_neon(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev_row) | ||||
| { | ||||
|    png_bytep rp = row; | ||||
|    png_const_bytep pp = prev_row; | ||||
|    png_bytep rp_stop = row + row_info->rowbytes; | ||||
| 
 | ||||
|    uint8x16_t vtmp; | ||||
|    uint8x8x2_t *vrpt; | ||||
|    uint8x8x2_t vrp; | ||||
|    uint8x8x4_t vdest; | ||||
|    vdest.val[3] = vdup_n_u8(0); | ||||
| 
 | ||||
|    vtmp = vld1q_u8(rp); | ||||
|    vrpt = png_ptr(uint8x8x2_t,&vtmp); | ||||
|    vrp = *vrpt; | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_avg3_neon"); | ||||
| 
 | ||||
|    for (; rp < rp_stop; pp += 12) | ||||
|    { | ||||
|       uint8x8_t vtmp1, vtmp2, vtmp3; | ||||
| 
 | ||||
|       uint8x8x2_t *vppt; | ||||
|       uint8x8x2_t vpp; | ||||
| 
 | ||||
|       uint32x2_t *temp_pointer; | ||||
| 
 | ||||
|       vtmp = vld1q_u8(pp); | ||||
|       vppt = png_ptr(uint8x8x2_t,&vtmp); | ||||
|       vpp = *vppt; | ||||
| 
 | ||||
|       vtmp1 = vext_u8(vrp.val[0], vrp.val[1], 3); | ||||
|       vdest.val[0] = vhadd_u8(vdest.val[3], vpp.val[0]); | ||||
|       vdest.val[0] = vadd_u8(vdest.val[0], vrp.val[0]); | ||||
| 
 | ||||
|       vtmp2 = vext_u8(vpp.val[0], vpp.val[1], 3); | ||||
|       vtmp3 = vext_u8(vrp.val[0], vrp.val[1], 6); | ||||
|       vdest.val[1] = vhadd_u8(vdest.val[0], vtmp2); | ||||
|       vdest.val[1] = vadd_u8(vdest.val[1], vtmp1); | ||||
| 
 | ||||
|       vtmp2 = vext_u8(vpp.val[0], vpp.val[1], 6); | ||||
|       vtmp1 = vext_u8(vrp.val[1], vrp.val[1], 1); | ||||
| 
 | ||||
|       vtmp = vld1q_u8(rp + 12); | ||||
|       vrpt = png_ptr(uint8x8x2_t,&vtmp); | ||||
|       vrp = *vrpt; | ||||
| 
 | ||||
|       vdest.val[2] = vhadd_u8(vdest.val[1], vtmp2); | ||||
|       vdest.val[2] = vadd_u8(vdest.val[2], vtmp3); | ||||
| 
 | ||||
|       vtmp2 = vext_u8(vpp.val[1], vpp.val[1], 1); | ||||
| 
 | ||||
|       vdest.val[3] = vhadd_u8(vdest.val[2], vtmp2); | ||||
|       vdest.val[3] = vadd_u8(vdest.val[3], vtmp1); | ||||
| 
 | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[0]), 0); | ||||
|       rp += 3; | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[1]), 0); | ||||
|       rp += 3; | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[2]), 0); | ||||
|       rp += 3; | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[3]), 0); | ||||
|       rp += 3; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void | ||||
| png_read_filter_row_avg4_neon(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev_row) | ||||
| { | ||||
|    png_bytep rp = row; | ||||
|    png_bytep rp_stop = row + row_info->rowbytes; | ||||
|    png_const_bytep pp = prev_row; | ||||
| 
 | ||||
|    uint8x8x4_t vdest; | ||||
|    vdest.val[3] = vdup_n_u8(0); | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_avg4_neon"); | ||||
| 
 | ||||
|    for (; rp < rp_stop; rp += 16, pp += 16) | ||||
|    { | ||||
|       uint32x2x4_t vtmp; | ||||
|       uint8x8x4_t *vrpt, *vppt; | ||||
|       uint8x8x4_t vrp, vpp; | ||||
|       uint32x2x4_t *temp_pointer; | ||||
|       uint32x2x4_t vdest_val; | ||||
| 
 | ||||
|       vtmp = vld4_u32(png_ptr(uint32_t,rp)); | ||||
|       vrpt = png_ptr(uint8x8x4_t,&vtmp); | ||||
|       vrp = *vrpt; | ||||
|       vtmp = vld4_u32(png_ptrc(uint32_t,pp)); | ||||
|       vppt = png_ptr(uint8x8x4_t,&vtmp); | ||||
|       vpp = *vppt; | ||||
| 
 | ||||
|       vdest.val[0] = vhadd_u8(vdest.val[3], vpp.val[0]); | ||||
|       vdest.val[0] = vadd_u8(vdest.val[0], vrp.val[0]); | ||||
|       vdest.val[1] = vhadd_u8(vdest.val[0], vpp.val[1]); | ||||
|       vdest.val[1] = vadd_u8(vdest.val[1], vrp.val[1]); | ||||
|       vdest.val[2] = vhadd_u8(vdest.val[1], vpp.val[2]); | ||||
|       vdest.val[2] = vadd_u8(vdest.val[2], vrp.val[2]); | ||||
|       vdest.val[3] = vhadd_u8(vdest.val[2], vpp.val[3]); | ||||
|       vdest.val[3] = vadd_u8(vdest.val[3], vrp.val[3]); | ||||
| 
 | ||||
|       vdest_val = png_ldr(uint32x2x4_t, &vdest); | ||||
|       vst4_lane_u32(png_ptr(uint32_t,rp), vdest_val, 0); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| static uint8x8_t | ||||
| paeth(uint8x8_t a, uint8x8_t b, uint8x8_t c) | ||||
| { | ||||
|    uint8x8_t d, e; | ||||
|    uint16x8_t p1, pa, pb, pc; | ||||
| 
 | ||||
|    p1 = vaddl_u8(a, b); /* a + b */ | ||||
|    pc = vaddl_u8(c, c); /* c * 2 */ | ||||
|    pa = vabdl_u8(b, c); /* pa */ | ||||
|    pb = vabdl_u8(a, c); /* pb */ | ||||
|    pc = vabdq_u16(p1, pc); /* pc */ | ||||
| 
 | ||||
|    p1 = vcleq_u16(pa, pb); /* pa <= pb */ | ||||
|    pa = vcleq_u16(pa, pc); /* pa <= pc */ | ||||
|    pb = vcleq_u16(pb, pc); /* pb <= pc */ | ||||
| 
 | ||||
|    p1 = vandq_u16(p1, pa); /* pa <= pb && pa <= pc */ | ||||
| 
 | ||||
|    d = vmovn_u16(pb); | ||||
|    e = vmovn_u16(p1); | ||||
| 
 | ||||
|    d = vbsl_u8(d, b, c); | ||||
|    e = vbsl_u8(e, a, d); | ||||
| 
 | ||||
|    return e; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| png_read_filter_row_paeth3_neon(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev_row) | ||||
| { | ||||
|    png_bytep rp = row; | ||||
|    png_const_bytep pp = prev_row; | ||||
|    png_bytep rp_stop = row + row_info->rowbytes; | ||||
| 
 | ||||
|    uint8x16_t vtmp; | ||||
|    uint8x8x2_t *vrpt; | ||||
|    uint8x8x2_t vrp; | ||||
|    uint8x8_t vlast = vdup_n_u8(0); | ||||
|    uint8x8x4_t vdest; | ||||
|    vdest.val[3] = vdup_n_u8(0); | ||||
| 
 | ||||
|    vtmp = vld1q_u8(rp); | ||||
|    vrpt = png_ptr(uint8x8x2_t,&vtmp); | ||||
|    vrp = *vrpt; | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_paeth3_neon"); | ||||
| 
 | ||||
|    for (; rp < rp_stop; pp += 12) | ||||
|    { | ||||
|       uint8x8x2_t *vppt; | ||||
|       uint8x8x2_t vpp; | ||||
|       uint8x8_t vtmp1, vtmp2, vtmp3; | ||||
|       uint32x2_t *temp_pointer; | ||||
| 
 | ||||
|       vtmp = vld1q_u8(pp); | ||||
|       vppt = png_ptr(uint8x8x2_t,&vtmp); | ||||
|       vpp = *vppt; | ||||
| 
 | ||||
|       vdest.val[0] = paeth(vdest.val[3], vpp.val[0], vlast); | ||||
|       vdest.val[0] = vadd_u8(vdest.val[0], vrp.val[0]); | ||||
| 
 | ||||
|       vtmp1 = vext_u8(vrp.val[0], vrp.val[1], 3); | ||||
|       vtmp2 = vext_u8(vpp.val[0], vpp.val[1], 3); | ||||
|       vdest.val[1] = paeth(vdest.val[0], vtmp2, vpp.val[0]); | ||||
|       vdest.val[1] = vadd_u8(vdest.val[1], vtmp1); | ||||
| 
 | ||||
|       vtmp1 = vext_u8(vrp.val[0], vrp.val[1], 6); | ||||
|       vtmp3 = vext_u8(vpp.val[0], vpp.val[1], 6); | ||||
|       vdest.val[2] = paeth(vdest.val[1], vtmp3, vtmp2); | ||||
|       vdest.val[2] = vadd_u8(vdest.val[2], vtmp1); | ||||
| 
 | ||||
|       vtmp1 = vext_u8(vrp.val[1], vrp.val[1], 1); | ||||
|       vtmp2 = vext_u8(vpp.val[1], vpp.val[1], 1); | ||||
| 
 | ||||
|       vtmp = vld1q_u8(rp + 12); | ||||
|       vrpt = png_ptr(uint8x8x2_t,&vtmp); | ||||
|       vrp = *vrpt; | ||||
| 
 | ||||
|       vdest.val[3] = paeth(vdest.val[2], vtmp2, vtmp3); | ||||
|       vdest.val[3] = vadd_u8(vdest.val[3], vtmp1); | ||||
| 
 | ||||
|       vlast = vtmp2; | ||||
| 
 | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[0]), 0); | ||||
|       rp += 3; | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[1]), 0); | ||||
|       rp += 3; | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[2]), 0); | ||||
|       rp += 3; | ||||
|       vst1_lane_u32(png_ptr(uint32_t,rp), png_ldr(uint32x2_t,&vdest.val[3]), 0); | ||||
|       rp += 3; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void | ||||
| png_read_filter_row_paeth4_neon(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev_row) | ||||
| { | ||||
|    png_bytep rp = row; | ||||
|    png_bytep rp_stop = row + row_info->rowbytes; | ||||
|    png_const_bytep pp = prev_row; | ||||
| 
 | ||||
|    uint8x8_t vlast = vdup_n_u8(0); | ||||
|    uint8x8x4_t vdest; | ||||
|    vdest.val[3] = vdup_n_u8(0); | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_paeth4_neon"); | ||||
| 
 | ||||
|    for (; rp < rp_stop; rp += 16, pp += 16) | ||||
|    { | ||||
|       uint32x2x4_t vtmp; | ||||
|       uint8x8x4_t *vrpt, *vppt; | ||||
|       uint8x8x4_t vrp, vpp; | ||||
|       uint32x2x4_t *temp_pointer; | ||||
|       uint32x2x4_t vdest_val; | ||||
| 
 | ||||
|       vtmp = vld4_u32(png_ptr(uint32_t,rp)); | ||||
|       vrpt = png_ptr(uint8x8x4_t,&vtmp); | ||||
|       vrp = *vrpt; | ||||
|       vtmp = vld4_u32(png_ptrc(uint32_t,pp)); | ||||
|       vppt = png_ptr(uint8x8x4_t,&vtmp); | ||||
|       vpp = *vppt; | ||||
| 
 | ||||
|       vdest.val[0] = paeth(vdest.val[3], vpp.val[0], vlast); | ||||
|       vdest.val[0] = vadd_u8(vdest.val[0], vrp.val[0]); | ||||
|       vdest.val[1] = paeth(vdest.val[0], vpp.val[1], vpp.val[0]); | ||||
|       vdest.val[1] = vadd_u8(vdest.val[1], vrp.val[1]); | ||||
|       vdest.val[2] = paeth(vdest.val[1], vpp.val[2], vpp.val[1]); | ||||
|       vdest.val[2] = vadd_u8(vdest.val[2], vrp.val[2]); | ||||
|       vdest.val[3] = paeth(vdest.val[2], vpp.val[3], vpp.val[2]); | ||||
|       vdest.val[3] = vadd_u8(vdest.val[3], vrp.val[3]); | ||||
| 
 | ||||
|       vlast = vpp.val[3]; | ||||
| 
 | ||||
|       vdest_val = png_ldr(uint32x2x4_t, &vdest); | ||||
|       vst4_lane_u32(png_ptr(uint32_t,rp), vdest_val, 0); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| #endif /* PNG_ARM_NEON_OPT > 0 */ | ||||
| #endif /* PNG_ARM_NEON_IMPLEMENTATION == 1 (intrinsics) */ | ||||
| #endif /* READ */ | ||||
							
								
								
									
										151
									
								
								dep/libpng/src/arm/palette_neon_intrinsics.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								dep/libpng/src/arm/palette_neon_intrinsics.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,151 @@ | |||
| 
 | ||||
| /* palette_neon_intrinsics.c - NEON optimised palette expansion functions
 | ||||
|  * | ||||
|  * Copyright (c) 2018-2019 Cosmin Truta | ||||
|  * Copyright (c) 2017-2018 Arm Holdings. All rights reserved. | ||||
|  * Written by Richard Townsend <Richard.Townsend@arm.com>, February 2017. | ||||
|  * | ||||
|  * This code is released under the libpng license. | ||||
|  * For conditions of distribution and use, see the disclaimer | ||||
|  * and license in png.h | ||||
|  */ | ||||
| 
 | ||||
| #include "../pngpriv.h" | ||||
| 
 | ||||
| #if PNG_ARM_NEON_IMPLEMENTATION == 1 | ||||
| 
 | ||||
| #if defined(_MSC_VER) && !defined(__clang__) && defined(_M_ARM64) | ||||
| #  include <arm64_neon.h> | ||||
| #else | ||||
| #  include <arm_neon.h> | ||||
| #endif | ||||
| 
 | ||||
| /* Build an RGBA8 palette from the separate RGB and alpha palettes. */ | ||||
| void | ||||
| png_riffle_palette_neon(png_structrp png_ptr) | ||||
| { | ||||
|    png_const_colorp palette = png_ptr->palette; | ||||
|    png_bytep riffled_palette = png_ptr->riffled_palette; | ||||
|    png_const_bytep trans_alpha = png_ptr->trans_alpha; | ||||
|    int num_trans = png_ptr->num_trans; | ||||
|    int i; | ||||
| 
 | ||||
|    /* Initially black, opaque. */ | ||||
|    uint8x16x4_t w = {{ | ||||
|       vdupq_n_u8(0x00), | ||||
|       vdupq_n_u8(0x00), | ||||
|       vdupq_n_u8(0x00), | ||||
|       vdupq_n_u8(0xff), | ||||
|    }}; | ||||
| 
 | ||||
|    png_debug(1, "in png_riffle_palette_neon"); | ||||
| 
 | ||||
|    /* First, riffle the RGB colours into an RGBA8 palette.
 | ||||
|     * The alpha component is set to opaque for now. | ||||
|     */ | ||||
|    for (i = 0; i < 256; i += 16) | ||||
|    { | ||||
|       uint8x16x3_t v = vld3q_u8((png_const_bytep)(palette + i)); | ||||
|       w.val[0] = v.val[0]; | ||||
|       w.val[1] = v.val[1]; | ||||
|       w.val[2] = v.val[2]; | ||||
|       vst4q_u8(riffled_palette + (i << 2), w); | ||||
|    } | ||||
| 
 | ||||
|    /* Fix up the missing transparency values. */ | ||||
|    for (i = 0; i < num_trans; i++) | ||||
|       riffled_palette[(i << 2) + 3] = trans_alpha[i]; | ||||
| } | ||||
| 
 | ||||
| /* Expands a palettized row into RGBA8. */ | ||||
| int | ||||
| png_do_expand_palette_rgba8_neon(png_structrp png_ptr, png_row_infop row_info, | ||||
|     png_const_bytep row, png_bytepp ssp, png_bytepp ddp) | ||||
| { | ||||
|    png_uint_32 row_width = row_info->width; | ||||
|    const png_uint_32 *riffled_palette = | ||||
|       (const png_uint_32 *)png_ptr->riffled_palette; | ||||
|    const png_uint_32 pixels_per_chunk = 4; | ||||
|    png_uint_32 i; | ||||
| 
 | ||||
|    png_debug(1, "in png_do_expand_palette_rgba8_neon"); | ||||
| 
 | ||||
|    PNG_UNUSED(row) | ||||
|    if (row_width < pixels_per_chunk) | ||||
|       return 0; | ||||
| 
 | ||||
|    /* This function originally gets the last byte of the output row.
 | ||||
|     * The NEON part writes forward from a given position, so we have | ||||
|     * to seek this back by 4 pixels x 4 bytes. | ||||
|     */ | ||||
|    *ddp = *ddp - ((pixels_per_chunk * sizeof(png_uint_32)) - 1); | ||||
| 
 | ||||
|    for (i = 0; i < row_width; i += pixels_per_chunk) | ||||
|    { | ||||
|       uint32x4_t cur; | ||||
|       png_bytep sp = *ssp - i, dp = *ddp - (i << 2); | ||||
|       cur = vld1q_dup_u32 (riffled_palette + *(sp - 3)); | ||||
|       cur = vld1q_lane_u32(riffled_palette + *(sp - 2), cur, 1); | ||||
|       cur = vld1q_lane_u32(riffled_palette + *(sp - 1), cur, 2); | ||||
|       cur = vld1q_lane_u32(riffled_palette + *(sp - 0), cur, 3); | ||||
|       vst1q_u32((void *)dp, cur); | ||||
|    } | ||||
|    if (i != row_width) | ||||
|    { | ||||
|       /* Remove the amount that wasn't processed. */ | ||||
|       i -= pixels_per_chunk; | ||||
|    } | ||||
| 
 | ||||
|    /* Decrement output pointers. */ | ||||
|    *ssp = *ssp - i; | ||||
|    *ddp = *ddp - (i << 2); | ||||
|    return i; | ||||
| } | ||||
| 
 | ||||
| /* Expands a palettized row into RGB8. */ | ||||
| int | ||||
| png_do_expand_palette_rgb8_neon(png_structrp png_ptr, png_row_infop row_info, | ||||
|     png_const_bytep row, png_bytepp ssp, png_bytepp ddp) | ||||
| { | ||||
|    png_uint_32 row_width = row_info->width; | ||||
|    png_const_bytep palette = (png_const_bytep)png_ptr->palette; | ||||
|    const png_uint_32 pixels_per_chunk = 8; | ||||
|    png_uint_32 i; | ||||
| 
 | ||||
|    png_debug(1, "in png_do_expand_palette_rgb8_neon"); | ||||
| 
 | ||||
|    PNG_UNUSED(row) | ||||
|    if (row_width <= pixels_per_chunk) | ||||
|       return 0; | ||||
| 
 | ||||
|    /* Seeking this back by 8 pixels x 3 bytes. */ | ||||
|    *ddp = *ddp - ((pixels_per_chunk * sizeof(png_color)) - 1); | ||||
| 
 | ||||
|    for (i = 0; i < row_width; i += pixels_per_chunk) | ||||
|    { | ||||
|       uint8x8x3_t cur; | ||||
|       png_bytep sp = *ssp - i, dp = *ddp - ((i << 1) + i); | ||||
|       cur = vld3_dup_u8(palette + sizeof(png_color) * (*(sp - 7))); | ||||
|       cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 6)), cur, 1); | ||||
|       cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 5)), cur, 2); | ||||
|       cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 4)), cur, 3); | ||||
|       cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 3)), cur, 4); | ||||
|       cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 2)), cur, 5); | ||||
|       cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 1)), cur, 6); | ||||
|       cur = vld3_lane_u8(palette + sizeof(png_color) * (*(sp - 0)), cur, 7); | ||||
|       vst3_u8((void *)dp, cur); | ||||
|    } | ||||
| 
 | ||||
|    if (i != row_width) | ||||
|    { | ||||
|       /* Remove the amount that wasn't processed. */ | ||||
|       i -= pixels_per_chunk; | ||||
|    } | ||||
| 
 | ||||
|    /* Decrement output pointers. */ | ||||
|    *ssp = *ssp - i; | ||||
|    *ddp = *ddp - ((i << 1) + i); | ||||
|    return i; | ||||
| } | ||||
| 
 | ||||
| #endif /* PNG_ARM_NEON_IMPLEMENTATION */ | ||||
							
								
								
									
										391
									
								
								dep/libpng/src/intel/filter_sse2_intrinsics.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										391
									
								
								dep/libpng/src/intel/filter_sse2_intrinsics.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,391 @@ | |||
| 
 | ||||
| /* filter_sse2_intrinsics.c - SSE2 optimized filter functions
 | ||||
|  * | ||||
|  * Copyright (c) 2018 Cosmin Truta | ||||
|  * Copyright (c) 2016-2017 Glenn Randers-Pehrson | ||||
|  * Written by Mike Klein and Matt Sarett | ||||
|  * Derived from arm/filter_neon_intrinsics.c | ||||
|  * | ||||
|  * This code is released under the libpng license. | ||||
|  * For conditions of distribution and use, see the disclaimer | ||||
|  * and license in png.h | ||||
|  */ | ||||
| 
 | ||||
| #include "../pngpriv.h" | ||||
| 
 | ||||
| #ifdef PNG_READ_SUPPORTED | ||||
| 
 | ||||
| #if PNG_INTEL_SSE_IMPLEMENTATION > 0 | ||||
| 
 | ||||
| #include <immintrin.h> | ||||
| 
 | ||||
| /* Functions in this file look at most 3 pixels (a,b,c) to predict the 4th (d).
 | ||||
|  * They're positioned like this: | ||||
|  *    prev:  c b | ||||
|  *    row:   a d | ||||
|  * The Sub filter predicts d=a, Avg d=(a+b)/2, and Paeth predicts d to be | ||||
|  * whichever of a, b, or c is closest to p=a+b-c. | ||||
|  */ | ||||
| 
 | ||||
| static __m128i load4(const void* p) { | ||||
|    int tmp; | ||||
|    memcpy(&tmp, p, sizeof(tmp)); | ||||
|    return _mm_cvtsi32_si128(tmp); | ||||
| } | ||||
| 
 | ||||
| static void store4(void* p, __m128i v) { | ||||
|    int tmp = _mm_cvtsi128_si32(v); | ||||
|    memcpy(p, &tmp, sizeof(int)); | ||||
| } | ||||
| 
 | ||||
| static __m128i load3(const void* p) { | ||||
|    png_uint_32 tmp = 0; | ||||
|    memcpy(&tmp, p, 3); | ||||
|    return _mm_cvtsi32_si128(tmp); | ||||
| } | ||||
| 
 | ||||
| static void store3(void* p, __m128i v) { | ||||
|    int tmp = _mm_cvtsi128_si32(v); | ||||
|    memcpy(p, &tmp, 3); | ||||
| } | ||||
| 
 | ||||
| void png_read_filter_row_sub3_sse2(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev) | ||||
| { | ||||
|    /* The Sub filter predicts each pixel as the previous pixel, a.
 | ||||
|     * There is no pixel to the left of the first pixel.  It's encoded directly. | ||||
|     * That works with our main loop if we just say that left pixel was zero. | ||||
|     */ | ||||
|    size_t rb; | ||||
| 
 | ||||
|    __m128i a, d = _mm_setzero_si128(); | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_sub3_sse2"); | ||||
| 
 | ||||
|    rb = row_info->rowbytes; | ||||
|    while (rb >= 4) { | ||||
|       a = d; d = load4(row); | ||||
|       d = _mm_add_epi8(d, a); | ||||
|       store3(row, d); | ||||
| 
 | ||||
|       row += 3; | ||||
|       rb  -= 3; | ||||
|    } | ||||
|    if (rb > 0) { | ||||
|       a = d; d = load3(row); | ||||
|       d = _mm_add_epi8(d, a); | ||||
|       store3(row, d); | ||||
| 
 | ||||
|       row += 3; | ||||
|       rb  -= 3; | ||||
|    } | ||||
|    PNG_UNUSED(prev) | ||||
| } | ||||
| 
 | ||||
| void png_read_filter_row_sub4_sse2(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev) | ||||
| { | ||||
|    /* The Sub filter predicts each pixel as the previous pixel, a.
 | ||||
|     * There is no pixel to the left of the first pixel.  It's encoded directly. | ||||
|     * That works with our main loop if we just say that left pixel was zero. | ||||
|     */ | ||||
|    size_t rb; | ||||
| 
 | ||||
|    __m128i a, d = _mm_setzero_si128(); | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_sub4_sse2"); | ||||
| 
 | ||||
|    rb = row_info->rowbytes+4; | ||||
|    while (rb > 4) { | ||||
|       a = d; d = load4(row); | ||||
|       d = _mm_add_epi8(d, a); | ||||
|       store4(row, d); | ||||
| 
 | ||||
|       row += 4; | ||||
|       rb  -= 4; | ||||
|    } | ||||
|    PNG_UNUSED(prev) | ||||
| } | ||||
| 
 | ||||
| void png_read_filter_row_avg3_sse2(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev) | ||||
| { | ||||
|    /* The Avg filter predicts each pixel as the (truncated) average of a and b.
 | ||||
|     * There's no pixel to the left of the first pixel.  Luckily, it's | ||||
|     * predicted to be half of the pixel above it.  So again, this works | ||||
|     * perfectly with our loop if we make sure a starts at zero. | ||||
|     */ | ||||
| 
 | ||||
|    size_t rb; | ||||
| 
 | ||||
|    const __m128i zero = _mm_setzero_si128(); | ||||
| 
 | ||||
|    __m128i    b; | ||||
|    __m128i a, d = zero; | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_avg3_sse2"); | ||||
|    rb = row_info->rowbytes; | ||||
|    while (rb >= 4) { | ||||
|       __m128i avg; | ||||
|              b = load4(prev); | ||||
|       a = d; d = load4(row ); | ||||
| 
 | ||||
|       /* PNG requires a truncating average, so we can't just use _mm_avg_epu8 */ | ||||
|       avg = _mm_avg_epu8(a,b); | ||||
|       /* ...but we can fix it up by subtracting off 1 if it rounded up. */ | ||||
|       avg = _mm_sub_epi8(avg, _mm_and_si128(_mm_xor_si128(a,b), | ||||
|                                             _mm_set1_epi8(1))); | ||||
|       d = _mm_add_epi8(d, avg); | ||||
|       store3(row, d); | ||||
| 
 | ||||
|       prev += 3; | ||||
|       row  += 3; | ||||
|       rb   -= 3; | ||||
|    } | ||||
|    if (rb > 0) { | ||||
|       __m128i avg; | ||||
|              b = load3(prev); | ||||
|       a = d; d = load3(row ); | ||||
| 
 | ||||
|       /* PNG requires a truncating average, so we can't just use _mm_avg_epu8 */ | ||||
|       avg = _mm_avg_epu8(a,b); | ||||
|       /* ...but we can fix it up by subtracting off 1 if it rounded up. */ | ||||
|       avg = _mm_sub_epi8(avg, _mm_and_si128(_mm_xor_si128(a,b), | ||||
|                                             _mm_set1_epi8(1))); | ||||
| 
 | ||||
|       d = _mm_add_epi8(d, avg); | ||||
|       store3(row, d); | ||||
| 
 | ||||
|       prev += 3; | ||||
|       row  += 3; | ||||
|       rb   -= 3; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void png_read_filter_row_avg4_sse2(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev) | ||||
| { | ||||
|    /* The Avg filter predicts each pixel as the (truncated) average of a and b.
 | ||||
|     * There's no pixel to the left of the first pixel.  Luckily, it's | ||||
|     * predicted to be half of the pixel above it.  So again, this works | ||||
|     * perfectly with our loop if we make sure a starts at zero. | ||||
|     */ | ||||
|    size_t rb; | ||||
|    const __m128i zero = _mm_setzero_si128(); | ||||
|    __m128i    b; | ||||
|    __m128i a, d = zero; | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_avg4_sse2"); | ||||
| 
 | ||||
|    rb = row_info->rowbytes+4; | ||||
|    while (rb > 4) { | ||||
|       __m128i avg; | ||||
|              b = load4(prev); | ||||
|       a = d; d = load4(row ); | ||||
| 
 | ||||
|       /* PNG requires a truncating average, so we can't just use _mm_avg_epu8 */ | ||||
|       avg = _mm_avg_epu8(a,b); | ||||
|       /* ...but we can fix it up by subtracting off 1 if it rounded up. */ | ||||
|       avg = _mm_sub_epi8(avg, _mm_and_si128(_mm_xor_si128(a,b), | ||||
|                                             _mm_set1_epi8(1))); | ||||
| 
 | ||||
|       d = _mm_add_epi8(d, avg); | ||||
|       store4(row, d); | ||||
| 
 | ||||
|       prev += 4; | ||||
|       row  += 4; | ||||
|       rb   -= 4; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| /* Returns |x| for 16-bit lanes. */ | ||||
| static __m128i abs_i16(__m128i x) { | ||||
| #if PNG_INTEL_SSE_IMPLEMENTATION >= 2 | ||||
|    return _mm_abs_epi16(x); | ||||
| #else | ||||
|    /* Read this all as, return x<0 ? -x : x.
 | ||||
|    * To negate two's complement, you flip all the bits then add 1. | ||||
|     */ | ||||
|    __m128i is_negative = _mm_cmplt_epi16(x, _mm_setzero_si128()); | ||||
| 
 | ||||
|    /* Flip negative lanes. */ | ||||
|    x = _mm_xor_si128(x, is_negative); | ||||
| 
 | ||||
|    /* +1 to negative lanes, else +0. */ | ||||
|    x = _mm_sub_epi16(x, is_negative); | ||||
|    return x; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| /* Bytewise c ? t : e. */ | ||||
| static __m128i if_then_else(__m128i c, __m128i t, __m128i e) { | ||||
| #if PNG_INTEL_SSE_IMPLEMENTATION >= 3 | ||||
|    return _mm_blendv_epi8(e,t,c); | ||||
| #else | ||||
|    return _mm_or_si128(_mm_and_si128(c, t), _mm_andnot_si128(c, e)); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void png_read_filter_row_paeth3_sse2(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev) | ||||
| { | ||||
|    /* Paeth tries to predict pixel d using the pixel to the left of it, a,
 | ||||
|     * and two pixels from the previous row, b and c: | ||||
|     *   prev: c b | ||||
|     *   row:  a d | ||||
|     * The Paeth function predicts d to be whichever of a, b, or c is nearest to | ||||
|     * p=a+b-c. | ||||
|     * | ||||
|     * The first pixel has no left context, and so uses an Up filter, p = b. | ||||
|     * This works naturally with our main loop's p = a+b-c if we force a and c | ||||
|     * to zero. | ||||
|     * Here we zero b and d, which become c and a respectively at the start of | ||||
|     * the loop. | ||||
|     */ | ||||
|    size_t rb; | ||||
|    const __m128i zero = _mm_setzero_si128(); | ||||
|    __m128i c, b = zero, | ||||
|            a, d = zero; | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_paeth3_sse2"); | ||||
| 
 | ||||
|    rb = row_info->rowbytes; | ||||
|    while (rb >= 4) { | ||||
|       /* It's easiest to do this math (particularly, deal with pc) with 16-bit
 | ||||
|        * intermediates. | ||||
|        */ | ||||
|       __m128i pa,pb,pc,smallest,nearest; | ||||
|       c = b; b = _mm_unpacklo_epi8(load4(prev), zero); | ||||
|       a = d; d = _mm_unpacklo_epi8(load4(row ), zero); | ||||
| 
 | ||||
|       /* (p-a) == (a+b-c - a) == (b-c) */ | ||||
| 
 | ||||
|       pa = _mm_sub_epi16(b,c); | ||||
| 
 | ||||
|       /* (p-b) == (a+b-c - b) == (a-c) */ | ||||
|       pb = _mm_sub_epi16(a,c); | ||||
| 
 | ||||
|       /* (p-c) == (a+b-c - c) == (a+b-c-c) == (b-c)+(a-c) */ | ||||
|       pc = _mm_add_epi16(pa,pb); | ||||
| 
 | ||||
|       pa = abs_i16(pa);  /* |p-a| */ | ||||
|       pb = abs_i16(pb);  /* |p-b| */ | ||||
|       pc = abs_i16(pc);  /* |p-c| */ | ||||
| 
 | ||||
|       smallest = _mm_min_epi16(pc, _mm_min_epi16(pa, pb)); | ||||
| 
 | ||||
|       /* Paeth breaks ties favoring a over b over c. */ | ||||
|       nearest  = if_then_else(_mm_cmpeq_epi16(smallest, pa), a, | ||||
|                  if_then_else(_mm_cmpeq_epi16(smallest, pb), b, | ||||
|                                                              c)); | ||||
| 
 | ||||
|       /* Note `_epi8`: we need addition to wrap modulo 255. */ | ||||
|       d = _mm_add_epi8(d, nearest); | ||||
|       store3(row, _mm_packus_epi16(d,d)); | ||||
| 
 | ||||
|       prev += 3; | ||||
|       row  += 3; | ||||
|       rb   -= 3; | ||||
|    } | ||||
|    if (rb > 0) { | ||||
|       /* It's easiest to do this math (particularly, deal with pc) with 16-bit
 | ||||
|        * intermediates. | ||||
|        */ | ||||
|       __m128i pa,pb,pc,smallest,nearest; | ||||
|       c = b; b = _mm_unpacklo_epi8(load3(prev), zero); | ||||
|       a = d; d = _mm_unpacklo_epi8(load3(row ), zero); | ||||
| 
 | ||||
|       /* (p-a) == (a+b-c - a) == (b-c) */ | ||||
|       pa = _mm_sub_epi16(b,c); | ||||
| 
 | ||||
|       /* (p-b) == (a+b-c - b) == (a-c) */ | ||||
|       pb = _mm_sub_epi16(a,c); | ||||
| 
 | ||||
|       /* (p-c) == (a+b-c - c) == (a+b-c-c) == (b-c)+(a-c) */ | ||||
|       pc = _mm_add_epi16(pa,pb); | ||||
| 
 | ||||
|       pa = abs_i16(pa);  /* |p-a| */ | ||||
|       pb = abs_i16(pb);  /* |p-b| */ | ||||
|       pc = abs_i16(pc);  /* |p-c| */ | ||||
| 
 | ||||
|       smallest = _mm_min_epi16(pc, _mm_min_epi16(pa, pb)); | ||||
| 
 | ||||
|       /* Paeth breaks ties favoring a over b over c. */ | ||||
|       nearest  = if_then_else(_mm_cmpeq_epi16(smallest, pa), a, | ||||
|                          if_then_else(_mm_cmpeq_epi16(smallest, pb), b, | ||||
|                                                                      c)); | ||||
| 
 | ||||
|       /* Note `_epi8`: we need addition to wrap modulo 255. */ | ||||
|       d = _mm_add_epi8(d, nearest); | ||||
|       store3(row, _mm_packus_epi16(d,d)); | ||||
| 
 | ||||
|       prev += 3; | ||||
|       row  += 3; | ||||
|       rb   -= 3; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void png_read_filter_row_paeth4_sse2(png_row_infop row_info, png_bytep row, | ||||
|    png_const_bytep prev) | ||||
| { | ||||
|    /* Paeth tries to predict pixel d using the pixel to the left of it, a,
 | ||||
|     * and two pixels from the previous row, b and c: | ||||
|     *   prev: c b | ||||
|     *   row:  a d | ||||
|     * The Paeth function predicts d to be whichever of a, b, or c is nearest to | ||||
|     * p=a+b-c. | ||||
|     * | ||||
|     * The first pixel has no left context, and so uses an Up filter, p = b. | ||||
|     * This works naturally with our main loop's p = a+b-c if we force a and c | ||||
|     * to zero. | ||||
|     * Here we zero b and d, which become c and a respectively at the start of | ||||
|     * the loop. | ||||
|     */ | ||||
|    size_t rb; | ||||
|    const __m128i zero = _mm_setzero_si128(); | ||||
|    __m128i pa,pb,pc,smallest,nearest; | ||||
|    __m128i c, b = zero, | ||||
|            a, d = zero; | ||||
| 
 | ||||
|    png_debug(1, "in png_read_filter_row_paeth4_sse2"); | ||||
| 
 | ||||
|    rb = row_info->rowbytes+4; | ||||
|    while (rb > 4) { | ||||
|       /* It's easiest to do this math (particularly, deal with pc) with 16-bit
 | ||||
|        * intermediates. | ||||
|        */ | ||||
|       c = b; b = _mm_unpacklo_epi8(load4(prev), zero); | ||||
|       a = d; d = _mm_unpacklo_epi8(load4(row ), zero); | ||||
| 
 | ||||
|       /* (p-a) == (a+b-c - a) == (b-c) */ | ||||
|       pa = _mm_sub_epi16(b,c); | ||||
| 
 | ||||
|       /* (p-b) == (a+b-c - b) == (a-c) */ | ||||
|       pb = _mm_sub_epi16(a,c); | ||||
| 
 | ||||
|       /* (p-c) == (a+b-c - c) == (a+b-c-c) == (b-c)+(a-c) */ | ||||
|       pc = _mm_add_epi16(pa,pb); | ||||
| 
 | ||||
|       pa = abs_i16(pa);  /* |p-a| */ | ||||
|       pb = abs_i16(pb);  /* |p-b| */ | ||||
|       pc = abs_i16(pc);  /* |p-c| */ | ||||
| 
 | ||||
|       smallest = _mm_min_epi16(pc, _mm_min_epi16(pa, pb)); | ||||
| 
 | ||||
|       /* Paeth breaks ties favoring a over b over c. */ | ||||
|       nearest  = if_then_else(_mm_cmpeq_epi16(smallest, pa), a, | ||||
|                          if_then_else(_mm_cmpeq_epi16(smallest, pb), b, | ||||
|                                                                      c)); | ||||
| 
 | ||||
|       /* Note `_epi8`: we need addition to wrap modulo 255. */ | ||||
|       d = _mm_add_epi8(d, nearest); | ||||
|       store4(row, _mm_packus_epi16(d,d)); | ||||
| 
 | ||||
|       prev += 4; | ||||
|       row  += 4; | ||||
|       rb   -= 4; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| #endif /* PNG_INTEL_SSE_IMPLEMENTATION > 0 */ | ||||
| #endif /* READ */ | ||||
							
								
								
									
										52
									
								
								dep/libpng/src/intel/intel_init.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								dep/libpng/src/intel/intel_init.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,52 @@ | |||
| 
 | ||||
| /* intel_init.c - SSE2 optimized filter functions
 | ||||
|  * | ||||
|  * Copyright (c) 2018 Cosmin Truta | ||||
|  * Copyright (c) 2016-2017 Glenn Randers-Pehrson | ||||
|  * Written by Mike Klein and Matt Sarett, Google, Inc. | ||||
|  * Derived from arm/arm_init.c | ||||
|  * | ||||
|  * This code is released under the libpng license. | ||||
|  * For conditions of distribution and use, see the disclaimer | ||||
|  * and license in png.h | ||||
|  */ | ||||
| 
 | ||||
| #include "../pngpriv.h" | ||||
| 
 | ||||
| #ifdef PNG_READ_SUPPORTED | ||||
| #if PNG_INTEL_SSE_IMPLEMENTATION > 0 | ||||
| 
 | ||||
| void | ||||
| png_init_filter_functions_sse2(png_structp pp, unsigned int bpp) | ||||
| { | ||||
|    /* The techniques used to implement each of these filters in SSE operate on
 | ||||
|     * one pixel at a time. | ||||
|     * So they generally speed up 3bpp images about 3x, 4bpp images about 4x. | ||||
|     * They can scale up to 6 and 8 bpp images and down to 2 bpp images, | ||||
|     * but they'd not likely have any benefit for 1bpp images. | ||||
|     * Most of these can be implemented using only MMX and 64-bit registers, | ||||
|     * but they end up a bit slower than using the equally-ubiquitous SSE2. | ||||
|    */ | ||||
|    png_debug(1, "in png_init_filter_functions_sse2"); | ||||
|    if (bpp == 3) | ||||
|    { | ||||
|       pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub3_sse2; | ||||
|       pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg3_sse2; | ||||
|       pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = | ||||
|          png_read_filter_row_paeth3_sse2; | ||||
|    } | ||||
|    else if (bpp == 4) | ||||
|    { | ||||
|       pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub4_sse2; | ||||
|       pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg4_sse2; | ||||
|       pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = | ||||
|           png_read_filter_row_paeth4_sse2; | ||||
|    } | ||||
| 
 | ||||
|    /* No need optimize PNG_FILTER_VALUE_UP.  The compiler should
 | ||||
|     * autovectorize. | ||||
|     */ | ||||
| } | ||||
| 
 | ||||
| #endif /* PNG_INTEL_SSE_IMPLEMENTATION > 0 */ | ||||
| #endif /* PNG_READ_SUPPORTED */ | ||||
							
								
								
									
										4559
									
								
								dep/libpng/src/png.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4559
									
								
								dep/libpng/src/png.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										153
									
								
								dep/libpng/src/pngdebug.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								dep/libpng/src/pngdebug.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,153 @@ | |||
| 
 | ||||
| /* pngdebug.h - Debugging macros for libpng, also used in pngtest.c
 | ||||
|  * | ||||
|  * Copyright (c) 2018 Cosmin Truta | ||||
|  * Copyright (c) 1998-2002,2004,2006-2013 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_DEBUG at compile time for debugging information.  Higher
 | ||||
|  * numbers for PNG_DEBUG mean more debugging information.  This has | ||||
|  * only been added since version 0.95 so it is not implemented throughout | ||||
|  * libpng yet, but more support will be added as needed. | ||||
|  * | ||||
|  * png_debug[1-2]?(level, message ,arg{0-2}) | ||||
|  *   Expands to a statement (either a simple expression or a compound | ||||
|  *   do..while(0) statement) that outputs a message with parameter | ||||
|  *   substitution if PNG_DEBUG is defined to 2 or more.  If PNG_DEBUG | ||||
|  *   is undefined, 0 or 1 every png_debug expands to a simple expression | ||||
|  *   (actually ((void)0)). | ||||
|  * | ||||
|  *   level: level of detail of message, starting at 0.  A level 'n' | ||||
|  *          message is preceded by 'n' 3-space indentations (not implemented | ||||
|  *          on Microsoft compilers unless PNG_DEBUG_FILE is also | ||||
|  *          defined, to allow debug DLL compilation with no standard IO). | ||||
|  *   message: a printf(3) style text string.  A trailing '\n' is added | ||||
|  *            to the message. | ||||
|  *   arg: 0 to 2 arguments for printf(3) style substitution in message. | ||||
|  */ | ||||
| #ifndef PNGDEBUG_H | ||||
| #define PNGDEBUG_H | ||||
| /* These settings control the formatting of messages in png.c and pngerror.c */ | ||||
| /* Moved to pngdebug.h at 1.5.0 */ | ||||
| #  ifndef PNG_LITERAL_SHARP | ||||
| #    define PNG_LITERAL_SHARP 0x23 | ||||
| #  endif | ||||
| #  ifndef PNG_LITERAL_LEFT_SQUARE_BRACKET | ||||
| #    define PNG_LITERAL_LEFT_SQUARE_BRACKET 0x5b | ||||
| #  endif | ||||
| #  ifndef PNG_LITERAL_RIGHT_SQUARE_BRACKET | ||||
| #    define PNG_LITERAL_RIGHT_SQUARE_BRACKET 0x5d | ||||
| #  endif | ||||
| #  ifndef PNG_STRING_NEWLINE | ||||
| #    define PNG_STRING_NEWLINE "\n" | ||||
| #  endif | ||||
| 
 | ||||
| #ifdef PNG_DEBUG | ||||
| #  if (PNG_DEBUG > 0) | ||||
| #    if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) | ||||
| #      include <crtdbg.h> | ||||
| #      if (PNG_DEBUG > 1) | ||||
| #        ifndef _DEBUG | ||||
| #          define _DEBUG | ||||
| #        endif | ||||
| #        ifndef png_debug | ||||
| #          define png_debug(l,m)  _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) | ||||
| #        endif | ||||
| #        ifndef png_debug1 | ||||
| #          define png_debug1(l,m,p1)  _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) | ||||
| #        endif | ||||
| #        ifndef png_debug2 | ||||
| #          define png_debug2(l,m,p1,p2) \ | ||||
|              _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) | ||||
| #        endif | ||||
| #      endif | ||||
| #    else /* PNG_DEBUG_FILE || !_MSC_VER */ | ||||
| #      ifndef PNG_STDIO_SUPPORTED | ||||
| #        include <stdio.h> /* not included yet */ | ||||
| #      endif | ||||
| #      ifndef PNG_DEBUG_FILE | ||||
| #        define PNG_DEBUG_FILE stderr | ||||
| #      endif /* PNG_DEBUG_FILE */ | ||||
| 
 | ||||
| #      if (PNG_DEBUG > 1) | ||||
| #        ifdef __STDC__ | ||||
| #          ifndef png_debug | ||||
| #            define png_debug(l,m) \ | ||||
|        do { \ | ||||
|        int num_tabs=l; \ | ||||
|        fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? "   " : \ | ||||
|          (num_tabs==2 ? "      " : (num_tabs>2 ? "         " : "")))); \ | ||||
|        } while (0) | ||||
| #          endif | ||||
| #          ifndef png_debug1 | ||||
| #            define png_debug1(l,m,p1) \ | ||||
|        do { \ | ||||
|        int num_tabs=l; \ | ||||
|        fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? "   " : \ | ||||
|          (num_tabs==2 ? "      " : (num_tabs>2 ? "         " : ""))),p1); \ | ||||
|        } while (0) | ||||
| #          endif | ||||
| #          ifndef png_debug2 | ||||
| #            define png_debug2(l,m,p1,p2) \ | ||||
|        do { \ | ||||
|        int num_tabs=l; \ | ||||
|        fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? "   " : \ | ||||
|          (num_tabs==2 ? "      " : (num_tabs>2 ? "         " : ""))),p1,p2);\ | ||||
|        } while (0) | ||||
| #          endif | ||||
| #        else /* __STDC __ */ | ||||
| #          ifndef png_debug | ||||
| #            define png_debug(l,m) \ | ||||
|        do { \ | ||||
|        int num_tabs=l; \ | ||||
|        char format[256]; \ | ||||
|        snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ | ||||
|          (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ | ||||
|          m,PNG_STRING_NEWLINE); \ | ||||
|        fprintf(PNG_DEBUG_FILE,format); \ | ||||
|        } while (0) | ||||
| #          endif | ||||
| #          ifndef png_debug1 | ||||
| #            define png_debug1(l,m,p1) \ | ||||
|        do { \ | ||||
|        int num_tabs=l; \ | ||||
|        char format[256]; \ | ||||
|        snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ | ||||
|          (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ | ||||
|          m,PNG_STRING_NEWLINE); \ | ||||
|        fprintf(PNG_DEBUG_FILE,format,p1); \ | ||||
|        } while (0) | ||||
| #          endif | ||||
| #          ifndef png_debug2 | ||||
| #            define png_debug2(l,m,p1,p2) \ | ||||
|        do { \ | ||||
|        int num_tabs=l; \ | ||||
|        char format[256]; \ | ||||
|        snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ | ||||
|          (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ | ||||
|          m,PNG_STRING_NEWLINE); \ | ||||
|        fprintf(PNG_DEBUG_FILE,format,p1,p2); \ | ||||
|        } while (0) | ||||
| #          endif | ||||
| #        endif /* __STDC __ */ | ||||
| #      endif /* (PNG_DEBUG > 1) */ | ||||
| 
 | ||||
| #    endif /* _MSC_VER */ | ||||
| #  endif /* (PNG_DEBUG > 0) */ | ||||
| #endif /* PNG_DEBUG */ | ||||
| #ifndef png_debug | ||||
| #  define png_debug(l, m) ((void)0) | ||||
| #endif | ||||
| #ifndef png_debug1 | ||||
| #  define png_debug1(l, m, p1) ((void)0) | ||||
| #endif | ||||
| #ifndef png_debug2 | ||||
| #  define png_debug2(l, m, p1, p2) ((void)0) | ||||
| #endif | ||||
| #endif /* PNGDEBUG_H */ | ||||
							
								
								
									
										957
									
								
								dep/libpng/src/pngerror.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										957
									
								
								dep/libpng/src/pngerror.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,957 @@ | |||
| 
 | ||||
| /* pngerror.c - stub functions for i/o and memory allocation
 | ||||
|  * | ||||
|  * Copyright (c) 2018-2024 Cosmin Truta | ||||
|  * Copyright (c) 1998-2002,2004,2006-2017 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 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. | ||||
|  */ | ||||
| 
 | ||||
| #include "pngpriv.h" | ||||
| 
 | ||||
| #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) | ||||
| 
 | ||||
| static PNG_FUNCTION(void, png_default_error,PNGARG((png_const_structrp png_ptr, | ||||
|     png_const_charp error_message)),PNG_NORETURN); | ||||
| 
 | ||||
| #ifdef PNG_WARNINGS_SUPPORTED | ||||
| static void /* PRIVATE */ | ||||
| png_default_warning PNGARG((png_const_structrp png_ptr, | ||||
|     png_const_charp warning_message)); | ||||
| #endif /* 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. | ||||
|  */ | ||||
| #ifdef PNG_ERROR_TEXT_SUPPORTED | ||||
| PNG_FUNCTION(void,PNGAPI | ||||
| png_error,(png_const_structrp png_ptr, png_const_charp error_message), | ||||
|     PNG_NORETURN) | ||||
| { | ||||
| #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)) != 0) | ||||
|       { | ||||
|          if (*error_message == PNG_LITERAL_SHARP) | ||||
|          { | ||||
|             /* 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) != 0) | ||||
|             { | ||||
|                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) != 0) | ||||
|             { | ||||
|                msg[0] = '0'; | ||||
|                msg[1] = '\0'; | ||||
|                error_message = msg; | ||||
|             } | ||||
|          } | ||||
|       } | ||||
|    } | ||||
| #endif | ||||
|    if (png_ptr != NULL && png_ptr->error_fn != NULL) | ||||
|       (*(png_ptr->error_fn))(png_constcast(png_structrp,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 | ||||
| PNG_FUNCTION(void,PNGAPI | ||||
| png_err,(png_const_structrp png_ptr),PNG_NORETURN) | ||||
| { | ||||
|    /* Prior to 1.5.2 the error_fn received a NULL pointer, expressed
 | ||||
|     * erroneously as '\0', instead of the empty string "".  This was | ||||
|     * apparently an error, introduced in libpng-1.2.20, and png_default_error | ||||
|     * will crash in this case. | ||||
|     */ | ||||
|    if (png_ptr != NULL && png_ptr->error_fn != NULL) | ||||
|       (*(png_ptr->error_fn))(png_constcast(png_structrp,png_ptr), ""); | ||||
| 
 | ||||
|    /* If the custom handler doesn't exist, or if it returns,
 | ||||
|       use the default handler, which will not return. */ | ||||
|    png_default_error(png_ptr, ""); | ||||
| } | ||||
| #endif /* ERROR_TEXT */ | ||||
| 
 | ||||
| /* Utility to safely appends strings to a buffer.  This never errors out so
 | ||||
|  * error checking is not required in the caller. | ||||
|  */ | ||||
| size_t | ||||
| png_safecat(png_charp buffer, size_t bufsize, size_t pos, | ||||
|     png_const_charp string) | ||||
| { | ||||
|    if (buffer != NULL && pos < bufsize) | ||||
|    { | ||||
|       if (string != NULL) | ||||
|          while (*string != '\0' && pos < bufsize-1) | ||||
|            buffer[pos++] = *string++; | ||||
| 
 | ||||
|       buffer[pos] = '\0'; | ||||
|    } | ||||
| 
 | ||||
|    return pos; | ||||
| } | ||||
| 
 | ||||
| #if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_TIME_RFC1123_SUPPORTED) | ||||
| /* Utility to dump an unsigned value into a buffer, given a start pointer and
 | ||||
|  * and end pointer (which should point just *beyond* the end of the buffer!) | ||||
|  * Returns the pointer to the start of the formatted string. | ||||
|  */ | ||||
| png_charp | ||||
| png_format_number(png_const_charp start, png_charp end, int format, | ||||
|     png_alloc_size_t number) | ||||
| { | ||||
|    int count = 0;    /* number of digits output */ | ||||
|    int mincount = 1; /* minimum number required */ | ||||
|    int output = 0;   /* digit output (for the fixed point format) */ | ||||
| 
 | ||||
|    *--end = '\0'; | ||||
| 
 | ||||
|    /* This is written so that the loop always runs at least once, even with
 | ||||
|     * number zero. | ||||
|     */ | ||||
|    while (end > start && (number != 0 || count < mincount)) | ||||
|    { | ||||
| 
 | ||||
|       static const char digits[] = "0123456789ABCDEF"; | ||||
| 
 | ||||
|       switch (format) | ||||
|       { | ||||
|          case PNG_NUMBER_FORMAT_fixed: | ||||
|             /* Needs five digits (the fraction) */ | ||||
|             mincount = 5; | ||||
|             if (output != 0 || number % 10 != 0) | ||||
|             { | ||||
|                *--end = digits[number % 10]; | ||||
|                output = 1; | ||||
|             } | ||||
|             number /= 10; | ||||
|             break; | ||||
| 
 | ||||
|          case PNG_NUMBER_FORMAT_02u: | ||||
|             /* Expects at least 2 digits. */ | ||||
|             mincount = 2; | ||||
|             /* FALLTHROUGH */ | ||||
| 
 | ||||
|          case PNG_NUMBER_FORMAT_u: | ||||
|             *--end = digits[number % 10]; | ||||
|             number /= 10; | ||||
|             break; | ||||
| 
 | ||||
|          case PNG_NUMBER_FORMAT_02x: | ||||
|             /* This format expects at least two digits */ | ||||
|             mincount = 2; | ||||
|             /* FALLTHROUGH */ | ||||
| 
 | ||||
|          case PNG_NUMBER_FORMAT_x: | ||||
|             *--end = digits[number & 0xf]; | ||||
|             number >>= 4; | ||||
|             break; | ||||
| 
 | ||||
|          default: /* an error */ | ||||
|             number = 0; | ||||
|             break; | ||||
|       } | ||||
| 
 | ||||
|       /* Keep track of the number of digits added */ | ||||
|       ++count; | ||||
| 
 | ||||
|       /* Float a fixed number here: */ | ||||
|       if ((format == PNG_NUMBER_FORMAT_fixed) && (count == 5) && (end > start)) | ||||
|       { | ||||
|          /* End of the fraction, but maybe nothing was output?  In that case
 | ||||
|           * drop the decimal point.  If the number is a true zero handle that | ||||
|           * here. | ||||
|           */ | ||||
|          if (output != 0) | ||||
|             *--end = '.'; | ||||
|          else if (number == 0) /* and !output */ | ||||
|             *--end = '0'; | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
|    return end; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_WARNINGS_SUPPORTED | ||||
| /* 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_const_structrp 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)) != 0) | ||||
| #endif | ||||
|       { | ||||
|          if (*warning_message == PNG_LITERAL_SHARP) | ||||
|          { | ||||
|             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_constcast(png_structrp,png_ptr), | ||||
|           warning_message + offset); | ||||
|    else | ||||
|       png_default_warning(png_ptr, warning_message + offset); | ||||
| } | ||||
| 
 | ||||
| /* These functions support 'formatted' warning messages with up to
 | ||||
|  * PNG_WARNING_PARAMETER_COUNT parameters.  In the format string the parameter | ||||
|  * is introduced by @<number>, where 'number' starts at 1.  This follows the | ||||
|  * standard established by X/Open for internationalizable error messages. | ||||
|  */ | ||||
| void | ||||
| png_warning_parameter(png_warning_parameters p, int number, | ||||
|     png_const_charp string) | ||||
| { | ||||
|    if (number > 0 && number <= PNG_WARNING_PARAMETER_COUNT) | ||||
|       (void)png_safecat(p[number-1], (sizeof p[number-1]), 0, string); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| png_warning_parameter_unsigned(png_warning_parameters p, int number, int format, | ||||
|     png_alloc_size_t value) | ||||
| { | ||||
|    char buffer[PNG_NUMBER_BUFFER_SIZE] = {0}; | ||||
|    png_warning_parameter(p, number, PNG_FORMAT_NUMBER(buffer, format, value)); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| png_warning_parameter_signed(png_warning_parameters p, int number, int format, | ||||
|     png_int_32 value) | ||||
| { | ||||
|    png_alloc_size_t u; | ||||
|    png_charp str; | ||||
|    char buffer[PNG_NUMBER_BUFFER_SIZE] = {0}; | ||||
| 
 | ||||
|    /* Avoid overflow by doing the negate in a png_alloc_size_t: */ | ||||
|    u = (png_alloc_size_t)value; | ||||
|    if (value < 0) | ||||
|       u = ~u + 1; | ||||
| 
 | ||||
|    str = PNG_FORMAT_NUMBER(buffer, format, u); | ||||
| 
 | ||||
|    if (value < 0 && str > buffer) | ||||
|       *--str = '-'; | ||||
| 
 | ||||
|    png_warning_parameter(p, number, str); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| png_formatted_warning(png_const_structrp png_ptr, png_warning_parameters p, | ||||
|     png_const_charp message) | ||||
| { | ||||
|    /* The internal buffer is just 192 bytes - enough for all our messages,
 | ||||
|     * overflow doesn't happen because this code checks!  If someone figures | ||||
|     * out how to send us a message longer than 192 bytes, all that will | ||||
|     * happen is that the message will be truncated appropriately. | ||||
|     */ | ||||
|    size_t i = 0; /* Index in the msg[] buffer: */ | ||||
|    char msg[192]; | ||||
| 
 | ||||
|    /* Each iteration through the following loop writes at most one character
 | ||||
|     * to msg[i++] then returns here to validate that there is still space for | ||||
|     * the trailing '\0'.  It may (in the case of a parameter) read more than | ||||
|     * one character from message[]; it must check for '\0' and continue to the | ||||
|     * test if it finds the end of string. | ||||
|     */ | ||||
|    while (i<(sizeof msg)-1 && *message != '\0') | ||||
|    { | ||||
|       /* '@' at end of string is now just printed (previously it was skipped);
 | ||||
|        * it is an error in the calling code to terminate the string with @. | ||||
|        */ | ||||
|       if (p != NULL && *message == '@' && message[1] != '\0') | ||||
|       { | ||||
|          int parameter_char = *++message; /* Consume the '@' */ | ||||
|          static const char valid_parameters[] = "123456789"; | ||||
|          int parameter = 0; | ||||
| 
 | ||||
|          /* Search for the parameter digit, the index in the string is the
 | ||||
|           * parameter to use. | ||||
|           */ | ||||
|          while (valid_parameters[parameter] != parameter_char && | ||||
|             valid_parameters[parameter] != '\0') | ||||
|             ++parameter; | ||||
| 
 | ||||
|          /* If the parameter digit is out of range it will just get printed. */ | ||||
|          if (parameter < PNG_WARNING_PARAMETER_COUNT) | ||||
|          { | ||||
|             /* Append this parameter */ | ||||
|             png_const_charp parm = p[parameter]; | ||||
|             png_const_charp pend = p[parameter] + (sizeof p[parameter]); | ||||
| 
 | ||||
|             /* No need to copy the trailing '\0' here, but there is no guarantee
 | ||||
|              * that parm[] has been initialized, so there is no guarantee of a | ||||
|              * trailing '\0': | ||||
|              */ | ||||
|             while (i<(sizeof msg)-1 && *parm != '\0' && parm < pend) | ||||
|                msg[i++] = *parm++; | ||||
| 
 | ||||
|             /* Consume the parameter digit too: */ | ||||
|             ++message; | ||||
|             continue; | ||||
|          } | ||||
| 
 | ||||
|          /* else not a parameter and there is a character after the @ sign; just
 | ||||
|           * copy that.  This is known not to be '\0' because of the test above. | ||||
|           */ | ||||
|       } | ||||
| 
 | ||||
|       /* At this point *message can't be '\0', even in the bad parameter case
 | ||||
|        * above where there is a lone '@' at the end of the message string. | ||||
|        */ | ||||
|       msg[i++] = *message++; | ||||
|    } | ||||
| 
 | ||||
|    /* i is always less than (sizeof msg), so: */ | ||||
|    msg[i] = '\0'; | ||||
| 
 | ||||
|    /* And this is the formatted message. It may be larger than
 | ||||
|     * PNG_MAX_ERROR_TEXT, but that is only used for 'chunk' errors and these | ||||
|     * are not (currently) formatted. | ||||
|     */ | ||||
|    png_warning(png_ptr, msg); | ||||
| } | ||||
| #endif /* WARNINGS */ | ||||
| 
 | ||||
| #ifdef PNG_BENIGN_ERRORS_SUPPORTED | ||||
| void PNGAPI | ||||
| png_benign_error(png_const_structrp png_ptr, png_const_charp error_message) | ||||
| { | ||||
|    if ((png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) != 0) | ||||
|    { | ||||
| #     ifdef PNG_READ_SUPPORTED | ||||
|          if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && | ||||
|             png_ptr->chunk_name != 0) | ||||
|             png_chunk_warning(png_ptr, error_message); | ||||
|          else | ||||
| #     endif | ||||
|       png_warning(png_ptr, error_message); | ||||
|    } | ||||
| 
 | ||||
|    else | ||||
|    { | ||||
| #     ifdef PNG_READ_SUPPORTED | ||||
|          if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && | ||||
|             png_ptr->chunk_name != 0) | ||||
|             png_chunk_error(png_ptr, error_message); | ||||
|          else | ||||
| #     endif | ||||
|       png_error(png_ptr, error_message); | ||||
|    } | ||||
| 
 | ||||
| #  ifndef PNG_ERROR_TEXT_SUPPORTED | ||||
|       PNG_UNUSED(error_message) | ||||
| #  endif | ||||
| } | ||||
| 
 | ||||
| void /* PRIVATE */ | ||||
| png_app_warning(png_const_structrp png_ptr, png_const_charp error_message) | ||||
| { | ||||
|    if ((png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) != 0) | ||||
|       png_warning(png_ptr, error_message); | ||||
|    else | ||||
|       png_error(png_ptr, error_message); | ||||
| 
 | ||||
| #  ifndef PNG_ERROR_TEXT_SUPPORTED | ||||
|       PNG_UNUSED(error_message) | ||||
| #  endif | ||||
| } | ||||
| 
 | ||||
| void /* PRIVATE */ | ||||
| png_app_error(png_const_structrp png_ptr, png_const_charp error_message) | ||||
| { | ||||
|    if ((png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) != 0) | ||||
|       png_warning(png_ptr, error_message); | ||||
|    else | ||||
|       png_error(png_ptr, error_message); | ||||
| 
 | ||||
| #  ifndef PNG_ERROR_TEXT_SUPPORTED | ||||
|       PNG_UNUSED(error_message) | ||||
| #  endif | ||||
| } | ||||
| #endif /* BENIGN_ERRORS */ | ||||
| 
 | ||||
| #define PNG_MAX_ERROR_TEXT 196 /* Currently limited by profile_error in png.c */ | ||||
| #if defined(PNG_WARNINGS_SUPPORTED) || \ | ||||
|    (defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)) | ||||
| /* 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, | ||||
|  * which 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 const char png_digit[16] = { | ||||
|    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', | ||||
|    'A', 'B', 'C', 'D', 'E', 'F' | ||||
| }; | ||||
| 
 | ||||
| static void /* PRIVATE */ | ||||
| png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp | ||||
|     error_message) | ||||
| { | ||||
|    png_uint_32 chunk_name = png_ptr->chunk_name; | ||||
|    int iout = 0, ishift = 24; | ||||
| 
 | ||||
|    while (ishift >= 0) | ||||
|    { | ||||
|       int c = (int)(chunk_name >> ishift) & 0xff; | ||||
| 
 | ||||
|       ishift -= 8; | ||||
|       if (isnonalpha(c) != 0) | ||||
|       { | ||||
|          buffer[iout++] = PNG_LITERAL_LEFT_SQUARE_BRACKET; | ||||
|          buffer[iout++] = png_digit[(c & 0xf0) >> 4]; | ||||
|          buffer[iout++] = png_digit[c & 0x0f]; | ||||
|          buffer[iout++] = PNG_LITERAL_RIGHT_SQUARE_BRACKET; | ||||
|       } | ||||
| 
 | ||||
|       else | ||||
|       { | ||||
|          buffer[iout++] = (char)c; | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
|    if (error_message == NULL) | ||||
|       buffer[iout] = '\0'; | ||||
| 
 | ||||
|    else | ||||
|    { | ||||
|       int iin = 0; | ||||
| 
 | ||||
|       buffer[iout++] = ':'; | ||||
|       buffer[iout++] = ' '; | ||||
| 
 | ||||
|       while (iin < PNG_MAX_ERROR_TEXT-1 && error_message[iin] != '\0') | ||||
|          buffer[iout++] = error_message[iin++]; | ||||
| 
 | ||||
|       /* iin < PNG_MAX_ERROR_TEXT, so the following is safe: */ | ||||
|       buffer[iout] = '\0'; | ||||
|    } | ||||
| } | ||||
| #endif /* WARNINGS || ERROR_TEXT */ | ||||
| 
 | ||||
| #if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED) | ||||
| PNG_FUNCTION(void,PNGAPI | ||||
| png_chunk_error,(png_const_structrp png_ptr, png_const_charp error_message), | ||||
|     PNG_NORETURN) | ||||
| { | ||||
|    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 /* READ && ERROR_TEXT */ | ||||
| 
 | ||||
| #ifdef PNG_WARNINGS_SUPPORTED | ||||
| void PNGAPI | ||||
| png_chunk_warning(png_const_structrp 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 /* WARNINGS */ | ||||
| 
 | ||||
| #ifdef PNG_READ_SUPPORTED | ||||
| #ifdef PNG_BENIGN_ERRORS_SUPPORTED | ||||
| void PNGAPI | ||||
| png_chunk_benign_error(png_const_structrp png_ptr, png_const_charp | ||||
|     error_message) | ||||
| { | ||||
|    if ((png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) != 0) | ||||
|       png_chunk_warning(png_ptr, error_message); | ||||
| 
 | ||||
|    else | ||||
|       png_chunk_error(png_ptr, error_message); | ||||
| 
 | ||||
| #  ifndef PNG_ERROR_TEXT_SUPPORTED | ||||
|       PNG_UNUSED(error_message) | ||||
| #  endif | ||||
| } | ||||
| #endif | ||||
| #endif /* READ */ | ||||
| 
 | ||||
| void /* PRIVATE */ | ||||
| png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error) | ||||
| { | ||||
| #  ifndef PNG_WARNINGS_SUPPORTED | ||||
|       PNG_UNUSED(message) | ||||
| #  endif | ||||
| 
 | ||||
|    /* This is always supported, but for just read or just write it
 | ||||
|     * unconditionally does the right thing. | ||||
|     */ | ||||
| #  if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED) | ||||
|       if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0) | ||||
| #  endif | ||||
| 
 | ||||
| #  ifdef PNG_READ_SUPPORTED | ||||
|       { | ||||
|          if (error < PNG_CHUNK_ERROR) | ||||
|             png_chunk_warning(png_ptr, message); | ||||
| 
 | ||||
|          else | ||||
|             png_chunk_benign_error(png_ptr, message); | ||||
|       } | ||||
| #  endif | ||||
| 
 | ||||
| #  if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED) | ||||
|       else if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0) | ||||
| #  endif | ||||
| 
 | ||||
| #  ifdef PNG_WRITE_SUPPORTED | ||||
|       { | ||||
|          if (error < PNG_CHUNK_WRITE_ERROR) | ||||
|             png_app_warning(png_ptr, message); | ||||
| 
 | ||||
|          else | ||||
|             png_app_error(png_ptr, message); | ||||
|       } | ||||
| #  endif | ||||
| } | ||||
| 
 | ||||
| #ifdef PNG_ERROR_TEXT_SUPPORTED | ||||
| #ifdef PNG_FLOATING_POINT_SUPPORTED | ||||
| PNG_FUNCTION(void, | ||||
| png_fixed_error,(png_const_structrp png_ptr, png_const_charp name),PNG_NORETURN) | ||||
| { | ||||
| #  define fixed_message "fixed point overflow in " | ||||
| #  define fixed_message_ln ((sizeof fixed_message)-1) | ||||
|    unsigned int  iin; | ||||
|    char msg[fixed_message_ln+PNG_MAX_ERROR_TEXT]; | ||||
|    memcpy(msg, fixed_message, fixed_message_ln); | ||||
|    iin = 0; | ||||
|    if (name != NULL) | ||||
|       while (iin < (PNG_MAX_ERROR_TEXT-1) && name[iin] != 0) | ||||
|       { | ||||
|          msg[fixed_message_ln + iin] = name[iin]; | ||||
|          ++iin; | ||||
|       } | ||||
|    msg[fixed_message_ln + iin] = 0; | ||||
|    png_error(png_ptr, msg); | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_SETJMP_SUPPORTED | ||||
| /* This API only exists if ANSI-C style error handling is used,
 | ||||
|  * otherwise it is necessary for png_default_error to be overridden. | ||||
|  */ | ||||
| jmp_buf* PNGAPI | ||||
| png_set_longjmp_fn(png_structrp png_ptr, png_longjmp_ptr longjmp_fn, | ||||
|     size_t jmp_buf_size) | ||||
| { | ||||
|    /* From libpng 1.6.0 the app gets one chance to set a 'jmpbuf_size' value
 | ||||
|     * and it must not change after that.  Libpng doesn't care how big the | ||||
|     * buffer is, just that it doesn't change. | ||||
|     * | ||||
|     * If the buffer size is no *larger* than the size of jmp_buf when libpng is | ||||
|     * compiled a built in jmp_buf is returned; this preserves the pre-1.6.0 | ||||
|     * semantics that this call will not fail.  If the size is larger, however, | ||||
|     * the buffer is allocated and this may fail, causing the function to return | ||||
|     * NULL. | ||||
|     */ | ||||
|    if (png_ptr == NULL) | ||||
|       return NULL; | ||||
| 
 | ||||
|    if (png_ptr->jmp_buf_ptr == NULL) | ||||
|    { | ||||
|       png_ptr->jmp_buf_size = 0; /* not allocated */ | ||||
| 
 | ||||
|       if (jmp_buf_size <= (sizeof png_ptr->jmp_buf_local)) | ||||
|          png_ptr->jmp_buf_ptr = &png_ptr->jmp_buf_local; | ||||
| 
 | ||||
|       else | ||||
|       { | ||||
|          png_ptr->jmp_buf_ptr = png_voidcast(jmp_buf *, | ||||
|              png_malloc_warn(png_ptr, jmp_buf_size)); | ||||
| 
 | ||||
|          if (png_ptr->jmp_buf_ptr == NULL) | ||||
|             return NULL; /* new NULL return on OOM */ | ||||
| 
 | ||||
|          png_ptr->jmp_buf_size = jmp_buf_size; | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
|    else /* Already allocated: check the size */ | ||||
|    { | ||||
|       size_t size = png_ptr->jmp_buf_size; | ||||
| 
 | ||||
|       if (size == 0) | ||||
|       { | ||||
|          size = (sizeof png_ptr->jmp_buf_local); | ||||
|          if (png_ptr->jmp_buf_ptr != &png_ptr->jmp_buf_local) | ||||
|          { | ||||
|             /* This is an internal error in libpng: somehow we have been left
 | ||||
|              * with a stack allocated jmp_buf when the application regained | ||||
|              * control.  It's always possible to fix this up, but for the moment | ||||
|              * this is a png_error because that makes it easy to detect. | ||||
|              */ | ||||
|             png_error(png_ptr, "Libpng jmp_buf still allocated"); | ||||
|             /* png_ptr->jmp_buf_ptr = &png_ptr->jmp_buf_local; */ | ||||
|          } | ||||
|       } | ||||
| 
 | ||||
|       if (size != jmp_buf_size) | ||||
|       { | ||||
|          png_warning(png_ptr, "Application jmp_buf size changed"); | ||||
|          return NULL; /* caller will probably crash: no choice here */ | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
|    /* Finally fill in the function, now we have a satisfactory buffer. It is
 | ||||
|     * valid to change the function on every call. | ||||
|     */ | ||||
|    png_ptr->longjmp_fn = longjmp_fn; | ||||
|    return png_ptr->jmp_buf_ptr; | ||||
| } | ||||
| 
 | ||||
| void /* PRIVATE */ | ||||
| png_free_jmpbuf(png_structrp png_ptr) | ||||
| { | ||||
|    if (png_ptr != NULL) | ||||
|    { | ||||
|       jmp_buf *jb = png_ptr->jmp_buf_ptr; | ||||
| 
 | ||||
|       /* A size of 0 is used to indicate a local, stack, allocation of the
 | ||||
|        * pointer; used here and in png.c | ||||
|        */ | ||||
|       if (jb != NULL && png_ptr->jmp_buf_size > 0) | ||||
|       { | ||||
| 
 | ||||
|          /* This stuff is so that a failure to free the error control structure
 | ||||
|           * does not leave libpng in a state with no valid error handling: the | ||||
|           * free always succeeds, if there is an error it gets ignored. | ||||
|           */ | ||||
|          if (jb != &png_ptr->jmp_buf_local) | ||||
|          { | ||||
|             /* Make an internal, libpng, jmp_buf to return here */ | ||||
|             jmp_buf free_jmp_buf; | ||||
| 
 | ||||
|             if (!setjmp(free_jmp_buf)) | ||||
|             { | ||||
|                png_ptr->jmp_buf_ptr = &free_jmp_buf; /* come back here */ | ||||
|                png_ptr->jmp_buf_size = 0; /* stack allocation */ | ||||
|                png_ptr->longjmp_fn = longjmp; | ||||
|                png_free(png_ptr, jb); /* Return to setjmp on error */ | ||||
|             } | ||||
|          } | ||||
|       } | ||||
| 
 | ||||
|       /* *Always* cancel everything out: */ | ||||
|       png_ptr->jmp_buf_size = 0; | ||||
|       png_ptr->jmp_buf_ptr = NULL; | ||||
|       png_ptr->longjmp_fn = 0; | ||||
|    } | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /* 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 PNG_FUNCTION(void /* PRIVATE */, | ||||
| png_default_error,(png_const_structrp png_ptr, png_const_charp error_message), | ||||
|     PNG_NORETURN) | ||||
| { | ||||
| #ifdef PNG_CONSOLE_IO_SUPPORTED | ||||
| #ifdef PNG_ERROR_NUMBERS_SUPPORTED | ||||
|    /* Check on NULL only added in 1.5.4 */ | ||||
|    if (error_message != NULL && *error_message == PNG_LITERAL_SHARP) | ||||
|    { | ||||
|       /* 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 ? error_message : | ||||
|          "undefined"); | ||||
|       fprintf(stderr, PNG_STRING_NEWLINE); | ||||
|    } | ||||
| #else | ||||
|    PNG_UNUSED(error_message) /* Make compiler happy */ | ||||
| #endif | ||||
|    png_longjmp(png_ptr, 1); | ||||
| } | ||||
| 
 | ||||
| PNG_FUNCTION(void,PNGAPI | ||||
| png_longjmp,(png_const_structrp png_ptr, int val),PNG_NORETURN) | ||||
| { | ||||
| #ifdef PNG_SETJMP_SUPPORTED | ||||
|    if (png_ptr != NULL && png_ptr->longjmp_fn != NULL && | ||||
|        png_ptr->jmp_buf_ptr != NULL) | ||||
|       png_ptr->longjmp_fn(*png_ptr->jmp_buf_ptr, val); | ||||
| #else | ||||
|    PNG_UNUSED(png_ptr) | ||||
|    PNG_UNUSED(val) | ||||
| #endif | ||||
| 
 | ||||
|    /* If control reaches this point, png_longjmp() must not return. The only
 | ||||
|     * choice is to terminate the whole process (or maybe the thread); to do | ||||
|     * this the ANSI-C abort() function is used unless a different method is | ||||
|     * implemented by overriding the default configuration setting for | ||||
|     * PNG_ABORT(). | ||||
|     */ | ||||
|    PNG_ABORT(); | ||||
| } | ||||
| 
 | ||||
| #ifdef PNG_WARNINGS_SUPPORTED | ||||
| /* 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_const_structrp png_ptr, png_const_charp warning_message) | ||||
| { | ||||
| #ifdef PNG_CONSOLE_IO_SUPPORTED | ||||
| #  ifdef PNG_ERROR_NUMBERS_SUPPORTED | ||||
|    if (*warning_message == PNG_LITERAL_SHARP) | ||||
|    { | ||||
|       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 | ||||
|    PNG_UNUSED(warning_message) /* Make compiler happy */ | ||||
| #endif | ||||
|    PNG_UNUSED(png_ptr) /* Make compiler happy */ | ||||
| } | ||||
| #endif /* 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->jmp_buf_ptr, 1) | ||||
|  */ | ||||
| void PNGAPI | ||||
| png_set_error_fn(png_structrp 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; | ||||
| #ifdef PNG_WARNINGS_SUPPORTED | ||||
|    png_ptr->warning_fn = warning_fn; | ||||
| #else | ||||
|    PNG_UNUSED(warning_fn) | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* 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_const_structrp 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_structrp 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 | ||||
| 
 | ||||
| #if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\ | ||||
|    defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) | ||||
|    /* Currently the above both depend on SETJMP_SUPPORTED, however it would be
 | ||||
|     * possible to implement without setjmp support just so long as there is some | ||||
|     * way to handle the error return here: | ||||
|     */ | ||||
| PNG_FUNCTION(void /* PRIVATE */, (PNGCBAPI | ||||
| png_safe_error),(png_structp png_nonconst_ptr, png_const_charp error_message), | ||||
|     PNG_NORETURN) | ||||
| { | ||||
|    png_const_structrp png_ptr = png_nonconst_ptr; | ||||
|    png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr); | ||||
| 
 | ||||
|    /* An error is always logged here, overwriting anything (typically a warning)
 | ||||
|     * that is already there: | ||||
|     */ | ||||
|    if (image != NULL) | ||||
|    { | ||||
|       png_safecat(image->message, (sizeof image->message), 0, error_message); | ||||
|       image->warning_or_error |= PNG_IMAGE_ERROR; | ||||
| 
 | ||||
|       /* Retrieve the jmp_buf from within the png_control, making this work for
 | ||||
|        * C++ compilation too is pretty tricky: C++ wants a pointer to the first | ||||
|        * element of a jmp_buf, but C doesn't tell us the type of that. | ||||
|        */ | ||||
|       if (image->opaque != NULL && image->opaque->error_buf != NULL) | ||||
|          longjmp(png_control_jmp_buf(image->opaque), 1); | ||||
| 
 | ||||
|       /* Missing longjmp buffer, the following is to help debugging: */ | ||||
|       { | ||||
|          size_t pos = png_safecat(image->message, (sizeof image->message), 0, | ||||
|              "bad longjmp: "); | ||||
|          png_safecat(image->message, (sizeof image->message), pos, | ||||
|              error_message); | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
|    /* Here on an internal programming error. */ | ||||
|    abort(); | ||||
| } | ||||
| 
 | ||||
| #ifdef PNG_WARNINGS_SUPPORTED | ||||
| void /* PRIVATE */ PNGCBAPI | ||||
| png_safe_warning(png_structp png_nonconst_ptr, png_const_charp warning_message) | ||||
| { | ||||
|    png_const_structrp png_ptr = png_nonconst_ptr; | ||||
|    png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr); | ||||
| 
 | ||||
|    /* A warning is only logged if there is no prior warning or error. */ | ||||
|    if (image->warning_or_error == 0) | ||||
|    { | ||||
|       png_safecat(image->message, (sizeof image->message), 0, warning_message); | ||||
|       image->warning_or_error |= PNG_IMAGE_WARNING; | ||||
|    } | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| int /* PRIVATE */ | ||||
| png_safe_execute(png_imagep image, int (*function)(png_voidp), png_voidp arg) | ||||
| { | ||||
|    png_voidp saved_error_buf = image->opaque->error_buf; | ||||
|    jmp_buf safe_jmpbuf; | ||||
|    int result; | ||||
| 
 | ||||
|    /* Safely execute function(arg), with png_error returning back here. */ | ||||
|    if (setjmp(safe_jmpbuf) == 0) | ||||
|    { | ||||
|       image->opaque->error_buf = safe_jmpbuf; | ||||
|       result = function(arg); | ||||
|       image->opaque->error_buf = saved_error_buf; | ||||
|       return result; | ||||
|    } | ||||
| 
 | ||||
|    /* On png_error, return via longjmp, pop the jmpbuf, and free the image. */ | ||||
|    image->opaque->error_buf = saved_error_buf; | ||||
|    png_image_free(image); | ||||
|    return 0; | ||||
| } | ||||
| #endif /* SIMPLIFIED READ || SIMPLIFIED_WRITE */ | ||||
| #endif /* READ || WRITE */ | ||||
							
								
								
									
										1267
									
								
								dep/libpng/src/pngget.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1267
									
								
								dep/libpng/src/pngget.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										267
									
								
								dep/libpng/src/pnginfo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								dep/libpng/src/pnginfo.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,267 @@ | |||
| 
 | ||||
| /* pnginfo.h - header file for PNG reference library
 | ||||
|  * | ||||
|  * Copyright (c) 2018 Cosmin Truta | ||||
|  * Copyright (c) 1998-2002,2004,2006-2013,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 | ||||
|  */ | ||||
| 
 | ||||
|  /* png_info is a structure that holds the information in a PNG file so
 | ||||
|  * that the application can find out the characteristics of the image. | ||||
|  * If you are reading the file, this structure will tell you what is | ||||
|  * in the PNG file.  If you are writing the file, fill in the information | ||||
|  * you want to put into the PNG file, using png_set_*() functions, then | ||||
|  * call png_write_info(). | ||||
|  * | ||||
|  * The names chosen should be very close to the PNG specification, so | ||||
|  * consult that document for information about the meaning of each field. | ||||
|  * | ||||
|  * With libpng < 0.95, it was only possible to directly set and read the | ||||
|  * the values in the png_info_struct, which meant that the contents and | ||||
|  * order of the values had to remain fixed.  With libpng 0.95 and later, | ||||
|  * however, there are now functions that abstract the contents of | ||||
|  * png_info_struct from the application, so this makes it easier to use | ||||
|  * libpng with dynamic libraries, and even makes it possible to use | ||||
|  * libraries that don't have all of the libpng ancillary chunk-handing | ||||
|  * functionality.  In libpng-1.5.0 this was moved into a separate private | ||||
|  * file that is not visible to applications. | ||||
|  * | ||||
|  * The following members may have allocated storage attached that should be | ||||
|  * cleaned up before the structure is discarded: palette, trans, text, | ||||
|  * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile, | ||||
|  * splt_palettes, scal_unit, row_pointers, and unknowns.   By default, these | ||||
|  * are automatically freed when the info structure is deallocated, if they were | ||||
|  * allocated internally by libpng.  This behavior can be changed by means | ||||
|  * of the png_data_freer() function. | ||||
|  * | ||||
|  * More allocation details: all the chunk-reading functions that | ||||
|  * change these members go through the corresponding png_set_* | ||||
|  * functions.  A function to clear these members is available: see | ||||
|  * png_free_data().  The png_set_* functions do not depend on being | ||||
|  * able to point info structure members to any of the storage they are | ||||
|  * passed (they make their own copies), EXCEPT that the png_set_text | ||||
|  * functions use the same storage passed to them in the text_ptr or | ||||
|  * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns | ||||
|  * functions do not make their own copies. | ||||
|  */ | ||||
| #ifndef PNGINFO_H | ||||
| #define PNGINFO_H | ||||
| 
 | ||||
| struct png_info_def | ||||
| { | ||||
|    /* The following are necessary for every PNG file */ | ||||
|    png_uint_32 width;       /* width of image in pixels (from IHDR) */ | ||||
|    png_uint_32 height;      /* height of image in pixels (from IHDR) */ | ||||
|    png_uint_32 valid;       /* valid chunk data (see PNG_INFO_ below) */ | ||||
|    size_t rowbytes;         /* bytes needed to hold an untransformed row */ | ||||
|    png_colorp palette;      /* array of color values (valid & PNG_INFO_PLTE) */ | ||||
|    png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */ | ||||
|    png_uint_16 num_trans;   /* number of transparent palette color (tRNS) */ | ||||
|    png_byte bit_depth;      /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */ | ||||
|    png_byte color_type;     /* see PNG_COLOR_TYPE_ below (from IHDR) */ | ||||
|    /* The following three should have been named *_method not *_type */ | ||||
|    png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */ | ||||
|    png_byte filter_type;    /* must be PNG_FILTER_TYPE_BASE (from IHDR) */ | ||||
|    png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ | ||||
| 
 | ||||
|    /* The following are set by png_set_IHDR, called from the application on
 | ||||
|     * write, but the are never actually used by the write code. | ||||
|     */ | ||||
|    png_byte channels;       /* number of data channels per pixel (1, 2, 3, 4) */ | ||||
|    png_byte pixel_depth;    /* number of bits per pixel */ | ||||
|    png_byte spare_byte;     /* to align the data, and for future use */ | ||||
| 
 | ||||
| #ifdef PNG_READ_SUPPORTED | ||||
|    /* This is never set during write */ | ||||
|    png_byte signature[8];   /* magic bytes read by libpng from start of file */ | ||||
| #endif | ||||
| 
 | ||||
|    /* The rest of the data is optional.  If you are reading, check the
 | ||||
|     * valid field to see if the information in these are valid.  If you | ||||
|     * are writing, set the valid field to those chunks you want written, | ||||
|     * and initialize the appropriate fields below. | ||||
|     */ | ||||
| 
 | ||||
| #if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED) | ||||
|    /* png_colorspace only contains 'flags' if neither GAMMA or COLORSPACE are
 | ||||
|     * defined.  When COLORSPACE is switched on all the colorspace-defining | ||||
|     * chunks should be enabled, when GAMMA is switched on all the gamma-defining | ||||
|     * chunks should be enabled.  If this is not done it becomes possible to read | ||||
|     * inconsistent PNG files and assign a probably incorrect interpretation to | ||||
|     * the information.  (In other words, by carefully choosing which chunks to | ||||
|     * recognize the system configuration can select an interpretation for PNG | ||||
|     * files containing ambiguous data and this will result in inconsistent | ||||
|     * behavior between different libpng builds!) | ||||
|     */ | ||||
|    png_colorspace colorspace; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_iCCP_SUPPORTED | ||||
|    /* iCCP chunk data. */ | ||||
|    png_charp iccp_name;     /* profile name */ | ||||
|    png_bytep iccp_profile;  /* International Color Consortium profile data */ | ||||
|    png_uint_32 iccp_proflen;  /* ICC profile data length */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_TEXT_SUPPORTED | ||||
|    /* The tEXt, and zTXt chunks contain human-readable textual data in
 | ||||
|     * uncompressed, compressed, and optionally compressed forms, respectively. | ||||
|     * The data in "text" is an array of pointers to uncompressed, | ||||
|     * null-terminated C strings. Each chunk has a keyword that describes the | ||||
|     * textual data contained in that chunk.  Keywords are not required to be | ||||
|     * unique, and the text string may be empty.  Any number of text chunks may | ||||
|     * be in an image. | ||||
|     */ | ||||
|    int num_text; /* number of comments read or comments to write */ | ||||
|    int max_text; /* current size of text array */ | ||||
|    png_textp text; /* array of comments read or comments to write */ | ||||
| #endif /* TEXT */ | ||||
| 
 | ||||
| #ifdef PNG_tIME_SUPPORTED | ||||
|    /* The tIME chunk holds the last time the displayed image data was
 | ||||
|     * modified.  See the png_time struct for the contents of this struct. | ||||
|     */ | ||||
|    png_time mod_time; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_sBIT_SUPPORTED | ||||
|    /* The sBIT chunk specifies the number of significant high-order bits
 | ||||
|     * in the pixel data.  Values are in the range [1, bit_depth], and are | ||||
|     * only specified for the channels in the pixel data.  The contents of | ||||
|     * the low-order bits is not specified.  Data is valid if | ||||
|     * (valid & PNG_INFO_sBIT) is non-zero. | ||||
|     */ | ||||
|    png_color_8 sig_bit; /* significant bits in color channels */ | ||||
| #endif | ||||
| 
 | ||||
| #if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \ | ||||
| defined(PNG_READ_BACKGROUND_SUPPORTED) | ||||
|    /* The tRNS chunk supplies transparency data for paletted images and
 | ||||
|     * other image types that don't need a full alpha channel.  There are | ||||
|     * "num_trans" transparency values for a paletted image, stored in the | ||||
|     * same order as the palette colors, starting from index 0.  Values | ||||
|     * for the data are in the range [0, 255], ranging from fully transparent | ||||
|     * to fully opaque, respectively.  For non-paletted images, there is a | ||||
|     * single color specified that should be treated as fully transparent. | ||||
|     * Data is valid if (valid & PNG_INFO_tRNS) is non-zero. | ||||
|     */ | ||||
|    png_bytep trans_alpha;    /* alpha values for paletted image */ | ||||
|    png_color_16 trans_color; /* transparent color for non-palette image */ | ||||
| #endif | ||||
| 
 | ||||
| #if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) | ||||
|    /* The bKGD chunk gives the suggested image background color if the
 | ||||
|     * display program does not have its own background color and the image | ||||
|     * is needs to composited onto a background before display.  The colors | ||||
|     * in "background" are normally in the same color space/depth as the | ||||
|     * pixel data.  Data is valid if (valid & PNG_INFO_bKGD) is non-zero. | ||||
|     */ | ||||
|    png_color_16 background; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_oFFs_SUPPORTED | ||||
|    /* The oFFs chunk gives the offset in "offset_unit_type" units rightwards
 | ||||
|     * and downwards from the top-left corner of the display, page, or other | ||||
|     * application-specific co-ordinate space.  See the PNG_OFFSET_ defines | ||||
|     * below for the unit types.  Valid if (valid & PNG_INFO_oFFs) non-zero. | ||||
|     */ | ||||
|    png_int_32 x_offset; /* x offset on page */ | ||||
|    png_int_32 y_offset; /* y offset on page */ | ||||
|    png_byte offset_unit_type; /* offset units type */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_pHYs_SUPPORTED | ||||
|    /* The pHYs chunk gives the physical pixel density of the image for
 | ||||
|     * display or printing in "phys_unit_type" units (see PNG_RESOLUTION_ | ||||
|     * defines below).  Data is valid if (valid & PNG_INFO_pHYs) is non-zero. | ||||
|     */ | ||||
|    png_uint_32 x_pixels_per_unit; /* horizontal pixel density */ | ||||
|    png_uint_32 y_pixels_per_unit; /* vertical pixel density */ | ||||
|    png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_eXIf_SUPPORTED | ||||
|    int num_exif;  /* Added at libpng-1.6.31 */ | ||||
|    png_bytep exif; | ||||
| # ifdef PNG_READ_eXIf_SUPPORTED | ||||
|    png_bytep eXIf_buf;  /* Added at libpng-1.6.32 */ | ||||
| # endif | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_hIST_SUPPORTED | ||||
|    /* The hIST chunk contains the relative frequency or importance of the
 | ||||
|     * various palette entries, so that a viewer can intelligently select a | ||||
|     * reduced-color palette, if required.  Data is an array of "num_palette" | ||||
|     * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST) | ||||
|     * is non-zero. | ||||
|     */ | ||||
|    png_uint_16p hist; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_pCAL_SUPPORTED | ||||
|    /* The pCAL chunk describes a transformation between the stored pixel
 | ||||
|     * values and original physical data values used to create the image. | ||||
|     * The integer range [0, 2^bit_depth - 1] maps to the floating-point | ||||
|     * range given by [pcal_X0, pcal_X1], and are further transformed by a | ||||
|     * (possibly non-linear) transformation function given by "pcal_type" | ||||
|     * and "pcal_params" into "pcal_units".  Please see the PNG_EQUATION_ | ||||
|     * defines below, and the PNG-Group's PNG extensions document for a | ||||
|     * complete description of the transformations and how they should be | ||||
|     * implemented, and for a description of the ASCII parameter strings. | ||||
|     * Data values are valid if (valid & PNG_INFO_pCAL) non-zero. | ||||
|     */ | ||||
|    png_charp pcal_purpose;  /* pCAL chunk description string */ | ||||
|    png_int_32 pcal_X0;      /* minimum value */ | ||||
|    png_int_32 pcal_X1;      /* maximum value */ | ||||
|    png_charp pcal_units;    /* Latin-1 string giving physical units */ | ||||
|    png_charpp pcal_params;  /* ASCII strings containing parameter values */ | ||||
|    png_byte pcal_type;      /* equation type (see PNG_EQUATION_ below) */ | ||||
|    png_byte pcal_nparams;   /* number of parameters given in pcal_params */ | ||||
| #endif | ||||
| 
 | ||||
| /* New members added in libpng-1.0.6 */ | ||||
|    png_uint_32 free_me;     /* flags items libpng is responsible for freeing */ | ||||
| 
 | ||||
| #ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED | ||||
|    /* Storage for unknown chunks that the library doesn't recognize. */ | ||||
|    png_unknown_chunkp unknown_chunks; | ||||
| 
 | ||||
|    /* The type of this field is limited by the type of
 | ||||
|     * png_struct::user_chunk_cache_max, else overflow can occur. | ||||
|     */ | ||||
|    int                unknown_chunks_num; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_sPLT_SUPPORTED | ||||
|    /* Data on sPLT chunks (there may be more than one). */ | ||||
|    png_sPLT_tp splt_palettes; | ||||
|    int         splt_palettes_num; /* Match type returned by png_get API */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_sCAL_SUPPORTED | ||||
|    /* The sCAL chunk describes the actual physical dimensions of the
 | ||||
|     * subject matter of the graphic.  The chunk contains a unit specification | ||||
|     * a byte value, and two ASCII strings representing floating-point | ||||
|     * values.  The values are width and height corresponding to one pixel | ||||
|     * in the image.  Data values are valid if (valid & PNG_INFO_sCAL) is | ||||
|     * non-zero. | ||||
|     */ | ||||
|    png_byte scal_unit;         /* unit of physical scale */ | ||||
|    png_charp scal_s_width;     /* string containing height */ | ||||
|    png_charp scal_s_height;    /* string containing width */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_INFO_IMAGE_SUPPORTED | ||||
|    /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS)
 | ||||
|       non-zero */ | ||||
|    /* Data valid if (valid & PNG_INFO_IDAT) non-zero */ | ||||
|    png_bytepp row_pointers;        /* the image bits */ | ||||
| #endif | ||||
| 
 | ||||
| }; | ||||
| #endif /* PNGINFO_H */ | ||||
							
								
								
									
										284
									
								
								dep/libpng/src/pngmem.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										284
									
								
								dep/libpng/src/pngmem.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,284 @@ | |||
| 
 | ||||
| /* pngmem.c - stub functions for memory allocation
 | ||||
|  * | ||||
|  * 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 | ||||
|  * 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. | ||||
|  */ | ||||
| 
 | ||||
| #include "pngpriv.h" | ||||
| 
 | ||||
| #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) | ||||
| /* Free a png_struct */ | ||||
| void /* PRIVATE */ | ||||
| png_destroy_png_struct(png_structrp png_ptr) | ||||
| { | ||||
|    if (png_ptr != NULL) | ||||
|    { | ||||
|       /* 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 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. | ||||
|  */ | ||||
| PNG_FUNCTION(png_voidp,PNGAPI | ||||
| png_calloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) | ||||
| { | ||||
|    png_voidp ret; | ||||
| 
 | ||||
|    ret = png_malloc(png_ptr, size); | ||||
| 
 | ||||
|    if (ret != NULL) | ||||
|       memset(ret, 0, size); | ||||
| 
 | ||||
|    return ret; | ||||
| } | ||||
| 
 | ||||
| /* 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; | ||||
| 
 | ||||
|    if (png_ptr == NULL) | ||||
|       return NULL; | ||||
| 
 | ||||
|    ret = png_malloc_base(png_ptr, size); | ||||
| 
 | ||||
|    if (ret == NULL) | ||||
|        png_error(png_ptr, "Out of memory"); /* 'm' means png_malloc */ | ||||
| 
 | ||||
|    return ret; | ||||
| } | ||||
| 
 | ||||
| #ifdef PNG_USER_MEM_SUPPORTED | ||||
| 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; | ||||
| 
 | ||||
|    if (png_ptr == NULL) | ||||
|       return NULL; | ||||
| 
 | ||||
|    /* 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 */ | ||||
| 
 | ||||
| /* 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) | ||||
| { | ||||
|    if (png_ptr != NULL) | ||||
|    { | ||||
|       png_voidp ret = png_malloc_base(png_ptr, size); | ||||
| 
 | ||||
|       if (ret != NULL) | ||||
|          return ret; | ||||
| 
 | ||||
|       png_warning(png_ptr, "Out of memory"); | ||||
|    } | ||||
| 
 | ||||
|    return NULL; | ||||
| } | ||||
| 
 | ||||
| /* Free a pointer allocated by png_malloc().  If ptr is NULL, return
 | ||||
|  * without taking any action. | ||||
|  */ | ||||
| void PNGAPI | ||||
| 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_constcast(png_structrp,png_ptr), ptr); | ||||
| 
 | ||||
|    else | ||||
|       png_free_default(png_ptr, 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 */ | ||||
| 
 | ||||
|    free(ptr); | ||||
| } | ||||
| 
 | ||||
| #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_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; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| /* 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_const_structrp png_ptr) | ||||
| { | ||||
|    if (png_ptr == NULL) | ||||
|       return NULL; | ||||
| 
 | ||||
|    return png_ptr->mem_ptr; | ||||
| } | ||||
| #endif /* USER_MEM */ | ||||
| #endif /* READ || WRITE */ | ||||
							
								
								
									
										1104
									
								
								dep/libpng/src/pngpread.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1104
									
								
								dep/libpng/src/pngpread.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										2221
									
								
								dep/libpng/src/pngpriv.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2221
									
								
								dep/libpng/src/pngpriv.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										4228
									
								
								dep/libpng/src/pngread.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4228
									
								
								dep/libpng/src/pngread.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										120
									
								
								dep/libpng/src/pngrio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								dep/libpng/src/pngrio.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,120 @@ | |||
| 
 | ||||
| /* pngrio.c - functions for data input
 | ||||
|  * | ||||
|  * 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 | ||||
|  * 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(...). | ||||
|  */ | ||||
| 
 | ||||
| #include "pngpriv.h" | ||||
| 
 | ||||
| #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 than 64K on a 16-bit machine. | ||||
|  */ | ||||
| void /* PRIVATE */ | ||||
| png_read_data(png_structrp png_ptr, png_bytep data, 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"); | ||||
| } | ||||
| 
 | ||||
| #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. | ||||
|  */ | ||||
| void PNGCBAPI | ||||
| png_default_read_data(png_structp png_ptr, png_bytep data, size_t length) | ||||
| { | ||||
|    size_t check; | ||||
| 
 | ||||
|    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. | ||||
|     */ | ||||
|    check = fread(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr)); | ||||
| 
 | ||||
|    if (check != length) | ||||
|       png_error(png_ptr, "Read Error"); | ||||
| } | ||||
| #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_structrp png_ptr, png_voidp io_ptr, | ||||
|     png_rw_ptr read_data_fn) | ||||
| { | ||||
|    if (png_ptr == NULL) | ||||
|       return; | ||||
| 
 | ||||
|    png_ptr->io_ptr = io_ptr; | ||||
| 
 | ||||
| #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, | ||||
|           "Can't set both read_data_fn and write_data_fn in the" | ||||
|           " same structure"); | ||||
|    } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_WRITE_FLUSH_SUPPORTED | ||||
|    png_ptr->output_flush_fn = NULL; | ||||
| #endif | ||||
| } | ||||
| #endif /* READ */ | ||||
							
								
								
									
										5040
									
								
								dep/libpng/src/pngrtran.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5040
									
								
								dep/libpng/src/pngrtran.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										4680
									
								
								dep/libpng/src/pngrutil.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4680
									
								
								dep/libpng/src/pngrutil.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1803
									
								
								dep/libpng/src/pngset.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1803
									
								
								dep/libpng/src/pngset.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										479
									
								
								dep/libpng/src/pngstruct.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										479
									
								
								dep/libpng/src/pngstruct.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,479 @@ | |||
| 
 | ||||
| /* pngstruct.h - header file for PNG reference library
 | ||||
|  * | ||||
|  * Copyright (c) 2018-2022 Cosmin Truta | ||||
|  * Copyright (c) 1998-2002,2004,2006-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 | ||||
|  */ | ||||
| 
 | ||||
| /* The structure that holds the information to read and write PNG files.
 | ||||
|  * The only people who need to care about what is inside of this are the | ||||
|  * people who will be modifying the library for their own special needs. | ||||
|  * It should NOT be accessed directly by an application. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef PNGSTRUCT_H | ||||
| #define PNGSTRUCT_H | ||||
| /* zlib.h defines the structure z_stream, an instance of which is included
 | ||||
|  * in this structure and is required for decompressing the LZ compressed | ||||
|  * data in PNG files. | ||||
|  */ | ||||
| #ifndef ZLIB_CONST | ||||
|    /* We must ensure that zlib uses 'const' in declarations. */ | ||||
| #  define ZLIB_CONST | ||||
| #endif | ||||
| #include "zlib.h" | ||||
| #ifdef const | ||||
|    /* zlib.h sometimes #defines const to nothing, undo this. */ | ||||
| #  undef const | ||||
| #endif | ||||
| 
 | ||||
| /* zlib.h has mediocre z_const use before 1.2.6, this stuff is for compatibility
 | ||||
|  * with older builds. | ||||
|  */ | ||||
| #if ZLIB_VERNUM < 0x1260 | ||||
| #  define PNGZ_MSG_CAST(s) png_constcast(char*,s) | ||||
| #  define PNGZ_INPUT_CAST(b) png_constcast(png_bytep,b) | ||||
| #else | ||||
| #  define PNGZ_MSG_CAST(s) (s) | ||||
| #  define PNGZ_INPUT_CAST(b) (b) | ||||
| #endif | ||||
| 
 | ||||
| /* zlib.h declares a magic type 'uInt' that limits the amount of data that zlib
 | ||||
|  * can handle at once.  This type need be no larger than 16 bits (so maximum of | ||||
|  * 65535), this define allows us to discover how big it is, but limited by the | ||||
|  * maximum for size_t.  The value can be overridden in a library build | ||||
|  * (pngusr.h, or set it in CPPFLAGS) and it works to set it to a considerably | ||||
|  * lower value (e.g. 255 works).  A lower value may help memory usage (slightly) | ||||
|  * and may even improve performance on some systems (and degrade it on others.) | ||||
|  */ | ||||
| #ifndef ZLIB_IO_MAX | ||||
| #  define ZLIB_IO_MAX ((uInt)-1) | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_WRITE_SUPPORTED | ||||
| /* The type of a compression buffer list used by the write code. */ | ||||
| typedef struct png_compression_buffer | ||||
| { | ||||
|    struct png_compression_buffer *next; | ||||
|    png_byte                       output[1]; /* actually zbuf_size */ | ||||
| } png_compression_buffer, *png_compression_bufferp; | ||||
| 
 | ||||
| #define PNG_COMPRESSION_BUFFER_SIZE(pp)\ | ||||
|    (offsetof(png_compression_buffer, output) + (pp)->zbuffer_size) | ||||
| #endif | ||||
| 
 | ||||
| /* Colorspace support; structures used in png_struct, png_info and in internal
 | ||||
|  * functions to hold and communicate information about the color space. | ||||
|  * | ||||
|  * PNG_COLORSPACE_SUPPORTED is only required if the application will perform | ||||
|  * colorspace corrections, otherwise all the colorspace information can be | ||||
|  * skipped and the size of libpng can be reduced (significantly) by compiling | ||||
|  * out the colorspace support. | ||||
|  */ | ||||
| #ifdef PNG_COLORSPACE_SUPPORTED | ||||
| /* The chromaticities of the red, green and blue colorants and the chromaticity
 | ||||
|  * of the corresponding white point (i.e. of rgb(1.0,1.0,1.0)). | ||||
|  */ | ||||
| typedef struct png_xy | ||||
| { | ||||
|    png_fixed_point redx, redy; | ||||
|    png_fixed_point greenx, greeny; | ||||
|    png_fixed_point bluex, bluey; | ||||
|    png_fixed_point whitex, whitey; | ||||
| } png_xy; | ||||
| 
 | ||||
| /* The same data as above but encoded as CIE XYZ values.  When this data comes
 | ||||
|  * from chromaticities the sum of the Y values is assumed to be 1.0 | ||||
|  */ | ||||
| typedef struct png_XYZ | ||||
| { | ||||
|    png_fixed_point red_X, red_Y, red_Z; | ||||
|    png_fixed_point green_X, green_Y, green_Z; | ||||
|    png_fixed_point blue_X, blue_Y, blue_Z; | ||||
| } png_XYZ; | ||||
| #endif /* COLORSPACE */ | ||||
| 
 | ||||
| #if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED) | ||||
| /* A colorspace is all the above plus, potentially, profile information;
 | ||||
|  * however at present libpng does not use the profile internally so it is only | ||||
|  * stored in the png_info struct (if iCCP is supported.)  The rendering intent | ||||
|  * is retained here and is checked. | ||||
|  * | ||||
|  * The file gamma encoding information is also stored here and gamma correction | ||||
|  * is done by libpng, whereas color correction must currently be done by the | ||||
|  * application. | ||||
|  */ | ||||
| typedef struct png_colorspace | ||||
| { | ||||
| #ifdef PNG_GAMMA_SUPPORTED | ||||
|    png_fixed_point gamma;        /* File gamma */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_COLORSPACE_SUPPORTED | ||||
|    png_xy      end_points_xy;    /* End points as chromaticities */ | ||||
|    png_XYZ     end_points_XYZ;   /* End points as CIE XYZ colorant values */ | ||||
|    png_uint_16 rendering_intent; /* Rendering intent of a profile */ | ||||
| #endif | ||||
| 
 | ||||
|    /* Flags are always defined to simplify the code. */ | ||||
|    png_uint_16 flags;            /* As defined below */ | ||||
| } png_colorspace, * PNG_RESTRICT png_colorspacerp; | ||||
| 
 | ||||
| typedef const png_colorspace * PNG_RESTRICT png_const_colorspacerp; | ||||
| 
 | ||||
| /* General flags for the 'flags' field */ | ||||
| #define PNG_COLORSPACE_HAVE_GAMMA           0x0001 | ||||
| #define PNG_COLORSPACE_HAVE_ENDPOINTS       0x0002 | ||||
| #define PNG_COLORSPACE_HAVE_INTENT          0x0004 | ||||
| #define PNG_COLORSPACE_FROM_gAMA            0x0008 | ||||
| #define PNG_COLORSPACE_FROM_cHRM            0x0010 | ||||
| #define PNG_COLORSPACE_FROM_sRGB            0x0020 | ||||
| #define PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB 0x0040 | ||||
| #define PNG_COLORSPACE_MATCHES_sRGB         0x0080 /* exact match on profile */ | ||||
| #define PNG_COLORSPACE_INVALID              0x8000 | ||||
| #define PNG_COLORSPACE_CANCEL(flags)        (0xffff ^ (flags)) | ||||
| #endif /* COLORSPACE || GAMMA */ | ||||
| 
 | ||||
| struct png_struct_def | ||||
| { | ||||
| #ifdef PNG_SETJMP_SUPPORTED | ||||
|    jmp_buf jmp_buf_local;     /* New name in 1.6.0 for jmp_buf in png_struct */ | ||||
|    png_longjmp_ptr longjmp_fn;/* setjmp non-local goto function. */ | ||||
|    jmp_buf *jmp_buf_ptr;      /* passed to longjmp_fn */ | ||||
|    size_t jmp_buf_size;       /* size of the above, if allocated */ | ||||
| #endif | ||||
|    png_error_ptr error_fn;    /* function for printing errors and aborting */ | ||||
| #ifdef PNG_WARNINGS_SUPPORTED | ||||
|    png_error_ptr warning_fn;  /* function for printing warnings */ | ||||
| #endif | ||||
|    png_voidp error_ptr;       /* user supplied struct for error functions */ | ||||
|    png_rw_ptr write_data_fn;  /* function for writing output data */ | ||||
|    png_rw_ptr read_data_fn;   /* function for reading input data */ | ||||
|    png_voidp io_ptr;          /* ptr to application struct for I/O functions */ | ||||
| 
 | ||||
| #ifdef PNG_READ_USER_TRANSFORM_SUPPORTED | ||||
|    png_user_transform_ptr read_user_transform_fn; /* user read transform */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED | ||||
|    png_user_transform_ptr write_user_transform_fn; /* user write transform */ | ||||
| #endif | ||||
| 
 | ||||
| /* These were added in libpng-1.0.2 */ | ||||
| #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED | ||||
| #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ | ||||
|     defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) | ||||
|    png_voidp user_transform_ptr; /* user supplied struct for user transform */ | ||||
|    png_byte user_transform_depth;    /* bit depth of user transformed pixels */ | ||||
|    png_byte user_transform_channels; /* channels in user transformed pixels */ | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
|    png_uint_32 mode;          /* tells us where we are in the PNG file */ | ||||
|    png_uint_32 flags;         /* flags indicating various things to libpng */ | ||||
|    png_uint_32 transformations; /* which transformations to perform */ | ||||
| 
 | ||||
|    png_uint_32 zowner;        /* ID (chunk type) of zstream owner, 0 if none */ | ||||
|    z_stream    zstream;       /* decompression structure */ | ||||
| 
 | ||||
| #ifdef PNG_WRITE_SUPPORTED | ||||
|    png_compression_bufferp zbuffer_list; /* Created on demand during write */ | ||||
|    uInt                    zbuffer_size; /* size of the actual buffer */ | ||||
| 
 | ||||
|    int zlib_level;            /* holds zlib compression level */ | ||||
|    int zlib_method;           /* holds zlib compression method */ | ||||
|    int zlib_window_bits;      /* holds zlib compression window bits */ | ||||
|    int zlib_mem_level;        /* holds zlib compression memory level */ | ||||
|    int zlib_strategy;         /* holds zlib compression strategy */ | ||||
| #endif | ||||
| /* Added at libpng 1.5.4 */ | ||||
| #ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED | ||||
|    int zlib_text_level;            /* holds zlib compression level */ | ||||
|    int zlib_text_method;           /* holds zlib compression method */ | ||||
|    int zlib_text_window_bits;      /* holds zlib compression window bits */ | ||||
|    int zlib_text_mem_level;        /* holds zlib compression memory level */ | ||||
|    int zlib_text_strategy;         /* holds zlib compression strategy */ | ||||
| #endif | ||||
| /* End of material added at libpng 1.5.4 */ | ||||
| /* Added at libpng 1.6.0 */ | ||||
| #ifdef PNG_WRITE_SUPPORTED | ||||
|    int zlib_set_level;        /* Actual values set into the zstream on write */ | ||||
|    int zlib_set_method; | ||||
|    int zlib_set_window_bits; | ||||
|    int zlib_set_mem_level; | ||||
|    int zlib_set_strategy; | ||||
| #endif | ||||
| 
 | ||||
|    png_uint_32 width;         /* width of image in pixels */ | ||||
|    png_uint_32 height;        /* height of image in pixels */ | ||||
|    png_uint_32 num_rows;      /* number of rows in current pass */ | ||||
|    png_uint_32 usr_width;     /* width of row at start of write */ | ||||
|    size_t rowbytes;           /* size of row in bytes */ | ||||
|    png_uint_32 iwidth;        /* width of current interlaced row in pixels */ | ||||
|    png_uint_32 row_number;    /* current row in interlace pass */ | ||||
|    png_uint_32 chunk_name;    /* PNG_CHUNK() id of current chunk */ | ||||
|    png_bytep prev_row;        /* buffer to save previous (unfiltered) row.
 | ||||
|                                * While reading this is a pointer into | ||||
|                                * big_prev_row; while writing it is separately | ||||
|                                * allocated if needed. | ||||
|                                */ | ||||
|    png_bytep row_buf;         /* buffer to save current (unfiltered) row.
 | ||||
|                                * While reading, this is a pointer into | ||||
|                                * big_row_buf; while writing it is separately | ||||
|                                * allocated. | ||||
|                                */ | ||||
| #ifdef PNG_WRITE_FILTER_SUPPORTED | ||||
|    png_bytep try_row;    /* buffer to save trial row when filtering */ | ||||
|    png_bytep tst_row;    /* buffer to save best trial row when filtering */ | ||||
| #endif | ||||
|    size_t info_rowbytes;      /* Added in 1.5.4: cache of updated row bytes */ | ||||
| 
 | ||||
|    png_uint_32 idat_size;     /* current IDAT size for read */ | ||||
|    png_uint_32 crc;           /* current chunk CRC value */ | ||||
|    png_colorp palette;        /* palette from the input file */ | ||||
|    png_uint_16 num_palette;   /* number of color entries in palette */ | ||||
| 
 | ||||
| /* Added at libpng-1.5.10 */ | ||||
| #ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED | ||||
|    int num_palette_max;       /* maximum palette index found in IDAT */ | ||||
| #endif | ||||
| 
 | ||||
|    png_uint_16 num_trans;     /* number of transparency values */ | ||||
|    png_byte compression;      /* file compression type (always 0) */ | ||||
|    png_byte filter;           /* file filter type (always 0) */ | ||||
|    png_byte interlaced;       /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ | ||||
|    png_byte pass;             /* current interlace pass (0 - 6) */ | ||||
|    png_byte do_filter;        /* row filter flags (see PNG_FILTER_ in png.h ) */ | ||||
|    png_byte color_type;       /* color type of file */ | ||||
|    png_byte bit_depth;        /* bit depth of file */ | ||||
|    png_byte usr_bit_depth;    /* bit depth of users row: write only */ | ||||
|    png_byte pixel_depth;      /* number of bits per pixel */ | ||||
|    png_byte channels;         /* number of channels in file */ | ||||
| #ifdef PNG_WRITE_SUPPORTED | ||||
|    png_byte usr_channels;     /* channels at start of write: write only */ | ||||
| #endif | ||||
|    png_byte sig_bytes;        /* magic bytes read/written from start of file */ | ||||
|    png_byte maximum_pixel_depth; | ||||
|                               /* pixel depth used for the row buffers */ | ||||
|    png_byte transformed_pixel_depth; | ||||
|                               /* pixel depth after read/write transforms */ | ||||
| #if ZLIB_VERNUM >= 0x1240 | ||||
|    png_byte zstream_start;    /* at start of an input zlib stream */ | ||||
| #endif /* Zlib >= 1.2.4 */ | ||||
| #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) | ||||
|    png_uint_16 filler;           /* filler bytes for pixel expansion */ | ||||
| #endif | ||||
| 
 | ||||
| #if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ | ||||
|    defined(PNG_READ_ALPHA_MODE_SUPPORTED) | ||||
|    png_byte background_gamma_type; | ||||
|    png_fixed_point background_gamma; | ||||
|    png_color_16 background;   /* background color in screen gamma space */ | ||||
| #ifdef PNG_READ_GAMMA_SUPPORTED | ||||
|    png_color_16 background_1; /* background normalized to gamma 1.0 */ | ||||
| #endif | ||||
| #endif /* bKGD */ | ||||
| 
 | ||||
| #ifdef PNG_WRITE_FLUSH_SUPPORTED | ||||
|    png_flush_ptr output_flush_fn; /* Function for flushing output */ | ||||
|    png_uint_32 flush_dist;    /* how many rows apart to flush, 0 - no flush */ | ||||
|    png_uint_32 flush_rows;    /* number of rows written since last flush */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_READ_GAMMA_SUPPORTED | ||||
|    int gamma_shift;      /* number of "insignificant" bits in 16-bit gamma */ | ||||
|    png_fixed_point screen_gamma; /* screen gamma value (display_exponent) */ | ||||
| 
 | ||||
|    png_bytep gamma_table;     /* gamma table for 8-bit depth files */ | ||||
|    png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ | ||||
| #if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ | ||||
|    defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \ | ||||
|    defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) | ||||
|    png_bytep gamma_from_1;    /* converts from 1.0 to screen */ | ||||
|    png_bytep gamma_to_1;      /* converts from file to 1.0 */ | ||||
|    png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ | ||||
|    png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ | ||||
| #endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */ | ||||
| #endif | ||||
| 
 | ||||
| #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) | ||||
|    png_color_8 sig_bit;       /* significant bits in each available channel */ | ||||
| #endif | ||||
| 
 | ||||
| #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) | ||||
|    png_color_8 shift;         /* shift for significant bit transformation */ | ||||
| #endif | ||||
| 
 | ||||
| #if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ | ||||
|  || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) | ||||
|    png_bytep trans_alpha;           /* alpha values for paletted files */ | ||||
|    png_color_16 trans_color;  /* transparent color for non-paletted files */ | ||||
| #endif | ||||
| 
 | ||||
|    png_read_status_ptr read_row_fn;   /* called after each row is decoded */ | ||||
|    png_write_status_ptr write_row_fn; /* called after each row is encoded */ | ||||
| #ifdef PNG_PROGRESSIVE_READ_SUPPORTED | ||||
|    png_progressive_info_ptr info_fn; /* called after header data fully read */ | ||||
|    png_progressive_row_ptr row_fn;   /* called after a prog. row is decoded */ | ||||
|    png_progressive_end_ptr end_fn;   /* called after image is complete */ | ||||
|    png_bytep save_buffer_ptr;        /* current location in save_buffer */ | ||||
|    png_bytep save_buffer;            /* buffer for previously read data */ | ||||
|    png_bytep current_buffer_ptr;     /* current location in current_buffer */ | ||||
|    png_bytep current_buffer;         /* buffer for recently used data */ | ||||
|    png_uint_32 push_length;          /* size of current input chunk */ | ||||
|    png_uint_32 skip_length;          /* bytes to skip in input data */ | ||||
|    size_t save_buffer_size;          /* amount of data now in save_buffer */ | ||||
|    size_t save_buffer_max;           /* total size of save_buffer */ | ||||
|    size_t buffer_size;               /* total amount of available input data */ | ||||
|    size_t current_buffer_size;       /* amount of data now in current_buffer */ | ||||
|    int process_mode;                 /* what push library is currently doing */ | ||||
|    int cur_palette;                  /* current push library palette index */ | ||||
| #endif /* PROGRESSIVE_READ */ | ||||
| 
 | ||||
| #ifdef PNG_READ_QUANTIZE_SUPPORTED | ||||
|    png_bytep palette_lookup; /* lookup table for quantizing */ | ||||
|    png_bytep quantize_index; /* index translation for palette files */ | ||||
| #endif | ||||
| 
 | ||||
| /* Options */ | ||||
| #ifdef PNG_SET_OPTION_SUPPORTED | ||||
|    png_uint_32 options;           /* On/off state (up to 16 options) */ | ||||
| #endif | ||||
| 
 | ||||
| #if PNG_LIBPNG_VER < 10700 | ||||
| /* To do: remove this from libpng-1.7 */ | ||||
| #ifdef PNG_TIME_RFC1123_SUPPORTED | ||||
|    char time_buffer[29]; /* String to hold RFC 1123 time text */ | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| /* New members added in libpng-1.0.6 */ | ||||
| 
 | ||||
|    png_uint_32 free_me;    /* flags items libpng is responsible for freeing */ | ||||
| 
 | ||||
| #ifdef PNG_USER_CHUNKS_SUPPORTED | ||||
|    png_voidp user_chunk_ptr; | ||||
| #ifdef PNG_READ_USER_CHUNKS_SUPPORTED | ||||
|    png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED | ||||
|    int          unknown_default; /* As PNG_HANDLE_* */ | ||||
|    unsigned int num_chunk_list;  /* Number of entries in the list */ | ||||
|    png_bytep    chunk_list;      /* List of png_byte[5]; the textual chunk name
 | ||||
|                                   * followed by a PNG_HANDLE_* byte */ | ||||
| #endif | ||||
| 
 | ||||
| /* New members added in libpng-1.0.3 */ | ||||
| #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED | ||||
|    png_byte rgb_to_gray_status; | ||||
|    /* Added in libpng 1.5.5 to record setting of coefficients: */ | ||||
|    png_byte rgb_to_gray_coefficients_set; | ||||
|    /* These were changed from png_byte in libpng-1.0.6 */ | ||||
|    png_uint_16 rgb_to_gray_red_coeff; | ||||
|    png_uint_16 rgb_to_gray_green_coeff; | ||||
|    /* deleted in 1.5.5: rgb_to_gray_blue_coeff; */ | ||||
| #endif | ||||
| 
 | ||||
| /* New member added in libpng-1.6.36 */ | ||||
| #if defined(PNG_READ_EXPAND_SUPPORTED) && \ | ||||
|     defined(PNG_ARM_NEON_IMPLEMENTATION) | ||||
|    png_bytep riffled_palette; /* buffer for accelerated palette expansion */ | ||||
| #endif | ||||
| 
 | ||||
| /* New member added in libpng-1.0.4 (renamed in 1.0.9) */ | ||||
| #if defined(PNG_MNG_FEATURES_SUPPORTED) | ||||
| /* Changed from png_byte to png_uint_32 at version 1.2.0 */ | ||||
|    png_uint_32 mng_features_permitted; | ||||
| #endif | ||||
| 
 | ||||
| /* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ | ||||
| #ifdef PNG_MNG_FEATURES_SUPPORTED | ||||
|    png_byte filter_type; | ||||
| #endif | ||||
| 
 | ||||
| /* New members added in libpng-1.2.0 */ | ||||
| 
 | ||||
| /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ | ||||
| #ifdef PNG_USER_MEM_SUPPORTED | ||||
|    png_voidp mem_ptr;             /* user supplied struct for mem functions */ | ||||
|    png_malloc_ptr malloc_fn;      /* function for allocating memory */ | ||||
|    png_free_ptr free_fn;          /* function for freeing memory */ | ||||
| #endif | ||||
| 
 | ||||
| /* New member added in libpng-1.0.13 and 1.2.0 */ | ||||
|    png_bytep big_row_buf;         /* buffer to save current (unfiltered) row */ | ||||
| 
 | ||||
| #ifdef PNG_READ_QUANTIZE_SUPPORTED | ||||
| /* The following three members were added at version 1.0.14 and 1.2.4 */ | ||||
|    png_bytep quantize_sort;          /* working sort array */ | ||||
|    png_bytep index_to_palette;       /* where the original index currently is
 | ||||
|                                         in the palette */ | ||||
|    png_bytep palette_to_index;       /* which original index points to this
 | ||||
|                                          palette color */ | ||||
| #endif | ||||
| 
 | ||||
| /* New members added in libpng-1.0.16 and 1.2.6 */ | ||||
|    png_byte compression_type; | ||||
| 
 | ||||
| #ifdef PNG_USER_LIMITS_SUPPORTED | ||||
|    png_uint_32 user_width_max; | ||||
|    png_uint_32 user_height_max; | ||||
| 
 | ||||
|    /* Added in libpng-1.4.0: Total number of sPLT, text, and unknown
 | ||||
|     * chunks that can be stored (0 means unlimited). | ||||
|     */ | ||||
|    png_uint_32 user_chunk_cache_max; | ||||
| 
 | ||||
|    /* Total memory that a zTXt, sPLT, iTXt, iCCP, or unknown chunk
 | ||||
|     * can occupy when decompressed.  0 means unlimited. | ||||
|     */ | ||||
|    png_alloc_size_t user_chunk_malloc_max; | ||||
| #endif | ||||
| 
 | ||||
| /* New member added in libpng-1.0.25 and 1.2.17 */ | ||||
| #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED | ||||
|    /* Temporary storage for unknown chunk that the library doesn't recognize,
 | ||||
|     * used while reading the chunk. | ||||
|     */ | ||||
|    png_unknown_chunk unknown_chunk; | ||||
| #endif | ||||
| 
 | ||||
| /* New member added in libpng-1.2.26 */ | ||||
|    size_t old_big_row_buf_size; | ||||
| 
 | ||||
| #ifdef PNG_READ_SUPPORTED | ||||
| /* New member added in libpng-1.2.30 */ | ||||
|   png_bytep        read_buffer;      /* buffer for reading chunk data */ | ||||
|   png_alloc_size_t read_buffer_size; /* current size of the buffer */ | ||||
| #endif | ||||
| #ifdef PNG_SEQUENTIAL_READ_SUPPORTED | ||||
|   uInt             IDAT_read_size;   /* limit on read buffer size for IDAT */ | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_IO_STATE_SUPPORTED | ||||
| /* New member added in libpng-1.4.0 */ | ||||
|    png_uint_32 io_state; | ||||
| #endif | ||||
| 
 | ||||
| /* New member added in libpng-1.5.6 */ | ||||
|    png_bytep big_prev_row; | ||||
| 
 | ||||
| /* New member added in libpng-1.5.7 */ | ||||
|    void (*read_filter[PNG_FILTER_VALUE_LAST-1])(png_row_infop row_info, | ||||
|       png_bytep row, png_const_bytep prev_row); | ||||
| 
 | ||||
| #ifdef PNG_READ_SUPPORTED | ||||
| #if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED) | ||||
|    png_colorspace   colorspace; | ||||
| #endif | ||||
| #endif | ||||
| }; | ||||
| #endif /* PNGSTRUCT_H */ | ||||
							
								
								
									
										868
									
								
								dep/libpng/src/pngtrans.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										868
									
								
								dep/libpng/src/pngtrans.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,868 @@ | |||
| 
 | ||||
| /* pngtrans.c - transforms the data in a row (used by both readers and writers)
 | ||||
|  * | ||||
|  * Copyright (c) 2018-2024 Cosmin Truta | ||||
|  * Copyright (c) 1998-2002,2004,2006-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 | ||||
|  */ | ||||
| 
 | ||||
| #include "pngpriv.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_structrp 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_structrp 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_structrp 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; | ||||
| #     ifdef PNG_WRITE_SUPPORTED | ||||
|          png_ptr->usr_bit_depth = 8; | ||||
| #     endif | ||||
|    } | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) | ||||
| /* Turn on packed pixel swapping */ | ||||
| void PNGAPI | ||||
| png_set_packswap(png_structrp 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_structrp png_ptr, png_const_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_structrp png_ptr) | ||||
| { | ||||
|    png_debug(1, "in png_set_interlace handling"); | ||||
| 
 | ||||
|    if (png_ptr != 0 && png_ptr->interlaced != 0) | ||||
|    { | ||||
|       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_structrp png_ptr, png_uint_32 filler, int filler_loc) | ||||
| { | ||||
|    png_debug(1, "in png_set_filler"); | ||||
| 
 | ||||
|    if (png_ptr == NULL) | ||||
|       return; | ||||
| 
 | ||||
|    /* In libpng 1.6 it is possible to determine whether this is a read or write
 | ||||
|     * operation and therefore to do more checking here for a valid call. | ||||
|     */ | ||||
|    if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0) | ||||
|    { | ||||
| #     ifdef PNG_READ_FILLER_SUPPORTED | ||||
|          /* On read png_set_filler is always valid, regardless of the base PNG
 | ||||
|           * format, because other transformations can give a format where the | ||||
|           * filler code can execute (basically an 8 or 16-bit component RGB or G | ||||
|           * format.) | ||||
|           * | ||||
|           * NOTE: usr_channels is not used by the read code!  (This has led to | ||||
|           * confusion in the past.)  The filler is only used in the read code. | ||||
|           */ | ||||
|          png_ptr->filler = (png_uint_16)filler; | ||||
| #     else | ||||
|          png_app_error(png_ptr, "png_set_filler not supported on read"); | ||||
|          PNG_UNUSED(filler) /* not used in the write case */ | ||||
|          return; | ||||
| #     endif | ||||
|    } | ||||
| 
 | ||||
|    else /* write */ | ||||
|    { | ||||
| #     ifdef PNG_WRITE_FILLER_SUPPORTED | ||||
|          /* On write the usr_channels parameter must be set correctly at the
 | ||||
|           * start to record the number of channels in the app-supplied data. | ||||
|           */ | ||||
|          switch (png_ptr->color_type) | ||||
|          { | ||||
|             case PNG_COLOR_TYPE_RGB: | ||||
|                png_ptr->usr_channels = 4; | ||||
|                break; | ||||
| 
 | ||||
|             case PNG_COLOR_TYPE_GRAY: | ||||
|                if (png_ptr->bit_depth >= 8) | ||||
|                { | ||||
|                   png_ptr->usr_channels = 2; | ||||
|                   break; | ||||
|                } | ||||
| 
 | ||||
|                else | ||||
|                { | ||||
|                   /* There simply isn't any code in libpng to strip out bits
 | ||||
|                    * from bytes when the components are less than a byte in | ||||
|                    * size! | ||||
|                    */ | ||||
|                   png_app_error(png_ptr, | ||||
|                       "png_set_filler is invalid for" | ||||
|                       " low bit depth gray output"); | ||||
|                   return; | ||||
|                } | ||||
| 
 | ||||
|             default: | ||||
|                png_app_error(png_ptr, | ||||
|                    "png_set_filler: inappropriate color type"); | ||||
|                return; | ||||
|          } | ||||
| #     else | ||||
|          png_app_error(png_ptr, "png_set_filler not supported on write"); | ||||
|          return; | ||||
| #     endif | ||||
|    } | ||||
| 
 | ||||
|    /* Here on success - libpng supports the operation, set the transformation
 | ||||
|     * and the flag to say where the filler channel is. | ||||
|     */ | ||||
|    png_ptr->transformations |= PNG_FILLER; | ||||
| 
 | ||||
|    if (filler_loc == PNG_FILLER_AFTER) | ||||
|       png_ptr->flags |= PNG_FLAG_FILLER_AFTER; | ||||
| 
 | ||||
|    else | ||||
|       png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; | ||||
| } | ||||
| 
 | ||||
| /* Added to libpng-1.2.7 */ | ||||
| void PNGAPI | ||||
| png_set_add_alpha(png_structrp 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); | ||||
|    /* The above may fail to do anything. */ | ||||
|    if ((png_ptr->transformations & PNG_FILLER) != 0) | ||||
|       png_ptr->transformations |= PNG_ADD_ALPHA; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ | ||||
|     defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) | ||||
| void PNGAPI | ||||
| png_set_swap_alpha(png_structrp 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_structrp 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_structrp 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 (row_info->color_type == PNG_COLOR_TYPE_GRAY) | ||||
|    { | ||||
|       png_bytep rp = row; | ||||
|       size_t i; | ||||
|       size_t 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; | ||||
|       size_t i; | ||||
|       size_t istop = row_info->rowbytes; | ||||
| 
 | ||||
|       for (i = 0; i < istop; i += 2) | ||||
|       { | ||||
|          *rp = (png_byte)(~(*rp)); | ||||
|          rp += 2; | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
| #ifdef PNG_16BIT_SUPPORTED | ||||
|    else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && | ||||
|       row_info->bit_depth == 16) | ||||
|    { | ||||
|       png_bytep rp = row; | ||||
|       size_t i; | ||||
|       size_t istop = row_info->rowbytes; | ||||
| 
 | ||||
|       for (i = 0; i < istop; i += 4) | ||||
|       { | ||||
|          *rp = (png_byte)(~(*rp)); | ||||
|          *(rp + 1) = (png_byte)(~(*(rp + 1))); | ||||
|          rp += 4; | ||||
|       } | ||||
|    } | ||||
| #endif | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_16BIT_SUPPORTED | ||||
| #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 (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) | ||||
|       { | ||||
| #ifdef PNG_BUILTIN_BSWAP16_SUPPORTED | ||||
|          /* Feature added to libpng-1.6.11 for testing purposes, not
 | ||||
|           * enabled by default. | ||||
|           */ | ||||
|          *(png_uint_16*)rp = __builtin_bswap16(*(png_uint_16*)rp); | ||||
| #else | ||||
|          png_byte t = *rp; | ||||
|          *rp = *(rp + 1); | ||||
|          *(rp + 1) = t; | ||||
| #endif | ||||
|       } | ||||
|    } | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) | ||||
| static 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 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 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 (row_info->bit_depth < 8) | ||||
|    { | ||||
|       png_bytep rp; | ||||
|       png_const_bytep end, table; | ||||
| 
 | ||||
|       end = row + row_info->rowbytes; | ||||
| 
 | ||||
|       if (row_info->bit_depth == 1) | ||||
|          table = onebppswaptable; | ||||
| 
 | ||||
|       else if (row_info->bit_depth == 2) | ||||
|          table = twobppswaptable; | ||||
| 
 | ||||
|       else if (row_info->bit_depth == 4) | ||||
|          table = fourbppswaptable; | ||||
| 
 | ||||
|       else | ||||
|          return; | ||||
| 
 | ||||
|       for (rp = row; rp < end; rp++) | ||||
|          *rp = table[*rp]; | ||||
|    } | ||||
| } | ||||
| #endif /* PACKSWAP || WRITE_PACKSWAP */ | ||||
| 
 | ||||
| #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ | ||||
|     defined(PNG_READ_STRIP_ALPHA_SUPPORTED) | ||||
| /* Remove a channel - this used to be 'png_do_strip_filler' but it used a
 | ||||
|  * somewhat weird combination of flags to determine what to do.  All the calls | ||||
|  * to png_do_strip_filler are changed in 1.5.2 to call this instead with the | ||||
|  * correct arguments. | ||||
|  * | ||||
|  * The routine isn't general - the channel must be the channel at the start or | ||||
|  * end (not in the middle) of each pixel. | ||||
|  */ | ||||
| void /* PRIVATE */ | ||||
| png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) | ||||
| { | ||||
|    png_bytep sp = row; /* source pointer */ | ||||
|    png_bytep dp = row; /* destination pointer */ | ||||
|    png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */ | ||||
| 
 | ||||
|    png_debug(1, "in png_do_strip_channel"); | ||||
| 
 | ||||
|    /* At the start sp will point to the first byte to copy and dp to where
 | ||||
|     * it is copied to.  ep always points just beyond the end of the row, so | ||||
|     * the loop simply copies (channels-1) channels until sp reaches ep. | ||||
|     * | ||||
|     * at_start:        0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc. | ||||
|     *            nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc. | ||||
|     */ | ||||
| 
 | ||||
|    /* GA, GX, XG cases */ | ||||
|    if (row_info->channels == 2) | ||||
|    { | ||||
|       if (row_info->bit_depth == 8) | ||||
|       { | ||||
|          if (at_start != 0) /* Skip initial filler */ | ||||
|             ++sp; | ||||
|          else          /* Skip initial channel and, for sp, the filler */ | ||||
|          { | ||||
|             sp += 2; ++dp; | ||||
|          } | ||||
| 
 | ||||
|          /* For a 1 pixel wide image there is nothing to do */ | ||||
|          while (sp < ep) | ||||
|          { | ||||
|             *dp++ = *sp; sp += 2; | ||||
|          } | ||||
| 
 | ||||
|          row_info->pixel_depth = 8; | ||||
|       } | ||||
| 
 | ||||
|       else if (row_info->bit_depth == 16) | ||||
|       { | ||||
|          if (at_start != 0) /* Skip initial filler */ | ||||
|             sp += 2; | ||||
|          else          /* Skip initial channel and, for sp, the filler */ | ||||
|          { | ||||
|             sp += 4; dp += 2; | ||||
|          } | ||||
| 
 | ||||
|          while (sp < ep) | ||||
|          { | ||||
|             *dp++ = *sp++; *dp++ = *sp; sp += 3; | ||||
|          } | ||||
| 
 | ||||
|          row_info->pixel_depth = 16; | ||||
|       } | ||||
| 
 | ||||
|       else | ||||
|          return; /* bad bit depth */ | ||||
| 
 | ||||
|       row_info->channels = 1; | ||||
| 
 | ||||
|       /* Finally fix the color type if it records an alpha channel */ | ||||
|       if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||
|          row_info->color_type = PNG_COLOR_TYPE_GRAY; | ||||
|    } | ||||
| 
 | ||||
|    /* RGBA, RGBX, XRGB cases */ | ||||
|    else if (row_info->channels == 4) | ||||
|    { | ||||
|       if (row_info->bit_depth == 8) | ||||
|       { | ||||
|          if (at_start != 0) /* Skip initial filler */ | ||||
|             ++sp; | ||||
|          else          /* Skip initial channels and, for sp, the filler */ | ||||
|          { | ||||
|             sp += 4; dp += 3; | ||||
|          } | ||||
| 
 | ||||
|          /* Note that the loop adds 3 to dp and 4 to sp each time. */ | ||||
|          while (sp < ep) | ||||
|          { | ||||
|             *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp; sp += 2; | ||||
|          } | ||||
| 
 | ||||
|          row_info->pixel_depth = 24; | ||||
|       } | ||||
| 
 | ||||
|       else if (row_info->bit_depth == 16) | ||||
|       { | ||||
|          if (at_start != 0) /* Skip initial filler */ | ||||
|             sp += 2; | ||||
|          else          /* Skip initial channels and, for sp, the filler */ | ||||
|          { | ||||
|             sp += 8; dp += 6; | ||||
|          } | ||||
| 
 | ||||
|          while (sp < ep) | ||||
|          { | ||||
|             /* Copy 6 bytes, skip 2 */ | ||||
|             *dp++ = *sp++; *dp++ = *sp++; | ||||
|             *dp++ = *sp++; *dp++ = *sp++; | ||||
|             *dp++ = *sp++; *dp++ = *sp; sp += 3; | ||||
|          } | ||||
| 
 | ||||
|          row_info->pixel_depth = 48; | ||||
|       } | ||||
| 
 | ||||
|       else | ||||
|          return; /* bad bit depth */ | ||||
| 
 | ||||
|       row_info->channels = 3; | ||||
| 
 | ||||
|       /* Finally fix the color type if it records an alpha channel */ | ||||
|       if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||
|          row_info->color_type = PNG_COLOR_TYPE_RGB; | ||||
|    } | ||||
| 
 | ||||
|    else | ||||
|       return; /* The filler channel has gone already */ | ||||
| 
 | ||||
|    /* Fix the rowbytes value. */ | ||||
|    row_info->rowbytes = (size_t)(dp-row); | ||||
| } | ||||
| #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 ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0) | ||||
|    { | ||||
|       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; | ||||
|             } | ||||
|          } | ||||
|       } | ||||
| 
 | ||||
| #ifdef PNG_16BIT_SUPPORTED | ||||
|       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 | ||||
|    } | ||||
| } | ||||
| #endif /* READ_BGR || WRITE_BGR */ | ||||
| 
 | ||||
| #if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ | ||||
|     defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) | ||||
| /* Added at libpng-1.5.10 */ | ||||
| void /* PRIVATE */ | ||||
| png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info) | ||||
| { | ||||
|    png_debug(1, "in png_do_check_palette_indexes"); | ||||
| 
 | ||||
|    if (png_ptr->num_palette < (1 << row_info->bit_depth) && | ||||
|       png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */ | ||||
|    { | ||||
|       /* Calculations moved outside switch in an attempt to stop different
 | ||||
|        * compiler warnings.  'padding' is in *bits* within the last byte, it is | ||||
|        * an 'int' because pixel_depth becomes an 'int' in the expression below, | ||||
|        * and this calculation is used because it avoids warnings that other | ||||
|        * forms produced on either GCC or MSVC. | ||||
|        */ | ||||
|       int padding = PNG_PADBITS(row_info->pixel_depth, row_info->width); | ||||
|       png_bytep rp = png_ptr->row_buf + row_info->rowbytes; | ||||
| 
 | ||||
|       switch (row_info->bit_depth) | ||||
|       { | ||||
|          case 1: | ||||
|          { | ||||
|             /* in this case, all bytes must be 0 so we don't need
 | ||||
|              * to unpack the pixels except for the rightmost one. | ||||
|              */ | ||||
|             for (; rp > png_ptr->row_buf; rp--) | ||||
|             { | ||||
|               if ((*rp >> padding) != 0) | ||||
|                  png_ptr->num_palette_max = 1; | ||||
|               padding = 0; | ||||
|             } | ||||
| 
 | ||||
|             break; | ||||
|          } | ||||
| 
 | ||||
|          case 2: | ||||
|          { | ||||
|             for (; rp > png_ptr->row_buf; rp--) | ||||
|             { | ||||
|               int i = ((*rp >> padding) & 0x03); | ||||
| 
 | ||||
|               if (i > png_ptr->num_palette_max) | ||||
|                  png_ptr->num_palette_max = i; | ||||
| 
 | ||||
|               i = (((*rp >> padding) >> 2) & 0x03); | ||||
| 
 | ||||
|               if (i > png_ptr->num_palette_max) | ||||
|                  png_ptr->num_palette_max = i; | ||||
| 
 | ||||
|               i = (((*rp >> padding) >> 4) & 0x03); | ||||
| 
 | ||||
|               if (i > png_ptr->num_palette_max) | ||||
|                  png_ptr->num_palette_max = i; | ||||
| 
 | ||||
|               i = (((*rp >> padding) >> 6) & 0x03); | ||||
| 
 | ||||
|               if (i > png_ptr->num_palette_max) | ||||
|                  png_ptr->num_palette_max = i; | ||||
| 
 | ||||
|               padding = 0; | ||||
|             } | ||||
| 
 | ||||
|             break; | ||||
|          } | ||||
| 
 | ||||
|          case 4: | ||||
|          { | ||||
|             for (; rp > png_ptr->row_buf; rp--) | ||||
|             { | ||||
|               int i = ((*rp >> padding) & 0x0f); | ||||
| 
 | ||||
|               if (i > png_ptr->num_palette_max) | ||||
|                  png_ptr->num_palette_max = i; | ||||
| 
 | ||||
|               i = (((*rp >> padding) >> 4) & 0x0f); | ||||
| 
 | ||||
|               if (i > png_ptr->num_palette_max) | ||||
|                  png_ptr->num_palette_max = i; | ||||
| 
 | ||||
|               padding = 0; | ||||
|             } | ||||
| 
 | ||||
|             break; | ||||
|          } | ||||
| 
 | ||||
|          case 8: | ||||
|          { | ||||
|             for (; rp > png_ptr->row_buf; rp--) | ||||
|             { | ||||
|                if (*rp > png_ptr->num_palette_max) | ||||
|                   png_ptr->num_palette_max = (int) *rp; | ||||
|             } | ||||
| 
 | ||||
|             break; | ||||
|          } | ||||
| 
 | ||||
|          default: | ||||
|             break; | ||||
|       } | ||||
|    } | ||||
| } | ||||
| #endif /* CHECK_FOR_INVALID_INDEX */ | ||||
| 
 | ||||
| #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ | ||||
|     defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) | ||||
| #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED | ||||
| void PNGAPI | ||||
| png_set_user_transform_info(png_structrp 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; | ||||
| 
 | ||||
| #ifdef PNG_READ_USER_TRANSFORM_SUPPORTED | ||||
|    if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && | ||||
|       (png_ptr->flags & PNG_FLAG_ROW_INIT) != 0) | ||||
|    { | ||||
|       png_app_error(png_ptr, | ||||
|           "info change after png_start_read_image or png_read_update_info"); | ||||
|       return; | ||||
|    } | ||||
| #endif | ||||
| 
 | ||||
|    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; | ||||
| } | ||||
| #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. | ||||
|  */ | ||||
| #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED | ||||
| png_voidp PNGAPI | ||||
| png_get_user_transform_ptr(png_const_structrp png_ptr) | ||||
| { | ||||
|    if (png_ptr == NULL) | ||||
|       return NULL; | ||||
| 
 | ||||
|    return png_ptr->user_transform_ptr; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED | ||||
| png_uint_32 PNGAPI | ||||
| png_get_current_row_number(png_const_structrp png_ptr) | ||||
| { | ||||
|    /* See the comments in png.h - this is the sub-image row when reading an
 | ||||
|     * interlaced image. | ||||
|     */ | ||||
|    if (png_ptr != NULL) | ||||
|       return png_ptr->row_number; | ||||
| 
 | ||||
|    return PNG_UINT_32_MAX; /* help the app not to fail silently */ | ||||
| } | ||||
| 
 | ||||
| png_byte PNGAPI | ||||
| png_get_current_pass_number(png_const_structrp png_ptr) | ||||
| { | ||||
|    if (png_ptr != NULL) | ||||
|       return png_ptr->pass; | ||||
|    return 8; /* invalid */ | ||||
| } | ||||
| #endif /* USER_TRANSFORM_INFO */ | ||||
| #endif /* READ_USER_TRANSFORM || WRITE_USER_TRANSFORM */ | ||||
| #endif /* READ || WRITE */ | ||||
							
								
								
									
										168
									
								
								dep/libpng/src/pngwio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								dep/libpng/src/pngwio.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,168 @@ | |||
| 
 | ||||
| /* pngwio.c - functions for data output
 | ||||
|  * | ||||
|  * 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 | ||||
|  * 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(...). | ||||
|  */ | ||||
| 
 | ||||
| #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. | ||||
|  */ | ||||
| 
 | ||||
| void /* PRIVATE */ | ||||
| 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, png_constcast(png_bytep,data), | ||||
|           length); | ||||
| 
 | ||||
|    else | ||||
|       png_error(png_ptr, "Call to NULL write function"); | ||||
| } | ||||
| 
 | ||||
| #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. | ||||
|  */ | ||||
| void PNGCBAPI | ||||
| png_default_write_data(png_structp png_ptr, png_bytep data, size_t length) | ||||
| { | ||||
|    size_t check; | ||||
| 
 | ||||
|    if (png_ptr == NULL) | ||||
|       return; | ||||
| 
 | ||||
|    check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr)); | ||||
| 
 | ||||
|    if (check != length) | ||||
|       png_error(png_ptr, "Write Error"); | ||||
| } | ||||
| #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. | ||||
|  */ | ||||
| #ifdef PNG_WRITE_FLUSH_SUPPORTED | ||||
| void /* PRIVATE */ | ||||
| png_flush(png_structrp png_ptr) | ||||
| { | ||||
|    if (png_ptr->output_flush_fn != NULL) | ||||
|       (*(png_ptr->output_flush_fn))(png_ptr); | ||||
| } | ||||
| 
 | ||||
| #  ifdef PNG_STDIO_SUPPORTED | ||||
| void PNGCBAPI | ||||
| png_default_flush(png_structp png_ptr) | ||||
| { | ||||
|    png_FILE_p io_ptr; | ||||
| 
 | ||||
|    if (png_ptr == NULL) | ||||
|       return; | ||||
| 
 | ||||
|    io_ptr = png_voidcast(png_FILE_p, (png_ptr->io_ptr)); | ||||
|    fflush(io_ptr); | ||||
| } | ||||
| #  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 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_structrp 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; | ||||
| 
 | ||||
| #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 | ||||
| 
 | ||||
| #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 | ||||
| #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, | ||||
|           "Can't set both read_data_fn and write_data_fn in the" | ||||
|           " same structure"); | ||||
|    } | ||||
| #endif | ||||
| } | ||||
| #endif /* WRITE */ | ||||
							
								
								
									
										2418
									
								
								dep/libpng/src/pngwrite.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2418
									
								
								dep/libpng/src/pngwrite.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										575
									
								
								dep/libpng/src/pngwtran.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										575
									
								
								dep/libpng/src/pngwtran.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,575 @@ | |||
| 
 | ||||
| /* pngwtran.c - transforms the data in a row for PNG writers
 | ||||
|  * | ||||
|  * 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 | ||||
|  */ | ||||
| 
 | ||||
| #include "pngpriv.h" | ||||
| 
 | ||||
| #ifdef PNG_WRITE_SUPPORTED | ||||
| #ifdef PNG_WRITE_TRANSFORMS_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). | ||||
|  */ | ||||
| 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"); | ||||
| 
 | ||||
|    if (row_info->bit_depth == 8 && | ||||
|       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; | ||||
|             unsigned int shift; | ||||
|             int 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; | ||||
|             unsigned int shift; | ||||
|             int 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; | ||||
|          } | ||||
| 
 | ||||
|          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); | ||||
|    } | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #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 | ||||
|  * 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. | ||||
|  */ | ||||
| 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"); | ||||
| 
 | ||||
|    if (row_info->color_type != PNG_COLOR_TYPE_PALETTE) | ||||
|    { | ||||
|       int shift_start[4], shift_dec[4]; | ||||
|       unsigned int channels = 0; | ||||
| 
 | ||||
|       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) != 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 */ | ||||
|       if (row_info->bit_depth < 8) | ||||
|       { | ||||
|          png_bytep bp = row; | ||||
|          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++) | ||||
|          { | ||||
|             int j; | ||||
|             unsigned int v, out; | ||||
| 
 | ||||
|             v = *bp; | ||||
|             out = 0; | ||||
| 
 | ||||
|             for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) | ||||
|             { | ||||
|                if (j > 0) | ||||
|                   out |= v << j; | ||||
| 
 | ||||
|                else | ||||
|                   out |= (v >> (-j)) & mask; | ||||
|             } | ||||
| 
 | ||||
|             *bp = (png_byte)(out & 0xff); | ||||
|          } | ||||
|       } | ||||
| 
 | ||||
|       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++) | ||||
|          { | ||||
|             unsigned int c = i%channels; | ||||
|             int j; | ||||
|             unsigned int v, out; | ||||
| 
 | ||||
|             v = *bp; | ||||
|             out = 0; | ||||
| 
 | ||||
|             for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) | ||||
|             { | ||||
|                if (j > 0) | ||||
|                   out |= v << j; | ||||
| 
 | ||||
|                else | ||||
|                   out |= v >> (-j); | ||||
|             } | ||||
| 
 | ||||
|             *bp = (png_byte)(out & 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++) | ||||
|          { | ||||
|             unsigned int c = i%channels; | ||||
|             int j; | ||||
|             unsigned int value, v; | ||||
| 
 | ||||
|             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 |= v << j; | ||||
| 
 | ||||
|                else | ||||
|                   value |= v >> (-j); | ||||
|             } | ||||
|             *bp++ = (png_byte)((value >> 8) & 0xff); | ||||
|             *bp++ = (png_byte)(value & 0xff); | ||||
|          } | ||||
|       } | ||||
|    } | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #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"); | ||||
| 
 | ||||
|    { | ||||
|       if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||
|       { | ||||
|          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++); | ||||
|                *(dp++) = *(sp++); | ||||
|                *(dp++) = *(sp++); | ||||
|                *(dp++) = *(sp++); | ||||
|                *(dp++) = save; | ||||
|             } | ||||
|          } | ||||
| 
 | ||||
| #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; | ||||
| 
 | ||||
|             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]; | ||||
|             } | ||||
|          } | ||||
| #endif /* WRITE_16BIT */ | ||||
|       } | ||||
| 
 | ||||
|       else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||
|       { | ||||
|          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; | ||||
| 
 | ||||
|             for (i = 0, sp = dp = row; i < row_width; i++) | ||||
|             { | ||||
|                png_byte save = *(sp++); | ||||
|                *(dp++) = *(sp++); | ||||
|                *(dp++) = save; | ||||
|             } | ||||
|          } | ||||
| 
 | ||||
| #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; | ||||
| 
 | ||||
|             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 /* WRITE_16BIT */ | ||||
|       } | ||||
|    } | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #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"); | ||||
| 
 | ||||
|    { | ||||
|       if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||
|       { | ||||
|          if (row_info->bit_depth == 8) | ||||
|          { | ||||
|             /* 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
 | ||||
|                *(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++); | ||||
|                *(dp++) = *(sp++); | ||||
|                *(dp++) = *(sp++); | ||||
|                *(dp++) = *(sp++); | ||||
|                */ | ||||
|                sp+=6; dp = 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) | ||||
|       { | ||||
|          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; | ||||
| 
 | ||||
|             for (i = 0, sp = dp = row; i < row_width; i++) | ||||
|             { | ||||
|                *(dp++) = *(sp++); | ||||
|                *(dp++) = (png_byte)(255 - *(sp++)); | ||||
|             } | ||||
|          } | ||||
| 
 | ||||
| #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
 | ||||
|                *(dp++) = *(sp++); | ||||
|                *(dp++) = *(sp++); | ||||
|                */ | ||||
|                sp+=2; dp = sp; | ||||
|                *(dp++) = (png_byte)(255 - *(sp++)); | ||||
|                *dp     = (png_byte)(255 - *(sp++)); | ||||
|             } | ||||
|          } | ||||
| #endif /* WRITE_16BIT */ | ||||
|       } | ||||
|    } | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /* Transform the data according to the user's wishes.  The order of
 | ||||
|  * transformations is significant. | ||||
|  */ | ||||
| void /* PRIVATE */ | ||||
| png_do_write_transformations(png_structrp png_ptr, png_row_infop row_info) | ||||
| { | ||||
|    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 | ||||
| 
 | ||||
| #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 | ||||
| 
 | ||||
| #ifdef PNG_WRITE_PACKSWAP_SUPPORTED | ||||
|    if ((png_ptr->transformations & PNG_PACKSWAP) != 0) | ||||
|       png_do_packswap(row_info, png_ptr->row_buf + 1); | ||||
| #endif | ||||
| 
 | ||||
| #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 | ||||
| 
 | ||||
| #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 /* WRITE_TRANSFORMS */ | ||||
| #endif /* WRITE */ | ||||
							
								
								
									
										2781
									
								
								dep/libpng/src/pngwutil.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2781
									
								
								dep/libpng/src/pngwutil.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -29,4 +29,5 @@ add_library(zlib | |||
| 
 | ||||
| target_include_directories(zlib PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include") | ||||
| target_include_directories(zlib INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include") | ||||
| disable_compiler_warnings_for_target(zlib) | ||||
| add_library(ZLIB::ZLIB ALIAS zlib) | ||||
|  |  | |||
|  | @ -1,37 +1,38 @@ | |||
| enable_language(C ASM) | ||||
| 
 | ||||
| add_library(zstd | ||||
| 	lib/common/debug.c | ||||
| 	lib/common/entropy_common.c | ||||
| 	lib/common/error_private.c | ||||
| 	lib/common/fse_decompress.c | ||||
| 	lib/common/pool.c | ||||
| 	lib/common/threading.c | ||||
| 	lib/common/xxhash.c | ||||
| 	lib/common/zstd_common.c | ||||
| 	lib/compress/fse_compress.c | ||||
| 	lib/compress/hist.c | ||||
| 	lib/compress/huf_compress.c | ||||
| 	lib/compress/zstd_compress.c | ||||
| 	lib/compress/zstd_compress_literals.c | ||||
| 	lib/compress/zstd_compress_sequences.c | ||||
| 	lib/compress/zstd_compress_superblock.c | ||||
| 	lib/compress/zstd_double_fast.c | ||||
| 	lib/compress/zstd_fast.c | ||||
| 	lib/compress/zstd_lazy.c | ||||
| 	lib/compress/zstd_ldm.c | ||||
| 	lib/compress/zstdmt_compress.c | ||||
| 	lib/compress/zstd_opt.c | ||||
| 	lib/decompress/huf_decompress.c | ||||
| 	lib/decompress/zstd_ddict.c | ||||
| 	lib/decompress/zstd_decompress_block.c | ||||
| 	lib/decompress/zstd_decompress.c | ||||
|   lib/common/debug.c | ||||
|   lib/common/entropy_common.c | ||||
|   lib/common/error_private.c | ||||
|   lib/common/fse_decompress.c | ||||
|   lib/common/pool.c | ||||
|   lib/common/threading.c | ||||
|   lib/common/xxhash.c | ||||
|   lib/common/zstd_common.c | ||||
|   lib/compress/fse_compress.c | ||||
|   lib/compress/hist.c | ||||
|   lib/compress/huf_compress.c | ||||
|   lib/compress/zstd_compress.c | ||||
|   lib/compress/zstd_compress_literals.c | ||||
|   lib/compress/zstd_compress_sequences.c | ||||
|   lib/compress/zstd_compress_superblock.c | ||||
|   lib/compress/zstd_double_fast.c | ||||
|   lib/compress/zstd_fast.c | ||||
|   lib/compress/zstd_lazy.c | ||||
|   lib/compress/zstd_ldm.c | ||||
|   lib/compress/zstdmt_compress.c | ||||
|   lib/compress/zstd_opt.c | ||||
|   lib/decompress/huf_decompress.c | ||||
|   lib/decompress/zstd_ddict.c | ||||
|   lib/decompress/zstd_decompress_block.c | ||||
|   lib/decompress/zstd_decompress.c | ||||
| ) | ||||
| 
 | ||||
| if(NOT MSVC AND CPU_ARCH_X64) | ||||
| 	target_sources(zstd PRIVATE lib/decompress/huf_decompress_amd64.S) | ||||
|   target_sources(zstd PRIVATE lib/decompress/huf_decompress_amd64.S) | ||||
| endif() | ||||
| 
 | ||||
| target_include_directories(zstd PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/lib") | ||||
| disable_compiler_warnings_for_target(zstd) | ||||
| 
 | ||||
| add_library(Zstd::Zstd ALIAS zstd) | ||||
|  |  | |||
|  | @ -75,6 +75,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reshadefx", "dep\reshadefx\ | |||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rapidyaml", "dep\rapidyaml\rapidyaml.vcxproj", "{1AD23A8A-4C20-434C-AE6B-0E07759EEB1E}" | ||||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "dep\libpng\libpng.vcxproj", "{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|ARM64 = Debug|ARM64 | ||||
|  | @ -1065,6 +1067,38 @@ Global | |||
| 		{1AD23A8A-4C20-434C-AE6B-0E07759EEB1E}.ReleaseLTCG-Clang|ARM64.Build.0 = ReleaseLTCG-Clang|ARM64 | ||||
| 		{1AD23A8A-4C20-434C-AE6B-0E07759EEB1E}.ReleaseLTCG-Clang|x64.ActiveCfg = ReleaseLTCG-Clang|x64 | ||||
| 		{1AD23A8A-4C20-434C-AE6B-0E07759EEB1E}.ReleaseLTCG-Clang|x64.Build.0 = ReleaseLTCG-Clang|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Debug|ARM64.ActiveCfg = Debug|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Debug|ARM64.Build.0 = Debug|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Debug|x64.ActiveCfg = Debug|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Debug|x64.Build.0 = Debug|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Debug-Clang|ARM64.ActiveCfg = Debug-Clang|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Debug-Clang|ARM64.Build.0 = Debug-Clang|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Debug-Clang|x64.ActiveCfg = Debug-Clang|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Debug-Clang|x64.Build.0 = Debug-Clang|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.DebugFast|ARM64.ActiveCfg = DebugFast|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.DebugFast|ARM64.Build.0 = DebugFast|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.DebugFast|x64.ActiveCfg = DebugFast|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.DebugFast|x64.Build.0 = DebugFast|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.DebugFast-Clang|ARM64.ActiveCfg = DebugFast-Clang|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.DebugFast-Clang|ARM64.Build.0 = DebugFast-Clang|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.DebugFast-Clang|x64.ActiveCfg = DebugFast-Clang|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.DebugFast-Clang|x64.Build.0 = DebugFast-Clang|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Release|ARM64.ActiveCfg = Release|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Release|ARM64.Build.0 = Release|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Release|x64.ActiveCfg = Release|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Release|x64.Build.0 = Release|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Release-Clang|ARM64.ActiveCfg = Release-Clang|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Release-Clang|ARM64.Build.0 = Release-Clang|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Release-Clang|x64.ActiveCfg = Release-Clang|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.Release-Clang|x64.Build.0 = Release-Clang|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.ReleaseLTCG|ARM64.ActiveCfg = ReleaseLTCG|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.ReleaseLTCG|ARM64.Build.0 = ReleaseLTCG|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.ReleaseLTCG|x64.ActiveCfg = ReleaseLTCG|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.ReleaseLTCG|x64.Build.0 = ReleaseLTCG|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.ReleaseLTCG-Clang|ARM64.ActiveCfg = ReleaseLTCG-Clang|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.ReleaseLTCG-Clang|ARM64.Build.0 = ReleaseLTCG-Clang|ARM64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.ReleaseLTCG-Clang|x64.ActiveCfg = ReleaseLTCG-Clang|x64 | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5}.ReleaseLTCG-Clang|x64.Build.0 = ReleaseLTCG-Clang|x64 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
|  | @ -1094,6 +1128,7 @@ Global | |||
| 		{F351C4D8-594A-4850-B77B-3C1249812CCE} = {BA490C0E-497D-4634-A21E-E65012006385} | ||||
| 		{27B8D4BB-4F01-4432-BC14-9BF6CA458EEE} = {BA490C0E-497D-4634-A21E-E65012006385} | ||||
| 		{1AD23A8A-4C20-434C-AE6B-0E07759EEB1E} = {BA490C0E-497D-4634-A21E-E65012006385} | ||||
| 		{9FD2ABCD-2DCD-4302-BE5C-DF0BA8431FA5} = {BA490C0E-497D-4634-A21E-E65012006385} | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| 		SolutionGuid = {26E40B32-7C1D-48D0-95F4-1A500E054028} | ||||
|  |  | |||
|  | @ -11,9 +11,11 @@ merge_binaries() { | |||
| " | ||||
|   pushd "$X86DIR" | ||||
|   for X86BIN in $(find . -type f \( -name '*.dylib' -o -name '*.a' -o -perm +111 \)); do | ||||
|     ARMBIN="${ARMDIR}/${X86BIN}" | ||||
|     echo "Merge $ARMBIN to $X86BIN..." | ||||
|     lipo -create "$X86BIN" "$ARMBIN" -o "$X86BIN" | ||||
|     if file "$X86DIR/$X86BIN" | grep "Mach-O " >/dev/null; then | ||||
|       ARMBIN="${ARMDIR}/${X86BIN}" | ||||
|       echo "Merge $ARMBIN to $X86BIN..." | ||||
|       lipo -create "$X86BIN" "$ARMBIN" -o "$X86BIN" | ||||
|     fi | ||||
|   done | ||||
|   popd | ||||
| } | ||||
|  | @ -30,6 +32,7 @@ SDL=SDL2-2.30.0 | |||
| QT=6.6.0 | ||||
| MOLTENVK=1.2.6 | ||||
| ZSTD=1.5.5 | ||||
| PNG=1.6.43 | ||||
| WEBP=1.3.2 | ||||
| 
 | ||||
| mkdir -p deps-build | ||||
|  | @ -44,6 +47,7 @@ cat > SHASUMS <<EOF | |||
| 36e2e41557e0fa4a1519315c0f5958a87ccb27e25c51776beb6f1239526447b0  $SDL.tar.gz | ||||
| b6a3d179aa9c41275ed0e35e502e5e3fd347dbe5117a0435a26868b231cd6246  v$MOLTENVK.tar.gz | ||||
| 9c4396cc829cfae319a6e2615202e82aad41372073482fce286fac78646d3ee4  zstd-$ZSTD.tar.gz | ||||
| 6a5ca0652392a2d7c9db2ae5b40210843c0bbc081cbd410825ab00cc59f14a6c  libpng-$PNG.tar.xz | ||||
| 2a499607df669e40258e53d0ade8035ba4ec0175244869d1025d460562aa09b4  libwebp-$WEBP.tar.gz | ||||
| 039d53312acb5897a9054bd38c9ccbdab72500b71fdccdb3f4f0844b0dd39e0e  qtbase-everywhere-src-$QT.tar.xz | ||||
| e1542cb50176e237809895c6549598c08587c63703d100be54ac2d806834e384  qtimageformats-everywhere-src-$QT.tar.xz | ||||
|  | @ -57,6 +61,7 @@ curl -L \ | |||
|   -O "https://github.com/KhronosGroup/MoltenVK/archive/refs/tags/v$MOLTENVK.tar.gz" \ | ||||
|   -O "https://github.com/facebook/zstd/releases/download/v$ZSTD/zstd-$ZSTD.tar.gz" \ | ||||
|   -O "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-$WEBP.tar.gz" \ | ||||
|   -O "https://downloads.sourceforge.net/project/libpng/libpng16/$PNG/libpng-$PNG.tar.xz" \ | ||||
|   -O "https://download.qt.io/official_releases/qt/${QT%.*}/$QT/submodules/qtbase-everywhere-src-$QT.tar.xz" \ | ||||
|   -O "https://download.qt.io/official_releases/qt/${QT%.*}/$QT/submodules/qtsvg-everywhere-src-$QT.tar.xz" \ | ||||
|   -O "https://download.qt.io/official_releases/qt/${QT%.*}/$QT/submodules/qttools-everywhere-src-$QT.tar.xz" \ | ||||
|  | @ -186,6 +191,18 @@ merge_binaries $(realpath build-dir) $(realpath build-dir-arm64) | |||
| make -C build-dir install | ||||
| cd .. | ||||
| 
 | ||||
| echo "Installing libpng..." | ||||
| rm -fr "libpng-$PNG" | ||||
| tar xf "libpng-$PNG.tar.xz" | ||||
| cd "libpng-$PNG" | ||||
| cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="$INSTALLDIR" -DCMAKE_INSTALL_PREFIX="$INSTALLDIR" -DCMAKE_OSX_ARCHITECTURES="x86_64" -DBUILD_SHARED_LIBS=ON -DPNG_TESTS=OFF -DPNG_STATIC=OFF -DPNG_SHARED=ON -DPNG_TOOLS=OFF -B build | ||||
| make -C build "-j$NPROCS" | ||||
| cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="$INSTALLDIR" -DCMAKE_INSTALL_PREFIX="$INSTALLDIR" -DCMAKE_OSX_ARCHITECTURES="arm64" -DBUILD_SHARED_LIBS=ON -DPNG_TESTS=OFF -DPNG_STATIC=OFF -DPNG_SHARED=ON -DPNG_TOOLS=OFF -DPNG_ARM_NEON=on -B build-arm64 | ||||
| make -C build-arm64 "-j$NPROCS" | ||||
| merge_binaries $(realpath build) $(realpath build-arm64) | ||||
| make -C build install | ||||
| cd .. | ||||
| 
 | ||||
| echo "Installing WebP..." | ||||
| tar xf "libwebp-$WEBP.tar.gz" | ||||
| cd "libwebp-$WEBP" | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Stenzek
						Stenzek