summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Bowler <jbowler@acm.org>2013-03-03 21:29:36 -0600
committerGlenn Randers-Pehrson <glennrp at users.sourceforge.net>2013-03-03 21:29:36 -0600
commit808ea281a4d8229f230fc24737336c278028add8 (patch)
treebd1cf9c19119973a83ffaf1a3558d1e22055ef8c
parentec89aefb448a39e41deddd0d174eab65f928749b (diff)
downloadlibpng-808ea281a4d8229f230fc24737336c278028add8.tar.gz
[libpng17] Corrected Android builds and corrected libpng.vers with symbol
prefixing. This adds an API to set optimization options externally, providing an alternative and general solution for the non-portable run-time tests used by the ARM Neon code. It also makes those tests compile and link on Android. The order of settings vs options in pnglibconf.h is reversed to allow settings to depend on options and options can now set (or override) the defaults for settings.
-rw-r--r--ANNOUNCE11
-rw-r--r--CHANGES9
-rw-r--r--arm/arm_init.c48
-rw-r--r--configure.ac33
-rw-r--r--png.c25
-rw-r--r--png.h53
-rw-r--r--pngstruct.h5
-rwxr-xr-xscripts/checksym.awk10
-rw-r--r--scripts/dfn.awk191
-rwxr-xr-xscripts/options.awk205
-rw-r--r--scripts/pnglibconf.dfa29
-rw-r--r--scripts/pnglibconf.h.prebuilt56
-rw-r--r--scripts/symbols.def3
-rw-r--r--scripts/symbols.dfn3
14 files changed, 462 insertions, 219 deletions
diff --git a/ANNOUNCE b/ANNOUNCE
index aef49e63e..cdbba1af9 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,5 +1,5 @@
-Libpng 1.7.0beta05 - March 3, 2013
+Libpng 1.7.0beta05 - March 4, 2013
This is not intended to be a public release. It will be replaced
within a few weeks by a public version or by another test version.
@@ -193,13 +193,20 @@ Version 1.7.0beta04 [February 27, 2013]
Revised scripts/dfn.awk to work with the buggy MSYS awk that has trouble
with CRLF line endings.
-Version 1.7.0beta05 [March 3, 2013]
+Version 1.7.0beta05 [March 4, 2013]
Avoid a possible memory leak in contrib/gregbook/readpng.c
Changed user chunk callback API to respect global and per chunk defaults.
Previously a return of 0 from a user chunk callback would result in the
chunk being saved (if this was safe, even if the chunk was unsafe-to-copy);
this change respects the defaults set by the application, so unknown chunks
can be discarded by default and known-safe ones preserved.
+ Corrected Android builds and corrected libpng.vers with symbol
+ prefixing. This adds an API to set optimization options externally,
+ providing an alternative and general solution for the non-portable
+ run-time tests used by the ARM Neon code. It also makes those tests
+ compile and link on Android. The order of settings vs options in
+ pnglibconf.h is reversed to allow settings to depend on options and
+ options can now set (or override) the defaults for settings.
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
diff --git a/CHANGES b/CHANGES
index e5d72ebaa..f47e05783 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4480,13 +4480,20 @@ Version 1.7.0beta04 [February 27, 2013]
Revised scripts/dfn.awk to work with the buggy MSYS awk that has trouble
with CRLF line endings.
-Version 1.7.0beta05 [March 3, 2013]
+Version 1.7.0beta05 [March 4, 2013]
Avoid a possible memory leak in contrib/gregbook/readpng.c
Changed user chunk callback API to respect global and per chunk defaults.
Previously a return of 0 from a user chunk callback would result in the
chunk being saved (if this was safe, even if the chunk was unsafe-to-copy);
this change respects the defaults set by the application, so unknown chunks
can be discarded by default and known-safe ones preserved.
+ Corrected Android builds and corrected libpng.vers with symbol
+ prefixing. This adds an API to set optimization options externally,
+ providing an alternative and general solution for the non-portable
+ run-time tests used by the ARM Neon code. It also makes those tests
+ compile and link on Android. The order of settings vs options in
+ pnglibconf.h is reversed to allow settings to depend on options and
+ options can now set (or override) the defaults for settings.
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
diff --git a/arm/arm_init.c b/arm/arm_init.c
index 78750d6a4..1e7b9981c 100644
--- a/arm/arm_init.c
+++ b/arm/arm_init.c
@@ -16,16 +16,7 @@
#include "../pngpriv.h"
-#if defined(PNG_FILTER_OPTIMIZATIONS) && defined(__arm__) && \
- defined(__ARM_NEON__)
-/* __arm__ is defined by GCC, MSVC defines _M_ARM to the ARM version number,
- * Andoid intends to define __ANDROID__, however there are bugs in their
- * toolchain; use -D__ANDROID__ to work round this.
- *
- * __ARM_NEON__ is used to ensure that the compiler has the appropriate ARM
- * NEON support
- */
-
+#ifdef PNG_ARM_NEON_SUPPORTED
#ifdef PNG_ARM_NEON_CHECK_SUPPORTED /* Do run-time checks */
#include <signal.h> /* for sig_atomic_t */
@@ -45,7 +36,8 @@ png_have_neon(png_structp png_ptr)
* implemented as below, therefore it is better to cache the result (these
* function calls may be slow!)
*/
- return andoid_getCpuFamily() == ANDROID_CPU_FAMILY_ARM &&
+ PNG_UNUSED(png_ptr)
+ return android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM &&
(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0;
}
#elif defined(__linux__)
@@ -161,15 +153,39 @@ png_have_neon(png_structp png_ptr)
void
png_init_filter_functions_neon(png_structp pp, unsigned int bpp)
{
+#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 */
+ {
+ static volatile sig_atomic_t no_neon = -1; /* not checked */
- if (no_neon < 0)
- no_neon = !png_have_neon(pp);
+ if (no_neon < 0)
+ no_neon = !png_have_neon(pp);
- if (no_neon)
- return;
+ if (no_neon)
+ return;
+ }
+#ifdef PNG_ARM_NEON_API_SUPPORTED
+ break;
+#endif
#endif /* PNG_ARM_NEON_CHECK_SUPPORTED */
+#ifdef PNG_ARM_NEON_API_SUPPORTED
+ case PNG_OPTION_ON:
+ /* Option turned on */
+ break;
+
+ default: /* OFF or INVALID */
+ return;
+ }
+#endif
/* IMPORTANT: any new external functions used here must be declared using
* PNG_INTERNAL_FUNCTION in ../pngpriv.h. This is required so that the
diff --git a/configure.ac b/configure.ac
index 523fc2cc2..14dc22f50 100644
--- a/configure.ac
+++ b/configure.ac
@@ -341,18 +341,27 @@ AC_SUBST([AM_CCASFLAGS], [-Wa,--noexecstack])
AC_ARG_ENABLE([arm-neon],
AS_HELP_STRING([[[--enable-arm-neon]]],
- [Enable ARM NEON optimizations: use 'always' to turn off run-time checks]),
- [if test "${enableval}" = "yes" -o "${enableval}" = "always"; then
- AC_DEFINE([PNG_FILTER_OPTIMIZATIONS],
- [png_init_filter_functions_neon],
- [ARM NEON filter initialization function])
- AC_DEFINE([PNG_ALIGNED_MEMORY_SUPPORTED], [],
- [Align row buffers])
- if test "${enableval}" = "always"; then
- AC_DEFINE([PNG_NO_ARM_NEON_CHECK], [],
- [Turn off run-time checking for ARM NEON support])
- fi
- fi])
+ [Enable ARM NEON optimizations: =off, check, api, on:]
+ [off: disable the optimizations; check: use internal checking code]
+ [(deprecated and poorly supported); api: disable by default, enable by]
+ [a call to png_set_option; on: turn on unconditionally. The]
+ [default is 'on' if __ARM_NEON__ is defined, otherwise 'off'.]),
+ [case "$enableval" in
+ off)
+ AC_DEFINE([PNG_NO_ARM_NEON], [],
+ [Disable ARM Neon optimizations]);;
+ check)
+ AC_DEFINE([PNG_ARM_NEON_CHECK_SUPPORTED], [],
+ [Check for ARM Neon support at run-time]);;
+ api)
+ AC_DEFINE([PNG_ARM_NEON_API_SUPPORTED], [],
+ [Turn on ARM Neon optimizations at run-time]);;
+ on)
+ AC_DEFINE([PNG_ARM_NEON_SUPPORTED], [],
+ [Enable ARM Neon optimizations]);;
+ *)
+ AC_MSG_ERROR([arm-neon: option value required (off/check/api/on)]);;
+ esac])
AM_CONDITIONAL([PNG_ARM_NEON], [test "${enable_arm_neon:-no}" != "no"])
AC_MSG_NOTICE([[Extra options for compiler: $PNG_COPTS]])
diff --git a/png.c b/png.c
index dfedef580..2d9670ff9 100644
--- a/png.c
+++ b/png.c
@@ -691,13 +691,13 @@ png_get_copyright(png_const_structrp png_ptr)
#else
# ifdef __STDC__
return PNG_STRING_NEWLINE \
- "libpng version 1.7.0beta05 - February 27, 2013" PNG_STRING_NEWLINE \
+ "libpng version 1.7.0beta05 - March 4, 2013" PNG_STRING_NEWLINE \
"Copyright (c) 1998-2013 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
PNG_STRING_NEWLINE;
# else
- return "libpng version 1.7.0beta05 - February 27, 2013\
+ return "libpng version 1.7.0beta05 - March 4, 2013\
Copyright (c) 1998-2013 Glenn Randers-Pehrson\
Copyright (c) 1996-1997 Andreas Dilger\
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
@@ -4062,6 +4062,27 @@ png_build_gamma_tables(png_structrp png_ptr, int bit_depth)
}
#endif /* READ_GAMMA */
+/* HARDWARE OPTION SUPPORT */
+#ifdef PNG_SET_OPTION_SUPPORTED
+int PNGAPI
+png_set_option(png_structrp png_ptr, int option, int onoff)
+{
+ if (png_ptr != NULL && option >= 0 && option < PNG_OPTION_NEXT &&
+ (option & 1) == 0)
+ {
+ int mask = 3 << option;
+ int setting = (2 + (onoff != 0)) << option;
+ int current = png_ptr->options;
+
+ png_ptr->options = (png_byte)((current & ~mask) | setting);
+
+ return (current & mask) >> option;
+ }
+
+ return PNG_OPTION_INVALID;
+}
+#endif
+
/* sRGB support */
#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
diff --git a/png.h b/png.h
index 07c0d0f02..daa9d46f2 100644
--- a/png.h
+++ b/png.h
@@ -1,7 +1,7 @@
/* png.h - header file for PNG reference library
*
- * libpng version 1.7.0beta05 - March 3, 2013
+ * libpng version 1.7.0beta05 - March 4, 2013
* Copyright (c) 1998-2013 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
@@ -11,7 +11,7 @@
* Authors and maintainers:
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
* libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
- * libpng versions 0.97, January 1998, through 1.7.0beta05 - March 3, 2013: Glenn
+ * libpng versions 0.97, January 1998, through 1.7.0beta05 - March 4, 2013: Glenn
* See also "Contributing Authors", below.
*
* Note about libpng version numbers:
@@ -201,7 +201,7 @@
*
* This code is released under the libpng license.
*
- * libpng versions 1.2.6, August 15, 2004, through 1.7.0beta05, March 3, 2013, are
+ * libpng versions 1.2.6, August 15, 2004, through 1.7.0beta05, March 4, 2013, are
* Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson, and are
* distributed according to the same disclaimer and license as libpng-1.2.5
* with the following individual added to the list of Contributing Authors:
@@ -313,7 +313,7 @@
* Y2K compliance in libpng:
* =========================
*
- * March 3, 2013
+ * March 4, 2013
*
* Since the PNG Development group is an ad-hoc body, we can't make
* an official declaration.
@@ -381,7 +381,7 @@
/* Version information for png.h - this should match the version in png.c */
#define PNG_LIBPNG_VER_STRING "1.7.0beta05"
#define PNG_HEADER_VERSION_STRING \
- " libpng version 1.7.0beta05 - March 3, 2013\n"
+ " libpng version 1.7.0beta05 - March 4, 2013\n"
#define PNG_LIBPNG_VER_SONUM 17
#define PNG_LIBPNG_VER_DLLNUM 17
@@ -3222,6 +3222,47 @@ PNG_EXPORT(243, int, png_get_palette_max, (png_const_structrp png_ptr,
# endif
#endif /* CHECK_FOR_INVALID_INDEX */
+/*******************************************************************************
+ * IMPLEMENTATION OPTIONS
+ *******************************************************************************
+ *
+ * Support for arbitrary implementation-specific optimizations. The API allows
+ * particular options to be turned on or off. 'Option' is the number of the
+ * option and 'onoff' is 0 (off) or non-0 (on). The value returned is given
+ * by the PNG_OPTION_ defines below.
+ *
+ * HARDWARE: normally hardware capabilites, such as the Intel SSE instructions,
+ * are detected at run time, however sometimes it may be impossible
+ * to do this in user mode, in which case it is necessary to discover
+ * the capabilities in an OS specific way. Such capabilities are
+ * listed here when libpng has support for them and must be turned
+ * ON by the application if present.
+ *
+ * SOFTWARE: sometimes software optimizations actually result in performance
+ * decrease on some architectures or systems, or with some sets of
+ * PNG images. 'Software' options allow such optimizations to be
+ * selected at run time.
+ */
+#ifdef PNG_SET_OPTION_SUPPORTED
+#ifdef PNG_ARM_NEON_API_SUPPORTED
+# define PNG_ARM_NEON 0 /* HARDWARE: ARM Neon SIMD instructions supported */
+#endif
+#define PNG_OPTION_NEXT 2 /* Next option - numbers must be even */
+
+/* Return values: NOTE: there are four values and 'off' is *not* zero */
+#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */
+#define PNG_OPTION_INVALID 1 /* Option number out of range */
+#define PNG_OPTION_OFF 2
+#define PNG_OPTION_ON 3
+
+PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option,
+ int onoff));
+#endif
+
+/*******************************************************************************
+ * END OF HARDWARE OPTIONS
+ ******************************************************************************/
+
/* Maintainer: Put new public prototypes here ^, in libpng.3, and project
* defs
*/
@@ -3231,7 +3272,7 @@ PNG_EXPORT(243, int, png_get_palette_max, (png_const_structrp png_ptr,
* scripts/symbols.def as well.
*/
#ifdef PNG_EXPORT_LAST_ORDINAL
- PNG_EXPORT_LAST_ORDINAL(243);
+ PNG_EXPORT_LAST_ORDINAL(244);
#endif
#ifdef __cplusplus
diff --git a/pngstruct.h b/pngstruct.h
index 1fef8ca75..b7f93dc26 100644
--- a/pngstruct.h
+++ b/pngstruct.h
@@ -508,6 +508,11 @@ struct png_struct_def
png_byte filter_type;
#endif
+ /* Options */
+#ifdef PNG_SET_OPTION_SUPPORTED
+ png_byte options; /* On/off state (up to 4 options) */
+#endif
+
/* COMPRESSION AND DECOMPRESSION SUPPORT.
*
* zlib expects a 'zstream' as the fundamental control structure, it allows
diff --git a/scripts/checksym.awk b/scripts/checksym.awk
index 6857dff1c..fe3af55e0 100755
--- a/scripts/checksym.awk
+++ b/scripts/checksym.awk
@@ -113,6 +113,16 @@ END{
err = 1
}
unexported=0
+ # Add a standard header to symbols.new:
+ print ";Version INSERT-VERSION-HERE" >of
+ print ";--------------------------------------------------------------" >of
+ print "; LIBPNG symbol list as a Win32 DEF file" >of
+ print "; Contains all the symbols that can be exported from libpng" >of
+ print ";--------------------------------------------------------------" >of
+ print "LIBRARY" >of
+ print "" >of
+ print "EXPORTS" >of
+
for (o=1; o<=lasto; ++o) {
if (symbol[o] == "" && removed[o] == "") {
if (unexported == 0) unexported = o
diff --git a/scripts/dfn.awk b/scripts/dfn.awk
index 6a8f2cb08..89b92d5d9 100644
--- a/scripts/dfn.awk
+++ b/scripts/dfn.awk
@@ -61,78 +61,143 @@ $1 ~ /^PNG_DFN_END_SORT/{
}
/^[^"]*PNG_DFN *".*"[^"]*$/{
- # A definition line, apparently correctly formated, extract the
- # definition then replace any doubled "" that remain with a single
- # double quote. Notice that the original doubled double quotes
- # may have been split by tokenization
- orig=$0
-
- if (gsub(/^[^"]*PNG_DFN *"/,"") != 1 || gsub(/"[^"]*$/, "") != 1) {
- print "line", NR, "processing failed:"
+ # A definition line, apparently correctly formated, extract the
+ # definition then replace any doubled "" that remain with a single
+ # double quote. Notice that the original doubled double quotes
+ # may have been split by tokenization
+ #
+ # Sometimes GCC splits the PNG_DFN lines, we know this has happened
+ # if the quotes aren't closed and must read another line. In this
+ # case it is essential to reject lines that start '#' because those
+ # are introduced #line directives.
+ orig=$0
+ line=$0
+ lineno=FNR
+ if (lineno == "") lineno=NR
+
+ if (sub(/^[^"]*PNG_DFN *"/,"",line) != 1) {
+ print "line", lineno ": processing failed:"
print orig
- print $0
err=1
- } else {
+ next
+ } else {
++out_count
- }
-
- # Now examine quotes within the value:
- #
- # @" - delete this and any following spaces
- # "@ - delete this and any original spaces
- # @' - replace this by a double quote
- #
- # This allows macro substitution by the C compiler thus:
- #
- # #define first_name John
- # #define last_name Smith
- #
- # PNG_DFN"#define name @'@" first_name "@ @" last_name "@@'"
- #
- # Might get C preprocessed to:
- #
- # PNG_DFN "#define foo @'@" John "@ @" Smith "@@'"
- #
- # Which this script reduces to:
- #
- # #define name "John Smith"
- #
- while (sub(/@" */, "")) {
- if (!sub(/ *"@/, "")) {
- print "unbalanced @\" ... \"@ pair"
- err=1
- break
- }
- }
-
- # Put any needed double quotes in
- gsub(/@'/,"\"")
-
- # Remove any trailing spaces (not really required, but for
- # editorial consistency
- sub(/ *$/, "")
-
- # Remove trailing CR
- sub (/ $/, "")
-
- if (sort)
- array[$(sort)] = $0
-
- else
- print $0 >out
- next
+ }
+
+ # Now examine quotes within the value:
+ #
+ # @" - delete this and any following spaces
+ # "@ - delete this and any preceding spaces
+ # @' - replace this by a double quote
+ #
+ # This allows macro substitution by the C compiler thus:
+ #
+ # #define first_name John
+ # #define last_name Smith
+ #
+ # PNG_DFN"#define name @'@" first_name "@ @" last_name "@@'"
+ #
+ # Might get C preprocessed to:
+ #
+ # PNG_DFN "#define foo @'@" John "@ @" Smith "@@'"
+ #
+ # Which this script reduces to:
+ #
+ # #define name "John Smith"
+ #
+ while (1) {
+ # While there is an @" remove it and the next "@
+ if (line ~ /@"/) {
+ if (line ~ /@".*"@/) {
+ # Do this special case first to avoid swallowing extra spaces
+ # before or after the @ stuff:
+ if (!sub(/@" *"@/, "", line)) {
+ # Ok, do it in pieces - there has to be a non-space between the
+ # two. NOTE: really weird things happen if a leading @" is
+ # lost - the code will error out below (I believe).
+ if (!sub(/@" */, "", line) || !sub(/ *"@/, "", line)) {
+ print "line", lineno, ": internal error:", orig
+ exit 1
+ }
+ }
+ }
+
+ # There is no matching "@. Assume a split line
+ else while (1) {
+ if (getline nextline) {
+ # If the line starts with '#' it is a preprocesor line directive
+ # from cc -E, skip it:
+ if (nextline !~ /^#/) {
+ line = line " " nextline
+ break
+ }
+ } else {
+ # This is end-of-input - probably a missig "@ on the first line:
+ print "line", lineno ": unbalanced @\" ... \"@ pair"
+ err=1
+ next
+ }
+ }
+
+ # Keep going until all the @" have gone
+ continue
+ }
+
+ # Attempt to remove a trailing " (not preceded by '@') - if this can
+ # be done stop now, if not assume a split line again
+ if (sub(/"[^"]*$/, "", line))
+ break
+
+ # Read another line
+ while (1) {
+ if (getline nextline) {
+ if (nextline !~ /^#/) {
+ line = line " " nextline
+ # Go back to stripping @" "@ pairs
+ break
+ }
+ } else {
+ print "line", lineno ": unterminated PNG_DFN string"
+ err=1
+ next
+ }
+ }
+ }
+
+ # Put any needed double quotes in (at the end, because these would otherwise
+ # interfere with the processing above.)
+ gsub(/@'/,"\"", line)
+
+ # Remove any trailing spaces (not really required, but for
+ # editorial consistency
+ sub(/ *$/, "", line)
+
+ # Remove trailing CR
+ sub(/ $/, "", line)
+
+ if (sort) {
+ if (split(line, parts) < sort) {
+ print "line", lineno ": missing sort field:", line
+ err=1
+ } else
+ array[parts[sort]] = line
+ }
+
+ else
+ print line >out
+ next
}
/PNG_DFN/{
- print "line", NR, "incorrectly formated PNG_DFN line:"
- print $0
- err = 1
+ print "line", NR, "incorrectly formated PNG_DFN line:"
+ print $0
+ err = 1
}
END{
- if (out_count > 0 || err > 0)
+ if (out_count > 0 || err > 0)
exit err
- print "no definition lines found"
- exit 1
+ print "no definition lines found"
+ exit 1
}
diff --git a/scripts/options.awk b/scripts/options.awk
index 3fc3ad18b..c3a850173 100755
--- a/scripts/options.awk
+++ b/scripts/options.awk
@@ -64,11 +64,15 @@ BEGIN{
logunsupported=0 # write unsupported options too
# Precreate arrays
+ # for each option:
option[""] = "" # list of all options: default enabled/disabled
done[""] = 1 # marks option as having been output
requires[""] = "" # requires by option
iffs[""] = "" # if by option
enabledby[""] = "" # options that enable it by option
+ sets[""] = "" # settings set by each option
+ setval[""] = "" # value to set (indexed: 'option sets[option]')
+ # for each setting:
setting[""] = "" # requires by setting
defaults[""] = "" # used for a defaulted value
doneset[""] = 1 # marks setting as having been output
@@ -200,7 +204,7 @@ $1 == "com"{
if (NF > 1) {
# sub(/^[ ]*com[ ]*/, "")
$1 = ""
- print comment, $0, cend >out
+ print comment $0, cend >out
} else
print start end >out
next
@@ -237,7 +241,9 @@ $1 == "file" && NF >= 2{
next
}
-# option NAME ( (requires|enables|if) NAME* | on | off | disabled )*
+# option NAME ( (requires|enables|if) NAME* | on | off | disabled |
+# sets SETTING VALUE+ )*
+#
# Declares an option 'NAME' and describes its default setting (disabled)
# and its relationship to other options. The option is disabled
# unless *all* the options listed after 'requires' are set and at
@@ -298,7 +304,7 @@ $1 == "option" && NF >= 2{
break
}
}
- } else if (val == "requires" || val == "if" || val == "enables") {
+ } else if (val == "requires" || val == "if" || val == "enables" || val =="sets") {
key = val
} else if (key == "requires") {
requires[opt] = requires[opt] " " val
@@ -306,6 +312,12 @@ $1 == "option" && NF >= 2{
iffs[opt] = iffs[opt] " " val
} else if (key == "enables") {
enabledby[val] = enabledby[val] " " opt
+ } else if (key == "sets") {
+ sets[opt] = sets[opt] " " val
+ key = "setval"
+ set = val
+ } else if (key == "setval") {
+ setval[opt " " set] = setval[opt " " set] " " val
} else
break # bad line format
}
@@ -522,83 +534,7 @@ END{
exit 0
}
- # Do the 'setting' values first, the algorithm the standard
- # tree walk (O(1)) done in an O(2) while/for loop; interations
- # settings x depth, outputing the deepest required macros
- # first.
- print "" >out
- print "/* SETTINGS */" >out
- print comment, "settings", cend >out
- # Sort (in dfn.awk) on field 2, the setting name
- print "PNG_DFN_START_SORT 2" >out
- finished = 0
- while (!finished) {
- finished = 1
- movement = 0 # done nothing
- for (i in setting) if (!doneset[i]) {
- nreqs = split(setting[i], r)
- if (nreqs > 0) {
- for (j=1; j<=nreqs; ++j) if (!doneset[r[j]]) {
- break
- }
- if (j<=nreqs) {
- finished = 0
- continue # try a different setting
- }
- }
-
- # All the requirements have been processed, output
- # this setting.
- if (deb) print "setting", i
- deflt = defaults[i]
- # A leading @ means leave it unquoted so the preprocessor
- # can substitute the build time value
- if (deflt ~ /^ @/)
- deflt = " " subs substr(deflt, 3) sube
- # Remove any spurious trailing spaces
- sub(/ *$/,"",deflt)
- print "" >out
- print "/* setting: ", i >out
- print " * requires:" setting[i] >out
- print " * default: ", defaults[i] defltinfo, "*/" >out
- if (defaults[i] == "") { # no default, only check if defined
- print "#ifdef PNG_" i >out
- }
- for (j=1; j<=nreqs; ++j) {
- print "# ifndef PNG_" r[j] >out
- print error, i, "requires", r[j] end >out
- print "# endif" >out
- }
- if (defaults[i] != "") { # default handling
- print "#ifdef PNG_" i >out
- }
- # PNG_<i> is defined, so substitute the value:
- print def i, subs "PNG_" i sube end >out
- if (defaults[i] != "") {
- print "#else /*default*/" >out
- # And add the default definition for the benefit
- # of later settings an options test:
- print "# define PNG_" i deflt >out
- print def i deflt end >out
- }
- print "#endif" >out
-
- doneset[i] = 1
- ++movement
- }
-
- if (!finished && !movement) {
- print "setting: loop or missing setting in 'requires', cannot process:"
- for (i in setting) if (!doneset[i]) {
- print " setting", i, "requires" setting[i]
- }
- exit 1
- }
- }
- print "PNG_DFN_END_SORT" >out
- print comment, "end of settings", cend >out
-
- # Now do the options - somewhat more complex. The dependency
+ # Do the options first (allowing options to set settings). The dependency
# tree is thus:
#
# name > name
@@ -690,7 +626,7 @@ END{
}
if (err) exit 1
- # Sort options too
+ # Sort options:
print "PNG_DFN_START_SORT 2" >out
# option[i] is now the complete list of all the tokens we may
@@ -730,8 +666,9 @@ END{
print "" >out
print "/* option:", i, option[i] >out
print " * requires: " requires[i] >out
- print " * if: " iffs[i] >out
- print " * enabled-by:" enabledby[i], "*/" >out
+ print " * if: " iffs[i] >out
+ print " * enabled-by:" enabledby[i] >out
+ print " * sets: " sets[i], "*/" >out
print "#undef PNG_on" >out
print "#define PNG_on 1" >out
@@ -814,6 +751,21 @@ END{
print error, i, "is on: enabled by:" iffs[i] enabledby[i] ", requires" requires[i] end >out
} else if (i !~ /^ok_/) {
print def i sup >out
+ # Supported option, set required settings
+ nreqs = split(sets[i], r)
+ for (j=1; j<=nreqs; ++j) {
+ print "# ifdef PNG_set_" r[j] >out
+ # Some other option has already set a value:
+ print error, i, "sets", r[j] ": duplicate setting" end >out
+ print error, " previous value: " end "PNG_set_" r[j] >out
+ print "# else" >out
+ # Else set the default: note that this won't accept arbitrary
+ # values, the setval string must be acceptable to all the C
+ # compilers we use. That means it must be VERY simple; a number,
+ # a name or a string.
+ print "# define PNG_set_" r[j], setval[i " " r[j]] >out
+ print "# endif" >out
+ }
}
print "# endif /* definition */" >out
print "#endif /*requires, if*/" >out
@@ -847,6 +799,93 @@ END{
print "PNG_DFN_END_SORT" >out
print comment, "end of options", cend >out
+ # Do the 'setting' values second, the algorithm the standard
+ # tree walk (O(1)) done in an O(2) while/for loop; interations
+ # settings x depth, outputing the deepest required macros
+ # first.
+ print "" >out
+ print "/* SETTINGS */" >out
+ print comment, "settings", cend >out
+ # Sort (in dfn.awk) on field 2, the setting name
+ print "PNG_DFN_START_SORT 2" >out
+ finished = 0
+ while (!finished) {
+ finished = 1
+ movement = 0 # done nothing
+ for (i in setting) if (!doneset[i]) {
+ nreqs = split(setting[i], r)
+ if (nreqs > 0) {
+ # By default assume the requires values are options, but if there
+ # is no option with that name check for a setting
+ for (j=1; j<=nreqs; ++j) if (option[r[j]] == "" && !doneset[r[j]]) {
+ break
+ }
+ if (j<=nreqs) {
+ finished = 0
+ continue # try a different setting
+ }
+ }
+
+ # All the requirements have been processed, output
+ # this setting.
+ if (deb) print "setting", i
+ deflt = defaults[i]
+ # Remove any spurious trailing spaces
+ sub(/ *$/,"",deflt)
+ # A leading @ means leave it unquoted so the preprocessor
+ # can substitute the build time value
+ if (deflt ~ /^ @/)
+ deflt = " " subs substr(deflt, 3) sube
+ print "" >out
+ print "/* setting: ", i >out
+ print " * requires:" setting[i] >out
+ print " * default: ", defaults[i] deflt, "*/" >out
+ for (j=1; j<=nreqs; ++j) {
+ if (option[r[j]] != "")
+ print "#ifndef PNG_" r[j] "_SUPPORTED" >out
+ else
+ print "#ifndef PNG_" r[j] >out
+ print error, i, "requires", r[j] end >out
+ print "# endif" >out
+ }
+ # The precedence is:
+ #
+ # 1) External definition; trumps:
+ # 2) Option 'sets' value; trumps:
+ # 3) Setting 'default'
+ #
+ print "#ifdef PNG_" i >out
+ # PNG_<i> is defined, so substitute the value:
+ print def i, subs "PNG_" i sube end >out
+ print "#else /* use default */" >out
+ print "# ifdef PNG_set_" i >out
+ # Value from an option 'sets' argument
+ print def i, subs "PNG_set_" i sube end >out
+ # This is so that subsequent tests on the setting work:
+ print "# define PNG_" i, "1" >out
+ if (defaults[i] != "") {
+ print "# else /*default*/" >out
+ print def i deflt end >out
+ print "# define PNG_" i, "1" >out
+ }
+ print "# endif /* defaults */" >out
+ print "#endif /* setting", i, "*/" >out
+
+ doneset[i] = 1
+ ++movement
+ }
+
+ if (!finished && !movement) {
+ print "setting: loop or missing setting in 'requires', cannot process:"
+ for (i in setting) if (!doneset[i]) {
+ print " setting", i, "requires" setting[i]
+ }
+ exit 1
+ }
+ }
+ print "PNG_DFN_END_SORT" >out
+ print comment, "end of settings", cend >out
+
# Regular end - everything looks ok
if (protect != "") {
print start "#endif", "/*", protect, "*/" end >out
diff --git a/scripts/pnglibconf.dfa b/scripts/pnglibconf.dfa
index bf1ed8a16..cd3b3c6d1 100644
--- a/scripts/pnglibconf.dfa
+++ b/scripts/pnglibconf.dfa
@@ -27,7 +27,7 @@ file pnglibconf.h scripts/pnglibconf.dfa PNGLCONF_H
# The syntax is detailed in scripts/options.awk; this is a summary
# only:
#
-# setting <name> [default]
+# setting <name> [requires ...] [default]
# #define PNG_<name> <value> /* value comes from current setting */
# option <name> [requires ...] [if ...] [enables ...] [disabled]
# #define PNG_<name>_SUPPORTED if the requirements are met and
@@ -165,6 +165,12 @@ logunsupported = 1
@# endif
@#endif
+# This changes the default for the ARM NEON optimizations according to
+# __ARM_NEON__
+@#ifdef __ARM_NEON__
+@# define PNG_ARM_NEON_SUPPORTED
+@#endif
+
# IN DEVELOPMENT
# These are currently experimental features; define them if you want (NOTE:
# experimental options must be disabled before they are defined in this file!)
@@ -222,11 +228,22 @@ setting ZLIB_HEADER default <zlib.h>
setting FILTER_OPTIMIZATIONS
-# This option turns on runtime checks for ARM NEON support, it is irrelevant
-# on other platforms and it is irrelevant unless NEON code is turned on. Checks
-# are on by default
-
-option ARM_NEON_CHECK
+# Implementation specific control of the optimizations, enabled by those
+# hardware or software options that need it (typically when run-time choices
+# must be made by the user)
+option SET_OPTION disabled
+
+# These options are specific to the ARM NEON hardware optimizations:
+#
+# ARM_NEON: the optimization itself
+# ARM_NEON_API: allow the optimization to be switched on with png_set_hardware
+# ARM_NEON_CHECK: compile a run-time check to see if Neon extensions are
+# supported, this is poorly supported and deprectated - use the
+# png_set_hardware API.
+option ARM_NEON disabled,
+ sets FILTER_OPTIMIZATIONS png_init_filter_functions_neon
+option ARM_NEON_API disabled enables SET_OPTION ARM_NEON
+option ARM_NEON_CHECK disabled enables ARM_NEON
# These settings configure the default compression level (0-9) and 'strategy';
# strategy is as defined by the implementors of zlib, it describes the input
diff --git a/scripts/pnglibconf.h.prebuilt b/scripts/pnglibconf.h.prebuilt
index 9786b6ddc..98a03bffe 100644
--- a/scripts/pnglibconf.h.prebuilt
+++ b/scripts/pnglibconf.h.prebuilt
@@ -1,6 +1,7 @@
+/* 1.7.0beta05 STANDARD API DEFINITION */
/* pnglibconf.h - library build configuration */
-/* libpng version 1.7.0beta05 - February 27, 2013 */
+/* libpng version 1.7.0beta05 - March 4, 2013 */
/* Copyright (c) 1998-2013 Glenn Randers-Pehrson */
@@ -13,34 +14,12 @@
/* Derived from: scripts/pnglibconf.dfa */
#ifndef PNGLCONF_H
#define PNGLCONF_H
-/* settings */
-#define PNG_ABORT { (abort()); }
-#define PNG_API_RULE 0
-#define PNG_CALLOC_SUPPORTED
-#define PNG_COST_SHIFT 3
-#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_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 Z_DEFAULT_COMPRESSION
-#define PNG_TEXT_Z_DEFAULT_STRATEGY Z_DEFAULT_STRATEGY
-#define PNG_WEIGHT_SHIFT 8
-#define PNG_ZBUF_SIZE 8192
-#define PNG_ZLIB_HEADER <zlib.h>
-#define PNG_Z_DEFAULT_COMPRESSION Z_DEFAULT_COMPRESSION
-#define PNG_Z_DEFAULT_NOFILTER_STRATEGY Z_DEFAULT_STRATEGY
-#define PNG_Z_DEFAULT_STRATEGY Z_FILTERED
-#define PNG_sCAL_PRECISION 5
-#define PNG_sRGB_PROFILE_CHECKS 2
-/* end of settings */
/* options */
#define PNG_16BIT_SUPPORTED
#define PNG_ALIGNED_MEMORY_SUPPORTED
-#define PNG_ARM_NEON_CHECK_SUPPORTED
+/*#undef PNG_ARM_NEON_API_SUPPORTED*/
+/*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/
+/*#undef PNG_ARM_NEON_SUPPORTED*/
#define PNG_BENIGN_ERRORS_SUPPORTED
#define PNG_BENIGN_READ_ERRORS_SUPPORTED
/*#undef PNG_BENIGN_WRITE_ERRORS_SUPPORTED*/
@@ -123,6 +102,7 @@
#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
#define PNG_SEQUENTIAL_READ_SUPPORTED
#define PNG_SETJMP_SUPPORTED
+/*#undef PNG_SET_OPTION_SUPPORTED*/
#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
#define PNG_SET_USER_LIMITS_SUPPORTED
#define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED
@@ -203,4 +183,28 @@
#define PNG_tRNS_SUPPORTED
#define PNG_zTXt_SUPPORTED
/* end of options */
+/* settings */
+#define PNG_ABORT { (abort()); }
+#define PNG_API_RULE 0
+#define PNG_CALLOC_SUPPORTED
+#define PNG_COST_SHIFT 3
+#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_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_WEIGHT_SHIFT 8
+#define PNG_ZBUF_SIZE 8192
+#define PNG_ZLIB_HEADER <zlib.h>
+#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 */
diff --git a/scripts/symbols.def b/scripts/symbols.def
index 4d8e08f27..7436114ff 100644
--- a/scripts/symbols.def
+++ b/scripts/symbols.def
@@ -1,3 +1,4 @@
+;Version 1.7.0beta05
;--------------------------------------------------------------
; LIBPNG symbol list as a Win32 DEF file
; Contains all the symbols that can be exported from libpng
@@ -5,7 +6,6 @@
LIBRARY
EXPORTS
-;Version 1.7.0beta05
png_access_version_number @1
png_set_sig_bytes @2
png_sig_cmp @3
@@ -242,3 +242,4 @@ EXPORTS
png_convert_to_rfc1123_buffer @241
png_set_check_for_invalid_index @242
png_get_palette_max @243
+ png_set_option @244
diff --git a/scripts/symbols.dfn b/scripts/symbols.dfn
index 99d992eb1..6f52918d4 100644
--- a/scripts/symbols.dfn
+++ b/scripts/symbols.dfn
@@ -35,13 +35,14 @@
* defaulted to 'off' in scripts/pnglibconf.dfa
*
* Maintenance: if scripts/pnglibconf.dfa options are changed
- * from, or to, 'off' this needs updating!
+ * from, or to, 'disabled' this needs updating!
*/
#define PNG_BENIGN_ERRORS_SUPPORTED
#define PNG_ERROR_NUMBERS_SUPPORTED
#define PNG_READ_BIG_ENDIAN_SUPPORTED /* should do nothing! */
#define PNG_INCH_CONVERSIONS_SUPPORTED
#define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
+#define PNG_SET_OPTION_SUPPORTED
#undef PNG_H
#include "../png.h"