mirror of https://github.com/PCSX2/pcsx2.git
3rdparty: Remove unused in-tree libs
This commit is contained in:
parent
dfa5fccec9
commit
6808db1cde
|
@ -1,72 +0,0 @@
|
||||||
Libpng 1.6.17 - March 26, 2015
|
|
||||||
|
|
||||||
This is a public release of libpng, intended for use in production codes.
|
|
||||||
|
|
||||||
Files available for download:
|
|
||||||
|
|
||||||
Source files with LF line endings (for Unix/Linux) and with a
|
|
||||||
"configure" script
|
|
||||||
|
|
||||||
libpng-1.6.17.tar.xz (LZMA-compressed, recommended)
|
|
||||||
libpng-1.6.17.tar.gz
|
|
||||||
|
|
||||||
Source files with CRLF line endings (for Windows), without the
|
|
||||||
"configure" script
|
|
||||||
|
|
||||||
lpng1617.7z (LZMA-compressed, recommended)
|
|
||||||
lpng1617.zip
|
|
||||||
|
|
||||||
Other information:
|
|
||||||
|
|
||||||
libpng-1.6.17-README.txt
|
|
||||||
libpng-1.6.17-LICENSE.txt
|
|
||||||
libpng-1.6.17-*.asc (armored detached GPG signatures)
|
|
||||||
|
|
||||||
Changes since the last public release (1.6.16):
|
|
||||||
|
|
||||||
Removed duplicate PNG_SAFE_LIMITS_SUPPORTED handling from pngconf.h
|
|
||||||
Corrected the width limit calculation in png_check_IHDR().
|
|
||||||
Removed user limits from pngfix. Also pass NULL pointers to
|
|
||||||
png_read_row to skip the unnecessary row de-interlace stuff.
|
|
||||||
Added testing of png_set_packing() to pngvalid.c
|
|
||||||
Regenerated configure scripts in the *.tar distributions with libtool-2.4.4
|
|
||||||
Implement previously untested cases of libpng transforms in pngvalid.c
|
|
||||||
Fixed byte order in 2-byte filler, in png_do_read_filler().
|
|
||||||
Made the check for out-of-range values in png_set_tRNS() detect
|
|
||||||
values that are exactly 2^bit_depth, and work on 16-bit platforms.
|
|
||||||
Merged some parts of libpng-1.6.17beta01 and libpng-1.7.0beta47.
|
|
||||||
Added #ifndef __COVERITY__ where needed in png.c, pngrutil.c and
|
|
||||||
pngset.c to avoid warnings about dead code.
|
|
||||||
Do not build png_product2() when it is unused.
|
|
||||||
Display user limits in the output from pngtest.
|
|
||||||
Eliminated the PNG_SAFE_LIMITS macro and restored the 1-million-column
|
|
||||||
and 1-million-row default limits in pnglibconf.dfa, that can be reset
|
|
||||||
by the user at build time or run time. This provides a more robust
|
|
||||||
defense against DOS and as-yet undiscovered overflows.
|
|
||||||
Added PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED macro, on by default.
|
|
||||||
Allow user to call png_get_IHDR() with NULL arguments (Reuben Hawkins).
|
|
||||||
Rebuilt configure scripts with automake-1.15 and libtool-2.4.6
|
|
||||||
Moved png_set_filter() prototype into a PNG_WRITE_SUPPORTED block
|
|
||||||
of png.h.
|
|
||||||
Avoid runtime checks when converting integer to png_byte with
|
|
||||||
Visual Studio (Sergey Kosarevsky)
|
|
||||||
Removed some comments that the configure script did not handle
|
|
||||||
properly from scripts/pnglibconf.dfa and pnglibconf.h.prebuilt.
|
|
||||||
Free the unknown_chunks structure even when it contains no data.
|
|
||||||
Updated CMakeLists.txt to add OSX framework, change YES/NO to ON/OFF
|
|
||||||
for consistency, and remove some useless tests (Alexey Petruchik).
|
|
||||||
Remove pnglibconf.h, pnglibconf.c, pnglibconf.pre, pnglibconf.dfn,
|
|
||||||
and pnglibconf.out instead of pnglibconf.* in "make clean" (Cosmin).
|
|
||||||
Fixed simplified 8-bit-linear to sRGB alpha. The calculated alpha
|
|
||||||
value was wrong. It's not clear if this affected the final stored
|
|
||||||
value; in the obvious code path the upper and lower 8-bits of the
|
|
||||||
alpha value were identical and the alpha was truncated to 8-bits
|
|
||||||
rather than dividing by 257 (John Bowler).
|
|
||||||
|
|
||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
|
||||||
(subscription required; visit
|
|
||||||
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
|
|
||||||
to subscribe)
|
|
||||||
or to glennrp at users.sourceforge.net
|
|
||||||
|
|
||||||
Glenn R-P
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,25 +0,0 @@
|
||||||
add_library(png
|
|
||||||
png.c
|
|
||||||
pngerror.c
|
|
||||||
pngget.c
|
|
||||||
pngmem.c
|
|
||||||
pngpread.c
|
|
||||||
pngread.c
|
|
||||||
pngrio.c
|
|
||||||
pngrtran.c
|
|
||||||
pngrutil.c
|
|
||||||
pngset.c
|
|
||||||
pngtrans.c
|
|
||||||
pngwio.c
|
|
||||||
pngwrite.c
|
|
||||||
pngwtran.c
|
|
||||||
pngwutil.c
|
|
||||||
intel/filter_sse2_intrinsics.c
|
|
||||||
intel/intel_init.c
|
|
||||||
)
|
|
||||||
|
|
||||||
target_compile_definitions(png PRIVATE "PNG_INTEL_SSE")
|
|
||||||
target_link_libraries(png PRIVATE ZLIB::ZLIB)
|
|
||||||
target_include_directories(png PUBLIC .)
|
|
||||||
add_library(PNG::PNG ALIAS png)
|
|
||||||
disable_compiler_warnings_for_target(png)
|
|
|
@ -1,139 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
|
@ -1,253 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
|
@ -1,402 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
|
@ -1,151 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
|
@ -1,391 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
|
@ -1,52 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,66 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(SolutionDir)common\vsprops\BaseProjectConfig.props" />
|
|
||||||
<Import Project="$(SolutionDir)common\vsprops\WinSDK.props" />
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{D6973076-9317-4EF2-A0B8-B7A18AC0713E}</ProjectGuid>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<PlatformToolset Condition="!$(Configuration.Contains(Clang))">$(DefaultPlatformToolset)</PlatformToolset>
|
|
||||||
<PlatformToolset Condition="$(Configuration.Contains(Clang))">ClangCL</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
<WholeProgramOptimization Condition="$(Configuration.Contains(Release))">true</WholeProgramOptimization>
|
|
||||||
<UseDebugLibraries Condition="$(Configuration.Contains(Debug))">true</UseDebugLibraries>
|
|
||||||
<UseDebugLibraries Condition="!$(Configuration.Contains(Debug))">false</UseDebugLibraries>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings" />
|
|
||||||
<ImportGroup Label="PropertySheets">
|
|
||||||
<Import Project="..\3rdparty.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Debug))" Project="..\..\common\vsprops\CodeGen_Debug.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Devel))" Project="..\..\common\vsprops\CodeGen_Devel.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Release))" Project="..\..\common\vsprops\CodeGen_Release.props" />
|
|
||||||
<Import Condition="!$(Configuration.Contains(Release))" Project="..\..\common\vsprops\IncrementalLinking.props" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup>
|
|
||||||
<ClCompile>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
|
||||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
|
||||||
<PreprocessorDefinitions Condition="'$(Platform)'=='x64'">PNG_INTEL_SSE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)3rdparty\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="intel\filter_sse2_intrinsics.c" />
|
|
||||||
<ClCompile Include="intel\intel_init.c" />
|
|
||||||
<ClCompile Include="png.c" />
|
|
||||||
<ClCompile Include="pngerror.c" />
|
|
||||||
<ClCompile Include="pngget.c" />
|
|
||||||
<ClCompile Include="pngmem.c" />
|
|
||||||
<ClCompile Include="pngpread.c" />
|
|
||||||
<ClCompile Include="pngread.c" />
|
|
||||||
<ClCompile Include="pngrio.c" />
|
|
||||||
<ClCompile Include="pngrtran.c" />
|
|
||||||
<ClCompile Include="pngrutil.c" />
|
|
||||||
<ClCompile Include="pngset.c" />
|
|
||||||
<ClCompile Include="pngtrans.c" />
|
|
||||||
<ClCompile Include="pngwio.c" />
|
|
||||||
<ClCompile Include="pngwrite.c" />
|
|
||||||
<ClCompile Include="pngwtran.c" />
|
|
||||||
<ClCompile Include="pngwutil.c" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\zlib\zlib.vcxproj">
|
|
||||||
<Project>{2f6c0388-20cb-4242-9f6c-a6ebb6a83f47}</Project>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets" />
|
|
||||||
</Project>
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,623 +0,0 @@
|
||||||
|
|
||||||
/* pngconf.h - machine-configurable file for libpng
|
|
||||||
*
|
|
||||||
* libpng version 1.6.40
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018-2022 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 */
|
|
|
@ -1,153 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
|
@ -1,963 +0,0 @@
|
||||||
|
|
||||||
/* pngerror.c - stub functions for i/o and memory allocation
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018 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];
|
|
||||||
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];
|
|
||||||
|
|
||||||
/* 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_in, int (*function)(png_voidp), png_voidp arg)
|
|
||||||
{
|
|
||||||
volatile png_imagep image = image_in;
|
|
||||||
volatile int result;
|
|
||||||
volatile png_voidp saved_error_buf;
|
|
||||||
jmp_buf safe_jmpbuf;
|
|
||||||
|
|
||||||
/* Safely execute function(arg) with png_error returning to this function. */
|
|
||||||
saved_error_buf = image->opaque->error_buf;
|
|
||||||
result = setjmp(safe_jmpbuf) == 0;
|
|
||||||
|
|
||||||
if (result != 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
image->opaque->error_buf = safe_jmpbuf;
|
|
||||||
result = function(arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
image->opaque->error_buf = saved_error_buf;
|
|
||||||
|
|
||||||
/* And do the cleanup prior to any failure return. */
|
|
||||||
if (result == 0)
|
|
||||||
png_image_free(image);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
#endif /* SIMPLIFIED READ || SIMPLIFIED_WRITE */
|
|
||||||
#endif /* READ || WRITE */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,267 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
|
@ -1,219 +0,0 @@
|
||||||
/* pnglibconf.h - library build configuration */
|
|
||||||
|
|
||||||
/* libpng version 1.6.40 */
|
|
||||||
|
|
||||||
/* Copyright (c) 2018-2023 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
|
|
||||||
#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
|
|
||||||
#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 */
|
|
|
@ -1,284 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,120 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,479 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
|
@ -1,864 +0,0 @@
|
||||||
|
|
||||||
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018 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 */
|
|
||||||
|
|
||||||
/* 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)
|
|
||||||
{
|
|
||||||
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 - 1;
|
|
||||||
|
|
||||||
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 */
|
|
|
@ -1,168 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,575 +0,0 @@
|
||||||
|
|
||||||
/* 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 */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,82 +0,0 @@
|
||||||
# Intentionally only includes the decoder, not the encoder, to save on binary size.
|
|
||||||
|
|
||||||
add_library(pcsx2-libwebp
|
|
||||||
libwebp/src/dec/alpha_dec.c
|
|
||||||
libwebp/src/dec/alphai_dec.h
|
|
||||||
libwebp/src/dec/buffer_dec.c
|
|
||||||
libwebp/src/dec/common_dec.h
|
|
||||||
libwebp/src/dec/frame_dec.c
|
|
||||||
libwebp/src/dec/idec_dec.c
|
|
||||||
libwebp/src/dec/io_dec.c
|
|
||||||
libwebp/src/dec/quant_dec.c
|
|
||||||
libwebp/src/dec/tree_dec.c
|
|
||||||
libwebp/src/dec/vp8_dec.c
|
|
||||||
libwebp/src/dec/vp8_dec.h
|
|
||||||
libwebp/src/dec/vp8i_dec.h
|
|
||||||
libwebp/src/dec/vp8l_dec.c
|
|
||||||
libwebp/src/dec/vp8li_dec.h
|
|
||||||
libwebp/src/dec/webp_dec.c
|
|
||||||
libwebp/src/dec/webpi_dec.h
|
|
||||||
libwebp/src/dsp/alpha_processing.c
|
|
||||||
libwebp/src/dsp/alpha_processing_sse2.c
|
|
||||||
libwebp/src/dsp/alpha_processing_sse41.c
|
|
||||||
libwebp/src/dsp/common_sse2.h
|
|
||||||
libwebp/src/dsp/common_sse41.h
|
|
||||||
libwebp/src/dsp/cpu.c
|
|
||||||
libwebp/src/dsp/cpu.h
|
|
||||||
libwebp/src/dsp/dec.c
|
|
||||||
libwebp/src/dsp/dec_clip_tables.c
|
|
||||||
libwebp/src/dsp/dec_sse2.c
|
|
||||||
libwebp/src/dsp/dec_sse41.c
|
|
||||||
libwebp/src/dsp/dsp.h
|
|
||||||
libwebp/src/dsp/filters.c
|
|
||||||
libwebp/src/dsp/filters_sse2.c
|
|
||||||
libwebp/src/dsp/lossless.c
|
|
||||||
libwebp/src/dsp/lossless.h
|
|
||||||
libwebp/src/dsp/lossless_common.h
|
|
||||||
libwebp/src/dsp/lossless_sse2.c
|
|
||||||
libwebp/src/dsp/lossless_sse41.c
|
|
||||||
libwebp/src/dsp/rescaler.c
|
|
||||||
libwebp/src/dsp/rescaler_sse2.c
|
|
||||||
libwebp/src/dsp/upsampling.c
|
|
||||||
libwebp/src/dsp/upsampling_sse2.c
|
|
||||||
libwebp/src/dsp/upsampling_sse41.c
|
|
||||||
libwebp/src/dsp/yuv.c
|
|
||||||
libwebp/src/dsp/yuv.h
|
|
||||||
libwebp/src/dsp/yuv_sse2.c
|
|
||||||
libwebp/src/dsp/yuv_sse41.c
|
|
||||||
libwebp/src/utils/bit_reader_utils.c
|
|
||||||
libwebp/src/utils/bit_reader_utils.h
|
|
||||||
libwebp/src/utils/color_cache_utils.c
|
|
||||||
libwebp/src/utils/color_cache_utils.h
|
|
||||||
libwebp/src/utils/huffman_utils.c
|
|
||||||
libwebp/src/utils/huffman_utils.h
|
|
||||||
libwebp/src/utils/quant_levels_dec_utils.c
|
|
||||||
libwebp/src/utils/quant_levels_dec_utils.h
|
|
||||||
libwebp/src/utils/random_utils.c
|
|
||||||
libwebp/src/utils/random_utils.h
|
|
||||||
libwebp/src/utils/rescaler_utils.c
|
|
||||||
libwebp/src/utils/rescaler_utils.h
|
|
||||||
libwebp/src/utils/thread_utils.c
|
|
||||||
libwebp/src/utils/thread_utils.h
|
|
||||||
libwebp/src/utils/utils.c
|
|
||||||
libwebp/src/utils/utils.h
|
|
||||||
libwebp/src/webp/decode.h
|
|
||||||
libwebp/src/webp/demux.h
|
|
||||||
libwebp/src/webp/encode.h
|
|
||||||
libwebp/src/webp/format_constants.h
|
|
||||||
libwebp/src/webp/mux.h
|
|
||||||
libwebp/src/webp/mux_types.h
|
|
||||||
libwebp/src/webp/types.h
|
|
||||||
)
|
|
||||||
|
|
||||||
if(NOT MSVC OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
||||||
# clang-cl won't build SSE4 functions without -msse4.1.
|
|
||||||
target_compile_options(pcsx2-libwebp PRIVATE "-msse4.1")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_include_directories(pcsx2-libwebp PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/libwebp")
|
|
||||||
target_include_directories(pcsx2-libwebp INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/libwebp/src")
|
|
||||||
add_library(WebP::libwebp ALIAS pcsx2-libwebp)
|
|
||||||
|
|
||||||
disable_compiler_warnings_for_target(pcsx2-libwebp)
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit ca332209cb5567c9b249c86788cb2dbf8847e760
|
|
|
@ -1,113 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(SolutionDir)common\vsprops\BaseProjectConfig.props" />
|
|
||||||
<Import Project="$(SolutionDir)common\vsprops\WinSDK.props" />
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{522DAF2A-1F24-4742-B2C4-A956411F6AB2}</ProjectGuid>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<PlatformToolset Condition="!$(Configuration.Contains(Clang))">$(DefaultPlatformToolset)</PlatformToolset>
|
|
||||||
<PlatformToolset Condition="$(Configuration.Contains(Clang))">ClangCL</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
<WholeProgramOptimization Condition="$(Configuration.Contains(Release))">true</WholeProgramOptimization>
|
|
||||||
<UseDebugLibraries Condition="$(Configuration.Contains(Debug))">true</UseDebugLibraries>
|
|
||||||
<UseDebugLibraries Condition="!$(Configuration.Contains(Debug))">false</UseDebugLibraries>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings" />
|
|
||||||
<ImportGroup Label="PropertySheets">
|
|
||||||
<Import Project="$(SolutionDir)3rdparty\DefaultProjectRootDir.props" />
|
|
||||||
<Import Project="$(SolutionDir)3rdparty\3rdparty.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Debug))" Project="$(SolutionDir)common\vsprops\CodeGen_Debug.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Devel))" Project="$(SolutionDir)common\vsprops\CodeGen_Devel.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Release))" Project="$(SolutionDir)common\vsprops\CodeGen_Release.props" />
|
|
||||||
<Import Condition="!$(Configuration.Contains(Release))" Project="$(SolutionDir)common\vsprops\IncrementalLinking.props" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup>
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
|
||||||
<PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>$(ProjectDir)\libwebp;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<AdditionalOptions Condition="$(Configuration.Contains(Clang)) And '$(Platform)'=='x64'">%(AdditionalOptions) -msse4.1</AdditionalOptions>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="libwebp\src\dec\alpha_dec.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dec\buffer_dec.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dec\frame_dec.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dec\idec_dec.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dec\io_dec.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dec\quant_dec.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dec\tree_dec.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dec\vp8l_dec.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dec\vp8_dec.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dec\webp_dec.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\alpha_processing.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\alpha_processing_sse2.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\alpha_processing_sse41.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\cpu.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\dec.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\dec_clip_tables.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\dec_sse2.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\dec_sse41.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\filters.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\filters_sse2.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\lossless.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\lossless_sse2.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\lossless_sse41.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\rescaler.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\rescaler_sse2.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\upsampling.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\upsampling_sse2.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\upsampling_sse41.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\yuv.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\yuv_sse2.c" />
|
|
||||||
<ClCompile Include="libwebp\src\dsp\yuv_sse41.c" />
|
|
||||||
<ClCompile Include="libwebp\src\utils\bit_reader_utils.c" />
|
|
||||||
<ClCompile Include="libwebp\src\utils\color_cache_utils.c" />
|
|
||||||
<ClCompile Include="libwebp\src\utils\huffman_utils.c" />
|
|
||||||
<ClCompile Include="libwebp\src\utils\quant_levels_dec_utils.c" />
|
|
||||||
<ClCompile Include="libwebp\src\utils\random_utils.c" />
|
|
||||||
<ClCompile Include="libwebp\src\utils\rescaler_utils.c" />
|
|
||||||
<ClCompile Include="libwebp\src\utils\thread_utils.c" />
|
|
||||||
<ClCompile Include="libwebp\src\utils\utils.c" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="libwebp\src\dec\alphai_dec.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dec\common_dec.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dec\vp8i_dec.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dec\vp8li_dec.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dec\vp8_dec.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dec\webpi_dec.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dsp\common_sse2.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dsp\common_sse41.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dsp\cpu.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dsp\dsp.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dsp\lossless.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dsp\lossless_common.h" />
|
|
||||||
<ClInclude Include="libwebp\src\dsp\yuv.h" />
|
|
||||||
<ClInclude Include="libwebp\src\utils\bit_reader_utils.h" />
|
|
||||||
<ClInclude Include="libwebp\src\utils\color_cache_utils.h" />
|
|
||||||
<ClInclude Include="libwebp\src\utils\huffman_utils.h" />
|
|
||||||
<ClInclude Include="libwebp\src\utils\quant_levels_dec_utils.h" />
|
|
||||||
<ClInclude Include="libwebp\src\utils\random_utils.h" />
|
|
||||||
<ClInclude Include="libwebp\src\utils\rescaler_utils.h" />
|
|
||||||
<ClInclude Include="libwebp\src\utils\thread_utils.h" />
|
|
||||||
<ClInclude Include="libwebp\src\utils\utils.h" />
|
|
||||||
<ClInclude Include="libwebp\src\webp\decode.h" />
|
|
||||||
<ClInclude Include="libwebp\src\webp\demux.h" />
|
|
||||||
<ClInclude Include="libwebp\src\webp\encode.h" />
|
|
||||||
<ClInclude Include="libwebp\src\webp\format_constants.h" />
|
|
||||||
<ClInclude Include="libwebp\src\webp\mux.h" />
|
|
||||||
<ClInclude Include="libwebp\src\webp\mux_types.h" />
|
|
||||||
<ClInclude Include="libwebp\src\webp\types.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets" />
|
|
||||||
</Project>
|
|
|
@ -1,222 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="dec">
|
|
||||||
<UniqueIdentifier>{76c0f4d4-ee4a-4d7d-8945-35d0e8d14c31}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="webp">
|
|
||||||
<UniqueIdentifier>{9b72c794-2ba2-4aab-af7d-6bddd88beedd}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="utils">
|
|
||||||
<UniqueIdentifier>{67893497-bdc4-4e15-bb1b-16608bc150e7}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="dsp">
|
|
||||||
<UniqueIdentifier>{98285b2d-d9ad-4642-bd53-59aeb8c9cb19}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="libwebp\src\dec\frame_dec.c">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dec\idec_dec.c">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dec\io_dec.c">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dec\quant_dec.c">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dec\tree_dec.c">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dec\vp8_dec.c">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dec\vp8l_dec.c">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dec\webp_dec.c">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dec\alpha_dec.c">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dec\buffer_dec.c">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\utils\utils.c">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\alpha_processing.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\alpha_processing_sse2.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\alpha_processing_sse41.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\utils\bit_reader_utils.c">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\cpu.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\rescaler_sse2.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\rescaler.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\utils\rescaler_utils.c">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\utils\thread_utils.c">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\yuv_sse2.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\yuv_sse41.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\yuv.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\utils\color_cache_utils.c">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\utils\huffman_utils.c">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\dec_sse41.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\dec.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\dec_sse2.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\lossless_sse41.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\lossless.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\lossless_sse2.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\filters.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\filters_sse2.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\upsampling_sse2.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\upsampling_sse41.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\upsampling.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\utils\random_utils.c">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\utils\quant_levels_dec_utils.c">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="libwebp\src\dsp\dec_clip_tables.c">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="libwebp\src\dec\vp8_dec.h">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dec\vp8i_dec.h">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dec\vp8li_dec.h">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dec\webpi_dec.h">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dec\alphai_dec.h">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dec\common_dec.h">
|
|
||||||
<Filter>dec</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\webp\format_constants.h">
|
|
||||||
<Filter>webp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\webp\mux.h">
|
|
||||||
<Filter>webp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\webp\mux_types.h">
|
|
||||||
<Filter>webp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\webp\types.h">
|
|
||||||
<Filter>webp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\webp\decode.h">
|
|
||||||
<Filter>webp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\webp\demux.h">
|
|
||||||
<Filter>webp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\webp\encode.h">
|
|
||||||
<Filter>webp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\utils\utils.h">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dsp\common_sse41.h">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dsp\common_sse2.h">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\utils\bit_reader_utils.h">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dsp\cpu.h">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\utils\rescaler_utils.h">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\utils\thread_utils.h">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dsp\yuv.h">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\utils\color_cache_utils.h">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\utils\huffman_utils.h">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dsp\dsp.h">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dsp\lossless.h">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\dsp\lossless_common.h">
|
|
||||||
<Filter>dsp</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\utils\random_utils.h">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="libwebp\src\utils\quant_levels_dec_utils.h">
|
|
||||||
<Filter>utils</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,13 +0,0 @@
|
||||||
add_library(pcsx2-lz4
|
|
||||||
lz4/lib/lz4.c
|
|
||||||
lz4/lib/lz4.h
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(pcsx2-lz4 PUBLIC lz4/lib)
|
|
||||||
target_compile_definitions(pcsx2-lz4 PUBLIC
|
|
||||||
LZ4LIB_VISIBILITY=
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(LZ4::LZ4 ALIAS pcsx2-lz4)
|
|
||||||
|
|
||||||
disable_compiler_warnings_for_target(pcsx2-lz4)
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit b8fd2d15309dd4e605070bd4486e26b6ef814e29
|
|
|
@ -1,46 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(SolutionDir)common\vsprops\BaseProjectConfig.props" />
|
|
||||||
<Import Project="$(SolutionDir)common\vsprops\WinSDK.props" />
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{39098635-446A-4FC3-9B1C-8609D94598A8}</ProjectGuid>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<PlatformToolset Condition="!$(Configuration.Contains(Clang))">$(DefaultPlatformToolset)</PlatformToolset>
|
|
||||||
<PlatformToolset Condition="$(Configuration.Contains(Clang))">ClangCL</PlatformToolset>
|
|
||||||
<WholeProgramOptimization Condition="$(Configuration.Contains(Release))">true</WholeProgramOptimization>
|
|
||||||
<UseDebugLibraries Condition="$(Configuration.Contains(Debug))">true</UseDebugLibraries>
|
|
||||||
<UseDebugLibraries Condition="!$(Configuration.Contains(Debug))">false</UseDebugLibraries>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings" />
|
|
||||||
<ImportGroup Label="PropertySheets">
|
|
||||||
<Import Project="..\DefaultProjectRootDir.props" />
|
|
||||||
<Import Project="..\3rdparty.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Debug))" Project="..\..\common\vsprops\CodeGen_Debug.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Devel))" Project="..\..\common\vsprops\CodeGen_Devel.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Release))" Project="..\..\common\vsprops\CodeGen_Release.props" />
|
|
||||||
<Import Condition="!$(Configuration.Contains(Release))" Project="..\..\common\vsprops\IncrementalLinking.props" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup>
|
|
||||||
<ClCompile>
|
|
||||||
<PreprocessorDefinitions>LZ4LIB_VISIBILITY=;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(ProjectDir)\lz4\lib</AdditionalIncludeDirectories>
|
|
||||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="lz4\lib\lz4.c" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="lz4\lib\lz4.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets" />
|
|
||||||
</Project>
|
|
|
@ -1,33 +0,0 @@
|
||||||
add_library(pcsx2-zlib
|
|
||||||
adler32.c
|
|
||||||
compress.c
|
|
||||||
crc32.c
|
|
||||||
deflate.c
|
|
||||||
gzclose.c
|
|
||||||
gzlib.c
|
|
||||||
gzread.c
|
|
||||||
gzwrite.c
|
|
||||||
infback.c
|
|
||||||
inffast.c
|
|
||||||
inflate.c
|
|
||||||
inftrees.c
|
|
||||||
trees.c
|
|
||||||
uncompr.c
|
|
||||||
zutil.c
|
|
||||||
crc32.h
|
|
||||||
deflate.h
|
|
||||||
inffast.h
|
|
||||||
inffixed.h
|
|
||||||
inflate.h
|
|
||||||
inftrees.h
|
|
||||||
trees.h
|
|
||||||
zconf.h
|
|
||||||
zlib.h
|
|
||||||
zutil.h
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(pcsx2-zlib PUBLIC .)
|
|
||||||
|
|
||||||
add_library(ZLIB::ZLIB ALIAS pcsx2-zlib)
|
|
||||||
|
|
||||||
disable_compiler_warnings_for_target(pcsx2-zlib)
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,368 +0,0 @@
|
||||||
|
|
||||||
Frequently Asked Questions about zlib
|
|
||||||
|
|
||||||
|
|
||||||
If your question is not there, please check the zlib home page
|
|
||||||
http://zlib.net/ which may have more recent information.
|
|
||||||
The latest zlib FAQ is at http://zlib.net/zlib_faq.html
|
|
||||||
|
|
||||||
|
|
||||||
1. Is zlib Y2K-compliant?
|
|
||||||
|
|
||||||
Yes. zlib doesn't handle dates.
|
|
||||||
|
|
||||||
2. Where can I get a Windows DLL version?
|
|
||||||
|
|
||||||
The zlib sources can be compiled without change to produce a DLL. See the
|
|
||||||
file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the
|
|
||||||
precompiled DLL are found in the zlib web site at http://zlib.net/ .
|
|
||||||
|
|
||||||
3. Where can I get a Visual Basic interface to zlib?
|
|
||||||
|
|
||||||
See
|
|
||||||
* http://marknelson.us/1997/01/01/zlib-engine/
|
|
||||||
* win32/DLL_FAQ.txt in the zlib distribution
|
|
||||||
|
|
||||||
4. compress() returns Z_BUF_ERROR.
|
|
||||||
|
|
||||||
Make sure that before the call of compress(), the length of the compressed
|
|
||||||
buffer is equal to the available size of the compressed buffer and not
|
|
||||||
zero. For Visual Basic, check that this parameter is passed by reference
|
|
||||||
("as any"), not by value ("as long").
|
|
||||||
|
|
||||||
5. deflate() or inflate() returns Z_BUF_ERROR.
|
|
||||||
|
|
||||||
Before making the call, make sure that avail_in and avail_out are not zero.
|
|
||||||
When setting the parameter flush equal to Z_FINISH, also make sure that
|
|
||||||
avail_out is big enough to allow processing all pending input. Note that a
|
|
||||||
Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be
|
|
||||||
made with more input or output space. A Z_BUF_ERROR may in fact be
|
|
||||||
unavoidable depending on how the functions are used, since it is not
|
|
||||||
possible to tell whether or not there is more output pending when
|
|
||||||
strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a
|
|
||||||
heavily annotated example.
|
|
||||||
|
|
||||||
6. Where's the zlib documentation (man pages, etc.)?
|
|
||||||
|
|
||||||
It's in zlib.h . Examples of zlib usage are in the files test/example.c
|
|
||||||
and test/minigzip.c, with more in examples/ .
|
|
||||||
|
|
||||||
7. Why don't you use GNU autoconf or libtool or ...?
|
|
||||||
|
|
||||||
Because we would like to keep zlib as a very small and simple package.
|
|
||||||
zlib is rather portable and doesn't need much configuration.
|
|
||||||
|
|
||||||
8. I found a bug in zlib.
|
|
||||||
|
|
||||||
Most of the time, such problems are due to an incorrect usage of zlib.
|
|
||||||
Please try to reproduce the problem with a small program and send the
|
|
||||||
corresponding source to us at zlib@gzip.org . Do not send multi-megabyte
|
|
||||||
data files without prior agreement.
|
|
||||||
|
|
||||||
9. Why do I get "undefined reference to gzputc"?
|
|
||||||
|
|
||||||
If "make test" produces something like
|
|
||||||
|
|
||||||
example.o(.text+0x154): undefined reference to `gzputc'
|
|
||||||
|
|
||||||
check that you don't have old files libz.* in /usr/lib, /usr/local/lib or
|
|
||||||
/usr/X11R6/lib. Remove any old versions, then do "make install".
|
|
||||||
|
|
||||||
10. I need a Delphi interface to zlib.
|
|
||||||
|
|
||||||
See the contrib/delphi directory in the zlib distribution.
|
|
||||||
|
|
||||||
11. Can zlib handle .zip archives?
|
|
||||||
|
|
||||||
Not by itself, no. See the directory contrib/minizip in the zlib
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
12. Can zlib handle .Z files?
|
|
||||||
|
|
||||||
No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
|
|
||||||
the code of uncompress on your own.
|
|
||||||
|
|
||||||
13. How can I make a Unix shared library?
|
|
||||||
|
|
||||||
By default a shared (and a static) library is built for Unix. So:
|
|
||||||
|
|
||||||
make distclean
|
|
||||||
./configure
|
|
||||||
make
|
|
||||||
|
|
||||||
14. How do I install a shared zlib library on Unix?
|
|
||||||
|
|
||||||
After the above, then:
|
|
||||||
|
|
||||||
make install
|
|
||||||
|
|
||||||
However, many flavors of Unix come with a shared zlib already installed.
|
|
||||||
Before going to the trouble of compiling a shared version of zlib and
|
|
||||||
trying to install it, you may want to check if it's already there! If you
|
|
||||||
can #include <zlib.h>, it's there. The -lz option will probably link to
|
|
||||||
it. You can check the version at the top of zlib.h or with the
|
|
||||||
ZLIB_VERSION symbol defined in zlib.h .
|
|
||||||
|
|
||||||
15. I have a question about OttoPDF.
|
|
||||||
|
|
||||||
We are not the authors of OttoPDF. The real author is on the OttoPDF web
|
|
||||||
site: Joel Hainley, jhainley@myndkryme.com.
|
|
||||||
|
|
||||||
16. Can zlib decode Flate data in an Adobe PDF file?
|
|
||||||
|
|
||||||
Yes. See http://www.pdflib.com/ . To modify PDF forms, see
|
|
||||||
http://sourceforge.net/projects/acroformtool/ .
|
|
||||||
|
|
||||||
17. Why am I getting this "register_frame_info not found" error on Solaris?
|
|
||||||
|
|
||||||
After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib
|
|
||||||
generates an error such as:
|
|
||||||
|
|
||||||
ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so:
|
|
||||||
symbol __register_frame_info: referenced symbol not found
|
|
||||||
|
|
||||||
The symbol __register_frame_info is not part of zlib, it is generated by
|
|
||||||
the C compiler (cc or gcc). You must recompile applications using zlib
|
|
||||||
which have this problem. This problem is specific to Solaris. See
|
|
||||||
http://www.sunfreeware.com for Solaris versions of zlib and applications
|
|
||||||
using zlib.
|
|
||||||
|
|
||||||
18. Why does gzip give an error on a file I make with compress/deflate?
|
|
||||||
|
|
||||||
The compress and deflate functions produce data in the zlib format, which
|
|
||||||
is different and incompatible with the gzip format. The gz* functions in
|
|
||||||
zlib on the other hand use the gzip format. Both the zlib and gzip formats
|
|
||||||
use the same compressed data format internally, but have different headers
|
|
||||||
and trailers around the compressed data.
|
|
||||||
|
|
||||||
19. Ok, so why are there two different formats?
|
|
||||||
|
|
||||||
The gzip format was designed to retain the directory information about a
|
|
||||||
single file, such as the name and last modification date. The zlib format
|
|
||||||
on the other hand was designed for in-memory and communication channel
|
|
||||||
applications, and has a much more compact header and trailer and uses a
|
|
||||||
faster integrity check than gzip.
|
|
||||||
|
|
||||||
20. Well that's nice, but how do I make a gzip file in memory?
|
|
||||||
|
|
||||||
You can request that deflate write the gzip format instead of the zlib
|
|
||||||
format using deflateInit2(). You can also request that inflate decode the
|
|
||||||
gzip format using inflateInit2(). Read zlib.h for more details.
|
|
||||||
|
|
||||||
21. Is zlib thread-safe?
|
|
||||||
|
|
||||||
Yes. However any library routines that zlib uses and any application-
|
|
||||||
provided memory allocation routines must also be thread-safe. zlib's gz*
|
|
||||||
functions use stdio library routines, and most of zlib's functions use the
|
|
||||||
library memory allocation routines by default. zlib's *Init* functions
|
|
||||||
allow for the application to provide custom memory allocation routines.
|
|
||||||
|
|
||||||
Of course, you should only operate on any given zlib or gzip stream from a
|
|
||||||
single thread at a time.
|
|
||||||
|
|
||||||
22. Can I use zlib in my commercial application?
|
|
||||||
|
|
||||||
Yes. Please read the license in zlib.h.
|
|
||||||
|
|
||||||
23. Is zlib under the GNU license?
|
|
||||||
|
|
||||||
No. Please read the license in zlib.h.
|
|
||||||
|
|
||||||
24. The license says that altered source versions must be "plainly marked". So
|
|
||||||
what exactly do I need to do to meet that requirement?
|
|
||||||
|
|
||||||
You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In
|
|
||||||
particular, the final version number needs to be changed to "f", and an
|
|
||||||
identification string should be appended to ZLIB_VERSION. Version numbers
|
|
||||||
x.x.x.f are reserved for modifications to zlib by others than the zlib
|
|
||||||
maintainers. For example, if the version of the base zlib you are altering
|
|
||||||
is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and
|
|
||||||
ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also
|
|
||||||
update the version strings in deflate.c and inftrees.c.
|
|
||||||
|
|
||||||
For altered source distributions, you should also note the origin and
|
|
||||||
nature of the changes in zlib.h, as well as in ChangeLog and README, along
|
|
||||||
with the dates of the alterations. The origin should include at least your
|
|
||||||
name (or your company's name), and an email address to contact for help or
|
|
||||||
issues with the library.
|
|
||||||
|
|
||||||
Note that distributing a compiled zlib library along with zlib.h and
|
|
||||||
zconf.h is also a source distribution, and so you should change
|
|
||||||
ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes
|
|
||||||
in zlib.h as you would for a full source distribution.
|
|
||||||
|
|
||||||
25. Will zlib work on a big-endian or little-endian architecture, and can I
|
|
||||||
exchange compressed data between them?
|
|
||||||
|
|
||||||
Yes and yes.
|
|
||||||
|
|
||||||
26. Will zlib work on a 64-bit machine?
|
|
||||||
|
|
||||||
Yes. It has been tested on 64-bit machines, and has no dependence on any
|
|
||||||
data types being limited to 32-bits in length. If you have any
|
|
||||||
difficulties, please provide a complete problem report to zlib@gzip.org
|
|
||||||
|
|
||||||
27. Will zlib decompress data from the PKWare Data Compression Library?
|
|
||||||
|
|
||||||
No. The PKWare DCL uses a completely different compressed data format than
|
|
||||||
does PKZIP and zlib. However, you can look in zlib's contrib/blast
|
|
||||||
directory for a possible solution to your problem.
|
|
||||||
|
|
||||||
28. Can I access data randomly in a compressed stream?
|
|
||||||
|
|
||||||
No, not without some preparation. If when compressing you periodically use
|
|
||||||
Z_FULL_FLUSH, carefully write all the pending data at those points, and
|
|
||||||
keep an index of those locations, then you can start decompression at those
|
|
||||||
points. You have to be careful to not use Z_FULL_FLUSH too often, since it
|
|
||||||
can significantly degrade compression. Alternatively, you can scan a
|
|
||||||
deflate stream once to generate an index, and then use that index for
|
|
||||||
random access. See examples/zran.c .
|
|
||||||
|
|
||||||
29. Does zlib work on MVS, OS/390, CICS, etc.?
|
|
||||||
|
|
||||||
It has in the past, but we have not heard of any recent evidence. There
|
|
||||||
were working ports of zlib 1.1.4 to MVS, but those links no longer work.
|
|
||||||
If you know of recent, successful applications of zlib on these operating
|
|
||||||
systems, please let us know. Thanks.
|
|
||||||
|
|
||||||
30. Is there some simpler, easier to read version of inflate I can look at to
|
|
||||||
understand the deflate format?
|
|
||||||
|
|
||||||
First off, you should read RFC 1951. Second, yes. Look in zlib's
|
|
||||||
contrib/puff directory.
|
|
||||||
|
|
||||||
31. Does zlib infringe on any patents?
|
|
||||||
|
|
||||||
As far as we know, no. In fact, that was originally the whole point behind
|
|
||||||
zlib. Look here for some more information:
|
|
||||||
|
|
||||||
http://www.gzip.org/#faq11
|
|
||||||
|
|
||||||
32. Can zlib work with greater than 4 GB of data?
|
|
||||||
|
|
||||||
Yes. inflate() and deflate() will process any amount of data correctly.
|
|
||||||
Each call of inflate() or deflate() is limited to input and output chunks
|
|
||||||
of the maximum value that can be stored in the compiler's "unsigned int"
|
|
||||||
type, but there is no limit to the number of chunks. Note however that the
|
|
||||||
strm.total_in and strm_total_out counters may be limited to 4 GB. These
|
|
||||||
counters are provided as a convenience and are not used internally by
|
|
||||||
inflate() or deflate(). The application can easily set up its own counters
|
|
||||||
updated after each call of inflate() or deflate() to count beyond 4 GB.
|
|
||||||
compress() and uncompress() may be limited to 4 GB, since they operate in a
|
|
||||||
single call. gzseek() and gztell() may be limited to 4 GB depending on how
|
|
||||||
zlib is compiled. See the zlibCompileFlags() function in zlib.h.
|
|
||||||
|
|
||||||
The word "may" appears several times above since there is a 4 GB limit only
|
|
||||||
if the compiler's "long" type is 32 bits. If the compiler's "long" type is
|
|
||||||
64 bits, then the limit is 16 exabytes.
|
|
||||||
|
|
||||||
33. Does zlib have any security vulnerabilities?
|
|
||||||
|
|
||||||
The only one that we are aware of is potentially in gzprintf(). If zlib is
|
|
||||||
compiled to use sprintf() or vsprintf(), then there is no protection
|
|
||||||
against a buffer overflow of an 8K string space (or other value as set by
|
|
||||||
gzbuffer()), other than the caller of gzprintf() assuring that the output
|
|
||||||
will not exceed 8K. On the other hand, if zlib is compiled to use
|
|
||||||
snprintf() or vsnprintf(), which should normally be the case, then there is
|
|
||||||
no vulnerability. The ./configure script will display warnings if an
|
|
||||||
insecure variation of sprintf() will be used by gzprintf(). Also the
|
|
||||||
zlibCompileFlags() function will return information on what variant of
|
|
||||||
sprintf() is used by gzprintf().
|
|
||||||
|
|
||||||
If you don't have snprintf() or vsnprintf() and would like one, you can
|
|
||||||
find a portable implementation here:
|
|
||||||
|
|
||||||
http://www.ijs.si/software/snprintf/
|
|
||||||
|
|
||||||
Note that you should be using the most recent version of zlib. Versions
|
|
||||||
1.1.3 and before were subject to a double-free vulnerability, and versions
|
|
||||||
1.2.1 and 1.2.2 were subject to an access exception when decompressing
|
|
||||||
invalid compressed data.
|
|
||||||
|
|
||||||
34. Is there a Java version of zlib?
|
|
||||||
|
|
||||||
Probably what you want is to use zlib in Java. zlib is already included
|
|
||||||
as part of the Java SDK in the java.util.zip package. If you really want
|
|
||||||
a version of zlib written in the Java language, look on the zlib home
|
|
||||||
page for links: http://zlib.net/ .
|
|
||||||
|
|
||||||
35. I get this or that compiler or source-code scanner warning when I crank it
|
|
||||||
up to maximally-pedantic. Can't you guys write proper code?
|
|
||||||
|
|
||||||
Many years ago, we gave up attempting to avoid warnings on every compiler
|
|
||||||
in the universe. It just got to be a waste of time, and some compilers
|
|
||||||
were downright silly as well as contradicted each other. So now, we simply
|
|
||||||
make sure that the code always works.
|
|
||||||
|
|
||||||
36. Valgrind (or some similar memory access checker) says that deflate is
|
|
||||||
performing a conditional jump that depends on an uninitialized value.
|
|
||||||
Isn't that a bug?
|
|
||||||
|
|
||||||
No. That is intentional for performance reasons, and the output of deflate
|
|
||||||
is not affected. This only started showing up recently since zlib 1.2.x
|
|
||||||
uses malloc() by default for allocations, whereas earlier versions used
|
|
||||||
calloc(), which zeros out the allocated memory. Even though the code was
|
|
||||||
correct, versions 1.2.4 and later was changed to not stimulate these
|
|
||||||
checkers.
|
|
||||||
|
|
||||||
37. Will zlib read the (insert any ancient or arcane format here) compressed
|
|
||||||
data format?
|
|
||||||
|
|
||||||
Probably not. Look in the comp.compression FAQ for pointers to various
|
|
||||||
formats and associated software.
|
|
||||||
|
|
||||||
38. How can I encrypt/decrypt zip files with zlib?
|
|
||||||
|
|
||||||
zlib doesn't support encryption. The original PKZIP encryption is very
|
|
||||||
weak and can be broken with freely available programs. To get strong
|
|
||||||
encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib
|
|
||||||
compression. For PKZIP compatible "encryption", look at
|
|
||||||
http://www.info-zip.org/
|
|
||||||
|
|
||||||
39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
|
|
||||||
|
|
||||||
"gzip" is the gzip format, and "deflate" is the zlib format. They should
|
|
||||||
probably have called the second one "zlib" instead to avoid confusion with
|
|
||||||
the raw deflate compressed data format. While the HTTP 1.1 RFC 2616
|
|
||||||
correctly points to the zlib specification in RFC 1950 for the "deflate"
|
|
||||||
transfer encoding, there have been reports of servers and browsers that
|
|
||||||
incorrectly produce or expect raw deflate data per the deflate
|
|
||||||
specification in RFC 1951, most notably Microsoft. So even though the
|
|
||||||
"deflate" transfer encoding using the zlib format would be the more
|
|
||||||
efficient approach (and in fact exactly what the zlib format was designed
|
|
||||||
for), using the "gzip" transfer encoding is probably more reliable due to
|
|
||||||
an unfortunate choice of name on the part of the HTTP 1.1 authors.
|
|
||||||
|
|
||||||
Bottom line: use the gzip format for HTTP 1.1 encoding.
|
|
||||||
|
|
||||||
40. Does zlib support the new "Deflate64" format introduced by PKWare?
|
|
||||||
|
|
||||||
No. PKWare has apparently decided to keep that format proprietary, since
|
|
||||||
they have not documented it as they have previous compression formats. In
|
|
||||||
any case, the compression improvements are so modest compared to other more
|
|
||||||
modern approaches, that it's not worth the effort to implement.
|
|
||||||
|
|
||||||
41. I'm having a problem with the zip functions in zlib, can you help?
|
|
||||||
|
|
||||||
There are no zip functions in zlib. You are probably using minizip by
|
|
||||||
Giles Vollant, which is found in the contrib directory of zlib. It is not
|
|
||||||
part of zlib. In fact none of the stuff in contrib is part of zlib. The
|
|
||||||
files in there are not supported by the zlib authors. You need to contact
|
|
||||||
the authors of the respective contribution for help.
|
|
||||||
|
|
||||||
42. The match.asm code in contrib is under the GNU General Public License.
|
|
||||||
Since it's part of zlib, doesn't that mean that all of zlib falls under the
|
|
||||||
GNU GPL?
|
|
||||||
|
|
||||||
No. The files in contrib are not part of zlib. They were contributed by
|
|
||||||
other authors and are provided as a convenience to the user within the zlib
|
|
||||||
distribution. Each item in contrib has its own license.
|
|
||||||
|
|
||||||
43. Is zlib subject to export controls? What is its ECCN?
|
|
||||||
|
|
||||||
zlib is not subject to export controls, and so is classified as EAR99.
|
|
||||||
|
|
||||||
44. Can you please sign these lengthy legal documents and fax them back to us
|
|
||||||
so that we can use your software in our product?
|
|
||||||
|
|
||||||
No. Go away. Shoo.
|
|
|
@ -1,22 +0,0 @@
|
||||||
Copyright notice:
|
|
||||||
|
|
||||||
(C) 1995-2022 Jean-loup Gailly and Mark Adler
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, 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 notice may not be removed or altered from any source distribution.
|
|
||||||
|
|
||||||
Jean-loup Gailly Mark Adler
|
|
||||||
jloup@gzip.org madler@alumni.caltech.edu
|
|
|
@ -1,117 +0,0 @@
|
||||||
ZLIB DATA COMPRESSION LIBRARY
|
|
||||||
|
|
||||||
zlib 1.3 is a general purpose data compression library. All the code is
|
|
||||||
thread safe. The data format used by the zlib library is described by RFCs
|
|
||||||
(Request for Comments) 1950 to 1952 in the files
|
|
||||||
http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
|
|
||||||
rfc1952 (gzip format).
|
|
||||||
|
|
||||||
All functions of the compression library are documented in the file zlib.h
|
|
||||||
(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example
|
|
||||||
of the library is given in the file test/example.c which also tests that
|
|
||||||
the library is working correctly. Another example is given in the file
|
|
||||||
test/minigzip.c. The compression library itself is composed of all source
|
|
||||||
files in the root directory.
|
|
||||||
|
|
||||||
To compile all files and run the test program, follow the instructions given at
|
|
||||||
the top of Makefile.in. In short "./configure; make test", and if that goes
|
|
||||||
well, "make install" should work for most flavors of Unix. For Windows, use
|
|
||||||
one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use
|
|
||||||
make_vms.com.
|
|
||||||
|
|
||||||
Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant
|
|
||||||
<info@winimage.com> for the Windows DLL version. The zlib home page is
|
|
||||||
http://zlib.net/ . Before reporting a problem, please check this site to
|
|
||||||
verify that you have the latest version of zlib; otherwise get the latest
|
|
||||||
version and check whether the problem still exists or not.
|
|
||||||
|
|
||||||
PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help.
|
|
||||||
|
|
||||||
Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
|
|
||||||
issue of Dr. Dobb's Journal; a copy of the article is available at
|
|
||||||
https://marknelson.us/posts/1997/01/01/zlib-engine.html .
|
|
||||||
|
|
||||||
The changes made in version 1.3 are documented in the file ChangeLog.
|
|
||||||
|
|
||||||
Unsupported third party contributions are provided in directory contrib/ .
|
|
||||||
|
|
||||||
zlib is available in Java using the java.util.zip package. Follow the API
|
|
||||||
Documentation link at: https://docs.oracle.com/search/?q=java.util.zip .
|
|
||||||
|
|
||||||
A Perl interface to zlib and bzip2 written by Paul Marquess <pmqs@cpan.org>
|
|
||||||
can be found at https://github.com/pmqs/IO-Compress .
|
|
||||||
|
|
||||||
A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is
|
|
||||||
available in Python 1.5 and later versions, see
|
|
||||||
http://docs.python.org/library/zlib.html .
|
|
||||||
|
|
||||||
zlib is built into tcl: http://wiki.tcl.tk/4610 .
|
|
||||||
|
|
||||||
An experimental package to read and write files in .zip format, written on top
|
|
||||||
of zlib by Gilles Vollant <info@winimage.com>, is available in the
|
|
||||||
contrib/minizip directory of zlib.
|
|
||||||
|
|
||||||
|
|
||||||
Notes for some targets:
|
|
||||||
|
|
||||||
- For Windows DLL versions, please see win32/DLL_FAQ.txt
|
|
||||||
|
|
||||||
- For 64-bit Irix, deflate.c must be compiled without any optimization. With
|
|
||||||
-O, one libpng test fails. The test works in 32 bit mode (with the -n32
|
|
||||||
compiler flag). The compiler bug has been reported to SGI.
|
|
||||||
|
|
||||||
- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works
|
|
||||||
when compiled with cc.
|
|
||||||
|
|
||||||
- On Digital Unix 4.0D (formerly OSF/1) on AlphaServer, the cc option -std1 is
|
|
||||||
necessary to get gzprintf working correctly. This is done by configure.
|
|
||||||
|
|
||||||
- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with
|
|
||||||
other compilers. Use "make test" to check your compiler.
|
|
||||||
|
|
||||||
- gzdopen is not supported on RISCOS or BEOS.
|
|
||||||
|
|
||||||
- For PalmOs, see http://palmzlib.sourceforge.net/
|
|
||||||
|
|
||||||
|
|
||||||
Acknowledgments:
|
|
||||||
|
|
||||||
The deflate format used by zlib was defined by Phil Katz. The deflate and
|
|
||||||
zlib specifications were written by L. Peter Deutsch. Thanks to all the
|
|
||||||
people who reported problems and suggested various improvements in zlib; they
|
|
||||||
are too numerous to cite here.
|
|
||||||
|
|
||||||
Copyright notice:
|
|
||||||
|
|
||||||
(C) 1995-2023 Jean-loup Gailly and Mark Adler
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, 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 notice may not be removed or altered from any source distribution.
|
|
||||||
|
|
||||||
Jean-loup Gailly Mark Adler
|
|
||||||
jloup@gzip.org madler@alumni.caltech.edu
|
|
||||||
|
|
||||||
If you use the zlib library in a product, we would appreciate *not* receiving
|
|
||||||
lengthy legal documents to sign. The sources are provided for free but without
|
|
||||||
warranty of any kind. The library has been entirely written by Jean-loup
|
|
||||||
Gailly and Mark Adler; it does not include third-party code. We make all
|
|
||||||
contributions to and distributions of this project solely in our personal
|
|
||||||
capacity, and are not conveying any rights to any intellectual property of
|
|
||||||
any third parties.
|
|
||||||
|
|
||||||
If you redistribute modified sources, we would appreciate that you include in
|
|
||||||
the file ChangeLog history information documenting your changes. Please read
|
|
||||||
the FAQ for more information on the distribution of modified source versions.
|
|
|
@ -1,164 +0,0 @@
|
||||||
/* adler32.c -- compute the Adler-32 checksum of a data stream
|
|
||||||
* Copyright (C) 1995-2011, 2016 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @(#) $Id$ */
|
|
||||||
|
|
||||||
#include "zutil.h"
|
|
||||||
|
|
||||||
#define BASE 65521U /* largest prime smaller than 65536 */
|
|
||||||
#define NMAX 5552
|
|
||||||
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
|
|
||||||
|
|
||||||
#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;}
|
|
||||||
#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
|
|
||||||
#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
|
|
||||||
#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
|
|
||||||
#define DO16(buf) DO8(buf,0); DO8(buf,8);
|
|
||||||
|
|
||||||
/* use NO_DIVIDE if your processor does not do division in hardware --
|
|
||||||
try it both ways to see which is faster */
|
|
||||||
#ifdef NO_DIVIDE
|
|
||||||
/* note that this assumes BASE is 65521, where 65536 % 65521 == 15
|
|
||||||
(thank you to John Reiser for pointing this out) */
|
|
||||||
# define CHOP(a) \
|
|
||||||
do { \
|
|
||||||
unsigned long tmp = a >> 16; \
|
|
||||||
a &= 0xffffUL; \
|
|
||||||
a += (tmp << 4) - tmp; \
|
|
||||||
} while (0)
|
|
||||||
# define MOD28(a) \
|
|
||||||
do { \
|
|
||||||
CHOP(a); \
|
|
||||||
if (a >= BASE) a -= BASE; \
|
|
||||||
} while (0)
|
|
||||||
# define MOD(a) \
|
|
||||||
do { \
|
|
||||||
CHOP(a); \
|
|
||||||
MOD28(a); \
|
|
||||||
} while (0)
|
|
||||||
# define MOD63(a) \
|
|
||||||
do { /* this assumes a is not negative */ \
|
|
||||||
z_off64_t tmp = a >> 32; \
|
|
||||||
a &= 0xffffffffL; \
|
|
||||||
a += (tmp << 8) - (tmp << 5) + tmp; \
|
|
||||||
tmp = a >> 16; \
|
|
||||||
a &= 0xffffL; \
|
|
||||||
a += (tmp << 4) - tmp; \
|
|
||||||
tmp = a >> 16; \
|
|
||||||
a &= 0xffffL; \
|
|
||||||
a += (tmp << 4) - tmp; \
|
|
||||||
if (a >= BASE) a -= BASE; \
|
|
||||||
} while (0)
|
|
||||||
#else
|
|
||||||
# define MOD(a) a %= BASE
|
|
||||||
# define MOD28(a) a %= BASE
|
|
||||||
# define MOD63(a) a %= BASE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) {
|
|
||||||
unsigned long sum2;
|
|
||||||
unsigned n;
|
|
||||||
|
|
||||||
/* split Adler-32 into component sums */
|
|
||||||
sum2 = (adler >> 16) & 0xffff;
|
|
||||||
adler &= 0xffff;
|
|
||||||
|
|
||||||
/* in case user likes doing a byte at a time, keep it fast */
|
|
||||||
if (len == 1) {
|
|
||||||
adler += buf[0];
|
|
||||||
if (adler >= BASE)
|
|
||||||
adler -= BASE;
|
|
||||||
sum2 += adler;
|
|
||||||
if (sum2 >= BASE)
|
|
||||||
sum2 -= BASE;
|
|
||||||
return adler | (sum2 << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initial Adler-32 value (deferred check for len == 1 speed) */
|
|
||||||
if (buf == Z_NULL)
|
|
||||||
return 1L;
|
|
||||||
|
|
||||||
/* in case short lengths are provided, keep it somewhat fast */
|
|
||||||
if (len < 16) {
|
|
||||||
while (len--) {
|
|
||||||
adler += *buf++;
|
|
||||||
sum2 += adler;
|
|
||||||
}
|
|
||||||
if (adler >= BASE)
|
|
||||||
adler -= BASE;
|
|
||||||
MOD28(sum2); /* only added so many BASE's */
|
|
||||||
return adler | (sum2 << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* do length NMAX blocks -- requires just one modulo operation */
|
|
||||||
while (len >= NMAX) {
|
|
||||||
len -= NMAX;
|
|
||||||
n = NMAX / 16; /* NMAX is divisible by 16 */
|
|
||||||
do {
|
|
||||||
DO16(buf); /* 16 sums unrolled */
|
|
||||||
buf += 16;
|
|
||||||
} while (--n);
|
|
||||||
MOD(adler);
|
|
||||||
MOD(sum2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* do remaining bytes (less than NMAX, still just one modulo) */
|
|
||||||
if (len) { /* avoid modulos if none remaining */
|
|
||||||
while (len >= 16) {
|
|
||||||
len -= 16;
|
|
||||||
DO16(buf);
|
|
||||||
buf += 16;
|
|
||||||
}
|
|
||||||
while (len--) {
|
|
||||||
adler += *buf++;
|
|
||||||
sum2 += adler;
|
|
||||||
}
|
|
||||||
MOD(adler);
|
|
||||||
MOD(sum2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return recombined sums */
|
|
||||||
return adler | (sum2 << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) {
|
|
||||||
return adler32_z(adler, buf, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2) {
|
|
||||||
unsigned long sum1;
|
|
||||||
unsigned long sum2;
|
|
||||||
unsigned rem;
|
|
||||||
|
|
||||||
/* for negative len, return invalid adler32 as a clue for debugging */
|
|
||||||
if (len2 < 0)
|
|
||||||
return 0xffffffffUL;
|
|
||||||
|
|
||||||
/* the derivation of this formula is left as an exercise for the reader */
|
|
||||||
MOD63(len2); /* assumes len2 >= 0 */
|
|
||||||
rem = (unsigned)len2;
|
|
||||||
sum1 = adler1 & 0xffff;
|
|
||||||
sum2 = rem * sum1;
|
|
||||||
MOD(sum2);
|
|
||||||
sum1 += (adler2 & 0xffff) + BASE - 1;
|
|
||||||
sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
|
|
||||||
if (sum1 >= BASE) sum1 -= BASE;
|
|
||||||
if (sum1 >= BASE) sum1 -= BASE;
|
|
||||||
if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1);
|
|
||||||
if (sum2 >= BASE) sum2 -= BASE;
|
|
||||||
return sum1 | (sum2 << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) {
|
|
||||||
return adler32_combine_(adler1, adler2, len2);
|
|
||||||
}
|
|
||||||
|
|
||||||
uLong ZEXPORT adler32_combine64(uLong adler1, uLong adler2, z_off64_t len2) {
|
|
||||||
return adler32_combine_(adler1, adler2, len2);
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
/* compress.c -- compress a memory buffer
|
|
||||||
* Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @(#) $Id$ */
|
|
||||||
|
|
||||||
#define ZLIB_INTERNAL
|
|
||||||
#include "zlib.h"
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
Compresses the source buffer into the destination buffer. The level
|
|
||||||
parameter has the same meaning as in deflateInit. sourceLen is the byte
|
|
||||||
length of the source buffer. Upon entry, destLen is the total size of the
|
|
||||||
destination buffer, which must be at least 0.1% larger than sourceLen plus
|
|
||||||
12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
|
|
||||||
|
|
||||||
compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
|
||||||
memory, Z_BUF_ERROR if there was not enough room in the output buffer,
|
|
||||||
Z_STREAM_ERROR if the level parameter is invalid.
|
|
||||||
*/
|
|
||||||
int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source,
|
|
||||||
uLong sourceLen, int level) {
|
|
||||||
z_stream stream;
|
|
||||||
int err;
|
|
||||||
const uInt max = (uInt)-1;
|
|
||||||
uLong left;
|
|
||||||
|
|
||||||
left = *destLen;
|
|
||||||
*destLen = 0;
|
|
||||||
|
|
||||||
stream.zalloc = (alloc_func)0;
|
|
||||||
stream.zfree = (free_func)0;
|
|
||||||
stream.opaque = (voidpf)0;
|
|
||||||
|
|
||||||
err = deflateInit(&stream, level);
|
|
||||||
if (err != Z_OK) return err;
|
|
||||||
|
|
||||||
stream.next_out = dest;
|
|
||||||
stream.avail_out = 0;
|
|
||||||
stream.next_in = (z_const Bytef *)source;
|
|
||||||
stream.avail_in = 0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (stream.avail_out == 0) {
|
|
||||||
stream.avail_out = left > (uLong)max ? max : (uInt)left;
|
|
||||||
left -= stream.avail_out;
|
|
||||||
}
|
|
||||||
if (stream.avail_in == 0) {
|
|
||||||
stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
|
|
||||||
sourceLen -= stream.avail_in;
|
|
||||||
}
|
|
||||||
err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
|
|
||||||
} while (err == Z_OK);
|
|
||||||
|
|
||||||
*destLen = stream.total_out;
|
|
||||||
deflateEnd(&stream);
|
|
||||||
return err == Z_STREAM_END ? Z_OK : err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
*/
|
|
||||||
int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source,
|
|
||||||
uLong sourceLen) {
|
|
||||||
return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
If the default memLevel or windowBits for deflateInit() is changed, then
|
|
||||||
this function needs to be updated.
|
|
||||||
*/
|
|
||||||
uLong ZEXPORT compressBound(uLong sourceLen) {
|
|
||||||
return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
|
|
||||||
(sourceLen >> 25) + 13;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,346 +0,0 @@
|
||||||
/* deflate.h -- internal compression state
|
|
||||||
* Copyright (C) 1995-2018 Jean-loup Gailly
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* WARNING: this file should *not* be used by applications. It is
|
|
||||||
part of the implementation of the compression library and is
|
|
||||||
subject to change. Applications should only use zlib.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @(#) $Id$ */
|
|
||||||
|
|
||||||
#ifndef DEFLATE_H
|
|
||||||
#define DEFLATE_H
|
|
||||||
|
|
||||||
#include "zutil.h"
|
|
||||||
|
|
||||||
/* define NO_GZIP when compiling if you want to disable gzip header and
|
|
||||||
trailer creation by deflate(). NO_GZIP would be used to avoid linking in
|
|
||||||
the crc code when it is not needed. For shared libraries, gzip encoding
|
|
||||||
should be left enabled. */
|
|
||||||
#ifndef NO_GZIP
|
|
||||||
# define GZIP
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Internal compression state.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define LENGTH_CODES 29
|
|
||||||
/* number of length codes, not counting the special END_BLOCK code */
|
|
||||||
|
|
||||||
#define LITERALS 256
|
|
||||||
/* number of literal bytes 0..255 */
|
|
||||||
|
|
||||||
#define L_CODES (LITERALS+1+LENGTH_CODES)
|
|
||||||
/* number of Literal or Length codes, including the END_BLOCK code */
|
|
||||||
|
|
||||||
#define D_CODES 30
|
|
||||||
/* number of distance codes */
|
|
||||||
|
|
||||||
#define BL_CODES 19
|
|
||||||
/* number of codes used to transfer the bit lengths */
|
|
||||||
|
|
||||||
#define HEAP_SIZE (2*L_CODES+1)
|
|
||||||
/* maximum heap size */
|
|
||||||
|
|
||||||
#define MAX_BITS 15
|
|
||||||
/* All codes must not exceed MAX_BITS bits */
|
|
||||||
|
|
||||||
#define Buf_size 16
|
|
||||||
/* size of bit buffer in bi_buf */
|
|
||||||
|
|
||||||
#define INIT_STATE 42 /* zlib header -> BUSY_STATE */
|
|
||||||
#ifdef GZIP
|
|
||||||
# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */
|
|
||||||
#endif
|
|
||||||
#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */
|
|
||||||
#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */
|
|
||||||
#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */
|
|
||||||
#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */
|
|
||||||
#define BUSY_STATE 113 /* deflate -> FINISH_STATE */
|
|
||||||
#define FINISH_STATE 666 /* stream complete */
|
|
||||||
/* Stream status */
|
|
||||||
|
|
||||||
|
|
||||||
/* Data structure describing a single value and its code string. */
|
|
||||||
typedef struct ct_data_s {
|
|
||||||
union {
|
|
||||||
ush freq; /* frequency count */
|
|
||||||
ush code; /* bit string */
|
|
||||||
} fc;
|
|
||||||
union {
|
|
||||||
ush dad; /* father node in Huffman tree */
|
|
||||||
ush len; /* length of bit string */
|
|
||||||
} dl;
|
|
||||||
} FAR ct_data;
|
|
||||||
|
|
||||||
#define Freq fc.freq
|
|
||||||
#define Code fc.code
|
|
||||||
#define Dad dl.dad
|
|
||||||
#define Len dl.len
|
|
||||||
|
|
||||||
typedef struct static_tree_desc_s static_tree_desc;
|
|
||||||
|
|
||||||
typedef struct tree_desc_s {
|
|
||||||
ct_data *dyn_tree; /* the dynamic tree */
|
|
||||||
int max_code; /* largest code with non zero frequency */
|
|
||||||
const static_tree_desc *stat_desc; /* the corresponding static tree */
|
|
||||||
} FAR tree_desc;
|
|
||||||
|
|
||||||
typedef ush Pos;
|
|
||||||
typedef Pos FAR Posf;
|
|
||||||
typedef unsigned IPos;
|
|
||||||
|
|
||||||
/* A Pos is an index in the character window. We use short instead of int to
|
|
||||||
* save space in the various tables. IPos is used only for parameter passing.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct internal_state {
|
|
||||||
z_streamp strm; /* pointer back to this zlib stream */
|
|
||||||
int status; /* as the name implies */
|
|
||||||
Bytef *pending_buf; /* output still pending */
|
|
||||||
ulg pending_buf_size; /* size of pending_buf */
|
|
||||||
Bytef *pending_out; /* next pending byte to output to the stream */
|
|
||||||
ulg pending; /* nb of bytes in the pending buffer */
|
|
||||||
int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
|
|
||||||
gz_headerp gzhead; /* gzip header information to write */
|
|
||||||
ulg gzindex; /* where in extra, name, or comment */
|
|
||||||
Byte method; /* can only be DEFLATED */
|
|
||||||
int last_flush; /* value of flush param for previous deflate call */
|
|
||||||
|
|
||||||
/* used by deflate.c: */
|
|
||||||
|
|
||||||
uInt w_size; /* LZ77 window size (32K by default) */
|
|
||||||
uInt w_bits; /* log2(w_size) (8..16) */
|
|
||||||
uInt w_mask; /* w_size - 1 */
|
|
||||||
|
|
||||||
Bytef *window;
|
|
||||||
/* Sliding window. Input bytes are read into the second half of the window,
|
|
||||||
* and move to the first half later to keep a dictionary of at least wSize
|
|
||||||
* bytes. With this organization, matches are limited to a distance of
|
|
||||||
* wSize-MAX_MATCH bytes, but this ensures that IO is always
|
|
||||||
* performed with a length multiple of the block size. Also, it limits
|
|
||||||
* the window size to 64K, which is quite useful on MSDOS.
|
|
||||||
* To do: use the user input buffer as sliding window.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ulg window_size;
|
|
||||||
/* Actual size of window: 2*wSize, except when the user input buffer
|
|
||||||
* is directly used as sliding window.
|
|
||||||
*/
|
|
||||||
|
|
||||||
Posf *prev;
|
|
||||||
/* Link to older string with same hash index. To limit the size of this
|
|
||||||
* array to 64K, this link is maintained only for the last 32K strings.
|
|
||||||
* An index in this array is thus a window index modulo 32K.
|
|
||||||
*/
|
|
||||||
|
|
||||||
Posf *head; /* Heads of the hash chains or NIL. */
|
|
||||||
|
|
||||||
uInt ins_h; /* hash index of string to be inserted */
|
|
||||||
uInt hash_size; /* number of elements in hash table */
|
|
||||||
uInt hash_bits; /* log2(hash_size) */
|
|
||||||
uInt hash_mask; /* hash_size-1 */
|
|
||||||
|
|
||||||
uInt hash_shift;
|
|
||||||
/* Number of bits by which ins_h must be shifted at each input
|
|
||||||
* step. It must be such that after MIN_MATCH steps, the oldest
|
|
||||||
* byte no longer takes part in the hash key, that is:
|
|
||||||
* hash_shift * MIN_MATCH >= hash_bits
|
|
||||||
*/
|
|
||||||
|
|
||||||
long block_start;
|
|
||||||
/* Window position at the beginning of the current output block. Gets
|
|
||||||
* negative when the window is moved backwards.
|
|
||||||
*/
|
|
||||||
|
|
||||||
uInt match_length; /* length of best match */
|
|
||||||
IPos prev_match; /* previous match */
|
|
||||||
int match_available; /* set if previous match exists */
|
|
||||||
uInt strstart; /* start of string to insert */
|
|
||||||
uInt match_start; /* start of matching string */
|
|
||||||
uInt lookahead; /* number of valid bytes ahead in window */
|
|
||||||
|
|
||||||
uInt prev_length;
|
|
||||||
/* Length of the best match at previous step. Matches not greater than this
|
|
||||||
* are discarded. This is used in the lazy match evaluation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
uInt max_chain_length;
|
|
||||||
/* To speed up deflation, hash chains are never searched beyond this
|
|
||||||
* length. A higher limit improves compression ratio but degrades the
|
|
||||||
* speed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
uInt max_lazy_match;
|
|
||||||
/* Attempt to find a better match only when the current match is strictly
|
|
||||||
* smaller than this value. This mechanism is used only for compression
|
|
||||||
* levels >= 4.
|
|
||||||
*/
|
|
||||||
# define max_insert_length max_lazy_match
|
|
||||||
/* Insert new strings in the hash table only if the match length is not
|
|
||||||
* greater than this length. This saves time but degrades compression.
|
|
||||||
* max_insert_length is used only for compression levels <= 3.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int level; /* compression level (1..9) */
|
|
||||||
int strategy; /* favor or force Huffman coding*/
|
|
||||||
|
|
||||||
uInt good_match;
|
|
||||||
/* Use a faster search when the previous match is longer than this */
|
|
||||||
|
|
||||||
int nice_match; /* Stop searching when current match exceeds this */
|
|
||||||
|
|
||||||
/* used by trees.c: */
|
|
||||||
/* Didn't use ct_data typedef below to suppress compiler warning */
|
|
||||||
struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
|
|
||||||
struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
|
|
||||||
struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
|
|
||||||
|
|
||||||
struct tree_desc_s l_desc; /* desc. for literal tree */
|
|
||||||
struct tree_desc_s d_desc; /* desc. for distance tree */
|
|
||||||
struct tree_desc_s bl_desc; /* desc. for bit length tree */
|
|
||||||
|
|
||||||
ush bl_count[MAX_BITS+1];
|
|
||||||
/* number of codes at each bit length for an optimal tree */
|
|
||||||
|
|
||||||
int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
|
|
||||||
int heap_len; /* number of elements in the heap */
|
|
||||||
int heap_max; /* element of largest frequency */
|
|
||||||
/* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
|
|
||||||
* The same heap array is used to build all trees.
|
|
||||||
*/
|
|
||||||
|
|
||||||
uch depth[2*L_CODES+1];
|
|
||||||
/* Depth of each subtree used as tie breaker for trees of equal frequency
|
|
||||||
*/
|
|
||||||
|
|
||||||
uchf *sym_buf; /* buffer for distances and literals/lengths */
|
|
||||||
|
|
||||||
uInt lit_bufsize;
|
|
||||||
/* Size of match buffer for literals/lengths. There are 4 reasons for
|
|
||||||
* limiting lit_bufsize to 64K:
|
|
||||||
* - frequencies can be kept in 16 bit counters
|
|
||||||
* - if compression is not successful for the first block, all input
|
|
||||||
* data is still in the window so we can still emit a stored block even
|
|
||||||
* when input comes from standard input. (This can also be done for
|
|
||||||
* all blocks if lit_bufsize is not greater than 32K.)
|
|
||||||
* - if compression is not successful for a file smaller than 64K, we can
|
|
||||||
* even emit a stored file instead of a stored block (saving 5 bytes).
|
|
||||||
* This is applicable only for zip (not gzip or zlib).
|
|
||||||
* - creating new Huffman trees less frequently may not provide fast
|
|
||||||
* adaptation to changes in the input data statistics. (Take for
|
|
||||||
* example a binary file with poorly compressible code followed by
|
|
||||||
* a highly compressible string table.) Smaller buffer sizes give
|
|
||||||
* fast adaptation but have of course the overhead of transmitting
|
|
||||||
* trees more frequently.
|
|
||||||
* - I can't count above 4
|
|
||||||
*/
|
|
||||||
|
|
||||||
uInt sym_next; /* running index in sym_buf */
|
|
||||||
uInt sym_end; /* symbol table full when sym_next reaches this */
|
|
||||||
|
|
||||||
ulg opt_len; /* bit length of current block with optimal trees */
|
|
||||||
ulg static_len; /* bit length of current block with static trees */
|
|
||||||
uInt matches; /* number of string matches in current block */
|
|
||||||
uInt insert; /* bytes at end of window left to insert */
|
|
||||||
|
|
||||||
#ifdef ZLIB_DEBUG
|
|
||||||
ulg compressed_len; /* total bit length of compressed file mod 2^32 */
|
|
||||||
ulg bits_sent; /* bit length of compressed data sent mod 2^32 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ush bi_buf;
|
|
||||||
/* Output buffer. bits are inserted starting at the bottom (least
|
|
||||||
* significant bits).
|
|
||||||
*/
|
|
||||||
int bi_valid;
|
|
||||||
/* Number of valid bits in bi_buf. All bits above the last valid bit
|
|
||||||
* are always zero.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ulg high_water;
|
|
||||||
/* High water mark offset in window for initialized bytes -- bytes above
|
|
||||||
* this are set to zero in order to avoid memory check warnings when
|
|
||||||
* longest match routines access bytes past the input. This is then
|
|
||||||
* updated to the new high water mark.
|
|
||||||
*/
|
|
||||||
|
|
||||||
} FAR deflate_state;
|
|
||||||
|
|
||||||
/* Output a byte on the stream.
|
|
||||||
* IN assertion: there is enough room in pending_buf.
|
|
||||||
*/
|
|
||||||
#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);}
|
|
||||||
|
|
||||||
|
|
||||||
#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
|
|
||||||
/* Minimum amount of lookahead, except at the end of the input file.
|
|
||||||
* See deflate.c for comments about the MIN_MATCH+1.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD)
|
|
||||||
/* In order to simplify the code, particularly on 16 bit machines, match
|
|
||||||
* distances are limited to MAX_DIST instead of WSIZE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define WIN_INIT MAX_MATCH
|
|
||||||
/* Number of bytes after end of data in window to initialize in order to avoid
|
|
||||||
memory checker errors from longest match routines */
|
|
||||||
|
|
||||||
/* in trees.c */
|
|
||||||
void ZLIB_INTERNAL _tr_init(deflate_state *s);
|
|
||||||
int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc);
|
|
||||||
void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf,
|
|
||||||
ulg stored_len, int last);
|
|
||||||
void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s);
|
|
||||||
void ZLIB_INTERNAL _tr_align(deflate_state *s);
|
|
||||||
void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf,
|
|
||||||
ulg stored_len, int last);
|
|
||||||
|
|
||||||
#define d_code(dist) \
|
|
||||||
((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
|
|
||||||
/* Mapping from a distance to a distance code. dist is the distance - 1 and
|
|
||||||
* must not have side effects. _dist_code[256] and _dist_code[257] are never
|
|
||||||
* used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ZLIB_DEBUG
|
|
||||||
/* Inline versions of _tr_tally for speed: */
|
|
||||||
|
|
||||||
#if defined(GEN_TREES_H) || !defined(STDC)
|
|
||||||
extern uch ZLIB_INTERNAL _length_code[];
|
|
||||||
extern uch ZLIB_INTERNAL _dist_code[];
|
|
||||||
#else
|
|
||||||
extern const uch ZLIB_INTERNAL _length_code[];
|
|
||||||
extern const uch ZLIB_INTERNAL _dist_code[];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
# define _tr_tally_lit(s, c, flush) \
|
|
||||||
{ uch cc = (c); \
|
|
||||||
s->sym_buf[s->sym_next++] = 0; \
|
|
||||||
s->sym_buf[s->sym_next++] = 0; \
|
|
||||||
s->sym_buf[s->sym_next++] = cc; \
|
|
||||||
s->dyn_ltree[cc].Freq++; \
|
|
||||||
flush = (s->sym_next == s->sym_end); \
|
|
||||||
}
|
|
||||||
# define _tr_tally_dist(s, distance, length, flush) \
|
|
||||||
{ uch len = (uch)(length); \
|
|
||||||
ush dist = (ush)(distance); \
|
|
||||||
s->sym_buf[s->sym_next++] = (uch)dist; \
|
|
||||||
s->sym_buf[s->sym_next++] = (uch)(dist >> 8); \
|
|
||||||
s->sym_buf[s->sym_next++] = len; \
|
|
||||||
dist--; \
|
|
||||||
s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
|
|
||||||
s->dyn_dtree[d_code(dist)].Freq++; \
|
|
||||||
flush = (s->sym_next == s->sym_end); \
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
|
|
||||||
# define _tr_tally_dist(s, distance, length, flush) \
|
|
||||||
flush = _tr_tally(s, distance, length)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* DEFLATE_H */
|
|
|
@ -1,23 +0,0 @@
|
||||||
/* gzclose.c -- zlib gzclose() function
|
|
||||||
* Copyright (C) 2004, 2010 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "gzguts.h"
|
|
||||||
|
|
||||||
/* gzclose() is in a separate file so that it is linked in only if it is used.
|
|
||||||
That way the other gzclose functions can be used instead to avoid linking in
|
|
||||||
unneeded compression or decompression routines. */
|
|
||||||
int ZEXPORT gzclose(gzFile file) {
|
|
||||||
#ifndef NO_GZCOMPRESS
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
if (file == NULL)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file);
|
|
||||||
#else
|
|
||||||
return gzclose_r(file);
|
|
||||||
#endif
|
|
||||||
}
|
|
|
@ -1,218 +0,0 @@
|
||||||
/* gzguts.h -- zlib internal header definitions for gz* operations
|
|
||||||
* Copyright (C) 2004-2019 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef _LARGEFILE64_SOURCE
|
|
||||||
# ifndef _LARGEFILE_SOURCE
|
|
||||||
# define _LARGEFILE_SOURCE 1
|
|
||||||
# endif
|
|
||||||
# undef _FILE_OFFSET_BITS
|
|
||||||
# undef _TIME_BITS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_HIDDEN
|
|
||||||
# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
|
|
||||||
#else
|
|
||||||
# define ZLIB_INTERNAL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "zlib.h"
|
|
||||||
#ifdef STDC
|
|
||||||
# include <string.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
# include <limits.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _POSIX_SOURCE
|
|
||||||
# define _POSIX_SOURCE
|
|
||||||
#endif
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# include <stddef.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)
|
|
||||||
# include <io.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_WIN32)
|
|
||||||
# define WIDECHAR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef WINAPI_FAMILY
|
|
||||||
# define open _open
|
|
||||||
# define read _read
|
|
||||||
# define write _write
|
|
||||||
# define close _close
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NO_DEFLATE /* for compatibility with old definition */
|
|
||||||
# define NO_GZCOMPRESS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
|
|
||||||
# ifndef HAVE_VSNPRINTF
|
|
||||||
# define HAVE_VSNPRINTF
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__CYGWIN__)
|
|
||||||
# ifndef HAVE_VSNPRINTF
|
|
||||||
# define HAVE_VSNPRINTF
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410)
|
|
||||||
# ifndef HAVE_VSNPRINTF
|
|
||||||
# define HAVE_VSNPRINTF
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_VSNPRINTF
|
|
||||||
# ifdef MSDOS
|
|
||||||
/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
|
|
||||||
but for now we just assume it doesn't. */
|
|
||||||
# define NO_vsnprintf
|
|
||||||
# endif
|
|
||||||
# ifdef __TURBOC__
|
|
||||||
# define NO_vsnprintf
|
|
||||||
# endif
|
|
||||||
# ifdef WIN32
|
|
||||||
/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
|
|
||||||
# if !defined(vsnprintf) && !defined(NO_vsnprintf)
|
|
||||||
# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# ifdef __SASC
|
|
||||||
# define NO_vsnprintf
|
|
||||||
# endif
|
|
||||||
# ifdef VMS
|
|
||||||
# define NO_vsnprintf
|
|
||||||
# endif
|
|
||||||
# ifdef __OS400__
|
|
||||||
# define NO_vsnprintf
|
|
||||||
# endif
|
|
||||||
# ifdef __MVS__
|
|
||||||
# define NO_vsnprintf
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* unlike snprintf (which is required in C99), _snprintf does not guarantee
|
|
||||||
null termination of the result -- however this is only used in gzlib.c where
|
|
||||||
the result is assured to fit in the space provided */
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
|
||||||
# define snprintf _snprintf
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef local
|
|
||||||
# define local static
|
|
||||||
#endif
|
|
||||||
/* since "static" is used to mean two completely different things in C, we
|
|
||||||
define "local" for the non-static meaning of "static", for readability
|
|
||||||
(compile with -Dlocal if your debugger can't find static symbols) */
|
|
||||||
|
|
||||||
/* gz* functions always use library allocation functions */
|
|
||||||
#ifndef STDC
|
|
||||||
extern voidp malloc(uInt size);
|
|
||||||
extern void free(voidpf ptr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* get errno and strerror definition */
|
|
||||||
#if defined UNDER_CE
|
|
||||||
# include <windows.h>
|
|
||||||
# define zstrerror() gz_strwinerror((DWORD)GetLastError())
|
|
||||||
#else
|
|
||||||
# ifndef NO_STRERROR
|
|
||||||
# include <errno.h>
|
|
||||||
# define zstrerror() strerror(errno)
|
|
||||||
# else
|
|
||||||
# define zstrerror() "stdio error (consult errno)"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* provide prototypes for these when building zlib without LFS */
|
|
||||||
#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
|
|
||||||
ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *);
|
|
||||||
ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int);
|
|
||||||
ZEXTERN z_off64_t ZEXPORT gztell64(gzFile);
|
|
||||||
ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* default memLevel */
|
|
||||||
#if MAX_MEM_LEVEL >= 8
|
|
||||||
# define DEF_MEM_LEVEL 8
|
|
||||||
#else
|
|
||||||
# define DEF_MEM_LEVEL MAX_MEM_LEVEL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* default i/o buffer size -- double this for output when reading (this and
|
|
||||||
twice this must be able to fit in an unsigned type) */
|
|
||||||
#define GZBUFSIZE 8192
|
|
||||||
|
|
||||||
/* gzip modes, also provide a little integrity check on the passed structure */
|
|
||||||
#define GZ_NONE 0
|
|
||||||
#define GZ_READ 7247
|
|
||||||
#define GZ_WRITE 31153
|
|
||||||
#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */
|
|
||||||
|
|
||||||
/* values for gz_state how */
|
|
||||||
#define LOOK 0 /* look for a gzip header */
|
|
||||||
#define COPY 1 /* copy input directly */
|
|
||||||
#define GZIP 2 /* decompress a gzip stream */
|
|
||||||
|
|
||||||
/* internal gzip file state data structure */
|
|
||||||
typedef struct {
|
|
||||||
/* exposed contents for gzgetc() macro */
|
|
||||||
struct gzFile_s x; /* "x" for exposed */
|
|
||||||
/* x.have: number of bytes available at x.next */
|
|
||||||
/* x.next: next output data to deliver or write */
|
|
||||||
/* x.pos: current position in uncompressed data */
|
|
||||||
/* used for both reading and writing */
|
|
||||||
int mode; /* see gzip modes above */
|
|
||||||
int fd; /* file descriptor */
|
|
||||||
char *path; /* path or fd for error messages */
|
|
||||||
unsigned size; /* buffer size, zero if not allocated yet */
|
|
||||||
unsigned want; /* requested buffer size, default is GZBUFSIZE */
|
|
||||||
unsigned char *in; /* input buffer (double-sized when writing) */
|
|
||||||
unsigned char *out; /* output buffer (double-sized when reading) */
|
|
||||||
int direct; /* 0 if processing gzip, 1 if transparent */
|
|
||||||
/* just for reading */
|
|
||||||
int how; /* 0: get header, 1: copy, 2: decompress */
|
|
||||||
z_off64_t start; /* where the gzip data started, for rewinding */
|
|
||||||
int eof; /* true if end of input file reached */
|
|
||||||
int past; /* true if read requested past end */
|
|
||||||
/* just for writing */
|
|
||||||
int level; /* compression level */
|
|
||||||
int strategy; /* compression strategy */
|
|
||||||
int reset; /* true if a reset is pending after a Z_FINISH */
|
|
||||||
/* seek request */
|
|
||||||
z_off64_t skip; /* amount to skip (already rewound if backwards) */
|
|
||||||
int seek; /* true if seek request pending */
|
|
||||||
/* error information */
|
|
||||||
int err; /* error code */
|
|
||||||
char *msg; /* error message */
|
|
||||||
/* zlib inflate or deflate stream */
|
|
||||||
z_stream strm; /* stream structure in-place (not a pointer) */
|
|
||||||
} gz_state;
|
|
||||||
typedef gz_state FAR *gz_statep;
|
|
||||||
|
|
||||||
/* shared functions */
|
|
||||||
void ZLIB_INTERNAL gz_error(gz_statep, int, const char *);
|
|
||||||
#if defined UNDER_CE
|
|
||||||
char ZLIB_INTERNAL *gz_strwinerror(DWORD error);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
|
|
||||||
value -- needed when comparing unsigned to z_off64_t, which is signed
|
|
||||||
(possible z_off64_t types off_t, off64_t, and long are all signed) */
|
|
||||||
#ifdef INT_MAX
|
|
||||||
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
|
|
||||||
#else
|
|
||||||
unsigned ZLIB_INTERNAL gz_intmax(void);
|
|
||||||
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
|
|
||||||
#endif
|
|
|
@ -1,582 +0,0 @@
|
||||||
/* gzlib.c -- zlib functions common to reading and writing gzip files
|
|
||||||
* Copyright (C) 2004-2019 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "gzguts.h"
|
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(__BORLANDC__)
|
|
||||||
# define LSEEK _lseeki64
|
|
||||||
#else
|
|
||||||
#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
|
|
||||||
# define LSEEK lseek64
|
|
||||||
#else
|
|
||||||
# define LSEEK lseek
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined UNDER_CE
|
|
||||||
|
|
||||||
/* Map the Windows error number in ERROR to a locale-dependent error message
|
|
||||||
string and return a pointer to it. Typically, the values for ERROR come
|
|
||||||
from GetLastError.
|
|
||||||
|
|
||||||
The string pointed to shall not be modified by the application, but may be
|
|
||||||
overwritten by a subsequent call to gz_strwinerror
|
|
||||||
|
|
||||||
The gz_strwinerror function does not change the current setting of
|
|
||||||
GetLastError. */
|
|
||||||
char ZLIB_INTERNAL *gz_strwinerror(DWORD error) {
|
|
||||||
static char buf[1024];
|
|
||||||
|
|
||||||
wchar_t *msgbuf;
|
|
||||||
DWORD lasterr = GetLastError();
|
|
||||||
DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
|
|
||||||
| FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
|
||||||
NULL,
|
|
||||||
error,
|
|
||||||
0, /* Default language */
|
|
||||||
(LPVOID)&msgbuf,
|
|
||||||
0,
|
|
||||||
NULL);
|
|
||||||
if (chars != 0) {
|
|
||||||
/* If there is an \r\n appended, zap it. */
|
|
||||||
if (chars >= 2
|
|
||||||
&& msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') {
|
|
||||||
chars -= 2;
|
|
||||||
msgbuf[chars] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chars > sizeof (buf) - 1) {
|
|
||||||
chars = sizeof (buf) - 1;
|
|
||||||
msgbuf[chars] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
wcstombs(buf, msgbuf, chars + 1);
|
|
||||||
LocalFree(msgbuf);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sprintf(buf, "unknown win32 error (%ld)", error);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetLastError(lasterr);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* UNDER_CE */
|
|
||||||
|
|
||||||
/* Reset gzip file state */
|
|
||||||
local void gz_reset(gz_statep state) {
|
|
||||||
state->x.have = 0; /* no output data available */
|
|
||||||
if (state->mode == GZ_READ) { /* for reading ... */
|
|
||||||
state->eof = 0; /* not at end of file */
|
|
||||||
state->past = 0; /* have not read past end yet */
|
|
||||||
state->how = LOOK; /* look for gzip header */
|
|
||||||
}
|
|
||||||
else /* for writing ... */
|
|
||||||
state->reset = 0; /* no deflateReset pending */
|
|
||||||
state->seek = 0; /* no seek request pending */
|
|
||||||
gz_error(state, Z_OK, NULL); /* clear error */
|
|
||||||
state->x.pos = 0; /* no uncompressed data yet */
|
|
||||||
state->strm.avail_in = 0; /* no input data yet */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open a gzip file either by name or file descriptor. */
|
|
||||||
local gzFile gz_open(const void *path, int fd, const char *mode) {
|
|
||||||
gz_statep state;
|
|
||||||
z_size_t len;
|
|
||||||
int oflag;
|
|
||||||
#ifdef O_CLOEXEC
|
|
||||||
int cloexec = 0;
|
|
||||||
#endif
|
|
||||||
#ifdef O_EXCL
|
|
||||||
int exclusive = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* check input */
|
|
||||||
if (path == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* allocate gzFile structure to return */
|
|
||||||
state = (gz_statep)malloc(sizeof(gz_state));
|
|
||||||
if (state == NULL)
|
|
||||||
return NULL;
|
|
||||||
state->size = 0; /* no buffers allocated yet */
|
|
||||||
state->want = GZBUFSIZE; /* requested buffer size */
|
|
||||||
state->msg = NULL; /* no error message yet */
|
|
||||||
|
|
||||||
/* interpret mode */
|
|
||||||
state->mode = GZ_NONE;
|
|
||||||
state->level = Z_DEFAULT_COMPRESSION;
|
|
||||||
state->strategy = Z_DEFAULT_STRATEGY;
|
|
||||||
state->direct = 0;
|
|
||||||
while (*mode) {
|
|
||||||
if (*mode >= '0' && *mode <= '9')
|
|
||||||
state->level = *mode - '0';
|
|
||||||
else
|
|
||||||
switch (*mode) {
|
|
||||||
case 'r':
|
|
||||||
state->mode = GZ_READ;
|
|
||||||
break;
|
|
||||||
#ifndef NO_GZCOMPRESS
|
|
||||||
case 'w':
|
|
||||||
state->mode = GZ_WRITE;
|
|
||||||
break;
|
|
||||||
case 'a':
|
|
||||||
state->mode = GZ_APPEND;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case '+': /* can't read and write at the same time */
|
|
||||||
free(state);
|
|
||||||
return NULL;
|
|
||||||
case 'b': /* ignore -- will request binary anyway */
|
|
||||||
break;
|
|
||||||
#ifdef O_CLOEXEC
|
|
||||||
case 'e':
|
|
||||||
cloexec = 1;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifdef O_EXCL
|
|
||||||
case 'x':
|
|
||||||
exclusive = 1;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case 'f':
|
|
||||||
state->strategy = Z_FILTERED;
|
|
||||||
break;
|
|
||||||
case 'h':
|
|
||||||
state->strategy = Z_HUFFMAN_ONLY;
|
|
||||||
break;
|
|
||||||
case 'R':
|
|
||||||
state->strategy = Z_RLE;
|
|
||||||
break;
|
|
||||||
case 'F':
|
|
||||||
state->strategy = Z_FIXED;
|
|
||||||
break;
|
|
||||||
case 'T':
|
|
||||||
state->direct = 1;
|
|
||||||
break;
|
|
||||||
default: /* could consider as an error, but just ignore */
|
|
||||||
;
|
|
||||||
}
|
|
||||||
mode++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* must provide an "r", "w", or "a" */
|
|
||||||
if (state->mode == GZ_NONE) {
|
|
||||||
free(state);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* can't force transparent read */
|
|
||||||
if (state->mode == GZ_READ) {
|
|
||||||
if (state->direct) {
|
|
||||||
free(state);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
state->direct = 1; /* for empty file */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* save the path name for error messages */
|
|
||||||
#ifdef WIDECHAR
|
|
||||||
if (fd == -2) {
|
|
||||||
len = wcstombs(NULL, path, 0);
|
|
||||||
if (len == (z_size_t)-1)
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
len = strlen((const char *)path);
|
|
||||||
state->path = (char *)malloc(len + 1);
|
|
||||||
if (state->path == NULL) {
|
|
||||||
free(state);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#ifdef WIDECHAR
|
|
||||||
if (fd == -2)
|
|
||||||
if (len)
|
|
||||||
wcstombs(state->path, path, len + 1);
|
|
||||||
else
|
|
||||||
*(state->path) = 0;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
|
|
||||||
(void)snprintf(state->path, len + 1, "%s", (const char *)path);
|
|
||||||
#else
|
|
||||||
strcpy(state->path, path);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* compute the flags for open() */
|
|
||||||
oflag =
|
|
||||||
#ifdef O_LARGEFILE
|
|
||||||
O_LARGEFILE |
|
|
||||||
#endif
|
|
||||||
#ifdef O_BINARY
|
|
||||||
O_BINARY |
|
|
||||||
#endif
|
|
||||||
#ifdef O_CLOEXEC
|
|
||||||
(cloexec ? O_CLOEXEC : 0) |
|
|
||||||
#endif
|
|
||||||
(state->mode == GZ_READ ?
|
|
||||||
O_RDONLY :
|
|
||||||
(O_WRONLY | O_CREAT |
|
|
||||||
#ifdef O_EXCL
|
|
||||||
(exclusive ? O_EXCL : 0) |
|
|
||||||
#endif
|
|
||||||
(state->mode == GZ_WRITE ?
|
|
||||||
O_TRUNC :
|
|
||||||
O_APPEND)));
|
|
||||||
|
|
||||||
/* open the file with the appropriate flags (or just use fd) */
|
|
||||||
state->fd = fd > -1 ? fd : (
|
|
||||||
#ifdef WIDECHAR
|
|
||||||
fd == -2 ? _wopen(path, oflag, 0666) :
|
|
||||||
#endif
|
|
||||||
open((const char *)path, oflag, 0666));
|
|
||||||
if (state->fd == -1) {
|
|
||||||
free(state->path);
|
|
||||||
free(state);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (state->mode == GZ_APPEND) {
|
|
||||||
LSEEK(state->fd, 0, SEEK_END); /* so gzoffset() is correct */
|
|
||||||
state->mode = GZ_WRITE; /* simplify later checks */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* save the current position for rewinding (only if reading) */
|
|
||||||
if (state->mode == GZ_READ) {
|
|
||||||
state->start = LSEEK(state->fd, 0, SEEK_CUR);
|
|
||||||
if (state->start == -1) state->start = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialize stream */
|
|
||||||
gz_reset(state);
|
|
||||||
|
|
||||||
/* return stream */
|
|
||||||
return (gzFile)state;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
gzFile ZEXPORT gzopen(const char *path, const char *mode) {
|
|
||||||
return gz_open(path, -1, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
gzFile ZEXPORT gzopen64(const char *path, const char *mode) {
|
|
||||||
return gz_open(path, -1, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
gzFile ZEXPORT gzdopen(int fd, const char *mode) {
|
|
||||||
char *path; /* identifier for error messages */
|
|
||||||
gzFile gz;
|
|
||||||
|
|
||||||
if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL)
|
|
||||||
return NULL;
|
|
||||||
#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
|
|
||||||
(void)snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd);
|
|
||||||
#else
|
|
||||||
sprintf(path, "<fd:%d>", fd); /* for debugging */
|
|
||||||
#endif
|
|
||||||
gz = gz_open(path, fd, mode);
|
|
||||||
free(path);
|
|
||||||
return gz;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
#ifdef WIDECHAR
|
|
||||||
gzFile ZEXPORT gzopen_w(const wchar_t *path, const char *mode) {
|
|
||||||
return gz_open(path, -2, mode);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzbuffer(gzFile file, unsigned size) {
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
|
||||||
if (file == NULL)
|
|
||||||
return -1;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* make sure we haven't already allocated memory */
|
|
||||||
if (state->size != 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* check and set requested size */
|
|
||||||
if ((size << 1) < size)
|
|
||||||
return -1; /* need to be able to double it */
|
|
||||||
if (size < 8)
|
|
||||||
size = 8; /* needed to behave well with flushing */
|
|
||||||
state->want = size;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzrewind(gzFile file) {
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return -1;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* check that we're reading and that there's no error */
|
|
||||||
if (state->mode != GZ_READ ||
|
|
||||||
(state->err != Z_OK && state->err != Z_BUF_ERROR))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* back up and start over */
|
|
||||||
if (LSEEK(state->fd, state->start, SEEK_SET) == -1)
|
|
||||||
return -1;
|
|
||||||
gz_reset(state);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) {
|
|
||||||
unsigned n;
|
|
||||||
z_off64_t ret;
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
|
||||||
if (file == NULL)
|
|
||||||
return -1;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* check that there's no error */
|
|
||||||
if (state->err != Z_OK && state->err != Z_BUF_ERROR)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* can only seek from start or relative to current position */
|
|
||||||
if (whence != SEEK_SET && whence != SEEK_CUR)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* normalize offset to a SEEK_CUR specification */
|
|
||||||
if (whence == SEEK_SET)
|
|
||||||
offset -= state->x.pos;
|
|
||||||
else if (state->seek)
|
|
||||||
offset += state->skip;
|
|
||||||
state->seek = 0;
|
|
||||||
|
|
||||||
/* if within raw area while reading, just go there */
|
|
||||||
if (state->mode == GZ_READ && state->how == COPY &&
|
|
||||||
state->x.pos + offset >= 0) {
|
|
||||||
ret = LSEEK(state->fd, offset - (z_off64_t)state->x.have, SEEK_CUR);
|
|
||||||
if (ret == -1)
|
|
||||||
return -1;
|
|
||||||
state->x.have = 0;
|
|
||||||
state->eof = 0;
|
|
||||||
state->past = 0;
|
|
||||||
state->seek = 0;
|
|
||||||
gz_error(state, Z_OK, NULL);
|
|
||||||
state->strm.avail_in = 0;
|
|
||||||
state->x.pos += offset;
|
|
||||||
return state->x.pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* calculate skip amount, rewinding if needed for back seek when reading */
|
|
||||||
if (offset < 0) {
|
|
||||||
if (state->mode != GZ_READ) /* writing -- can't go backwards */
|
|
||||||
return -1;
|
|
||||||
offset += state->x.pos;
|
|
||||||
if (offset < 0) /* before start of file! */
|
|
||||||
return -1;
|
|
||||||
if (gzrewind(file) == -1) /* rewind, then skip to offset */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if reading, skip what's in output buffer (one less gzgetc() check) */
|
|
||||||
if (state->mode == GZ_READ) {
|
|
||||||
n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ?
|
|
||||||
(unsigned)offset : state->x.have;
|
|
||||||
state->x.have -= n;
|
|
||||||
state->x.next += n;
|
|
||||||
state->x.pos += n;
|
|
||||||
offset -= n;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* request skip (if not zero) */
|
|
||||||
if (offset) {
|
|
||||||
state->seek = 1;
|
|
||||||
state->skip = offset;
|
|
||||||
}
|
|
||||||
return state->x.pos + offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
z_off_t ZEXPORT gzseek(gzFile file, z_off_t offset, int whence) {
|
|
||||||
z_off64_t ret;
|
|
||||||
|
|
||||||
ret = gzseek64(file, (z_off64_t)offset, whence);
|
|
||||||
return ret == (z_off_t)ret ? (z_off_t)ret : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
z_off64_t ZEXPORT gztell64(gzFile file) {
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
|
||||||
if (file == NULL)
|
|
||||||
return -1;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* return position */
|
|
||||||
return state->x.pos + (state->seek ? state->skip : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
z_off_t ZEXPORT gztell(gzFile file) {
|
|
||||||
z_off64_t ret;
|
|
||||||
|
|
||||||
ret = gztell64(file);
|
|
||||||
return ret == (z_off_t)ret ? (z_off_t)ret : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
z_off64_t ZEXPORT gzoffset64(gzFile file) {
|
|
||||||
z_off64_t offset;
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
|
||||||
if (file == NULL)
|
|
||||||
return -1;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* compute and return effective offset in file */
|
|
||||||
offset = LSEEK(state->fd, 0, SEEK_CUR);
|
|
||||||
if (offset == -1)
|
|
||||||
return -1;
|
|
||||||
if (state->mode == GZ_READ) /* reading */
|
|
||||||
offset -= state->strm.avail_in; /* don't count buffered input */
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
z_off_t ZEXPORT gzoffset(gzFile file) {
|
|
||||||
z_off64_t ret;
|
|
||||||
|
|
||||||
ret = gzoffset64(file);
|
|
||||||
return ret == (z_off_t)ret ? (z_off_t)ret : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzeof(gzFile file) {
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
|
||||||
if (file == NULL)
|
|
||||||
return 0;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* return end-of-file state */
|
|
||||||
return state->mode == GZ_READ ? state->past : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
const char * ZEXPORT gzerror(gzFile file, int *errnum) {
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
|
||||||
if (file == NULL)
|
|
||||||
return NULL;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* return error information */
|
|
||||||
if (errnum != NULL)
|
|
||||||
*errnum = state->err;
|
|
||||||
return state->err == Z_MEM_ERROR ? "out of memory" :
|
|
||||||
(state->msg == NULL ? "" : state->msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
void ZEXPORT gzclearerr(gzFile file) {
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure and check integrity */
|
|
||||||
if (file == NULL)
|
|
||||||
return;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
if (state->mode != GZ_READ && state->mode != GZ_WRITE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* clear error and end-of-file */
|
|
||||||
if (state->mode == GZ_READ) {
|
|
||||||
state->eof = 0;
|
|
||||||
state->past = 0;
|
|
||||||
}
|
|
||||||
gz_error(state, Z_OK, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create an error message in allocated memory and set state->err and
|
|
||||||
state->msg accordingly. Free any previous error message already there. Do
|
|
||||||
not try to free or allocate space if the error is Z_MEM_ERROR (out of
|
|
||||||
memory). Simply save the error message as a static string. If there is an
|
|
||||||
allocation failure constructing the error message, then convert the error to
|
|
||||||
out of memory. */
|
|
||||||
void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) {
|
|
||||||
/* free previously allocated message and clear */
|
|
||||||
if (state->msg != NULL) {
|
|
||||||
if (state->err != Z_MEM_ERROR)
|
|
||||||
free(state->msg);
|
|
||||||
state->msg = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */
|
|
||||||
if (err != Z_OK && err != Z_BUF_ERROR)
|
|
||||||
state->x.have = 0;
|
|
||||||
|
|
||||||
/* set error code, and if no message, then done */
|
|
||||||
state->err = err;
|
|
||||||
if (msg == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* for an out of memory error, return literal string when requested */
|
|
||||||
if (err == Z_MEM_ERROR)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* construct error message with path */
|
|
||||||
if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) ==
|
|
||||||
NULL) {
|
|
||||||
state->err = Z_MEM_ERROR;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
|
|
||||||
(void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3,
|
|
||||||
"%s%s%s", state->path, ": ", msg);
|
|
||||||
#else
|
|
||||||
strcpy(state->msg, state->path);
|
|
||||||
strcat(state->msg, ": ");
|
|
||||||
strcat(state->msg, msg);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef INT_MAX
|
|
||||||
/* portably return maximum value for an int (when limits.h presumed not
|
|
||||||
available) -- we need to do this to cover cases where 2's complement not
|
|
||||||
used, since C standard permits 1's complement and sign-bit representations,
|
|
||||||
otherwise we could just use ((unsigned)-1) >> 1 */
|
|
||||||
unsigned ZLIB_INTERNAL gz_intmax(void) {
|
|
||||||
unsigned p, q;
|
|
||||||
|
|
||||||
p = 1;
|
|
||||||
do {
|
|
||||||
q = p;
|
|
||||||
p <<= 1;
|
|
||||||
p++;
|
|
||||||
} while (p > q);
|
|
||||||
return q >> 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,602 +0,0 @@
|
||||||
/* gzread.c -- zlib functions for reading gzip files
|
|
||||||
* Copyright (C) 2004-2017 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "gzguts.h"
|
|
||||||
|
|
||||||
/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from
|
|
||||||
state->fd, and update state->eof, state->err, and state->msg as appropriate.
|
|
||||||
This function needs to loop on read(), since read() is not guaranteed to
|
|
||||||
read the number of bytes requested, depending on the type of descriptor. */
|
|
||||||
local int gz_load(gz_statep state, unsigned char *buf, unsigned len,
|
|
||||||
unsigned *have) {
|
|
||||||
int ret;
|
|
||||||
unsigned get, max = ((unsigned)-1 >> 2) + 1;
|
|
||||||
|
|
||||||
*have = 0;
|
|
||||||
do {
|
|
||||||
get = len - *have;
|
|
||||||
if (get > max)
|
|
||||||
get = max;
|
|
||||||
ret = read(state->fd, buf + *have, get);
|
|
||||||
if (ret <= 0)
|
|
||||||
break;
|
|
||||||
*have += (unsigned)ret;
|
|
||||||
} while (*have < len);
|
|
||||||
if (ret < 0) {
|
|
||||||
gz_error(state, Z_ERRNO, zstrerror());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (ret == 0)
|
|
||||||
state->eof = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Load up input buffer and set eof flag if last data loaded -- return -1 on
|
|
||||||
error, 0 otherwise. Note that the eof flag is set when the end of the input
|
|
||||||
file is reached, even though there may be unused data in the buffer. Once
|
|
||||||
that data has been used, no more attempts will be made to read the file.
|
|
||||||
If strm->avail_in != 0, then the current data is moved to the beginning of
|
|
||||||
the input buffer, and then the remainder of the buffer is loaded with the
|
|
||||||
available data from the input file. */
|
|
||||||
local int gz_avail(gz_statep state) {
|
|
||||||
unsigned got;
|
|
||||||
z_streamp strm = &(state->strm);
|
|
||||||
|
|
||||||
if (state->err != Z_OK && state->err != Z_BUF_ERROR)
|
|
||||||
return -1;
|
|
||||||
if (state->eof == 0) {
|
|
||||||
if (strm->avail_in) { /* copy what's there to the start */
|
|
||||||
unsigned char *p = state->in;
|
|
||||||
unsigned const char *q = strm->next_in;
|
|
||||||
unsigned n = strm->avail_in;
|
|
||||||
do {
|
|
||||||
*p++ = *q++;
|
|
||||||
} while (--n);
|
|
||||||
}
|
|
||||||
if (gz_load(state, state->in + strm->avail_in,
|
|
||||||
state->size - strm->avail_in, &got) == -1)
|
|
||||||
return -1;
|
|
||||||
strm->avail_in += got;
|
|
||||||
strm->next_in = state->in;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Look for gzip header, set up for inflate or copy. state->x.have must be 0.
|
|
||||||
If this is the first time in, allocate required memory. state->how will be
|
|
||||||
left unchanged if there is no more input data available, will be set to COPY
|
|
||||||
if there is no gzip header and direct copying will be performed, or it will
|
|
||||||
be set to GZIP for decompression. If direct copying, then leftover input
|
|
||||||
data from the input buffer will be copied to the output buffer. In that
|
|
||||||
case, all further file reads will be directly to either the output buffer or
|
|
||||||
a user buffer. If decompressing, the inflate state will be initialized.
|
|
||||||
gz_look() will return 0 on success or -1 on failure. */
|
|
||||||
local int gz_look(gz_statep state) {
|
|
||||||
z_streamp strm = &(state->strm);
|
|
||||||
|
|
||||||
/* allocate read buffers and inflate memory */
|
|
||||||
if (state->size == 0) {
|
|
||||||
/* allocate buffers */
|
|
||||||
state->in = (unsigned char *)malloc(state->want);
|
|
||||||
state->out = (unsigned char *)malloc(state->want << 1);
|
|
||||||
if (state->in == NULL || state->out == NULL) {
|
|
||||||
free(state->out);
|
|
||||||
free(state->in);
|
|
||||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
state->size = state->want;
|
|
||||||
|
|
||||||
/* allocate inflate memory */
|
|
||||||
state->strm.zalloc = Z_NULL;
|
|
||||||
state->strm.zfree = Z_NULL;
|
|
||||||
state->strm.opaque = Z_NULL;
|
|
||||||
state->strm.avail_in = 0;
|
|
||||||
state->strm.next_in = Z_NULL;
|
|
||||||
if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */
|
|
||||||
free(state->out);
|
|
||||||
free(state->in);
|
|
||||||
state->size = 0;
|
|
||||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get at least the magic bytes in the input buffer */
|
|
||||||
if (strm->avail_in < 2) {
|
|
||||||
if (gz_avail(state) == -1)
|
|
||||||
return -1;
|
|
||||||
if (strm->avail_in == 0)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* look for gzip magic bytes -- if there, do gzip decoding (note: there is
|
|
||||||
a logical dilemma here when considering the case of a partially written
|
|
||||||
gzip file, to wit, if a single 31 byte is written, then we cannot tell
|
|
||||||
whether this is a single-byte file, or just a partially written gzip
|
|
||||||
file -- for here we assume that if a gzip file is being written, then
|
|
||||||
the header will be written in a single operation, so that reading a
|
|
||||||
single byte is sufficient indication that it is not a gzip file) */
|
|
||||||
if (strm->avail_in > 1 &&
|
|
||||||
strm->next_in[0] == 31 && strm->next_in[1] == 139) {
|
|
||||||
inflateReset(strm);
|
|
||||||
state->how = GZIP;
|
|
||||||
state->direct = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* no gzip header -- if we were decoding gzip before, then this is trailing
|
|
||||||
garbage. Ignore the trailing garbage and finish. */
|
|
||||||
if (state->direct == 0) {
|
|
||||||
strm->avail_in = 0;
|
|
||||||
state->eof = 1;
|
|
||||||
state->x.have = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* doing raw i/o, copy any leftover input to output -- this assumes that
|
|
||||||
the output buffer is larger than the input buffer, which also assures
|
|
||||||
space for gzungetc() */
|
|
||||||
state->x.next = state->out;
|
|
||||||
memcpy(state->x.next, strm->next_in, strm->avail_in);
|
|
||||||
state->x.have = strm->avail_in;
|
|
||||||
strm->avail_in = 0;
|
|
||||||
state->how = COPY;
|
|
||||||
state->direct = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Decompress from input to the provided next_out and avail_out in the state.
|
|
||||||
On return, state->x.have and state->x.next point to the just decompressed
|
|
||||||
data. If the gzip stream completes, state->how is reset to LOOK to look for
|
|
||||||
the next gzip stream or raw data, once state->x.have is depleted. Returns 0
|
|
||||||
on success, -1 on failure. */
|
|
||||||
local int gz_decomp(gz_statep state) {
|
|
||||||
int ret = Z_OK;
|
|
||||||
unsigned had;
|
|
||||||
z_streamp strm = &(state->strm);
|
|
||||||
|
|
||||||
/* fill output buffer up to end of deflate stream */
|
|
||||||
had = strm->avail_out;
|
|
||||||
do {
|
|
||||||
/* get more input for inflate() */
|
|
||||||
if (strm->avail_in == 0 && gz_avail(state) == -1)
|
|
||||||
return -1;
|
|
||||||
if (strm->avail_in == 0) {
|
|
||||||
gz_error(state, Z_BUF_ERROR, "unexpected end of file");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* decompress and handle errors */
|
|
||||||
ret = inflate(strm, Z_NO_FLUSH);
|
|
||||||
if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {
|
|
||||||
gz_error(state, Z_STREAM_ERROR,
|
|
||||||
"internal error: inflate stream corrupt");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (ret == Z_MEM_ERROR) {
|
|
||||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (ret == Z_DATA_ERROR) { /* deflate stream invalid */
|
|
||||||
gz_error(state, Z_DATA_ERROR,
|
|
||||||
strm->msg == NULL ? "compressed data error" : strm->msg);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} while (strm->avail_out && ret != Z_STREAM_END);
|
|
||||||
|
|
||||||
/* update available output */
|
|
||||||
state->x.have = had - strm->avail_out;
|
|
||||||
state->x.next = strm->next_out - state->x.have;
|
|
||||||
|
|
||||||
/* if the gzip stream completed successfully, look for another */
|
|
||||||
if (ret == Z_STREAM_END)
|
|
||||||
state->how = LOOK;
|
|
||||||
|
|
||||||
/* good decompression */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fetch data and put it in the output buffer. Assumes state->x.have is 0.
|
|
||||||
Data is either copied from the input file or decompressed from the input
|
|
||||||
file depending on state->how. If state->how is LOOK, then a gzip header is
|
|
||||||
looked for to determine whether to copy or decompress. Returns -1 on error,
|
|
||||||
otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the
|
|
||||||
end of the input file has been reached and all data has been processed. */
|
|
||||||
local int gz_fetch(gz_statep state) {
|
|
||||||
z_streamp strm = &(state->strm);
|
|
||||||
|
|
||||||
do {
|
|
||||||
switch(state->how) {
|
|
||||||
case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */
|
|
||||||
if (gz_look(state) == -1)
|
|
||||||
return -1;
|
|
||||||
if (state->how == LOOK)
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
case COPY: /* -> COPY */
|
|
||||||
if (gz_load(state, state->out, state->size << 1, &(state->x.have))
|
|
||||||
== -1)
|
|
||||||
return -1;
|
|
||||||
state->x.next = state->out;
|
|
||||||
return 0;
|
|
||||||
case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */
|
|
||||||
strm->avail_out = state->size << 1;
|
|
||||||
strm->next_out = state->out;
|
|
||||||
if (gz_decomp(state) == -1)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} while (state->x.have == 0 && (!state->eof || strm->avail_in));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */
|
|
||||||
local int gz_skip(gz_statep state, z_off64_t len) {
|
|
||||||
unsigned n;
|
|
||||||
|
|
||||||
/* skip over len bytes or reach end-of-file, whichever comes first */
|
|
||||||
while (len)
|
|
||||||
/* skip over whatever is in output buffer */
|
|
||||||
if (state->x.have) {
|
|
||||||
n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ?
|
|
||||||
(unsigned)len : state->x.have;
|
|
||||||
state->x.have -= n;
|
|
||||||
state->x.next += n;
|
|
||||||
state->x.pos += n;
|
|
||||||
len -= n;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* output buffer empty -- return if we're at the end of the input */
|
|
||||||
else if (state->eof && state->strm.avail_in == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* need more data to skip -- load up output buffer */
|
|
||||||
else {
|
|
||||||
/* get more output, looking for header if required */
|
|
||||||
if (gz_fetch(state) == -1)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read len bytes into buf from file, or less than len up to the end of the
|
|
||||||
input. Return the number of bytes read. If zero is returned, either the
|
|
||||||
end of file was reached, or there was an error. state->err must be
|
|
||||||
consulted in that case to determine which. */
|
|
||||||
local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) {
|
|
||||||
z_size_t got;
|
|
||||||
unsigned n;
|
|
||||||
|
|
||||||
/* if len is zero, avoid unnecessary operations */
|
|
||||||
if (len == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* process a skip request */
|
|
||||||
if (state->seek) {
|
|
||||||
state->seek = 0;
|
|
||||||
if (gz_skip(state, state->skip) == -1)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get len bytes to buf, or less than len if at the end */
|
|
||||||
got = 0;
|
|
||||||
do {
|
|
||||||
/* set n to the maximum amount of len that fits in an unsigned int */
|
|
||||||
n = (unsigned)-1;
|
|
||||||
if (n > len)
|
|
||||||
n = (unsigned)len;
|
|
||||||
|
|
||||||
/* first just try copying data from the output buffer */
|
|
||||||
if (state->x.have) {
|
|
||||||
if (state->x.have < n)
|
|
||||||
n = state->x.have;
|
|
||||||
memcpy(buf, state->x.next, n);
|
|
||||||
state->x.next += n;
|
|
||||||
state->x.have -= n;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* output buffer empty -- return if we're at the end of the input */
|
|
||||||
else if (state->eof && state->strm.avail_in == 0) {
|
|
||||||
state->past = 1; /* tried to read past end */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* need output data -- for small len or new stream load up our output
|
|
||||||
buffer */
|
|
||||||
else if (state->how == LOOK || n < (state->size << 1)) {
|
|
||||||
/* get more output, looking for header if required */
|
|
||||||
if (gz_fetch(state) == -1)
|
|
||||||
return 0;
|
|
||||||
continue; /* no progress yet -- go back to copy above */
|
|
||||||
/* the copy above assures that we will leave with space in the
|
|
||||||
output buffer, allowing at least one gzungetc() to succeed */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* large len -- read directly into user buffer */
|
|
||||||
else if (state->how == COPY) { /* read directly */
|
|
||||||
if (gz_load(state, (unsigned char *)buf, n, &n) == -1)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* large len -- decompress directly into user buffer */
|
|
||||||
else { /* state->how == GZIP */
|
|
||||||
state->strm.avail_out = n;
|
|
||||||
state->strm.next_out = (unsigned char *)buf;
|
|
||||||
if (gz_decomp(state) == -1)
|
|
||||||
return 0;
|
|
||||||
n = state->x.have;
|
|
||||||
state->x.have = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update progress */
|
|
||||||
len -= n;
|
|
||||||
buf = (char *)buf + n;
|
|
||||||
got += n;
|
|
||||||
state->x.pos += n;
|
|
||||||
} while (len);
|
|
||||||
|
|
||||||
/* return number of bytes read into user buffer */
|
|
||||||
return got;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzread(gzFile file, voidp buf, unsigned len) {
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return -1;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* check that we're reading and that there's no (serious) error */
|
|
||||||
if (state->mode != GZ_READ ||
|
|
||||||
(state->err != Z_OK && state->err != Z_BUF_ERROR))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* since an int is returned, make sure len fits in one, otherwise return
|
|
||||||
with an error (this avoids a flaw in the interface) */
|
|
||||||
if ((int)len < 0) {
|
|
||||||
gz_error(state, Z_STREAM_ERROR, "request does not fit in an int");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* read len or fewer bytes to buf */
|
|
||||||
len = (unsigned)gz_read(state, buf, len);
|
|
||||||
|
|
||||||
/* check for an error */
|
|
||||||
if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* return the number of bytes read (this is assured to fit in an int) */
|
|
||||||
return (int)len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, gzFile file) {
|
|
||||||
z_size_t len;
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return 0;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* check that we're reading and that there's no (serious) error */
|
|
||||||
if (state->mode != GZ_READ ||
|
|
||||||
(state->err != Z_OK && state->err != Z_BUF_ERROR))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* compute bytes to read -- error on overflow */
|
|
||||||
len = nitems * size;
|
|
||||||
if (size && len / size != nitems) {
|
|
||||||
gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* read len or fewer bytes to buf, return the number of full items read */
|
|
||||||
return len ? gz_read(state, buf, len) / size : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
#ifdef Z_PREFIX_SET
|
|
||||||
# undef z_gzgetc
|
|
||||||
#else
|
|
||||||
# undef gzgetc
|
|
||||||
#endif
|
|
||||||
int ZEXPORT gzgetc(gzFile file) {
|
|
||||||
unsigned char buf[1];
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return -1;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* check that we're reading and that there's no (serious) error */
|
|
||||||
if (state->mode != GZ_READ ||
|
|
||||||
(state->err != Z_OK && state->err != Z_BUF_ERROR))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* try output buffer (no need to check for skip request) */
|
|
||||||
if (state->x.have) {
|
|
||||||
state->x.have--;
|
|
||||||
state->x.pos++;
|
|
||||||
return *(state->x.next)++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* nothing there -- try gz_read() */
|
|
||||||
return gz_read(state, buf, 1) < 1 ? -1 : buf[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
int ZEXPORT gzgetc_(gzFile file) {
|
|
||||||
return gzgetc(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzungetc(int c, gzFile file) {
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return -1;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* in case this was just opened, set up the input buffer */
|
|
||||||
if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
|
|
||||||
(void)gz_look(state);
|
|
||||||
|
|
||||||
/* check that we're reading and that there's no (serious) error */
|
|
||||||
if (state->mode != GZ_READ ||
|
|
||||||
(state->err != Z_OK && state->err != Z_BUF_ERROR))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* process a skip request */
|
|
||||||
if (state->seek) {
|
|
||||||
state->seek = 0;
|
|
||||||
if (gz_skip(state, state->skip) == -1)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* can't push EOF */
|
|
||||||
if (c < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* if output buffer empty, put byte at end (allows more pushing) */
|
|
||||||
if (state->x.have == 0) {
|
|
||||||
state->x.have = 1;
|
|
||||||
state->x.next = state->out + (state->size << 1) - 1;
|
|
||||||
state->x.next[0] = (unsigned char)c;
|
|
||||||
state->x.pos--;
|
|
||||||
state->past = 0;
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if no room, give up (must have already done a gzungetc()) */
|
|
||||||
if (state->x.have == (state->size << 1)) {
|
|
||||||
gz_error(state, Z_DATA_ERROR, "out of room to push characters");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* slide output data if needed and insert byte before existing data */
|
|
||||||
if (state->x.next == state->out) {
|
|
||||||
unsigned char *src = state->out + state->x.have;
|
|
||||||
unsigned char *dest = state->out + (state->size << 1);
|
|
||||||
while (src > state->out)
|
|
||||||
*--dest = *--src;
|
|
||||||
state->x.next = dest;
|
|
||||||
}
|
|
||||||
state->x.have++;
|
|
||||||
state->x.next--;
|
|
||||||
state->x.next[0] = (unsigned char)c;
|
|
||||||
state->x.pos--;
|
|
||||||
state->past = 0;
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
char * ZEXPORT gzgets(gzFile file, char *buf, int len) {
|
|
||||||
unsigned left, n;
|
|
||||||
char *str;
|
|
||||||
unsigned char *eol;
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* check parameters and get internal structure */
|
|
||||||
if (file == NULL || buf == NULL || len < 1)
|
|
||||||
return NULL;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* check that we're reading and that there's no (serious) error */
|
|
||||||
if (state->mode != GZ_READ ||
|
|
||||||
(state->err != Z_OK && state->err != Z_BUF_ERROR))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* process a skip request */
|
|
||||||
if (state->seek) {
|
|
||||||
state->seek = 0;
|
|
||||||
if (gz_skip(state, state->skip) == -1)
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* copy output bytes up to new line or len - 1, whichever comes first --
|
|
||||||
append a terminating zero to the string (we don't check for a zero in
|
|
||||||
the contents, let the user worry about that) */
|
|
||||||
str = buf;
|
|
||||||
left = (unsigned)len - 1;
|
|
||||||
if (left) do {
|
|
||||||
/* assure that something is in the output buffer */
|
|
||||||
if (state->x.have == 0 && gz_fetch(state) == -1)
|
|
||||||
return NULL; /* error */
|
|
||||||
if (state->x.have == 0) { /* end of file */
|
|
||||||
state->past = 1; /* read past end */
|
|
||||||
break; /* return what we have */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* look for end-of-line in current output buffer */
|
|
||||||
n = state->x.have > left ? left : state->x.have;
|
|
||||||
eol = (unsigned char *)memchr(state->x.next, '\n', n);
|
|
||||||
if (eol != NULL)
|
|
||||||
n = (unsigned)(eol - state->x.next) + 1;
|
|
||||||
|
|
||||||
/* copy through end-of-line, or remainder if not found */
|
|
||||||
memcpy(buf, state->x.next, n);
|
|
||||||
state->x.have -= n;
|
|
||||||
state->x.next += n;
|
|
||||||
state->x.pos += n;
|
|
||||||
left -= n;
|
|
||||||
buf += n;
|
|
||||||
} while (left && eol == NULL);
|
|
||||||
|
|
||||||
/* return terminated string, or if nothing, end of file */
|
|
||||||
if (buf == str)
|
|
||||||
return NULL;
|
|
||||||
buf[0] = 0;
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzdirect(gzFile file) {
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return 0;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* if the state is not known, but we can find out, then do so (this is
|
|
||||||
mainly for right after a gzopen() or gzdopen()) */
|
|
||||||
if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
|
|
||||||
(void)gz_look(state);
|
|
||||||
|
|
||||||
/* return 1 if transparent, 0 if processing a gzip stream */
|
|
||||||
return state->direct;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzclose_r(gzFile file) {
|
|
||||||
int ret, err;
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* check that we're reading */
|
|
||||||
if (state->mode != GZ_READ)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
|
|
||||||
/* free memory and close file */
|
|
||||||
if (state->size) {
|
|
||||||
inflateEnd(&(state->strm));
|
|
||||||
free(state->out);
|
|
||||||
free(state->in);
|
|
||||||
}
|
|
||||||
err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK;
|
|
||||||
gz_error(state, Z_OK, NULL);
|
|
||||||
free(state->path);
|
|
||||||
ret = close(state->fd);
|
|
||||||
free(state);
|
|
||||||
return ret ? Z_ERRNO : err;
|
|
||||||
}
|
|
|
@ -1,631 +0,0 @@
|
||||||
/* gzwrite.c -- zlib functions for writing gzip files
|
|
||||||
* Copyright (C) 2004-2019 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "gzguts.h"
|
|
||||||
|
|
||||||
/* Initialize state for writing a gzip file. Mark initialization by setting
|
|
||||||
state->size to non-zero. Return -1 on a memory allocation failure, or 0 on
|
|
||||||
success. */
|
|
||||||
local int gz_init(gz_statep state) {
|
|
||||||
int ret;
|
|
||||||
z_streamp strm = &(state->strm);
|
|
||||||
|
|
||||||
/* allocate input buffer (double size for gzprintf) */
|
|
||||||
state->in = (unsigned char *)malloc(state->want << 1);
|
|
||||||
if (state->in == NULL) {
|
|
||||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* only need output buffer and deflate state if compressing */
|
|
||||||
if (!state->direct) {
|
|
||||||
/* allocate output buffer */
|
|
||||||
state->out = (unsigned char *)malloc(state->want);
|
|
||||||
if (state->out == NULL) {
|
|
||||||
free(state->in);
|
|
||||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* allocate deflate memory, set up for gzip compression */
|
|
||||||
strm->zalloc = Z_NULL;
|
|
||||||
strm->zfree = Z_NULL;
|
|
||||||
strm->opaque = Z_NULL;
|
|
||||||
ret = deflateInit2(strm, state->level, Z_DEFLATED,
|
|
||||||
MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy);
|
|
||||||
if (ret != Z_OK) {
|
|
||||||
free(state->out);
|
|
||||||
free(state->in);
|
|
||||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
strm->next_in = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* mark state as initialized */
|
|
||||||
state->size = state->want;
|
|
||||||
|
|
||||||
/* initialize write buffer if compressing */
|
|
||||||
if (!state->direct) {
|
|
||||||
strm->avail_out = state->size;
|
|
||||||
strm->next_out = state->out;
|
|
||||||
state->x.next = strm->next_out;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compress whatever is at avail_in and next_in and write to the output file.
|
|
||||||
Return -1 if there is an error writing to the output file or if gz_init()
|
|
||||||
fails to allocate memory, otherwise 0. flush is assumed to be a valid
|
|
||||||
deflate() flush value. If flush is Z_FINISH, then the deflate() state is
|
|
||||||
reset to start a new gzip stream. If gz->direct is true, then simply write
|
|
||||||
to the output file without compressing, and ignore flush. */
|
|
||||||
local int gz_comp(gz_statep state, int flush) {
|
|
||||||
int ret, writ;
|
|
||||||
unsigned have, put, max = ((unsigned)-1 >> 2) + 1;
|
|
||||||
z_streamp strm = &(state->strm);
|
|
||||||
|
|
||||||
/* allocate memory if this is the first time through */
|
|
||||||
if (state->size == 0 && gz_init(state) == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* write directly if requested */
|
|
||||||
if (state->direct) {
|
|
||||||
while (strm->avail_in) {
|
|
||||||
put = strm->avail_in > max ? max : strm->avail_in;
|
|
||||||
writ = write(state->fd, strm->next_in, put);
|
|
||||||
if (writ < 0) {
|
|
||||||
gz_error(state, Z_ERRNO, zstrerror());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
strm->avail_in -= (unsigned)writ;
|
|
||||||
strm->next_in += writ;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check for a pending reset */
|
|
||||||
if (state->reset) {
|
|
||||||
/* don't start a new gzip member unless there is data to write */
|
|
||||||
if (strm->avail_in == 0)
|
|
||||||
return 0;
|
|
||||||
deflateReset(strm);
|
|
||||||
state->reset = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* run deflate() on provided input until it produces no more output */
|
|
||||||
ret = Z_OK;
|
|
||||||
do {
|
|
||||||
/* write out current buffer contents if full, or if flushing, but if
|
|
||||||
doing Z_FINISH then don't write until we get to Z_STREAM_END */
|
|
||||||
if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&
|
|
||||||
(flush != Z_FINISH || ret == Z_STREAM_END))) {
|
|
||||||
while (strm->next_out > state->x.next) {
|
|
||||||
put = strm->next_out - state->x.next > (int)max ? max :
|
|
||||||
(unsigned)(strm->next_out - state->x.next);
|
|
||||||
writ = write(state->fd, state->x.next, put);
|
|
||||||
if (writ < 0) {
|
|
||||||
gz_error(state, Z_ERRNO, zstrerror());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
state->x.next += writ;
|
|
||||||
}
|
|
||||||
if (strm->avail_out == 0) {
|
|
||||||
strm->avail_out = state->size;
|
|
||||||
strm->next_out = state->out;
|
|
||||||
state->x.next = state->out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* compress */
|
|
||||||
have = strm->avail_out;
|
|
||||||
ret = deflate(strm, flush);
|
|
||||||
if (ret == Z_STREAM_ERROR) {
|
|
||||||
gz_error(state, Z_STREAM_ERROR,
|
|
||||||
"internal error: deflate stream corrupt");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
have -= strm->avail_out;
|
|
||||||
} while (have);
|
|
||||||
|
|
||||||
/* if that completed a deflate stream, allow another to start */
|
|
||||||
if (flush == Z_FINISH)
|
|
||||||
state->reset = 1;
|
|
||||||
|
|
||||||
/* all done, no errors */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compress len zeros to output. Return -1 on a write error or memory
|
|
||||||
allocation failure by gz_comp(), or 0 on success. */
|
|
||||||
local int gz_zero(gz_statep state, z_off64_t len) {
|
|
||||||
int first;
|
|
||||||
unsigned n;
|
|
||||||
z_streamp strm = &(state->strm);
|
|
||||||
|
|
||||||
/* consume whatever's left in the input buffer */
|
|
||||||
if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* compress len zeros (len guaranteed > 0) */
|
|
||||||
first = 1;
|
|
||||||
while (len) {
|
|
||||||
n = GT_OFF(state->size) || (z_off64_t)state->size > len ?
|
|
||||||
(unsigned)len : state->size;
|
|
||||||
if (first) {
|
|
||||||
memset(state->in, 0, n);
|
|
||||||
first = 0;
|
|
||||||
}
|
|
||||||
strm->avail_in = n;
|
|
||||||
strm->next_in = state->in;
|
|
||||||
state->x.pos += n;
|
|
||||||
if (gz_comp(state, Z_NO_FLUSH) == -1)
|
|
||||||
return -1;
|
|
||||||
len -= n;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write len bytes from buf to file. Return the number of bytes written. If
|
|
||||||
the returned value is less than len, then there was an error. */
|
|
||||||
local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) {
|
|
||||||
z_size_t put = len;
|
|
||||||
|
|
||||||
/* if len is zero, avoid unnecessary operations */
|
|
||||||
if (len == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* allocate memory if this is the first time through */
|
|
||||||
if (state->size == 0 && gz_init(state) == -1)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* check for seek request */
|
|
||||||
if (state->seek) {
|
|
||||||
state->seek = 0;
|
|
||||||
if (gz_zero(state, state->skip) == -1)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* for small len, copy to input buffer, otherwise compress directly */
|
|
||||||
if (len < state->size) {
|
|
||||||
/* copy to input buffer, compress when full */
|
|
||||||
do {
|
|
||||||
unsigned have, copy;
|
|
||||||
|
|
||||||
if (state->strm.avail_in == 0)
|
|
||||||
state->strm.next_in = state->in;
|
|
||||||
have = (unsigned)((state->strm.next_in + state->strm.avail_in) -
|
|
||||||
state->in);
|
|
||||||
copy = state->size - have;
|
|
||||||
if (copy > len)
|
|
||||||
copy = (unsigned)len;
|
|
||||||
memcpy(state->in + have, buf, copy);
|
|
||||||
state->strm.avail_in += copy;
|
|
||||||
state->x.pos += copy;
|
|
||||||
buf = (const char *)buf + copy;
|
|
||||||
len -= copy;
|
|
||||||
if (len && gz_comp(state, Z_NO_FLUSH) == -1)
|
|
||||||
return 0;
|
|
||||||
} while (len);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* consume whatever's left in the input buffer */
|
|
||||||
if (state->strm.avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* directly compress user buffer to file */
|
|
||||||
state->strm.next_in = (z_const Bytef *)buf;
|
|
||||||
do {
|
|
||||||
unsigned n = (unsigned)-1;
|
|
||||||
if (n > len)
|
|
||||||
n = (unsigned)len;
|
|
||||||
state->strm.avail_in = n;
|
|
||||||
state->x.pos += n;
|
|
||||||
if (gz_comp(state, Z_NO_FLUSH) == -1)
|
|
||||||
return 0;
|
|
||||||
len -= n;
|
|
||||||
} while (len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* input was all buffered or compressed */
|
|
||||||
return put;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len) {
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return 0;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* check that we're writing and that there's no error */
|
|
||||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* since an int is returned, make sure len fits in one, otherwise return
|
|
||||||
with an error (this avoids a flaw in the interface) */
|
|
||||||
if ((int)len < 0) {
|
|
||||||
gz_error(state, Z_DATA_ERROR, "requested length does not fit in int");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* write len bytes from buf (the return value will fit in an int) */
|
|
||||||
return (int)gz_write(state, buf, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, z_size_t nitems,
|
|
||||||
gzFile file) {
|
|
||||||
z_size_t len;
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return 0;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* check that we're writing and that there's no error */
|
|
||||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* compute bytes to read -- error on overflow */
|
|
||||||
len = nitems * size;
|
|
||||||
if (size && len / size != nitems) {
|
|
||||||
gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* write len bytes to buf, return the number of full items written */
|
|
||||||
return len ? gz_write(state, buf, len) / size : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzputc(gzFile file, int c) {
|
|
||||||
unsigned have;
|
|
||||||
unsigned char buf[1];
|
|
||||||
gz_statep state;
|
|
||||||
z_streamp strm;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return -1;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
strm = &(state->strm);
|
|
||||||
|
|
||||||
/* check that we're writing and that there's no error */
|
|
||||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* check for seek request */
|
|
||||||
if (state->seek) {
|
|
||||||
state->seek = 0;
|
|
||||||
if (gz_zero(state, state->skip) == -1)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* try writing to input buffer for speed (state->size == 0 if buffer not
|
|
||||||
initialized) */
|
|
||||||
if (state->size) {
|
|
||||||
if (strm->avail_in == 0)
|
|
||||||
strm->next_in = state->in;
|
|
||||||
have = (unsigned)((strm->next_in + strm->avail_in) - state->in);
|
|
||||||
if (have < state->size) {
|
|
||||||
state->in[have] = (unsigned char)c;
|
|
||||||
strm->avail_in++;
|
|
||||||
state->x.pos++;
|
|
||||||
return c & 0xff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* no room in buffer or not initialized, use gz_write() */
|
|
||||||
buf[0] = (unsigned char)c;
|
|
||||||
if (gz_write(state, buf, 1) != 1)
|
|
||||||
return -1;
|
|
||||||
return c & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzputs(gzFile file, const char *s) {
|
|
||||||
z_size_t len, put;
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return -1;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* check that we're writing and that there's no error */
|
|
||||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* write string */
|
|
||||||
len = strlen(s);
|
|
||||||
if ((int)len < 0 || (unsigned)len != len) {
|
|
||||||
gz_error(state, Z_STREAM_ERROR, "string length does not fit in int");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
put = gz_write(state, s, len);
|
|
||||||
return put < len ? -1 : (int)len;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) {
|
|
||||||
int len;
|
|
||||||
unsigned left;
|
|
||||||
char *next;
|
|
||||||
gz_statep state;
|
|
||||||
z_streamp strm;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
strm = &(state->strm);
|
|
||||||
|
|
||||||
/* check that we're writing and that there's no error */
|
|
||||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
|
|
||||||
/* make sure we have some buffer space */
|
|
||||||
if (state->size == 0 && gz_init(state) == -1)
|
|
||||||
return state->err;
|
|
||||||
|
|
||||||
/* check for seek request */
|
|
||||||
if (state->seek) {
|
|
||||||
state->seek = 0;
|
|
||||||
if (gz_zero(state, state->skip) == -1)
|
|
||||||
return state->err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* do the printf() into the input buffer, put length in len -- the input
|
|
||||||
buffer is double-sized just for this function, so there is guaranteed to
|
|
||||||
be state->size bytes available after the current contents */
|
|
||||||
if (strm->avail_in == 0)
|
|
||||||
strm->next_in = state->in;
|
|
||||||
next = (char *)(state->in + (strm->next_in - state->in) + strm->avail_in);
|
|
||||||
next[state->size - 1] = 0;
|
|
||||||
#ifdef NO_vsnprintf
|
|
||||||
# ifdef HAS_vsprintf_void
|
|
||||||
(void)vsprintf(next, format, va);
|
|
||||||
for (len = 0; len < state->size; len++)
|
|
||||||
if (next[len] == 0) break;
|
|
||||||
# else
|
|
||||||
len = vsprintf(next, format, va);
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# ifdef HAS_vsnprintf_void
|
|
||||||
(void)vsnprintf(next, state->size, format, va);
|
|
||||||
len = strlen(next);
|
|
||||||
# else
|
|
||||||
len = vsnprintf(next, state->size, format, va);
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* check that printf() results fit in buffer */
|
|
||||||
if (len == 0 || (unsigned)len >= state->size || next[state->size - 1] != 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* update buffer and position, compress first half if past that */
|
|
||||||
strm->avail_in += (unsigned)len;
|
|
||||||
state->x.pos += len;
|
|
||||||
if (strm->avail_in >= state->size) {
|
|
||||||
left = strm->avail_in - state->size;
|
|
||||||
strm->avail_in = state->size;
|
|
||||||
if (gz_comp(state, Z_NO_FLUSH) == -1)
|
|
||||||
return state->err;
|
|
||||||
memmove(state->in, state->in + state->size, left);
|
|
||||||
strm->next_in = state->in;
|
|
||||||
strm->avail_in = left;
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) {
|
|
||||||
va_list va;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
va_start(va, format);
|
|
||||||
ret = gzvprintf(file, format, va);
|
|
||||||
va_end(va);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* !STDC && !Z_HAVE_STDARG_H */
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORTVA gzprintf(gzFile file, const char *format, int a1, int a2, int a3,
|
|
||||||
int a4, int a5, int a6, int a7, int a8, int a9, int a10,
|
|
||||||
int a11, int a12, int a13, int a14, int a15, int a16,
|
|
||||||
int a17, int a18, int a19, int a20) {
|
|
||||||
unsigned len, left;
|
|
||||||
char *next;
|
|
||||||
gz_statep state;
|
|
||||||
z_streamp strm;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
strm = &(state->strm);
|
|
||||||
|
|
||||||
/* check that can really pass pointer in ints */
|
|
||||||
if (sizeof(int) != sizeof(void *))
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
|
|
||||||
/* check that we're writing and that there's no error */
|
|
||||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
|
|
||||||
/* make sure we have some buffer space */
|
|
||||||
if (state->size == 0 && gz_init(state) == -1)
|
|
||||||
return state->error;
|
|
||||||
|
|
||||||
/* check for seek request */
|
|
||||||
if (state->seek) {
|
|
||||||
state->seek = 0;
|
|
||||||
if (gz_zero(state, state->skip) == -1)
|
|
||||||
return state->error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* do the printf() into the input buffer, put length in len -- the input
|
|
||||||
buffer is double-sized just for this function, so there is guaranteed to
|
|
||||||
be state->size bytes available after the current contents */
|
|
||||||
if (strm->avail_in == 0)
|
|
||||||
strm->next_in = state->in;
|
|
||||||
next = (char *)(strm->next_in + strm->avail_in);
|
|
||||||
next[state->size - 1] = 0;
|
|
||||||
#ifdef NO_snprintf
|
|
||||||
# ifdef HAS_sprintf_void
|
|
||||||
sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12,
|
|
||||||
a13, a14, a15, a16, a17, a18, a19, a20);
|
|
||||||
for (len = 0; len < size; len++)
|
|
||||||
if (next[len] == 0)
|
|
||||||
break;
|
|
||||||
# else
|
|
||||||
len = sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
|
|
||||||
a12, a13, a14, a15, a16, a17, a18, a19, a20);
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# ifdef HAS_snprintf_void
|
|
||||||
snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9,
|
|
||||||
a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
|
|
||||||
len = strlen(next);
|
|
||||||
# else
|
|
||||||
len = snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8,
|
|
||||||
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* check that printf() results fit in buffer */
|
|
||||||
if (len == 0 || len >= state->size || next[state->size - 1] != 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* update buffer and position, compress first half if past that */
|
|
||||||
strm->avail_in += len;
|
|
||||||
state->x.pos += len;
|
|
||||||
if (strm->avail_in >= state->size) {
|
|
||||||
left = strm->avail_in - state->size;
|
|
||||||
strm->avail_in = state->size;
|
|
||||||
if (gz_comp(state, Z_NO_FLUSH) == -1)
|
|
||||||
return state->err;
|
|
||||||
memmove(state->in, state->in + state->size, left);
|
|
||||||
strm->next_in = state->in;
|
|
||||||
strm->avail_in = left;
|
|
||||||
}
|
|
||||||
return (int)len;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzflush(gzFile file, int flush) {
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* check that we're writing and that there's no error */
|
|
||||||
if (state->mode != GZ_WRITE || state->err != Z_OK)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
|
|
||||||
/* check flush parameter */
|
|
||||||
if (flush < 0 || flush > Z_FINISH)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
|
|
||||||
/* check for seek request */
|
|
||||||
if (state->seek) {
|
|
||||||
state->seek = 0;
|
|
||||||
if (gz_zero(state, state->skip) == -1)
|
|
||||||
return state->err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* compress remaining data with requested flush */
|
|
||||||
(void)gz_comp(state, flush);
|
|
||||||
return state->err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzsetparams(gzFile file, int level, int strategy) {
|
|
||||||
gz_statep state;
|
|
||||||
z_streamp strm;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
strm = &(state->strm);
|
|
||||||
|
|
||||||
/* check that we're writing and that there's no error */
|
|
||||||
if (state->mode != GZ_WRITE || state->err != Z_OK || state->direct)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
|
|
||||||
/* if no change is requested, then do nothing */
|
|
||||||
if (level == state->level && strategy == state->strategy)
|
|
||||||
return Z_OK;
|
|
||||||
|
|
||||||
/* check for seek request */
|
|
||||||
if (state->seek) {
|
|
||||||
state->seek = 0;
|
|
||||||
if (gz_zero(state, state->skip) == -1)
|
|
||||||
return state->err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* change compression parameters for subsequent input */
|
|
||||||
if (state->size) {
|
|
||||||
/* flush previous input with previous parameters before changing */
|
|
||||||
if (strm->avail_in && gz_comp(state, Z_BLOCK) == -1)
|
|
||||||
return state->err;
|
|
||||||
deflateParams(strm, level, strategy);
|
|
||||||
}
|
|
||||||
state->level = level;
|
|
||||||
state->strategy = strategy;
|
|
||||||
return Z_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- see zlib.h -- */
|
|
||||||
int ZEXPORT gzclose_w(gzFile file) {
|
|
||||||
int ret = Z_OK;
|
|
||||||
gz_statep state;
|
|
||||||
|
|
||||||
/* get internal structure */
|
|
||||||
if (file == NULL)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
state = (gz_statep)file;
|
|
||||||
|
|
||||||
/* check that we're writing */
|
|
||||||
if (state->mode != GZ_WRITE)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
|
|
||||||
/* check for seek request */
|
|
||||||
if (state->seek) {
|
|
||||||
state->seek = 0;
|
|
||||||
if (gz_zero(state, state->skip) == -1)
|
|
||||||
ret = state->err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* flush, free memory, and close file */
|
|
||||||
if (gz_comp(state, Z_FINISH) == -1)
|
|
||||||
ret = state->err;
|
|
||||||
if (state->size) {
|
|
||||||
if (!state->direct) {
|
|
||||||
(void)deflateEnd(&(state->strm));
|
|
||||||
free(state->out);
|
|
||||||
}
|
|
||||||
free(state->in);
|
|
||||||
}
|
|
||||||
gz_error(state, Z_OK, NULL);
|
|
||||||
free(state->path);
|
|
||||||
if (close(state->fd) == -1)
|
|
||||||
ret = Z_ERRNO;
|
|
||||||
free(state);
|
|
||||||
return ret;
|
|
||||||
}
|
|
|
@ -1,628 +0,0 @@
|
||||||
/* infback.c -- inflate using a call-back interface
|
|
||||||
* Copyright (C) 1995-2022 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This code is largely copied from inflate.c. Normally either infback.o or
|
|
||||||
inflate.o would be linked into an application--not both. The interface
|
|
||||||
with inffast.c is retained so that optimized assembler-coded versions of
|
|
||||||
inflate_fast() can be used with either inflate.c or infback.c.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "zutil.h"
|
|
||||||
#include "inftrees.h"
|
|
||||||
#include "inflate.h"
|
|
||||||
#include "inffast.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
strm provides memory allocation functions in zalloc and zfree, or
|
|
||||||
Z_NULL to use the library memory allocation functions.
|
|
||||||
|
|
||||||
windowBits is in the range 8..15, and window is a user-supplied
|
|
||||||
window and output buffer that is 2**windowBits bytes.
|
|
||||||
*/
|
|
||||||
int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits,
|
|
||||||
unsigned char FAR *window, const char *version,
|
|
||||||
int stream_size) {
|
|
||||||
struct inflate_state FAR *state;
|
|
||||||
|
|
||||||
if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
|
|
||||||
stream_size != (int)(sizeof(z_stream)))
|
|
||||||
return Z_VERSION_ERROR;
|
|
||||||
if (strm == Z_NULL || window == Z_NULL ||
|
|
||||||
windowBits < 8 || windowBits > 15)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
strm->msg = Z_NULL; /* in case we return an error */
|
|
||||||
if (strm->zalloc == (alloc_func)0) {
|
|
||||||
#ifdef Z_SOLO
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
#else
|
|
||||||
strm->zalloc = zcalloc;
|
|
||||||
strm->opaque = (voidpf)0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (strm->zfree == (free_func)0)
|
|
||||||
#ifdef Z_SOLO
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
#else
|
|
||||||
strm->zfree = zcfree;
|
|
||||||
#endif
|
|
||||||
state = (struct inflate_state FAR *)ZALLOC(strm, 1,
|
|
||||||
sizeof(struct inflate_state));
|
|
||||||
if (state == Z_NULL) return Z_MEM_ERROR;
|
|
||||||
Tracev((stderr, "inflate: allocated\n"));
|
|
||||||
strm->state = (struct internal_state FAR *)state;
|
|
||||||
state->dmax = 32768U;
|
|
||||||
state->wbits = (uInt)windowBits;
|
|
||||||
state->wsize = 1U << windowBits;
|
|
||||||
state->window = window;
|
|
||||||
state->wnext = 0;
|
|
||||||
state->whave = 0;
|
|
||||||
state->sane = 1;
|
|
||||||
return Z_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Return state with length and distance decoding tables and index sizes set to
|
|
||||||
fixed code decoding. Normally this returns fixed tables from inffixed.h.
|
|
||||||
If BUILDFIXED is defined, then instead this routine builds the tables the
|
|
||||||
first time it's called, and returns those tables the first time and
|
|
||||||
thereafter. This reduces the size of the code by about 2K bytes, in
|
|
||||||
exchange for a little execution time. However, BUILDFIXED should not be
|
|
||||||
used for threaded applications, since the rewriting of the tables and virgin
|
|
||||||
may not be thread-safe.
|
|
||||||
*/
|
|
||||||
local void fixedtables(struct inflate_state FAR *state) {
|
|
||||||
#ifdef BUILDFIXED
|
|
||||||
static int virgin = 1;
|
|
||||||
static code *lenfix, *distfix;
|
|
||||||
static code fixed[544];
|
|
||||||
|
|
||||||
/* build fixed huffman tables if first call (may not be thread safe) */
|
|
||||||
if (virgin) {
|
|
||||||
unsigned sym, bits;
|
|
||||||
static code *next;
|
|
||||||
|
|
||||||
/* literal/length table */
|
|
||||||
sym = 0;
|
|
||||||
while (sym < 144) state->lens[sym++] = 8;
|
|
||||||
while (sym < 256) state->lens[sym++] = 9;
|
|
||||||
while (sym < 280) state->lens[sym++] = 7;
|
|
||||||
while (sym < 288) state->lens[sym++] = 8;
|
|
||||||
next = fixed;
|
|
||||||
lenfix = next;
|
|
||||||
bits = 9;
|
|
||||||
inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
|
|
||||||
|
|
||||||
/* distance table */
|
|
||||||
sym = 0;
|
|
||||||
while (sym < 32) state->lens[sym++] = 5;
|
|
||||||
distfix = next;
|
|
||||||
bits = 5;
|
|
||||||
inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
|
|
||||||
|
|
||||||
/* do this just once */
|
|
||||||
virgin = 0;
|
|
||||||
}
|
|
||||||
#else /* !BUILDFIXED */
|
|
||||||
# include "inffixed.h"
|
|
||||||
#endif /* BUILDFIXED */
|
|
||||||
state->lencode = lenfix;
|
|
||||||
state->lenbits = 9;
|
|
||||||
state->distcode = distfix;
|
|
||||||
state->distbits = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Macros for inflateBack(): */
|
|
||||||
|
|
||||||
/* Load returned state from inflate_fast() */
|
|
||||||
#define LOAD() \
|
|
||||||
do { \
|
|
||||||
put = strm->next_out; \
|
|
||||||
left = strm->avail_out; \
|
|
||||||
next = strm->next_in; \
|
|
||||||
have = strm->avail_in; \
|
|
||||||
hold = state->hold; \
|
|
||||||
bits = state->bits; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Set state from registers for inflate_fast() */
|
|
||||||
#define RESTORE() \
|
|
||||||
do { \
|
|
||||||
strm->next_out = put; \
|
|
||||||
strm->avail_out = left; \
|
|
||||||
strm->next_in = next; \
|
|
||||||
strm->avail_in = have; \
|
|
||||||
state->hold = hold; \
|
|
||||||
state->bits = bits; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Clear the input bit accumulator */
|
|
||||||
#define INITBITS() \
|
|
||||||
do { \
|
|
||||||
hold = 0; \
|
|
||||||
bits = 0; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Assure that some input is available. If input is requested, but denied,
|
|
||||||
then return a Z_BUF_ERROR from inflateBack(). */
|
|
||||||
#define PULL() \
|
|
||||||
do { \
|
|
||||||
if (have == 0) { \
|
|
||||||
have = in(in_desc, &next); \
|
|
||||||
if (have == 0) { \
|
|
||||||
next = Z_NULL; \
|
|
||||||
ret = Z_BUF_ERROR; \
|
|
||||||
goto inf_leave; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Get a byte of input into the bit accumulator, or return from inflateBack()
|
|
||||||
with an error if there is no input available. */
|
|
||||||
#define PULLBYTE() \
|
|
||||||
do { \
|
|
||||||
PULL(); \
|
|
||||||
have--; \
|
|
||||||
hold += (unsigned long)(*next++) << bits; \
|
|
||||||
bits += 8; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Assure that there are at least n bits in the bit accumulator. If there is
|
|
||||||
not enough available input to do that, then return from inflateBack() with
|
|
||||||
an error. */
|
|
||||||
#define NEEDBITS(n) \
|
|
||||||
do { \
|
|
||||||
while (bits < (unsigned)(n)) \
|
|
||||||
PULLBYTE(); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Return the low n bits of the bit accumulator (n < 16) */
|
|
||||||
#define BITS(n) \
|
|
||||||
((unsigned)hold & ((1U << (n)) - 1))
|
|
||||||
|
|
||||||
/* Remove n bits from the bit accumulator */
|
|
||||||
#define DROPBITS(n) \
|
|
||||||
do { \
|
|
||||||
hold >>= (n); \
|
|
||||||
bits -= (unsigned)(n); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Remove zero to seven bits as needed to go to a byte boundary */
|
|
||||||
#define BYTEBITS() \
|
|
||||||
do { \
|
|
||||||
hold >>= bits & 7; \
|
|
||||||
bits -= bits & 7; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Assure that some output space is available, by writing out the window
|
|
||||||
if it's full. If the write fails, return from inflateBack() with a
|
|
||||||
Z_BUF_ERROR. */
|
|
||||||
#define ROOM() \
|
|
||||||
do { \
|
|
||||||
if (left == 0) { \
|
|
||||||
put = state->window; \
|
|
||||||
left = state->wsize; \
|
|
||||||
state->whave = left; \
|
|
||||||
if (out(out_desc, put, left)) { \
|
|
||||||
ret = Z_BUF_ERROR; \
|
|
||||||
goto inf_leave; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
strm provides the memory allocation functions and window buffer on input,
|
|
||||||
and provides information on the unused input on return. For Z_DATA_ERROR
|
|
||||||
returns, strm will also provide an error message.
|
|
||||||
|
|
||||||
in() and out() are the call-back input and output functions. When
|
|
||||||
inflateBack() needs more input, it calls in(). When inflateBack() has
|
|
||||||
filled the window with output, or when it completes with data in the
|
|
||||||
window, it calls out() to write out the data. The application must not
|
|
||||||
change the provided input until in() is called again or inflateBack()
|
|
||||||
returns. The application must not change the window/output buffer until
|
|
||||||
inflateBack() returns.
|
|
||||||
|
|
||||||
in() and out() are called with a descriptor parameter provided in the
|
|
||||||
inflateBack() call. This parameter can be a structure that provides the
|
|
||||||
information required to do the read or write, as well as accumulated
|
|
||||||
information on the input and output such as totals and check values.
|
|
||||||
|
|
||||||
in() should return zero on failure. out() should return non-zero on
|
|
||||||
failure. If either in() or out() fails, than inflateBack() returns a
|
|
||||||
Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it
|
|
||||||
was in() or out() that caused in the error. Otherwise, inflateBack()
|
|
||||||
returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
|
|
||||||
error, or Z_MEM_ERROR if it could not allocate memory for the state.
|
|
||||||
inflateBack() can also return Z_STREAM_ERROR if the input parameters
|
|
||||||
are not correct, i.e. strm is Z_NULL or the state was not initialized.
|
|
||||||
*/
|
|
||||||
int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc,
|
|
||||||
out_func out, void FAR *out_desc) {
|
|
||||||
struct inflate_state FAR *state;
|
|
||||||
z_const unsigned char FAR *next; /* next input */
|
|
||||||
unsigned char FAR *put; /* next output */
|
|
||||||
unsigned have, left; /* available input and output */
|
|
||||||
unsigned long hold; /* bit buffer */
|
|
||||||
unsigned bits; /* bits in bit buffer */
|
|
||||||
unsigned copy; /* number of stored or match bytes to copy */
|
|
||||||
unsigned char FAR *from; /* where to copy match bytes from */
|
|
||||||
code here; /* current decoding table entry */
|
|
||||||
code last; /* parent table entry */
|
|
||||||
unsigned len; /* length to copy for repeats, bits to drop */
|
|
||||||
int ret; /* return code */
|
|
||||||
static const unsigned short order[19] = /* permutation of code lengths */
|
|
||||||
{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
|
|
||||||
|
|
||||||
/* Check that the strm exists and that the state was initialized */
|
|
||||||
if (strm == Z_NULL || strm->state == Z_NULL)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
state = (struct inflate_state FAR *)strm->state;
|
|
||||||
|
|
||||||
/* Reset the state */
|
|
||||||
strm->msg = Z_NULL;
|
|
||||||
state->mode = TYPE;
|
|
||||||
state->last = 0;
|
|
||||||
state->whave = 0;
|
|
||||||
next = strm->next_in;
|
|
||||||
have = next != Z_NULL ? strm->avail_in : 0;
|
|
||||||
hold = 0;
|
|
||||||
bits = 0;
|
|
||||||
put = state->window;
|
|
||||||
left = state->wsize;
|
|
||||||
|
|
||||||
/* Inflate until end of block marked as last */
|
|
||||||
for (;;)
|
|
||||||
switch (state->mode) {
|
|
||||||
case TYPE:
|
|
||||||
/* determine and dispatch block type */
|
|
||||||
if (state->last) {
|
|
||||||
BYTEBITS();
|
|
||||||
state->mode = DONE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
NEEDBITS(3);
|
|
||||||
state->last = BITS(1);
|
|
||||||
DROPBITS(1);
|
|
||||||
switch (BITS(2)) {
|
|
||||||
case 0: /* stored block */
|
|
||||||
Tracev((stderr, "inflate: stored block%s\n",
|
|
||||||
state->last ? " (last)" : ""));
|
|
||||||
state->mode = STORED;
|
|
||||||
break;
|
|
||||||
case 1: /* fixed block */
|
|
||||||
fixedtables(state);
|
|
||||||
Tracev((stderr, "inflate: fixed codes block%s\n",
|
|
||||||
state->last ? " (last)" : ""));
|
|
||||||
state->mode = LEN; /* decode codes */
|
|
||||||
break;
|
|
||||||
case 2: /* dynamic block */
|
|
||||||
Tracev((stderr, "inflate: dynamic codes block%s\n",
|
|
||||||
state->last ? " (last)" : ""));
|
|
||||||
state->mode = TABLE;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
strm->msg = (char *)"invalid block type";
|
|
||||||
state->mode = BAD;
|
|
||||||
}
|
|
||||||
DROPBITS(2);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STORED:
|
|
||||||
/* get and verify stored block length */
|
|
||||||
BYTEBITS(); /* go to byte boundary */
|
|
||||||
NEEDBITS(32);
|
|
||||||
if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
|
|
||||||
strm->msg = (char *)"invalid stored block lengths";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
state->length = (unsigned)hold & 0xffff;
|
|
||||||
Tracev((stderr, "inflate: stored length %u\n",
|
|
||||||
state->length));
|
|
||||||
INITBITS();
|
|
||||||
|
|
||||||
/* copy stored block from input to output */
|
|
||||||
while (state->length != 0) {
|
|
||||||
copy = state->length;
|
|
||||||
PULL();
|
|
||||||
ROOM();
|
|
||||||
if (copy > have) copy = have;
|
|
||||||
if (copy > left) copy = left;
|
|
||||||
zmemcpy(put, next, copy);
|
|
||||||
have -= copy;
|
|
||||||
next += copy;
|
|
||||||
left -= copy;
|
|
||||||
put += copy;
|
|
||||||
state->length -= copy;
|
|
||||||
}
|
|
||||||
Tracev((stderr, "inflate: stored end\n"));
|
|
||||||
state->mode = TYPE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TABLE:
|
|
||||||
/* get dynamic table entries descriptor */
|
|
||||||
NEEDBITS(14);
|
|
||||||
state->nlen = BITS(5) + 257;
|
|
||||||
DROPBITS(5);
|
|
||||||
state->ndist = BITS(5) + 1;
|
|
||||||
DROPBITS(5);
|
|
||||||
state->ncode = BITS(4) + 4;
|
|
||||||
DROPBITS(4);
|
|
||||||
#ifndef PKZIP_BUG_WORKAROUND
|
|
||||||
if (state->nlen > 286 || state->ndist > 30) {
|
|
||||||
strm->msg = (char *)"too many length or distance symbols";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
Tracev((stderr, "inflate: table sizes ok\n"));
|
|
||||||
|
|
||||||
/* get code length code lengths (not a typo) */
|
|
||||||
state->have = 0;
|
|
||||||
while (state->have < state->ncode) {
|
|
||||||
NEEDBITS(3);
|
|
||||||
state->lens[order[state->have++]] = (unsigned short)BITS(3);
|
|
||||||
DROPBITS(3);
|
|
||||||
}
|
|
||||||
while (state->have < 19)
|
|
||||||
state->lens[order[state->have++]] = 0;
|
|
||||||
state->next = state->codes;
|
|
||||||
state->lencode = (code const FAR *)(state->next);
|
|
||||||
state->lenbits = 7;
|
|
||||||
ret = inflate_table(CODES, state->lens, 19, &(state->next),
|
|
||||||
&(state->lenbits), state->work);
|
|
||||||
if (ret) {
|
|
||||||
strm->msg = (char *)"invalid code lengths set";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Tracev((stderr, "inflate: code lengths ok\n"));
|
|
||||||
|
|
||||||
/* get length and distance code code lengths */
|
|
||||||
state->have = 0;
|
|
||||||
while (state->have < state->nlen + state->ndist) {
|
|
||||||
for (;;) {
|
|
||||||
here = state->lencode[BITS(state->lenbits)];
|
|
||||||
if ((unsigned)(here.bits) <= bits) break;
|
|
||||||
PULLBYTE();
|
|
||||||
}
|
|
||||||
if (here.val < 16) {
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
state->lens[state->have++] = here.val;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (here.val == 16) {
|
|
||||||
NEEDBITS(here.bits + 2);
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
if (state->have == 0) {
|
|
||||||
strm->msg = (char *)"invalid bit length repeat";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
len = (unsigned)(state->lens[state->have - 1]);
|
|
||||||
copy = 3 + BITS(2);
|
|
||||||
DROPBITS(2);
|
|
||||||
}
|
|
||||||
else if (here.val == 17) {
|
|
||||||
NEEDBITS(here.bits + 3);
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
len = 0;
|
|
||||||
copy = 3 + BITS(3);
|
|
||||||
DROPBITS(3);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
NEEDBITS(here.bits + 7);
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
len = 0;
|
|
||||||
copy = 11 + BITS(7);
|
|
||||||
DROPBITS(7);
|
|
||||||
}
|
|
||||||
if (state->have + copy > state->nlen + state->ndist) {
|
|
||||||
strm->msg = (char *)"invalid bit length repeat";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while (copy--)
|
|
||||||
state->lens[state->have++] = (unsigned short)len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* handle error breaks in while */
|
|
||||||
if (state->mode == BAD) break;
|
|
||||||
|
|
||||||
/* check for end-of-block code (better have one) */
|
|
||||||
if (state->lens[256] == 0) {
|
|
||||||
strm->msg = (char *)"invalid code -- missing end-of-block";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* build code tables -- note: do not change the lenbits or distbits
|
|
||||||
values here (9 and 6) without reading the comments in inftrees.h
|
|
||||||
concerning the ENOUGH constants, which depend on those values */
|
|
||||||
state->next = state->codes;
|
|
||||||
state->lencode = (code const FAR *)(state->next);
|
|
||||||
state->lenbits = 9;
|
|
||||||
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
|
|
||||||
&(state->lenbits), state->work);
|
|
||||||
if (ret) {
|
|
||||||
strm->msg = (char *)"invalid literal/lengths set";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
state->distcode = (code const FAR *)(state->next);
|
|
||||||
state->distbits = 6;
|
|
||||||
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
|
|
||||||
&(state->next), &(state->distbits), state->work);
|
|
||||||
if (ret) {
|
|
||||||
strm->msg = (char *)"invalid distances set";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Tracev((stderr, "inflate: codes ok\n"));
|
|
||||||
state->mode = LEN;
|
|
||||||
/* fallthrough */
|
|
||||||
|
|
||||||
case LEN:
|
|
||||||
/* use inflate_fast() if we have enough input and output */
|
|
||||||
if (have >= 6 && left >= 258) {
|
|
||||||
RESTORE();
|
|
||||||
if (state->whave < state->wsize)
|
|
||||||
state->whave = state->wsize - left;
|
|
||||||
inflate_fast(strm, state->wsize);
|
|
||||||
LOAD();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get a literal, length, or end-of-block code */
|
|
||||||
for (;;) {
|
|
||||||
here = state->lencode[BITS(state->lenbits)];
|
|
||||||
if ((unsigned)(here.bits) <= bits) break;
|
|
||||||
PULLBYTE();
|
|
||||||
}
|
|
||||||
if (here.op && (here.op & 0xf0) == 0) {
|
|
||||||
last = here;
|
|
||||||
for (;;) {
|
|
||||||
here = state->lencode[last.val +
|
|
||||||
(BITS(last.bits + last.op) >> last.bits)];
|
|
||||||
if ((unsigned)(last.bits + here.bits) <= bits) break;
|
|
||||||
PULLBYTE();
|
|
||||||
}
|
|
||||||
DROPBITS(last.bits);
|
|
||||||
}
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
state->length = (unsigned)here.val;
|
|
||||||
|
|
||||||
/* process literal */
|
|
||||||
if (here.op == 0) {
|
|
||||||
Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
|
|
||||||
"inflate: literal '%c'\n" :
|
|
||||||
"inflate: literal 0x%02x\n", here.val));
|
|
||||||
ROOM();
|
|
||||||
*put++ = (unsigned char)(state->length);
|
|
||||||
left--;
|
|
||||||
state->mode = LEN;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process end of block */
|
|
||||||
if (here.op & 32) {
|
|
||||||
Tracevv((stderr, "inflate: end of block\n"));
|
|
||||||
state->mode = TYPE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* invalid code */
|
|
||||||
if (here.op & 64) {
|
|
||||||
strm->msg = (char *)"invalid literal/length code";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* length code -- get extra bits, if any */
|
|
||||||
state->extra = (unsigned)(here.op) & 15;
|
|
||||||
if (state->extra != 0) {
|
|
||||||
NEEDBITS(state->extra);
|
|
||||||
state->length += BITS(state->extra);
|
|
||||||
DROPBITS(state->extra);
|
|
||||||
}
|
|
||||||
Tracevv((stderr, "inflate: length %u\n", state->length));
|
|
||||||
|
|
||||||
/* get distance code */
|
|
||||||
for (;;) {
|
|
||||||
here = state->distcode[BITS(state->distbits)];
|
|
||||||
if ((unsigned)(here.bits) <= bits) break;
|
|
||||||
PULLBYTE();
|
|
||||||
}
|
|
||||||
if ((here.op & 0xf0) == 0) {
|
|
||||||
last = here;
|
|
||||||
for (;;) {
|
|
||||||
here = state->distcode[last.val +
|
|
||||||
(BITS(last.bits + last.op) >> last.bits)];
|
|
||||||
if ((unsigned)(last.bits + here.bits) <= bits) break;
|
|
||||||
PULLBYTE();
|
|
||||||
}
|
|
||||||
DROPBITS(last.bits);
|
|
||||||
}
|
|
||||||
DROPBITS(here.bits);
|
|
||||||
if (here.op & 64) {
|
|
||||||
strm->msg = (char *)"invalid distance code";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
state->offset = (unsigned)here.val;
|
|
||||||
|
|
||||||
/* get distance extra bits, if any */
|
|
||||||
state->extra = (unsigned)(here.op) & 15;
|
|
||||||
if (state->extra != 0) {
|
|
||||||
NEEDBITS(state->extra);
|
|
||||||
state->offset += BITS(state->extra);
|
|
||||||
DROPBITS(state->extra);
|
|
||||||
}
|
|
||||||
if (state->offset > state->wsize - (state->whave < state->wsize ?
|
|
||||||
left : 0)) {
|
|
||||||
strm->msg = (char *)"invalid distance too far back";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Tracevv((stderr, "inflate: distance %u\n", state->offset));
|
|
||||||
|
|
||||||
/* copy match from window to output */
|
|
||||||
do {
|
|
||||||
ROOM();
|
|
||||||
copy = state->wsize - state->offset;
|
|
||||||
if (copy < left) {
|
|
||||||
from = put + copy;
|
|
||||||
copy = left - copy;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
from = put - state->offset;
|
|
||||||
copy = left;
|
|
||||||
}
|
|
||||||
if (copy > state->length) copy = state->length;
|
|
||||||
state->length -= copy;
|
|
||||||
left -= copy;
|
|
||||||
do {
|
|
||||||
*put++ = *from++;
|
|
||||||
} while (--copy);
|
|
||||||
} while (state->length != 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DONE:
|
|
||||||
/* inflate stream terminated properly */
|
|
||||||
ret = Z_STREAM_END;
|
|
||||||
goto inf_leave;
|
|
||||||
|
|
||||||
case BAD:
|
|
||||||
ret = Z_DATA_ERROR;
|
|
||||||
goto inf_leave;
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* can't happen, but makes compilers happy */
|
|
||||||
ret = Z_STREAM_ERROR;
|
|
||||||
goto inf_leave;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write leftover output and return unused input */
|
|
||||||
inf_leave:
|
|
||||||
if (left < state->wsize) {
|
|
||||||
if (out(out_desc, state->window, state->wsize - left) &&
|
|
||||||
ret == Z_STREAM_END)
|
|
||||||
ret = Z_BUF_ERROR;
|
|
||||||
}
|
|
||||||
strm->next_in = next;
|
|
||||||
strm->avail_in = have;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ZEXPORT inflateBackEnd(z_streamp strm) {
|
|
||||||
if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
|
|
||||||
return Z_STREAM_ERROR;
|
|
||||||
ZFREE(strm, strm->state);
|
|
||||||
strm->state = Z_NULL;
|
|
||||||
Tracev((stderr, "inflate: end\n"));
|
|
||||||
return Z_OK;
|
|
||||||
}
|
|
|
@ -1,320 +0,0 @@
|
||||||
/* inffast.c -- fast decoding
|
|
||||||
* Copyright (C) 1995-2017 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "zutil.h"
|
|
||||||
#include "inftrees.h"
|
|
||||||
#include "inflate.h"
|
|
||||||
#include "inffast.h"
|
|
||||||
|
|
||||||
#ifdef ASMINF
|
|
||||||
# pragma message("Assembler code may have bugs -- use at your own risk")
|
|
||||||
#else
|
|
||||||
|
|
||||||
/*
|
|
||||||
Decode literal, length, and distance codes and write out the resulting
|
|
||||||
literal and match bytes until either not enough input or output is
|
|
||||||
available, an end-of-block is encountered, or a data error is encountered.
|
|
||||||
When large enough input and output buffers are supplied to inflate(), for
|
|
||||||
example, a 16K input buffer and a 64K output buffer, more than 95% of the
|
|
||||||
inflate execution time is spent in this routine.
|
|
||||||
|
|
||||||
Entry assumptions:
|
|
||||||
|
|
||||||
state->mode == LEN
|
|
||||||
strm->avail_in >= 6
|
|
||||||
strm->avail_out >= 258
|
|
||||||
start >= strm->avail_out
|
|
||||||
state->bits < 8
|
|
||||||
|
|
||||||
On return, state->mode is one of:
|
|
||||||
|
|
||||||
LEN -- ran out of enough output space or enough available input
|
|
||||||
TYPE -- reached end of block code, inflate() to interpret next block
|
|
||||||
BAD -- error in block data
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
|
|
||||||
- The maximum input bits used by a length/distance pair is 15 bits for the
|
|
||||||
length code, 5 bits for the length extra, 15 bits for the distance code,
|
|
||||||
and 13 bits for the distance extra. This totals 48 bits, or six bytes.
|
|
||||||
Therefore if strm->avail_in >= 6, then there is enough input to avoid
|
|
||||||
checking for available input while decoding.
|
|
||||||
|
|
||||||
- The maximum bytes that a single length/distance pair can output is 258
|
|
||||||
bytes, which is the maximum length that can be coded. inflate_fast()
|
|
||||||
requires strm->avail_out >= 258 for each loop to avoid checking for
|
|
||||||
output space.
|
|
||||||
*/
|
|
||||||
void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) {
|
|
||||||
struct inflate_state FAR *state;
|
|
||||||
z_const unsigned char FAR *in; /* local strm->next_in */
|
|
||||||
z_const unsigned char FAR *last; /* have enough input while in < last */
|
|
||||||
unsigned char FAR *out; /* local strm->next_out */
|
|
||||||
unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
|
|
||||||
unsigned char FAR *end; /* while out < end, enough space available */
|
|
||||||
#ifdef INFLATE_STRICT
|
|
||||||
unsigned dmax; /* maximum distance from zlib header */
|
|
||||||
#endif
|
|
||||||
unsigned wsize; /* window size or zero if not using window */
|
|
||||||
unsigned whave; /* valid bytes in the window */
|
|
||||||
unsigned wnext; /* window write index */
|
|
||||||
unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */
|
|
||||||
unsigned long hold; /* local strm->hold */
|
|
||||||
unsigned bits; /* local strm->bits */
|
|
||||||
code const FAR *lcode; /* local strm->lencode */
|
|
||||||
code const FAR *dcode; /* local strm->distcode */
|
|
||||||
unsigned lmask; /* mask for first level of length codes */
|
|
||||||
unsigned dmask; /* mask for first level of distance codes */
|
|
||||||
code const *here; /* retrieved table entry */
|
|
||||||
unsigned op; /* code bits, operation, extra bits, or */
|
|
||||||
/* window position, window bytes to copy */
|
|
||||||
unsigned len; /* match length, unused bytes */
|
|
||||||
unsigned dist; /* match distance */
|
|
||||||
unsigned char FAR *from; /* where to copy match from */
|
|
||||||
|
|
||||||
/* copy state to local variables */
|
|
||||||
state = (struct inflate_state FAR *)strm->state;
|
|
||||||
in = strm->next_in;
|
|
||||||
last = in + (strm->avail_in - 5);
|
|
||||||
out = strm->next_out;
|
|
||||||
beg = out - (start - strm->avail_out);
|
|
||||||
end = out + (strm->avail_out - 257);
|
|
||||||
#ifdef INFLATE_STRICT
|
|
||||||
dmax = state->dmax;
|
|
||||||
#endif
|
|
||||||
wsize = state->wsize;
|
|
||||||
whave = state->whave;
|
|
||||||
wnext = state->wnext;
|
|
||||||
window = state->window;
|
|
||||||
hold = state->hold;
|
|
||||||
bits = state->bits;
|
|
||||||
lcode = state->lencode;
|
|
||||||
dcode = state->distcode;
|
|
||||||
lmask = (1U << state->lenbits) - 1;
|
|
||||||
dmask = (1U << state->distbits) - 1;
|
|
||||||
|
|
||||||
/* decode literals and length/distances until end-of-block or not enough
|
|
||||||
input data or output space */
|
|
||||||
do {
|
|
||||||
if (bits < 15) {
|
|
||||||
hold += (unsigned long)(*in++) << bits;
|
|
||||||
bits += 8;
|
|
||||||
hold += (unsigned long)(*in++) << bits;
|
|
||||||
bits += 8;
|
|
||||||
}
|
|
||||||
here = lcode + (hold & lmask);
|
|
||||||
dolen:
|
|
||||||
op = (unsigned)(here->bits);
|
|
||||||
hold >>= op;
|
|
||||||
bits -= op;
|
|
||||||
op = (unsigned)(here->op);
|
|
||||||
if (op == 0) { /* literal */
|
|
||||||
Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ?
|
|
||||||
"inflate: literal '%c'\n" :
|
|
||||||
"inflate: literal 0x%02x\n", here->val));
|
|
||||||
*out++ = (unsigned char)(here->val);
|
|
||||||
}
|
|
||||||
else if (op & 16) { /* length base */
|
|
||||||
len = (unsigned)(here->val);
|
|
||||||
op &= 15; /* number of extra bits */
|
|
||||||
if (op) {
|
|
||||||
if (bits < op) {
|
|
||||||
hold += (unsigned long)(*in++) << bits;
|
|
||||||
bits += 8;
|
|
||||||
}
|
|
||||||
len += (unsigned)hold & ((1U << op) - 1);
|
|
||||||
hold >>= op;
|
|
||||||
bits -= op;
|
|
||||||
}
|
|
||||||
Tracevv((stderr, "inflate: length %u\n", len));
|
|
||||||
if (bits < 15) {
|
|
||||||
hold += (unsigned long)(*in++) << bits;
|
|
||||||
bits += 8;
|
|
||||||
hold += (unsigned long)(*in++) << bits;
|
|
||||||
bits += 8;
|
|
||||||
}
|
|
||||||
here = dcode + (hold & dmask);
|
|
||||||
dodist:
|
|
||||||
op = (unsigned)(here->bits);
|
|
||||||
hold >>= op;
|
|
||||||
bits -= op;
|
|
||||||
op = (unsigned)(here->op);
|
|
||||||
if (op & 16) { /* distance base */
|
|
||||||
dist = (unsigned)(here->val);
|
|
||||||
op &= 15; /* number of extra bits */
|
|
||||||
if (bits < op) {
|
|
||||||
hold += (unsigned long)(*in++) << bits;
|
|
||||||
bits += 8;
|
|
||||||
if (bits < op) {
|
|
||||||
hold += (unsigned long)(*in++) << bits;
|
|
||||||
bits += 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dist += (unsigned)hold & ((1U << op) - 1);
|
|
||||||
#ifdef INFLATE_STRICT
|
|
||||||
if (dist > dmax) {
|
|
||||||
strm->msg = (char *)"invalid distance too far back";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
hold >>= op;
|
|
||||||
bits -= op;
|
|
||||||
Tracevv((stderr, "inflate: distance %u\n", dist));
|
|
||||||
op = (unsigned)(out - beg); /* max distance in output */
|
|
||||||
if (dist > op) { /* see if copy from window */
|
|
||||||
op = dist - op; /* distance back in window */
|
|
||||||
if (op > whave) {
|
|
||||||
if (state->sane) {
|
|
||||||
strm->msg =
|
|
||||||
(char *)"invalid distance too far back";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
|
|
||||||
if (len <= op - whave) {
|
|
||||||
do {
|
|
||||||
*out++ = 0;
|
|
||||||
} while (--len);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
len -= op - whave;
|
|
||||||
do {
|
|
||||||
*out++ = 0;
|
|
||||||
} while (--op > whave);
|
|
||||||
if (op == 0) {
|
|
||||||
from = out - dist;
|
|
||||||
do {
|
|
||||||
*out++ = *from++;
|
|
||||||
} while (--len);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
from = window;
|
|
||||||
if (wnext == 0) { /* very common case */
|
|
||||||
from += wsize - op;
|
|
||||||
if (op < len) { /* some from window */
|
|
||||||
len -= op;
|
|
||||||
do {
|
|
||||||
*out++ = *from++;
|
|
||||||
} while (--op);
|
|
||||||
from = out - dist; /* rest from output */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (wnext < op) { /* wrap around window */
|
|
||||||
from += wsize + wnext - op;
|
|
||||||
op -= wnext;
|
|
||||||
if (op < len) { /* some from end of window */
|
|
||||||
len -= op;
|
|
||||||
do {
|
|
||||||
*out++ = *from++;
|
|
||||||
} while (--op);
|
|
||||||
from = window;
|
|
||||||
if (wnext < len) { /* some from start of window */
|
|
||||||
op = wnext;
|
|
||||||
len -= op;
|
|
||||||
do {
|
|
||||||
*out++ = *from++;
|
|
||||||
} while (--op);
|
|
||||||
from = out - dist; /* rest from output */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else { /* contiguous in window */
|
|
||||||
from += wnext - op;
|
|
||||||
if (op < len) { /* some from window */
|
|
||||||
len -= op;
|
|
||||||
do {
|
|
||||||
*out++ = *from++;
|
|
||||||
} while (--op);
|
|
||||||
from = out - dist; /* rest from output */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (len > 2) {
|
|
||||||
*out++ = *from++;
|
|
||||||
*out++ = *from++;
|
|
||||||
*out++ = *from++;
|
|
||||||
len -= 3;
|
|
||||||
}
|
|
||||||
if (len) {
|
|
||||||
*out++ = *from++;
|
|
||||||
if (len > 1)
|
|
||||||
*out++ = *from++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
from = out - dist; /* copy direct from output */
|
|
||||||
do { /* minimum length is three */
|
|
||||||
*out++ = *from++;
|
|
||||||
*out++ = *from++;
|
|
||||||
*out++ = *from++;
|
|
||||||
len -= 3;
|
|
||||||
} while (len > 2);
|
|
||||||
if (len) {
|
|
||||||
*out++ = *from++;
|
|
||||||
if (len > 1)
|
|
||||||
*out++ = *from++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((op & 64) == 0) { /* 2nd level distance code */
|
|
||||||
here = dcode + here->val + (hold & ((1U << op) - 1));
|
|
||||||
goto dodist;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
strm->msg = (char *)"invalid distance code";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((op & 64) == 0) { /* 2nd level length code */
|
|
||||||
here = lcode + here->val + (hold & ((1U << op) - 1));
|
|
||||||
goto dolen;
|
|
||||||
}
|
|
||||||
else if (op & 32) { /* end-of-block */
|
|
||||||
Tracevv((stderr, "inflate: end of block\n"));
|
|
||||||
state->mode = TYPE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
strm->msg = (char *)"invalid literal/length code";
|
|
||||||
state->mode = BAD;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while (in < last && out < end);
|
|
||||||
|
|
||||||
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */
|
|
||||||
len = bits >> 3;
|
|
||||||
in -= len;
|
|
||||||
bits -= len << 3;
|
|
||||||
hold &= (1U << bits) - 1;
|
|
||||||
|
|
||||||
/* update state and return */
|
|
||||||
strm->next_in = in;
|
|
||||||
strm->next_out = out;
|
|
||||||
strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
|
|
||||||
strm->avail_out = (unsigned)(out < end ?
|
|
||||||
257 + (end - out) : 257 - (out - end));
|
|
||||||
state->hold = hold;
|
|
||||||
state->bits = bits;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):
|
|
||||||
- Using bit fields for code structure
|
|
||||||
- Different op definition to avoid & for extra bits (do & for table bits)
|
|
||||||
- Three separate decoding do-loops for direct, window, and wnext == 0
|
|
||||||
- Special case for distance > 1 copies to do overlapped load and store copy
|
|
||||||
- Explicit branch predictions (based on measured branch probabilities)
|
|
||||||
- Deferring match copy and interspersed it with decoding subsequent codes
|
|
||||||
- Swapping literal/length else
|
|
||||||
- Swapping window/direct else
|
|
||||||
- Larger unrolled copy loops (three is about right)
|
|
||||||
- Moving len -= 3 statement into middle of loop
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* !ASMINF */
|
|
|
@ -1,11 +0,0 @@
|
||||||
/* inffast.h -- header to use inffast.c
|
|
||||||
* Copyright (C) 1995-2003, 2010 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* WARNING: this file should *not* be used by applications. It is
|
|
||||||
part of the implementation of the compression library and is
|
|
||||||
subject to change. Applications should only use zlib.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start);
|
|
|
@ -1,94 +0,0 @@
|
||||||
/* inffixed.h -- table for decoding fixed codes
|
|
||||||
* Generated automatically by makefixed().
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* WARNING: this file should *not* be used by applications.
|
|
||||||
It is part of the implementation of this library and is
|
|
||||||
subject to change. Applications should only use zlib.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static const code lenfix[512] = {
|
|
||||||
{96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},
|
|
||||||
{0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},
|
|
||||||
{0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},
|
|
||||||
{0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},
|
|
||||||
{0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},
|
|
||||||
{21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},
|
|
||||||
{0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},
|
|
||||||
{0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},
|
|
||||||
{18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},
|
|
||||||
{0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},
|
|
||||||
{0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},
|
|
||||||
{0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},
|
|
||||||
{20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},
|
|
||||||
{0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},
|
|
||||||
{0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},
|
|
||||||
{0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},
|
|
||||||
{16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},
|
|
||||||
{0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
|
|
||||||
{0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},
|
|
||||||
{0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},
|
|
||||||
{0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},
|
|
||||||
{0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},
|
|
||||||
{0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},
|
|
||||||
{0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},
|
|
||||||
{17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},
|
|
||||||
{0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},
|
|
||||||
{0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},
|
|
||||||
{0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},
|
|
||||||
{19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},
|
|
||||||
{0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},
|
|
||||||
{0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},
|
|
||||||
{0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},
|
|
||||||
{16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},
|
|
||||||
{0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},
|
|
||||||
{0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},
|
|
||||||
{0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},
|
|
||||||
{0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},
|
|
||||||
{20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},
|
|
||||||
{0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},
|
|
||||||
{0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},
|
|
||||||
{17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},
|
|
||||||
{0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},
|
|
||||||
{0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},
|
|
||||||
{0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},
|
|
||||||
{20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},
|
|
||||||
{0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},
|
|
||||||
{0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},
|
|
||||||
{0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
|
|
||||||
{16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},
|
|
||||||
{0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},
|
|
||||||
{0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},
|
|
||||||
{0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},
|
|
||||||
{0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},
|
|
||||||
{0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},
|
|
||||||
{0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},
|
|
||||||
{0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},
|
|
||||||
{16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},
|
|
||||||
{0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},
|
|
||||||
{0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},
|
|
||||||
{0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},
|
|
||||||
{19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},
|
|
||||||
{0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},
|
|
||||||
{0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},
|
|
||||||
{0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},
|
|
||||||
{16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},
|
|
||||||
{0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
|
|
||||||
{0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},
|
|
||||||
{0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},
|
|
||||||
{0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},
|
|
||||||
{64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},
|
|
||||||
{0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},
|
|
||||||
{0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},
|
|
||||||
{18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},
|
|
||||||
{0,9,255}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const code distfix[32] = {
|
|
||||||
{16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},
|
|
||||||
{21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},
|
|
||||||
{18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},
|
|
||||||
{19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},
|
|
||||||
{16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},
|
|
||||||
{22,5,193},{64,5,0}
|
|
||||||
};
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,126 +0,0 @@
|
||||||
/* inflate.h -- internal inflate state definition
|
|
||||||
* Copyright (C) 1995-2019 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* WARNING: this file should *not* be used by applications. It is
|
|
||||||
part of the implementation of the compression library and is
|
|
||||||
subject to change. Applications should only use zlib.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* define NO_GZIP when compiling if you want to disable gzip header and
|
|
||||||
trailer decoding by inflate(). NO_GZIP would be used to avoid linking in
|
|
||||||
the crc code when it is not needed. For shared libraries, gzip decoding
|
|
||||||
should be left enabled. */
|
|
||||||
#ifndef NO_GZIP
|
|
||||||
# define GUNZIP
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Possible inflate modes between inflate() calls */
|
|
||||||
typedef enum {
|
|
||||||
HEAD = 16180, /* i: waiting for magic header */
|
|
||||||
FLAGS, /* i: waiting for method and flags (gzip) */
|
|
||||||
TIME, /* i: waiting for modification time (gzip) */
|
|
||||||
OS, /* i: waiting for extra flags and operating system (gzip) */
|
|
||||||
EXLEN, /* i: waiting for extra length (gzip) */
|
|
||||||
EXTRA, /* i: waiting for extra bytes (gzip) */
|
|
||||||
NAME, /* i: waiting for end of file name (gzip) */
|
|
||||||
COMMENT, /* i: waiting for end of comment (gzip) */
|
|
||||||
HCRC, /* i: waiting for header crc (gzip) */
|
|
||||||
DICTID, /* i: waiting for dictionary check value */
|
|
||||||
DICT, /* waiting for inflateSetDictionary() call */
|
|
||||||
TYPE, /* i: waiting for type bits, including last-flag bit */
|
|
||||||
TYPEDO, /* i: same, but skip check to exit inflate on new block */
|
|
||||||
STORED, /* i: waiting for stored size (length and complement) */
|
|
||||||
COPY_, /* i/o: same as COPY below, but only first time in */
|
|
||||||
COPY, /* i/o: waiting for input or output to copy stored block */
|
|
||||||
TABLE, /* i: waiting for dynamic block table lengths */
|
|
||||||
LENLENS, /* i: waiting for code length code lengths */
|
|
||||||
CODELENS, /* i: waiting for length/lit and distance code lengths */
|
|
||||||
LEN_, /* i: same as LEN below, but only first time in */
|
|
||||||
LEN, /* i: waiting for length/lit/eob code */
|
|
||||||
LENEXT, /* i: waiting for length extra bits */
|
|
||||||
DIST, /* i: waiting for distance code */
|
|
||||||
DISTEXT, /* i: waiting for distance extra bits */
|
|
||||||
MATCH, /* o: waiting for output space to copy string */
|
|
||||||
LIT, /* o: waiting for output space to write literal */
|
|
||||||
CHECK, /* i: waiting for 32-bit check value */
|
|
||||||
LENGTH, /* i: waiting for 32-bit length (gzip) */
|
|
||||||
DONE, /* finished check, done -- remain here until reset */
|
|
||||||
BAD, /* got a data error -- remain here until reset */
|
|
||||||
MEM, /* got an inflate() memory error -- remain here until reset */
|
|
||||||
SYNC /* looking for synchronization bytes to restart inflate() */
|
|
||||||
} inflate_mode;
|
|
||||||
|
|
||||||
/*
|
|
||||||
State transitions between above modes -
|
|
||||||
|
|
||||||
(most modes can go to BAD or MEM on error -- not shown for clarity)
|
|
||||||
|
|
||||||
Process header:
|
|
||||||
HEAD -> (gzip) or (zlib) or (raw)
|
|
||||||
(gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT ->
|
|
||||||
HCRC -> TYPE
|
|
||||||
(zlib) -> DICTID or TYPE
|
|
||||||
DICTID -> DICT -> TYPE
|
|
||||||
(raw) -> TYPEDO
|
|
||||||
Read deflate blocks:
|
|
||||||
TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK
|
|
||||||
STORED -> COPY_ -> COPY -> TYPE
|
|
||||||
TABLE -> LENLENS -> CODELENS -> LEN_
|
|
||||||
LEN_ -> LEN
|
|
||||||
Read deflate codes in fixed or dynamic block:
|
|
||||||
LEN -> LENEXT or LIT or TYPE
|
|
||||||
LENEXT -> DIST -> DISTEXT -> MATCH -> LEN
|
|
||||||
LIT -> LEN
|
|
||||||
Process trailer:
|
|
||||||
CHECK -> LENGTH -> DONE
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* State maintained between inflate() calls -- approximately 7K bytes, not
|
|
||||||
including the allocated sliding window, which is up to 32K bytes. */
|
|
||||||
struct inflate_state {
|
|
||||||
z_streamp strm; /* pointer back to this zlib stream */
|
|
||||||
inflate_mode mode; /* current inflate mode */
|
|
||||||
int last; /* true if processing last block */
|
|
||||||
int wrap; /* bit 0 true for zlib, bit 1 true for gzip,
|
|
||||||
bit 2 true to validate check value */
|
|
||||||
int havedict; /* true if dictionary provided */
|
|
||||||
int flags; /* gzip header method and flags, 0 if zlib, or
|
|
||||||
-1 if raw or no header yet */
|
|
||||||
unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */
|
|
||||||
unsigned long check; /* protected copy of check value */
|
|
||||||
unsigned long total; /* protected copy of output count */
|
|
||||||
gz_headerp head; /* where to save gzip header information */
|
|
||||||
/* sliding window */
|
|
||||||
unsigned wbits; /* log base 2 of requested window size */
|
|
||||||
unsigned wsize; /* window size or zero if not using window */
|
|
||||||
unsigned whave; /* valid bytes in the window */
|
|
||||||
unsigned wnext; /* window write index */
|
|
||||||
unsigned char FAR *window; /* allocated sliding window, if needed */
|
|
||||||
/* bit accumulator */
|
|
||||||
unsigned long hold; /* input bit accumulator */
|
|
||||||
unsigned bits; /* number of bits in "in" */
|
|
||||||
/* for string and stored block copying */
|
|
||||||
unsigned length; /* literal or length of data to copy */
|
|
||||||
unsigned offset; /* distance back to copy string from */
|
|
||||||
/* for table and code decoding */
|
|
||||||
unsigned extra; /* extra bits needed */
|
|
||||||
/* fixed and dynamic code tables */
|
|
||||||
code const FAR *lencode; /* starting table for length/literal codes */
|
|
||||||
code const FAR *distcode; /* starting table for distance codes */
|
|
||||||
unsigned lenbits; /* index bits for lencode */
|
|
||||||
unsigned distbits; /* index bits for distcode */
|
|
||||||
/* dynamic table building */
|
|
||||||
unsigned ncode; /* number of code length code lengths */
|
|
||||||
unsigned nlen; /* number of length code lengths */
|
|
||||||
unsigned ndist; /* number of distance code lengths */
|
|
||||||
unsigned have; /* number of code lengths in lens[] */
|
|
||||||
code FAR *next; /* next available space in codes[] */
|
|
||||||
unsigned short lens[320]; /* temporary storage for code lengths */
|
|
||||||
unsigned short work[288]; /* work area for code table building */
|
|
||||||
code codes[ENOUGH]; /* space for code tables */
|
|
||||||
int sane; /* if false, allow invalid distance too far */
|
|
||||||
int back; /* bits back of last unprocessed length/lit */
|
|
||||||
unsigned was; /* initial length of match */
|
|
||||||
};
|
|
|
@ -1,299 +0,0 @@
|
||||||
/* inftrees.c -- generate Huffman trees for efficient decoding
|
|
||||||
* Copyright (C) 1995-2023 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "zutil.h"
|
|
||||||
#include "inftrees.h"
|
|
||||||
|
|
||||||
#define MAXBITS 15
|
|
||||||
|
|
||||||
const char inflate_copyright[] =
|
|
||||||
" inflate 1.3 Copyright 1995-2023 Mark Adler ";
|
|
||||||
/*
|
|
||||||
If you use the zlib library in a product, an acknowledgment is welcome
|
|
||||||
in the documentation of your product. If for some reason you cannot
|
|
||||||
include such an acknowledgment, I would appreciate that you keep this
|
|
||||||
copyright string in the executable of your product.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Build a set of tables to decode the provided canonical Huffman code.
|
|
||||||
The code lengths are lens[0..codes-1]. The result starts at *table,
|
|
||||||
whose indices are 0..2^bits-1. work is a writable array of at least
|
|
||||||
lens shorts, which is used as a work area. type is the type of code
|
|
||||||
to be generated, CODES, LENS, or DISTS. On return, zero is success,
|
|
||||||
-1 is an invalid code, and +1 means that ENOUGH isn't enough. table
|
|
||||||
on return points to the next available entry's address. bits is the
|
|
||||||
requested root table index bits, and on return it is the actual root
|
|
||||||
table index bits. It will differ if the request is greater than the
|
|
||||||
longest code or if it is less than the shortest code.
|
|
||||||
*/
|
|
||||||
int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
|
|
||||||
unsigned codes, code FAR * FAR *table,
|
|
||||||
unsigned FAR *bits, unsigned short FAR *work) {
|
|
||||||
unsigned len; /* a code's length in bits */
|
|
||||||
unsigned sym; /* index of code symbols */
|
|
||||||
unsigned min, max; /* minimum and maximum code lengths */
|
|
||||||
unsigned root; /* number of index bits for root table */
|
|
||||||
unsigned curr; /* number of index bits for current table */
|
|
||||||
unsigned drop; /* code bits to drop for sub-table */
|
|
||||||
int left; /* number of prefix codes available */
|
|
||||||
unsigned used; /* code entries in table used */
|
|
||||||
unsigned huff; /* Huffman code */
|
|
||||||
unsigned incr; /* for incrementing code, index */
|
|
||||||
unsigned fill; /* index for replicating entries */
|
|
||||||
unsigned low; /* low bits for current root entry */
|
|
||||||
unsigned mask; /* mask for low root bits */
|
|
||||||
code here; /* table entry for duplication */
|
|
||||||
code FAR *next; /* next available space in table */
|
|
||||||
const unsigned short FAR *base; /* base value table to use */
|
|
||||||
const unsigned short FAR *extra; /* extra bits table to use */
|
|
||||||
unsigned match; /* use base and extra for symbol >= match */
|
|
||||||
unsigned short count[MAXBITS+1]; /* number of codes of each length */
|
|
||||||
unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
|
|
||||||
static const unsigned short lbase[31] = { /* Length codes 257..285 base */
|
|
||||||
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
|
|
||||||
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
|
|
||||||
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
|
|
||||||
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
|
|
||||||
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 198, 203};
|
|
||||||
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
|
|
||||||
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
|
|
||||||
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
|
|
||||||
8193, 12289, 16385, 24577, 0, 0};
|
|
||||||
static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
|
|
||||||
16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
|
|
||||||
23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
|
|
||||||
28, 28, 29, 29, 64, 64};
|
|
||||||
|
|
||||||
/*
|
|
||||||
Process a set of code lengths to create a canonical Huffman code. The
|
|
||||||
code lengths are lens[0..codes-1]. Each length corresponds to the
|
|
||||||
symbols 0..codes-1. The Huffman code is generated by first sorting the
|
|
||||||
symbols by length from short to long, and retaining the symbol order
|
|
||||||
for codes with equal lengths. Then the code starts with all zero bits
|
|
||||||
for the first code of the shortest length, and the codes are integer
|
|
||||||
increments for the same length, and zeros are appended as the length
|
|
||||||
increases. For the deflate format, these bits are stored backwards
|
|
||||||
from their more natural integer increment ordering, and so when the
|
|
||||||
decoding tables are built in the large loop below, the integer codes
|
|
||||||
are incremented backwards.
|
|
||||||
|
|
||||||
This routine assumes, but does not check, that all of the entries in
|
|
||||||
lens[] are in the range 0..MAXBITS. The caller must assure this.
|
|
||||||
1..MAXBITS is interpreted as that code length. zero means that that
|
|
||||||
symbol does not occur in this code.
|
|
||||||
|
|
||||||
The codes are sorted by computing a count of codes for each length,
|
|
||||||
creating from that a table of starting indices for each length in the
|
|
||||||
sorted table, and then entering the symbols in order in the sorted
|
|
||||||
table. The sorted table is work[], with that space being provided by
|
|
||||||
the caller.
|
|
||||||
|
|
||||||
The length counts are used for other purposes as well, i.e. finding
|
|
||||||
the minimum and maximum length codes, determining if there are any
|
|
||||||
codes at all, checking for a valid set of lengths, and looking ahead
|
|
||||||
at length counts to determine sub-table sizes when building the
|
|
||||||
decoding tables.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
|
|
||||||
for (len = 0; len <= MAXBITS; len++)
|
|
||||||
count[len] = 0;
|
|
||||||
for (sym = 0; sym < codes; sym++)
|
|
||||||
count[lens[sym]]++;
|
|
||||||
|
|
||||||
/* bound code lengths, force root to be within code lengths */
|
|
||||||
root = *bits;
|
|
||||||
for (max = MAXBITS; max >= 1; max--)
|
|
||||||
if (count[max] != 0) break;
|
|
||||||
if (root > max) root = max;
|
|
||||||
if (max == 0) { /* no symbols to code at all */
|
|
||||||
here.op = (unsigned char)64; /* invalid code marker */
|
|
||||||
here.bits = (unsigned char)1;
|
|
||||||
here.val = (unsigned short)0;
|
|
||||||
*(*table)++ = here; /* make a table to force an error */
|
|
||||||
*(*table)++ = here;
|
|
||||||
*bits = 1;
|
|
||||||
return 0; /* no symbols, but wait for decoding to report error */
|
|
||||||
}
|
|
||||||
for (min = 1; min < max; min++)
|
|
||||||
if (count[min] != 0) break;
|
|
||||||
if (root < min) root = min;
|
|
||||||
|
|
||||||
/* check for an over-subscribed or incomplete set of lengths */
|
|
||||||
left = 1;
|
|
||||||
for (len = 1; len <= MAXBITS; len++) {
|
|
||||||
left <<= 1;
|
|
||||||
left -= count[len];
|
|
||||||
if (left < 0) return -1; /* over-subscribed */
|
|
||||||
}
|
|
||||||
if (left > 0 && (type == CODES || max != 1))
|
|
||||||
return -1; /* incomplete set */
|
|
||||||
|
|
||||||
/* generate offsets into symbol table for each length for sorting */
|
|
||||||
offs[1] = 0;
|
|
||||||
for (len = 1; len < MAXBITS; len++)
|
|
||||||
offs[len + 1] = offs[len] + count[len];
|
|
||||||
|
|
||||||
/* sort symbols by length, by symbol order within each length */
|
|
||||||
for (sym = 0; sym < codes; sym++)
|
|
||||||
if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Create and fill in decoding tables. In this loop, the table being
|
|
||||||
filled is at next and has curr index bits. The code being used is huff
|
|
||||||
with length len. That code is converted to an index by dropping drop
|
|
||||||
bits off of the bottom. For codes where len is less than drop + curr,
|
|
||||||
those top drop + curr - len bits are incremented through all values to
|
|
||||||
fill the table with replicated entries.
|
|
||||||
|
|
||||||
root is the number of index bits for the root table. When len exceeds
|
|
||||||
root, sub-tables are created pointed to by the root entry with an index
|
|
||||||
of the low root bits of huff. This is saved in low to check for when a
|
|
||||||
new sub-table should be started. drop is zero when the root table is
|
|
||||||
being filled, and drop is root when sub-tables are being filled.
|
|
||||||
|
|
||||||
When a new sub-table is needed, it is necessary to look ahead in the
|
|
||||||
code lengths to determine what size sub-table is needed. The length
|
|
||||||
counts are used for this, and so count[] is decremented as codes are
|
|
||||||
entered in the tables.
|
|
||||||
|
|
||||||
used keeps track of how many table entries have been allocated from the
|
|
||||||
provided *table space. It is checked for LENS and DIST tables against
|
|
||||||
the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
|
|
||||||
the initial root table size constants. See the comments in inftrees.h
|
|
||||||
for more information.
|
|
||||||
|
|
||||||
sym increments through all symbols, and the loop terminates when
|
|
||||||
all codes of length max, i.e. all codes, have been processed. This
|
|
||||||
routine permits incomplete codes, so another loop after this one fills
|
|
||||||
in the rest of the decoding tables with invalid code markers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* set up for code type */
|
|
||||||
switch (type) {
|
|
||||||
case CODES:
|
|
||||||
base = extra = work; /* dummy value--not used */
|
|
||||||
match = 20;
|
|
||||||
break;
|
|
||||||
case LENS:
|
|
||||||
base = lbase;
|
|
||||||
extra = lext;
|
|
||||||
match = 257;
|
|
||||||
break;
|
|
||||||
default: /* DISTS */
|
|
||||||
base = dbase;
|
|
||||||
extra = dext;
|
|
||||||
match = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialize state for loop */
|
|
||||||
huff = 0; /* starting code */
|
|
||||||
sym = 0; /* starting code symbol */
|
|
||||||
len = min; /* starting code length */
|
|
||||||
next = *table; /* current table to fill in */
|
|
||||||
curr = root; /* current table index bits */
|
|
||||||
drop = 0; /* current bits to drop from code for index */
|
|
||||||
low = (unsigned)(-1); /* trigger new sub-table when len > root */
|
|
||||||
used = 1U << root; /* use root table entries */
|
|
||||||
mask = used - 1; /* mask for comparing low */
|
|
||||||
|
|
||||||
/* check available table space */
|
|
||||||
if ((type == LENS && used > ENOUGH_LENS) ||
|
|
||||||
(type == DISTS && used > ENOUGH_DISTS))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* process all codes and make table entries */
|
|
||||||
for (;;) {
|
|
||||||
/* create table entry */
|
|
||||||
here.bits = (unsigned char)(len - drop);
|
|
||||||
if (work[sym] + 1U < match) {
|
|
||||||
here.op = (unsigned char)0;
|
|
||||||
here.val = work[sym];
|
|
||||||
}
|
|
||||||
else if (work[sym] >= match) {
|
|
||||||
here.op = (unsigned char)(extra[work[sym] - match]);
|
|
||||||
here.val = base[work[sym] - match];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
here.op = (unsigned char)(32 + 64); /* end of block */
|
|
||||||
here.val = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* replicate for those indices with low len bits equal to huff */
|
|
||||||
incr = 1U << (len - drop);
|
|
||||||
fill = 1U << curr;
|
|
||||||
min = fill; /* save offset to next table */
|
|
||||||
do {
|
|
||||||
fill -= incr;
|
|
||||||
next[(huff >> drop) + fill] = here;
|
|
||||||
} while (fill != 0);
|
|
||||||
|
|
||||||
/* backwards increment the len-bit code huff */
|
|
||||||
incr = 1U << (len - 1);
|
|
||||||
while (huff & incr)
|
|
||||||
incr >>= 1;
|
|
||||||
if (incr != 0) {
|
|
||||||
huff &= incr - 1;
|
|
||||||
huff += incr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
huff = 0;
|
|
||||||
|
|
||||||
/* go to next symbol, update count, len */
|
|
||||||
sym++;
|
|
||||||
if (--(count[len]) == 0) {
|
|
||||||
if (len == max) break;
|
|
||||||
len = lens[work[sym]];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create new sub-table if needed */
|
|
||||||
if (len > root && (huff & mask) != low) {
|
|
||||||
/* if first time, transition to sub-tables */
|
|
||||||
if (drop == 0)
|
|
||||||
drop = root;
|
|
||||||
|
|
||||||
/* increment past last table */
|
|
||||||
next += min; /* here min is 1 << curr */
|
|
||||||
|
|
||||||
/* determine length of next table */
|
|
||||||
curr = len - drop;
|
|
||||||
left = (int)(1 << curr);
|
|
||||||
while (curr + drop < max) {
|
|
||||||
left -= count[curr + drop];
|
|
||||||
if (left <= 0) break;
|
|
||||||
curr++;
|
|
||||||
left <<= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check for enough space */
|
|
||||||
used += 1U << curr;
|
|
||||||
if ((type == LENS && used > ENOUGH_LENS) ||
|
|
||||||
(type == DISTS && used > ENOUGH_DISTS))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* point entry in root table to sub-table */
|
|
||||||
low = huff & mask;
|
|
||||||
(*table)[low].op = (unsigned char)curr;
|
|
||||||
(*table)[low].bits = (unsigned char)root;
|
|
||||||
(*table)[low].val = (unsigned short)(next - *table);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fill in remaining table entry if code is incomplete (guaranteed to have
|
|
||||||
at most one remaining entry, since if the code is incomplete, the
|
|
||||||
maximum code length that was allowed to get this far is one bit) */
|
|
||||||
if (huff != 0) {
|
|
||||||
here.op = (unsigned char)64; /* invalid code marker */
|
|
||||||
here.bits = (unsigned char)(len - drop);
|
|
||||||
here.val = (unsigned short)0;
|
|
||||||
next[huff] = here;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set return parameters */
|
|
||||||
*table += used;
|
|
||||||
*bits = root;
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
/* inftrees.h -- header to use inftrees.c
|
|
||||||
* Copyright (C) 1995-2005, 2010 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* WARNING: this file should *not* be used by applications. It is
|
|
||||||
part of the implementation of the compression library and is
|
|
||||||
subject to change. Applications should only use zlib.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Structure for decoding tables. Each entry provides either the
|
|
||||||
information needed to do the operation requested by the code that
|
|
||||||
indexed that table entry, or it provides a pointer to another
|
|
||||||
table that indexes more bits of the code. op indicates whether
|
|
||||||
the entry is a pointer to another table, a literal, a length or
|
|
||||||
distance, an end-of-block, or an invalid code. For a table
|
|
||||||
pointer, the low four bits of op is the number of index bits of
|
|
||||||
that table. For a length or distance, the low four bits of op
|
|
||||||
is the number of extra bits to get after the code. bits is
|
|
||||||
the number of bits in this code or part of the code to drop off
|
|
||||||
of the bit buffer. val is the actual byte to output in the case
|
|
||||||
of a literal, the base length or distance, or the offset from
|
|
||||||
the current table to the next table. Each entry is four bytes. */
|
|
||||||
typedef struct {
|
|
||||||
unsigned char op; /* operation, extra bits, table bits */
|
|
||||||
unsigned char bits; /* bits in this part of the code */
|
|
||||||
unsigned short val; /* offset in table or code value */
|
|
||||||
} code;
|
|
||||||
|
|
||||||
/* op values as set by inflate_table():
|
|
||||||
00000000 - literal
|
|
||||||
0000tttt - table link, tttt != 0 is the number of table index bits
|
|
||||||
0001eeee - length or distance, eeee is the number of extra bits
|
|
||||||
01100000 - end of block
|
|
||||||
01000000 - invalid code
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Maximum size of the dynamic table. The maximum number of code structures is
|
|
||||||
1444, which is the sum of 852 for literal/length codes and 592 for distance
|
|
||||||
codes. These values were found by exhaustive searches using the program
|
|
||||||
examples/enough.c found in the zlib distribution. The arguments to that
|
|
||||||
program are the number of symbols, the initial root table size, and the
|
|
||||||
maximum bit length of a code. "enough 286 9 15" for literal/length codes
|
|
||||||
returns returns 852, and "enough 30 6 15" for distance codes returns 592.
|
|
||||||
The initial root table size (9 or 6) is found in the fifth argument of the
|
|
||||||
inflate_table() calls in inflate.c and infback.c. If the root table size is
|
|
||||||
changed, then these maximum sizes would be need to be recalculated and
|
|
||||||
updated. */
|
|
||||||
#define ENOUGH_LENS 852
|
|
||||||
#define ENOUGH_DISTS 592
|
|
||||||
#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)
|
|
||||||
|
|
||||||
/* Type of code to build for inflate_table() */
|
|
||||||
typedef enum {
|
|
||||||
CODES,
|
|
||||||
LENS,
|
|
||||||
DISTS
|
|
||||||
} codetype;
|
|
||||||
|
|
||||||
int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens,
|
|
||||||
unsigned codes, code FAR * FAR *table,
|
|
||||||
unsigned FAR *bits, unsigned short FAR *work);
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,128 +0,0 @@
|
||||||
/* header created automatically with -DGEN_TREES_H */
|
|
||||||
|
|
||||||
local const ct_data static_ltree[L_CODES+2] = {
|
|
||||||
{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}},
|
|
||||||
{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}},
|
|
||||||
{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}},
|
|
||||||
{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}},
|
|
||||||
{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}},
|
|
||||||
{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}},
|
|
||||||
{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}},
|
|
||||||
{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}},
|
|
||||||
{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}},
|
|
||||||
{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}},
|
|
||||||
{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}},
|
|
||||||
{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}},
|
|
||||||
{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}},
|
|
||||||
{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}},
|
|
||||||
{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}},
|
|
||||||
{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}},
|
|
||||||
{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}},
|
|
||||||
{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}},
|
|
||||||
{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}},
|
|
||||||
{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}},
|
|
||||||
{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}},
|
|
||||||
{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}},
|
|
||||||
{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}},
|
|
||||||
{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}},
|
|
||||||
{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}},
|
|
||||||
{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}},
|
|
||||||
{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}},
|
|
||||||
{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}},
|
|
||||||
{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}},
|
|
||||||
{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}},
|
|
||||||
{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}},
|
|
||||||
{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}},
|
|
||||||
{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}},
|
|
||||||
{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}},
|
|
||||||
{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}},
|
|
||||||
{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}},
|
|
||||||
{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}},
|
|
||||||
{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}},
|
|
||||||
{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}},
|
|
||||||
{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}},
|
|
||||||
{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}},
|
|
||||||
{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}},
|
|
||||||
{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}},
|
|
||||||
{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}},
|
|
||||||
{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}},
|
|
||||||
{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}},
|
|
||||||
{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}},
|
|
||||||
{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}},
|
|
||||||
{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}},
|
|
||||||
{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}},
|
|
||||||
{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}},
|
|
||||||
{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}},
|
|
||||||
{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}},
|
|
||||||
{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}},
|
|
||||||
{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}},
|
|
||||||
{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}},
|
|
||||||
{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}},
|
|
||||||
{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}}
|
|
||||||
};
|
|
||||||
|
|
||||||
local const ct_data static_dtree[D_CODES] = {
|
|
||||||
{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},
|
|
||||||
{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},
|
|
||||||
{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},
|
|
||||||
{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},
|
|
||||||
{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},
|
|
||||||
{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}
|
|
||||||
};
|
|
||||||
|
|
||||||
const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {
|
|
||||||
0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,
|
|
||||||
10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
|
|
||||||
11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
|
|
||||||
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
|
|
||||||
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
|
||||||
13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
||||||
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
||||||
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
||||||
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17,
|
|
||||||
18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
|
|
||||||
23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
||||||
24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
|
|
||||||
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
|
|
||||||
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
|
|
||||||
27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
|
||||||
27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
|
||||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
|
||||||
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
|
||||||
28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
|
|
||||||
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
|
|
||||||
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
|
|
||||||
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
|
|
||||||
};
|
|
||||||
|
|
||||||
const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {
|
|
||||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12,
|
|
||||||
13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
|
|
||||||
17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
|
|
||||||
19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
|
|
||||||
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,
|
|
||||||
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
|
|
||||||
23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
||||||
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
|
||||||
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
|
|
||||||
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,
|
|
||||||
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
|
|
||||||
26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
|
||||||
27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28
|
|
||||||
};
|
|
||||||
|
|
||||||
local const int base_length[LENGTH_CODES] = {
|
|
||||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,
|
|
||||||
64, 80, 96, 112, 128, 160, 192, 224, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
local const int base_dist[D_CODES] = {
|
|
||||||
0, 1, 2, 3, 4, 6, 8, 12, 16, 24,
|
|
||||||
32, 48, 64, 96, 128, 192, 256, 384, 512, 768,
|
|
||||||
1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,85 +0,0 @@
|
||||||
/* uncompr.c -- decompress a memory buffer
|
|
||||||
* Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @(#) $Id$ */
|
|
||||||
|
|
||||||
#define ZLIB_INTERNAL
|
|
||||||
#include "zlib.h"
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
Decompresses the source buffer into the destination buffer. *sourceLen is
|
|
||||||
the byte length of the source buffer. Upon entry, *destLen is the total size
|
|
||||||
of the destination buffer, which must be large enough to hold the entire
|
|
||||||
uncompressed data. (The size of the uncompressed data must have been saved
|
|
||||||
previously by the compressor and transmitted to the decompressor by some
|
|
||||||
mechanism outside the scope of this compression library.) Upon exit,
|
|
||||||
*destLen is the size of the decompressed data and *sourceLen is the number
|
|
||||||
of source bytes consumed. Upon return, source + *sourceLen points to the
|
|
||||||
first unused input byte.
|
|
||||||
|
|
||||||
uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
|
||||||
memory, Z_BUF_ERROR if there was not enough room in the output buffer, or
|
|
||||||
Z_DATA_ERROR if the input data was corrupted, including if the input data is
|
|
||||||
an incomplete zlib stream.
|
|
||||||
*/
|
|
||||||
int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
|
|
||||||
uLong *sourceLen) {
|
|
||||||
z_stream stream;
|
|
||||||
int err;
|
|
||||||
const uInt max = (uInt)-1;
|
|
||||||
uLong len, left;
|
|
||||||
Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */
|
|
||||||
|
|
||||||
len = *sourceLen;
|
|
||||||
if (*destLen) {
|
|
||||||
left = *destLen;
|
|
||||||
*destLen = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
left = 1;
|
|
||||||
dest = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.next_in = (z_const Bytef *)source;
|
|
||||||
stream.avail_in = 0;
|
|
||||||
stream.zalloc = (alloc_func)0;
|
|
||||||
stream.zfree = (free_func)0;
|
|
||||||
stream.opaque = (voidpf)0;
|
|
||||||
|
|
||||||
err = inflateInit(&stream);
|
|
||||||
if (err != Z_OK) return err;
|
|
||||||
|
|
||||||
stream.next_out = dest;
|
|
||||||
stream.avail_out = 0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (stream.avail_out == 0) {
|
|
||||||
stream.avail_out = left > (uLong)max ? max : (uInt)left;
|
|
||||||
left -= stream.avail_out;
|
|
||||||
}
|
|
||||||
if (stream.avail_in == 0) {
|
|
||||||
stream.avail_in = len > (uLong)max ? max : (uInt)len;
|
|
||||||
len -= stream.avail_in;
|
|
||||||
}
|
|
||||||
err = inflate(&stream, Z_NO_FLUSH);
|
|
||||||
} while (err == Z_OK);
|
|
||||||
|
|
||||||
*sourceLen -= len + stream.avail_in;
|
|
||||||
if (dest != buf)
|
|
||||||
*destLen = stream.total_out;
|
|
||||||
else if (stream.total_out && err == Z_BUF_ERROR)
|
|
||||||
left = 1;
|
|
||||||
|
|
||||||
inflateEnd(&stream);
|
|
||||||
return err == Z_STREAM_END ? Z_OK :
|
|
||||||
err == Z_NEED_DICT ? Z_DATA_ERROR :
|
|
||||||
err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR :
|
|
||||||
err;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source,
|
|
||||||
uLong sourceLen) {
|
|
||||||
return uncompress2(dest, destLen, source, &sourceLen);
|
|
||||||
}
|
|
|
@ -1,551 +0,0 @@
|
||||||
/* zconf.h -- configuration of the zlib compression library
|
|
||||||
* Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @(#) $Id$ */
|
|
||||||
|
|
||||||
#ifndef ZCONF_H
|
|
||||||
#define ZCONF_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If you *really* need a unique prefix for all types and library functions,
|
|
||||||
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
|
|
||||||
* Even better than compiling with -DZ_PREFIX would be to use configure to set
|
|
||||||
* this permanently in zconf.h using "./configure --zprefix".
|
|
||||||
*/
|
|
||||||
#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
|
|
||||||
# define Z_PREFIX_SET
|
|
||||||
|
|
||||||
/* all linked symbols and init macros */
|
|
||||||
# define _dist_code z__dist_code
|
|
||||||
# define _length_code z__length_code
|
|
||||||
# define _tr_align z__tr_align
|
|
||||||
# define _tr_flush_bits z__tr_flush_bits
|
|
||||||
# define _tr_flush_block z__tr_flush_block
|
|
||||||
# define _tr_init z__tr_init
|
|
||||||
# define _tr_stored_block z__tr_stored_block
|
|
||||||
# define _tr_tally z__tr_tally
|
|
||||||
# define adler32 z_adler32
|
|
||||||
# define adler32_combine z_adler32_combine
|
|
||||||
# define adler32_combine64 z_adler32_combine64
|
|
||||||
# define adler32_z z_adler32_z
|
|
||||||
# ifndef Z_SOLO
|
|
||||||
# define compress z_compress
|
|
||||||
# define compress2 z_compress2
|
|
||||||
# define compressBound z_compressBound
|
|
||||||
# endif
|
|
||||||
# define crc32 z_crc32
|
|
||||||
# define crc32_combine z_crc32_combine
|
|
||||||
# define crc32_combine64 z_crc32_combine64
|
|
||||||
# define crc32_combine_gen z_crc32_combine_gen
|
|
||||||
# define crc32_combine_gen64 z_crc32_combine_gen64
|
|
||||||
# define crc32_combine_op z_crc32_combine_op
|
|
||||||
# define crc32_z z_crc32_z
|
|
||||||
# define deflate z_deflate
|
|
||||||
# define deflateBound z_deflateBound
|
|
||||||
# define deflateCopy z_deflateCopy
|
|
||||||
# define deflateEnd z_deflateEnd
|
|
||||||
# define deflateGetDictionary z_deflateGetDictionary
|
|
||||||
# define deflateInit z_deflateInit
|
|
||||||
# define deflateInit2 z_deflateInit2
|
|
||||||
# define deflateInit2_ z_deflateInit2_
|
|
||||||
# define deflateInit_ z_deflateInit_
|
|
||||||
# define deflateParams z_deflateParams
|
|
||||||
# define deflatePending z_deflatePending
|
|
||||||
# define deflatePrime z_deflatePrime
|
|
||||||
# define deflateReset z_deflateReset
|
|
||||||
# define deflateResetKeep z_deflateResetKeep
|
|
||||||
# define deflateSetDictionary z_deflateSetDictionary
|
|
||||||
# define deflateSetHeader z_deflateSetHeader
|
|
||||||
# define deflateTune z_deflateTune
|
|
||||||
# define deflate_copyright z_deflate_copyright
|
|
||||||
# define get_crc_table z_get_crc_table
|
|
||||||
# ifndef Z_SOLO
|
|
||||||
# define gz_error z_gz_error
|
|
||||||
# define gz_intmax z_gz_intmax
|
|
||||||
# define gz_strwinerror z_gz_strwinerror
|
|
||||||
# define gzbuffer z_gzbuffer
|
|
||||||
# define gzclearerr z_gzclearerr
|
|
||||||
# define gzclose z_gzclose
|
|
||||||
# define gzclose_r z_gzclose_r
|
|
||||||
# define gzclose_w z_gzclose_w
|
|
||||||
# define gzdirect z_gzdirect
|
|
||||||
# define gzdopen z_gzdopen
|
|
||||||
# define gzeof z_gzeof
|
|
||||||
# define gzerror z_gzerror
|
|
||||||
# define gzflush z_gzflush
|
|
||||||
# define gzfread z_gzfread
|
|
||||||
# define gzfwrite z_gzfwrite
|
|
||||||
# define gzgetc z_gzgetc
|
|
||||||
# define gzgetc_ z_gzgetc_
|
|
||||||
# define gzgets z_gzgets
|
|
||||||
# define gzoffset z_gzoffset
|
|
||||||
# define gzoffset64 z_gzoffset64
|
|
||||||
# define gzopen z_gzopen
|
|
||||||
# define gzopen64 z_gzopen64
|
|
||||||
# ifdef _WIN32
|
|
||||||
# define gzopen_w z_gzopen_w
|
|
||||||
# endif
|
|
||||||
# define gzprintf z_gzprintf
|
|
||||||
# define gzputc z_gzputc
|
|
||||||
# define gzputs z_gzputs
|
|
||||||
# define gzread z_gzread
|
|
||||||
# define gzrewind z_gzrewind
|
|
||||||
# define gzseek z_gzseek
|
|
||||||
# define gzseek64 z_gzseek64
|
|
||||||
# define gzsetparams z_gzsetparams
|
|
||||||
# define gztell z_gztell
|
|
||||||
# define gztell64 z_gztell64
|
|
||||||
# define gzungetc z_gzungetc
|
|
||||||
# define gzvprintf z_gzvprintf
|
|
||||||
# define gzwrite z_gzwrite
|
|
||||||
# endif
|
|
||||||
# define inflate z_inflate
|
|
||||||
# define inflateBack z_inflateBack
|
|
||||||
# define inflateBackEnd z_inflateBackEnd
|
|
||||||
# define inflateBackInit z_inflateBackInit
|
|
||||||
# define inflateBackInit_ z_inflateBackInit_
|
|
||||||
# define inflateCodesUsed z_inflateCodesUsed
|
|
||||||
# define inflateCopy z_inflateCopy
|
|
||||||
# define inflateEnd z_inflateEnd
|
|
||||||
# define inflateGetDictionary z_inflateGetDictionary
|
|
||||||
# define inflateGetHeader z_inflateGetHeader
|
|
||||||
# define inflateInit z_inflateInit
|
|
||||||
# define inflateInit2 z_inflateInit2
|
|
||||||
# define inflateInit2_ z_inflateInit2_
|
|
||||||
# define inflateInit_ z_inflateInit_
|
|
||||||
# define inflateMark z_inflateMark
|
|
||||||
# define inflatePrime z_inflatePrime
|
|
||||||
# define inflateReset z_inflateReset
|
|
||||||
# define inflateReset2 z_inflateReset2
|
|
||||||
# define inflateResetKeep z_inflateResetKeep
|
|
||||||
# define inflateSetDictionary z_inflateSetDictionary
|
|
||||||
# define inflateSync z_inflateSync
|
|
||||||
# define inflateSyncPoint z_inflateSyncPoint
|
|
||||||
# define inflateUndermine z_inflateUndermine
|
|
||||||
# define inflateValidate z_inflateValidate
|
|
||||||
# define inflate_copyright z_inflate_copyright
|
|
||||||
# define inflate_fast z_inflate_fast
|
|
||||||
# define inflate_table z_inflate_table
|
|
||||||
# ifndef Z_SOLO
|
|
||||||
# define uncompress z_uncompress
|
|
||||||
# define uncompress2 z_uncompress2
|
|
||||||
# endif
|
|
||||||
# define zError z_zError
|
|
||||||
# ifndef Z_SOLO
|
|
||||||
# define zcalloc z_zcalloc
|
|
||||||
# define zcfree z_zcfree
|
|
||||||
# endif
|
|
||||||
# define zlibCompileFlags z_zlibCompileFlags
|
|
||||||
# define zlibVersion z_zlibVersion
|
|
||||||
|
|
||||||
/* all zlib typedefs in zlib.h and zconf.h */
|
|
||||||
# define Byte z_Byte
|
|
||||||
# define Bytef z_Bytef
|
|
||||||
# define alloc_func z_alloc_func
|
|
||||||
# define charf z_charf
|
|
||||||
# define free_func z_free_func
|
|
||||||
# ifndef Z_SOLO
|
|
||||||
# define gzFile z_gzFile
|
|
||||||
# endif
|
|
||||||
# define gz_header z_gz_header
|
|
||||||
# define gz_headerp z_gz_headerp
|
|
||||||
# define in_func z_in_func
|
|
||||||
# define intf z_intf
|
|
||||||
# define out_func z_out_func
|
|
||||||
# define uInt z_uInt
|
|
||||||
# define uIntf z_uIntf
|
|
||||||
# define uLong z_uLong
|
|
||||||
# define uLongf z_uLongf
|
|
||||||
# define voidp z_voidp
|
|
||||||
# define voidpc z_voidpc
|
|
||||||
# define voidpf z_voidpf
|
|
||||||
|
|
||||||
/* all zlib structs in zlib.h and zconf.h */
|
|
||||||
# define gz_header_s z_gz_header_s
|
|
||||||
# define internal_state z_internal_state
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__MSDOS__) && !defined(MSDOS)
|
|
||||||
# define MSDOS
|
|
||||||
#endif
|
|
||||||
#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
|
|
||||||
# define OS2
|
|
||||||
#endif
|
|
||||||
#if defined(_WINDOWS) && !defined(WINDOWS)
|
|
||||||
# define WINDOWS
|
|
||||||
#endif
|
|
||||||
#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
|
|
||||||
# ifndef WIN32
|
|
||||||
# define WIN32
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
|
|
||||||
# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
|
|
||||||
# ifndef SYS16BIT
|
|
||||||
# define SYS16BIT
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compile with -DMAXSEG_64K if the alloc function cannot allocate more
|
|
||||||
* than 64k bytes at a time (needed on systems with 16-bit int).
|
|
||||||
*/
|
|
||||||
#ifdef SYS16BIT
|
|
||||||
# define MAXSEG_64K
|
|
||||||
#endif
|
|
||||||
#ifdef MSDOS
|
|
||||||
# define UNALIGNED_OK
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __STDC_VERSION__
|
|
||||||
# ifndef STDC
|
|
||||||
# define STDC
|
|
||||||
# endif
|
|
||||||
# if __STDC_VERSION__ >= 199901L
|
|
||||||
# ifndef STDC99
|
|
||||||
# define STDC99
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
|
|
||||||
# define STDC
|
|
||||||
#endif
|
|
||||||
#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
|
|
||||||
# define STDC
|
|
||||||
#endif
|
|
||||||
#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
|
|
||||||
# define STDC
|
|
||||||
#endif
|
|
||||||
#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
|
|
||||||
# define STDC
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
|
|
||||||
# define STDC
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef STDC
|
|
||||||
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
|
|
||||||
# define const /* note: need a more gentle solution here */
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ZLIB_CONST) && !defined(z_const)
|
|
||||||
# define z_const const
|
|
||||||
#else
|
|
||||||
# define z_const
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef Z_SOLO
|
|
||||||
# ifdef _WIN64
|
|
||||||
typedef unsigned long long z_size_t;
|
|
||||||
# else
|
|
||||||
typedef unsigned long z_size_t;
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define z_longlong long long
|
|
||||||
# if defined(NO_SIZE_T)
|
|
||||||
typedef unsigned NO_SIZE_T z_size_t;
|
|
||||||
# elif defined(STDC)
|
|
||||||
# include <stddef.h>
|
|
||||||
typedef size_t z_size_t;
|
|
||||||
# else
|
|
||||||
typedef unsigned long z_size_t;
|
|
||||||
# endif
|
|
||||||
# undef z_longlong
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Maximum value for memLevel in deflateInit2 */
|
|
||||||
#ifndef MAX_MEM_LEVEL
|
|
||||||
# ifdef MAXSEG_64K
|
|
||||||
# define MAX_MEM_LEVEL 8
|
|
||||||
# else
|
|
||||||
# define MAX_MEM_LEVEL 9
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Maximum value for windowBits in deflateInit2 and inflateInit2.
|
|
||||||
* WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
|
|
||||||
* created by gzip. (Files created by minigzip can still be extracted by
|
|
||||||
* gzip.)
|
|
||||||
*/
|
|
||||||
#ifndef MAX_WBITS
|
|
||||||
# define MAX_WBITS 15 /* 32K LZ77 window */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The memory requirements for deflate are (in bytes):
|
|
||||||
(1 << (windowBits+2)) + (1 << (memLevel+9))
|
|
||||||
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
|
|
||||||
plus a few kilobytes for small objects. For example, if you want to reduce
|
|
||||||
the default memory requirements from 256K to 128K, compile with
|
|
||||||
make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
|
|
||||||
Of course this will generally degrade compression (there's no free lunch).
|
|
||||||
|
|
||||||
The memory requirements for inflate are (in bytes) 1 << windowBits
|
|
||||||
that is, 32K for windowBits=15 (default value) plus about 7 kilobytes
|
|
||||||
for small objects.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Type declarations */
|
|
||||||
|
|
||||||
#ifndef OF /* function prototypes */
|
|
||||||
# ifdef STDC
|
|
||||||
# define OF(args) args
|
|
||||||
# else
|
|
||||||
# define OF(args) ()
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Z_ARG /* function prototypes for stdarg */
|
|
||||||
# if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
|
||||||
# define Z_ARG(args) args
|
|
||||||
# else
|
|
||||||
# define Z_ARG(args) ()
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The following definitions for FAR are needed only for MSDOS mixed
|
|
||||||
* model programming (small or medium model with some far allocations).
|
|
||||||
* This was tested only with MSC; for other MSDOS compilers you may have
|
|
||||||
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
|
|
||||||
* just define FAR to be empty.
|
|
||||||
*/
|
|
||||||
#ifdef SYS16BIT
|
|
||||||
# if defined(M_I86SM) || defined(M_I86MM)
|
|
||||||
/* MSC small or medium model */
|
|
||||||
# define SMALL_MEDIUM
|
|
||||||
# ifdef _MSC_VER
|
|
||||||
# define FAR _far
|
|
||||||
# else
|
|
||||||
# define FAR far
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# if (defined(__SMALL__) || defined(__MEDIUM__))
|
|
||||||
/* Turbo C small or medium model */
|
|
||||||
# define SMALL_MEDIUM
|
|
||||||
# ifdef __BORLANDC__
|
|
||||||
# define FAR _far
|
|
||||||
# else
|
|
||||||
# define FAR far
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(WINDOWS) || defined(WIN32)
|
|
||||||
/* If building or using zlib as a DLL, define ZLIB_DLL.
|
|
||||||
* This is not mandatory, but it offers a little performance increase.
|
|
||||||
*/
|
|
||||||
# ifdef ZLIB_DLL
|
|
||||||
# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
|
|
||||||
# ifdef ZLIB_INTERNAL
|
|
||||||
# define ZEXTERN extern __declspec(dllexport)
|
|
||||||
# else
|
|
||||||
# define ZEXTERN extern __declspec(dllimport)
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# endif /* ZLIB_DLL */
|
|
||||||
/* If building or using zlib with the WINAPI/WINAPIV calling convention,
|
|
||||||
* define ZLIB_WINAPI.
|
|
||||||
* Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
|
|
||||||
*/
|
|
||||||
# ifdef ZLIB_WINAPI
|
|
||||||
# ifdef FAR
|
|
||||||
# undef FAR
|
|
||||||
# endif
|
|
||||||
# ifndef WIN32_LEAN_AND_MEAN
|
|
||||||
# define WIN32_LEAN_AND_MEAN
|
|
||||||
# endif
|
|
||||||
# include <windows.h>
|
|
||||||
/* No need for _export, use ZLIB.DEF instead. */
|
|
||||||
/* For complete Windows compatibility, use WINAPI, not __stdcall. */
|
|
||||||
# define ZEXPORT WINAPI
|
|
||||||
# ifdef WIN32
|
|
||||||
# define ZEXPORTVA WINAPIV
|
|
||||||
# else
|
|
||||||
# define ZEXPORTVA FAR CDECL
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (__BEOS__)
|
|
||||||
# ifdef ZLIB_DLL
|
|
||||||
# ifdef ZLIB_INTERNAL
|
|
||||||
# define ZEXPORT __declspec(dllexport)
|
|
||||||
# define ZEXPORTVA __declspec(dllexport)
|
|
||||||
# else
|
|
||||||
# define ZEXPORT __declspec(dllimport)
|
|
||||||
# define ZEXPORTVA __declspec(dllimport)
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ZEXTERN
|
|
||||||
# define ZEXTERN extern
|
|
||||||
#endif
|
|
||||||
#ifndef ZEXPORT
|
|
||||||
# define ZEXPORT
|
|
||||||
#endif
|
|
||||||
#ifndef ZEXPORTVA
|
|
||||||
# define ZEXPORTVA
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef FAR
|
|
||||||
# define FAR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__MACTYPES__)
|
|
||||||
typedef unsigned char Byte; /* 8 bits */
|
|
||||||
#endif
|
|
||||||
typedef unsigned int uInt; /* 16 bits or more */
|
|
||||||
typedef unsigned long uLong; /* 32 bits or more */
|
|
||||||
|
|
||||||
#ifdef SMALL_MEDIUM
|
|
||||||
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
|
|
||||||
# define Bytef Byte FAR
|
|
||||||
#else
|
|
||||||
typedef Byte FAR Bytef;
|
|
||||||
#endif
|
|
||||||
typedef char FAR charf;
|
|
||||||
typedef int FAR intf;
|
|
||||||
typedef uInt FAR uIntf;
|
|
||||||
typedef uLong FAR uLongf;
|
|
||||||
|
|
||||||
#ifdef STDC
|
|
||||||
typedef void const *voidpc;
|
|
||||||
typedef void FAR *voidpf;
|
|
||||||
typedef void *voidp;
|
|
||||||
#else
|
|
||||||
typedef Byte const *voidpc;
|
|
||||||
typedef Byte FAR *voidpf;
|
|
||||||
typedef Byte *voidp;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
|
|
||||||
# include <limits.h>
|
|
||||||
# if (UINT_MAX == 0xffffffffUL)
|
|
||||||
# define Z_U4 unsigned
|
|
||||||
# elif (ULONG_MAX == 0xffffffffUL)
|
|
||||||
# define Z_U4 unsigned long
|
|
||||||
# elif (USHRT_MAX == 0xffffffffUL)
|
|
||||||
# define Z_U4 unsigned short
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef Z_U4
|
|
||||||
typedef Z_U4 z_crc_t;
|
|
||||||
#else
|
|
||||||
typedef unsigned long z_crc_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
|
|
||||||
# define Z_HAVE_UNISTD_H
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
|
|
||||||
# define Z_HAVE_STDARG_H
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef STDC
|
|
||||||
# ifndef Z_SOLO
|
|
||||||
# include <sys/types.h> /* for off_t */
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
|
||||||
# ifndef Z_SOLO
|
|
||||||
# include <stdarg.h> /* for va_list */
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# ifndef Z_SOLO
|
|
||||||
# include <stddef.h> /* for wchar_t */
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
|
|
||||||
* "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
|
|
||||||
* though the former does not conform to the LFS document), but considering
|
|
||||||
* both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
|
|
||||||
* equivalently requesting no 64-bit operations
|
|
||||||
*/
|
|
||||||
#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
|
|
||||||
# undef _LARGEFILE64_SOURCE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Z_HAVE_UNISTD_H
|
|
||||||
# ifdef __WATCOMC__
|
|
||||||
# define Z_HAVE_UNISTD_H
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#ifndef Z_HAVE_UNISTD_H
|
|
||||||
# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32)
|
|
||||||
# define Z_HAVE_UNISTD_H
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#ifndef Z_SOLO
|
|
||||||
# if defined(Z_HAVE_UNISTD_H)
|
|
||||||
# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
|
|
||||||
# ifdef VMS
|
|
||||||
# include <unixio.h> /* for off_t */
|
|
||||||
# endif
|
|
||||||
# ifndef z_off_t
|
|
||||||
# define z_off_t off_t
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
|
|
||||||
# define Z_LFS64
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
|
|
||||||
# define Z_LARGE64
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
|
|
||||||
# define Z_WANT64
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(SEEK_SET) && !defined(Z_SOLO)
|
|
||||||
# define SEEK_SET 0 /* Seek from beginning of file. */
|
|
||||||
# define SEEK_CUR 1 /* Seek from current position. */
|
|
||||||
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef z_off_t
|
|
||||||
# define z_off_t long
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(_WIN32) && defined(Z_LARGE64)
|
|
||||||
# define z_off64_t off64_t
|
|
||||||
#else
|
|
||||||
# if defined(_WIN32) && !defined(__GNUC__)
|
|
||||||
# define z_off64_t __int64
|
|
||||||
# else
|
|
||||||
# define z_off64_t z_off_t
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* MVS linker does not support external names larger than 8 bytes */
|
|
||||||
#if defined(__MVS__)
|
|
||||||
#pragma map(deflateInit_,"DEIN")
|
|
||||||
#pragma map(deflateInit2_,"DEIN2")
|
|
||||||
#pragma map(deflateEnd,"DEEND")
|
|
||||||
#pragma map(deflateBound,"DEBND")
|
|
||||||
#pragma map(inflateInit_,"ININ")
|
|
||||||
#pragma map(inflateInit2_,"ININ2")
|
|
||||||
#pragma map(inflateEnd,"INEND")
|
|
||||||
#pragma map(inflateSync,"INSY")
|
|
||||||
#pragma map(inflateSetDictionary,"INSEDI")
|
|
||||||
#pragma map(compressBound,"CMBND")
|
|
||||||
#pragma map(inflate_table,"INTABL")
|
|
||||||
#pragma map(inflate_fast,"INFA")
|
|
||||||
#pragma map(inflate_copyright,"INCOPY")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ZCONF_H */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,68 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(SolutionDir)common\vsprops\BaseProjectConfig.props" />
|
|
||||||
<Import Project="$(SolutionDir)common\vsprops\WinSDK.props" />
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{2F6C0388-20CB-4242-9F6C-A6EBB6A83F47}</ProjectGuid>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<PlatformToolset Condition="!$(Configuration.Contains(Clang))">$(DefaultPlatformToolset)</PlatformToolset>
|
|
||||||
<PlatformToolset Condition="$(Configuration.Contains(Clang))">ClangCL</PlatformToolset>
|
|
||||||
<WholeProgramOptimization Condition="$(Configuration.Contains(Release))">true</WholeProgramOptimization>
|
|
||||||
<UseDebugLibraries Condition="$(Configuration.Contains(Debug))">true</UseDebugLibraries>
|
|
||||||
<UseDebugLibraries Condition="!$(Configuration.Contains(Debug))">false</UseDebugLibraries>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings" />
|
|
||||||
<ImportGroup Label="PropertySheets">
|
|
||||||
<Import Project="..\DefaultProjectRootDir.props" />
|
|
||||||
<Import Project="..\3rdparty.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Debug))" Project="..\..\common\vsprops\CodeGen_Debug.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Devel))" Project="..\..\common\vsprops\CodeGen_Devel.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Release))" Project="..\..\common\vsprops\CodeGen_Release.props" />
|
|
||||||
<Import Condition="!$(Configuration.Contains(Release))" Project="..\..\common\vsprops\IncrementalLinking.props" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup>
|
|
||||||
<ClCompile>
|
|
||||||
<PreprocessorDefinitions>_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="adler32.c" />
|
|
||||||
<ClCompile Include="compress.c" />
|
|
||||||
<ClCompile Include="crc32.c" />
|
|
||||||
<ClCompile Include="deflate.c" />
|
|
||||||
<ClCompile Include="gzclose.c" />
|
|
||||||
<ClCompile Include="gzlib.c" />
|
|
||||||
<ClCompile Include="gzread.c" />
|
|
||||||
<ClCompile Include="gzwrite.c" />
|
|
||||||
<ClCompile Include="infback.c" />
|
|
||||||
<ClCompile Include="inffast.c" />
|
|
||||||
<ClCompile Include="inflate.c" />
|
|
||||||
<ClCompile Include="inftrees.c" />
|
|
||||||
<ClCompile Include="trees.c" />
|
|
||||||
<ClCompile Include="uncompr.c" />
|
|
||||||
<ClCompile Include="zutil.c" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="crc32.h" />
|
|
||||||
<ClInclude Include="deflate.h" />
|
|
||||||
<ClInclude Include="inffast.h" />
|
|
||||||
<ClInclude Include="inffixed.h" />
|
|
||||||
<ClInclude Include="inflate.h" />
|
|
||||||
<ClInclude Include="inftrees.h" />
|
|
||||||
<ClInclude Include="trees.h" />
|
|
||||||
<ClInclude Include="zconf.h" />
|
|
||||||
<ClInclude Include="zlib.h" />
|
|
||||||
<ClInclude Include="zutil.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets" />
|
|
||||||
</Project>
|
|
|
@ -1,92 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="adler32.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="compress.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="crc32.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="deflate.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="gzclose.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="gzlib.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="gzread.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="gzwrite.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="infback.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="inffast.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="inflate.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="inftrees.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="trees.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="uncompr.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="zutil.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="crc32.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="deflate.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="inffast.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="inffixed.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="inflate.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="inftrees.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="trees.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="zconf.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="zlib.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="zutil.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,299 +0,0 @@
|
||||||
/* zutil.c -- target dependent utility functions for the compression library
|
|
||||||
* Copyright (C) 1995-2017 Jean-loup Gailly
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @(#) $Id$ */
|
|
||||||
|
|
||||||
#include "zutil.h"
|
|
||||||
#ifndef Z_SOLO
|
|
||||||
# include "gzguts.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
z_const char * const z_errmsg[10] = {
|
|
||||||
(z_const char *)"need dictionary", /* Z_NEED_DICT 2 */
|
|
||||||
(z_const char *)"stream end", /* Z_STREAM_END 1 */
|
|
||||||
(z_const char *)"", /* Z_OK 0 */
|
|
||||||
(z_const char *)"file error", /* Z_ERRNO (-1) */
|
|
||||||
(z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */
|
|
||||||
(z_const char *)"data error", /* Z_DATA_ERROR (-3) */
|
|
||||||
(z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */
|
|
||||||
(z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */
|
|
||||||
(z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */
|
|
||||||
(z_const char *)""
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const char * ZEXPORT zlibVersion(void) {
|
|
||||||
return ZLIB_VERSION;
|
|
||||||
}
|
|
||||||
|
|
||||||
uLong ZEXPORT zlibCompileFlags(void) {
|
|
||||||
uLong flags;
|
|
||||||
|
|
||||||
flags = 0;
|
|
||||||
switch ((int)(sizeof(uInt))) {
|
|
||||||
case 2: break;
|
|
||||||
case 4: flags += 1; break;
|
|
||||||
case 8: flags += 2; break;
|
|
||||||
default: flags += 3;
|
|
||||||
}
|
|
||||||
switch ((int)(sizeof(uLong))) {
|
|
||||||
case 2: break;
|
|
||||||
case 4: flags += 1 << 2; break;
|
|
||||||
case 8: flags += 2 << 2; break;
|
|
||||||
default: flags += 3 << 2;
|
|
||||||
}
|
|
||||||
switch ((int)(sizeof(voidpf))) {
|
|
||||||
case 2: break;
|
|
||||||
case 4: flags += 1 << 4; break;
|
|
||||||
case 8: flags += 2 << 4; break;
|
|
||||||
default: flags += 3 << 4;
|
|
||||||
}
|
|
||||||
switch ((int)(sizeof(z_off_t))) {
|
|
||||||
case 2: break;
|
|
||||||
case 4: flags += 1 << 6; break;
|
|
||||||
case 8: flags += 2 << 6; break;
|
|
||||||
default: flags += 3 << 6;
|
|
||||||
}
|
|
||||||
#ifdef ZLIB_DEBUG
|
|
||||||
flags += 1 << 8;
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
#if defined(ASMV) || defined(ASMINF)
|
|
||||||
flags += 1 << 9;
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
#ifdef ZLIB_WINAPI
|
|
||||||
flags += 1 << 10;
|
|
||||||
#endif
|
|
||||||
#ifdef BUILDFIXED
|
|
||||||
flags += 1 << 12;
|
|
||||||
#endif
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
flags += 1 << 13;
|
|
||||||
#endif
|
|
||||||
#ifdef NO_GZCOMPRESS
|
|
||||||
flags += 1L << 16;
|
|
||||||
#endif
|
|
||||||
#ifdef NO_GZIP
|
|
||||||
flags += 1L << 17;
|
|
||||||
#endif
|
|
||||||
#ifdef PKZIP_BUG_WORKAROUND
|
|
||||||
flags += 1L << 20;
|
|
||||||
#endif
|
|
||||||
#ifdef FASTEST
|
|
||||||
flags += 1L << 21;
|
|
||||||
#endif
|
|
||||||
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
|
||||||
# ifdef NO_vsnprintf
|
|
||||||
flags += 1L << 25;
|
|
||||||
# ifdef HAS_vsprintf_void
|
|
||||||
flags += 1L << 26;
|
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
# ifdef HAS_vsnprintf_void
|
|
||||||
flags += 1L << 26;
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
flags += 1L << 24;
|
|
||||||
# ifdef NO_snprintf
|
|
||||||
flags += 1L << 25;
|
|
||||||
# ifdef HAS_sprintf_void
|
|
||||||
flags += 1L << 26;
|
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
# ifdef HAS_snprintf_void
|
|
||||||
flags += 1L << 26;
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
return flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ZLIB_DEBUG
|
|
||||||
#include <stdlib.h>
|
|
||||||
# ifndef verbose
|
|
||||||
# define verbose 0
|
|
||||||
# endif
|
|
||||||
int ZLIB_INTERNAL z_verbose = verbose;
|
|
||||||
|
|
||||||
void ZLIB_INTERNAL z_error(char *m) {
|
|
||||||
fprintf(stderr, "%s\n", m);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* exported to allow conversion of error code to string for compress() and
|
|
||||||
* uncompress()
|
|
||||||
*/
|
|
||||||
const char * ZEXPORT zError(int err) {
|
|
||||||
return ERR_MSG(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800
|
|
||||||
/* The older Microsoft C Run-Time Library for Windows CE doesn't have
|
|
||||||
* errno. We define it as a global variable to simplify porting.
|
|
||||||
* Its value is always 0 and should not be used.
|
|
||||||
*/
|
|
||||||
int errno = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_MEMCPY
|
|
||||||
|
|
||||||
void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) {
|
|
||||||
if (len == 0) return;
|
|
||||||
do {
|
|
||||||
*dest++ = *source++; /* ??? to be unrolled */
|
|
||||||
} while (--len != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) {
|
|
||||||
uInt j;
|
|
||||||
|
|
||||||
for (j = 0; j < len; j++) {
|
|
||||||
if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) {
|
|
||||||
if (len == 0) return;
|
|
||||||
do {
|
|
||||||
*dest++ = 0; /* ??? to be unrolled */
|
|
||||||
} while (--len != 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Z_SOLO
|
|
||||||
|
|
||||||
#ifdef SYS16BIT
|
|
||||||
|
|
||||||
#ifdef __TURBOC__
|
|
||||||
/* Turbo C in 16-bit mode */
|
|
||||||
|
|
||||||
# define MY_ZCALLOC
|
|
||||||
|
|
||||||
/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
|
|
||||||
* and farmalloc(64K) returns a pointer with an offset of 8, so we
|
|
||||||
* must fix the pointer. Warning: the pointer must be put back to its
|
|
||||||
* original form in order to free it, use zcfree().
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define MAX_PTR 10
|
|
||||||
/* 10*64K = 640K */
|
|
||||||
|
|
||||||
local int next_ptr = 0;
|
|
||||||
|
|
||||||
typedef struct ptr_table_s {
|
|
||||||
voidpf org_ptr;
|
|
||||||
voidpf new_ptr;
|
|
||||||
} ptr_table;
|
|
||||||
|
|
||||||
local ptr_table table[MAX_PTR];
|
|
||||||
/* This table is used to remember the original form of pointers
|
|
||||||
* to large buffers (64K). Such pointers are normalized with a zero offset.
|
|
||||||
* Since MSDOS is not a preemptive multitasking OS, this table is not
|
|
||||||
* protected from concurrent access. This hack doesn't work anyway on
|
|
||||||
* a protected system like OS/2. Use Microsoft C instead.
|
|
||||||
*/
|
|
||||||
|
|
||||||
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
|
|
||||||
voidpf buf;
|
|
||||||
ulg bsize = (ulg)items*size;
|
|
||||||
|
|
||||||
(void)opaque;
|
|
||||||
|
|
||||||
/* If we allocate less than 65520 bytes, we assume that farmalloc
|
|
||||||
* will return a usable pointer which doesn't have to be normalized.
|
|
||||||
*/
|
|
||||||
if (bsize < 65520L) {
|
|
||||||
buf = farmalloc(bsize);
|
|
||||||
if (*(ush*)&buf != 0) return buf;
|
|
||||||
} else {
|
|
||||||
buf = farmalloc(bsize + 16L);
|
|
||||||
}
|
|
||||||
if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
|
|
||||||
table[next_ptr].org_ptr = buf;
|
|
||||||
|
|
||||||
/* Normalize the pointer to seg:0 */
|
|
||||||
*((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
|
|
||||||
*(ush*)&buf = 0;
|
|
||||||
table[next_ptr++].new_ptr = buf;
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
|
|
||||||
int n;
|
|
||||||
|
|
||||||
(void)opaque;
|
|
||||||
|
|
||||||
if (*(ush*)&ptr != 0) { /* object < 64K */
|
|
||||||
farfree(ptr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* Find the original pointer */
|
|
||||||
for (n = 0; n < next_ptr; n++) {
|
|
||||||
if (ptr != table[n].new_ptr) continue;
|
|
||||||
|
|
||||||
farfree(table[n].org_ptr);
|
|
||||||
while (++n < next_ptr) {
|
|
||||||
table[n-1] = table[n];
|
|
||||||
}
|
|
||||||
next_ptr--;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Assert(0, "zcfree: ptr not found");
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __TURBOC__ */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef M_I86
|
|
||||||
/* Microsoft C in 16-bit mode */
|
|
||||||
|
|
||||||
# define MY_ZCALLOC
|
|
||||||
|
|
||||||
#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
|
|
||||||
# define _halloc halloc
|
|
||||||
# define _hfree hfree
|
|
||||||
#endif
|
|
||||||
|
|
||||||
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) {
|
|
||||||
(void)opaque;
|
|
||||||
return _halloc((long)items, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
|
|
||||||
(void)opaque;
|
|
||||||
_hfree(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* M_I86 */
|
|
||||||
|
|
||||||
#endif /* SYS16BIT */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef MY_ZCALLOC /* Any system without a special alloc function */
|
|
||||||
|
|
||||||
#ifndef STDC
|
|
||||||
extern voidp malloc(uInt size);
|
|
||||||
extern voidp calloc(uInt items, uInt size);
|
|
||||||
extern void free(voidpf ptr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
|
|
||||||
(void)opaque;
|
|
||||||
return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
|
|
||||||
(voidpf)calloc(items, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
|
|
||||||
(void)opaque;
|
|
||||||
free(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* MY_ZCALLOC */
|
|
||||||
|
|
||||||
#endif /* !Z_SOLO */
|
|
|
@ -1,275 +0,0 @@
|
||||||
/* zutil.h -- internal interface and configuration of the compression library
|
|
||||||
* Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* WARNING: this file should *not* be used by applications. It is
|
|
||||||
part of the implementation of the compression library and is
|
|
||||||
subject to change. Applications should only use zlib.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @(#) $Id$ */
|
|
||||||
|
|
||||||
#ifndef ZUTIL_H
|
|
||||||
#define ZUTIL_H
|
|
||||||
|
|
||||||
#ifdef HAVE_HIDDEN
|
|
||||||
# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
|
|
||||||
#else
|
|
||||||
# define ZLIB_INTERNAL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "zlib.h"
|
|
||||||
|
|
||||||
#if defined(STDC) && !defined(Z_SOLO)
|
|
||||||
# if !(defined(_WIN32_WCE) && defined(_MSC_VER))
|
|
||||||
# include <stddef.h>
|
|
||||||
# endif
|
|
||||||
# include <string.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef local
|
|
||||||
# define local static
|
|
||||||
#endif
|
|
||||||
/* since "static" is used to mean two completely different things in C, we
|
|
||||||
define "local" for the non-static meaning of "static", for readability
|
|
||||||
(compile with -Dlocal if your debugger can't find static symbols) */
|
|
||||||
|
|
||||||
typedef unsigned char uch;
|
|
||||||
typedef uch FAR uchf;
|
|
||||||
typedef unsigned short ush;
|
|
||||||
typedef ush FAR ushf;
|
|
||||||
typedef unsigned long ulg;
|
|
||||||
|
|
||||||
#if !defined(Z_U8) && !defined(Z_SOLO) && defined(STDC)
|
|
||||||
# include <limits.h>
|
|
||||||
# if (ULONG_MAX == 0xffffffffffffffff)
|
|
||||||
# define Z_U8 unsigned long
|
|
||||||
# elif (ULLONG_MAX == 0xffffffffffffffff)
|
|
||||||
# define Z_U8 unsigned long long
|
|
||||||
# elif (UINT_MAX == 0xffffffffffffffff)
|
|
||||||
# define Z_U8 unsigned
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
|
||||||
/* (size given to avoid silly warnings with Visual C++) */
|
|
||||||
|
|
||||||
#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
|
|
||||||
|
|
||||||
#define ERR_RETURN(strm,err) \
|
|
||||||
return (strm->msg = ERR_MSG(err), (err))
|
|
||||||
/* To be used only when the state is known to be valid */
|
|
||||||
|
|
||||||
/* common constants */
|
|
||||||
|
|
||||||
#ifndef DEF_WBITS
|
|
||||||
# define DEF_WBITS MAX_WBITS
|
|
||||||
#endif
|
|
||||||
/* default windowBits for decompression. MAX_WBITS is for compression only */
|
|
||||||
|
|
||||||
#if MAX_MEM_LEVEL >= 8
|
|
||||||
# define DEF_MEM_LEVEL 8
|
|
||||||
#else
|
|
||||||
# define DEF_MEM_LEVEL MAX_MEM_LEVEL
|
|
||||||
#endif
|
|
||||||
/* default memLevel */
|
|
||||||
|
|
||||||
#define STORED_BLOCK 0
|
|
||||||
#define STATIC_TREES 1
|
|
||||||
#define DYN_TREES 2
|
|
||||||
/* The three kinds of block type */
|
|
||||||
|
|
||||||
#define MIN_MATCH 3
|
|
||||||
#define MAX_MATCH 258
|
|
||||||
/* The minimum and maximum match lengths */
|
|
||||||
|
|
||||||
#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
|
|
||||||
|
|
||||||
/* target dependencies */
|
|
||||||
|
|
||||||
#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
|
|
||||||
# define OS_CODE 0x00
|
|
||||||
# ifndef Z_SOLO
|
|
||||||
# if defined(__TURBOC__) || defined(__BORLANDC__)
|
|
||||||
# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
|
|
||||||
/* Allow compilation with ANSI keywords only enabled */
|
|
||||||
void _Cdecl farfree( void *block );
|
|
||||||
void *_Cdecl farmalloc( unsigned long nbytes );
|
|
||||||
# else
|
|
||||||
# include <alloc.h>
|
|
||||||
# endif
|
|
||||||
# else /* MSC or DJGPP */
|
|
||||||
# include <malloc.h>
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef AMIGA
|
|
||||||
# define OS_CODE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(VAXC) || defined(VMS)
|
|
||||||
# define OS_CODE 2
|
|
||||||
# define F_OPEN(name, mode) \
|
|
||||||
fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __370__
|
|
||||||
# if __TARGET_LIB__ < 0x20000000
|
|
||||||
# define OS_CODE 4
|
|
||||||
# elif __TARGET_LIB__ < 0x40000000
|
|
||||||
# define OS_CODE 11
|
|
||||||
# else
|
|
||||||
# define OS_CODE 8
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ATARI) || defined(atarist)
|
|
||||||
# define OS_CODE 5
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef OS2
|
|
||||||
# define OS_CODE 6
|
|
||||||
# if defined(M_I86) && !defined(Z_SOLO)
|
|
||||||
# include <malloc.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(MACOS) || defined(TARGET_OS_MAC)
|
|
||||||
# define OS_CODE 7
|
|
||||||
# ifndef Z_SOLO
|
|
||||||
# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
|
|
||||||
# include <unix.h> /* for fdopen */
|
|
||||||
# else
|
|
||||||
# ifndef fdopen
|
|
||||||
# define fdopen(fd,mode) NULL /* No fdopen() */
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __acorn
|
|
||||||
# define OS_CODE 13
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(__CYGWIN__)
|
|
||||||
# define OS_CODE 10
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _BEOS_
|
|
||||||
# define OS_CODE 16
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __TOS_OS400__
|
|
||||||
# define OS_CODE 18
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
# define OS_CODE 19
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_BEOS_) || defined(RISCOS)
|
|
||||||
# define fdopen(fd,mode) NULL /* No fdopen() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
|
|
||||||
# if defined(_WIN32_WCE)
|
|
||||||
# define fdopen(fd,mode) NULL /* No fdopen() */
|
|
||||||
# else
|
|
||||||
# define fdopen(fd,type) _fdopen(fd,type)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__BORLANDC__) && !defined(MSDOS)
|
|
||||||
#pragma warn -8004
|
|
||||||
#pragma warn -8008
|
|
||||||
#pragma warn -8066
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* provide prototypes for these when building zlib without LFS */
|
|
||||||
#if !defined(_WIN32) && \
|
|
||||||
(!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
|
|
||||||
ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);
|
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);
|
|
||||||
ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* common defaults */
|
|
||||||
|
|
||||||
#ifndef OS_CODE
|
|
||||||
# define OS_CODE 3 /* assume Unix */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef F_OPEN
|
|
||||||
# define F_OPEN(name, mode) fopen((name), (mode))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* functions */
|
|
||||||
|
|
||||||
#if defined(pyr) || defined(Z_SOLO)
|
|
||||||
# define NO_MEMCPY
|
|
||||||
#endif
|
|
||||||
#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
|
|
||||||
/* Use our own functions for small and medium model with MSC <= 5.0.
|
|
||||||
* You may have to use the same strategy for Borland C (untested).
|
|
||||||
* The __SC__ check is for Symantec.
|
|
||||||
*/
|
|
||||||
# define NO_MEMCPY
|
|
||||||
#endif
|
|
||||||
#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
|
|
||||||
# define HAVE_MEMCPY
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_MEMCPY
|
|
||||||
# ifdef SMALL_MEDIUM /* MSDOS small or medium model */
|
|
||||||
# define zmemcpy _fmemcpy
|
|
||||||
# define zmemcmp _fmemcmp
|
|
||||||
# define zmemzero(dest, len) _fmemset(dest, 0, len)
|
|
||||||
# else
|
|
||||||
# define zmemcpy memcpy
|
|
||||||
# define zmemcmp memcmp
|
|
||||||
# define zmemzero(dest, len) memset(dest, 0, len)
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len);
|
|
||||||
int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len);
|
|
||||||
void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Diagnostic functions */
|
|
||||||
#ifdef ZLIB_DEBUG
|
|
||||||
# include <stdio.h>
|
|
||||||
extern int ZLIB_INTERNAL z_verbose;
|
|
||||||
extern void ZLIB_INTERNAL z_error(char *m);
|
|
||||||
# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
|
|
||||||
# define Trace(x) {if (z_verbose>=0) fprintf x ;}
|
|
||||||
# define Tracev(x) {if (z_verbose>0) fprintf x ;}
|
|
||||||
# define Tracevv(x) {if (z_verbose>1) fprintf x ;}
|
|
||||||
# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
|
|
||||||
# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
|
|
||||||
#else
|
|
||||||
# define Assert(cond,msg)
|
|
||||||
# define Trace(x)
|
|
||||||
# define Tracev(x)
|
|
||||||
# define Tracevv(x)
|
|
||||||
# define Tracec(c,x)
|
|
||||||
# define Tracecv(c,x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Z_SOLO
|
|
||||||
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items,
|
|
||||||
unsigned size);
|
|
||||||
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ZALLOC(strm, items, size) \
|
|
||||||
(*((strm)->zalloc))((strm)->opaque, (items), (size))
|
|
||||||
#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
|
|
||||||
#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
|
|
||||||
|
|
||||||
/* Reverse the bytes in a 32-bit value */
|
|
||||||
#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
|
|
||||||
(((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
|
|
||||||
|
|
||||||
#endif /* ZUTIL_H */
|
|
|
@ -1,37 +0,0 @@
|
||||||
enable_language(C ASM)
|
|
||||||
|
|
||||||
add_library(pcsx2-zstd
|
|
||||||
zstd/lib/common/debug.c
|
|
||||||
zstd/lib/common/entropy_common.c
|
|
||||||
zstd/lib/common/error_private.c
|
|
||||||
zstd/lib/common/fse_decompress.c
|
|
||||||
zstd/lib/common/pool.c
|
|
||||||
zstd/lib/common/threading.c
|
|
||||||
zstd/lib/common/xxhash.c
|
|
||||||
zstd/lib/common/zstd_common.c
|
|
||||||
zstd/lib/compress/fse_compress.c
|
|
||||||
zstd/lib/compress/hist.c
|
|
||||||
zstd/lib/compress/huf_compress.c
|
|
||||||
zstd/lib/compress/zstd_compress.c
|
|
||||||
zstd/lib/compress/zstd_compress_literals.c
|
|
||||||
zstd/lib/compress/zstd_compress_sequences.c
|
|
||||||
zstd/lib/compress/zstd_compress_superblock.c
|
|
||||||
zstd/lib/compress/zstd_double_fast.c
|
|
||||||
zstd/lib/compress/zstd_fast.c
|
|
||||||
zstd/lib/compress/zstd_lazy.c
|
|
||||||
zstd/lib/compress/zstd_ldm.c
|
|
||||||
zstd/lib/compress/zstdmt_compress.c
|
|
||||||
zstd/lib/compress/zstd_opt.c
|
|
||||||
zstd/lib/decompress/huf_decompress.c
|
|
||||||
zstd/lib/decompress/zstd_ddict.c
|
|
||||||
zstd/lib/decompress/zstd_decompress_block.c
|
|
||||||
zstd/lib/decompress/zstd_decompress.c
|
|
||||||
)
|
|
||||||
|
|
||||||
if(_M_X86 AND (NOT MSVC OR USE_CLANG_CL))
|
|
||||||
target_sources(pcsx2-zstd PRIVATE zstd/lib/decompress/huf_decompress_amd64.S)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_include_directories(pcsx2-zstd PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/zstd/lib")
|
|
||||||
|
|
||||||
add_library(Zstd::Zstd ALIAS pcsx2-zstd)
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 63779c798237346c2b245c546c40b72a5a5913fe
|
|
|
@ -1,105 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(SolutionDir)common\vsprops\BaseProjectConfig.props" />
|
|
||||||
<Import Project="$(SolutionDir)common\vsprops\WinSDK.props" />
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{52244028-937A-44E9-A76B-2BEA18FD239A}</ProjectGuid>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<PlatformToolset Condition="!$(Configuration.Contains(Clang))">$(DefaultPlatformToolset)</PlatformToolset>
|
|
||||||
<PlatformToolset Condition="$(Configuration.Contains(Clang))">ClangCL</PlatformToolset>
|
|
||||||
<CharacterSet>MultiByte</CharacterSet>
|
|
||||||
<WholeProgramOptimization Condition="$(Configuration.Contains(Release))">true</WholeProgramOptimization>
|
|
||||||
<UseDebugLibraries Condition="$(Configuration.Contains(Debug))">true</UseDebugLibraries>
|
|
||||||
<UseDebugLibraries Condition="!$(Configuration.Contains(Debug))">false</UseDebugLibraries>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings" />
|
|
||||||
<ImportGroup Label="PropertySheets">
|
|
||||||
<Import Project="..\DefaultProjectRootDir.props" />
|
|
||||||
<Import Project="..\3rdparty.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Debug))" Project="..\..\common\vsprops\CodeGen_Debug.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Devel))" Project="..\..\common\vsprops\CodeGen_Devel.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Release))" Project="..\..\common\vsprops\CodeGen_Release.props" />
|
|
||||||
<Import Condition="!$(Configuration.Contains(Release))" Project="..\..\common\vsprops\IncrementalLinking.props" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="zstd\lib\common\bitstream.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\compiler.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\cpu.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\debug.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\error_private.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\fse.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\huf.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\mem.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\pool.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\portability_macros.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\threading.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\xxhash.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\zstd_deps.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\zstd_internal.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\zstd_trace.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\clevels.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\hist.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstdmt_compress.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_compress_internal.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_compress_literals.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_compress_sequences.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_compress_superblock.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_cwksp.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_double_fast.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_fast.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_lazy.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_ldm.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_ldm_geartab.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_opt.h" />
|
|
||||||
<ClInclude Include="zstd\lib\decompress\zstd_ddict.h" />
|
|
||||||
<ClInclude Include="zstd\lib\decompress\zstd_decompress_block.h" />
|
|
||||||
<ClInclude Include="zstd\lib\decompress\zstd_decompress_internal.h" />
|
|
||||||
<ClInclude Include="zstd\lib\zdict.h" />
|
|
||||||
<ClInclude Include="zstd\lib\zstd.h" />
|
|
||||||
<ClInclude Include="zstd\lib\zstd_errors.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="zstd\lib\common\debug.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\entropy_common.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\error_private.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\fse_decompress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\pool.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\threading.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\xxhash.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\zstd_common.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\fse_compress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\hist.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\huf_compress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstdmt_compress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_compress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_compress_literals.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_compress_sequences.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_compress_superblock.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_double_fast.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_fast.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_lazy.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_ldm.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_opt.c" />
|
|
||||||
<ClCompile Include="zstd\lib\decompress\huf_decompress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\decompress\zstd_ddict.c" />
|
|
||||||
<ClCompile Include="zstd\lib\decompress\zstd_decompress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\decompress\zstd_decompress_block.c" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemDefinitionGroup>
|
|
||||||
<ClCompile>
|
|
||||||
<PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)3rdparty\zstd\zstd\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets" />
|
|
||||||
</Project>
|
|
|
@ -1,67 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="zstd\lib\zdict.h" />
|
|
||||||
<ClInclude Include="zstd\lib\zstd.h" />
|
|
||||||
<ClInclude Include="zstd\lib\zstd_errors.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\pool.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\portability_macros.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\threading.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\xxhash.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\zstd_deps.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\zstd_internal.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\zstd_trace.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\bitstream.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\compiler.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\cpu.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\debug.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\error_private.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\fse.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\huf.h" />
|
|
||||||
<ClInclude Include="zstd\lib\common\mem.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_compress_internal.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_compress_literals.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_compress_sequences.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_compress_superblock.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_cwksp.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_double_fast.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_fast.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_lazy.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_ldm.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_ldm_geartab.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstd_opt.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\zstdmt_compress.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\clevels.h" />
|
|
||||||
<ClInclude Include="zstd\lib\compress\hist.h" />
|
|
||||||
<ClInclude Include="zstd\lib\decompress\zstd_ddict.h" />
|
|
||||||
<ClInclude Include="zstd\lib\decompress\zstd_decompress_block.h" />
|
|
||||||
<ClInclude Include="zstd\lib\decompress\zstd_decompress_internal.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="zstd\lib\common\pool.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\threading.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\xxhash.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\zstd_common.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\debug.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\entropy_common.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\error_private.c" />
|
|
||||||
<ClCompile Include="zstd\lib\common\fse_decompress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_compress_literals.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_compress_sequences.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_compress_superblock.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_double_fast.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_fast.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_lazy.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_ldm.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_opt.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstdmt_compress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\fse_compress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\hist.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\huf_compress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\compress\zstd_compress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\decompress\huf_decompress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\decompress\zstd_ddict.c" />
|
|
||||||
<ClCompile Include="zstd\lib\decompress\zstd_decompress.c" />
|
|
||||||
<ClCompile Include="zstd\lib\decompress\zstd_decompress_block.c" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
Loading…
Reference in New Issue