From f3728100d940723f04ccbe0f52352c07aa5c7a6d Mon Sep 17 00:00:00 2001 From: John Bowler Date: Mon, 4 Mar 2013 16:26:31 -0600 Subject: [PATCH] [libpng16] 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. --- ANNOUNCE | 13 ++- CHANGES | 10 +- arm/arm_init.c | 48 +++++--- configure.ac | 33 ++++-- png.c | 25 ++++- png.h | 53 ++++++++- pngstruct.h | 5 + scripts/checksym.awk | 10 ++ scripts/dfn.awk | 176 ++++++++++++++++++++--------- scripts/options.awk | 205 ++++++++++++++++++++-------------- scripts/pnglibconf.dfa | 27 ++++- scripts/pnglibconf.h.prebuilt | 60 +++++----- scripts/symbols.def | 3 +- scripts/symbols.dfn | 3 +- 14 files changed, 457 insertions(+), 214 deletions(-) diff --git a/ANNOUNCE b/ANNOUNCE index 6c2ae40dd..cbbf4b328 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,5 +1,5 @@ -Libpng 1.6.1beta06 - March 2, 2013 +Libpng 1.6.1beta06 - 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. @@ -67,8 +67,17 @@ Version 1.6.1beta04 [February 27, 2013] Version 1.6.1beta05 [March 1, 2013] Avoid a possible memory leak in contrib/gregbook/readpng.c -Version 1.6.1beta06 [March 2, 2013] +Version 1.6.1beta06 [March 4, 2013] Better documentation of unknown handling API interactions. + 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 d75b9ef80..644c9e577 100644 --- a/CHANGES +++ b/CHANGES @@ -4424,8 +4424,16 @@ Version 1.6.1beta04 [February 27, 2013] Version 1.6.1beta05 [March 1, 2013] Avoid a possible memory leak in contrib/gregbook/readpng.c -Version 1.6.1beta06 [March 2, 2013] +Version 1.6.1beta06 [March 4, 2013] Better documentation of unknown handling API interactions. + 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 /* 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 2b36278e3..aa310b5c8 100644 --- a/configure.ac +++ b/configure.ac @@ -233,18 +233,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 0fd1e9847..d58b3fd8c 100644 --- a/png.c +++ b/png.c @@ -768,13 +768,13 @@ png_get_copyright(png_const_structrp png_ptr) #else # ifdef __STDC__ return PNG_STRING_NEWLINE \ - "libpng version 1.6.1beta06 - March 2, 2013" PNG_STRING_NEWLINE \ + "libpng version 1.6.1beta06 - 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.6.1beta06 - March 2, 2013\ + return "libpng version 1.6.1beta06 - 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."; @@ -4012,6 +4012,27 @@ png_build_gamma_table(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 a781197f5..016a8f095 100644 --- a/png.h +++ b/png.h @@ -1,7 +1,7 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.1beta06 - March 2, 2013 + * libpng version 1.6.1beta06 - 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.6.1beta06 - March 2, 2013: Glenn + * libpng versions 0.97, January 1998, through 1.6.1beta06 - 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.6.1beta06, March 2, 2013, are + * libpng versions 1.2.6, August 15, 2004, through 1.6.1beta06, 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 2, 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.6.1beta06" #define PNG_HEADER_VERSION_STRING \ - " libpng version 1.6.1beta06 - March 2, 2013\n" + " libpng version 1.6.1beta06 - March 4, 2013\n" #define PNG_LIBPNG_VER_SONUM 16 #define PNG_LIBPNG_VER_DLLNUM 16 @@ -3219,6 +3219,47 @@ PNG_EXPORT(243, int, png_get_palette_max, (png_const_structp 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, scripts/pnglibconf.h, and scripts/pnglibconf.h.prebuilt */ @@ -3228,7 +3269,7 @@ PNG_EXPORT(243, int, png_get_palette_max, (png_const_structp 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 776284a73..181b82f77 100644 --- a/pngstruct.h +++ b/pngstruct.h @@ -357,6 +357,11 @@ struct png_struct_def png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ #endif + /* Options */ +#ifdef PNG_SET_OPTION_SUPPORTED + png_byte options; /* On/off state (up to 4 options) */ +#endif + #if PNG_LIBPNG_VER < 10700 /* To do: remove this from libpng-1.7 */ #ifdef PNG_TIME_RFC1123_SUPPORTED 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 910704594..89b92d5d9 100644 --- a/scripts/dfn.awk +++ b/scripts/dfn.awk @@ -61,75 +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 + # 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 (gsub(/^[^"]*PNG_DFN *"/,"") != 1 || gsub(/"[^"]*$/, "") != 1) { - print "line", NR, "processing failed:" + 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 - } - } + # 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 + } + } + } - # Put any needed double quotes in - gsub(/@'/,"\"") + # 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 + } + } - # Remove any trailing spaces (not really required, but for - # editorial consistency - sub(/ *$/, "") + # Keep going until all the @" have gone + continue + } - if (sort) - array[$(sort)] = $0 + # 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 - else - print $0 >out - next + # 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_ 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_ 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 5f607e1c1..c95b10255 100755 --- 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 [default] +# setting [requires ...] [default] # #define PNG_ /* value comes from current setting */ # option [requires ...] [if ...] [enables ...] [disabled] # #define PNG__SUPPORTED if the requirements are met and @@ -158,6 +158,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!) @@ -199,11 +205,22 @@ setting DEFAULT_READ_MACROS default 1 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 +# 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 -option ARM_NEON_CHECK +# 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 4d08a28a5..91b136cd4 100644 --- a/scripts/pnglibconf.h.prebuilt +++ b/scripts/pnglibconf.h.prebuilt @@ -1,9 +1,8 @@ - -/* libpng STANDARD API DEFINITION */ +/* libpng 1.6.1beta06 STANDARD API DEFINITION */ /* pnglibconf.h - library build configuration */ -/* Libpng 1.6.1beta06 - March 2, 2013 */ +/* Libpng version 1.6.1beta06 - March 4, 2013 */ /* Copyright (c) 1998-2013 Glenn Randers-Pehrson */ @@ -12,40 +11,16 @@ /* and license in png.h */ /* pnglibconf.h */ +/* Machine generated file: DO NOT EDIT */ /* Derived from: scripts/pnglibconf.dfa */ -/* If you edit this file by hand you must obey the rules expressed in */ -/* pnglibconf.dfa with respect to the dependencies between the following */ -/* symbols. It is much better to generate a new file using */ -/* scripts/libpngconf.mak */ - #ifndef PNGLCONF_H #define PNGLCONF_H -/* settings */ -#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_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 */ /* 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*/ @@ -130,6 +105,7 @@ #define PNG_SETJMP_SUPPORTED #define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED #define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED +/*#undef PNG_SET_OPTION_SUPPORTED*/ #define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED #define PNG_SET_USER_LIMITS_SUPPORTED #define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED @@ -210,4 +186,26 @@ #define PNG_tRNS_SUPPORTED #define PNG_zTXt_SUPPORTED /* end of options */ +/* settings */ +#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_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 9a6536d95..d7b34181a 100644 --- a/scripts/symbols.def +++ b/scripts/symbols.def @@ -1,3 +1,4 @@ +;Version 1.6.1beta06 ;-------------------------------------------------------------- ; 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.6.1beta06 png_access_version_number @1 png_set_sig_bytes @2 png_sig_cmp @3 @@ -248,3 +248,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"