diff options
77 files changed, 23518 insertions, 0 deletions
diff --git a/Build/source/libs/potrace/ChangeLog b/Build/source/libs/potrace/ChangeLog new file mode 100644 index 00000000000..6c35e742e00 --- /dev/null +++ b/Build/source/libs/potrace/ChangeLog @@ -0,0 +1,4 @@ +2013-04-12 Peter Breitenlohner <peb@mppmu.mpg.de> + + Import potrace-1.11. + diff --git a/Build/source/libs/potrace/Makefile.am b/Build/source/libs/potrace/Makefile.am new file mode 100644 index 00000000000..f89a0f89b78 --- /dev/null +++ b/Build/source/libs/potrace/Makefile.am @@ -0,0 +1,61 @@ +## Proxy Makefile.am to build potrace for TeX Live. +## +## Copyright (C) 2013 Peter Breitenlohner <tex-live@tug.org> +## +## This file is free software; the copyright holder +## gives unlimited permission to copy and/or distribute it, +## with or without modifications, as long as this notice is preserved. +## +ACLOCAL_AMFLAGS = -I ../../m4 + +# Rebuild +.PHONY: rebuild +rebuild: all + +## We want to re-distribute the whole original potrace source tree. +## +## With current automake (1.10.2) 'make distcheck' fails when +## DISTFILES contains a directory and files in that directory. +## Thus nodist_* for all files in $(POTRACE_TREE). +EXTRA_DIST = $(POTRACE_TREE) + +## Changes applied to the original source tree +## +EXTRA_DIST += $(POTRACE_TREE)-PATCHES + +# in case of an SVN repository +dist-hook: + rm -rf `find $(distdir) -name .svn -o -name .deps -o -name .dirstamp -o -name '*.$(OBJEXT)'` + +SUBDIRS = . include + +AM_CPPFLAGS = -I$(top_srcdir)/$(POTRACE_TREE)/src + +noinst_LIBRARIES = libpotrace.a + +libpotrace_a_SOURCES = \ + @POTRACE_TREE@/src/auxiliary.h \ + @POTRACE_TREE@/src/bitmap.h \ + @POTRACE_TREE@/src/curve.c \ + @POTRACE_TREE@/src/curve.h \ + @POTRACE_TREE@/src/decompose.c \ + @POTRACE_TREE@/src/decompose.h \ + @POTRACE_TREE@/src/lists.h \ + @POTRACE_TREE@/src/potracelib.c \ + @POTRACE_TREE@/src/potracelib.h \ + @POTRACE_TREE@/src/progress.h \ + @POTRACE_TREE@/src/trace.c \ + @POTRACE_TREE@/src/trace.h + +if build +check_PROGRAMS = potracetst +dist_check_SCRIPTS = potrace.test +TESTS = potrace.test +endif build + +potracetst_SOURCES = potracetst.c + +potracetst_CPPFLAGS = -Iinclude + +LDADD = libpotrace.a + diff --git a/Build/source/libs/potrace/Makefile.in b/Build/source/libs/potrace/Makefile.in new file mode 100644 index 00000000000..a9c5ccc2347 --- /dev/null +++ b/Build/source/libs/potrace/Makefile.in @@ -0,0 +1,1292 @@ +# Makefile.in generated by automake 1.14 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +@build_TRUE@check_PROGRAMS = potracetst$(EXEEXT) +subdir = . +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ + $(srcdir)/config.h.in $(am__dist_check_SCRIPTS_DIST) \ + $(top_srcdir)/../../build-aux/depcomp \ + $(top_srcdir)/../../build-aux/test-driver ChangeLog \ + ../../build-aux/compile ../../build-aux/config.guess \ + ../../build-aux/config.sub ../../build-aux/depcomp \ + ../../build-aux/install-sh ../../build-aux/missing \ + ../../build-aux/texinfo.tex ../../build-aux/ylwrap \ + ../../build-aux/ltmain.sh \ + $(top_srcdir)/../../build-aux/compile \ + $(top_srcdir)/../../build-aux/install-sh \ + $(top_srcdir)/../../build-aux/missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/../../m4/kpse-common.m4 \ + $(top_srcdir)/../../m4/kpse-warnings.m4 \ + $(top_srcdir)/version.ac $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +AR = ar +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libpotrace_a_AR = $(AR) $(ARFLAGS) +libpotrace_a_LIBADD = +am__dirstamp = $(am__leading_dot)dirstamp +am_libpotrace_a_OBJECTS = @POTRACE_TREE@/src/curve.$(OBJEXT) \ + @POTRACE_TREE@/src/decompose.$(OBJEXT) \ + @POTRACE_TREE@/src/potracelib.$(OBJEXT) \ + @POTRACE_TREE@/src/trace.$(OBJEXT) +libpotrace_a_OBJECTS = $(am_libpotrace_a_OBJECTS) +am_potracetst_OBJECTS = potracetst-potracetst.$(OBJEXT) +potracetst_OBJECTS = $(am_potracetst_OBJECTS) +potracetst_LDADD = $(LDADD) +potracetst_DEPENDENCIES = libpotrace.a +am__dist_check_SCRIPTS_DIST = potrace.test +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libpotrace_a_SOURCES) $(potracetst_SOURCES) +DIST_SOURCES = $(libpotrace_a_SOURCES) $(potracetst_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope check recheck distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red='[0;31m'; \ + grn='[0;32m'; \ + lgn='[1;32m'; \ + blu='[1;34m'; \ + mgn='[0;35m'; \ + brg='[1m'; \ + std='[m'; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/../../build-aux/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POTRACE_TREE = @POTRACE_TREE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build_alias = @build_alias@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +ACLOCAL_AMFLAGS = -I ../../m4 +EXTRA_DIST = $(POTRACE_TREE) $(POTRACE_TREE)-PATCHES +SUBDIRS = . include +AM_CPPFLAGS = -I$(top_srcdir)/$(POTRACE_TREE)/src +noinst_LIBRARIES = libpotrace.a +libpotrace_a_SOURCES = \ + @POTRACE_TREE@/src/auxiliary.h \ + @POTRACE_TREE@/src/bitmap.h \ + @POTRACE_TREE@/src/curve.c \ + @POTRACE_TREE@/src/curve.h \ + @POTRACE_TREE@/src/decompose.c \ + @POTRACE_TREE@/src/decompose.h \ + @POTRACE_TREE@/src/lists.h \ + @POTRACE_TREE@/src/potracelib.c \ + @POTRACE_TREE@/src/potracelib.h \ + @POTRACE_TREE@/src/progress.h \ + @POTRACE_TREE@/src/trace.c \ + @POTRACE_TREE@/src/trace.h + +@build_TRUE@dist_check_SCRIPTS = potrace.test +@build_TRUE@TESTS = potrace.test +potracetst_SOURCES = potracetst.c +potracetst_CPPFLAGS = -Iinclude +LDADD = libpotrace.a +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .log .o .obj .test .test$(EXEEXT) .trs +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +@POTRACE_TREE@/src/$(am__dirstamp): + @$(MKDIR_P) @POTRACE_TREE@/src + @: > @POTRACE_TREE@/src/$(am__dirstamp) +@POTRACE_TREE@/src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) @POTRACE_TREE@/src/$(DEPDIR) + @: > @POTRACE_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@POTRACE_TREE@/src/curve.$(OBJEXT): \ + @POTRACE_TREE@/src/$(am__dirstamp) \ + @POTRACE_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@POTRACE_TREE@/src/decompose.$(OBJEXT): \ + @POTRACE_TREE@/src/$(am__dirstamp) \ + @POTRACE_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@POTRACE_TREE@/src/potracelib.$(OBJEXT): \ + @POTRACE_TREE@/src/$(am__dirstamp) \ + @POTRACE_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@POTRACE_TREE@/src/trace.$(OBJEXT): \ + @POTRACE_TREE@/src/$(am__dirstamp) \ + @POTRACE_TREE@/src/$(DEPDIR)/$(am__dirstamp) + +libpotrace.a: $(libpotrace_a_OBJECTS) $(libpotrace_a_DEPENDENCIES) $(EXTRA_libpotrace_a_DEPENDENCIES) + $(AM_V_at)-rm -f libpotrace.a + $(AM_V_AR)$(libpotrace_a_AR) libpotrace.a $(libpotrace_a_OBJECTS) $(libpotrace_a_LIBADD) + $(AM_V_at)$(RANLIB) libpotrace.a + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) + +potracetst$(EXEEXT): $(potracetst_OBJECTS) $(potracetst_DEPENDENCIES) $(EXTRA_potracetst_DEPENDENCIES) + @rm -f potracetst$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(potracetst_OBJECTS) $(potracetst_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f @POTRACE_TREE@/src/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/potracetst-potracetst.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POTRACE_TREE@/src/$(DEPDIR)/curve.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POTRACE_TREE@/src/$(DEPDIR)/decompose.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POTRACE_TREE@/src/$(DEPDIR)/potracelib.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POTRACE_TREE@/src/$(DEPDIR)/trace.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +potracetst-potracetst.o: potracetst.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(potracetst_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT potracetst-potracetst.o -MD -MP -MF $(DEPDIR)/potracetst-potracetst.Tpo -c -o potracetst-potracetst.o `test -f 'potracetst.c' || echo '$(srcdir)/'`potracetst.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/potracetst-potracetst.Tpo $(DEPDIR)/potracetst-potracetst.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='potracetst.c' object='potracetst-potracetst.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(potracetst_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o potracetst-potracetst.o `test -f 'potracetst.c' || echo '$(srcdir)/'`potracetst.c + +potracetst-potracetst.obj: potracetst.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(potracetst_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT potracetst-potracetst.obj -MD -MP -MF $(DEPDIR)/potracetst-potracetst.Tpo -c -o potracetst-potracetst.obj `if test -f 'potracetst.c'; then $(CYGPATH_W) 'potracetst.c'; else $(CYGPATH_W) '$(srcdir)/potracetst.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/potracetst-potracetst.Tpo $(DEPDIR)/potracetst-potracetst.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='potracetst.c' object='potracetst-potracetst.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(potracetst_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o potracetst-potracetst.obj `if test -f 'potracetst.c'; then $(CYGPATH_W) 'potracetst.c'; else $(CYGPATH_W) '$(srcdir)/potracetst.c'; fi` + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) $(dist_check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \ + $(dist_check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-recursive +all-am: Makefile $(LIBRARIES) config.h +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f @POTRACE_TREE@/src/$(DEPDIR)/$(am__dirstamp) + -rm -f @POTRACE_TREE@/src/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-checkPROGRAMS clean-generic clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) @POTRACE_TREE@/src/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) @POTRACE_TREE@/src/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) all check-am install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-cscope clean-generic \ + clean-noinstLIBRARIES cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \ + dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am + + +# Rebuild +.PHONY: rebuild +rebuild: all + +# in case of an SVN repository +dist-hook: + rm -rf `find $(distdir) -name .svn -o -name .deps -o -name .dirstamp -o -name '*.$(OBJEXT)'` + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Build/source/libs/potrace/ac/potrace.ac b/Build/source/libs/potrace/ac/potrace.ac new file mode 100644 index 00000000000..d40257d1168 --- /dev/null +++ b/Build/source/libs/potrace/ac/potrace.ac @@ -0,0 +1,11 @@ +## libs/potrace/ac/potrace.ac: configure.ac fragment for the TeX Live subdirectory libs/potrace/ +dnl +dnl Copyright (C) 2013 Peter Breitenlohner <tex-live@tug.org> +dnl You may freely use, modify and/or distribute this file. +dnl +## basic check of system potrace +KPSE_TRY_LIB([potrace], + [#include <potracelib.h>], + [potrace_state_t st; +const char *version = potrace_version(); +potrace_state_free(&st);]) diff --git a/Build/source/libs/potrace/ac/withenable.ac b/Build/source/libs/potrace/ac/withenable.ac new file mode 100644 index 00000000000..0870c670f10 --- /dev/null +++ b/Build/source/libs/potrace/ac/withenable.ac @@ -0,0 +1,7 @@ +## libs/potrace/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory libs/potrace/ +dnl +dnl Copyright (C) 2013 Peter Breitenlohner <tex-live@tug.org> +dnl You may freely use, modify and/or distribute this file. +dnl +## configure options and TL libraries required for potrace +KPSE_WITH_LIB([potrace]) diff --git a/Build/source/libs/potrace/aclocal.m4 b/Build/source/libs/potrace/aclocal.m4 new file mode 100644 index 00000000000..ac1e772d77b --- /dev/null +++ b/Build/source/libs/potrace/aclocal.m4 @@ -0,0 +1,1187 @@ +# generated automatically by aclocal 1.14 -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.14' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.14], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.14])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542> + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: <http://www.gnu.org/software/coreutils/>. + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar <conftest.tar]) + AM_RUN_LOG([cat conftest.dir/file]) + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([../../m4/kpse-common.m4]) +m4_include([../../m4/kpse-warnings.m4]) diff --git a/Build/source/libs/potrace/config.h.in b/Build/source/libs/potrace/config.h.in new file mode 100644 index 00000000000..61c034f79b6 --- /dev/null +++ b/Build/source/libs/potrace/config.h.in @@ -0,0 +1,34 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif diff --git a/Build/source/libs/potrace/configure b/Build/source/libs/potrace/configure new file mode 100755 index 00000000000..e5e29188848 --- /dev/null +++ b/Build/source/libs/potrace/configure @@ -0,0 +1,6508 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for potrace for TeX Live 1.11. +# +# Report bugs to <tex-k@tug.org>. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and tex-k@tug.org +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 </dev/null +exec 6>&1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='potrace for TeX Live' +PACKAGE_TARNAME='potrace-for-tex-live' +PACKAGE_VERSION='1.11' +PACKAGE_STRING='potrace for TeX Live 1.11' +PACKAGE_BUGREPORT='tex-k@tug.org' +PACKAGE_URL='' + +ac_unique_file="potrace-1.11/src/trace.c" +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +POTRACE_TREE +EGREP +GREP +CPP +build_FALSE +build_TRUE +LN_S +RANLIB +WARNING_CFLAGS +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_maintainer_mode +enable_dependency_tracking +enable_compiler_warnings +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures potrace for TeX Live 1.11 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root + [DATAROOTDIR/doc/potrace-for-tex-live] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of potrace for TeX Live 1.11:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-compiler-warnings=[no|min|yes|max|all] + Turn on compiler warnings [default: yes if + maintainer-mode, min otherwise] + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a + nonstandard directory <lib dir> + LIBS libraries to pass to the linker, e.g. -l<library> + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if + you have headers in a nonstandard directory <include dir> + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to <tex-k@tug.org>. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +potrace for TeX Live configure 1.11 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by potrace for TeX Live $as_me 1.11, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +ac_aux_dir= +for ac_dir in ../../build-aux "$srcdir"/../../build-aux; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../build-aux \"$srcdir\"/../../build-aux" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + + +am__api_version='1.14' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdio.h> +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +# Check whether --enable-compiler-warnings was given. +if test "${enable_compiler_warnings+set}" = set; then : + enableval=$enable_compiler_warnings; +fi +case $enable_compiler_warnings in #( + no | min | yes | max | all) : + ;; #( + *) : + if test "x$enable_maintainer_mode" = xyes; then : + enable_compiler_warnings=yes +else + enable_compiler_warnings=min +fi ;; +esac + + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='potrace-for-tex-live' + VERSION='1.11' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542> + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: <http://www.gnu.org/software/coreutils/>. + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler accepts prototypes" >&5 +$as_echo_n "checking whether the compiler accepts prototypes... " >&6; } +if ${kb_cv_c_prototypes+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +int +main () +{ +extern void foo(int i,...); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + kb_cv_c_prototypes=yes +else + kb_cv_c_prototypes=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kb_cv_c_prototypes" >&5 +$as_echo "$kb_cv_c_prototypes" >&6; } +if test "x$kb_cv_c_prototypes" = xno; then + as_fn_error $? "Sorry, your compiler does not understand prototypes." "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what warning flags to pass to the C compiler" >&5 +$as_echo_n "checking what warning flags to pass to the C compiler... " >&6; } +if ${kpse_cv_warning_cflags+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$GCC" = xyes; then + kpse_cv_warning_cflags= +if test "x$enable_compiler_warnings" != xno; then + kpse_cv_warning_cflags="-Wimplicit -Wreturn-type" + case `$CC -dumpversion` in #( + 3.4.* | 4.*) : + kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wdeclaration-after-statement" ;; #( + *) : + ;; +esac + case `$CC -dumpversion` in #( + 3.[234].* | 4.*) : + kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wno-unknown-pragmas" ;; #( + *) : + ;; +esac + if test "x$enable_compiler_warnings" != xmin; then + kpse_cv_warning_cflags="-Wall -Wunused $kpse_cv_warning_cflags" + kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wmissing-prototypes -Wmissing-declarations" + if test "x$enable_compiler_warnings" != xyes; then + kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith" + kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wcast-qual -Wcast-align -Wwrite-strings" + case `$CC -dumpversion` in #( + 3.4.* | 4.*) : + kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wold-style-definition" ;; #( + *) : + ;; +esac + if test "x$enable_compiler_warnings" != xmax; then + kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wshadow" + fi + fi + fi +fi +elif test "x$enable_compiler_warnings" = xno; then + kpse_cv_warning_cflags= +else + kpse_cv_warning_cflags= # FIXME: warning flags for non-GNU C compilers +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_warning_cflags" >&5 +$as_echo "$kpse_cv_warning_cflags" >&6; } +WARNING_CFLAGS=$kpse_cv_warning_cflags + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + +ac_config_headers="$ac_config_headers config.h" + + + if test "x$enable_build" != xno; then + build_TRUE= + build_FALSE='#' +else + build_TRUE='#' + build_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <string.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ctype.h> +#include <stdlib.h> +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +if test "x$ac_cv_header_stdc" != xyes; then + as_fn_error $? "Sorry, can't do anything for you" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sqrt" >&5 +$as_echo_n "checking for library containing sqrt... " >&6; } +if ${ac_cv_search_sqrt+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sqrt (); +int +main () +{ +return sqrt (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_sqrt=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_sqrt+:} false; then : + break +fi +done +if ${ac_cv_search_sqrt+:} false; then : + +else + ac_cv_search_sqrt=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sqrt" >&5 +$as_echo "$ac_cv_search_sqrt" >&6; } +ac_res=$ac_cv_search_sqrt +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +POTRACE_TREE=potrace-1.11 + + +ac_config_files="$ac_config_files Makefile include/Makefile" + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${build_TRUE}" && test -z "${build_FALSE}"; then + as_fn_error $? "conditional \"build\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by potrace for TeX Live $as_me 1.11, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to <tex-k@tug.org>." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +potrace for TeX Live config.status 1.11 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' <conf$$subs.awk | sed ' +/^[^""]/{ + N + s/\n// +} +' >>$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' <confdefs.h | sed ' +s/'"$ac_delim"'/"\\\ +"/g' >>$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/Build/source/libs/potrace/configure.ac b/Build/source/libs/potrace/configure.ac new file mode 100644 index 00000000000..7c8d6894e26 --- /dev/null +++ b/Build/source/libs/potrace/configure.ac @@ -0,0 +1,38 @@ +dnl Process this file with autoconf to produce a configure script. +dnl +dnl Copyright (C) 2013 Peter Breitenlohner <tex-live@tug.org> +dnl +dnl This file is free software; the copyright holder +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +m4_include([version.ac])[] dnl define potrace_version +AC_INIT([potrace for TeX Live], potrace_version, [tex-k@tug.org]) +AC_PREREQ([2.65]) +AC_CONFIG_SRCDIR([potrace-]potrace_version[/src/trace.c]) +AC_CONFIG_AUX_DIR([../../build-aux]) +AC_CONFIG_MACRO_DIR([../../m4]) + +KPSE_BASIC([potrace]) + +AC_PROG_CC +AC_PROG_RANLIB +AC_PROG_LN_S +AC_C_INLINE + +AC_CONFIG_HEADERS([config.h]) + +AM_CONDITIONAL([build], [test "x$enable_build" != xno]) + +AC_HEADER_STDC +if test "x$ac_cv_header_stdc" != xyes; then + AC_MSG_ERROR([Sorry, can't do anything for you]) +fi + +AC_SEARCH_LIBS([sqrt], [m]) + +AC_SUBST([POTRACE_TREE], [potrace-]potrace_version) + +AC_CONFIG_FILES([Makefile include/Makefile]) + +AC_OUTPUT diff --git a/Build/source/libs/potrace/include/Makefile.am b/Build/source/libs/potrace/include/Makefile.am new file mode 100644 index 00000000000..e165c1a3ce3 --- /dev/null +++ b/Build/source/libs/potrace/include/Makefile.am @@ -0,0 +1,15 @@ +## Proxy Makefile.am to install potrace headers for TeX Live. +## +## Copyright (C) 2013 Peter Breitenlohner <tex-live@tug.org> +## +## This file is free software; the copyright holder +## gives unlimited permission to copy and/or distribute it, +## with or without modifications, as long as this notice is preserved. +## +POTRACE_SRC = $(top_srcdir)/$(POTRACE_TREE)/src + +hdr_links = \ + $(POTRACE_SRC)/potracelib.h + +include $(top_srcdir)/../am/hdr_links.am + diff --git a/Build/source/libs/potrace/include/Makefile.in b/Build/source/libs/potrace/include/Makefile.in new file mode 100644 index 00000000000..e80cb4f1971 --- /dev/null +++ b/Build/source/libs/potrace/include/Makefile.in @@ -0,0 +1,409 @@ +# Makefile.in generated by automake 1.14 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +DIST_COMMON = $(top_srcdir)/../am/hdr_links.am $(srcdir)/Makefile.in \ + $(srcdir)/Makefile.am +subdir = include +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/../../m4/kpse-common.m4 \ + $(top_srcdir)/../../m4/kpse-warnings.m4 \ + $(top_srcdir)/version.ac $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POTRACE_TREE = @POTRACE_TREE@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build_alias = @build_alias@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +POTRACE_SRC = $(top_srcdir)/$(POTRACE_TREE)/src +hdr_links = \ + $(POTRACE_SRC)/potracelib.h + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/../am/hdr_links.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/../am/hdr_links.am: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile all-local +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am all-local check check-am clean clean-generic \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-local distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am + +all-local: + @for file in $(hdr_links); do \ + test -f $$file || continue; \ + inst=`echo $$file | sed -e 's/^.*\///'`; \ + test -f $$inst || { \ + rm -f $$inst; \ + if $(AM_V_P); then echo "$(LN_S) $$file $$inst"; \ + else echo " INST $$inst"; fi; \ + $(LN_S) $$file $$inst; } || exit 1; \ + done + +distclean-local: + rm -f *.h + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Build/source/libs/potrace/potrace-1.11-PATCHES/ChangeLog b/Build/source/libs/potrace/potrace-1.11-PATCHES/ChangeLog new file mode 100644 index 00000000000..6207e720dd3 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11-PATCHES/ChangeLog @@ -0,0 +1,5 @@ +2012-02-11 Peter Breitenlohner <peb@mppmu.mpg.de> + + Import potrace-1.11 source tree from: + http://potrace.sourceforge.net + diff --git a/Build/source/libs/potrace/potrace-1.11-PATCHES/TL-Changes b/Build/source/libs/potrace/potrace-1.11-PATCHES/TL-Changes new file mode 100644 index 00000000000..56ec1464890 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11-PATCHES/TL-Changes @@ -0,0 +1,20 @@ +Changes applied to the potrace-1.11/ tree as obtained from: + http://potrace.sourceforge.net + +Removed: + Makefile.in + aclocal.m4 + check/ + config.guess + config.sub + configure + depcomp + doc/ + install-sh + libtool + ltmain.sh + m4/ + missing + mkinstalldirs + src/Makefile.in + diff --git a/Build/source/libs/potrace/potrace-1.11/AUTHORS b/Build/source/libs/potrace/potrace-1.11/AUTHORS new file mode 100644 index 00000000000..f6b22007218 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/AUTHORS @@ -0,0 +1,11 @@ +Known contributors are listed here, in alphabetical order by their +abbreviations (which are used in Changelog). + +Main author: + + PS1 Peter Selinger <selinger at users.sourceforge.net> + +Contributors: + + CH1 Christoph Hormann <chris_hormann at gmx.de> (GeoJSON backend) + TA1 Tor Andersson <tor at ghostscript.com> (PDF backend) diff --git a/Build/source/libs/potrace/potrace-1.11/ChangeLog b/Build/source/libs/potrace/potrace-1.11/ChangeLog new file mode 100644 index 00000000000..c19a6cd6ad7 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/ChangeLog @@ -0,0 +1,349 @@ +ChangeLog + +v1.11 2013/02/19 + (2013/02/10) PS1 - bitops.c: added "cc" as a clobbered register. + (2012/09/13) PS1 - GeoJSON backend: -u option affects rounding, + not scaling. + (2012/09/12) CH1 - added GeoJSON backend. + (2012/03/04) PS1 - minor change in behavior of alphamax parameter: + make a corner if alpha >= alphamax (instead of >). This makes + little practical difference, except when alphamax = 0, in which + case we now get a polygon. Fixes bug #3495854, reported by + scribbleink. + (2012/02/24) PS1 - added support for BMP format with bitfields. + +v1.10 2011/08/19 + (2011/08/07) PS1 - added --tight option + (2011/08/05) PS1 - backends: simplified dimension calculations + (2011/08/05) PS1 - eps backend: prevent integer overflow in + bounding box. + (2011/08/05) PS1 - disallow resolution of 0 dpi. + (2011/08/05) PS1 - man page: added BACKEND TYPES section + (2011/08/05) PS1 - fixed default scaling at 72dpi for + variable-sized backends + (2011/08/02) PS1 - new gimppath backend produces SVG output + suitable for current versions of Gimp. + (2011/08/02) PS1 - added a --flat option for the SVG backend. + (2011/07/31) PS1 - test suite: renamed *.out files to prevent make's + built-in implicit rules from accidentally overwriting them. + (2011/07/26) PS1 - added DXF backend. Thanks to Jonas Benedett + Dorr for testing. + (2011/07/26) PS1 - use high resolution bounding box in EPS, PDF, + and SVG backends + (2011/05/13) PS1 - autoconf: CADD can now be given at compile time + +v1.9 2010/12/21 + (2010/12/20) PS1 - getopt.h: fixed compiler warnings + (2010/12/20) PS1 - added --tty option to specify progress bar + rendering at runtime. + (2010/12/20) PS1 - added simplified progress bar for Windows or + other dumb terminals. New --enable-dumb-tty configuration option. + (2010/12/16) PS1 - test suite: fixed bug where a failed test was + not reported in backend-check.sh + (2010/12/15) PS1 - test suite: support for $EXEEXT + (2010/12/15) PS1 - optimized penalty3 inner loop, 4.6% speedup. + (2010/12/15) PS1 - autoconf: new CADD variable to add to CFLAGS + (2010/12/15) PS1 - fixed some compiler warnings, added some error + handlers, and added some cosmetic top-level free's. + (2010/11/25) PS1 - added support for some BMP version 4 and 5 + files, and for top-down BMP files. Suggested by Kanwar Sangwan. + (2010/11/13) PS1 - don't enter filter mode if -- is used + (2010/11/09) PS1 - greymap.h, bitmap.h: drop unneeded dependencies + (2010/09/07) PS1 - autoconf: fixed getopt_long test to allow + cross-compiling, bug #3061403, reported by Igor Filippov. + (2010/08/31) PS1 - test suite: added environment variables + CHECK_POTRACE and CHECK_MKBITMAP to allow binaries outside the + build tree to be tested + (2010/08/09) PS1 - autoconf: converted to libtool + (2010/08/05) PS1 - autoconf: renamed configure.in as configure.ac + (2010/08/05) PS1 - autoconf: added --with-libpotrace to optionally + install the Potrace library and header files. + (2009/08/03) PS1 - portability: c++ wrapper in potracelib.h, + suggested by Peter Jankuliak. + (2009/05/13) PS1 - added pdfpage backend for fixed pagesize PDF + output. + (2009/04/07) PS1 - decompose.c: minor optimization + (2008/10/08) PS1 - mkbitmap: speed increase by 8% to 26% by + eliminating unnecessary bounds checks and interpolation. + (2008/10/05) PS1 - trace.c: separate function for path reversal + (2008/10/03) PS1 - progress.h: do the right thing if progress == + NULL + (2008/10/03) PS1 - moved detrand() to auxiliary.h + (2008/08/21) PS1 - mkbitmap: added --blur option. + (2008/08/12) PS1 - combined the old -V option with -v. + (2008/08/12) PS1 - test suite: adjusted tolerances to fix bug + #1745456 + (2007/12/31) PS1 - include curve.h where path_t is used + (2007/12/28) PS1 - flush stderr when interleaved with stdout + (2007/12/28) PS1 - portability: don't hardcode size of short int + (2007/11/09) PS1 - eps backend: use save-restore to avoid + polluting caller's dictionary and for page independence. + (2007/05/22) PS1 - xfig backend: added depth to opaque components + to avoid them floating to the background. Suggested by Rafael + Laboissiere. + +v1.8 2007/04/09 + (2007/04/08) PS1 - portability: use 'test' instead of '[' in shell + scripts. + (2007/04/08) PS1 - test suite: run PDF checks as a separate test. + (2007/04/06) PS1 - fixed logical expressions in flate.c + (2007/02/19) PS1 - portability: replacements for inline and M_PI + (2007/01/16) PS1 - test suite: added checks for rotation in + PostScript, PDF, and PGM backends + (2007/01/16) PS1 - pdf backend: added rotation + (2007/01/16) PS1 - pdf backend: renamed shipcom() function + (2007/01/14) PS1 - autoconf: check if getopt_long reorders its + arguments. + (2007/01/13) PS1 - made pseudo-random number generation + thread-safe and much faster. + (2006/12/20) PS1 - renamed some structures in lzw.c, main.h + (2006/12/20) PS1 - portability: fixed some compiler issues for + Amiga, reported by Andreas Kleinert. + (2006/12/20) PS1 - main.c: changed some return types to void. + (2006/08/14) PS1 - made curve.c:privcurve_free_members() static. + (2005/12/22) PS1 - renamed README.win as README-WIN + (2005/11/11) PS1 - portability: use binary file i/o in Cygwin. + Suggested by Henry He. + (2005/06/24) PS1 - potracelib: fixed allocation bug, reported by + Jung Shin. + (2005/06/23) PS1 - potracelib_demo.c: free resources properly. + (2005/06/23) PS1 - initialize unused private state to 0. + (2005/06/23) PS1 - decompose.c: improved memory allocation scheme. + (2005/05/06) PS1 - added "alphacurve" field to private curve + structure, so that backends that don't use the public interface + (such as the EPS backend) can be warned of non-conforming curves. + +v1.7 2005/03/06 + (2005/03/05) PS1 - fixed progress bar subrange bug. + +v1.6 2005/02/27 + (2005/02/22) PS1 - added "epsilon" feature to progress bar. + (2005/02/22) PS1 - documentation: changed potracelib documentation + to TeX format. + (2005/02/07) PS1 - tweaked progress bar + (2005/01/24) PS1 - added --progress option to potrace frontend. + (2005/01/24) PS1 - potracelib: added progress bar interface. + (2005/01/23) PS1 - fixed overflow bug in fast summing code. + (2005/01/23) PS1 - rewrote trace.c:bestpolygon(). This speeds up + potrace by 20% on typical data and up to 60% in some bad cases. + (2004/12/07) PS1 - documentation: added potracelib.txt + (2004/12/07) PS1 - renamed aux.h as auxiliary.h, since aux is an + invalid filename in Windows. + (2004/12/06) PS1 - API: added default parameters + (2004/12/06) PS1 - API: added potrace_state_t + (2004/12/06) PS1 - API: added "const" qualifiers + (2004/12/06) PS1 - removed conv and areac fields from privpath_t. + (2004/12/06) PS1 - changed bounding box handling in decompose.c + (2004/12/06) PS1 - split curve_t into public and private parts. + (2004/12/06) PS1 - moved curve/path allocation to curve.c. + (2004/12/06) PS1 - renamed a type in lzw.h. + (2004/12/06) PS1 - renamed source files. + (2004/12/04) PS1 - split path_t into public and private parts. + (2004/12/03) PS1 - split core functionality from user interface. + (2004/12/03) PS1 - moved parts of bitmap.h to potracelib.h. Split + bitmap.c into bitmap.c and bitmap_io.c. Moved path decomposition + auxiliary functions from bitmap.c to path.c. + (2004/12/03) PS1 - converted some stray local functions to static + (2004/12/01) PS1 - moved basic curve data type definitions to + potracelib.h + (2004/12/01) PS1 - collected some repeatedly used macros in aux.h + (2004/12/01) PS1 - started to create API to potrace core + functionality in potracelib.c and potracelib.h. Also added new + libpotrace.a target. + (2004/12/01) PS1 - made curve.c and path.c reentrant by removing + global variable "info". + (2004/11/28) PS1 - made a85* auxiliary functions static in + flate.c. + (2004/11/28) PS1 - pdf backend: removed arbitrary page limit. + (2004/11/24) PS1 - pdf backend: replaced ftell() by explicit byte + count to work correctly with stdout. + (2004/11/24) PS1 - portability: use binary file i/o in MinGW. + (2004/10/08) PS1 - minor cleanup in backend_pdf.c. + (2004/09/21) PS1 - replace -O3 compilation default by -O2; inlined + critical functions manually instead. + (2004/09/18) PS1 - slightly optimized multiplications in + curve.c:bezier(). Thanks to Thomas M.Ott for suggesting it. + (2004/09/16) PS1 - list of backends in help message is now + generated. + (2004/09/16) PS1 - test suite: added test for pdf backend. + (2004/09/14) PS1 - removed bits.c, renamed bits.h to bitops.h, and + use static inline functions instead of macros. + (2004/09/14) PS1 - test suite: adjusted tolerances. + (2004/09/12) PS1 - mkbitmap: when reading plain pbm files, use + colors 0 and 255, not 0 and 1. + (2004/09/12) PS1 - potrace and mkbitmap: don't complain about + "junk at the end of file" if the junk is whitespace and + comments. Treat files which contain only whitespace and comments + as empty. + (2004/08/05) TA1 - added pdf backend. + +v1.5 2004/07/08 + (2004/07/08) PS1 - removed dependency on external "compress" + program. Removed ztops.c, added lzw.c, bits.c. + (2004/03/17) PS1 - don't leave temporary file /tmp/have_compress.* + lying around. + (2004/03/06) PS1 - fixed a type error in have_compress.c:28. + +v1.4 2004/03/06 + (2004/03/05) PS1 - removed the compile-time check for the + "compress" program and replaced it by a run-time check. + (2004/03/03) PS1 - ztops.c: fixed compression bug where garbage + was added after the end of stream. + (2004/02/09) PS1 - further optimized the speed of the function + path.c:pathlist_to_tree, which now takes less than 0.1% of total + running time. + (2004/02/09) PS1 - distribution: removed potrace.{ps,pdf} from + distribution, changed textfiles to DOS mode in Cygwin distribution + (2004/01/19) PS1 - corrected a bug in 1.2 which caused an enormous + slowdown in the function path.c:pathlist_to_tree. + (2004/01/17) PS1 - test suite: better quoting in shell scripts to + be more robust against spaces in filenames etc. + (2004/01/17) PS1 - test suite and ztops.c: respect TEMPDIR + environment variable, if set. + +v1.3 2004/01/15 + (2004/01/14) PS1 - test suite: adjusted tolerances. + (2004/01/13) PS1 - when reading a bitmap of width or height 0, + pretend the offending dimension is 1. This is not 100% logical + in all cases, but better than producing garbage. + (2004/01/13) PS1 - fixed bounding box in xfig backend. + (2004/01/13) PS1 - added missing gsave/grestore to ps backend. + (2004/01/07) PS1 - autoconf: search for zlib.h in + ${prefix}/include and for libz.so in ${prefix}/lib, in case they + are not found elsewhere. + (2004/01/07) PS1 - eliminated some unused variables. + (2004/01/07) PS1 - portability: eliminated typeof() from + mkbitmap.c + (2004/01/07) PS1 - test suite: added a test for empty bitmaps. + (2003/12/25) PS1 - fixed bug #866223: potrace crashes when applied + to an empty bitmap. + (2003/12/25) PS1 - when options -2 or -3 are unsupported, ignore + them rather than failing, for improved compatibility. + (2003/12/25) PS1 - autoconf: added --disable-zlib configuration + option and improved error messages for missing zlib.h or libz.so + (2003/12/25) PS1 - portability: eliminated dynamic arrays in + mkbitmap.c + (2003/12/25) PS1 - test suite: added a check for mkbitmap. + (2003/12/25) PS1 - test suite: more portable filesize checking in + backend-check.sh + +v1.2 2003/12/23 + (2003/12/23) PS1 - added an xfig backend. + (2003/12/23) PS1 - added --group option to group related shapes + together in SVG backend. + (2003/12/23) PS1 - added --opaque option to paint white shapes + opaquely, instead of leaving them transparent, in PS/EPS and SVG + backends. + (2003/12/23) PS1 - rewrote path decomposition algorithm to + calculate path containment tree, to be used for grouping. + (2003/12/23) PS1 - test suite: added a check of postscript output + using ghostscript. + (2003/09/18) PS1 - autoconf: added tests for -lm and -lz + libraries, and for zlib.h header file. + (2003/09/18) PS1 - portability: cleaned up code so that it can be + compiled with a C++ compiler. + (2003/09/17) PS1 - code cleanup in main.c:main(). + (2003/09/17) PS1 - added mkbitmap program. + (2003/09/17) PS1 - added -ffloat-store compiler flag for improved + floating point predictability. + (2003/09/12) PS1 - test suite: added test for BMP runlength + encoding. + (2003/09/12) PS1 - fixed frontend for BMP runlength encoding. + (2003/09/11) PS1 - autoconf: added test to work around gcc + compiler bug 12243, which affected curve.c:adjust_vertices(). + (2003/09/11) PS1 - renamed pbm.c as bitmap.c, pgm.c as greymap.c + (2003/09/11) PS1 - moved some bitmap details from path.c to pbm.c + (2003/09/10) PS1 - renamed pbm.h macros to start with BM_ + (2003/09/02) PS1 - portability: added missing fallback value for + M_PI to backend_pgm.c. + (2003/08/28) PS1 - specialized matrix solving code for n=2. + (2003/08/28) PS1 - portability (and scalability): eliminated + dynamic arrays. + (2003/08/28) PS1 - portability: replaced vsnprintf by vsprintf. + (2003/08/28) PS1 - portability: provided fallback value for M_PI + (2003/08/27) PS1 - autoconf: now checks whether the compress + program works, not just whether it exists. + (2003/08/27) PS1 - test suite: wrote three tests for "make check" + (2003/08/27) PS1 - portability: fixed some floating point errors + on DEC Alpha: division by zero and log of zero. + (2003/08/27) PS1 - changed bitmap representation to take advantage + of 64-bit architectures. + (2003/08/27) PS1 - changed default scaling in ps and eps modes for + small page sizes. + (2003/08/26) PS1 - allow arguments of command line options -b, -z, + -P to be abbreviated by "unambiguous prefix". + (2003/08/26) PS1 - added rotation to gimppath backend. + (2003/08/24) PS1 - portability: removed GNU extensions from printf + format strings in backend_eps. + (2003/08/22) PS1 - converted --unit to double value. + (2003/08/22) PS1 - added experimental gimppath backend. + (2003/08/20) PS1 - close paths in postscript/eps backend. + (2003/08/20) PS1 - fixed bug in parsing command line options: long + options --cleartext, --level2, --level3 did not work properly. + Thanks to George Williams for reporting this bug. + +v1.1 2003/08/18 + (2003/08/17) PS1 - replaced calc_lon algorithm by a faster + implementation. This results in speedups of up to factor 3.3 for + certain large input files. + (2003/08/17) PS1 - added --invert option. + (2003/08/17) PS1 - improved error messages on wrong file format. + (2003/08/17) PS1 - code cleanup to build under fussier compilers. + Thanks to Nelson Beebe for submitting compiler logs for a large + number of setups. + (2003/08/17) PS1 - renamed curve.c:quad as quadform to avoid name + clash on IBM AIX, Compaq/DEC ODF/1. + (2003/08/17) PS1 - autoconf: let user override CFLAGS at configure + time, and use -Wall and -O3 only for gcc compiler + (2003/08/16) PS1 - added --blacklevel option to control + image-to-bitmap conversion + (2003/08/16) PS1 - added ability to read BMP files. Changed error + reporting in case of empty files, or if there is junk at the end + of a file in multipage mode. + (2003/08/14) PS1 - as a convenience, now also read files in PGM + and PPM format and convert to bitmap by simple threshold method. + This is because many programs, including the Gimp and the *topnm + tools, produce PNM output which must be further converted to PBM. + (2003/08/14) PS1 - rearranged order of options in usage message. + (2003/08/14) PS1 - implemented -d1 option for SVG backend. This + outputs a jaggy bitmap with no smoothing. + (2003/08/14) PS1 - autoconf: improved handling of + --enable-compress + (2003/08/14) PS1 - added SVG backend. + (2003/08/14) PS1 - renamed old -s option as -S + (2003/08/12) PS1 - added README.win + (2003/08/12) PS1 - autoconf: fixed bug #787182: added non-standard + compile time options to help message for ./configure script + +v1.0 2003/08/10 + (2003/08/10) PS1 - added file i/o code + (2003/08/08) PS1 - optimized number of times the penalty3 function + is called. Speedups of factor 2.7 were observed on large files. + (2003/08/08) PS1 - added --opttolerance and --alphamax options. + (2003/08/07) PS1 - autoconf: changed configure.in so that test for + compress is omitted when the user overrides it - this prevents a + wrong cached value to be read. + (2003/08/07) PS1 - keep output flushed in postscript mode + (2003/08/07) PS1 - fixed memory leak in multiple page mode + (2003/08/06) PS1 - replaced --opticurve by --longcurve option; + opticurve is now the default + (2003/08/06) PS1 - added opticurve sensitivity to pgm backend + (2003/08/06) PS1 - restricted opticurves to be bounded away from + 180 degrees + (2003/08/06) PS1 - allow margins and papersize to determine width + if it is not defined by other means in postscript mode + (2003/08/06) PS1 - added ability to read multiple bitmaps in + postscript mode + (2003/08/05) PS1 - new --longcoding option + (2003/08/05) PS1 - new optimized eps backend which works with + opticurve. + (2003/07/31) PS1 - replaced O(n^3) calc_lon algorithm by a new + O(n^2) algorithm. Observed speedups of factor 80. + (2003/07/27) PS1 - added --opticurve option and integrated + opticurve code in curve.c + (2003/06/04) PS1 - made bm_to_pathlist a lot more efficient by + scanning and clearing only bounding box of mask in inner scan. + (2002/11/17) PS1 - changed bm_to_pathlist prototype to use + explicit return value. + (2002/10/09) PS1 - autoconf: added automake/autoconf scripts in + preparation for public distribution. diff --git a/Build/source/libs/potrace/potrace-1.11/Makefile.am b/Build/source/libs/potrace/potrace-1.11/Makefile.am new file mode 100644 index 00000000000..04ff45d5161 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/Makefile.am @@ -0,0 +1,12 @@ +## Copyright (C) 2001-2013 Peter Selinger. +## This file is part of Potrace. It is free software and it is covered +## by the GNU General Public License. See the file COPYING for details. + +## Process this file with automake to produce Makefile.in + +# unsure why automake/autoconf does not automatically distribute libtool +EXTRA_DIST = README-WIN libtool + +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = src doc check diff --git a/Build/source/libs/potrace/potrace-1.11/NEWS b/Build/source/libs/potrace/potrace-1.11/NEWS new file mode 100644 index 00000000000..91902ae0887 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/NEWS @@ -0,0 +1,112 @@ +February 19, 2013: Release 1.11 + + A GeoJSON backend was added; thanks to Christoph Hormann for + contributing this. Support for bitfields in the BMP format was + added. A minor change was made to the behavior of the alphamax + parameter; a value of 0 now gives a true polygon. + +August 19, 2011: Release 1.10 + + A DXF backend was added. The output is in the drawing interchange + format used by computer aided design software. Thanks to Jonas + Benedett Dorr for testing. The Gimppath backend was changed to be + compatible with current versions of Gimp. The EPS, PDF, and SVG + backends now use high-resolution bounding boxes. The default scaling + of the EPS, PDF, and SVG backends is now fixed at 72dpi. A new option + --flat was added to the SVG backend. A new option --tight was added + to remove whitespace around the input image before calculating its + scaling and placement. + +December 21, 2010: Release 1.9 + + The xfig and eps backends were improved, and a fixed pagesize PDF + backend was added. Support for BMP version 4 and version 5 files, as + well as top-down BMP files, was added. Minor speed improvements to + Potrace and major speed improvements to mkbitmap. A Gaussian blur + option was added to mkbitmap. Libtool is now used to build and + optionally install the Potrace library. An optional simplified + progress bar was added for dumb terminals. This release also contains + some portability improvements, cross-compilation improvements, and + minor bug fixes. + +April 9, 2007: Release 1.8 + + This release contains minor bugfixes and portability improvements. + Rotation is now implemented in the PDF backend. + +March 6, 2005: Release 1.7 + + This is a bugfix release. A bug in the progress bar code, which + caused arithmetic exceptions on some 64-bit architectures, has been + fixed. + +February 27, 2005: Release 1.6 + + This release contains an algorithm improvement that leads to a + speedup of 20-60% over previous versions of Potrace. A new PDF + backend was added, courtesy of Tor Andersson. An option --progress + was added for displaying a progress bar. The Windows version of + Potrace now uses MinGW instead of Cygwin, eliminating the need to + install a special DLL alongside the executable programs, and solving + some problems with wildcards and executable PostScript files. Some + spurious "premature end of file" messages were eliminated. The + core functionality of Potrace was separated into a library with a + documented API, making it easier for developers to incorporate + Potrace into other GPL-licensed software. + +July 8, 2004: Release 1.5 + + The LZW patent has finally expired in Canada. Therefore, postscript + level 2 compression can now be implemented directly within Potrace, + without having to rely on the external "compress" program. This + release makes the necessary corrections. + +March 6, 2004: Release 1.4 + + This is a bugfix release. Fixed the bug which sometimes caused + Potrace to "hang" on large input files. Also fixed some bugs in the + compression code. The presence of the "compress" program is now + determined at run-time, rather than compile-time. No new features or + command line options were added. + +January 15, 2004: Release 1.3 + + This is primarily a bugfix release. Version 1.2 fatally crashed when + applied to an empty (all white) bitmap. The options -2 and -3 are now + ignored when unsupported, rather than causing an error. There were + some improvements to the test suite, autoconfiguration, and + portability. The bounding box in the xfig backend was fixed, and the + postscript output now has better page encapsulation. Bitmaps of + dimension 0 are now tolerated better. + +December 23, 2003: Release 1.2 + + New experimental Gimppath and XFig backends were added. A separate + program mkbitmap was added, which can be used as a preprocessor to + Potrace. It turns greyscale or color images into high-quality + bitmaps with optional scaling and filtering. New options --opaque, + --group, and --fillcolor were added for greater flexibility in + generating editable PostScript and SVG output. The bitmap + decomposition algorithm was improved and can now take advantage of + 64-bit platforms. Portability and autoconfiguration were vastly + improved, and a test suite was added. Runlength encoded BMP files can + now be read. Some bugs in command line options were fixed. + +August 18, 2003: Release 1.1 + + The most important new feature of this release is an SVG (scalable + vector graphics) backend. This file format can be read by vector + graphics manipulation programs such as sodipodi, as well as web + browsers with an SVG plugin. I also added PGM, PPM, and BMP as + additional input file formats. The new --blacklevel and --invert + options control how non-black-and-white images are converted to + bitmaps before being processed by Potrace. The implementation of a + critical function has been improved to make Potrace even faster on + large input files; this results in speedups of up to factor 3.3 + relative to Potrace 1.0. Autoconfiguration was improved, and the code + was polished to compile on more different architectures. The error + messages for wrong file formats were also improved. + +August 10, 2003: Release 1.0 + + First public release. diff --git a/Build/source/libs/potrace/potrace-1.11/README b/Build/source/libs/potrace/potrace-1.11/README new file mode 100644 index 00000000000..b8d88c1d2e4 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/README @@ -0,0 +1,183 @@ + + POTRACE - transform bitmaps into vector graphics + + * * * + +DESCRIPTION + + Potrace is a tool for tracing a bitmap, which means, transforming a + bitmap into a smooth, scalable image. The input is a bitmap (PBM, + PGM, PPM, or BMP), and the default output is one of several vector + file formats. A typical use is to create EPS files from scanned + data, such as company or university logos, handwritten notes, etc. + The resulting image is not "jaggy" like a bitmap, but smooth. It can + then be rendered at any resolution. + + Potrace can currently produce the following output formats: EPS, + PostScript, PDF, SVG (scalable vector graphics), DXF, GeoJSON, PGM + (for easy antialiasing of pixel-based images), Gimppath, and + XFig. Additional backends might be added in the future. + + A separate program, mkbitmap, is also provided. This program can act + as a pre-processor for Potrace, applying scaling and various filters + to an image before converting it to a bitmap. This is useful for + potracing greyscale and color images. + +DEPENDENCIES + + Potrace relies on the zlib library for PostScript level 3 + compression. This library is pre-installed on most modern systems. + If not present, it can be obtained from http://www.gzip.org/zlib/. + +COMPILATION + + For generic compilation instructions, see the file INSTALL. In + addition, the following compile time options (options to ./configure) + are supported. + + --with-libpotrace install Potrace library and headers (default: no) + --disable-zlib disable PostScript level 3 compression + --enable-metric use metric units (centimeters) as default + --enable-a4 use a4 as the default papersize + --enable-dumb-tty use simplified ASCII-only progress bar + + See also ./configure --help. + +INSTALLING + + If you are installing from sources, just do "make install" as root. + If you are installing from a binary distribution, just copy the + "potrace" and "mkbitmap" binaries to a place where the operating + system expects them, such as /usr/local/bin. Also copy the files + "potrace.1" and "mkbitmap.1" to a directory where the operating + system looks for man pages, such as /usr/local/man/man1. For + instructions on installing Potrace under Windows, see the file + README-WIN + +USAGE + + For more detailed usage information, see the man page. + + Usage: potrace [options] [filename...] + General options: + -h, --help - print this help message and exit + -v, --version - print version info and exit + -l, --license - print license info and exit + File selection: + <filename> - an input file + -o, --output <filename> - write all output to this file + -- - end of options; 0 or more input filenames follow + Backend selection: + -b, --backend <name> - select backend by name + -e, --eps - EPS backend (encapsulated PostScript) (default) + -p, --postscript - PostScript backend + -s, --svg - SVG backend (scalable vector graphics) + -g, --pgm - PGM backend (portable greymap) + -b pdf - PDF backend (portable document format) + -b pdfpage - fixed page-size PDF backend + -b dxf - DXF backend (drawing interchange format) + -b geojson - GeoJSON backend + -b gimppath - Gimppath backend (GNU Gimp) + -b xfig - XFig backend + Algorithm options: + -z, --turnpolicy <policy> - how to resolve ambiguities in path decomposition + -t, --turdsize <n> - suppress speckles of up to this size (default 2) + -a, --alphamax <n> - corner threshold parameter (default 1) + -n, --longcurve - turn off curve optimization + -O, --opttolerance <n> - curve optimization tolerance (default 0.2) + -u, --unit <n> - quantize output to 1/unit pixels (default 10) + -d, --debug <n> - produce debugging output of type n (n=1,2,3) + Scaling and placement options: + -P, --pagesize <format> - page size (default is letter) + -W, --width <dim> - width of output image + -H, --height <dim> - height of output image + -r, --resolution <n>[x<n>] - resolution (in dpi) (dimension-based backends) + -x, --scale <n>[x<n>] - scaling factor (pixel-based backends) + -S, --stretch <n> - yresolution/xresolution + -A, --rotate <angle> - rotate counterclockwise by angle + -M, --margin <dim> - margin + -L, --leftmargin <dim> - left margin + -R, --rightmargin <dim> - right margin + -T, --topmargin <dim> - top margin + -B, --bottommargin <dim> - bottom margin + --tight - remove whitespace around the input image + Color options, supported by some backends: + -C, --color #rrggbb - set foreground color (default black) + --fillcolor #rrggbb - set fill color (default transparent) + --opaque - make white shapes opaque + SVG options: + --group - group related paths together + --flat - whole image as a single path + Postscript/EPS/PDF options: + -c, --cleartext - do not compress the output + -2, --level2 - use postscript level 2 compression (default) + -3, --level3 - use postscript level 3 compression + -q, --longcoding - do not optimize for file size + PGM options: + -G, --gamma <n> - gamma value for anti-aliasing (default 2.2) + Frontend options: + -k, --blacklevel <n> - black/white cutoff in input file (default 0.5) + -i, --invert - invert bitmap + Progress bar options: + --progress - show progress bar + --tty <mode> - progress bar rendering: vt100 or dumb + + Dimensions can have optional units, e.g. 6.5in, 15cm, 100pt. + Default is inches (or pixels for pgm, dxf, and gimppath backends). + Possible input file formats are: pnm (pbm, pgm, ppm), bmp. + Backends are: eps, postscript, ps, pdf, pdfpage, svg, dxf, geojson, pgm, + gimppath, xfig. + +POTRACE LIBRARY (FOR DEVELOPERS) + + As of Potrace release 1.6, the Potrace core functionality has been + separated into a library libpotrace.a. This makes it easy to integrate + tracing functionality into other GPL programs. The API of the library + is defined in the header file potracelib.h, and is documented in + doc/potracelib.pdf. It is not by default installed, but can be + installed with the --with-libpotrace configuration option. + +DOCUMENTATION + + Usage information is contained in the man page: + http://potrace.sourceforge.net/potrace.html + + Many common questions are answered in the FAQ: + http://potrace.sourceforge.net/faq.html + + Some examples are given on the following web pages: + http://potrace.sourceforge.net/samples.html + http://potrace.sourceforge.net/mkbitmap.html + + The inner workings of the potrace algorithm are explained here: + http://potrace.sourceforge.net/potrace.pdf + + The potrace library is documented here: + http://potrace.sourceforge.net/potracelib.pdf + +COPYRIGHT + + Copyright (C) 2001-2013 Peter Selinger + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, + USA. See also http://www.gnu.org/. + + See the file COPYING for details. + +GPG KEY + + The key fingerprint of Peter Selinger's GPG key is: + 12A2 4B3C 3790 B688 E484 7A98 A68B CC37 CA31 696A + This may be useful for authenticating future versions of Potrace. diff --git a/Build/source/libs/potrace/potrace-1.11/README-WIN b/Build/source/libs/potrace/potrace-1.11/README-WIN new file mode 100644 index 00000000000..ff16913c8ee --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/README-WIN @@ -0,0 +1,65 @@ + + POTRACE - transform bitmaps into vector graphics + + README for Windows + _________________________________________________________________ + +This file contains instructions specific to the pre-compiled Windows +distribution of Potrace. Please see the general README file and the +man page for general information on usage, how to compile Potrace, +etc. + + +INSTALLATION for Windows 95/98/2000/NT/XP/Vista/7/whatever: +=========================================================== + +Download the file potrace-XXX.win32.zip (or potrace-XXX.win64.zip if +you want the 64-bit version). Unpack it with your favorite unzipping +tool, such as unzip, 7-Zip, WinZip, or just right-clicking on the +file. + +If you have "tar" and "gunzip" installed, you may also get the tar.gz +file instead of the zip file. + +The distribution includes the executable programs potrace.exe and +mkbitmap.exe. You need to move these files to a place where Windows +looks for programs, for example C:\WINDOWS. Alternatively, you can +amend your PATH environment variable, by adding something like the +following line to C:\AUTOEXEC.BAT: + + PATH=%PATH%;C:\DIRECTORY\WHERE\FILES\ARE + +Note: as of version 1.6, the Potrace Windows distribution is built +using MinGW and not Cygwin. It is no longer necessary to install a +separate DLL file with Potrace. + + +RUNNING: +======== + +For non-Windows specific usage information, see the file README. + +Potrace on Windows runs in much the same way as under Linux and other +Unix-like operating systems. You must run Potrace from the command +line (also known as the MSDOS Prompt). File names can be given in Unix +style or Windows style, thus the following will both work: + + potrace h:/data/file.txt + potrace h:\data\file.txt + +Wildcards can also be used, as in: + + potrace h:\data\*.* + potrace h:/data/*.* + +Earlier versions of Potrace had some problems when wildcards and +backslashes were mixed; these problems seem to have been solved by the +switch from Cygwin to MinGW. + +Another problem that some users have reported is that the generated +".ps" and ".eps" were not executable under Windows (i.e., one could +not simply display these files by typing their name on the MSDOS +Prompt, as should normally be the case if a default application for +PostScript files has been configured). I was never able to replicate +this problem, but I believe that it has also been solved by the switch +to MinGW. diff --git a/Build/source/libs/potrace/potrace-1.11/config.h.in b/Build/source/libs/potrace/potrace-1.11/config.h.in new file mode 100644 index 00000000000..6dea9accfa9 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/config.h.in @@ -0,0 +1,101 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Use the simplified progress bar? */ +#undef DUMB_TTY + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#undef HAVE_DLFCN_H + +/* Does the C compiler have gcc bug 12243? */ +#undef HAVE_GCC_LOOP_BUG + +/* Can we use Intel 386 optimizations? */ +#undef HAVE_I386 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* Do we have the zlib library? */ +#undef HAVE_ZLIB + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Name of the mkbitmap binary */ +#undef MKBITMAP + +/* Define if missing from math.h */ +#undef M_PI + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Name of the potrace binary */ +#undef POTRACE + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Use a4 papersize by default? */ +#undef USE_A4 + +/* Use metric units by default? */ +#undef USE_METRIC + +/* Version number of package */ +#undef VERSION + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Replacement function for strcasecmp */ +#undef strcasecmp + +/* Replacement function for strncasecmp */ +#undef strncasecmp diff --git a/Build/source/libs/potrace/potrace-1.11/configure.ac b/Build/source/libs/potrace/potrace-1.11/configure.ac new file mode 100644 index 00000000000..bbaab6bd526 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/configure.ac @@ -0,0 +1,278 @@ +dnl Copyright (C) 2001-2013 Peter Selinger. +dnl This file is part of Potrace. It is free software and it is covered +dnl by the GNU General Public License. See the file COPYING for details. + +dnl Process this file with autoconf to produce a configure script. + +dnl ---------------------------------------------------------------------- +dnl Package info +AC_INIT([potrace],[1.11],[selinger at users.sourceforge.net]) +AC_CONFIG_SRCDIR(src/trace.c) +AM_INIT_AUTOMAKE +AC_CONFIG_HEADER(config.h) +AC_CONFIG_MACRO_DIR([m4]) + +DATE="February 2013" + +dnl ---------------------------------------------------------------------- +dnl The names of the installed executables are defined here, but +dnl should not normally be changed. + +POTRACE=potrace +AC_DEFINE_UNQUOTED(POTRACE,"$POTRACE",Name of the potrace binary) + +MKBITMAP=mkbitmap +AC_DEFINE_UNQUOTED(MKBITMAP,"$MKBITMAP",Name of the mkbitmap binary) + +dnl ---------------------------------------------------------------------- +dnl figure out compiler options + +dnl remember user's CFLAGS, if any +iCFLAGS="$CFLAGS" + +dnl Check for compiler +AC_PROG_CC + +dnl If compiler is gcc, add our own default CFLAGS if no others specified +if test "$GCC" = "yes" && test "$iCFLAGS" = ""; then + CFLAGS="$CFLAGS -Wall -ffloat-store" +fi + +dnl Also add CADD to the CFLAGS at configure time or compile time +AC_SUBST(CADD) + +AC_MSG_CHECKING(what compiler options to use) +AC_MSG_RESULT($CFLAGS $CADD) + +dnl ---------------------------------------------------------------------- +dnl check if --with-libpotrace was given - this must be done +dnl before LT_INIT so that we can avoid building shared libraries +dnl when they are not going to be installed. + +AC_ARG_WITH(libpotrace, + AS_HELP_STRING([--with-libpotrace],[install Potrace library and headers [default=no]])) + +if test "$with_libpotrace" != yes; then + enable_shared=no +fi + +dnl ---------------------------------------------------------------------- +dnl Figure out how to build libraries + +AC_LIBTOOL_WIN32_DLL +LT_INIT + +dnl ---------------------------------------------------------------------- +dnl Figure out whether to install libraries (default: no) + +AC_MSG_CHECKING(whether to install the Potrace library) +if test "$with_libpotrace" = yes; then + AC_MSG_RESULT(yes) + INSTLIBS="libpotrace.la" + INSTHEADERS="potracelib.h" +else + AC_MSG_RESULT(no) +fi +AC_SUBST(INSTLIBS) +AC_SUBST(INSTHEADERS) + +dnl ---------------------------------------------------------------------- +dnl check for compiler bugs. + +dnl The GCC compiler used to have a loop optimization bug that affected +dnl potrace. This bug had been present since gcc-2.X and was still +dnl pending (as of gcc version 3.3.1). Since the presence of this bug +dnl cannot be reliably tested, and I am not sure in which version it was +dnl fixed, we simply assume (conservatively) that all gcc compilers may +dnl have this bug. In future: add a test that checks the compiler +dnl version. + +if test "$GCC" = "yes"; then + AC_MSG_CHECKING([whether gcc has bug number 12243]) + AC_DEFINE(HAVE_GCC_LOOP_BUG,, [Does the C compiler have gcc bug 12243?]) + AC_MSG_RESULT(maybe) +fi + +dnl ---------------------------------------------------------------------- +dnl check for features + +AC_MSG_CHECKING(whether to use zlib) +AC_ARG_ENABLE(zlib, + AS_HELP_STRING([--disable-zlib],[disable PostScript level 3 compression])) +if test "$enable_zlib" != no; then + AC_DEFINE(HAVE_ZLIB,, Do we have the zlib library?) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +dnl Set optional defaults +AC_MSG_CHECKING(whether to default to metric units) +AC_ARG_ENABLE(metric, + AS_HELP_STRING([--enable-metric],[use metric units (centimeters) as default])) +if test "$enable_metric" = yes; then + AC_DEFINE(USE_METRIC,, Use metric units by default?) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(whether to default to a4 paper size) +AC_ARG_ENABLE(a4, + AS_HELP_STRING([--enable-a4],[use a4 as the default papersize])) +if test "$enable_a4" = yes; then + AC_DEFINE(USE_A4,, Use a4 papersize by default?) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(whether to use the simplified progress bar) +AC_ARG_ENABLE(dumb-tty, + AS_HELP_STRING([--enable-dumb-tty], [use simplified ASCII-only progress bar])) +dumb_tty="$enable_dumb_tty" +if test -z "$dumb_tty"; then + AC_CANONICAL_HOST + if test "$host_os" = "mingw32"; then + dumb_tty="yes" + fi +fi +if test "$dumb_tty" = "yes"; then + AC_DEFINE(DUMB_TTY,, Use the simplified progress bar?) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +dnl ---------------------------------------------------------------------- +dnl Calculate value of "prefix", to aid guessing of include file and +dnl library locations. + +USERPREFIX="$prefix" +if test "$USERPREFIX" = "NONE"; then + USERPREFIX="$ac_default_prefix" +fi + +dnl ---------------------------------------------------------------------- +dnl Check for header files + +if test "$enable_zlib" != no; then + AC_CHECK_HEADER(zlib.h, true, + [AC_MSG_WARN([zlib.h not found in standard location. +Trying again with -I$USERPREFIX/include]) + CPPFLAGS="$CPPFLAGS -I$USERPREFIX/include" + dnl need to unset cached value to repeat the test + unset ac_cv_header_zlib_h + AC_CHECK_HEADER(zlib.h, true, + [AC_MSG_ERROR([cannot find zlib.h. +Rerun ./configure with CPPFLAGS=-I<include dir> if you have the header +file in a non-standard directory, or with --disable-zlib to disable +support for PostScript level 3 compression.]) + ]) + ]) +fi + +dnl ---------------------------------------------------------------------- +dnl Check for symbols +AC_CHECK_DECL(M_PI, , + AC_DEFINE(M_PI, 3.14159265358979323846, [Define if missing from math.h]), + [#include <math.h>]) + +dnl ---------------------------------------------------------------------- +dnl Check for libraries + +if test "$enable_zlib" != no; then + AC_CHECK_LIB(z, deflate, EXTRA_LIBS="$EXTRA_LIBS -lz", + [AC_MSG_WARN([libz library not found in standard location. +Trying again with -L$USERPREFIX/lib]) + LDFLAGS="$LDFLAGS -L$USERPREFIX/lib" + dnl need to unset cached value to repeat the test + unset ac_cv_lib_z_deflate + AC_CHECK_LIB(z, deflate, EXTRA_LIBS="$EXTRA_LIBS -lz", + [AC_MSG_ERROR([cannot find the libz library (-lz). +Rerun ./configure with LDFLAGS=-L<lib dir> if you have the library in +a non-standard directory, or with --disable-zlib to disable support +for PostScript level 3 compression.]) + ]) + ]) +fi + +AC_CHECK_LIB(m, floor, true, AC_MSG_ERROR([cannot find the m library (-lm)])) + +dnl ---------------------------------------------------------------------- +dnl Check for library functions. + +dnl Check for getopt_long +AC_CHECK_FUNC(getopt_long, have_getopt_long=yes, have_getopt_long=no) +if test "$have_getopt_long" = "yes"; then + dnl Check whether getopt_long reorders its arguments + AC_MSG_CHECKING([whether getopt_long reorders its arguments]) + AC_RUN_IFELSE([AC_LANG_PROGRAM( + [[ #include <getopt.h> + static struct option longopts[] = { + {"help", 0, 0, 'h'}, + {0, 0, 0, 0} + }; + ]], + [[ int ac = 3; + char *av[] = { "main", "file", "-h" }; + return 'h' == getopt_long(ac, av, "h", longopts, (int *)0) ? 0 : 1; + ]])], + [AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) + have_getopt_long=no], + [AC_MSG_RESULT(maybe (cross-compiling)) + have_getopt_long=no]) +fi +if test "$have_getopt_long" != "yes"; then + EXTRA_OBJS="$EXTRA_OBJS getopt.o getopt1.o" +fi + +AC_CHECK_FUNC(strcasecmp, , + [AC_CHECK_FUNC(stricmp, + [AC_DEFINE_UNQUOTED(strcasecmp, stricmp, [Replacement function for strcasecmp])], + [AC_MSG_ERROR([cannot find a replacement for strcasecmp])] + )] +) +AC_CHECK_FUNC(strncasecmp, , + [AC_CHECK_FUNC(strnicmp, + [AC_DEFINE_UNQUOTED(strncasecmp, strnicmp, [Replacement function for strncasecmp])], + [AC_MSG_ERROR([cannot find a replacement for strncasecmp])] + )] +) + +dnl ---------------------------------------------------------------------- +dnl Check whether we have i386 features +AC_MSG_CHECKING([for Intel 386]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[int x; + asm("bsf %1,%0\njnz 0f\nmovl $32,%0\n0:":"=r"(x):"r"(x)); + return x; /* need this so that -O2 does not optimize the asm away */ +]])],[AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_I386,, Can we use Intel 386 optimizations?) +],[AC_MSG_RESULT(no)]) + + +dnl ---------------------------------------------------------------------- +dnl Check whether compiler supports inlining + +AC_C_INLINE + +dnl ---------------------------------------------------------------------- +dnl Set up substitutions of non-standard configuration parameters +AC_SUBST(DATE) +AC_SUBST(POTRACE) +AC_SUBST(MKBITMAP) +AC_SUBST(EXTRA_OBJS) +AC_SUBST(EXTRA_LIBS) +AC_SUBST(INCLUDES) +AC_SUBST(POTRACELIB_VERSION) + +dnl ---------------------------------------------------------------------- +AC_CONFIG_FILES([Makefile + src/Makefile + doc/Makefile + check/Makefile + doc/potrace.1 + doc/mkbitmap.1 + ]) +AC_OUTPUT diff --git a/Build/source/libs/potrace/potrace-1.11/src/Makefile.am b/Build/source/libs/potrace/potrace-1.11/src/Makefile.am new file mode 100644 index 00000000000..c8bda63c5de --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/Makefile.am @@ -0,0 +1,57 @@ +## Copyright (C) 2001-2013 Peter Selinger. +## This file is part of Potrace. It is free software and it is covered +## by the GNU General Public License. See the file COPYING for details. + +## Process this file with automake to produce Makefile.in + +AM_CFLAGS = $(CADD) + +#---------------------------------------------------------------------- +# programs: + +bin_PROGRAMS = potrace mkbitmap +EXTRA_PROGRAMS = potracelib_demo + +potrace_SOURCES = main.c main.h bitmap_io.c bitmap_io.h backend_eps.c \ + backend_eps.h flate.c flate.h lists.h greymap.c greymap.h render.c \ + render.h backend_pgm.c backend_pgm.h backend_svg.c backend_svg.h \ + backend_xfig.c backend_xfig.h backend_dxf.c backend_dxf.h \ + backend_pdf.c backend_pdf.h backend_geojson.c backend_geojson.h \ + lzw.c lzw.h bitops.h auxiliary.h potracelib.h bitmap.h curve.h \ + platform.h progress.h progress_bar.c progress_bar.h bbox.c bbox.h \ + trans.c trans.h +potrace_LDADD = libpotrace.la @EXTRA_OBJS@ -lm @EXTRA_LIBS@ +potrace_DEPENDENCIES = libpotrace.la @EXTRA_OBJS@ + +mkbitmap_SOURCES = mkbitmap.c bitmap_io.c bitmap_io.h greymap.c \ + greymap.h platform.h +mkbitmap_LDADD = @EXTRA_OBJS@ -lm +mkbitmap_DEPENDENCIES = @EXTRA_OBJS@ + +potracelib_demo_SOURCES = potracelib_demo.c +potracelib_demo_LDADD = libpotrace.la -lm +potracelib_demo_DEPENDENCIES = libpotrace.la + +#---------------------------------------------------------------------- +# Potrace library: + +libsources = curve.c curve.h trace.c trace.h decompose.c \ + decompose.h potracelib.c potracelib.h lists.h auxiliary.h bitmap.h \ + progress.h + +lib_LTLIBRARIES = $(INSTLIBS) +EXTRA_LTLIBRARIES = libpotrace.la +libpotrace_la_SOURCES = $(libsources) +libpotrace_la_LDFLAGS = -version-info 0:1:0 -rpath '$(libdir)' \ + -export-symbols $(srcdir)/libpotrace-export.sym -no-undefined +libpotrace_la_LIBADD = -lm +MOSTLYCLEANFILES = libpotrace.la + +# header files to install +include_HEADERS = $(INSTHEADERS) +EXTRA_HEADERS = potracelib.h + +#---------------------------------------------------------------------- +# other stuff to distribute + +EXTRA_DIST = getopt.c getopt1.c getopt.h libpotrace-export.sym diff --git a/Build/source/libs/potrace/potrace-1.11/src/auxiliary.h b/Build/source/libs/potrace/potrace-1.11/src/auxiliary.h new file mode 100644 index 00000000000..c4c610cd4ef --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/auxiliary.h @@ -0,0 +1,78 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* This header file collects some general-purpose macros (and static + inline functions) that are used in various places. */ + +#ifndef AUXILIARY_H +#define AUXILIARY_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* ---------------------------------------------------------------------- */ +/* point arithmetic */ + +#include "potracelib.h" + +struct point_s { + long x; + long y; +}; +typedef struct point_s point_t; + +typedef potrace_dpoint_t dpoint_t; + +/* convert point_t to dpoint_t */ +static inline dpoint_t dpoint(point_t p) { + dpoint_t res; + res.x = p.x; + res.y = p.y; + return res; +} + +/* range over the straight line segment [a,b] when lambda ranges over [0,1] */ +static inline dpoint_t interval(double lambda, dpoint_t a, dpoint_t b) { + dpoint_t res; + + res.x = a.x + lambda * (b.x - a.x); + res.y = a.y + lambda * (b.y - a.y); + return res; +} + +/* ---------------------------------------------------------------------- */ +/* some useful macros. Note: the "mod" macro works correctly for + negative a. Also note that the test for a>=n, while redundant, + speeds up the mod function by 70% in the average case (significant + since the program spends about 16% of its time here - or 40% + without the test). The "floordiv" macro returns the largest integer + <= a/n, and again this works correctly for negative a, as long as + a,n are integers and n>0. */ + +/* integer arithmetic */ + +static inline int mod(int a, int n) { + return a>=n ? a%n : a>=0 ? a : n-1-(-1-a)%n; +} + +static inline int floordiv(int a, int n) { + return a>=0 ? a/n : -1-(-1-a)/n; +} + +/* Note: the following work for integers and other numeric types. */ +#undef sign +#undef abs +#undef min +#undef max +#undef sq +#undef cu +#define sign(x) ((x)>0 ? 1 : (x)<0 ? -1 : 0) +#define abs(a) ((a)>0 ? (a) : -(a)) +#define min(a,b) ((a)<(b) ? (a) : (b)) +#define max(a,b) ((a)>(b) ? (a) : (b)) +#define sq(a) ((a)*(a)) +#define cu(a) ((a)*(a)*(a)) + +#endif /* AUXILIARY_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_dxf.c b/Build/source/libs/potrace/potrace-1.11/src/backend_dxf.c new file mode 100644 index 00000000000..2dcf5637ec3 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_dxf.c @@ -0,0 +1,278 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* The DXF backend of Potrace. */ + +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <math.h> + +#include "main.h" +#include "backend_dxf.h" +#include "potracelib.h" +#include "lists.h" +#include "auxiliary.h" +#include "trans.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +/* ---------------------------------------------------------------------- */ +/* auxiliary linear algebra functions */ + +/* subtract two vectors */ +static dpoint_t sub(dpoint_t v, dpoint_t w) { + dpoint_t r; + + r.x = v.x - w.x; + r.y = v.y - w.y; + return r; +} + +/* inner product */ +static double iprod(dpoint_t v, dpoint_t w) { + return v.x * w.x + v.y * w.y; +} + +/* cross product */ +static double xprod(dpoint_t v, dpoint_t w) { + return v.x * w.y - v.y * w.x; +} + +/* calculate the DXF polyline "bulge" value corresponding to the angle + between two vectors. In case of "infinity" return 0.0. */ +static double bulge(dpoint_t v, dpoint_t w) { + double v2, w2, vw, vxw, nvw; + + v2 = iprod(v, v); + w2 = iprod(w, w); + vw = iprod(v, w); + vxw = xprod(v, w); + nvw = sqrt(v2 * w2); + + if (vxw == 0.0) { + return 0.0; + } + + return (nvw - vw) / vxw; +} + +/* ---------------------------------------------------------------------- */ +/* DXF output synthesis */ + +/* print with group code: the low-level DXF file format */ +static int ship(FILE *fout, int gc, const char *fmt, ...) { + va_list args; + int r; + int c; + + r = fprintf(fout, "%3d\n", gc); + if (r < 0) { + return r; + } + c = r; + va_start(args, fmt); + r = vfprintf(fout, fmt, args); + va_end(args); + if (r < 0) { + return r; + } + c += r; + r = fprintf(fout, "\n"); + if (r < 0) { + return r; + } + c += r; + return c; +} + +/* output the start of a polyline */ +static void ship_polyline(FILE *fout, char *layer, int closed) { + ship(fout, 0, "POLYLINE"); + ship(fout, 8, "%s", layer); + ship(fout, 66, "%d", 1); + ship(fout, 70, "%d", closed ? 1 : 0); +} + +/* output a vertex */ +static void ship_vertex(FILE *fout, char *layer, dpoint_t v, double bulge) { + ship(fout, 0, "VERTEX"); + ship(fout, 8, "%s", layer); + ship(fout, 10, "%f", v.x); + ship(fout, 20, "%f", v.y); + ship(fout, 42, "%f", bulge); +} + +/* output the end of a polyline */ +static void ship_seqend(FILE *fout) { + ship(fout, 0, "SEQEND"); +} + +/* output a comment */ +static void ship_comment(FILE *fout, char *comment) { + ship(fout, 999, "%s", comment); +} + +/* output the start of a section */ +static void ship_section(FILE *fout, char *name) { + ship(fout, 0, "SECTION"); + ship(fout, 2, "%s", name); +} + +static void ship_endsec(FILE *fout) { + ship(fout, 0, "ENDSEC"); +} + +static void ship_eof(FILE *fout) { + ship(fout, 0, "EOF"); +} + +/* ---------------------------------------------------------------------- */ +/* Simulated quadratic and bezier curves */ + +/* Output vertices (with bulges) corresponding to a smooth pair of + circular arcs from A to B, tangent to AC at A and to CB at + B. Segments are meant to be concatenated, so don't output the final + vertex. */ +static void pseudo_quad(FILE *fout, char *layer, dpoint_t A, dpoint_t C, dpoint_t B) { + dpoint_t v, w; + double v2, w2, vw, vxw, nvw; + double a, b, c, y; + dpoint_t G; + double bulge1, bulge2; + + v = sub(A, C); + w = sub(B, C); + + v2 = iprod(v, v); + w2 = iprod(w, w); + vw = iprod(v, w); + vxw = xprod(v, w); + nvw = sqrt(v2 * w2); + + a = v2 + 2*vw + w2; + b = v2 + 2*nvw + w2; + c = 4*nvw; + if (vxw == 0 || a == 0) { + goto degenerate; + } + /* assert: a,b,c >= 0, b*b - a*c >= 0, and 0 <= b - sqrt(b*b - a*c) <= a */ + y = (b - sqrt(b*b - a*c)) / a; + G = interval(y, C, interval(0.5, A, B)); + + bulge1 = bulge(sub(A,G), v); + bulge2 = bulge(w, sub(B,G)); + + ship_vertex(fout, layer, A, -bulge1); + ship_vertex(fout, layer, G, -bulge2); + return; + + degenerate: + ship_vertex(fout, layer, A, 0); + + return; +} + +/* produce a smooth from A to D, tangent to AB at A and to CD at D. + This is similar to a Bezier curve, except that our curve will be + made up of up to 4 circular arcs. This is particularly intended for + the case when AD and BC are parallel. Like arcs(), don't output the + final vertex. */ +static void pseudo_bezier(FILE *fout, char *layer, dpoint_t A, dpoint_t B, dpoint_t C, dpoint_t D) { + dpoint_t E = interval(0.75, A, B); + dpoint_t G = interval(0.75, D, C); + dpoint_t F = interval(0.5, E, G); + + pseudo_quad(fout, layer, A, E, F); + pseudo_quad(fout, layer, F, G, D); + return; +} + +/* ---------------------------------------------------------------------- */ +/* functions for converting a path to a DXF polyline */ + +/* do one path. */ +static int dxf_path(FILE *fout, char *layer, potrace_curve_t *curve, trans_t t) { + int i; + dpoint_t *c, *c1; + int n = curve->n; + + ship_polyline(fout, layer, 1); + + for (i=0; i<n; i++) { + c = curve->c[i]; + c1 = curve->c[mod(i-1,n)]; + switch (curve->tag[i]) { + case POTRACE_CORNER: + ship_vertex(fout, layer, trans(c1[2], t), 0); + ship_vertex(fout, layer, trans(c[1], t), 0); + break; + case POTRACE_CURVETO: + pseudo_bezier(fout, layer, trans(c1[2], t), trans(c[0], t), trans(c[1], t), trans(c[2], t)); + break; + } + } + ship_seqend(fout); + return 0; +} + +/* ---------------------------------------------------------------------- */ +/* Backend. */ + +/* public interface for DXF */ +int page_dxf(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) { + potrace_path_t *p; + trans_t t; + char *layer = "0"; + + /* set up the coordinate transform (rotation) */ + t.bb[0] = imginfo->trans.bb[0]+imginfo->lmar+imginfo->rmar; + t.bb[1] = imginfo->trans.bb[1]+imginfo->tmar+imginfo->bmar; + t.orig[0] = imginfo->trans.orig[0]+imginfo->lmar; + t.orig[1] = imginfo->trans.orig[1]+imginfo->bmar; + t.x[0] = imginfo->trans.x[0]; + t.x[1] = imginfo->trans.x[1]; + t.y[0] = imginfo->trans.y[0]; + t.y[1] = imginfo->trans.y[1]; + + ship_comment(fout, "DXF data, created by "POTRACE" "VERSION", written by Peter Selinger 2001-2013"); + + /* header section */ + ship_section(fout, "HEADER"); + + /* variables */ + ship(fout, 9, "$ACADVER"); + ship(fout, 1, "AC1006"); + ship(fout, 9, "$EXTMIN"); + ship(fout, 10, "%f", 0.0); + ship(fout, 20, "%f", 0.0); + ship(fout, 30, "%f", 0.0); + ship(fout, 9, "$EXTMAX"); + ship(fout, 10, "%f", t.bb[0]); + ship(fout, 20, "%f", t.bb[1]); + ship(fout, 30, "%f", 0.0); + + ship_endsec(fout); + + /* entities section */ + ship_section(fout, "ENTITIES"); + + /* write paths */ + list_forall (p, plist) { + dxf_path(fout, layer, &p->curve, t); + } + + ship_endsec(fout); + ship_eof(fout); + + fflush(fout); + return 0; +} + diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_dxf.h b/Build/source/libs/potrace/potrace-1.11/src/backend_dxf.h new file mode 100644 index 00000000000..99f2479a2a2 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_dxf.h @@ -0,0 +1,15 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef BACKEND_DXF_H +#define BACKEND_DXF_H + +#include "potracelib.h" +#include "main.h" + +int page_dxf(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); + +#endif /* BACKEND_DXF_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_eps.c b/Build/source/libs/potrace/potrace-1.11/src/backend_eps.c new file mode 100644 index 00000000000..a9f879591ab --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_eps.c @@ -0,0 +1,847 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +/* The Postscript backend of Potrace. This can produce "ps" or "eps" + output, and different kinds of graphical debugging + output. Postscript compression is optionally supplied via the + functions in flate.c. */ + +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <math.h> +#include <stdlib.h> + +#include "potracelib.h" +#include "curve.h" +#include "main.h" +#include "backend_eps.h" +#include "flate.h" +#include "lists.h" +#include "auxiliary.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define SAFE_MALLOC(var, n, typ) \ + if ((var = (typ *)malloc((n)*sizeof(typ))) == NULL) goto malloc_error + +typedef int color_t; + +#define black 0x000000 +#define red 0xff0000 +#define green 0x008000 +#define blue 0x0000ff + +/* ---------------------------------------------------------------------- */ +/* functions for interfacing with compression backend */ + +/* xship: callback function that must be initialized before calling + any other functions of the "ship" family. xship_file must be + initialized too. */ + +/* print the token to f, but filtered through a compression + filter in case filter!=0 */ +static int (*xship)(FILE *f, int filter, char *s, int len); +static FILE *xship_file; + +/* ship postscript code, filtered */ +static int ship(const char *fmt, ...) { + va_list args; + static char buf[4096]; /* static string limit is okay here because + we only use constant format strings - for + the same reason, it is okay to use + vsprintf instead of vsnprintf below. */ + va_start(args, fmt); + vsprintf(buf, fmt, args); + buf[4095] = 0; + va_end(args); + + xship(xship_file, 1, buf, strlen(buf)); + return 0; +} + +/* ship a postscript comment, unfiltered */ +static int shipcom(char *fmt, ...) { + static char buf[4096]; + va_list args; + + va_start(args, fmt); + vsprintf(buf, fmt, args); + buf[4095] = 0; + va_end(args); + + xship(xship_file, 0, buf, strlen(buf)); + return 0; +} + +/* set all callback functions */ +static void eps_callbacks(FILE *fout) { + if (info.compress && info.pslevel==2) { + xship = lzw_xship; + } else if (info.compress && info.pslevel==3) { + xship = flate_xship; + } else { + xship = dummy_xship; + } + xship_file = fout; +} + +/* ---------------------------------------------------------------------- */ +/* postscript path-drawing auxiliary functions */ + +/* coordinate quantization */ +static inline point_t unit(dpoint_t p) { + point_t q; + + q.x = (long)(floor(p.x*info.unit+.5)); + q.y = (long)(floor(p.y*info.unit+.5)); + return q; +} + +/* current point */ +static point_t cur; + +static void eps_coords(dpoint_t p) { + cur = unit(p); + ship("%ld %ld ", cur.x, cur.y); +} + +static void eps_rcoords(dpoint_t p) { + point_t q; + + q = unit(p); + ship("%ld %ld ", q.x-cur.x, q.y-cur.y); + cur = q; +} + +static void eps_moveto(dpoint_t p) { + eps_coords(p); + ship("moveto\n"); +} + +/* move to point + offset */ +static void eps_moveto_offs(dpoint_t p, double xoffs, double yoffs) { + /* note: structs are passed by value, so the following assignment + does not modify the original struct in the caller */ + p.x += xoffs; + p.y += yoffs; + eps_coords(p); + ship("moveto\n"); +} + +static void eps_lineto(dpoint_t p) { + eps_rcoords(p); + ship("rlineto\n"); +} + +static void eps_curveto(dpoint_t p1, dpoint_t p2, dpoint_t p3) { + point_t q1, q2, q3; + + q1 = unit(p1); + q2 = unit(p2); + q3 = unit(p3); + + ship("%ld %ld %ld %ld %ld %ld rcurveto\n", q1.x-cur.x, q1.y-cur.y, q2.x-cur.x, q2.y-cur.y, q3.x-cur.x, q3.y-cur.y); + + cur = q3; +} + +/* this procedure returns a statically allocated string */ +static char *eps_colorstring(const color_t col) { + double r, g, b; + static char buf[100]; + + r = (col & 0xff0000) >> 16; + g = (col & 0x00ff00) >> 8; + b = (col & 0x0000ff) >> 0; + + if (r==0 && g==0 && b==0) { + return "0 setgray"; + } else if (r==255 && g==255 && b==255) { + return "1 setgray"; + } else if (r == g && g == b) { + sprintf(buf, "%.3f setgray", r/255.0); + return buf; + } else { + sprintf(buf, "%.3f %.3f %.3f setrgbcolor", r/255.0, g/255.0, b/255.0); + return buf; + } +} + +static color_t eps_color = -1; +static double eps_width = -1; + +static void eps_setcolor(const color_t col) { + if (col == eps_color) { + return; + } + eps_color = col; + + ship("%s\n", eps_colorstring(col)); +} + +static void eps_linewidth(double w) { + if (w == eps_width) { + return; + } + eps_width = w; + ship("%f setlinewidth\n", w * info.unit); +} + +/* ---------------------------------------------------------------------- */ +/* functions for converting a path to postscript code */ + +/* ---------------------------------------------------------------------- */ +/* ASCII encoding */ + +/* explicit encoding, does not use special macros */ +static int eps_path_long(privcurve_t *curve) { + int i; + dpoint_t *c; + int m = curve->n; + + c = curve->c[m-1]; + eps_moveto(c[2]); + + for (i=0; i<m; i++) { + c = curve->c[i]; + switch (curve->tag[i]) { + case POTRACE_CORNER: + eps_lineto(c[1]); + eps_lineto(c[2]); + break; + case POTRACE_CURVETO: + eps_curveto(c[0], c[1], c[2]); + break; + } + } + return 0; +} + +/* size-optimized encoding relies on special macros */ +static int eps_path_short(privcurve_t *curve) { + int i, i1; + long int *bq = NULL; /* bq[m] */ + long int *aq = NULL; /* aq[m] */ + point_t *v = NULL; /* v[m] */ + dpoint_t *q = NULL; /* q[m] */ + double M; + int m = curve->n; + + SAFE_MALLOC(bq, m, long int); + SAFE_MALLOC(aq, m, long int); + SAFE_MALLOC(v, m, point_t); + SAFE_MALLOC(q, m, dpoint_t); + + /* quantize vertices */ + for (i=0; i<m; i++) { + v[i] = unit(curve->vertex[i]); + } + + /* quantize beta */ + for (i=0; i<m; i++) { + i1 = mod(i+1,m); + M = max(10, max(abs(v[i1].x-v[i].x), abs(v[i1].y-v[i].y))); + bq[i] = (int)(M * curve->beta[i] + 0.5); + if (curve->beta[i] != 0.5) { + q[i1] = interval(bq[i]/M, dpoint(v[i]), dpoint(v[i1])); + } else { + q[i1] = interval(0.5, dpoint(v[i]), dpoint(v[i1])); + } + } + + /* quantize alpha */ + for (i=0; i<m; i++) { + i1 = mod(i+1,m); + M = max(10, max(max(abs(q[i].x-v[i].x), abs(q[i].y-v[i].y)), + max(abs(v[i].x-q[i1].x), abs(v[i].y-q[i1].y)))); + if (curve->tag[i] == POTRACE_CURVETO) { + aq[i] = (int)(M * curve->alpha[i] + 0.5); + if (aq[i] > M) { + aq[i]--; + } + } + } + + /* generate output */ + ship("%ld %ld ", v[m-1].x, v[m-1].y); + ship("%ld %ld ", v[0].x - v[m-1].x, v[0].y - v[m-1].y); + if (curve->beta[m-1] == 0.5) { + ship("i\n"); + } else { + ship("%ld I\n", bq[m-1]); + } + for (i=0; i<m; i++) { + if (i<m-1) { + ship("%ld %ld ", v[i+1].x - v[i].x, v[i+1].y - v[i].y); + if (curve->beta[i] != 0.5) { + ship("%ld ", bq[i]); + } + } + if (curve->tag[i] == POTRACE_CURVETO) { + ship(curve->beta[i] == 0.5 ? "%ld c\n" : "%ld C\n", aq[i]); + } else { + ship(curve->beta[i] == 0.5 ? "v\n" : "V\n"); + } + } + + free(bq); + free(aq); + free(v); + free(q); + return 0; + + malloc_error: + free(bq); + free(aq); + free(v); + free(q); + return 1; +} + +static int eps_path(privcurve_t *curve) { + if (info.longcoding==0 && curve->alphacurve) { + return eps_path_short(curve); + } else { + return eps_path_long(curve); + } +} + +/* ---------------------------------------------------------------------- */ +/* functions for rendering various internal data structures, used to + generate debugging output */ + +/* output jaggie curve in grey */ +static void eps_jaggy(potrace_path_t *plist) { + potrace_path_t *p; + int i; + + ship(".9 setgray\n"); + list_forall (p, plist) { + point_t *pt = p->priv->pt; + point_t cur, prev; + + if (p->sign == '+') { + cur = prev = pt[p->priv->len-1]; + eps_moveto(dpoint(cur)); + for (i=0; i<p->priv->len; i++) { + if (pt[i].x != cur.x && pt[i].y != cur.y) { + cur = prev; + eps_lineto(dpoint(cur)); + } + prev = pt[i]; + } + eps_lineto(dpoint(pt[p->priv->len-1])); + } else { + cur = prev = pt[0]; + eps_moveto(dpoint(cur)); + for (i=p->priv->len-1; i>=0; i--) { + if (pt[i].x != cur.x && pt[i].y != cur.y) { + cur = prev; + eps_lineto(dpoint(cur)); + } + prev = pt[i]; + } + eps_lineto(dpoint(pt[0])); + } + if (p->next == NULL || p->next->sign == '+') { + ship("fill\n"); + } + } +} + +/* output polygon */ +static void eps_polygon(privcurve_t *curve, const color_t col) { + int i; + int m = curve->n; + + eps_linewidth(.02); + eps_setcolor(col); + eps_moveto(curve->vertex[m-1]); + for (i=0; i<m; i++) { + eps_lineto(curve->vertex[i]); + } + ship("stroke\n"); +} + +/* output lines L and parameter alpha */ +static void eps_L(privcurve_t *curve, const color_t col) { + int i, i1; + double gamma; + dpoint_t p1, p4, p1l, p4l; + int m = curve->n; + + for (i=0; i<m; i++) { + i1 = mod(i+1, m); + gamma = curve->alpha0[i1] * 0.75; + + p1 = curve->c[i][2]; + p4 = curve->c[i1][2]; + p1l = interval(gamma, p1, curve->vertex[i1]); + p4l = interval(gamma, p4, curve->vertex[i1]); + eps_linewidth(.02); + eps_setcolor(col); + eps_moveto(p1l); + eps_lineto(p4l); + ship("stroke\n"); + eps_moveto_offs(curve->vertex[i1], -.4, -.4); + ship("times (%.2f) show\n", curve->alpha0[i1]); + } +} + +/* ---------------------------------------------------------------------- */ +/* postscript macros */ + +/* special macros for size-optimized rendering of Bezier curves */ +static char *optimacros = + "/D{bind def}def\n" + "/R{roll}D\n" + "/K{copy}D\n" + "/P{pop}D\n" + "/p{3 2 R add 3 1 R add exch}D\n" + "/t{dup 4 3 R mul 3 1 R mul}D\n" + "/a{dup 1 sub neg 4 1 R t 5 2 R t p}D\n" + "/m{2 K le{exch}if P}D\n" + "/n{abs exch abs m}D\n" + "/d{-1 t p n}D\n" + "/s{[4 2 R] cvx def}D\n" + "/g{7 K P 4 K P P d 5 1 R d 10 m m div 5 K 12 8 R 5 4 R a 9 4 R 3 2 R a 6 4 R curveto}D\n" + "/e{4 2 R lineto lineto P P}D\n" + "/q{3 K P n 10 m div}D\n" + "/f{x y 7 4 R 5 1 R 4 K p /y s 7 2 R 2 K 9 7 R 7 6 R t p 2 K /x s}D\n" + "/C{4 1 R q f 7 6 R g}D\n" + "/V{q f e}D\n" + "/c{3 1 R .5 f 7 6 R g}D\n" + "/v{.5 f e}D\n" + "/j{5 K P p /y s 3 K t 7 5 R p /x s x moveto P}D\n" + "/i{.5 j}D\n" + "/I{dup 6 1 R q j 3 2 R}D\n" + "/z{closepath}D\n" + "/b{%s z fill}D\n" + "/w{%s z fill}D\n"; + +/* special macros for debug output */ +static char *debugmacros = + "/unit { %f } def\n" + "/box { newpath 0 0 moveto 0 1 lineto 1 1 lineto 1 0 lineto closepath } def\n" + "/circ { newpath 0 0 1 0 360 arc closepath } def\n" + "/dot { gsave .15 mul dup scale circ fill grestore } def\n" + "/sq { gsave unit unit scale -.5 -.5 translate box .02 setlinewidth stroke grestore } def\n" + "/sq1 { gsave translate sq unit .6 mul dot grestore } def\n" + "/dot2 { gsave translate unit dot grestore } def\n" + "/usq { gsave unit unit scale -.5 -.5 rmoveto 0 1 rlineto 1 0 rlineto 0 -1 rlineto closepath .02 setlinewidth stroke grestore } def\n" + "/dot1 { gsave translate unit .3 mul dup scale circ fill grestore } def\n" + "/times { /Times-Roman findfont unit .3 mul scalefont setfont } def\n" + "/times1 { /Times-Roman findfont unit 10 mul scalefont setfont 0 0 0 setrgbcolor } def\n" + "/times2 { /Times-Roman findfont unit 2 mul scalefont setfont 0 0 0 setrgbcolor } def\n"; + +/* ---------------------------------------------------------------------- */ +/* Backends for various types of output. */ + +/* Normal output: black on transparent */ +static int render0(potrace_path_t *plist) { + potrace_path_t *p; + + if (info.longcoding) { + eps_setcolor(info.color); + list_forall (p, plist) { + eps_path(p->priv->fcurve); + ship("closepath\n"); + if (p->next == NULL || p->next->sign == '+') { + ship("fill\n"); + } + } + } else { + list_forall (p, plist) { + eps_path(p->priv->fcurve); + if (p->next == NULL || p->next->sign == '+') { + ship("b\n"); + } else { + ship("z\n"); + } + } + } + return 0; +} + +/* Opaque output: alternating black and white */ +static int render0_opaque(potrace_path_t *plist) { + potrace_path_t *p; + + if (info.longcoding) { + list_forall (p, plist) { + eps_path(p->priv->fcurve); + ship("closepath\n"); + eps_setcolor(p->sign=='+' ? info.color : info.fillcolor); + ship("fill\n"); + } + } else { + list_forall (p, plist) { + eps_path(p->priv->fcurve); + ship(p->sign=='+' ? "b\n" : "w\n"); + } + } + return 0; +} + +/* Debug output type 1 (show optimal polygon) */ +static int render1(potrace_path_t *plist) { + potrace_path_t *p; + int i; + + eps_jaggy(plist); + + list_forall (p, plist) { + + point_t *pt = p->priv->pt; + int n = p->priv->len; + int m = p->priv->m; + int *po = p->priv->po; + + eps_linewidth(.02); + eps_setcolor(black); + /* output jaggie curve in boxed style */ + for (i=1; i<n; i++) { + eps_moveto(dpoint(pt[i-1])); + eps_lineto(dpoint(pt[i])); + ship("stroke\n"); + eps_coords(dpoint(pt[i])); + ship("sq1\n"); + } + eps_moveto(dpoint(pt[n-1])); + eps_lineto(dpoint(pt[0])); + ship("stroke\n"); + eps_coords(dpoint(pt[0])); + ship("sq1\n"); + + /* output the uncorrected polygon */ + eps_linewidth(.1); + eps_setcolor(blue); + eps_moveto(dpoint(pt[po[0]])); + for (i=1; i<m; i++) { + eps_lineto(dpoint(pt[po[i]])); + } + eps_lineto(dpoint(pt[po[0]])); + ship("stroke\n"); + for (i=0; i<m; i++) { + eps_coords(dpoint(pt[po[i]])); + ship("dot2\n"); + } + } + return 0; +} + +/* Debug output type 2 (show corrected polygon and edge detection) */ +static int render2(potrace_path_t *plist) { + potrace_path_t *p; + int i; + + /* output original bitmap in grey */ + eps_jaggy(plist); + + list_forall (p, plist) { + /* output polygon with corrected edges, lines L, and parameter alpha */ + eps_polygon(&p->priv->curve, black); + eps_L(&p->priv->curve, black); + + /* output the vertex unit squares */ + for (i=0; i<p->priv->curve.n; i++) { + eps_moveto(p->priv->curve.vertex[i]); + ship("usq\n"); + } + + /* output the path */ + eps_linewidth(.1); + eps_setcolor(blue); + eps_path(&p->priv->curve); + ship("closepath\n"); + ship("stroke\n"); + + if (info.param->opticurve && info.debug == 3) { + + /* output opticurve */ + eps_linewidth(.05); + eps_setcolor(red); + eps_path(&p->priv->ocurve); + ship("closepath\n"); + ship("stroke\n"); + + /* output dots */ + for (i=0; i<p->priv->ocurve.n; i++) { + eps_coords(p->priv->ocurve.c[i][2]); + ship("dot1\n"); + } + } + } + return 0; +} + +/* Free-style debug output */ +static int render_debug(potrace_path_t *plist) { + potrace_path_t *p; + int count; + int i; + + /* output original bitmap in grey */ + eps_jaggy(plist); + + count = -1; + list_forall (p, plist) { + count++; + + /* output path numbers */ + eps_moveto_offs(p->priv->curve.vertex[0], 0, 5); + ship("times1 (%d) show\n", count); + + /* output polygon with corrected edges, lines L, and parameter alpha */ + eps_polygon(&p->priv->curve, black); + eps_L(&p->priv->curve, black); + + /* output the vertex unit squares */ + for (i=0; i<p->priv->curve.n; i++) { + eps_moveto(p->priv->curve.vertex[i]); + ship("usq\n"); + } + + /* output the vertex numbers */ + for (i=0; i<p->priv->curve.n; i++) { + eps_moveto_offs(p->priv->curve.vertex[i], +1, +1); + ship("times2 (%d) show\n", i); + } + + /* output the path */ + eps_linewidth(.1); + eps_setcolor(blue); + eps_path(&p->priv->curve); + ship("closepath\n"); + ship("stroke\n"); + + if (info.param->opticurve) { + + /* output the opti-verteces polygon */ + eps_polygon(&p->priv->ocurve, green); + + /* output opticurve */ + eps_linewidth(.05); + eps_setcolor(red); + eps_path(&p->priv->ocurve); + ship("closepath\n"); + ship("stroke\n"); + + /* output dots */ + for (i=0; i<p->priv->ocurve.n; i++) { + eps_coords(p->priv->ocurve.c[i][2]); + ship("dot1\n"); + } + + /* output beta parameters */ + for (i=0; i<p->priv->ocurve.n; i++) { + eps_moveto_offs(p->priv->ocurve.c[i][2], +.4, -.4); + ship("times (%.2f) show\n", p->priv->ocurve.beta[i]); + } + } + } + return 0; +} + +/* select the appropriate rendering function from above */ +static int eps_render(potrace_path_t *plist) { + int r; + + switch (info.debug) { + case 0: + if (info.opaque) { + r = render0_opaque(plist); + } else { + r = render0(plist); + } + break; + case 1: + r = render1(plist); + break; + case 2: case 3: + r = render2(plist); + break; + default: + r = render_debug(plist); + break; + } + return r; +} + +/* ---------------------------------------------------------------------- */ +/* EPS header and footer */ + +static int eps_init(imginfo_t *imginfo) { + double origx = imginfo->trans.orig[0] + imginfo->lmar; + double origy = imginfo->trans.orig[1] + imginfo->bmar; + double scalex = imginfo->trans.scalex / info.unit; + double scaley = imginfo->trans.scaley / info.unit; + char *c0, *c1; + + shipcom("%%!PS-Adobe-3.0 EPSF-3.0\n"); + shipcom("%%%%Creator: "POTRACE" "VERSION", written by Peter Selinger 2001-2013\n"); + shipcom("%%%%LanguageLevel: %d\n", info.pslevel); + shipcom("%%%%BoundingBox: 0 0 %.0f %.0f\n", + ceil(imginfo->trans.bb[0]+imginfo->lmar+imginfo->rmar), + ceil(imginfo->trans.bb[1]+imginfo->tmar+imginfo->bmar)); + shipcom("%%%%HiResBoundingBox: 0 0 %f %f\n", + imginfo->trans.bb[0]+imginfo->lmar+imginfo->rmar, + imginfo->trans.bb[1]+imginfo->tmar+imginfo->bmar); + shipcom("%%%%Pages: 1\n"); + shipcom("%%%%EndComments\n"); + + shipcom("%%%%Page: 1 1\n"); + ship("save\n"); + if (!info.longcoding) { + c0 = strdup(eps_colorstring(info.color)); + c1 = strdup(eps_colorstring(info.fillcolor)); + if (!c0 || !c1) { + free(c0); + free(c1); + return 1; + } + ship(optimacros, c0, c1); + free(c0); + free(c1); + } + if (info.debug) { + ship(debugmacros, info.unit); + } + if (origx != 0 || origy != 0) { + ship("%f %f translate\n", origx, origy); + } + if (info.angle != 0) { + ship("%.2f rotate\n", info.angle); + } + ship("%f %f scale\n", scalex, scaley); + + return 0; +} + +static int eps_term(void) { + ship("restore\n"); + shipcom("%%%%EOF\n"); + return 0; +} + +/* public interface for EPS */ +int page_eps(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) { + int r; + + eps_callbacks(fout); + + eps_init(imginfo); + + r = eps_render(plist); + if (r) { + return r; + } + + eps_term(); + + return 0; +} + +/* ---------------------------------------------------------------------- */ +/* PostScript header and footer */ + +static int eps_pagenumber; + +int init_ps(FILE *fout) { + char *c0, *c1; + + /* set callback functions for shipping routines */ + eps_callbacks(fout); + + shipcom("%%!PS-Adobe-3.0\n"); + shipcom("%%%%Creator: "POTRACE" "VERSION", written by Peter Selinger 2001-2013\n"); + shipcom("%%%%LanguageLevel: %d\n", info.pslevel); + shipcom("%%%%BoundingBox: 0 0 %d %d\n", info.paperwidth, info.paperheight); + shipcom("%%%%Pages: (atend)\n"); + shipcom("%%%%EndComments\n"); + if (!info.longcoding || info.debug) { + shipcom("%%%%BeginSetup\n"); + if (!info.longcoding) { + c0 = strdup(eps_colorstring(info.color)); + c1 = strdup(eps_colorstring(info.fillcolor)); + if (!c0 || !c1) { + free(c0); + free(c1); + return 1; + } + ship(optimacros, c0, c1); + free(c0); + free(c1); + } + if (info.debug) { + ship(debugmacros, info.unit); + } + shipcom("%%%%EndSetup\n"); + } + eps_pagenumber = 0; + fflush(fout); + return 0; +} + +int term_ps(FILE *fout) { + eps_callbacks(fout); + + shipcom("%%%%Trailer\n"); + shipcom("%%%%Pages: %d\n", eps_pagenumber); + shipcom("%%%%EOF\n"); + fflush(fout); + + return 0; +} + +static void eps_pageinit_ps(imginfo_t *imginfo) { + double origx = imginfo->trans.orig[0] + imginfo->lmar; + double origy = imginfo->trans.orig[1] + imginfo->bmar; + double scalex = imginfo->trans.scalex / info.unit; + double scaley = imginfo->trans.scaley / info.unit; + + eps_pagenumber++; + eps_color = -1; + eps_width = -1; + + shipcom("%%%%Page: %d %d\n", eps_pagenumber, eps_pagenumber); + ship("save\n"); + if (origx != 0 || origy != 0) { + ship("%f %f translate\n", origx, origy); + } + if (info.angle != 0) { + ship("%.2f rotate\n", info.angle); + } + ship("%f %f scale\n", scalex, scaley); +} + +static void eps_pageterm_ps(void) { + ship("restore\n"); + ship("showpage\n"); +} + +int page_ps(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) { + int r; + + eps_callbacks(fout); + + eps_pageinit_ps(imginfo); + + r = eps_render(plist); + if (r) { + return r; + } + + eps_pageterm_ps(); + + shipcom(""); + + fflush(fout); + + return 0; +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_eps.h b/Build/source/libs/potrace/potrace-1.11/src/backend_eps.h new file mode 100644 index 00000000000..bbeb094c82c --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_eps.h @@ -0,0 +1,19 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef BACKEND_EPS_H +#define BACKEND_EPS_H + +#include "potracelib.h" +#include "main.h" + +int init_ps(FILE *fout); +int page_ps(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); +int term_ps(FILE *fout); + +int page_eps(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); + +#endif /* BACKEND_EPS_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_geojson.c b/Build/source/libs/potrace/potrace-1.11/src/backend_geojson.c new file mode 100644 index 00000000000..6bf32e21133 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_geojson.c @@ -0,0 +1,223 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* The GeoJSON backend of Potrace. */ +/* Written 2012 by Christoph Hormann <chris_hormann@gmx.de> */ + +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <math.h> + +#include "potracelib.h" +#include "curve.h" +#include "main.h" +#include "backend_geojson.h" +#include "lists.h" +#include "auxiliary.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* ---------------------------------------------------------------------- */ +/* auxiliary */ + +/* return a point on a 1-dimensional Bezier segment */ +static inline double bezier(double t, double x0, double x1, double x2, double x3) { + double s = 1-t; + return s*s*s*x0 + 3*(s*s*t)*x1 + 3*(t*t*s)*x2 + t*t*t*x3; +} + +static char *format = "%f"; + +/* Convert a floating-point number to a string, using a pre-determined + format. The format must be previously set with set_format(). + Returns one of a small number of statically allocated strings. */ +static char *round_to_unit(double x) { + static int n = 0; + static char buf[4][100]; + + n++; + if (n >= 4) { + n = 0; + } + sprintf(buf[n], format, x); + return buf[n]; +} + +/* Select a print format for floating point numbers, appropriate for + the given scaling and info.unit. Note: the format must be so that + the resulting number fits into a buffer of size 100. */ +static void set_format(trans_t tr) { + double s; + int d; + static char buf[10]; + + s = min(fabs(tr.scalex), fabs(tr.scaley)); + if (info.unit != 0.0 && s != 0.0) { + d = (int)ceil(log(info.unit/s) / log(10)); + } else { + d = 0; + } + if (d <= 0) { + format = "%.0f"; + } else if (d <= 20) { + sprintf(buf, "%%.%df", d); + format = buf; + } else { + format = "%e"; + } +} + +/* ---------------------------------------------------------------------- */ +/* path-drawing auxiliary functions */ + +static dpoint_t cur; + +static void geojson_moveto(FILE *fout, dpoint_t p, trans_t tr) { + dpoint_t q; + + q = trans(p, tr); + + fprintf(fout, "[%s, %s]", round_to_unit(q.x), round_to_unit(q.y)); + + cur = q; +} + +static void geojson_lineto(FILE *fout, dpoint_t p, trans_t tr) { + dpoint_t q; + + q = trans(p, tr); + + fprintf(fout, ", [%s, %s]", round_to_unit(q.x), round_to_unit(q.y)); + + cur = q; +} + +static void geojson_curveto(FILE *fout, dpoint_t p1, dpoint_t p2, dpoint_t p3, trans_t tr) { + dpoint_t q1; + dpoint_t q2; + dpoint_t q3; + double step, t; + int i; + double x, y; + + q1 = trans(p1, tr); + q2 = trans(p2, tr); + q3 = trans(p3, tr); + + step = 1.0 / 8.0; + + for (i=0, t=step; i<8; i++, t+=step) { + x = bezier(t, cur.x, q1.x, q2.x, q3.x); + y = bezier(t, cur.y, q1.y, q2.y, q3.y); + + fprintf(fout, ", [%s, %s]", round_to_unit(x), round_to_unit(y)); + } + + cur = q3; +} + +/* ---------------------------------------------------------------------- */ +/* functions for converting a path to an SVG path element */ + +static int geojson_path(FILE *fout, potrace_curve_t *curve, trans_t tr) { + int i; + dpoint_t *c; + int m = curve->n; + + fprintf(fout, " ["); + + c = curve->c[m-1]; + geojson_moveto(fout, c[2], tr); + + for (i=0; i<m; i++) { + c = curve->c[i]; + switch (curve->tag[i]) { + case POTRACE_CORNER: + geojson_lineto(fout, c[1], tr); + geojson_lineto(fout, c[2], tr); + break; + case POTRACE_CURVETO: + geojson_curveto(fout, c[0], c[1], c[2], tr); + break; + } + } + + fprintf(fout, " ]"); + + return 0; +} + + +static void write_polygons(FILE *fout, potrace_path_t *tree, trans_t tr, int first) { + potrace_path_t *p, *q; + + for (p=tree; p; p=p->sibling) { + + if (!first) fprintf(fout, ",\n"); + + fprintf(fout, "{ \"type\": \"Feature\",\n"); + fprintf(fout, " \"properties\": { },\n"); + fprintf(fout, " \"geometry\": {\n"); + fprintf(fout, " \"type\": \"Polygon\",\n"); + fprintf(fout, " \"coordinates\": [\n"); + + geojson_path(fout, &p->curve, tr); + + for (q=p->childlist; q; q=q->sibling) { + fprintf(fout, ",\n"); + geojson_path(fout, &q->curve, tr); + } + + fprintf(fout, " ]\n"); + fprintf(fout, " }\n"); + fprintf(fout, "}"); + + for (q=p->childlist; q; q=q->sibling) { + write_polygons(fout, q->childlist, tr, 0); + } + + first = 0; + } +} + +/* ---------------------------------------------------------------------- */ +/* Backend. */ + +/* public interface for GeoJSON */ +int page_geojson(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) { + + trans_t tr; + + /* set up the coordinate transform (rotation) */ + tr.bb[0] = imginfo->trans.bb[0]+imginfo->lmar+imginfo->rmar; + tr.bb[1] = imginfo->trans.bb[1]+imginfo->tmar+imginfo->bmar; + tr.orig[0] = imginfo->trans.orig[0]+imginfo->lmar; + tr.orig[1] = imginfo->trans.orig[1]+imginfo->bmar; + tr.x[0] = imginfo->trans.x[0]; + tr.x[1] = imginfo->trans.x[1]; + tr.y[0] = imginfo->trans.y[0]; + tr.y[1] = imginfo->trans.y[1]; + + /* set the print format for floating point numbers */ + set_format(imginfo->trans); + + /* header */ + fprintf(fout, "{\n"); + fprintf(fout, "\"type\": \"FeatureCollection\",\n"); + fprintf(fout, "\"features\": [\n"); + + write_polygons(fout, plist, tr, 1); + + /* write footer */ + fprintf(fout, "\n]\n"); + fprintf(fout, "}\n"); + + fflush(fout); + + return 0; +} + diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_geojson.h b/Build/source/libs/potrace/potrace-1.11/src/backend_geojson.h new file mode 100644 index 00000000000..6c0dfdce264 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_geojson.h @@ -0,0 +1,15 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef BACKEND_GEO_H +#define BACKEND_GEO_H + +#include "potracelib.h" +#include "main.h" + +int page_geojson(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); + +#endif /* BACKEND_GEO_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_pdf.c b/Build/source/libs/potrace/potrace-1.11/src/backend_pdf.c new file mode 100644 index 00000000000..71779a9cf60 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_pdf.c @@ -0,0 +1,419 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +/* The PDF backend of Potrace. Stream compression is optionally + supplied via the functions in flate.c. */ + +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <math.h> +#include <stdlib.h> + +#include "main.h" +#include "backend_pdf.h" +#include "flate.h" +#include "lists.h" +#include "potracelib.h" +#include "auxiliary.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +typedef int color_t; + +/* ---------------------------------------------------------------------- */ +/* auxiliary: growing arrays */ + +struct intarray_s { + int size; + int *data; +}; +typedef struct intarray_s intarray_t; + +static inline void intarray_init(intarray_t *ar) { + ar->size = 0; + ar->data = NULL; +} + +static inline void intarray_term(intarray_t *ar) { + free(ar->data); + ar->size = 0; + ar->data = NULL; +} + +/* Set ar[n]=val. Expects n>=0. Grows array if necessary. Return 0 on + success and -1 on error with errno set. */ +static inline int intarray_set(intarray_t *ar, int n, int val) { + int *p; + int s; + + if (n >= ar->size) { + s = n+1024; + p = (int *)realloc(ar->data, s * sizeof(int)); + if (!p) { + return -1; + } + ar->data = p; + ar->size = s; + } + ar->data[n] = val; + return 0; +} + +/* ---------------------------------------------------------------------- */ +/* some global variables */ + +static intarray_t xref; +static int nxref = 0; +static intarray_t pages; +static int npages; +static int streamofs; +static size_t outcount; /* output file position */ + +/* ---------------------------------------------------------------------- */ +/* functions for interfacing with compression backend */ + +/* xship: callback function that must be initialized before calling + any other functions of the "ship" family. xship_file must be + initialized too. */ + +/* print the token to f, but filtered through a compression + filter in case filter!=0 */ +static int (*xship)(FILE *f, int filter, char *s, int len); +static FILE *xship_file; + +/* ship PDF code, filtered */ +static int ship(const char *fmt, ...) { + va_list args; + static char buf[4096]; /* static string limit is okay here because + we only use constant format strings - for + the same reason, it is okay to use + vsprintf instead of vsnprintf below. */ + va_start(args, fmt); + vsprintf(buf, fmt, args); + buf[4095] = 0; + va_end(args); + + outcount += xship(xship_file, 1, buf, strlen(buf)); + return 0; +} + +/* ship PDF code, unfiltered */ +static int shipclear(char *fmt, ...) { + static char buf[4096]; + va_list args; + + va_start(args, fmt); + vsprintf(buf, fmt, args); + buf[4095] = 0; + va_end(args); + + outcount += xship(xship_file, 0, buf, strlen(buf)); + return 0; +} + +/* set all callback functions */ +static void pdf_callbacks(FILE *fout) { + + if (info.compress) { + xship = pdf_xship; + } else { + xship = dummy_xship; + } + xship_file = fout; +} + +/* ---------------------------------------------------------------------- */ +/* PDF path-drawing auxiliary functions */ + +/* coordinate quantization */ +static inline point_t unit(dpoint_t p) { + point_t q; + + q.x = (long)(floor(p.x*info.unit+.5)); + q.y = (long)(floor(p.y*info.unit+.5)); + return q; +} + +static void pdf_coords(dpoint_t p) { + point_t cur = unit(p); + ship("%ld %ld ", cur.x, cur.y); +} + +static void pdf_moveto(dpoint_t p) { + pdf_coords(p); + ship("m\n"); +} + +static void pdf_lineto(dpoint_t p) { + pdf_coords(p); + ship("l\n"); +} + +static void pdf_curveto(dpoint_t p1, dpoint_t p2, dpoint_t p3) { + point_t q1, q2, q3; + + q1 = unit(p1); + q2 = unit(p2); + q3 = unit(p3); + + ship("%ld %ld %ld %ld %ld %ld c\n", q1.x, q1.y, q2.x, q2.y, q3.x, q3.y); +} + +/* this procedure returns a statically allocated string */ +static char *pdf_colorstring(const color_t col) { + double r, g, b; + static char buf[100]; + + r = (col & 0xff0000) >> 16; + g = (col & 0x00ff00) >> 8; + b = (col & 0x0000ff) >> 0; + + if (r==0 && g==0 && b==0) { + return "0 g"; + } else if (r==255 && g==255 && b==255) { + return "1 g"; + } else if (r == g && g == b) { + sprintf(buf, "%.3f g", r/255.0); + return buf; + } else { + sprintf(buf, "%.3f %.3f %.3f rg", r/255.0, g/255.0, b/255.0); + return buf; + } +} + +static color_t pdf_color = -1; + +static void pdf_setcolor(const color_t col) { + if (col == pdf_color) { + return; + } + pdf_color = col; + + ship("%s\n", pdf_colorstring(col)); +} + +/* explicit encoding, does not use special macros */ +static int pdf_path(potrace_curve_t *curve) { + int i; + dpoint_t *c; + int m = curve->n; + + c = curve->c[m-1]; + pdf_moveto(c[2]); + + for (i=0; i<m; i++) { + c = curve->c[i]; + switch (curve->tag[i]) { + case POTRACE_CORNER: + pdf_lineto(c[1]); + pdf_lineto(c[2]); + break; + case POTRACE_CURVETO: + pdf_curveto(c[0], c[1], c[2]); + break; + } + } + return 0; +} + +/* ---------------------------------------------------------------------- */ +/* Backends for various types of output. */ + +/* Normal output: black on transparent */ +static int render0(potrace_path_t *plist) { + potrace_path_t *p; + + pdf_setcolor(info.color); + list_forall (p, plist) { + pdf_path(&p->curve); + ship("h\n"); + if (p->next == NULL || p->next->sign == '+') { + ship("f\n"); + } + } + return 0; +} + +/* Opaque output: alternating black and white */ +static int render0_opaque(potrace_path_t *plist) { + potrace_path_t *p; + + list_forall (p, plist) { + pdf_path(&p->curve); + ship("h\n"); + pdf_setcolor(p->sign=='+' ? info.color : info.fillcolor); + ship("f\n"); + } + return 0; +} + +/* select the appropriate rendering function from above */ +static int pdf_render(potrace_path_t *plist) +{ + if (info.opaque) { + return render0_opaque(plist); + } + return render0(plist); +} + +/* ---------------------------------------------------------------------- */ +/* PDF header and footer */ + +int init_pdf(FILE *fout) +{ + intarray_init(&xref); + intarray_init(&pages); + nxref = 0; + npages = 0; + + /* set callback functions for shipping routines */ + pdf_callbacks(fout); + outcount = 0; + + shipclear("%%PDF-1.3\n"); + + intarray_set(&xref, nxref++, outcount); + shipclear("1 0 obj\n<</Type/Catalog/Pages 3 0 R>>\nendobj\n"); + + intarray_set(&xref, nxref++, outcount); + shipclear("2 0 obj\n" + "<</Creator" + "("POTRACE" "VERSION", written by Peter Selinger 2001-2013)>>\n" + "endobj\n"); + + /* delay obj #3 (pages) until end */ + nxref++; + + fflush(fout); + return 0; +} + +int term_pdf(FILE *fout) +{ + int startxref; + int i; + + pdf_callbacks(fout); + + intarray_set(&xref, 2, outcount); + shipclear("3 0 obj\n" + "<</Type/Pages/Count %d/Kids[\n", npages); + for (i = 0; i < npages; i++) + shipclear("%d 0 R\n", pages.data[i]); + shipclear("]>>\nendobj\n"); + + startxref = outcount; + + shipclear("xref\n0 %d\n", nxref + 1); + shipclear("0000000000 65535 f \n"); + for (i = 0; i < nxref; i++) + shipclear("%0.10d 00000 n \n", xref.data[i]); + + shipclear("trailer\n<</Size %d/Root 1 0 R/Info 2 0 R>>\n", nxref + 1); + shipclear("startxref\n%d\n%%%%EOF\n", startxref); + + fflush(fout); + intarray_term(&xref); + intarray_term(&pages); + return 0; +} + +/* if largebbox is set, set bounding box to pagesize. */ +static void pdf_pageinit(imginfo_t *imginfo, int largebbox) +{ + double origx = imginfo->trans.orig[0] + imginfo->lmar; + double origy = imginfo->trans.orig[1] + imginfo->bmar; + double dxx = imginfo->trans.x[0] / info.unit; + double dxy = imginfo->trans.x[1] / info.unit; + double dyx = imginfo->trans.y[0] / info.unit; + double dyy = imginfo->trans.y[1] / info.unit; + + double pagew = imginfo->trans.bb[0]+imginfo->lmar+imginfo->rmar; + double pageh = imginfo->trans.bb[1]+imginfo->tmar+imginfo->bmar; + + pdf_color = -1; + + intarray_set(&xref, nxref++, outcount); + shipclear("%d 0 obj\n", nxref); + shipclear("<</Type/Page/Parent 3 0 R/Resources<</ProcSet[/PDF]>>"); + if (largebbox) { + shipclear("/MediaBox[0 0 %d %d]", info.paperwidth, info.paperheight); + } else { + shipclear("/MediaBox[0 0 %f %f]", pagew, pageh); + } + shipclear("/Contents %d 0 R>>\n", nxref + 1); + shipclear("endobj\n"); + + intarray_set(&pages, npages++, nxref); + + intarray_set(&xref, nxref++, outcount); + shipclear("%d 0 obj\n", nxref); + if (info.compress) + shipclear("<</Filter/FlateDecode/Length %d 0 R>>\n", nxref + 1); + else + shipclear("<</Length %d 0 R>>\n", nxref + 1); + shipclear("stream\n"); + + streamofs = outcount; + + ship("%f %f %f %f %f %f cm\n", dxx, dxy, dyx, dyy, origx, origy); +} + +static void pdf_pageterm(void) +{ + int streamlen; + + shipclear(""); + + streamlen = outcount - streamofs; + shipclear("endstream\nendobj\n"); + + intarray_set(&xref, nxref++, outcount); + shipclear("%d 0 obj\n%d\nendobj\n", nxref, streamlen); +} + +int page_pdf(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) +{ + int r; + + pdf_callbacks(fout); + + pdf_pageinit(imginfo, 0); + + r = pdf_render(plist); + if (r) { + return r; + } + + pdf_pageterm(); + + fflush(fout); + + return 0; +} + +int page_pdfpage(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) +{ + int r; + + pdf_callbacks(fout); + + pdf_pageinit(imginfo, 1); + + r = pdf_render(plist); + if (r) { + return r; + } + + pdf_pageterm(); + + fflush(fout); + + return 0; +} + diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_pdf.h b/Build/source/libs/potrace/potrace-1.11/src/backend_pdf.h new file mode 100644 index 00000000000..b0ac521fb6f --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_pdf.h @@ -0,0 +1,20 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef BACKEND_PDF_H +#define BACKEND_PDF_H + +#include "potracelib.h" +#include "main.h" + +int init_pdf(FILE *fout); +int page_pdf(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); +int term_pdf(FILE *fout); + +int page_pdf(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); +int page_pdfpage(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); + +#endif /* BACKEND_PDF_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_pgm.c b/Build/source/libs/potrace/potrace-1.11/src/backend_pgm.c new file mode 100644 index 00000000000..9773b3e9a45 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_pgm.c @@ -0,0 +1,106 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +/* The PGM backend of Potrace. Here we custom-render a set of Bezier + curves and output the result as a greymap. This is merely a + convenience, as the same could be achieved by piping the EPS output + through ghostscript. */ + +#include <math.h> + +#include "backend_pgm.h" +#include "potracelib.h" +#include "lists.h" +#include "greymap.h" +#include "render.h" +#include "main.h" +#include "auxiliary.h" +#include "trans.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +static void pgm_path(potrace_curve_t *curve, trans_t t, render_t *rm) { + dpoint_t *c, c1[3]; + int i; + int m = curve->n; + + c = curve->c[m-1]; + c1[2] = trans(c[2], t); + render_moveto(rm, c1[2].x, c1[2].y); + + for (i=0; i<m; i++) { + c = curve->c[i]; + switch (curve->tag[i]) { + case POTRACE_CORNER: + c1[1] = trans(c[1], t); + c1[2] = trans(c[2], t); + render_lineto(rm, c1[1].x, c1[1].y); + render_lineto(rm, c1[2].x, c1[2].y); + break; + case POTRACE_CURVETO: + c1[0] = trans(c[0], t); + c1[1] = trans(c[1], t); + c1[2] = trans(c[2], t); + render_curveto(rm, c1[0].x, c1[0].y, c1[1].x, c1[1].y, c1[2].x, c1[2].y); + break; + } + } +} + +int page_pgm(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) { + potrace_path_t *p; + greymap_t *gm; + render_t *rm; + int w, h; + trans_t t; + int mode; + char *comment = "created by "POTRACE" "VERSION", written by Peter Selinger 2001-2013"; + + t.bb[0] = imginfo->trans.bb[0]+imginfo->lmar+imginfo->rmar; + t.bb[1] = imginfo->trans.bb[1]+imginfo->tmar+imginfo->bmar; + t.orig[0] = imginfo->trans.orig[0]+imginfo->lmar; + t.orig[1] = imginfo->trans.orig[1]+imginfo->bmar; + t.x[0] = imginfo->trans.x[0]; + t.x[1] = imginfo->trans.x[1]; + t.y[0] = imginfo->trans.y[0]; + t.y[1] = imginfo->trans.y[1]; + + w = (int)ceil(t.bb[0]); + h = (int)ceil(t.bb[1]); + + gm = gm_new(w, h); + if (!gm) { + return 1; + } + rm = render_new(gm); + if (!rm) { + return 1; + } + + gm_clear(gm, 255); /* white */ + + list_forall(p, plist) { + pgm_path(&p->curve, t, rm); + } + + render_close(rm); + + /* if negative orientation, make sure to invert effect of rendering */ + mode = imginfo->width * imginfo->height < 0 ? GM_MODE_NEGATIVE : GM_MODE_POSITIVE; + + gm_writepgm(fout, rm->gm, comment, 1, mode, info.gamma); + + render_free(rm); + gm_free(gm); + + return 0; +} + diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_pgm.h b/Build/source/libs/potrace/potrace-1.11/src/backend_pgm.h new file mode 100644 index 00000000000..741925cbf10 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_pgm.h @@ -0,0 +1,16 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef BACKEND_PGM_H +#define BACKEND_PGM_H + +#include <stdio.h> + +#include "potracelib.h" +#include "main.h" + +int page_pgm(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); + +#endif /* BACKEND_PGM_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_svg.c b/Build/source/libs/potrace/potrace-1.11/src/backend_svg.c new file mode 100644 index 00000000000..d6d0aadebe9 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_svg.c @@ -0,0 +1,342 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +/* The SVG backend of Potrace. */ + +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <math.h> + +#include "potracelib.h" +#include "curve.h" +#include "main.h" +#include "backend_svg.h" +#include "lists.h" +#include "auxiliary.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* ---------------------------------------------------------------------- */ +/* path-drawing auxiliary functions */ + +/* coordinate quantization */ +static inline point_t unit(dpoint_t p) { + point_t q; + + q.x = (long)(floor(p.x*info.unit+.5)); + q.y = (long)(floor(p.y*info.unit+.5)); + return q; +} + +static point_t cur; +static char lastop = 0; +static int column = 0; +static int newline = 1; + +static void shiptoken(FILE *fout, char *token) { + int c = strlen(token); + if (!newline && column+c+1 > 75) { + fprintf(fout, "\n"); + column = 0; + newline = 1; + } else if (!newline) { + fprintf(fout, " "); + column++; + } + fprintf(fout, "%s", token); + column += c; + newline = 0; +} + +static void ship(FILE *fout, char *fmt, ...) { + va_list args; + static char buf[4096]; /* static string limit is okay here because + we only use constant format strings - for + the same reason, it is okay to use + vsprintf instead of vsnprintf below. */ + char *p, *q; + + va_start(args, fmt); + vsprintf(buf, fmt, args); + buf[4095] = 0; + va_end(args); + + p = buf; + while ((q = strchr(p, ' ')) != NULL) { + *q = 0; + shiptoken(fout, p); + p = q+1; + } + shiptoken(fout, p); +} + +static void svg_moveto(FILE *fout, dpoint_t p) { + cur = unit(p); + + ship(fout, "M%ld %ld", cur.x, cur.y); + lastop = 'M'; +} + +static void svg_rmoveto(FILE *fout, dpoint_t p) { + point_t q; + + q = unit(p); + ship(fout, "m%ld %ld", q.x-cur.x, q.y-cur.y); + cur = q; + lastop = 'm'; +} + +static void svg_lineto(FILE *fout, dpoint_t p) { + point_t q; + + q = unit(p); + + if (lastop != 'l') { + ship(fout, "l%ld %ld", q.x-cur.x, q.y-cur.y); + } else { + ship(fout, "%ld %ld", q.x-cur.x, q.y-cur.y); + } + cur = q; + lastop = 'l'; +} + +static void svg_curveto(FILE *fout, dpoint_t p1, dpoint_t p2, dpoint_t p3) { + point_t q1, q2, q3; + + q1 = unit(p1); + q2 = unit(p2); + q3 = unit(p3); + + if (lastop != 'c') { + ship(fout, "c%ld %ld %ld %ld %ld %ld", q1.x-cur.x, q1.y-cur.y, q2.x-cur.x, q2.y-cur.y, q3.x-cur.x, q3.y-cur.y); + } else { + ship(fout, "%ld %ld %ld %ld %ld %ld", q1.x-cur.x, q1.y-cur.y, q2.x-cur.x, q2.y-cur.y, q3.x-cur.x, q3.y-cur.y); + } + cur = q3; + lastop = 'c'; +} + +/* ---------------------------------------------------------------------- */ +/* functions for converting a path to an SVG path element */ + +/* Explicit encoding. If abs is set, move to first coordinate + absolutely. */ +static int svg_path(FILE *fout, potrace_curve_t *curve, int abs) { + int i; + dpoint_t *c; + int m = curve->n; + + c = curve->c[m-1]; + if (abs) { + svg_moveto(fout, c[2]); + } else { + svg_rmoveto(fout, c[2]); + } + + for (i=0; i<m; i++) { + c = curve->c[i]; + switch (curve->tag[i]) { + case POTRACE_CORNER: + svg_lineto(fout, c[1]); + svg_lineto(fout, c[2]); + break; + case POTRACE_CURVETO: + svg_curveto(fout, c[0], c[1], c[2]); + break; + } + } + newline = 1; + shiptoken(fout, "z"); + return 0; +} + +/* produce a jaggy path - for debugging. If abs is set, move to first + coordinate absolutely. If abs is not set, move to first coordinate + relatively, and traverse path in the opposite direction. */ +static int svg_jaggy_path(FILE *fout, point_t *pt, int n, int abs) { + int i; + point_t cur, prev; + + if (abs) { + cur = prev = pt[n-1]; + svg_moveto(fout, dpoint(cur)); + for (i=0; i<n; i++) { + if (pt[i].x != cur.x && pt[i].y != cur.y) { + cur = prev; + svg_lineto(fout, dpoint(cur)); + } + prev = pt[i]; + } + svg_lineto(fout, dpoint(pt[n-1])); + } else { + cur = prev = pt[0]; + svg_rmoveto(fout, dpoint(cur)); + for (i=n-1; i>=0; i--) { + if (pt[i].x != cur.x && pt[i].y != cur.y) { + cur = prev; + svg_lineto(fout, dpoint(cur)); + } + prev = pt[i]; + } + svg_lineto(fout, dpoint(pt[0])); + } + newline = 1; + shiptoken(fout, "z"); + return 0; +} + +static void write_paths_opaque(FILE *fout, potrace_path_t *tree) { + potrace_path_t *p, *q; + + for (p=tree; p; p=p->sibling) { + if (info.grouping == 2) { + fprintf(fout, "<g>\n"); + fprintf(fout, "<g>\n"); + } + column = fprintf(fout, "<path fill=\"#%06x\" stroke=\"none\" d=\"", info.color); + newline = 1; + lastop = 0; + if (info.debug == 1) { + svg_jaggy_path(fout, p->priv->pt, p->priv->len, 1); + } else { + svg_path(fout, &p->curve, 1); + } + fprintf(fout, "\"/>\n"); + for (q=p->childlist; q; q=q->sibling) { + column = fprintf(fout, "<path fill=\"#%06x\" stroke=\"none\" d=\"", info.fillcolor); + newline = 1; + lastop = 0; + if (info.debug == 1) { + svg_jaggy_path(fout, q->priv->pt, q->priv->len, 1); + } else { + svg_path(fout, &q->curve, 1); + } + fprintf(fout, "\"/>\n"); + } + if (info.grouping == 2) { + fprintf(fout, "</g>\n"); + } + for (q=p->childlist; q; q=q->sibling) { + write_paths_opaque(fout, q->childlist); + } + if (info.grouping == 2) { + fprintf(fout, "</g>\n"); + } + } +} + +static void write_paths_transparent_rec(FILE *fout, potrace_path_t *tree) { + potrace_path_t *p, *q; + + for (p=tree; p; p=p->sibling) { + if (info.grouping == 2) { + fprintf(fout, "<g>\n"); + } + if (info.grouping != 0) { + column = fprintf(fout, "<path d=\""); + newline = 1; + lastop = 0; + } + if (info.debug == 1) { + svg_jaggy_path(fout, p->priv->pt, p->priv->len, 1); + } else { + svg_path(fout, &p->curve, 1); + } + for (q=p->childlist; q; q=q->sibling) { + if (info.debug == 1) { + svg_jaggy_path(fout, q->priv->pt, q->priv->len, 0); + } else { + svg_path(fout, &q->curve, 0); + } + } + if (info.grouping != 0) { + fprintf(fout, "\"/>\n"); + } + for (q=p->childlist; q; q=q->sibling) { + write_paths_transparent_rec(fout, q->childlist); + } + if (info.grouping == 2) { + fprintf(fout, "</g>\n"); + } + } +} + +static void write_paths_transparent(FILE *fout, potrace_path_t *tree) { + if (info.grouping == 0) { + column = fprintf(fout, "<path d=\""); + newline = 1; + lastop = 0; + } + write_paths_transparent_rec(fout, tree); + if (info.grouping == 0) { + fprintf(fout, "\"/>\n"); + } +} + +/* ---------------------------------------------------------------------- */ +/* Backend. */ + +/* public interface for SVG */ +int page_svg(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) { + + double bboxx = imginfo->trans.bb[0]+imginfo->lmar+imginfo->rmar; + double bboxy = imginfo->trans.bb[1]+imginfo->tmar+imginfo->bmar; + double origx = imginfo->trans.orig[0] + imginfo->lmar; + double origy = bboxy - imginfo->trans.orig[1] - imginfo->bmar; + double scalex = imginfo->trans.scalex / info.unit; + double scaley = -imginfo->trans.scaley / info.unit; + + /* header */ + fprintf(fout, "<?xml version=\"1.0\" standalone=\"no\"?>\n"); + fprintf(fout, "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\"\n"); + fprintf(fout, " \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n"); + + /* set bounding box and namespace */ + fprintf(fout, "<svg version=\"1.0\" xmlns=\"http://www.w3.org/2000/svg\"\n"); + fprintf(fout, " width=\"%fpt\" height=\"%fpt\" viewBox=\"0 0 %f %f\"\n", + bboxx, bboxy, bboxx, bboxy); + fprintf(fout, " preserveAspectRatio=\"xMidYMid meet\">\n"); + + /* metadata: creator */ + fprintf(fout, "<metadata>\n"); + fprintf(fout, "Created by "POTRACE" "VERSION", written by Peter Selinger 2001-2013\n"); + fprintf(fout, "</metadata>\n"); + + /* use a "group" tag to establish coordinate system and style */ + fprintf(fout, "<g transform=\""); + if (origx != 0 || origy != 0) { + fprintf(fout, "translate(%f,%f) ", origx, origy); + } + if (info.angle != 0) { + fprintf(fout, "rotate(%.2f) ", -info.angle); + } + fprintf(fout, "scale(%f,%f)", scalex, scaley); + fprintf(fout, "\"\n"); + fprintf(fout, "fill=\"#%06x\" stroke=\"none\">\n", info.color); + + if (info.opaque) { + write_paths_opaque(fout, plist); + } else { + write_paths_transparent(fout, plist); + } + + /* write footer */ + fprintf(fout, "</g>\n"); + fprintf(fout, "</svg>\n"); + fflush(fout); + + return 0; +} + +/* the Gimppath backend is identical, except that it disables + --opaque, enables --flat, and the dimensions are pixel-based */ +int page_gimp(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) { + info.opaque = 0; + info.grouping = 0; + return page_svg(fout, plist, imginfo); +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_svg.h b/Build/source/libs/potrace/potrace-1.11/src/backend_svg.h new file mode 100644 index 00000000000..26a68ace664 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_svg.h @@ -0,0 +1,16 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef BACKEND_SVG_H +#define BACKEND_SVG_H + +#include "potracelib.h" +#include "main.h" + +int page_svg(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); +int page_gimp(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); + +#endif /* BACKEND_SVG_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_xfig.c b/Build/source/libs/potrace/potrace-1.11/src/backend_xfig.c new file mode 100644 index 00000000000..2d9c298143c --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_xfig.c @@ -0,0 +1,252 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +/* The xfig backend of Potrace. */ + +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <math.h> + +#include "main.h" +#include "backend_xfig.h" +#include "potracelib.h" +#include "lists.h" +#include "auxiliary.h" +#include "trans.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +struct pageformat_s { + char *name; + int w, h; +}; +typedef struct pageformat_s pageformat_t; + +/* page formats known by xfig, and their dimensions in postscript points */ +static pageformat_t pageformat[] = { + { "A9", 105, 149 }, + { "A8", 149, 211 }, + { "A7", 211, 298 }, + { "A6", 298, 421 }, + { "A5", 421, 595 }, + { "A4", 595, 842 }, + { "A3", 842, 1191 }, + { "A2", 1191, 1685 }, + { "A1", 1685, 2383 }, + { "A0", 2383, 3370 }, + + { "B10", 91, 129 }, + { "B9", 129, 182 }, + { "B8", 182, 258 }, + { "B7", 258, 365 }, + { "B6", 365, 516 }, + { "B5", 516, 730 }, + { "B4", 730, 1032 }, + { "B3", 1032, 1460 }, + { "B2", 1460, 2064 }, + { "B1", 2064, 2920 }, + { "B0", 2920, 4127 }, + + { "Letter", 612, 792 }, + { "Legal", 612, 1008 }, + { "Tabloid", 792, 1224 }, + { "A", 612, 792 }, + { "B", 792, 1224 }, + { "C", 1224, 1584 }, + { "D", 1584, 2448 }, + { "E", 2448, 3168 }, + + { NULL, 0, 0 }, +}; + +/* ---------------------------------------------------------------------- */ +/* path-drawing auxiliary functions */ + +/* coordinate quantization */ +static inline point_t unit(dpoint_t p) { + point_t q; + + q.x = (long)(floor(p.x+.5)); + q.y = (long)(floor(p.y+.5)); + return q; +} + +static void xfig_point(FILE *fout, dpoint_t p, trans_t t) { + point_t q; + + q = unit(trans(p, t)); + + fprintf(fout, "%ld %ld\n", q.x, q.y); +} + +/* ---------------------------------------------------------------------- */ +/* functions for converting a path to a xfig */ + +/* calculate number of xfig control points in this path */ +static int npoints(potrace_curve_t *curve, int m) { + int i; + int n=0; + + for (i=0; i<m; i++) { + switch (curve->tag[i]) { + case POTRACE_CORNER: + n += 1; + break; + case POTRACE_CURVETO: + n += 2; + break; + } + } + return n; +} + +/* do one path. */ +static void xfig_path(FILE *fout, potrace_curve_t *curve, trans_t t, int sign, int depth) { + int i; + dpoint_t *c; + int m = curve->n; + + fprintf(fout, "3 1 0 0 0 %d %d 0 20 0.000 0 0 0 %d\n", sign=='+' ? 32 : 33, depth, npoints(curve, m)); + + for (i=0; i<m; i++) { + c = curve->c[i]; + switch (curve->tag[i]) { + case POTRACE_CORNER: + xfig_point(fout, c[1], t); + break; + case POTRACE_CURVETO: + xfig_point(fout, c[0], t); + xfig_point(fout, c[1], t); + break; + } + } + for (i=0; i<m; i++) { + switch (curve->tag[i]) { + case POTRACE_CORNER: + fprintf(fout, "0\n"); + break; + case POTRACE_CURVETO: + fprintf(fout, "1 1\n"); + break; + } + } +} + +/* render a whole tree */ +static void xfig_write_paths(FILE *fout, potrace_path_t *plist, trans_t t, int depth) { + potrace_path_t *p, *q; + + for (p=plist; p; p=p->sibling) { + xfig_path(fout, &p->curve, t, p->sign, depth); + for (q=p->childlist; q; q=q->sibling) { + xfig_path(fout, &q->curve, t, q->sign, depth >= 1 ? depth-1 : 0); + } + for (q=p->childlist; q; q=q->sibling) { + xfig_write_paths(fout, q->childlist, t, depth >= 2 ? depth-2 : 0); + } + } +} + +/* calculate the depth of a tree. Call with d=0. */ +static int xfig_get_depth(potrace_path_t *plist) { + potrace_path_t *p; + int max =0; + int d; + + for (p=plist; p; p=p->sibling) { + d = xfig_get_depth(p->childlist); + if (d > max) { + max = d; + } + } + return max + 1; +} + +/* ---------------------------------------------------------------------- */ +/* Backend. */ + +/* public interface for XFIG */ +int page_xfig(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) { + trans_t t; + double origx = imginfo->trans.orig[0] + imginfo->lmar; + double origy = - imginfo->trans.orig[1] - imginfo->bmar + info.paperheight; + char *formatname; + int best, penalty; + pageformat_t *f; + int i; + int x0, y0, x1, y1; /* in xfig's coordinates */ + int depth; + + t.orig[0] = 1200/72.0 * origx; + t.orig[1] = 1200/72.0 * origy; + t.x[0] = 1200/72.0 * imginfo->trans.x[0]; + t.x[1] = -1200/72.0 * imginfo->trans.x[1]; + t.y[0] = 1200/72.0 * imginfo->trans.y[0]; + t.y[1] = -1200/72.0 * imginfo->trans.y[1]; + + x0 = (int)(1200/72.0 * (origx - imginfo->trans.orig[0])); + y0 = (int)(1200/72.0 * (origy + imginfo->trans.orig[1])); + x1 = x0 + (int)(1200/72.0 * imginfo->trans.bb[0]); + y1 = y0 - (int)(1200/72.0 * imginfo->trans.bb[1]); + + best = -1; + formatname = "Letter"; + + /* find closest page format */ + for (i=0; pageformat[i].name; i++) { + f = &pageformat[i]; + if (f->w >= info.paperwidth-1 && f->h >= info.paperheight-1) { + penalty = f->w + f->h; + if (best == -1 || penalty < best) { + best = penalty; + formatname = f->name; + } + } + } + + /* header */ + fprintf(fout, "#FIG 3.2\n"); + fprintf(fout, "#created by "POTRACE" "VERSION", written by Peter Selinger 2001-2013\n"); + fprintf(fout, "Portrait\n"); + fprintf(fout, "Center\n"); + fprintf(fout, "Inches\n"); + fprintf(fout, "%s\n", formatname); + fprintf(fout, "100.0\n"); + fprintf(fout, "Single\n"); + fprintf(fout, "-2\n"); + fprintf(fout, "1200 2\n"); /* 1200 pixels per inch */ + fprintf(fout, "0 32 #%06x\n", info.color); + fprintf(fout, "0 33 #%06x\n", info.fillcolor); + fprintf(fout, "6 %d %d %d %d\n", x0-75, y1-35, x1+75, y0+35); /* bounding box */ + + /* determine depth of the tree */ + depth = xfig_get_depth(plist); + + /* figure out appropriate xfig starting depth. Note: xfig only has 1000 depths available */ + if (depth <= 40) { + depth = 50; + } else if (depth < 990) { + depth += 10; + } else { + depth = 999; + } + + /* write paths. Note: can never use "opticurve" with this backend - + it just does not approximate Bezier curves closely enough. */ + xfig_write_paths(fout, plist, t, depth); + + fprintf(fout, "-6\n"); /* end bounding box */ + + fflush(fout); + + return 0; +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/backend_xfig.h b/Build/source/libs/potrace/potrace-1.11/src/backend_xfig.h new file mode 100644 index 00000000000..5d02438d91d --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/backend_xfig.h @@ -0,0 +1,15 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef BACKEND_XFIG_H +#define BACKEND_XFIG_H + +#include "potracelib.h" +#include "main.h" + +int page_xfig(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); + +#endif /* BACKEND_XFIG_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/bbox.c b/Build/source/libs/potrace/potrace-1.11/src/bbox.c new file mode 100644 index 00000000000..7290062bdd9 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/bbox.c @@ -0,0 +1,150 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* figure out the true bounding box of a vector image */ + +#include <math.h> +#include <stdlib.h> + +#include "bbox.h" +#include "potracelib.h" +#include "lists.h" + +/* ---------------------------------------------------------------------- */ +/* intervals */ + +/* initialize the interval to [min, max] */ +static void interval(interval_t *i, double min, double max) { + i->min = min; + i->max = max; +} + +/* initialize the interval to [x, x] */ +static inline void singleton(interval_t *i, double x) { + interval(i, x, x); +} + +/* extend the interval to include the number x */ +static inline void extend(interval_t *i, double x) { + if (x < i->min) { + i->min = x; + } else if (x > i->max) { + i->max = x; + } +} + +static inline int in_interval(interval_t *i, double x) { + return i->min <= x && x <= i->max; +} + +/* ---------------------------------------------------------------------- */ +/* inner product */ + +typedef potrace_dpoint_t dpoint_t; + +static double iprod(dpoint_t a, dpoint_t b) { + return a.x * b.x + a.y * b.y; +} + +/* ---------------------------------------------------------------------- */ +/* linear Bezier segments */ + +/* return a point on a 1-dimensional Bezier segment */ +static inline double bezier(double t, double x0, double x1, double x2, double x3) { + double s = 1-t; + return s*s*s*x0 + 3*(s*s*t)*x1 + 3*(t*t*s)*x2 + t*t*t*x3; +} + +/* Extend the interval i to include the minimum and maximum of a + 1-dimensional Bezier segment given by control points x0..x3. For + efficiency, x0 in i is assumed as a precondition. */ +static void bezier_limits(double x0, double x1, double x2, double x3, interval_t *i) { + double a, b, c, d, r; + double t, x; + + /* the min and max of a cubic curve segment are attained at one of + at most 4 critical points: the 2 endpoints and at most 2 local + extrema. We don't check the first endpoint, because all our + curves are cyclic so it's more efficient not to check endpoints + twice. */ + + /* endpoint */ + extend(i, x3); + + /* optimization: don't bother calculating extrema if all control + points are already in i */ + if (in_interval(i, x1) && in_interval(i, x2)) { + return; + } + + /* solve for extrema. at^2 + bt + c = 0 */ + a = -3*x0 + 9*x1 - 9*x2 + 3*x3; + b = 6*x0 - 12*x1 + 6*x2; + c = -3*x0 + 3*x1; + d = b*b - 4*a*c; + if (d > 0) { + r = sqrt(d); + t = (-b-r)/(2*a); + if (t > 0 && t < 1) { + x = bezier(t, x0, x1, x2, x3); + extend(i, x); + } + t = (-b+r)/(2*a); + if (t > 0 && t < 1) { + x = bezier(t, x0, x1, x2, x3); + extend(i, x); + } + } + return; +} + +/* ---------------------------------------------------------------------- */ +/* Potrace segments, curves, and pathlists */ + +/* extend the interval i to include the inner product <v | dir> for + all points v on the segment. Assume precondition a in i. */ +static inline void segment_limits(int tag, dpoint_t a, dpoint_t c[3], dpoint_t dir, interval_t *i) { + switch (tag) { + case POTRACE_CORNER: + extend(i, iprod(c[1], dir)); + extend(i, iprod(c[2], dir)); + break; + case POTRACE_CURVETO: + bezier_limits(iprod(a, dir), iprod(c[0], dir), iprod(c[1], dir), iprod(c[2], dir), i); + break; + } +} + +/* extend the interval i to include <v | dir> for all points v on the + curve. */ +static void curve_limits(potrace_curve_t *curve, dpoint_t dir, interval_t *i) { + int k; + int n = curve->n; + + segment_limits(curve->tag[0], curve->c[n-1][2], curve->c[0], dir, i); + for (k=1; k<n; k++) { + segment_limits(curve->tag[k], curve->c[k-1][2], curve->c[k], dir, i); + } +} + +/* compute the interval i to be the smallest interval including all <v + | dir> for points in the pathlist. If the pathlist is empty, return + the singleton interval [0,0]. */ +void path_limits(potrace_path_t *path, dpoint_t dir, interval_t *i) { + potrace_path_t *p; + + /* empty image? */ + if (path == NULL) { + interval(i, 0, 0); + return; + } + + /* initialize interval to a point on the first curve */ + singleton(i, iprod(path->curve.c[0][2], dir)); + + /* iterate */ + list_forall(p, path) { + curve_limits(&p->curve, dir, i); + } +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/bbox.h b/Build/source/libs/potrace/potrace-1.11/src/bbox.h new file mode 100644 index 00000000000..5ffcdf25f53 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/bbox.h @@ -0,0 +1,18 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +#ifndef BBOX_H +#define BBOX_H + +#include "potracelib.h" + +/* an interval [min, max] */ +struct interval_s { + double min, max; +}; +typedef struct interval_s interval_t; + +void path_limits(potrace_path_t *path, potrace_dpoint_t dir, interval_t *i); + +#endif /* BBOX_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/bitmap.h b/Build/source/libs/potrace/potrace-1.11/src/bitmap.h new file mode 100644 index 00000000000..1ce13d61e2d --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/bitmap.h @@ -0,0 +1,97 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +#ifndef BITMAP_H +#define BITMAP_H + +#include <string.h> +#include <stdlib.h> + +/* The bitmap type is defined in potracelib.h */ +#include "potracelib.h" + +/* The present file defines some convenient macros and static inline + functions for accessing bitmaps. Since they only produce inline + code, they can be conveniently shared by the library and frontends, + if desired */ + +/* ---------------------------------------------------------------------- */ +/* some measurements */ + +#define BM_WORDSIZE ((int)sizeof(potrace_word)) +#define BM_WORDBITS (8*BM_WORDSIZE) +#define BM_HIBIT (((potrace_word)1)<<(BM_WORDBITS-1)) +#define BM_ALLBITS (~(potrace_word)0) + +/* macros for accessing pixel at index (x,y). U* macros omit the + bounds check. */ + +#define bm_scanline(bm, y) ((bm)->map + (y)*(bm)->dy) +#define bm_index(bm, x, y) (&bm_scanline(bm, y)[(x)/BM_WORDBITS]) +#define bm_mask(x) (BM_HIBIT >> ((x) & (BM_WORDBITS-1))) +#define bm_range(x, a) ((int)(x) >= 0 && (int)(x) < (a)) +#define bm_safe(bm, x, y) (bm_range(x, (bm)->w) && bm_range(y, (bm)->h)) +#define BM_UGET(bm, x, y) ((*bm_index(bm, x, y) & bm_mask(x)) != 0) +#define BM_USET(bm, x, y) (*bm_index(bm, x, y) |= bm_mask(x)) +#define BM_UCLR(bm, x, y) (*bm_index(bm, x, y) &= ~bm_mask(x)) +#define BM_UINV(bm, x, y) (*bm_index(bm, x, y) ^= bm_mask(x)) +#define BM_UPUT(bm, x, y, b) ((b) ? BM_USET(bm, x, y) : BM_UCLR(bm, x, y)) +#define BM_GET(bm, x, y) (bm_safe(bm, x, y) ? BM_UGET(bm, x, y) : 0) +#define BM_SET(bm, x, y) (bm_safe(bm, x, y) ? BM_USET(bm, x, y) : 0) +#define BM_CLR(bm, x, y) (bm_safe(bm, x, y) ? BM_UCLR(bm, x, y) : 0) +#define BM_INV(bm, x, y) (bm_safe(bm, x, y) ? BM_UINV(bm, x, y) : 0) +#define BM_PUT(bm, x, y, b) (bm_safe(bm, x, y) ? BM_UPUT(bm, x, y, b) : 0) + +/* free the given bitmap. Leaves errno untouched. */ +static inline void bm_free(potrace_bitmap_t *bm) { + if (bm) { + free(bm->map); + } + free(bm); +} + +/* return new un-initialized bitmap. NULL with errno on error */ +static inline potrace_bitmap_t *bm_new(int w, int h) { + potrace_bitmap_t *bm; + int dy = (w + BM_WORDBITS - 1) / BM_WORDBITS; + + bm = (potrace_bitmap_t *) malloc(sizeof(potrace_bitmap_t)); + if (!bm) { + return NULL; + } + bm->w = w; + bm->h = h; + bm->dy = dy; + bm->map = (potrace_word *) malloc(dy * h * BM_WORDSIZE); + if (!bm->map) { + free(bm); + return NULL; + } + return bm; +} + +/* clear the given bitmap. Set all bits to c. */ +static inline void bm_clear(potrace_bitmap_t *bm, int c) { + memset(bm->map, c ? -1 : 0, bm->dy * bm->h * BM_WORDSIZE); +} + +/* duplicate the given bitmap. Return NULL on error with errno set. */ +static inline potrace_bitmap_t *bm_dup(const potrace_bitmap_t *bm) { + potrace_bitmap_t *bm1 = bm_new(bm->w, bm->h); + if (!bm1) { + return NULL; + } + memcpy(bm1->map, bm->map, bm->dy * bm->h * BM_WORDSIZE); + return bm1; +} + +/* invert the given bitmap. */ +static inline void bm_invert(potrace_bitmap_t *bm) { + int i; + for (i = 0; i < bm->dy * bm->h; i++) { + bm->map[i] ^= BM_ALLBITS; + } +} + +#endif /* BITMAP_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/bitmap_io.c b/Build/source/libs/potrace/potrace-1.11/src/bitmap_io.c new file mode 100644 index 00000000000..6cfecb19f03 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/bitmap_io.c @@ -0,0 +1,829 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +/* Routines for manipulating bitmaps, including reading pbm files. */ + +#include <stdio.h> + +#include "bitmap.h" +#include "bitops.h" + +#define INTBITS (8*sizeof(int)) + +static int bm_readbody_bmp(FILE *f, double threshold, potrace_bitmap_t **bmp); +static int bm_readbody_pnm(FILE *f, double threshold, potrace_bitmap_t **bmp, int magic); + +/* ---------------------------------------------------------------------- */ +/* routines for reading pnm streams */ + +/* read next character after whitespace and comments. Return EOF on + end of file or error. */ +static int fgetc_ws(FILE *f) { + int c; + + while (1) { + c = fgetc(f); + if (c=='#') { + while (1) { + c = fgetc(f); + if (c=='\n' || c==EOF) { + break; + } + } + } + /* space, tab, line feed, carriage return, form-feed */ + if (c!=' ' && c!='\t' && c!='\r' && c!='\n' && c!=12) { + return c; + } + } +} + +/* skip whitespace and comments, then read a non-negative decimal + number from a stream. Return -1 on EOF. Tolerate other errors (skip + bad characters). Do not the read any characters following the + number (put next character back into the stream) */ + +static int readnum(FILE *f) { + int c; + int acc; + + /* skip whitespace and comments */ + while (1) { + c = fgetc_ws(f); + if (c==EOF) { + return -1; + } + if (c>='0' && c<='9') { + break; + } + } + + /* first digit is already in c */ + acc = c-'0'; + while (1) { + c = fgetc(f); + if (c==EOF) { + break; + } + if (c<'0' || c>'9') { + ungetc(c, f); + break; + } + acc *= 10; + acc += c-'0'; + } + return acc; +} + +/* similar to readnum, but read only a single 0 or 1, and do not read + any characters after it. */ + +static int readbit(FILE *f) { + int c; + + /* skip whitespace and comments */ + while (1) { + c = fgetc_ws(f); + if (c==EOF) { + return -1; + } + if (c>='0' && c<='1') { + break; + } + } + + return c-'0'; +} + +/* ---------------------------------------------------------------------- */ + +/* read a PNM stream: P1-P6 format (see pnm(5)), or a BMP stream, and + convert the output to a bitmap. Return bitmap in *bmp. Return 0 on + success, -1 on error with errno set, -2 on bad file format (with + error message in bm_read_error), and 1 on premature end of file, -3 + on empty file (including files which contain only whitespace and + comments), -4 if wrong magic number. If the return value is >=0, + *bmp is valid. */ + +char *bm_read_error = NULL; + +int bm_read(FILE *f, double threshold, potrace_bitmap_t **bmp) { + int magic[2]; + + /* read magic number. We ignore whitespace and comments before the + magic, for the benefit of concatenated files in P1-P3 format. + Multiple P1-P3 images in a single file are not formally allowed + by the PNM standard, but there is no harm in being lenient. */ + + magic[0] = fgetc_ws(f); + if (magic[0] == EOF) { + return -3; + } + magic[1] = fgetc(f); + if (magic[0] == 'P' && magic[1] >= '1' && magic[1] <= '6') { + return bm_readbody_pnm(f, threshold, bmp, magic[1]); + } + if (magic[0] == 'B' && magic[1] == 'M') { + return bm_readbody_bmp(f, threshold, bmp); + } + return -4; +} + +/* ---------------------------------------------------------------------- */ +/* read PNM format */ + +/* read PNM stream after magic number. Return values as for bm_read */ +static int bm_readbody_pnm(FILE *f, double threshold, potrace_bitmap_t **bmp, int magic) { + potrace_bitmap_t *bm; + int x, y, i, b, b1, sum; + int bpr; /* bytes per row (as opposed to 4*bm->c) */ + int w, h, max; + + bm = NULL; + + w = readnum(f); + if (w<0) { + goto format_error; + } + + h = readnum(f); + if (h<0) { + goto format_error; + } + + /* allocate bitmap */ + bm = bm_new(w, h); + if (!bm) { + return -1; + } + + /* zero it out */ + bm_clear(bm, 0); + + switch (magic) { + default: + /* not reached */ + goto format_error; + + case '1': + /* read P1 format: PBM ascii */ + + for (y=h-1; y>=0; y--) { + for (x=0; x<w; x++) { + b = readbit(f); + if (b<0) { + goto eof; + } + BM_UPUT(bm, x, y, b); + } + } + break; + + case '2': + /* read P2 format: PGM ascii */ + + max = readnum(f); + if (max<1) { + goto format_error; + } + + for (y=h-1; y>=0; y--) { + for (x=0; x<w; x++) { + b = readnum(f); + if (b<0) { + goto eof; + } + BM_UPUT(bm, x, y, b > threshold * max ? 0 : 1); + } + } + break; + + case '3': + /* read P3 format: PPM ascii */ + + max = readnum(f); + if (max<1) { + goto format_error; + } + + for (y=h-1; y>=0; y--) { + for (x=0; x<w; x++) { + sum = 0; + for (i=0; i<3; i++) { + b = readnum(f); + if (b<0) { + goto eof; + } + sum += b; + } + BM_UPUT(bm, x, y, sum > 3 * threshold * max ? 0 : 1); + } + } + break; + + case '4': + /* read P4 format: PBM raw */ + + b = fgetc(f); /* read single white-space character after height */ + if (b==EOF) { + goto format_error; + } + + bpr = (w+7)/8; + + for (y=h-1; y>=0; y--) { + for (i=0; i<bpr; i++) { + b = fgetc(f); + if (b==EOF) { + goto eof; + } + *bm_index(bm, i*8, y) |= ((potrace_word)b) << (8*(BM_WORDSIZE-1-(i % BM_WORDSIZE))); + } + } + break; + + case '5': + /* read P5 format: PGM raw */ + + max = readnum(f); + if (max<1) { + goto format_error; + } + + b = fgetc(f); /* read single white-space character after max */ + if (b==EOF) { + goto format_error; + } + + for (y=h-1; y>=0; y--) { + for (x=0; x<w; x++) { + b = fgetc(f); + if (b==EOF) + goto eof; + if (max>=256) { + b <<= 8; + b1 = fgetc(f); + if (b1==EOF) + goto eof; + b |= b1; + } + BM_UPUT(bm, x, y, b > threshold * max ? 0 : 1); + } + } + break; + + case '6': + /* read P6 format: PPM raw */ + + max = readnum(f); + if (max<1) { + goto format_error; + } + + b = fgetc(f); /* read single white-space character after max */ + if (b==EOF) { + goto format_error; + } + + for (y=h-1; y>=0; y--) { + for (x=0; x<w; x++) { + sum = 0; + for (i=0; i<3; i++) { + b = fgetc(f); + if (b==EOF) { + goto eof; + } + if (max>=256) { + b <<= 8; + b1 = fgetc(f); + if (b1==EOF) + goto eof; + b |= b1; + } + sum += b; + } + BM_UPUT(bm, x, y, sum > 3 * threshold * max ? 0 : 1); + } + } + break; + } + + *bmp = bm; + return 0; + + eof: + *bmp = bm; + return 1; + + format_error: + bm_free(bm); + if (magic == '1' || magic == '4') { + bm_read_error = "invalid pbm file"; + } else if (magic == '2' || magic == '5') { + bm_read_error = "invalid pgm file"; + } else { + bm_read_error = "invalid ppm file"; + } + return -2; +} + +/* ---------------------------------------------------------------------- */ +/* read BMP format */ + +struct bmp_info_s { + unsigned int FileSize; + unsigned int reserved; + unsigned int DataOffset; + unsigned int InfoSize; + unsigned int w; /* width */ + unsigned int h; /* height */ + unsigned int Planes; + unsigned int bits; /* bits per sample */ + unsigned int comp; /* compression mode */ + unsigned int ImageSize; + unsigned int XpixelsPerM; + unsigned int YpixelsPerM; + unsigned int ncolors; /* number of colors in palette */ + unsigned int ColorsImportant; + unsigned int RedMask; + unsigned int GreenMask; + unsigned int BlueMask; + unsigned int AlphaMask; + unsigned int ctbits; /* sample size for color table */ + int topdown; /* top-down mode? */ +}; +typedef struct bmp_info_s bmp_info_t; + +/* auxiliary */ + +static int bmp_count = 0; /* counter for byte padding */ +static int bmp_pos = 0; /* counter from start of BMP data */ + +/* read n-byte little-endian integer. Return 1 on EOF or error, else + 0. Assume n<=4. */ +static int bmp_readint(FILE *f, int n, unsigned int *p) { + int i; + unsigned int sum = 0; + int b; + + for (i=0; i<n; i++) { + b = fgetc(f); + if (b==EOF) { + return 1; + } + sum += b << (8*i); + } + bmp_count += n; + bmp_pos += n; + *p = sum; + return 0; +} + +/* reset padding boundary */ +static void bmp_pad_reset(void) { + bmp_count = 0; +} + +/* read padding bytes to 4-byte boundary. Return 1 on EOF or error, + else 0. */ +static int bmp_pad(FILE *f) { + int c, i, b; + + c = (-bmp_count) & 3; + for (i=0; i<c; i++) { + b = fgetc(f); + if (b==EOF) { + return 1; + } + } + bmp_pos += c; + bmp_count = 0; + return 0; +} + +/* forward to the new file position. Return 1 on EOF or error, else 0 */ +static int bmp_forward(FILE *f, int pos) { + int b; + + while (bmp_pos < pos) { + b = fgetc(f); + if (b==EOF) { + return 1; + } + bmp_pos++; + bmp_count++; + } + return 0; +} + +#define TRY(x) if (x) goto try_error +#define TRY_EOF(x) if (x) goto eof + +/* correct y-coordinate for top-down format */ +#define ycorr(y) (bmpinfo.topdown ? bmpinfo.h-1-y : y) + +/* read BMP stream after magic number. Return values as for bm_read. + We choose to be as permissive as possible, since there are many + programs out there which produce BMP. For instance, ppmtobmp can + produce codings with anywhere from 1-8 or 24 bits per sample, + although most specifications only allow 1,4,8,24,32. We can also + read both the old and new OS/2 BMP formats in addition to the + Windows BMP format. */ +static int bm_readbody_bmp(FILE *f, double threshold, potrace_bitmap_t **bmp) { + bmp_info_t bmpinfo; + int *coltable; + unsigned int b, c; + unsigned int i; + potrace_bitmap_t *bm; + int mask; + unsigned int x, y; + int col[2]; + unsigned int bitbuf; + unsigned int n; + unsigned int redshift, greenshift, blueshift; + int col1[2]; + + bm_read_error = NULL; + bm = NULL; + coltable = NULL; + + bmp_pos = 2; /* set file position */ + + /* file header (minus magic number) */ + TRY(bmp_readint(f, 4, &bmpinfo.FileSize)); + TRY(bmp_readint(f, 4, &bmpinfo.reserved)); + TRY(bmp_readint(f, 4, &bmpinfo.DataOffset)); + + /* info header */ + TRY(bmp_readint(f, 4, &bmpinfo.InfoSize)); + if (bmpinfo.InfoSize == 40 || bmpinfo.InfoSize == 64 + || bmpinfo.InfoSize == 108 || bmpinfo.InfoSize == 124) { + /* Windows or new OS/2 format */ + bmpinfo.ctbits = 32; /* sample size in color table */ + TRY(bmp_readint(f, 4, &bmpinfo.w)); + TRY(bmp_readint(f, 4, &bmpinfo.h)); + TRY(bmp_readint(f, 2, &bmpinfo.Planes)); + TRY(bmp_readint(f, 2, &bmpinfo.bits)); + TRY(bmp_readint(f, 4, &bmpinfo.comp)); + TRY(bmp_readint(f, 4, &bmpinfo.ImageSize)); + TRY(bmp_readint(f, 4, &bmpinfo.XpixelsPerM)); + TRY(bmp_readint(f, 4, &bmpinfo.YpixelsPerM)); + TRY(bmp_readint(f, 4, &bmpinfo.ncolors)); + TRY(bmp_readint(f, 4, &bmpinfo.ColorsImportant)); + if (bmpinfo.InfoSize >= 108) { /* V4 and V5 bitmaps */ + TRY(bmp_readint(f, 4, &bmpinfo.RedMask)); + TRY(bmp_readint(f, 4, &bmpinfo.GreenMask)); + TRY(bmp_readint(f, 4, &bmpinfo.BlueMask)); + TRY(bmp_readint(f, 4, &bmpinfo.AlphaMask)); + } + if ((signed int)bmpinfo.h < 0) { + bmpinfo.h = -bmpinfo.h; + bmpinfo.topdown = 1; + } else { + bmpinfo.topdown = 0; + } + } else if (bmpinfo.InfoSize == 12) { + /* old OS/2 format */ + bmpinfo.ctbits = 24; /* sample size in color table */ + TRY(bmp_readint(f, 2, &bmpinfo.w)); + TRY(bmp_readint(f, 2, &bmpinfo.h)); + TRY(bmp_readint(f, 2, &bmpinfo.Planes)); + TRY(bmp_readint(f, 2, &bmpinfo.bits)); + bmpinfo.comp = 0; + bmpinfo.ncolors = 0; + bmpinfo.topdown = 0; + } else { + goto format_error; + } + + if (bmpinfo.comp == 3 && bmpinfo.InfoSize < 108) { + /* bitfield feature is only understood with V4 and V5 format */ + goto format_error; + } + + /* forward to color table (e.g., if bmpinfo.InfoSize == 64) */ + TRY(bmp_forward(f, 14+bmpinfo.InfoSize)); + + if (bmpinfo.Planes != 1) { + bm_read_error = "cannot handle bmp planes"; + goto format_error; /* can't handle planes */ + } + + if (bmpinfo.ncolors == 0) { + bmpinfo.ncolors = 1 << bmpinfo.bits; + } + + /* color table, present only if bmpinfo.bits <= 8. */ + if (bmpinfo.bits <= 8) { + coltable = (int *) malloc(bmpinfo.ncolors * sizeof(int)); + if (!coltable) { + goto std_error; + } + /* NOTE: since we are reading a bitmap, we can immediately convert + the color table entries to bits. */ + for (i=0; i<bmpinfo.ncolors; i++) { + TRY(bmp_readint(f, bmpinfo.ctbits/8, &c)); + c = ((c>>16) & 0xff) + ((c>>8) & 0xff) + (c & 0xff); + coltable[i] = (c > 3 * threshold * 255 ? 0 : 1); + if (i<2) { + col1[i] = c; + } + } + } + + /* forward to data */ + if (bmpinfo.InfoSize != 12) { /* not old OS/2 format */ + TRY(bmp_forward(f, bmpinfo.DataOffset)); + } + + /* allocate bitmap */ + bm = bm_new(bmpinfo.w, bmpinfo.h); + if (!bm) { + goto std_error; + } + + /* zero it out */ + bm_clear(bm, 0); + + switch (bmpinfo.bits + 0x100*bmpinfo.comp) { + + default: + goto format_error; + break; + + case 0x001: /* monochrome palette */ + if (col1[0] < col1[1]) { /* make the darker color black */ + mask = 0xff; + } else { + mask = 0; + } + + /* raster data */ + for (y=0; y<bmpinfo.h; y++) { + bmp_pad_reset(); + for (i=0; 8*i<bmpinfo.w; i++) { + TRY_EOF(bmp_readint(f, 1, &b)); + b ^= mask; + *bm_index(bm, i*8, ycorr(y)) |= ((potrace_word)b) << (8*(BM_WORDSIZE-1-(i % BM_WORDSIZE))); + } + TRY(bmp_pad(f)); + } + break; + + case 0x002: /* 2-bit to 8-bit palettes */ + case 0x003: + case 0x004: + case 0x005: + case 0x006: + case 0x007: + case 0x008: + for (y=0; y<bmpinfo.h; y++) { + bmp_pad_reset(); + bitbuf = 0; /* bit buffer: bits in buffer are high-aligned */ + n = 0; /* number of bits currently in bitbuffer */ + for (x=0; x<bmpinfo.w; x++) { + if (n < bmpinfo.bits) { + TRY_EOF(bmp_readint(f, 1, &b)); + bitbuf |= b << (INTBITS - 8 - n); + n += 8; + } + b = bitbuf >> (INTBITS - bmpinfo.bits); + bitbuf <<= bmpinfo.bits; + n -= bmpinfo.bits; + BM_UPUT(bm, x, ycorr(y), coltable[b]); + } + TRY(bmp_pad(f)); + } + break; + + case 0x010: /* 16-bit encoding */ + /* can't do this format because it is not well-documented and I + don't have any samples */ + bm_read_error = "cannot handle bmp 16-bit coding"; + goto format_error; + break; + + case 0x018: /* 24-bit encoding */ + case 0x020: /* 32-bit encoding */ + for (y=0; y<bmpinfo.h; y++) { + bmp_pad_reset(); + for (x=0; x<bmpinfo.w; x++) { + TRY_EOF(bmp_readint(f, bmpinfo.bits/8, &c)); + c = ((c>>16) & 0xff) + ((c>>8) & 0xff) + (c & 0xff); + BM_UPUT(bm, x, ycorr(y), c > 3 * threshold * 255 ? 0 : 1); + } + TRY(bmp_pad(f)); + } + break; + + case 0x320: /* 32-bit encoding with bitfields */ + redshift = lobit(bmpinfo.RedMask); + greenshift = lobit(bmpinfo.GreenMask); + blueshift = lobit(bmpinfo.BlueMask); + + for (y=0; y<bmpinfo.h; y++) { + bmp_pad_reset(); + for (x=0; x<bmpinfo.w; x++) { + TRY_EOF(bmp_readint(f, bmpinfo.bits/8, &c)); + c = ((c & bmpinfo.RedMask) >> redshift) + ((c & bmpinfo.GreenMask) >> greenshift) + ((c & bmpinfo.BlueMask) >> blueshift); + BM_UPUT(bm, x, ycorr(y), c > 3 * threshold * 255 ? 0 : 1); + } + TRY(bmp_pad(f)); + } + break; + + case 0x204: /* 4-bit runlength compressed encoding (RLE4) */ + x = 0; + y = 0; + while (1) { + TRY_EOF(bmp_readint(f, 1, &b)); /* opcode */ + TRY_EOF(bmp_readint(f, 1, &c)); /* argument */ + if (b>0) { + /* repeat count */ + col[0] = coltable[(c>>4) & 0xf]; + col[1] = coltable[c & 0xf]; + for (i=0; i<b && x<bmpinfo.w; i++) { + if (x>=bmpinfo.w) { + x=0; + y++; + } + if (y>=bmpinfo.h) { + break; + } + BM_UPUT(bm, x, ycorr(y), col[i&1]); + x++; + } + } else if (c == 0) { + /* end of line */ + y++; + x = 0; + } else if (c == 1) { + /* end of bitmap */ + break; + } else if (c == 2) { + /* "delta": skip pixels in x and y directions */ + TRY_EOF(bmp_readint(f, 1, &b)); /* x offset */ + TRY_EOF(bmp_readint(f, 1, &c)); /* y offset */ + x += b; + y += c; + } else { + /* verbatim segment */ + for (i=0; i<c; i++) { + if ((i&1)==0) { + TRY_EOF(bmp_readint(f, 1, &b)); + } + if (x>=bmpinfo.w) { + x=0; + y++; + } + if (y>=bmpinfo.h) { + break; + } + BM_PUT(bm, x, ycorr(y), coltable[(b>>(4-4*(i&1))) & 0xf]); + x++; + } + if ((c+1) & 2) { + /* pad to 16-bit boundary */ + TRY_EOF(bmp_readint(f, 1, &b)); + } + } + } + break; + + case 0x108: /* 8-bit runlength compressed encoding (RLE8) */ + x = 0; + y = 0; + while (1) { + TRY_EOF(bmp_readint(f, 1, &b)); /* opcode */ + TRY_EOF(bmp_readint(f, 1, &c)); /* argument */ + if (b>0) { + /* repeat count */ + for (i=0; i<b; i++) { + if (x>=bmpinfo.w) { + x=0; + y++; + } + if (y>=bmpinfo.h) { + break; + } + BM_UPUT(bm, x, ycorr(y), coltable[c]); + x++; + } + } else if (c == 0) { + /* end of line */ + y++; + x = 0; + } else if (c == 1) { + /* end of bitmap */ + break; + } else if (c == 2) { + /* "delta": skip pixels in x and y directions */ + TRY_EOF(bmp_readint(f, 1, &b)); /* x offset */ + TRY_EOF(bmp_readint(f, 1, &c)); /* y offset */ + x += b; + y += c; + } else { + /* verbatim segment */ + for (i=0; i<c; i++) { + TRY_EOF(bmp_readint(f, 1, &b)); + if (x>=bmpinfo.w) { + x=0; + y++; + } + if (y>=bmpinfo.h) { + break; + } + BM_PUT(bm, x, ycorr(y), coltable[b]); + x++; + } + if (c & 1) { + /* pad input to 16-bit boundary */ + TRY_EOF(bmp_readint(f, 1, &b)); + } + } + } + break; + + } /* switch */ + + /* skip any potential junk after the data section, but don't + complain in case EOF is encountered */ + bmp_forward(f, bmpinfo.FileSize); + + free(coltable); + *bmp = bm; + return 0; + + eof: + free(coltable); + *bmp = bm; + return 1; + + format_error: + try_error: + free(coltable); + free(bm); + if (!bm_read_error) { + bm_read_error = "invalid bmp file"; + } + return -2; + + std_error: + free(coltable); + free(bm); + return -1; +} + +/* ---------------------------------------------------------------------- */ +/* output pbm format */ + +void bm_writepbm(FILE *f, potrace_bitmap_t *bm) { + int w, h, bpr, y, i, c; + + w = bm->w; + h = bm->h; + + bpr = (w+7)/8; + + fprintf(f, "P4\n%d %d\n", w, h); + for (y=h-1; y>=0; y--) { + for (i=0; i<bpr; i++) { + c = (*bm_index(bm, i*8, y) >> (8*(BM_WORDSIZE-1-(i % BM_WORDSIZE)))) & 0xff; + fputc(c, f); + } + } + return; +} + +/* ---------------------------------------------------------------------- */ +/* output - for primitive debugging purposes only! */ + +/* print bitmap to screen */ +int bm_print(FILE *f, potrace_bitmap_t *bm) { + int x, y; + int xx, yy; + int d; + int sw, sh; + + sw = bm->w < 79 ? bm->w : 79; + sh = bm->w < 79 ? bm->h : bm->h*sw*44/(79*bm->w); + + for (yy=sh-1; yy>=0; yy--) { + for (xx=0; xx<sw; xx++) { + d=0; + for (x=xx*bm->w/sw; x<(xx+1)*bm->w/sw; x++) { + for (y=yy*bm->h/sh; y<(yy+1)*bm->h/sh; y++) { + if (BM_GET(bm, x, y)) { + d++; + } + } + } + fputc(d ? '*' : ' ', f); + } + fputc('\n', f); + } + return 0; +} + diff --git a/Build/source/libs/potrace/potrace-1.11/src/bitmap_io.h b/Build/source/libs/potrace/potrace-1.11/src/bitmap_io.h new file mode 100644 index 00000000000..7f319e51f2b --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/bitmap_io.h @@ -0,0 +1,23 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* bitmap input/output functions */ + +#ifndef BITMAP_IO_H +#define BITMAP_IO_H + +#include <stdio.h> +#include "bitmap.h" + +/* Note that bitmaps are stored bottom to top, i.e., the first + scanline is the bottom-most one */ + +extern char *bm_read_error; + +int bm_read(FILE *f, double blacklevel, potrace_bitmap_t **bmp); +void bm_writepbm(FILE *f, potrace_bitmap_t *bm); +int bm_print(FILE *f, potrace_bitmap_t *bm); + +#endif /* BITMAP_IO_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/bitops.h b/Build/source/libs/potrace/potrace-1.11/src/bitops.h new file mode 100644 index 00000000000..8d085c59c99 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/bitops.h @@ -0,0 +1,83 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +/* bits.h: this file defines some macros for bit manipulations. We + provide a generic implementation, as well as machine- and + compiler-specific fast implementations */ + +/* lobit: return the position of the rightmost "1" bit of an int, or + 32 if none. hibit: return 1 + the position of the leftmost "1" bit + of an int, or 0 if none. Note: these functions work on 32-bit + integers. */ + +#ifndef BITOPS_H +#define BITOPS_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* ---------------------------------------------------------------------- */ +/* machine specific macros */ + +#if defined(HAVE_I386) + +static inline unsigned int lobit(unsigned int x) { + unsigned int res; + asm ("bsf %1,%0\n\t" + "jnz 0f\n\t" + "movl $32,%0\n" + "0:" + : "=r" (res) + : "r" (x) + : "cc"); + return res; +} + +static inline unsigned int hibit(unsigned int x) { + unsigned int res; + + asm ("bsr %1,%0\n\t" + "jnz 0f\n\t" + "movl $-1,%0\n" + "0:" + : "=r" (res) + : "r" (x) + : "cc"); + return res+1; +} + +/* ---------------------------------------------------------------------- */ +#else /* generic macros */ + +static inline unsigned int lobit(unsigned int x) { + unsigned int res = 32; + while (x & 0xffffff) { + x <<= 8; + res -= 8; + } + while (x) { + x <<= 1; + res -= 1; + } + return res; +} + +static inline unsigned int hibit(unsigned int x) { + unsigned int res = 0; + while (x > 0xff) { + x >>= 8; + res += 8; + } + while (x) { + x >>= 1; + res += 1; + } + return res; +} + +#endif + +#endif /* BITOPS_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/curve.c b/Build/source/libs/potrace/potrace-1.11/src/curve.c new file mode 100644 index 00000000000..24517c49788 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/curve.c @@ -0,0 +1,108 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* private part of the path and curve data structures */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "potracelib.h" +#include "lists.h" +#include "curve.h" + +#define SAFE_MALLOC(var, n, typ) \ + if ((var = (typ *)malloc((n)*sizeof(typ))) == NULL) goto malloc_error + +/* ---------------------------------------------------------------------- */ +/* allocate and free path objects */ + +path_t *path_new(void) { + path_t *p = NULL; + privpath_t *priv = NULL; + + SAFE_MALLOC(p, 1, path_t); + memset(p, 0, sizeof(path_t)); + SAFE_MALLOC(priv, 1, privpath_t); + memset(priv, 0, sizeof(privpath_t)); + p->priv = priv; + return p; + + malloc_error: + free(p); + free(priv); + return NULL; +} + +/* free the members of the given curve structure. Leave errno unchanged. */ +static void privcurve_free_members(privcurve_t *curve) { + free(curve->tag); + free(curve->c); + free(curve->vertex); + free(curve->alpha); + free(curve->alpha0); + free(curve->beta); +} + +/* free a path. Leave errno untouched. */ +void path_free(path_t *p) { + if (p) { + if (p->priv) { + free(p->priv->pt); + free(p->priv->lon); + free(p->priv->sums); + free(p->priv->po); + privcurve_free_members(&p->priv->curve); + privcurve_free_members(&p->priv->ocurve); + } + free(p->priv); + /* do not free p->fcurve ! */ + } + free(p); +} + +/* free a pathlist, leaving errno untouched. */ +void pathlist_free(path_t *plist) { + path_t *p; + + list_forall_unlink(p, plist) { + path_free(p); + } +} + +/* ---------------------------------------------------------------------- */ +/* initialize and finalize curve structures */ + +typedef dpoint_t dpoint3_t[3]; + +/* initialize the members of the given curve structure to size m. + Return 0 on success, 1 on error with errno set. */ +int privcurve_init(privcurve_t *curve, int n) { + memset(curve, 0, sizeof(privcurve_t)); + curve->n = n; + SAFE_MALLOC(curve->tag, n, int); + SAFE_MALLOC(curve->c, n, dpoint3_t); + SAFE_MALLOC(curve->vertex, n, dpoint_t); + SAFE_MALLOC(curve->alpha, n, double); + SAFE_MALLOC(curve->alpha0, n, double); + SAFE_MALLOC(curve->beta, n, double); + return 0; + + malloc_error: + free(curve->tag); + free(curve->c); + free(curve->vertex); + free(curve->alpha); + free(curve->alpha0); + free(curve->beta); + return 1; +} + +/* copy private to public curve structure */ +void privcurve_to_curve(privcurve_t *pc, potrace_curve_t *c) { + c->n = pc->n; + c->tag = pc->tag; + c->c = pc->c; +} + diff --git a/Build/source/libs/potrace/potrace-1.11/src/curve.h b/Build/source/libs/potrace/potrace-1.11/src/curve.h new file mode 100644 index 00000000000..c375c1c3ac2 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/curve.h @@ -0,0 +1,77 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +#ifndef CURVE_H +#define CURVE_H + +#include "auxiliary.h" + +/* vertex is c[1] for tag=POTRACE_CORNER, and the intersection of + .c[-1][2]..c[0] and c[1]..c[2] for tag=POTRACE_CURVETO. alpha is only + defined for tag=POTRACE_CURVETO and is the alpha parameter of the curve: + .c[-1][2]..c[0] = alpha*(.c[-1][2]..vertex), and + c[2]..c[1] = alpha*(c[2]..vertex). + Beta is so that (.beta[i])[.vertex[i],.vertex[i+1]] = .c[i][2]. +*/ + +struct privcurve_s { + int n; /* number of segments */ + int *tag; /* tag[n]: POTRACE_CORNER or POTRACE_CURVETO */ + dpoint_t (*c)[3]; /* c[n][i]: control points. + c[n][0] is unused for tag[n]=POTRACE_CORNER */ + /* the remainder of this structure is special to privcurve, and is + used in EPS debug output and special EPS "short coding". These + fields are valid only if "alphacurve" is set. */ + int alphacurve; /* have the following fields been initialized? */ + dpoint_t *vertex; /* for POTRACE_CORNER, this equals c[1] */ + double *alpha; /* only for POTRACE_CURVETO */ + double *alpha0; /* "uncropped" alpha parameter - for debug output only */ + double *beta; +}; +typedef struct privcurve_s privcurve_t; + +struct sums_s { + double x; + double y; + double x2; + double xy; + double y2; +}; +typedef struct sums_s sums_t; + +/* the path structure is filled in with information about a given path + as it is accumulated and passed through the different stages of the + Potrace algorithm. Backends only need to read the fcurve and fm + fields of this data structure, but debugging backends may read + other fields. */ +struct potrace_privpath_s { + int len; + point_t *pt; /* pt[len]: path as extracted from bitmap */ + int *lon; /* lon[len]: (i,lon[i]) = longest straight line from i */ + + int x0, y0; /* origin for sums */ + sums_t *sums; /* sums[len+1]: cache for fast summing */ + + int m; /* length of optimal polygon */ + int *po; /* po[m]: optimal polygon */ + + privcurve_t curve; /* curve[m]: array of curve elements */ + privcurve_t ocurve; /* ocurve[om]: array of curve elements */ + privcurve_t *fcurve; /* final curve: this points to either curve or + ocurve. Do not free this separately. */ +}; +typedef struct potrace_privpath_s potrace_privpath_t; + +/* shorter names */ +typedef potrace_privpath_t privpath_t; +typedef potrace_path_t path_t; + +path_t *path_new(void); +void path_free(path_t *p); +void pathlist_free(path_t *plist); +int privcurve_init(privcurve_t *curve, int n); +void privcurve_to_curve(privcurve_t *pc, potrace_curve_t *c); + +#endif /* CURVE_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/decompose.c b/Build/source/libs/potrace/potrace-1.11/src/decompose.c new file mode 100644 index 00000000000..6c8c9bf55be --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/decompose.c @@ -0,0 +1,514 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <limits.h> + +#include "potracelib.h" +#include "curve.h" +#include "lists.h" +#include "bitmap.h" +#include "decompose.h" +#include "progress.h" + +/* ---------------------------------------------------------------------- */ +/* deterministically and efficiently hash (x,y) into a pseudo-random bit */ + +static inline int detrand(int x, int y) { + unsigned int z; + static const unsigned char t[256] = { + /* non-linear sequence: constant term of inverse in GF(8), + mod x^8+x^4+x^3+x+1 */ + 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, + 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, + 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, + 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, + 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + }; + + /* 0x04b3e375 and 0x05a8ef93 are chosen to contain every possible + 5-bit sequence */ + z = ((0x04b3e375 * x) ^ y) * 0x05a8ef93; + z = t[z & 0xff] ^ t[(z>>8) & 0xff] ^ t[(z>>16) & 0xff] ^ t[(z>>24) & 0xff]; + return z; +} + +/* ---------------------------------------------------------------------- */ +/* auxiliary bitmap manipulations */ + +/* set the excess padding to 0 */ +static void bm_clearexcess(potrace_bitmap_t *bm) { + potrace_word mask; + int y; + + if (bm->w % BM_WORDBITS != 0) { + mask = BM_ALLBITS << (BM_WORDBITS - (bm->w % BM_WORDBITS)); + for (y=0; y<bm->h; y++) { + *bm_index(bm, bm->w, y) &= mask; + } + } +} + +struct bbox_s { + int x0, x1, y0, y1; /* bounding box */ +}; +typedef struct bbox_s bbox_t; + +/* clear the bm, assuming the bounding box is set correctly (faster + than clearing the whole bitmap) */ +static void clear_bm_with_bbox(potrace_bitmap_t *bm, bbox_t *bbox) { + int imin = (bbox->x0 / BM_WORDBITS); + int imax = ((bbox->x1 + BM_WORDBITS-1) / BM_WORDBITS); + int i, y; + + for (y=bbox->y0; y<bbox->y1; y++) { + for (i=imin; i<imax; i++) { + bm_scanline(bm, y)[i] = 0; + } + } +} + +/* ---------------------------------------------------------------------- */ +/* auxiliary functions */ + +/* return the "majority" value of bitmap bm at intersection (x,y). We + assume that the bitmap is balanced at "radius" 1. */ +static int majority(potrace_bitmap_t *bm, int x, int y) { + int i, a, ct; + + for (i=2; i<5; i++) { /* check at "radius" i */ + ct = 0; + for (a=-i+1; a<=i-1; a++) { + ct += BM_GET(bm, x+a, y+i-1) ? 1 : -1; + ct += BM_GET(bm, x+i-1, y+a-1) ? 1 : -1; + ct += BM_GET(bm, x+a-1, y-i) ? 1 : -1; + ct += BM_GET(bm, x-i, y+a) ? 1 : -1; + } + if (ct>0) { + return 1; + } else if (ct<0) { + return 0; + } + } + return 0; +} + +/* ---------------------------------------------------------------------- */ +/* decompose image into paths */ + +/* efficiently invert bits [x,infty) and [xa,infty) in line y. Here xa + must be a multiple of BM_WORDBITS. */ +static void xor_to_ref(potrace_bitmap_t *bm, int x, int y, int xa) { + int xhi = x & -BM_WORDBITS; + int xlo = x & (BM_WORDBITS-1); /* = x % BM_WORDBITS */ + int i; + + if (xhi<xa) { + for (i = xhi; i < xa; i+=BM_WORDBITS) { + *bm_index(bm, i, y) ^= BM_ALLBITS; + } + } else { + for (i = xa; i < xhi; i+=BM_WORDBITS) { + *bm_index(bm, i, y) ^= BM_ALLBITS; + } + } + /* note: the following "if" is needed because x86 treats a<<b as + a<<(b&31). I spent hours looking for this bug. */ + if (xlo) { + *bm_index(bm, xhi, y) ^= (BM_ALLBITS << (BM_WORDBITS - xlo)); + } +} + +/* a path is represented as an array of points, which are thought to + lie on the corners of pixels (not on their centers). The path point + (x,y) is the lower left corner of the pixel (x,y). Paths are + represented by the len/pt components of a path_t object (which + also stores other information about the path) */ + +/* xor the given pixmap with the interior of the given path. Note: the + path must be within the dimensions of the pixmap. */ +static void xor_path(potrace_bitmap_t *bm, path_t *p) { + int xa, x, y, k, y1; + + if (p->priv->len <= 0) { /* a path of length 0 is silly, but legal */ + return; + } + + y1 = p->priv->pt[p->priv->len-1].y; + + xa = p->priv->pt[0].x & -BM_WORDBITS; + for (k=0; k<p->priv->len; k++) { + x = p->priv->pt[k].x; + y = p->priv->pt[k].y; + + if (y != y1) { + /* efficiently invert the rectangle [x,xa] x [y,y1] */ + xor_to_ref(bm, x, min(y,y1), xa); + y1 = y; + } + } +} + +/* Find the bounding box of a given path. Path is assumed to be of + non-zero length. */ +static void setbbox_path(bbox_t *bbox, path_t *p) { + int x, y; + int k; + + bbox->y0 = INT_MAX; + bbox->y1 = 0; + bbox->x0 = INT_MAX; + bbox->x1 = 0; + + for (k=0; k<p->priv->len; k++) { + x = p->priv->pt[k].x; + y = p->priv->pt[k].y; + + if (x < bbox->x0) { + bbox->x0 = x; + } + if (x > bbox->x1) { + bbox->x1 = x; + } + if (y < bbox->y0) { + bbox->y0 = y; + } + if (y > bbox->y1) { + bbox->y1 = y; + } + } +} + +/* compute a path in the given pixmap, separating black from white. + Start path at the point (x0,x1), which must be an upper left corner + of the path. Also compute the area enclosed by the path. Return a + new path_t object, or NULL on error (note that a legitimate path + cannot have length 0). Sign is required for correct interpretation + of turnpolicies. */ +static path_t *findpath(potrace_bitmap_t *bm, int x0, int y0, int sign, int turnpolicy) { + int x, y, dirx, diry, len, size, area; + int c, d, tmp; + point_t *pt, *pt1; + path_t *p = NULL; + + x = x0; + y = y0; + dirx = 0; + diry = -1; + + len = size = 0; + pt = NULL; + area = 0; + + while (1) { + /* add point to path */ + if (len>=size) { + size += 100; + size = (int)(1.3 * size); + pt1 = (point_t *)realloc(pt, size * sizeof(point_t)); + if (!pt1) { + goto error; + } + pt = pt1; + } + pt[len].x = x; + pt[len].y = y; + len++; + + /* move to next point */ + x += dirx; + y += diry; + area += x*diry; + + /* path complete? */ + if (x==x0 && y==y0) { + break; + } + + /* determine next direction */ + c = BM_GET(bm, x + (dirx+diry-1)/2, y + (diry-dirx-1)/2); + d = BM_GET(bm, x + (dirx-diry-1)/2, y + (diry+dirx-1)/2); + + if (c && !d) { /* ambiguous turn */ + if (turnpolicy == POTRACE_TURNPOLICY_RIGHT + || (turnpolicy == POTRACE_TURNPOLICY_BLACK && sign == '+') + || (turnpolicy == POTRACE_TURNPOLICY_WHITE && sign == '-') + || (turnpolicy == POTRACE_TURNPOLICY_RANDOM && detrand(x,y)) + || (turnpolicy == POTRACE_TURNPOLICY_MAJORITY && majority(bm, x, y)) + || (turnpolicy == POTRACE_TURNPOLICY_MINORITY && !majority(bm, x, y))) { + tmp = dirx; /* right turn */ + dirx = diry; + diry = -tmp; + } else { + tmp = dirx; /* left turn */ + dirx = -diry; + diry = tmp; + } + } else if (c) { /* right turn */ + tmp = dirx; + dirx = diry; + diry = -tmp; + } else if (!d) { /* left turn */ + tmp = dirx; + dirx = -diry; + diry = tmp; + } + } /* while this path */ + + /* allocate new path object */ + p = path_new(); + if (!p) { + goto error; + } + + p->priv->pt = pt; + p->priv->len = len; + p->area = area; + p->sign = sign; + + return p; + + error: + free(pt); + return NULL; +} + +/* Give a tree structure to the given path list, based on "insideness" + testing. I.e., path A is considered "below" path B if it is inside + path B. The input pathlist is assumed to be ordered so that "outer" + paths occur before "inner" paths. The tree structure is stored in + the "childlist" and "sibling" components of the path_t + structure. The linked list structure is also changed so that + negative path components are listed immediately after their + positive parent. Note: some backends may ignore the tree + structure, others may use it e.g. to group path components. We + assume that in the input, point 0 of each path is an "upper left" + corner of the path, as returned by bm_to_pathlist. This makes it + easy to find an "interior" point. The bm argument should be a + bitmap of the correct size (large enough to hold all the paths), + and will be used as scratch space. Return 0 on success or -1 on + error with errno set. */ + +static void pathlist_to_tree(path_t *plist, potrace_bitmap_t *bm) { + path_t *p, *p1; + path_t *heap, *heap1; + path_t *cur; + path_t *head; + path_t **plist_hook; /* for fast appending to linked list */ + path_t **hook_in, **hook_out; /* for fast appending to linked list */ + bbox_t bbox; + + bm_clear(bm, 0); + + /* save original "next" pointers */ + list_forall(p, plist) { + p->sibling = p->next; + p->childlist = NULL; + } + + heap = plist; + + /* the heap holds a list of lists of paths. Use "childlist" field + for outer list, "next" field for inner list. Each of the sublists + is to be turned into a tree. This code is messy, but it is + actually fast. Each path is rendered exactly once. We use the + heap to get a tail recursive algorithm: the heap holds a list of + pathlists which still need to be transformed. */ + + while (heap) { + /* unlink first sublist */ + cur = heap; + heap = heap->childlist; + cur->childlist = NULL; + + /* unlink first path */ + head = cur; + cur = cur->next; + head->next = NULL; + + /* render path */ + xor_path(bm, head); + setbbox_path(&bbox, head); + + /* now do insideness test for each element of cur; append it to + head->childlist if it's inside head, else append it to + head->next. */ + hook_in=&head->childlist; + hook_out=&head->next; + list_forall_unlink(p, cur) { + if (p->priv->pt[0].y <= bbox.y0) { + list_insert_beforehook(p, hook_out); + /* append the remainder of the list to hook_out */ + *hook_out = cur; + break; + } + if (BM_GET(bm, p->priv->pt[0].x, p->priv->pt[0].y-1)) { + list_insert_beforehook(p, hook_in); + } else { + list_insert_beforehook(p, hook_out); + } + } + + /* clear bm */ + clear_bm_with_bbox(bm, &bbox); + + /* now schedule head->childlist and head->next for further + processing */ + if (head->next) { + head->next->childlist = heap; + heap = head->next; + } + if (head->childlist) { + head->childlist->childlist = heap; + heap = head->childlist; + } + } + + /* copy sibling structure from "next" to "sibling" component */ + p = plist; + while (p) { + p1 = p->sibling; + p->sibling = p->next; + p = p1; + } + + /* reconstruct a new linked list ("next") structure from tree + ("childlist", "sibling") structure. This code is slightly messy, + because we use a heap to make it tail recursive: the heap + contains a list of childlists which still need to be + processed. */ + heap = plist; + if (heap) { + heap->next = NULL; /* heap is a linked list of childlists */ + } + plist = NULL; + plist_hook = &plist; + while (heap) { + heap1 = heap->next; + for (p=heap; p; p=p->sibling) { + /* p is a positive path */ + /* append to linked list */ + list_insert_beforehook(p, plist_hook); + + /* go through its children */ + for (p1=p->childlist; p1; p1=p1->sibling) { + /* append to linked list */ + list_insert_beforehook(p1, plist_hook); + /* append its childlist to heap, if non-empty */ + if (p1->childlist) { + list_append(path_t, heap1, p1->childlist); + } + } + } + heap = heap1; + } + + return; +} + +/* find the next set pixel in a row <= y. Pixels are searched first + left-to-right, then top-down. In other words, (x,y)<(x',y') if y>y' + or y=y' and x<x'. If found, return 0 and store pixel in + (*xp,*yp). Else return 1. Note that this function assumes that + excess bytes have been cleared with bm_clearexcess. */ +static int findnext(potrace_bitmap_t *bm, int *xp, int *yp) { + int x; + int y; + int x0; + + x0 = (*xp) & ~(BM_WORDBITS-1); + + for (y=*yp; y>=0; y--) { + for (x=x0; x<bm->w; x+=BM_WORDBITS) { + if (*bm_index(bm, x, y)) { + while (!BM_GET(bm, x, y)) { + x++; + } + /* found */ + *xp = x; + *yp = y; + return 0; + } + } + x0 = 0; + } + /* not found */ + return 1; +} + +/* Decompose the given bitmap into paths. Returns a linked list of + path_t objects with the fields len, pt, area, sign filled + in. Returns 0 on success with plistp set, or -1 on error with errno + set. */ + +int bm_to_pathlist(const potrace_bitmap_t *bm, path_t **plistp, const potrace_param_t *param, progress_t *progress) { + int x; + int y; + path_t *p; + path_t *plist = NULL; /* linked list of path objects */ + path_t **plist_hook = &plist; /* used to speed up appending to linked list */ + potrace_bitmap_t *bm1 = NULL; + int sign; + + bm1 = bm_dup(bm); + if (!bm1) { + goto error; + } + + /* be sure the byte padding on the right is set to 0, as the fast + pixel search below relies on it */ + bm_clearexcess(bm1); + + /* iterate through components */ + x = 0; + y = bm1->h - 1; + while (findnext(bm1, &x, &y) == 0) { + /* calculate the sign by looking at the original */ + sign = BM_GET(bm, x, y) ? '+' : '-'; + + /* calculate the path */ + p = findpath(bm1, x, y+1, sign, param->turnpolicy); + if (p==NULL) { + goto error; + } + + /* update buffered image */ + xor_path(bm1, p); + + /* if it's a turd, eliminate it, else append it to the list */ + if (p->area <= param->turdsize) { + path_free(p); + } else { + list_insert_beforehook(p, plist_hook); + } + + if (bm1->h > 0) { /* to be sure */ + progress_update(1-y/(double)bm1->h, progress); + } + } + + pathlist_to_tree(plist, bm1); + bm_free(bm1); + *plistp = plist; + + progress_update(1.0, progress); + + return 0; + + error: + bm_free(bm1); + list_forall_unlink(p, plist) { + path_free(p); + } + return -1; +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/decompose.h b/Build/source/libs/potrace/potrace-1.11/src/decompose.h new file mode 100644 index 00000000000..feec07a46b3 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/decompose.h @@ -0,0 +1,16 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef DECOMPOSE_H +#define DECOMPOSE_H + +#include "potracelib.h" +#include "progress.h" +#include "curve.h" + +int bm_to_pathlist(const potrace_bitmap_t *bm, path_t **plistp, const potrace_param_t *param, progress_t *progress); + +#endif /* DECOMPOSE_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/flate.c b/Build/source/libs/potrace/potrace-1.11/src/flate.c new file mode 100644 index 00000000000..5771867a8c0 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/flate.c @@ -0,0 +1,380 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +/* the PostScript compression module of Potrace. The basic interface + is through the *_xship function, which processes a byte array and + outputs it in compressed or verbatim form, depending on whether + filter is 1 or 0. To flush the output, simply call with the empty + string and filter=0. filter=2 is used to output encoded text but + without the PostScript header to turn on the encoding. Each + function has variants for shipping a single character, a + null-terminated string, or a byte array. */ + +/* different compression algorithms are available. There is + dummy_xship, which is just the identity, and flate_xship, which + uses zlib compression. Also, lzw_xship provides LZW compression + from the file lzw.c/h. a85_xship provides a85-encoding without + compression. Each function returns the actual number of characters + written. */ + +/* note: the functions provided here have global state and are not + reentrant */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <errno.h> + +#ifdef HAVE_ZLIB +#include <zlib.h> +#endif + +#include "flate.h" +#include "lzw.h" + +#define OUTSIZE 1000 + +static int a85init(FILE *f); +static int a85finish(FILE *f); +static int a85write(FILE *f, char *buf, int n); +static int a85out(FILE *f, int n); +static int a85spool(FILE *f, char c); + +/* ---------------------------------------------------------------------- */ +/* dummy interface: no encoding */ + +int dummy_xship(FILE *f, int filter, char *s, int len) { + fwrite(s, 1, len, f); + return len; +} + +/* ---------------------------------------------------------------------- */ +/* flate interface: zlib (=postscript level 3) compression and a85 */ + +#ifdef HAVE_ZLIB + +int pdf_xship(FILE *f, int filter, char *s, int len) { + static int fstate = 0; + static z_stream c_stream; + char outbuf[OUTSIZE]; + int err; + int n=0; + + if (filter && !fstate) { + /* switch on filtering */ + c_stream.zalloc = Z_NULL; + c_stream.zfree = Z_NULL; + c_stream.opaque = Z_NULL; + err = deflateInit(&c_stream, 9); + if (err != Z_OK) { + fprintf(stderr, "deflateInit: %s (%d)\n", c_stream.msg, err); + exit(1); + } + c_stream.avail_in = 0; + fstate = 1; + } else if (!filter && fstate) { + /* switch off filtering */ + /* flush stream */ + do { + c_stream.next_out = (Bytef*)outbuf; + c_stream.avail_out = OUTSIZE; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_OK && err != Z_STREAM_END) { + fprintf(stderr, "deflate: %s (%d)\n", c_stream.msg, err); + exit(1); + } + n += fwrite(outbuf, 1, OUTSIZE-c_stream.avail_out, f); + } while (err != Z_STREAM_END); + + fstate = 0; + } + if (!fstate) { + fwrite(s, 1, len, f); + return n+len; + } + + /* do the actual compression */ + c_stream.next_in = (Bytef*) s; + c_stream.avail_in = len; + + do { + c_stream.next_out = (Bytef*) outbuf; + c_stream.avail_out = OUTSIZE; + + err = deflate(&c_stream, Z_NO_FLUSH); + if (err != Z_OK) { + fprintf(stderr, "deflate: %s (%d)\n", c_stream.msg, err); + exit(1); + } + n += fwrite(outbuf, 1, OUTSIZE-c_stream.avail_out, f); + } while (!c_stream.avail_out); + + return n; +} + +/* ship len bytes from s using zlib compression. */ +int flate_xship(FILE *f, int filter, char *s, int len) { + static int fstate = 0; + static z_stream c_stream; + char outbuf[OUTSIZE]; + int err; + int n=0; + + if (filter && !fstate) { + /* switch on filtering */ + if (filter == 1) { + n += fprintf(f, "currentfile /ASCII85Decode filter /FlateDecode filter cvx exec\n"); + } + c_stream.zalloc = Z_NULL; + c_stream.zfree = Z_NULL; + c_stream.opaque = Z_NULL; + err = deflateInit(&c_stream, 9); + if (err != Z_OK) { + fprintf(stderr, "deflateInit: %s (%d)\n", c_stream.msg, err); + exit(1); + } + c_stream.avail_in = 0; + n += a85init(f); + fstate = 1; + } else if (!filter && fstate) { + /* switch off filtering */ + /* flush stream */ + do { + c_stream.next_out = (Bytef*)outbuf; + c_stream.avail_out = OUTSIZE; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_OK && err != Z_STREAM_END) { + fprintf(stderr, "deflate: %s (%d)\n", c_stream.msg, err); + exit(1); + } + n += a85write(f, outbuf, OUTSIZE-c_stream.avail_out); + } while (err != Z_STREAM_END); + + n += a85finish(f); + + fstate = 0; + } + if (!fstate) { + fwrite(s, 1, len, f); + return n+len; + } + + /* do the actual compression */ + c_stream.next_in = (Bytef*) s; + c_stream.avail_in = len; + + do { + c_stream.next_out = (Bytef*) outbuf; + c_stream.avail_out = OUTSIZE; + + err = deflate(&c_stream, Z_NO_FLUSH); + if (err != Z_OK) { + fprintf(stderr, "deflate: %s (%d)\n", c_stream.msg, err); + exit(1); + } + n += a85write(f, outbuf, OUTSIZE-c_stream.avail_out); + } while (!c_stream.avail_out); + + return n; +} + +#else /* HAVE_ZLIB */ + +int pdf_xship(FILE *f, int filter, char *s, int len) { + return dummy_xship(f, filter, s, len); +} + +int flate_xship(FILE *f, int filter, char *s, int len) { + return dummy_xship(f, filter, s, len); +} + +#endif /* HAVE_ZLIB */ + +/* ---------------------------------------------------------------------- */ +/* lzw interface: LZW (=postscript level 2) compression with a85. + This relies on lzw.c/h to do the actual compression. */ + +/* use Postscript level 2 compression. Ship len bytes from str. */ +int lzw_xship(FILE *f, int filter, char *str, int len) { + static int fstate = 0; + static lzw_stream_t *s = NULL; + char outbuf[OUTSIZE]; + int err; + int n=0; + + if (filter && !fstate) { + /* switch on filtering */ + if (filter == 1) { + n += fprintf(f, "currentfile /ASCII85Decode filter /LZWDecode filter cvx exec\n"); + } + s = lzw_init(); + if (s == NULL) { + fprintf(stderr, "lzw_init: %s\n", strerror(errno)); + exit(1); + } + n += a85init(f); + fstate = 1; + } else if (!filter && fstate) { + /* switch off filtering */ + /* flush stream */ + s->next_in = 0; + s->avail_in = 0; + do { + s->next_out = outbuf; + s->avail_out = OUTSIZE; + + err = lzw_compress(s, LZW_EOD); + if (err) { + fprintf(stderr, "lzw_compress: %s\n", strerror(errno)); + exit(1); + } + n += a85write(f, outbuf, OUTSIZE - s->avail_out); + } while (s->avail_out == 0); + + n += a85finish(f); + + lzw_free(s); + s = NULL; + + fstate = 0; + } + if (!fstate) { + fwrite(str, 1, len, f); + return n+len; + } + + /* do the actual compression */ + s->next_in = str; + s->avail_in = len; + + do { + s->next_out = outbuf; + s->avail_out = OUTSIZE; + + err = lzw_compress(s, LZW_NORMAL); + if (err) { + fprintf(stderr, "lzw_compress: %s\n", strerror(errno)); + exit(1); + } + n += a85write(f, outbuf, OUTSIZE - s->avail_out); + } while (s->avail_out == 0); + + return n; +} + +/* ---------------------------------------------------------------------- */ +/* a85 interface: a85 encoding without compression */ + +/* ship len bytes from s using a85 encoding only. */ +int a85_xship(FILE *f, int filter, char *s, int len) { + static int fstate = 0; + int n=0; + + if (filter && !fstate) { + /* switch on filtering */ + if (filter == 1) { + n += fprintf(f, "currentfile /ASCII85Decode filter cvx exec\n"); + } + n += a85init(f); + fstate = 1; + } else if (!filter && fstate) { + /* switch off filtering */ + /* flush stream */ + n += a85finish(f); + fstate = 0; + } + if (!fstate) { + fwrite(s, 1, len, f); + return n+len; + } + + n += a85write(f, s, len); + + return n; +} + +/* ---------------------------------------------------------------------- */ +/* low-level a85 backend */ + +static unsigned long a85buf[4]; +static int a85n; +static int a85col; + +static int a85init(FILE *f) { + a85n = 0; + a85col = 0; + return 0; +} + +static int a85finish(FILE *f) { + int r=0; + + if (a85n) { + r+=a85out(f, a85n); + } + fputs("~>\n", f); + return r+2; +} + +static int a85write(FILE *f, char *buf, int n) { + int i; + int r=0; + + for (i=0; i<n; i++) { + a85buf[a85n] = (unsigned char)buf[i]; + a85n++; + + if (a85n == 4) { + r+=a85out(f, 4); + a85n = 0; + } + } + return r; +} + +static int a85out(FILE *f, int n) { + char out[5]; + unsigned long s; + int r=0; + int i; + + for (i=n; i<4; i++) { + a85buf[i] = 0; + } + + s = (a85buf[0]<<24) + (a85buf[1]<<16) + (a85buf[2]<<8) + (a85buf[3]<<0); + + if (!s) { + r+=a85spool(f, 'z'); + } else { + for (i=4; i>=0; i--) { + out[i] = s % 85; + s /= 85; + } + for (i=0; i<n+1; i++) { + r+=a85spool(f, out[i]+33); + } + } + return r; +} + +static int a85spool(FILE *f, char c) { + fputc(c, f); + + a85col++; + if (a85col>70) { + fputc('\n', f); + a85col=0; + return 2; + } + + return 1; +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/flate.h b/Build/source/libs/potrace/potrace-1.11/src/flate.h new file mode 100644 index 00000000000..2a22bd377cb --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/flate.h @@ -0,0 +1,15 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef FLATE_H +#define FLATE_H + +int dummy_xship(FILE *f, int filter, char *s, int len); +int flate_xship(FILE *f, int filter, char *s, int len); +int pdf_xship(FILE *f, int filter, char *s, int len); +int lzw_xship(FILE *f, int filter, char *s, int len); +int a85_xship(FILE *f, int filter, char *s, int len); + +#endif /* FLATE_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/getopt.c b/Build/source/libs/potrace/potrace-1.11/src/getopt.c new file mode 100644 index 00000000000..12539eeb564 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/getopt.c @@ -0,0 +1,1061 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + + Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 + Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. + Ditto for AIX 3.2 and <stdlib.h>. */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include <gnu-versions.h> +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include <stdlib.h> +# include <unistd.h> +#endif /* GNU C library. */ + +#ifdef VMS +# include <unixlib.h> +# if HAVE_STRING_H - 0 +# include <string.h> +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. */ +# if defined HAVE_LIBINTL_H || defined _LIBC +# include <libintl.h> +# ifndef _ +# define _(msgid) gettext (msgid) +# endif +# else +# define _(msgid) (msgid) +# endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +# include <string.h> +# define my_index strchr +#else + +# if HAVE_STRING_H +# include <string.h> +# else +# include <strings.h> +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +extern char *getenv (); +#endif + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; + +static int original_argc; +static char *const *original_argv; + +/* Make sure the environment variable bash 2.0 puts in the environment + is valid for the getopt call we must make sure that the ARGV passed + to getopt is that one passed to the process. */ +static void +__attribute__ ((unused)) +store_args_and_env (int argc, char *const *argv) +{ + /* XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ + original_argc = argc; + original_argv = argv; +} +# ifdef text_set_element +text_set_element (__libc_subinit, store_args_and_env); +# endif /* text_set_element */ + +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#ifdef _LIBC + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#ifdef _LIBC + if (posixly_correct == NULL + && argc == original_argc && argv == original_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + int print_errors = opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#ifdef _LIBC +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (print_errors) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + } + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (print_errors) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (print_errors) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + fprintf (stderr, _("%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/getopt.h b/Build/source/libs/potrace/potrace-1.11/src/getopt.h new file mode 100644 index 00000000000..ac60b176448 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/getopt.h @@ -0,0 +1,180 @@ +/* Declarations for getopt. + Copyright (C) 1989,90,91,92,93,94,96,97,98,99 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include <features.h>, but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include <ctype.h>, which will pull in <features.h> for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include <ctype.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +# if defined __STDC__ && __STDC__ + const char *name; +# else + char *name; +# endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +#if defined __STDC__ && __STDC__ +# ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int argc, char *const *argv, const char *shortopts); +# else /* not __GNU_LIBRARY__ */ +extern int getopt (); +# endif /* __GNU_LIBRARY__ */ + +# ifndef __need_getopt +extern int getopt_long (int argc, char *const *argv, const char *shortopts, + const struct option *longopts, int *longind); +extern int getopt_long_only (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind, + int long_only); +# endif +#else /* not __STDC__ */ +extern int getopt (); +# ifndef __need_getopt +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +# endif +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/getopt1.c b/Build/source/libs/potrace/potrace-1.11/src/getopt1.c new file mode 100644 index 00000000000..3d264f2db4d --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/getopt1.c @@ -0,0 +1,188 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "getopt.h" + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +#include <gnu-versions.h> +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include <stdlib.h> +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +#include <stdio.h> + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/greymap.c b/Build/source/libs/potrace/potrace-1.11/src/greymap.c new file mode 100644 index 00000000000..ebbe21213af --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/greymap.c @@ -0,0 +1,929 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +/* Routines for manipulating greymaps, including reading pgm files. We + only deal with greymaps of depth 8 bits. */ + +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#include "greymap.h" +#include "bitops.h" + +#define INTBITS (8*sizeof(int)) + +#define mod(a,n) ((a)>=(n) ? (a)%(n) : (a)>=0 ? (a) : (n)-1-(-1-(a))%(n)) + +static int gm_readbody_pnm(FILE *f, greymap_t **gmp, int magic); +static int gm_readbody_bmp(FILE *f, greymap_t **gmp); + +/* ---------------------------------------------------------------------- */ +/* basic greymap routines */ + +/* return new un-initialized greymap. NULL with errno on error */ + +greymap_t *gm_new(int w, int h) { + greymap_t *gm; + + gm = (greymap_t *) malloc(sizeof(greymap_t)); + if (!gm) { + return NULL; + } + gm->w = w; + gm->h = h; + gm->map = (signed short int *) malloc(w*h*sizeof(signed short int)); + if (!gm->map) { + free(gm); + return NULL; + } + return gm; +} + +/* free the given greymap */ +void gm_free(greymap_t *gm) { + if (gm) { + free(gm->map); + } + free(gm); +} + +/* duplicate the given greymap. Return NULL on error with errno set. */ +greymap_t *gm_dup(greymap_t *gm) { + greymap_t *gm1 = gm_new(gm->w, gm->h); + if (!gm1) { + return NULL; + } + memcpy(gm1->map, gm->map, gm->w*gm->h*sizeof(signed short int)); + return gm1; +} + +/* clear the given greymap to color b. */ +void gm_clear(greymap_t *gm, int b) { + int i; + + if (b==0) { + memset(gm->map, 0, gm->w*gm->h*sizeof(signed short int)); + } else { + for (i=0; i<gm->w*gm->h; i++) { + gm->map[i] = b; + } + } +} + +/* ---------------------------------------------------------------------- */ +/* routines for reading pnm streams */ + +/* read next character after whitespace and comments. Return EOF on + end of file or error. */ +static int fgetc_ws(FILE *f) { + int c; + + while (1) { + c = fgetc(f); + if (c=='#') { + while (1) { + c = fgetc(f); + if (c=='\n' || c==EOF) { + break; + } + } + } + /* space, tab, line feed, carriage return, form-feed */ + if (c!=' ' && c!='\t' && c!='\r' && c!='\n' && c!=12) { + return c; + } + } +} + +/* skip whitespace and comments, then read a non-negative decimal + number from a stream. Return -1 on EOF. Tolerate other errors (skip + bad characters). Do not the read any characters following the + number (put next character back into the stream) */ + +static int readnum(FILE *f) { + int c; + int acc; + + /* skip whitespace and comments */ + while (1) { + c = fgetc_ws(f); + if (c==EOF) { + return -1; + } + if (c>='0' && c<='9') { + break; + } + } + + /* first digit is already in c */ + acc = c-'0'; + while (1) { + c = fgetc(f); + if (c==EOF) { + break; + } + if (c<'0' || c>'9') { + ungetc(c, f); + break; + } + acc *= 10; + acc += c-'0'; + } + return acc; +} + +/* similar to readnum, but read only a single 0 or 1, and do not read + any characters after it. */ + +static int readbit(FILE *f) { + int c; + + /* skip whitespace and comments */ + while (1) { + c = fgetc_ws(f); + if (c==EOF) { + return -1; + } + if (c>='0' && c<='1') { + break; + } + } + + return c-'0'; +} + +/* ---------------------------------------------------------------------- */ + +/* read a PNM stream: P1-P6 format (see pnm(5)), or a BMP stream, and + convert the output to a greymap. Return greymap in *gmp. Return 0 + on success, -1 on error with errno set, -2 on bad file format (with + error message in gm_read_error), and 1 on premature end of file, -3 + on empty file (including files with only whitespace and comments), + -4 if wrong magic number. If the return value is >=0, *gmp is + valid. */ + +char *gm_read_error = NULL; + +int gm_read(FILE *f, greymap_t **gmp) { + int magic[2]; + + /* read magic number. We ignore whitespace and comments before the + magic, for the benefit of concatenated files in P1-P3 format. + Multiple P1-P3 images in a single file are not formally allowed + by the PNM standard, but there is no harm in being lenient. */ + + magic[0] = fgetc_ws(f); + if (magic[0] == EOF) { + /* files which contain only comments and whitespace count as "empty" */ + return -3; + } + magic[1] = fgetc(f); + if (magic[0] == 'P' && magic[1] >= '1' && magic[1] <= '6') { + return gm_readbody_pnm(f, gmp, magic[1]); + } + if (magic[0] == 'B' && magic[1] == 'M') { + return gm_readbody_bmp(f, gmp); + } + return -4; +} + +/* ---------------------------------------------------------------------- */ +/* read PNM format */ + +/* read PNM stream after magic number. Return values as for gm_read */ +static int gm_readbody_pnm(FILE *f, greymap_t **gmp, int magic) { + greymap_t *gm; + int x, y, i, j, b, b1, sum; + int bpr; /* bytes per row (as opposed to 4*gm->c) */ + int w, h, max; + + gm = NULL; + + w = readnum(f); + if (w<0) { + goto format_error; + } + + h = readnum(f); + if (h<0) { + goto format_error; + } + + /* allocate greymap */ + gm = gm_new(w, h); + if (!gm) { + return -1; + } + + /* zero it out */ + gm_clear(gm, 0); + + switch (magic) { + default: + /* not reached */ + goto format_error; + + case '1': + /* read P1 format: PBM ascii */ + + for (y=h-1; y>=0; y--) { + for (x=0; x<w; x++) { + b = readbit(f); + if (b<0) { + goto eof; + } + GM_UPUT(gm, x, y, b ? 0 : 255); + } + } + break; + + case '2': + /* read P2 format: PGM ascii */ + + max = readnum(f); + if (max<1) { + goto format_error; + } + + for (y=h-1; y>=0; y--) { + for (x=0; x<w; x++) { + b = readnum(f); + if (b<0) { + goto eof; + } + GM_UPUT(gm, x, y, b*255/max); + } + } + break; + + case '3': + /* read P3 format: PPM ascii */ + + max = readnum(f); + if (max<1) { + goto format_error; + } + + for (y=h-1; y>=0; y--) { + for (x=0; x<w; x++) { + sum = 0; + for (i=0; i<3; i++) { + b = readnum(f); + if (b<0) { + goto eof; + } + sum += b; + } + GM_UPUT(gm, x, y, sum*(255/3)/max); + } + } + break; + + case '4': + /* read P4 format: PBM raw */ + + b = fgetc(f); /* read single white-space character after height */ + if (b==EOF) { + goto format_error; + } + + bpr = (w+7)/8; + + for (y=h-1; y>=0; y--) { + for (i=0; i<bpr; i++) { + b = fgetc(f); + if (b==EOF) { + goto eof; + } + for (j=0; j<8; j++) { + GM_PUT(gm, i*8+j, y, b & (0x80 >> j) ? 0 : 255); + } + } + } + break; + + case '5': + /* read P5 format: PGM raw */ + + max = readnum(f); + if (max<1) { + goto format_error; + } + + b = fgetc(f); /* read single white-space character after max */ + if (b==EOF) { + goto format_error; + } + + for (y=h-1; y>=0; y--) { + for (x=0; x<w; x++) { + b = fgetc(f); + if (b==EOF) + goto eof; + if (max>=256) { + b <<= 8; + b1 = fgetc(f); + if (b1==EOF) + goto eof; + b |= b1; + } + GM_UPUT(gm, x, y, b*255/max); + } + } + break; + + case '6': + /* read P6 format: PPM raw */ + + max = readnum(f); + if (max<1) { + goto format_error; + } + + b = fgetc(f); /* read single white-space character after max */ + if (b==EOF) { + goto format_error; + } + + for (y=h-1; y>=0; y--) { + for (x=0; x<w; x++) { + sum = 0; + for (i=0; i<3; i++) { + b = fgetc(f); + if (b==EOF) { + goto eof; + } + if (max>=256) { + b <<= 8; + b1 = fgetc(f); + if (b1==EOF) + goto eof; + b |= b1; + } + sum += b; + } + GM_UPUT(gm, x, y, sum*(255/3)/max); + } + } + break; + } + + *gmp = gm; + return 0; + + eof: + *gmp = gm; + return 1; + + format_error: + gm_free(gm); + if (magic == '1' || magic == '4') { + gm_read_error = "invalid pbm file"; + } else if (magic == '2' || magic == '5') { + gm_read_error = "invalid pgm file"; + } else { + gm_read_error = "invalid ppm file"; + } + return -2; +} + +/* ---------------------------------------------------------------------- */ +/* read BMP format */ + +struct bmp_info_s { + unsigned int FileSize; + unsigned int reserved; + unsigned int DataOffset; + unsigned int InfoSize; + unsigned int w; /* width */ + unsigned int h; /* height */ + unsigned int Planes; + unsigned int bits; /* bits per sample */ + unsigned int comp; /* compression mode */ + unsigned int ImageSize; + unsigned int XpixelsPerM; + unsigned int YpixelsPerM; + unsigned int ncolors; /* number of colors in palette */ + unsigned int ColorsImportant; + unsigned int RedMask; + unsigned int GreenMask; + unsigned int BlueMask; + unsigned int AlphaMask; + unsigned int ctbits; /* sample size for color table */ + int topdown; /* top-down mode? */ +}; +typedef struct bmp_info_s bmp_info_t; + +/* auxiliary */ + +static int bmp_count = 0; /* counter for byte padding */ +static int bmp_pos = 0; /* counter from start of BMP data */ + +/* read n-byte little-endian integer. Return 1 on EOF or error, else + 0. Assume n<=4. */ +static int bmp_readint(FILE *f, int n, unsigned int *p) { + int i; + unsigned int sum = 0; + int b; + + for (i=0; i<n; i++) { + b = fgetc(f); + if (b==EOF) { + return 1; + } + sum += b << (8*i); + } + bmp_count += n; + bmp_pos += n; + *p = sum; + return 0; +} + +/* reset padding boundary */ +static void bmp_pad_reset(void) { + bmp_count = 0; +} + +/* read padding bytes to 4-byte boundary. Return 1 on EOF or error, + else 0. */ +static int bmp_pad(FILE *f) { + int c, i, b; + + c = (-bmp_count) & 3; + for (i=0; i<c; i++) { + b = fgetc(f); + if (b==EOF) { + return 1; + } + } + bmp_pos += c; + bmp_count = 0; + return 0; +} + +/* forward to the new file position. Return 1 on EOF or error, else 0 */ +static int bmp_forward(FILE *f, int pos) { + int b; + + while (bmp_pos < pos) { + b = fgetc(f); + if (b==EOF) { + return 1; + } + bmp_pos++; + bmp_count++; + } + return 0; +} + +#define TRY(x) if (x) goto try_error +#define TRY_EOF(x) if (x) goto eof + +/* correct y-coordinate for top-down format */ +#define ycorr(y) (bmpinfo.topdown ? bmpinfo.h-1-y : y) + +/* read BMP stream after magic number. Return values as for gm_read. + We choose to be as permissive as possible, since there are many + programs out there which produce BMP. For instance, ppmtobmp can + produce codings with anywhere from 1-8 or 24 bits per sample, + although most specifications only allow 1,4,8,24,32. We can also + read both the old and new OS/2 BMP formats in addition to the + Windows BMP format. */ +static int gm_readbody_bmp(FILE *f, greymap_t **gmp) { + bmp_info_t bmpinfo; + int *coltable; + unsigned int b, c; + unsigned int i, j; + greymap_t *gm; + unsigned int x, y; + int col[2]; + unsigned int bitbuf; + unsigned int n; + unsigned int redshift, greenshift, blueshift; + + gm_read_error = NULL; + gm = NULL; + coltable = NULL; + + bmp_pos = 2; /* set file position */ + + /* file header (minus magic number) */ + TRY(bmp_readint(f, 4, &bmpinfo.FileSize)); + TRY(bmp_readint(f, 4, &bmpinfo.reserved)); + TRY(bmp_readint(f, 4, &bmpinfo.DataOffset)); + + /* info header */ + TRY(bmp_readint(f, 4, &bmpinfo.InfoSize)); + if (bmpinfo.InfoSize == 40 || bmpinfo.InfoSize == 64 + || bmpinfo.InfoSize == 108 || bmpinfo.InfoSize == 124) { + /* Windows or new OS/2 format */ + bmpinfo.ctbits = 32; /* sample size in color table */ + TRY(bmp_readint(f, 4, &bmpinfo.w)); + TRY(bmp_readint(f, 4, &bmpinfo.h)); + TRY(bmp_readint(f, 2, &bmpinfo.Planes)); + TRY(bmp_readint(f, 2, &bmpinfo.bits)); + TRY(bmp_readint(f, 4, &bmpinfo.comp)); + TRY(bmp_readint(f, 4, &bmpinfo.ImageSize)); + TRY(bmp_readint(f, 4, &bmpinfo.XpixelsPerM)); + TRY(bmp_readint(f, 4, &bmpinfo.YpixelsPerM)); + TRY(bmp_readint(f, 4, &bmpinfo.ncolors)); + TRY(bmp_readint(f, 4, &bmpinfo.ColorsImportant)); + if (bmpinfo.InfoSize >= 108) { /* V4 and V5 bitmaps */ + TRY(bmp_readint(f, 4, &bmpinfo.RedMask)); + TRY(bmp_readint(f, 4, &bmpinfo.GreenMask)); + TRY(bmp_readint(f, 4, &bmpinfo.BlueMask)); + TRY(bmp_readint(f, 4, &bmpinfo.AlphaMask)); + } + if ((signed int)bmpinfo.h < 0) { + bmpinfo.h = -bmpinfo.h; + bmpinfo.topdown = 1; + } else { + bmpinfo.topdown = 0; + } + } else if (bmpinfo.InfoSize == 12) { + /* old OS/2 format */ + bmpinfo.ctbits = 24; /* sample size in color table */ + TRY(bmp_readint(f, 2, &bmpinfo.w)); + TRY(bmp_readint(f, 2, &bmpinfo.h)); + TRY(bmp_readint(f, 2, &bmpinfo.Planes)); + TRY(bmp_readint(f, 2, &bmpinfo.bits)); + bmpinfo.comp = 0; + bmpinfo.ncolors = 0; + bmpinfo.topdown = 0; + } else { + goto format_error; + } + + if (bmpinfo.comp == 3 && bmpinfo.InfoSize < 108) { + /* bitfield feature is only understood with V4 and V5 format */ + goto format_error; + } + + /* forward to color table (e.g., if bmpinfo.InfoSize == 64) */ + TRY(bmp_forward(f, 14+bmpinfo.InfoSize)); + + if (bmpinfo.Planes != 1) { + gm_read_error = "cannot handle bmp planes"; + goto format_error; /* can't handle planes */ + } + + if (bmpinfo.ncolors == 0) { + bmpinfo.ncolors = 1 << bmpinfo.bits; + } + + /* color table, present only if bmpinfo.bits <= 8. */ + if (bmpinfo.bits <= 8) { + coltable = (int *) malloc(bmpinfo.ncolors * sizeof(int)); + if (!coltable) { + goto std_error; + } + /* NOTE: since we are reading a greymap, we can immediately convert + the color table entries to grey values. */ + for (i=0; i<bmpinfo.ncolors; i++) { + TRY(bmp_readint(f, bmpinfo.ctbits/8, &c)); + c = ((c>>16) & 0xff) + ((c>>8) & 0xff) + (c & 0xff); + coltable[i] = c/3; + } + } + + /* forward to data */ + if (bmpinfo.InfoSize != 12) { /* not old OS/2 format */ + TRY(bmp_forward(f, bmpinfo.DataOffset)); + } + + /* allocate greymap */ + gm = gm_new(bmpinfo.w, bmpinfo.h); + if (!gm) { + goto std_error; + } + + /* zero it out */ + gm_clear(gm, 0); + + switch (bmpinfo.bits + 0x100*bmpinfo.comp) { + + default: + goto format_error; + break; + + case 0x001: /* monochrome palette */ + + /* raster data */ + for (y=0; y<bmpinfo.h; y++) { + bmp_pad_reset(); + for (i=0; 8*i<bmpinfo.w; i++) { + TRY_EOF(bmp_readint(f, 1, &b)); + for (j=0; j<8; j++) { + GM_PUT(gm, i*8+j, ycorr(y), b & (0x80 >> j) ? coltable[1] : coltable[0]); + } + } + TRY(bmp_pad(f)); + } + break; + + case 0x002: /* 2-bit to 8-bit palettes */ + case 0x003: + case 0x004: + case 0x005: + case 0x006: + case 0x007: + case 0x008: + for (y=0; y<bmpinfo.h; y++) { + bmp_pad_reset(); + bitbuf = 0; /* bit buffer: bits in buffer are high-aligned */ + n = 0; /* number of bits currently in bitbuffer */ + for (x=0; x<bmpinfo.w; x++) { + if (n < bmpinfo.bits) { + TRY_EOF(bmp_readint(f, 1, &b)); + bitbuf |= b << (INTBITS - 8 - n); + n += 8; + } + b = bitbuf >> (INTBITS - bmpinfo.bits); + bitbuf <<= bmpinfo.bits; + n -= bmpinfo.bits; + GM_UPUT(gm, x, ycorr(y), coltable[b]); + } + TRY(bmp_pad(f)); + } + break; + + case 0x010: /* 16-bit encoding */ + /* can't do this format because it is not well-documented and I + don't have any samples */ + gm_read_error = "cannot handle bmp 16-bit coding"; + goto format_error; + break; + + case 0x018: /* 24-bit encoding */ + case 0x020: /* 32-bit encoding */ + for (y=0; y<bmpinfo.h; y++) { + bmp_pad_reset(); + for (x=0; x<bmpinfo.w; x++) { + TRY_EOF(bmp_readint(f, bmpinfo.bits/8, &c)); + c = ((c>>16) & 0xff) + ((c>>8) & 0xff) + (c & 0xff); + GM_UPUT(gm, x, ycorr(y), c/3); + } + TRY(bmp_pad(f)); + } + break; + + case 0x320: /* 32-bit encoding with bitfields */ + redshift = lobit(bmpinfo.RedMask); + greenshift = lobit(bmpinfo.GreenMask); + blueshift = lobit(bmpinfo.BlueMask); + + for (y=0; y<bmpinfo.h; y++) { + bmp_pad_reset(); + for (x=0; x<bmpinfo.w; x++) { + TRY_EOF(bmp_readint(f, bmpinfo.bits/8, &c)); + c = ((c & bmpinfo.RedMask) >> redshift) + ((c & bmpinfo.GreenMask) >> greenshift) + ((c & bmpinfo.BlueMask) >> blueshift); + GM_UPUT(gm, x, ycorr(y), c/3); + } + TRY(bmp_pad(f)); + } + break; + + case 0x204: /* 4-bit runlength compressed encoding (RLE4) */ + x = 0; + y = 0; + while (1) { + TRY_EOF(bmp_readint(f, 1, &b)); /* opcode */ + TRY_EOF(bmp_readint(f, 1, &c)); /* argument */ + if (b>0) { + /* repeat count */ + col[0] = coltable[(c>>4) & 0xf]; + col[1] = coltable[c & 0xf]; + for (i=0; i<b && x<bmpinfo.w; i++) { + if (x>=bmpinfo.w) { + x=0; + y++; + } + if (y>=bmpinfo.h) { + break; + } + GM_UPUT(gm, x, ycorr(y), col[i&1]); + x++; + } + } else if (c == 0) { + /* end of line */ + y++; + x = 0; + } else if (c == 1) { + /* end of greymap */ + break; + } else if (c == 2) { + /* "delta": skip pixels in x and y directions */ + TRY_EOF(bmp_readint(f, 1, &b)); /* x offset */ + TRY_EOF(bmp_readint(f, 1, &c)); /* y offset */ + x += b; + y += c; + } else { + /* verbatim segment */ + for (i=0; i<c; i++) { + if ((i&1)==0) { + TRY_EOF(bmp_readint(f, 1, &b)); + } + if (x>=bmpinfo.w) { + x=0; + y++; + } + if (y>=bmpinfo.h) { + break; + } + GM_PUT(gm, x, ycorr(y), coltable[(b>>(4-4*(i&1))) & 0xf]); + x++; + } + if ((c+1) & 2) { + /* pad to 16-bit boundary */ + TRY_EOF(bmp_readint(f, 1, &b)); + } + } + } + break; + + case 0x108: /* 8-bit runlength compressed encoding (RLE8) */ + x = 0; + y = 0; + while (1) { + TRY_EOF(bmp_readint(f, 1, &b)); /* opcode */ + TRY_EOF(bmp_readint(f, 1, &c)); /* argument */ + if (b>0) { + /* repeat count */ + for (i=0; i<b; i++) { + if (x>=bmpinfo.w) { + x=0; + y++; + } + if (y>=bmpinfo.h) { + break; + } + GM_UPUT(gm, x, ycorr(y), coltable[c]); + x++; + } + } else if (c == 0) { + /* end of line */ + y++; + x = 0; + } else if (c == 1) { + /* end of greymap */ + break; + } else if (c == 2) { + /* "delta": skip pixels in x and y directions */ + TRY_EOF(bmp_readint(f, 1, &b)); /* x offset */ + TRY_EOF(bmp_readint(f, 1, &c)); /* y offset */ + x += b; + y += c; + } else { + /* verbatim segment */ + for (i=0; i<c; i++) { + TRY_EOF(bmp_readint(f, 1, &b)); + if (x>=bmpinfo.w) { + x=0; + y++; + } + if (y>=bmpinfo.h) { + break; + } + GM_PUT(gm, x, ycorr(y), coltable[b]); + x++; + } + if (c & 1) { + /* pad input to 16-bit boundary */ + TRY_EOF(bmp_readint(f, 1, &b)); + } + } + } + break; + + } /* switch */ + + /* skip any potential junk after the data section, but don't + complain in case EOF is encountered */ + bmp_forward(f, bmpinfo.FileSize); + + free(coltable); + *gmp = gm; + return 0; + + eof: + free(coltable); + *gmp = gm; + return 1; + + format_error: + try_error: + free(coltable); + free(gm); + if (!gm_read_error) { + gm_read_error = "invalid bmp file"; + } + return -2; + + std_error: + free(coltable); + free(gm); + return -1; +} + +/* ---------------------------------------------------------------------- */ + +/* write a pgm stream, either P2 or (if raw != 0) P5 format. Include + one-line comment if non-NULL. Mode determines how out-of-range + color values are converted. Gamma is the desired gamma correction, + if any (set to 2.2 if the image is to look optimal on a CRT monitor, + 2.8 for LCD). Set to 1.0 for no gamma correction */ + +int gm_writepgm(FILE *f, greymap_t *gm, char *comment, int raw, int mode, double gamma) { + int x, y, v; + int gammatable[256]; + + /* prepare gamma correction lookup table */ + if (gamma != 1.0) { + gammatable[0] = 0; + for (v=1; v<256; v++) { + gammatable[v] = (int)(255 * exp(log(v/255.0)/gamma) + 0.5); + } + } else { + for (v=0; v<256; v++) { + gammatable[v] = v; + } + } + + fprintf(f, raw ? "P5\n" : "P2\n"); + if (comment && *comment) { + fprintf(f, "# %s\n", comment); + } + fprintf(f, "%d %d 255\n", gm->w, gm->h); + for (y=gm->h-1; y>=0; y--) { + for (x=0; x<gm->w; x++) { + v = GM_UGET(gm, x, y); + if (mode == GM_MODE_NONZERO) { + if (v > 255) { + v = 510 - v; + } + if (v < 0) { + v = 0; + } + } else if (mode == GM_MODE_ODD) { + v = mod(v, 510); + if (v > 255) { + v = 510 - v; + } + } else if (mode == GM_MODE_POSITIVE) { + if (v < 0) { + v = 0; + } else if (v > 255) { + v = 255; + } + } else if (mode == GM_MODE_NEGATIVE) { + v = 510 - v; + if (v < 0) { + v = 0; + } else if (v > 255) { + v = 255; + } + } + v = gammatable[v]; + + if (raw) { + fputc(v, f); + } else { + fprintf(f, x == gm->w-1 ? "%d\n" : "%d ", v); + } + } + } + return 0; +} + +/* ---------------------------------------------------------------------- */ +/* output - for primitive debugging purposes only! */ + +/* print greymap to screen */ +int gm_print(FILE *f, greymap_t *gm) { + int x, y; + int xx, yy; + int d, t; + int sw, sh; + + sw = gm->w < 79 ? gm->w : 79; + sh = gm->w < 79 ? gm->h : gm->h*sw*44/(79*gm->w); + + for (yy=sh-1; yy>=0; yy--) { + for (xx=0; xx<sw; xx++) { + d=0; + t=0; + for (x=xx*gm->w/sw; x<(xx+1)*gm->w/sw; x++) { + for (y=yy*gm->h/sh; y<(yy+1)*gm->h/sh; y++) { + d += GM_GET(gm, x, y); + t += 256; + } + } + fputc("*#=- "[5*d/t], f); /* what a cute trick :) */ + } + fputc('\n', f); + } + return 0; +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/greymap.h b/Build/source/libs/potrace/potrace-1.11/src/greymap.h new file mode 100644 index 00000000000..7ad106579d8 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/greymap.h @@ -0,0 +1,57 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef GREYMAP_H +#define GREYMAP_H + +#include <stdio.h> + +/* internal format for greymaps. Note: in this format, rows are + ordered from bottom to top. The pixels in each row are given from + left to right. */ + +struct greymap_s { + int w; /* width, in pixels */ + int h; /* height, in pixels */ + signed short int *map; /* raw data, w*h values */ +}; +typedef struct greymap_s greymap_t; + +/* macros for accessing pixel at index (x,y). Note that the origin is + in the *lower* left corner. U* macros omit the bounds check. */ + +#define gm_index(gm, x, y) (&(gm)->map[(x)+(y)*(gm)->w]) +#define gm_safe(gm, x, y) ((int)(x)>=0 && (int)(x)<(gm)->w && (int)(y)>=0 && (int)(y)<(gm)->h) +#define gm_bound(x, m) ((x)<0 ? 0 : (x)>=(m) ? (m)-1 : (x)) +#define GM_UGET(gm, x, y) (*gm_index(gm, x, y)) +#define GM_UINC(gm, x, y, b) (*gm_index(gm, x, y) += (short int)(b)) +#define GM_UINV(gm, x, y) (*gm_index(gm, x, y) = 255 - *gm_index(gm, x, y)) +#define GM_UPUT(gm, x, y, b) (*gm_index(gm, x, y) = (short int)(b)) +#define GM_GET(gm, x, y) (gm_safe(gm, x, y) ? GM_UGET(gm, x, y) : 0) +#define GM_INC(gm, x, y, b) (gm_safe(gm, x, y) ? GM_UINC(gm, x, y, b) : 0) +#define GM_INV(gm, x, y) (gm_safe(gm, x, y) ? GM_UINV(gm, x, y) : 0) +#define GM_PUT(gm, x, y, b) (gm_safe(gm, x, y) ? GM_UPUT(gm, x, y, b) : 0) +#define GM_BGET(gm, x, y) GM_UGET(gm, gm_bound(x, gm->w), gm_bound(y, gm->h)) + +/* modes for cutting off out-of-range values. The following names + refer to winding numbers. I.e., make a pixel black if winding + number is nonzero, odd, or positive, respectively. We assume that 0 + winding number corresponds to white (255). */ +#define GM_MODE_NONZERO 1 +#define GM_MODE_ODD 2 +#define GM_MODE_POSITIVE 3 +#define GM_MODE_NEGATIVE 4 + +extern char *gm_read_error; + +greymap_t *gm_new(int w, int h); +greymap_t *gm_dup(greymap_t *gm); +void gm_free(greymap_t *gm); +void gm_clear(greymap_t *gm, int b); +int gm_read(FILE *f, greymap_t **gmp); +int gm_writepgm(FILE *f, greymap_t *gm, char *comment, int raw, int mode, double gamma); +int gm_print(FILE *f, greymap_t *gm); + +#endif /* GREYMAP_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/libpotrace-export.sym b/Build/source/libs/potrace/potrace-1.11/src/libpotrace-export.sym new file mode 100644 index 00000000000..74d55c87482 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/libpotrace-export.sym @@ -0,0 +1,5 @@ +potrace_state_free +potrace_param_default +potrace_trace +potrace_param_free +potrace_version diff --git a/Build/source/libs/potrace/potrace-1.11/src/lists.h b/Build/source/libs/potrace/potrace-1.11/src/lists.h new file mode 100644 index 00000000000..b67b9662356 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/lists.h @@ -0,0 +1,285 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef _PS_LISTS_H +#define _PS_LISTS_H + +/* here we define some general list macros. Because they are macros, + they should work on any datatype with a "->next" component. Some of + them use a "hook". If elt and list are of type t* then hook is of + type t**. A hook stands for an insertion point in the list, i.e., + either before the first element, or between two elements, or after + the last element. If an operation "sets the hook" for an element, + then the hook is set to just before the element. One can insert + something at a hook. One can also unlink at a hook: this means, + unlink the element just after the hook. By "to unlink", we mean the + element is removed from the list, but not deleted. Thus, it and its + components still need to be freed. */ + +/* Note: these macros are somewhat experimental. Only the ones that + are actually *used* have been tested. So be careful to test any + that you use. Looking at the output of the preprocessor, "gcc -E" + (possibly piped though "indent"), might help too. Also: these + macros define some internal (local) variables that start with + "_". */ + +/* we enclose macro definitions whose body consists of more than one + statement in MACRO_BEGIN and MACRO_END, rather than '{' and '}'. The + reason is that we want to be able to use the macro in a context + such as "if (...) macro(...); else ...". If we didn't use this obscure + trick, we'd have to omit the ";" in such cases. */ + +#define MACRO_BEGIN do { +#define MACRO_END } while (0) + +/* ---------------------------------------------------------------------- */ +/* macros for singly-linked lists */ + +/* traverse list. At the end, elt is set to NULL. */ +#define list_forall(elt, list) for (elt=list; elt!=NULL; elt=elt->next) + +/* set elt to the first element of list satisfying boolean condition + c, or NULL if not found */ +#define list_find(elt, list, c) \ + MACRO_BEGIN list_forall(elt, list) if (c) break; MACRO_END + +/* like forall, except also set hook for elt. */ +#define list_forall2(elt, list, hook) \ + for (elt=list, hook=&list; elt!=NULL; hook=&elt->next, elt=elt->next) + +/* same as list_find, except also set hook for elt. */ +#define list_find2(elt, list, c, hook) \ + MACRO_BEGIN list_forall2(elt, list, hook) if (c) break; MACRO_END + +/* same, except only use hook. */ +#define _list_forall_hook(list, hook) \ + for (hook=&list; *hook!=NULL; hook=&(*hook)->next) + +/* same, except only use hook. Note: c may only refer to *hook, not elt. */ +#define _list_find_hook(list, c, hook) \ + MACRO_BEGIN _list_forall_hook(list, hook) if (c) break; MACRO_END + +/* insert element after hook */ +#define list_insert_athook(elt, hook) \ + MACRO_BEGIN elt->next = *hook; *hook = elt; MACRO_END + +/* insert element before hook */ +#define list_insert_beforehook(elt, hook) \ + MACRO_BEGIN elt->next = *hook; *hook = elt; hook=&elt->next; MACRO_END + +/* unlink element after hook, let elt be unlinked element, or NULL. + hook remains. */ +#define list_unlink_athook(list, elt, hook) \ + MACRO_BEGIN \ + elt = hook ? *hook : NULL; if (elt) { *hook = elt->next; elt->next = NULL; }\ + MACRO_END + +/* unlink the specific element, if it is in the list. Otherwise, set + elt to NULL */ +#define list_unlink(listtype, list, elt) \ + MACRO_BEGIN \ + listtype **_hook; \ + _list_find_hook(list, *_hook==elt, _hook); \ + list_unlink_athook(list, elt, _hook); \ + MACRO_END + +/* prepend elt to list */ +#define list_prepend(list, elt) \ + MACRO_BEGIN elt->next = list; list = elt; MACRO_END + +/* append elt to list. */ +#define list_append(listtype, list, elt) \ + MACRO_BEGIN \ + listtype **_hook; \ + _list_forall_hook(list, _hook) {} \ + list_insert_athook(elt, _hook); \ + MACRO_END + +/* unlink the first element that satisfies the condition. */ +#define list_unlink_cond(listtype, list, elt, c) \ + MACRO_BEGIN \ + listtype **_hook; \ + list_find2(elt, list, c, _hook); \ + list_unlink_athook(list, elt, _hook); \ + MACRO_END + +/* let elt be the nth element of the list, starting to count from 0. + Return NULL if out of bounds. */ +#define list_nth(elt, list, n) \ + MACRO_BEGIN \ + int _x; /* only evaluate n once */ \ + for (_x=(n), elt=list; _x && elt; _x--, elt=elt->next) {} \ + MACRO_END + +/* let elt be the nth element of the list, starting to count from 0. + Return NULL if out of bounds. */ +#define list_nth_hook(elt, list, n, hook) \ + MACRO_BEGIN \ + int _x; /* only evaluate n once */ \ + for (_x=(n), elt=list, hook=&list; _x && elt; _x--, hook=&elt->next, elt=elt->next) {} \ + MACRO_END + +/* set n to the length of the list */ +#define list_length(listtype, list, n) \ + MACRO_BEGIN \ + listtype *_elt; \ + n=0; \ + list_forall(_elt, list) \ + n++; \ + MACRO_END + +/* set n to the index of the first element satisfying cond, or -1 if + none found. Also set elt to the element, or NULL if none found. */ +#define list_index(list, n, elt, c) \ + MACRO_BEGIN \ + n=0; \ + list_forall(elt, list) { \ + if (c) break; \ + n++; \ + } \ + if (!elt) \ + n=-1; \ + MACRO_END + +/* set n to the number of elements in the list that satisfy condition c */ +#define list_count(list, n, elt, c) \ + MACRO_BEGIN \ + n=0; \ + list_forall(elt, list) { \ + if (c) n++; \ + } \ + MACRO_END + +/* let elt be each element of the list, unlinked. At the end, set list=NULL. */ +#define list_forall_unlink(elt, list) \ + for (elt=list; elt ? (list=elt->next, elt->next=NULL), 1 : 0; elt=list) + +/* reverse a list (efficient) */ +#define list_reverse(listtype, list) \ + MACRO_BEGIN \ + listtype *_list1=NULL, *elt; \ + list_forall_unlink(elt, list) \ + list_prepend(_list1, elt); \ + list = _list1; \ + MACRO_END + +/* insert the element ELT just before the first element TMP of the + list for which COND holds. Here COND must be a condition of ELT and + TMP. Typical usage is to insert an element into an ordered list: + for instance, list_insert_ordered(listtype, list, elt, tmp, + elt->size <= tmp->size). Note: if we give a "less than or equal" + condition, the new element will be inserted just before a sequence + of equal elements. If we give a "less than" condition, the new + element will be inserted just after a list of equal elements. + Note: it is much more efficient to construct a list with + list_prepend and then order it with list_merge_sort, than to + construct it with list_insert_ordered. */ +#define list_insert_ordered(listtype, list, elt, tmp, cond) \ + MACRO_BEGIN \ + listtype **_hook; \ + _list_find_hook(list, (tmp=*_hook, (cond)), _hook); \ + list_insert_athook(elt, _hook); \ + MACRO_END + +/* sort the given list, according to the comparison condition. + Typical usage is list_sort(listtype, list, a, b, a->size < + b->size). Note: if we give "less than or equal" condition, each + segment of equal elements will be reversed in order. If we give a + "less than" condition, each segment of equal elements will retain + the original order. The latter is slower but sometimes + prettier. Average running time: n*n/2. */ +#define list_sort(listtype, list, a, b, cond) \ + MACRO_BEGIN \ + listtype *_newlist=NULL; \ + list_forall_unlink(a, list) \ + list_insert_ordered(listtype, _newlist, a, b, cond); \ + list = _newlist; \ + MACRO_END + +/* a much faster sort algorithm (merge sort, n log n worst case). It + is required that the list type has an additional, unused next1 + component. Note there is no curious reversal of order of equal + elements as for list_sort. */ + +#define list_mergesort(listtype, list, a, b, cond) \ + MACRO_BEGIN \ + listtype *_elt, **_hook1; \ + \ + for (_elt=list; _elt; _elt=_elt->next1) { \ + _elt->next1 = _elt->next; \ + _elt->next = NULL; \ + } \ + do { \ + _hook1 = &(list); \ + while ((a = *_hook1) != NULL && (b = a->next1) != NULL ) { \ + _elt = b->next1; \ + _list_merge_cond(listtype, a, b, cond, *_hook1); \ + _hook1 = &((*_hook1)->next1); \ + *_hook1 = _elt; \ + } \ + } while (_hook1 != &(list)); \ + MACRO_END + +/* merge two sorted lists. Store result at &result */ +#define _list_merge_cond(listtype, a, b, cond, result) \ + MACRO_BEGIN \ + listtype **_hook; \ + _hook = &(result); \ + while (1) { \ + if (a==NULL) { \ + *_hook = b; \ + break; \ + } else if (b==NULL) { \ + *_hook = a; \ + break; \ + } else if (cond) { \ + *_hook = a; \ + _hook = &(a->next); \ + a = a->next; \ + } else { \ + *_hook = b; \ + _hook = &(b->next); \ + b = b->next; \ + } \ + } \ + MACRO_END + +/* ---------------------------------------------------------------------- */ +/* macros for doubly-linked lists */ + +#define dlist_append(head, end, elt) \ + MACRO_BEGIN \ + elt->prev = end; \ + elt->next = NULL; \ + if (end) { \ + end->next = elt; \ + } else { \ + head = elt; \ + } \ + end = elt; \ + MACRO_END + +/* let elt be each element of the list, unlinked. At the end, set list=NULL. */ +#define dlist_forall_unlink(elt, head, end) \ + for (elt=head; elt ? (head=elt->next, elt->next=NULL, elt->prev=NULL), 1 : (end=NULL, 0); elt=head) + +/* unlink the first element of the list */ +#define dlist_unlink_first(head, end, elt) \ + MACRO_BEGIN \ + elt = head; \ + if (head) { \ + head = head->next; \ + if (head) { \ + head->prev = NULL; \ + } else { \ + end = NULL; \ + } \ + elt->prev = NULL; \ + elt->next = NULL; \ + } \ + MACRO_END + +#endif /* _PS_LISTS_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/lzw.c b/Build/source/libs/potrace/potrace-1.11/src/lzw.c new file mode 100644 index 00000000000..236a011abbe --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/lzw.c @@ -0,0 +1,411 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +/* code for adaptive LZW compression, as used in PostScript. */ + +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> +#include <string.h> + +#include "lists.h" +#include "bitops.h" +#include "lzw.h" + +/* ---------------------------------------------------------------------- */ +/* compression state specification */ + +/* The compression algorithm follows the following specification, + expressed as a state machine. A state is a triple {s,d,n}, where s + is a string of input symbols, d is a dictionary, which is a + function from strings to output symbols, and n is the dictionary + size, or equivalently, the next unused output symbol. There are + also special states init and stop. emit[b, code] is a function + which emits the code 'code' as a b-bit value into the output + bitstream. hibit(n) returns the least number of binary digits + required to represent n. + + init ---> {[], newdict, 258} + + where [] is the empty string, and newdict maps each of the 256 + singleton strings to itself. (Note that there are two special + output symbols 256 and 257, so that the next available one is + 258). Note: hibit(258)=9. + + {[], d, n} (input c) ---> (emit[hibit(n), 256]) {c, d, n} + + {s,d,n} (input c) ---> {s*c,d,n} + + if s!=[], s*c is in the domain of d. Here s*c is the strings s + extended by the character c. + + {s,d,n} (input c) ---> (emit[hibit(n), d(s)]) {c,d',n+1} + + if s!=[], s*c is not in the domain of d, and hibit(n+2) <= 12. + Here d'=d+{s*c->n}. + + {s,d,n} (input c) ---> + (emit[hibit(n), d(s)]) (emit[hibit(n+1), 256]) {c, newdict, 258} + + if s!=[], s*c is not in the domain of d, and hibit(n+2) > 12. + + {s,d,n} (input EOD) ---> (emit[hibit(n), d(s)]) (emit[hibit(n+1), 257]) stop + + where s != []. Here, EOD stands for end-of-data. + + {[],d,n} (input EOD) ---> (emit[hibit(n), 256]) (emit[hibit(n), 257]) stop + + Notes: + + * Each reachable state {s,d,n} satisfies hibit(n+1) <= 12. + * Only codes of 12 or fewer bits are emitted. + * Each reachable state {s,d,n} satisfies s=[] or s is in the domain of d. + * The domain of d is always prefix closed (except for the empty prefix) + * The state machine is deterministic and non-blocking. + +*/ + + +/* ---------------------------------------------------------------------- */ +/* private state */ + +#define BITBUF_TYPE unsigned int + +/* the dictionary is implemented as a tree of strings under the prefix + order. The tree is in turns represented as a linked list of + lzw_dict_t structures, with "children" pointing to a node's first + child, and "next" pointing to a node's next sibling. As an + optimization, the top-level nodes (singleton strings) are + implemented lazily, i.e., the corresponding entry is not actually + created until it is accessed. */ + +struct lzw_dict_s { + char c; /* last character of string represented by this entry */ + int code; /* code for the string represented by this entry */ + int freq; /* how often searched? For optimization only */ + struct lzw_dict_s *children; /* list of sub-entries */ + struct lzw_dict_s *next; /* for making a linked list */ +}; +typedef struct lzw_dict_s lzw_dict_t; + +/* A state {s,d,n} is represented by the "dictionary state" part of + the lzw_state_t structure. Here, s is a pointer directly to the node + of the dictionary structure corresponding to the string s, or NULL + if s=[]. Further, the lzw_state_t structure contains a buffer of + pending output bits, and a flag indicating whether the EOD (end of + data) has been reached in the input. */ + +struct lzw_state_s { + /* dictionary state */ + int n; /* current size of the dictionary */ + lzw_dict_t *d; /* pointer to dictionary */ + lzw_dict_t *s; /* pointer to current string, or NULL at beginning */ + + /* buffers for pending output */ + BITBUF_TYPE buf; /* bits scheduled for output - left aligned, 0 padded */ + int bufsize; /* number of bits scheduled for output. */ + int eod; /* flush buffer? */ +}; +typedef struct lzw_state_s lzw_state_t; + +/* ---------------------------------------------------------------------- */ +/* auxiliary functions which operate on dictionary states */ + +/* recursively free an lzw_dict_t object */ +static void lzw_free_dict(lzw_dict_t *s) { + lzw_dict_t *e; + + list_forall_unlink(e, s) { + lzw_free_dict(e->children); + free(e); + } +} + +/* re-initialize the lzw state's dictionary state to "newdict", + freeing any old dictionary. */ +static void lzw_clear_table(lzw_state_t *st) { + + lzw_free_dict(st->d); + st->d = NULL; + st->n = 258; + st->s = NULL; +} + +/* ---------------------------------------------------------------------- */ +/* auxiliary functions for reading/writing the bit buffer */ + +/* write the code to the bit buffer. Precondition st->bufsize <= 7. + Note: this does not change the dictionary state; in particular, + n must be updated between consecutive calls. */ +static inline void lzw_emit(int code, lzw_state_t *st) { + BITBUF_TYPE mask; + int bits = hibit(st->n); + + /* fill bit buffer */ + mask = (1 << bits) - 1; + code &= mask; + + st->buf |= code << (8*sizeof(BITBUF_TYPE) - st->bufsize - bits); + st->bufsize += bits; +} + +/* transfer one byte from bit buffer to output. Precondition: + s->avail_out > 0. */ +static inline void lzw_read_bitbuf(lzw_stream_t *s) { + int ch; + lzw_state_t *st = (lzw_state_t *)s->internal; + + ch = st->buf >> (8*sizeof(BITBUF_TYPE)-8); + st->buf <<= 8; + st->bufsize -= 8; + + s->next_out[0] = ch; + s->next_out++; + s->avail_out--; +} + +/* ---------------------------------------------------------------------- */ +/* The following functions implement the state machine. */ + +/* perform state transition of the state st on input character + ch. This updates the dictionary state and/or writes to the bit + buffer. Precondition: st->bufsize <= 7. Return 0 on success, or 1 + on error with errno set. */ +static int lzw_encode_char(lzw_state_t *st, char c) { + lzw_dict_t *e; + + /* st = {s,d,n}. hibit(n+1)<=12. */ + + /* {[], d, n} (input c) ---> (emit[hibit(n), 256]) {c, d, n} */ + if (st->s == NULL) { + lzw_emit(256, st); + goto singleton; /* enter singleton state c */ + } + + /* {s,d,n} (input c) ---> {s*c,d,n} */ + list_find(e, st->s->children, e->c == c); + if (e) { + e->freq++; + st->s = e; + return 0; + } + + /* {s,d,n} (input c) ---> (emit[hibit(n), d(s)]) {c,d',n+1} */ + /* {s,d,n} (input c) ---> + (emit[hibit(n), d(s)]) (emit[hibit(n+1), 256]) {c, newdict, 258} */ + + lzw_emit(st->s->code, st); /* 9-12 bits */ + if (st->n >= 4094) { /* hibit(n+2) > 12 */ + st->n++; + lzw_emit(256, st); + goto dictfull; /* reset dictionary and enter singleton state c */ + } + + /* insert new code in dictionary, if possible */ + e = (lzw_dict_t *)malloc(sizeof(lzw_dict_t)); + if (!e) { + return 1; + } + e->c = c; + e->code = st->n; + e->freq = 1; + e->children = NULL; + list_prepend(st->s->children, e); + st->n++; + goto singleton; /* enter singleton state c */ + + dictfull: /* reset dictionary and enter singleton state c */ + lzw_clear_table(st); + /* fall through */ + + singleton: /* enter singleton state c */ + list_find(e, st->d, e->c == c); + if (!e) { /* not found: lazily add it */ + e = (lzw_dict_t *)malloc(sizeof(lzw_dict_t)); + if (!e) { + return 1; + } + e->c = c; + e->code = (int)(unsigned char)c; + e->freq = 0; + e->children = NULL; + list_prepend(st->d, e); + } + e->freq++; + st->s = e; + return 0; +} + +/* perform state transition of the state st on input EOD. The leaves + the dictionary state undefined and writes to the bit buffer. + Precondition: st->bufsize <= 7. This function must be called + exactly once, at the end of the stream. */ +static void lzw_encode_eod(lzw_state_t *st) { + + /* {[],d,n} (input EOD) ---> + (emit[hibit(n), 256]) (emit[hibit(n), 257]) stop */ + if (st->s == NULL) { + lzw_emit(256, st); /* 9 bits */ + st->n=258; + lzw_emit(257, st); /* 9 bits */ + return; + } + + /* {s,d,n} (input EOD) ---> + (emit[hibit(n), code]) (emit[hibit(n+1), 257]) stop */ + + lzw_emit(st->s->code, st); /* 9-12 bits */ + st->n++; + lzw_emit(257, st); /* 9-12 bits */ + return; +} + +/* ---------------------------------------------------------------------- */ +/* User visible functions. These implement a buffer interface. See + lzw.h for the API description. */ + +lzw_stream_t *lzw_init(void) { + lzw_stream_t *s = NULL; + lzw_state_t *st = NULL; + + s = (lzw_stream_t *)malloc(sizeof(lzw_stream_t)); + if (s==NULL) { + goto fail; + } + st = (lzw_state_t *)malloc(sizeof(lzw_state_t)); + if (st==NULL) { + goto fail; + } + st->buf = 0; + st->bufsize = 0; + st->eod = 0; + st->d = NULL; + lzw_clear_table(st); + s->internal = (void *) st; + return s; + + fail: + free(s); + free(st); + return NULL; +} + +int lzw_compress(lzw_stream_t *s, int mode) { + int r; + lzw_state_t *st = (lzw_state_t *)s->internal; + + while (st->eod == 0) { + /* empty bit buffer */ + while (st->bufsize > 7) { + if (s->avail_out == 0) { + return 0; + } else { + lzw_read_bitbuf(s); + } + } + /* fill bit buffer */ + if (s->avail_in == 0) { + break; + } else { + r = lzw_encode_char(st, s->next_in[0]); + if (r) { + if (r==2) { + errno = EINVAL; + } + return 1; + } + s->next_in++; + s->avail_in--; + } + } + + if (mode==LZW_EOD && st->eod == 0) { + st->eod = 1; + lzw_encode_eod(st); + } + + /* flush bit buffer */ + if (st->eod) { + while (st->bufsize > 0) { + if (s->avail_out == 0) { + return 0; + } else { + lzw_read_bitbuf(s); + } + } + } + + return 0; +} + +void lzw_free(lzw_stream_t *s) { + lzw_state_t *st = (lzw_state_t *)s->internal; + + lzw_free_dict(st->d); + free(st); + free(s); +} + +/* ---------------------------------------------------------------------- */ +/* main function for testing and illustration purposes */ + +#ifdef LZW_MAIN + +int main() { + lzw_stream_t *s; + int ch; + char inbuf[100]; + char outbuf[100]; + int i, r; + int mode; + + s = lzw_init(); + if (!s) { + goto error; + } + mode = LZW_NORMAL; + + while (1) { + /* fill inbuf */ + for (i=0; i<100; i++) { + ch = fgetc(stdin); + if (ch==EOF) { + break; + } + inbuf[i] = ch; + } + if (i<100) { /* end of input */ + mode = LZW_EOD; + } + + /* compress */ + s->next_in = inbuf; + s->avail_in = i; + do { + s->next_out = outbuf; + s->avail_out = 100; + r = lzw_compress(s, mode); + if (r) { + goto error; + } + fwrite(outbuf, 1, 100-s->avail_out, stdout); + } while (s->avail_out==0); + if (mode == LZW_EOD) { + break; + } + } + fflush(stdout); + lzw_free(s); + + return 0; + + error: + fprintf(stderr, "lzw: %s\n", strerror(errno)); + lzw_free(s); + return 1; + +} +#endif + diff --git a/Build/source/libs/potrace/potrace-1.11/src/lzw.h b/Build/source/libs/potrace/potrace-1.11/src/lzw.h new file mode 100644 index 00000000000..3721f11be48 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/lzw.h @@ -0,0 +1,50 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#define LZW_NORMAL 0 +#define LZW_EOD 1 + +/* user visible state */ + +struct lzw_stream_s { + char *next_in; /* pointer to next input character */ + int avail_in; /* number of input chars available */ + char *next_out; /* pointer to next free byte in output buffer */ + int avail_out; /* remaining size of output buffer */ + + void *internal; /* internal state, not user accessible */ +}; +typedef struct lzw_stream_s lzw_stream_t; + +/* user visible functions */ + +/* The interface for compression and decompression is the same. The + application must first call lzw_init to create and initialize a + compression object. Then it calls lzw_compress on this object + repeatedly, as follows: next_in and next_out must point to valid, + non-overlapping regions of memory of size at least avail_in and + avail_out, respectively. The lzw_compress function will read and + process as many input bytes as possible as long as there is room in + the output buffer. It will update next_in, avail_in, next_out, and + avail_out accordingly. Some input may be consumed without producing + any output, or some output may be produced without consuming any + input. However, the lzw_compress function makes progress in the + sense that, after calling this function, at least one of avail_in + or avail_out is guaranteed to be 0. The mode flag is normally set + to LZW_NORMAL. It can be set to LZW_EOD (end of data) to indicate + that the current input buffer represents the entire remaining input + data stream. When called with mode=LZW_EOD, and avail_out is + non-zero after the call, then the application may conclude that the + end of output has been reached. (However, if avail_out==0 after the + call, then lzw_compress should be called again with the remaining + input, if any). Finally, lzw_free should be called to deallocate + the lzw_stream. Lzw_init returns NULL on error, with errno + set. Lzw_compress returns 0 on success, and 1 on error with errno + set. EINVAL is used to indicate an internal error, which should not + happen. */ + +lzw_stream_t *lzw_init(void); +int lzw_compress(lzw_stream_t *s, int mode); +void lzw_free(lzw_stream_t *s); diff --git a/Build/source/libs/potrace/potrace-1.11/src/main.c b/Build/source/libs/potrace/potrace-1.11/src/main.c new file mode 100644 index 00000000000..1c9913d4290 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/main.c @@ -0,0 +1,1266 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> +#include <getopt.h> +#include <math.h> + +#include "main.h" +#include "potracelib.h" +#include "backend_pdf.h" +#include "backend_eps.h" +#include "backend_pgm.h" +#include "backend_svg.h" +#include "backend_xfig.h" +#include "backend_dxf.h" +#include "backend_geojson.h" +#include "potracelib.h" +#include "bitmap_io.h" +#include "bitmap.h" +#include "platform.h" +#include "auxiliary.h" +#include "progress_bar.h" +#include "trans.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#define UNDEF ((double)(1e30)) /* a value to represent "undefined" */ + +struct info_s info; + +/* ---------------------------------------------------------------------- */ +/* some data structures for option processing */ + +struct pageformat_s { + char *name; + int w, h; +}; +typedef struct pageformat_s pageformat_t; + +/* dimensions of the various page formats, in postscript points */ +static pageformat_t pageformat[] = { + { "a4", 595, 842 }, + { "a3", 842, 1191 }, + { "a5", 421, 595 }, + { "b5", 516, 729 }, + { "letter", 612, 792 }, + { "legal", 612, 1008 }, + { "tabloid", 792, 1224 }, + { "statement", 396, 612 }, + { "executive", 540, 720 }, + { "folio", 612, 936 }, + { "quarto", 610, 780 }, + { "10x14", 720, 1008 }, + { NULL, 0, 0 }, +}; + +struct turnpolicy_s { + char *name; + int n; +}; +typedef struct turnpolicy_s turnpolicy_t; + +/* names of turn policies */ +static turnpolicy_t turnpolicy[] = { + {"black", POTRACE_TURNPOLICY_BLACK}, + {"white", POTRACE_TURNPOLICY_WHITE}, + {"left", POTRACE_TURNPOLICY_LEFT}, + {"right", POTRACE_TURNPOLICY_RIGHT}, + {"minority", POTRACE_TURNPOLICY_MINORITY}, + {"majority", POTRACE_TURNPOLICY_MAJORITY}, + {"random", POTRACE_TURNPOLICY_RANDOM}, + {NULL, 0}, +}; + +/* backends and their characteristics */ +struct backend_s { + char *name; /* name of this backend */ + char *ext; /* file extension */ + int fixed; /* fixed page size backend? */ + int pixel; /* pixel-based backend? */ + int multi; /* multi-page backend? */ + int (*init_f)(FILE *fout); /* initialization function */ + int (*page_f)(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo); + /* per-bitmap function */ + int (*term_f)(FILE *fout); /* finalization function */ + int opticurve; /* opticurve capable (true Bezier curves?) */ +}; +typedef struct backend_s backend_t; + +static backend_t backend[] = { + { "eps", ".eps", 0, 0, 0, NULL, page_eps, NULL, 1 }, + { "postscript", ".ps", 1, 0, 1, init_ps, page_ps, term_ps, 1 }, + { "ps", ".ps", 1, 0, 1, init_ps, page_ps, term_ps, 1 }, + { "pdf", ".pdf", 0, 0, 1, init_pdf, page_pdf, term_pdf, 1 }, + { "pdfpage", ".pdf", 1, 0, 1, init_pdf, page_pdfpage, term_pdf, 1 }, + { "svg", ".svg", 0, 0, 0, NULL, page_svg, NULL, 1 }, + { "dxf", ".dxf", 0, 1, 0, NULL, page_dxf, NULL, 1 }, + { "geojson", ".json",0, 1, 0, NULL, page_geojson, NULL, 1 }, + { "pgm", ".pgm", 0, 1, 1, NULL, page_pgm, NULL, 1 }, + { "gimppath", ".svg", 0, 1, 0, NULL, page_gimp, NULL, 1 }, + { "xfig", ".fig", 1, 0, 0, NULL, page_xfig, NULL, 0 }, + { NULL, NULL, 0, 0, 0, NULL, NULL, NULL, 0 }, +}; + +/* look up a backend by name. If found, return 0 and set *bp. If not + found leave *bp unchanged and return 1, or 2 on ambiguous + prefix. */ +static int backend_lookup(char *name, backend_t **bp) { + int i; + int m=0; /* prefix matches */ + backend_t *b = NULL; + + for (i=0; backend[i].name; i++) { + if (strcasecmp(backend[i].name, name)==0) { + *bp = &backend[i]; + return 0; + } else if (strncasecmp(backend[i].name, name, strlen(name))==0) { + m++; + b = &backend[i]; + } + } + /* if there was no exact match, and exactly one prefix match, use that */ + if (m==1) { + *bp = b; + return 0; + } else if (m) { + return 2; + } else { + return 1; + } +} + +/* list all available backends by name, in a comma separated list. + Assume the cursor starts in column j, and break lines at length + linelen. Do not output any trailing punctuation. Return the column + the cursor is in. */ +static int backend_list(FILE *fout, int j, int linelen) { + int i; + + for (i=0; backend[i].name; i++) { + if (j + (int)strlen(backend[i].name) > linelen) { + fprintf(fout, "\n"); + j = 0; + } + j += fprintf(fout, "%s", backend[i].name); + if (backend[i+1].name) { + j += fprintf(fout, ", "); + } + } + return j; +} + +/* ---------------------------------------------------------------------- */ +/* some info functions */ + +static void license(FILE *f) { + fprintf(f, + "This program is free software; you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation; either version 2 of the License, or\n" + "(at your option) any later version.\n" + "\n" + "This program is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU General Public License for more details.\n" + "\n" + "You should have received a copy of the GNU General Public License\n" + "along with this program; if not, write to the Free Software\n" + "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n" + ); +} + +static void show_defaults(FILE *f) { + fprintf(f, "Default unit: "DEFAULT_DIM_NAME"\n"); + fprintf(f, "Default page size: "DEFAULT_PAPERFORMAT"\n"); +} + +static void usage(FILE *f) { + int j; + + fprintf(f, "Usage: "POTRACE" [options] [filename...]\n"); + fprintf(f, "General options:\n"); + fprintf(f, " -h, --help - print this help message and exit\n"); + fprintf(f, " -v, --version - print version info and exit\n"); + fprintf(f, " -l, --license - print license info and exit\n"); + fprintf(f, "File selection:\n"); + fprintf(f, " <filename> - an input file\n"); + fprintf(f, " -o, --output <filename> - write all output to this file\n"); + fprintf(f, " -- - end of options; 0 or more input filenames follow\n"); + fprintf(f, "Backend selection:\n"); + fprintf(f, " -b, --backend <name> - select backend by name\n"); + fprintf(f, " -e, --eps - EPS backend (encapsulated PostScript) (default)\n"); + fprintf(f, " -p, --postscript - PostScript backend\n"); + fprintf(f, " -s, --svg - SVG backend (scalable vector graphics)\n"); + fprintf(f, " -g, --pgm - PGM backend (portable greymap)\n"); + fprintf(f, " -b pdf - PDF backend (portable document format)\n"); + fprintf(f, " -b pdfpage - fixed page-size PDF backend\n"); + fprintf(f, " -b dxf - DXF backend (drawing interchange format)\n"); + fprintf(f, " -b geojson - GeoJSON backend\n"); + fprintf(f, " -b gimppath - Gimppath backend (GNU Gimp)\n"); + fprintf(f, " -b xfig - XFig backend\n"); + fprintf(f, "Algorithm options:\n"); + fprintf(f, " -z, --turnpolicy <policy> - how to resolve ambiguities in path decomposition\n"); + fprintf(f, " -t, --turdsize <n> - suppress speckles of up to this size (default 2)\n"); + fprintf(f, " -a, --alphamax <n> - corner threshold parameter (default 1)\n"); + fprintf(f, " -n, --longcurve - turn off curve optimization\n"); + fprintf(f, " -O, --opttolerance <n> - curve optimization tolerance (default 0.2)\n"); + fprintf(f, " -u, --unit <n> - quantize output to 1/unit pixels (default 10)\n"); + fprintf(f, " -d, --debug <n> - produce debugging output of type n (n=1,2,3)\n"); + fprintf(f, "Scaling and placement options:\n"); + fprintf(f, " -P, --pagesize <format> - page size (default is "DEFAULT_PAPERFORMAT")\n"); + fprintf(f, " -W, --width <dim> - width of output image\n"); + fprintf(f, " -H, --height <dim> - height of output image\n"); + fprintf(f, " -r, --resolution <n>[x<n>] - resolution (in dpi) (dimension-based backends)\n"); + fprintf(f, " -x, --scale <n>[x<n>] - scaling factor (pixel-based backends)\n"); + fprintf(f, " -S, --stretch <n> - yresolution/xresolution\n"); + fprintf(f, " -A, --rotate <angle> - rotate counterclockwise by angle\n"); + fprintf(f, " -M, --margin <dim> - margin\n"); + fprintf(f, " -L, --leftmargin <dim> - left margin\n"); + fprintf(f, " -R, --rightmargin <dim> - right margin\n"); + fprintf(f, " -T, --topmargin <dim> - top margin\n"); + fprintf(f, " -B, --bottommargin <dim> - bottom margin\n"); + fprintf(f, " --tight - remove whitespace around the input image\n"); + fprintf(f, "Color options, supported by some backends:\n"); + fprintf(f, " -C, --color #rrggbb - set foreground color (default black)\n"); + fprintf(f, " --fillcolor #rrggbb - set fill color (default transparent)\n"); + fprintf(f, " --opaque - make white shapes opaque\n"); + fprintf(f, "SVG options:\n"); + fprintf(f, " --group - group related paths together\n"); + fprintf(f, " --flat - whole image as a single path\n"); + fprintf(f, "Postscript/EPS/PDF options:\n"); + fprintf(f, " -c, --cleartext - do not compress the output\n"); + fprintf(f, " -2, --level2 - use postscript level 2 compression (default)\n"); +#ifdef HAVE_ZLIB + fprintf(f, " -3, --level3 - use postscript level 3 compression\n"); +#endif + fprintf(f, " -q, --longcoding - do not optimize for file size\n"); + fprintf(f, "PGM options:\n"); + fprintf(f, " -G, --gamma <n> - gamma value for anti-aliasing (default 2.2)\n"); + fprintf(f, "Frontend options:\n"); + fprintf(f, " -k, --blacklevel <n> - black/white cutoff in input file (default 0.5)\n"); + fprintf(f, " -i, --invert - invert bitmap\n"); + fprintf(f, "Progress bar options:\n"); + fprintf(f, " --progress - show progress bar\n"); + fprintf(f, " --tty <mode> - progress bar rendering: vt100 or dumb\n"); + fprintf(f, "\n"); + fprintf(f, "Dimensions can have optional units, e.g. 6.5in, 15cm, 100pt.\n"); + fprintf(f, "Default is "DEFAULT_DIM_NAME" (or pixels for pgm, dxf, and gimppath backends).\n"); + fprintf(f, "Possible input file formats are: pnm (pbm, pgm, ppm), bmp.\n"); + j = fprintf(f, "Backends are: "); + backend_list(f, j, 78); + fprintf(f, ".\n"); +} + +/* ---------------------------------------------------------------------- */ +/* auxiliary functions for parameter parsing */ + +/* parse a dimension of the kind "1.5in", "7cm", etc. Return result in + postscript points (=1/72 in). If endptr!=NULL, store pointer to + next character in *endptr in the manner of strtod(3). */ +static dim_t parse_dimension(char *s, char **endptr) { + char *p; + dim_t res; + + res.x = strtod(s, &p); + res.d = 0; + if (p!=s) { + if (!strncasecmp(p, "in", 2)) { + res.d = DIM_IN; + p += 2; + } else if (!strncasecmp(p, "cm", 2)) { + res.d = DIM_CM; + p += 2; + } else if (!strncasecmp(p, "mm", 2)) { + res.d = DIM_MM; + p += 2; + } else if (!strncasecmp(p, "pt", 2)) { + res.d = DIM_PT; + p += 2; + } + } + if (endptr!=NULL) { + *endptr = p; + } + return res; +} + +/* parse a pair of dimensions, such as "8.5x11in", "30mmx4cm" */ +static void parse_dimensions(char *s, char **endptr, dim_t *dxp, dim_t *dyp) { + char *p, *q; + dim_t dx, dy; + + dx = parse_dimension(s, &p); + if (p==s) { + goto fail; + } + if (*p != 'x') { + goto fail; + } + p++; + dy = parse_dimension(p, &q); + if (q==p) { + goto fail; + } + if (dx.d && !dy.d) { + dy.d = dx.d; + } else if (!dx.d && dy.d) { + dx.d = dy.d; + } + *dxp = dx; + *dyp = dy; + if (endptr != NULL) { + *endptr = q; + } + return; + + fail: + dx.x = dx.d = dy.x = dy.d = 0; + *dxp = dx; + *dyp = dy; + if (endptr != NULL) { + *endptr = s; + } + return; +} + +static inline double double_of_dim(dim_t d, double def) { + if (d.d) { + return d.x * d.d; + } else { + return d.x * def; + } +} + +static int parse_color(char *s) { + int i, d; + int col = 0; + + if (s[0] != '#' || strlen(s) != 7) { + return -1; + } + for (i=0; i<6; i++) { + d = s[6-i]; + if (d >= '0' && d <= '9') { + col |= (d-'0') << (4*i); + } else if (d >= 'a' && d <= 'f') { + col |= (d-'a'+10) << (4*i); + } else if (d >= 'A' && d <= 'F') { + col |= (d-'A'+10) << (4*i); + } else { + return -1; + } + } + return col; +} + +/* ---------------------------------------------------------------------- */ +/* option processing */ + +/* codes for options that don't have short form */ +enum { + OPT_TIGHT = 300, + OPT_FILLCOLOR, + OPT_OPAQUE, + OPT_GROUP, + OPT_FLAT, + OPT_PROGRESS, + OPT_TTY +}; + +static struct option longopts[] = { + {"help", 0, 0, 'h'}, + {"version", 0, 0, 'v'}, + {"show-defaults", 0, 0, 'V'}, /* undocumented option for compatibility */ + {"license", 0, 0, 'l'}, + {"width", 1, 0, 'W'}, + {"height", 1, 0, 'H'}, + {"resolution", 1, 0, 'r'}, + {"scale", 1, 0, 'x'}, + {"stretch", 1, 0, 'S'}, + {"margin", 1, 0, 'M'}, + {"leftmargin", 1, 0, 'L'}, + {"rightmargin", 1, 0, 'R'}, + {"topmargin", 1, 0, 'T'}, + {"bottommargin", 1, 0, 'B'}, + {"tight", 0, 0, OPT_TIGHT}, + {"rotate", 1, 0, 'A'}, + {"pagesize", 1, 0, 'P'}, + {"turdsize", 1, 0, 't'}, + {"unit", 1, 0, 'u'}, + {"cleartext", 0, 0, 'c'}, + {"level2", 0, 0, '2'}, + {"level3", 0, 0, '3'}, + {"eps", 0, 0, 'e'}, + {"postscript", 0, 0, 'p'}, + {"svg", 0, 0, 's'}, + {"pgm", 0, 0, 'g'}, + {"backend", 1, 0, 'b'}, + {"debug", 1, 0, 'd'}, + {"color", 1, 0, 'C'}, + {"fillcolor", 1, 0, OPT_FILLCOLOR}, + {"turnpolicy", 1, 0, 'z'}, + {"gamma", 1, 0, 'G'}, + {"longcurve", 0, 0, 'n'}, + {"longcoding", 0, 0, 'q'}, + {"alphamax", 1, 0, 'a'}, + {"opttolerance", 1, 0, 'O'}, + {"output", 1, 0, 'o'}, + {"blacklevel", 1, 0, 'k'}, + {"invert", 0, 0, 'i'}, + {"opaque", 0, 0, OPT_OPAQUE}, + {"group", 0, 0, OPT_GROUP}, + {"flat", 0, 0, OPT_FLAT}, + {"progress", 0, 0, OPT_PROGRESS}, + {"tty", 1, 0, OPT_TTY}, + + {0, 0, 0, 0} +}; + +static char *shortopts = "hvVlW:H:r:x:S:M:L:R:T:B:A:P:t:u:c23epsgb:d:C:z:G:nqa:O:o:k:i"; + +static void dopts(int ac, char *av[]) { + int c; + char *p; + int i, j, r; + dim_t dim, dimx, dimy; + int matches, bestmatch; + + /* defaults */ + backend_lookup("eps", &info.backend); + info.debug = 0; + info.width_d.x = UNDEF; + info.height_d.x = UNDEF; + info.rx = UNDEF; + info.ry = UNDEF; + info.sx = UNDEF; + info.sy = UNDEF; + info.stretch = 1; + info.lmar_d.x = UNDEF; + info.rmar_d.x = UNDEF; + info.tmar_d.x = UNDEF; + info.bmar_d.x = UNDEF; + info.angle = 0; + info.paperwidth = DEFAULT_PAPERWIDTH; + info.paperheight = DEFAULT_PAPERHEIGHT; + info.tight = 0; + info.unit = 10; + info.compress = 1; + info.pslevel = 2; + info.color = 0x000000; + info.gamma = 2.2; + info.param = potrace_param_default(); + if (!info.param) { + fprintf(stderr, ""POTRACE": %s\n", strerror(errno)); + exit(1); + } + info.longcoding = 0; + info.outfile = NULL; + info.blacklevel = 0.5; + info.invert = 0; + info.opaque = 0; + info.grouping = 1; + info.fillcolor = 0xffffff; + info.progress = 0; + info.progress_bar = DEFAULT_PROGRESS_BAR; + + while ((c = getopt_long(ac, av, shortopts, longopts, NULL)) != -1) { + switch (c) { + case 'h': + fprintf(stdout, ""POTRACE" "VERSION". Transforms bitmaps into vector graphics.\n\n"); + usage(stdout); + exit(0); + break; + case 'v': + case 'V': + fprintf(stdout, ""POTRACE" "VERSION". Copyright (C) 2001-2013 Peter Selinger.\n"); + fprintf(stdout, "Library version: %s\n", potrace_version()); + show_defaults(stdout); + exit(0); + break; + case 'l': + fprintf(stdout, ""POTRACE" "VERSION". Copyright (C) 2001-2013 Peter Selinger.\n\n"); + license(stdout); + exit(0); + break; + case 'W': + info.width_d = parse_dimension(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid dimension -- %s\n", optarg); + exit(1); + } + break; + case 'H': + info.height_d = parse_dimension(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid dimension -- %s\n", optarg); + exit(1); + } + break; + case 'r': + parse_dimensions(optarg, &p, &dimx, &dimy); + if (*p == 0 && dimx.d == 0 && dimy.d == 0 && dimx.x != 0.0 && dimy.x != 0.0) { + info.rx = dimx.x; + info.ry = dimy.x; + break; + } + dim = parse_dimension(optarg, &p); + if (*p == 0 && dim.d == 0 && dim.x != 0.0) { + info.rx = info.ry = dim.x; + break; + } + fprintf(stderr, ""POTRACE": invalid resolution -- %s\n", optarg); + exit(1); + break; + case 'x': + parse_dimensions(optarg, &p, &dimx, &dimy); + if (*p == 0 && dimx.d == 0 && dimy.d == 0) { + info.sx = dimx.x; + info.sy = dimy.x; + break; + } + dim = parse_dimension(optarg, &p); + if (*p == 0 && dim.d == 0) { + info.sx = info.sy = dim.x; + break; + } + fprintf(stderr, ""POTRACE": invalid scaling factor -- %s\n", optarg); + exit(1); + break; + case 'S': + info.stretch = atof(optarg); + break; + case 'M': + info.lmar_d = parse_dimension(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid dimension -- %s\n", optarg); + exit(1); + } + info.rmar_d = info.tmar_d = info.bmar_d = info.lmar_d; + break; + case 'L': + info.lmar_d = parse_dimension(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid dimension -- %s\n", optarg); + exit(1); + } + break; + case 'R': + info.rmar_d = parse_dimension(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid dimension -- %s\n", optarg); + exit(1); + } + break; + case 'T': + info.tmar_d = parse_dimension(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid dimension -- %s\n", optarg); + exit(1); + } + break; + case 'B': + info.bmar_d = parse_dimension(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid dimension -- %s\n", optarg); + exit(1); + } + break; + case OPT_TIGHT: + info.tight = 1; + break; + case 'A': + info.angle = strtod(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid angle -- %s\n", optarg); + exit(1); + } + break; + case 'P': + matches = 0; + bestmatch = 0; + for (i=0; pageformat[i].name!=NULL; i++) { + if (strcasecmp(pageformat[i].name, optarg)==0) { + matches = 1; + bestmatch = i; + break; + } else if (strncasecmp(pageformat[i].name, optarg, strlen(optarg))==0) { + /* don't allow partial match on "10x14" */ + if (optarg[0] != '1') { + matches++; + bestmatch = i; + } + } + } + if (matches == 1) { + info.paperwidth = pageformat[bestmatch].w; + info.paperheight = pageformat[bestmatch].h; + break; + } + parse_dimensions(optarg, &p, &dimx, &dimy); + if (*p == 0) { + info.paperwidth = (int)rint(double_of_dim(dimx, DEFAULT_DIM)); + info.paperheight = (int)rint(double_of_dim(dimy, DEFAULT_DIM)); + break; + } + if (matches == 0) { + fprintf(stderr, ""POTRACE": unrecognized page format -- %s\n", optarg); + } else { + fprintf(stderr, ""POTRACE": ambiguous page format -- %s\n", optarg); + } + j = fprintf(stderr, "Use one of: "); + for (i=0; pageformat[i].name!=NULL; i++) { + if (j + strlen(pageformat[i].name) > 75) { + fprintf(stderr, "\n"); + j = 0; + } + j += fprintf(stderr, "%s, ", pageformat[i].name); + } + fprintf(stderr, "or specify <dim>x<dim>.\n"); + exit(1); + break; + case 't': + info.param->turdsize = atoi(optarg); + break; + case 'u': + info.unit = strtod(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid unit -- %s\n", optarg); + exit(1); + } + break; + case 'c': + info.pslevel = 2; + info.compress = 0; + break; + case '2': + info.pslevel = 2; + info.compress = 1; + break; + case '3': +#ifdef HAVE_ZLIB + info.pslevel = 3; + info.compress = 1; +#else + fprintf(stderr, ""POTRACE": option -3 not supported, using -2 instead.\n"); + fflush(stderr); + info.pslevel = 2; + info.compress = 1; +#endif + break; + case 'e': + backend_lookup("eps", &info.backend); + break; + case 'p': + backend_lookup("postscript", &info.backend); + break; + case 's': + backend_lookup("svg", &info.backend); + break; + case 'g': + backend_lookup("pgm", &info.backend); + break; + case 'b': + r = backend_lookup(optarg, &info.backend); + if (r==1 || r==2) { + if (r==1) { + fprintf(stderr, ""POTRACE": unrecognized backend -- %s\n", optarg); + } else { + fprintf(stderr, ""POTRACE": ambiguous backend -- %s\n", optarg); + } + j = fprintf(stderr, "Use one of: "); + backend_list(stderr, j, 70); + fprintf(stderr, ".\n"); + exit(1); + } + break; + case 'd': + info.debug = atoi(optarg); + break; + case 'C': + info.color = parse_color(optarg); + if (info.color == -1) { + fprintf(stderr, ""POTRACE": invalid color -- %s\n", optarg); + exit(1); + } + break; + case OPT_FILLCOLOR: + info.fillcolor = parse_color(optarg); + if (info.fillcolor == -1) { + fprintf(stderr, ""POTRACE": invalid color -- %s\n", optarg); + exit(1); + } + info.opaque = 1; + break; + case 'z': + matches = 0; + bestmatch = 0; + for (i=0; turnpolicy[i].name!=NULL; i++) { + if (strcasecmp(turnpolicy[i].name, optarg)==0) { + matches = 1; + bestmatch = i; + break; + } else if (strncasecmp(turnpolicy[i].name, optarg, strlen(optarg))==0) { + matches++; + bestmatch = i; + } + } + if (matches == 1) { + info.param->turnpolicy = turnpolicy[bestmatch].n; + break; + } + if (matches == 0) { + fprintf(stderr, ""POTRACE": unrecognized turnpolicy -- %s\n", optarg); + } else { + fprintf(stderr, ""POTRACE": ambiguous turnpolicy -- %s\n", optarg); + } + j = fprintf(stderr, "Use one of: "); + for (i=0; turnpolicy[i].name!=NULL; i++) { + if (j + strlen(turnpolicy[i].name) > 75) { + fprintf(stderr, "\n"); + j = 0; + } + j += fprintf(stderr, "%s%s", turnpolicy[i].name, turnpolicy[i+1].name ? ", " : ""); + } + fprintf(stderr, ".\n"); + exit(1); + break; + case 'G': + info.gamma = atof(optarg); + break; + case 'n': + info.param->opticurve = 0; + break; + case 'q': + info.longcoding = 1; + break; + case 'a': + info.param->alphamax = strtod(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid alphamax -- %s\n", optarg); + exit(1); + } + break; + case 'O': + info.param->opttolerance = strtod(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid opttolerance -- %s\n", optarg); + exit(1); + } + break; + case 'o': + free(info.outfile); + info.outfile = strdup(optarg); + if (!info.outfile) { + fprintf(stderr, ""POTRACE": %s\n", strerror(errno)); + exit(2); + } + break; + case 'k': + info.blacklevel = strtod(optarg, &p); + if (*p) { + fprintf(stderr, ""POTRACE": invalid blacklevel -- %s\n", optarg); + exit(1); + } + break; + case 'i': + info.invert = 1; + break; + case OPT_OPAQUE: + info.opaque = 1; + break; + case OPT_GROUP: + info.grouping = 2; + break; + case OPT_FLAT: + info.grouping = 0; + break; + case OPT_PROGRESS: + info.progress = 1; + break; + case OPT_TTY: + if (strcmp(optarg, "dumb") == 0) { + info.progress_bar = progress_bar_simplified; + } else if (strcmp(optarg, "vt100") == 0) { + info.progress_bar = progress_bar_vt100; + } else { + fprintf(stderr, ""POTRACE": invalid tty mode -- %s. Try --help for more info\n", optarg); + exit(1); + } + break; + case '?': + fprintf(stderr, "Try --help for more info\n"); + exit(1); + break; + default: + fprintf(stderr, ""POTRACE": Unimplemented option -- %c\n", c); + exit(1); + } + } + info.infiles = &av[optind]; + info.infilecount = ac-optind; + info.some_infiles = info.infilecount ? 1 : 0; + + /* if "--" was used, even an empty list of filenames is considered + "some" filenames. */ + if (strcmp(av[optind-1], "--") == 0) { + info.some_infiles = 1; + } +} + +/* ---------------------------------------------------------------------- */ +/* calculations with bitmap dimensions, positioning etc */ + +/* determine the dimensions of the output based on command line and + image dimensions, and optionally, based on the actual image outline. */ +static void calc_dimensions(imginfo_t *imginfo, potrace_path_t *plist) { + double dim_def; + double maxwidth, maxheight, sc; + int default_scaling = 0; + + /* we take care of a special case: if one of the image dimensions is + 0, we change it to 1. Such an image is empty anyway, so there + will be 0 paths in it. Changing the dimensions avoids division by + 0 error in calculating scaling factors, bounding boxes and + such. This doesn't quite do the right thing in all cases, but it + is better than causing overflow errors or "nan" output in + backends. Human users don't tend to process images of size 0 + anyway; they might occur in some pipelines. */ + if (imginfo->pixwidth == 0) { + imginfo->pixwidth = 1; + } + if (imginfo->pixheight == 0) { + imginfo->pixheight = 1; + } + + /* set the default dimension for width, height, margins */ + if (info.backend->pixel) { + dim_def = DIM_PT; + } else { + dim_def = DEFAULT_DIM; + } + + /* apply default dimension to width, height, margins */ + imginfo->width = info.width_d.x == UNDEF ? UNDEF : double_of_dim(info.width_d, dim_def); + imginfo->height = info.height_d.x == UNDEF ? UNDEF : double_of_dim(info.height_d, dim_def); + imginfo->lmar = info.lmar_d.x == UNDEF ? UNDEF : double_of_dim(info.lmar_d, dim_def); + imginfo->rmar = info.rmar_d.x == UNDEF ? UNDEF : double_of_dim(info.rmar_d, dim_def); + imginfo->tmar = info.tmar_d.x == UNDEF ? UNDEF : double_of_dim(info.tmar_d, dim_def); + imginfo->bmar = info.bmar_d.x == UNDEF ? UNDEF : double_of_dim(info.bmar_d, dim_def); + + /* start with a standard rectangle */ + trans_from_rect(&imginfo->trans, imginfo->pixwidth, imginfo->pixheight); + + /* if info.tight is set, tighten the bounding box */ + if (info.tight) { + trans_tighten(&imginfo->trans, plist); + } + + /* sx/rx is just an alternate way to specify width; sy/ry is just an + alternate way to specify height. */ + if (info.backend->pixel) { + if (imginfo->width == UNDEF && info.sx != UNDEF) { + imginfo->width = imginfo->trans.bb[0] * info.sx; + } + if (imginfo->height == UNDEF && info.sy != UNDEF) { + imginfo->height = imginfo->trans.bb[1] * info.sy; + } + } else { + if (imginfo->width == UNDEF && info.rx != UNDEF) { + imginfo->width = imginfo->trans.bb[0] / info.rx * 72; + } + if (imginfo->height == UNDEF && info.ry != UNDEF) { + imginfo->height = imginfo->trans.bb[1] / info.ry * 72; + } + } + + /* if one of width/height is specified, use stretch to determine the + other */ + if (imginfo->width == UNDEF && imginfo->height != UNDEF) { + imginfo->width = imginfo->height / imginfo->trans.bb[1] * imginfo->trans.bb[0] / info.stretch; + } else if (imginfo->width != UNDEF && imginfo->height == UNDEF) { + imginfo->height = imginfo->width / imginfo->trans.bb[0] * imginfo->trans.bb[1] * info.stretch; + } + + /* if width and height are still variable, tenatively use the + default scaling factor of 72dpi (for dimension-based backends) or + 1 (for pixel-based backends). For fixed-size backends, this will + be adjusted later to fit the page. */ + if (imginfo->width == UNDEF && imginfo->height == UNDEF) { + imginfo->width = imginfo->trans.bb[0]; + imginfo->height = imginfo->trans.bb[1] * info.stretch; + default_scaling = 1; + } + + /* apply scaling */ + trans_scale_to_size(&imginfo->trans, imginfo->width, imginfo->height); + + /* apply rotation, and tighten the bounding box again, if necessary */ + if (info.angle != 0.0) { + trans_rotate(&imginfo->trans, info.angle); + if (info.tight) { + trans_tighten(&imginfo->trans, plist); + } + } + + /* for fixed-size backends, if default scaling was in effect, + further adjust the scaling to be the "best fit" for the given + page size and margins. */ + if (default_scaling && info.backend->fixed) { + + /* try to squeeze it between margins */ + maxwidth = UNDEF; + maxheight = UNDEF; + + if (imginfo->lmar != UNDEF && imginfo->rmar != UNDEF) { + maxwidth = info.paperwidth - imginfo->lmar - imginfo->rmar; + } + if (imginfo->bmar != UNDEF && imginfo->tmar != UNDEF) { + maxheight = info.paperheight - imginfo->bmar - imginfo->tmar; + } + if (maxwidth == UNDEF && maxheight == UNDEF) { + maxwidth = max(info.paperwidth - 144, info.paperwidth * 0.75); + maxheight = max(info.paperheight - 144, info.paperheight * 0.75); + } + + if (maxwidth == UNDEF) { + sc = maxheight / imginfo->trans.bb[1]; + } else if (maxheight == UNDEF) { + sc = maxwidth / imginfo->trans.bb[0]; + } else { + sc = min(maxwidth / imginfo->trans.bb[0], maxheight / imginfo->trans.bb[1]); + } + + /* re-scale coordinate system */ + imginfo->width *= sc; + imginfo->height *= sc; + trans_rescale(&imginfo->trans, sc); + } + + /* adjust margins */ + if (info.backend->fixed) { + if (imginfo->lmar == UNDEF && imginfo->rmar == UNDEF) { + imginfo->lmar = (info.paperwidth-imginfo->trans.bb[0])/2; + } else if (imginfo->lmar == UNDEF) { + imginfo->lmar = (info.paperwidth-imginfo->trans.bb[0]-imginfo->rmar); + } else if (imginfo->lmar != UNDEF && imginfo->rmar != UNDEF) { + imginfo->lmar += (info.paperwidth-imginfo->trans.bb[0]-imginfo->lmar-imginfo->rmar)/2; + } + if (imginfo->bmar == UNDEF && imginfo->tmar == UNDEF) { + imginfo->bmar = (info.paperheight-imginfo->trans.bb[1])/2; + } else if (imginfo->bmar == UNDEF) { + imginfo->bmar = (info.paperheight-imginfo->trans.bb[1]-imginfo->tmar); + } else if (imginfo->bmar != UNDEF && imginfo->tmar != UNDEF) { + imginfo->bmar += (info.paperheight-imginfo->trans.bb[1]-imginfo->bmar-imginfo->tmar)/2; + } + } else { + if (imginfo->lmar == UNDEF) { + imginfo->lmar = 0; + } + if (imginfo->rmar == UNDEF) { + imginfo->rmar = 0; + } + if (imginfo->bmar == UNDEF) { + imginfo->bmar = 0; + } + if (imginfo->tmar == UNDEF) { + imginfo->tmar = 0; + } + } +} + +/* ---------------------------------------------------------------------- */ +/* auxiliary functions for file handling */ + +/* open a file for reading. Return stdin if filename is NULL or "-" */ +static FILE *my_fopen_read(char *filename) { + if (filename == NULL || strcmp(filename, "-") == 0) { + return stdin; + } + return fopen(filename, "rb"); +} + +/* open a file for writing. Return stdout if filename is NULL or "-" */ +static FILE *my_fopen_write(char *filename) { + if (filename == NULL || strcmp(filename, "-") == 0) { + return stdout; + } + return fopen(filename, "wb"); +} + +/* close a file, but do nothing is filename is NULL or "-" */ +static void my_fclose(FILE *f, char *filename) { + if (filename == NULL || strcmp(filename, "-") == 0) { + return; + } + fclose(f); +} + +/* make output filename from input filename. Return an allocated value. */ +static char *make_outfilename(char *infile, char *ext) { + char *outfile; + char *p; + + if (strcmp(infile, "-") == 0) { + return strdup("-"); + } + + outfile = (char *) malloc(strlen(infile)+strlen(ext)+5); + if (!outfile) { + return NULL; + } + strcpy(outfile, infile); + p = strrchr(outfile, '.'); + if (p) { + *p = 0; + } + strcat(outfile, ext); + + /* check that input and output filenames are different */ + if (strcmp(infile, outfile) == 0) { + strcpy(outfile, infile); + strcat(outfile, "-out"); + } + + return outfile; +} + +/* ---------------------------------------------------------------------- */ +/* Process one infile */ + +/* Process one or more bitmaps from fin, and write the results to fout + using the page_f function of the appropriate backend. */ + +static void process_file(backend_t *b, const char *infile, const char *outfile, FILE *fin, FILE *fout) { + int r; + potrace_bitmap_t *bm = NULL; + imginfo_t imginfo; + int eof_flag = 0; /* to indicate premature eof */ + int count; /* number of bitmaps successfully processed, this file */ + potrace_state_t *st; + + for (count=0; ; count++) { + /* read a bitmap */ + r = bm_read(fin, info.blacklevel, &bm); + switch (r) { + case -1: /* system error */ + fprintf(stderr, ""POTRACE": %s: %s\n", infile, strerror(errno)); + exit(2); + case -2: /* corrupt file format */ + fprintf(stderr, ""POTRACE": %s: file format error: %s\n", infile, bm_read_error); + exit(2); + case -3: /* empty file */ + if (count>0) { /* end of file */ + return; + } + fprintf(stderr, ""POTRACE": %s: empty file\n", infile); + exit(2); + case -4: /* wrong magic */ + if (count>0) { + fprintf(stderr, ""POTRACE": %s: warning: junk at end of file\n", infile); + return; + } + fprintf(stderr, ""POTRACE": %s: file format not recognized\n", infile); + fprintf(stderr, "Possible input file formats are: pnm (pbm, pgm, ppm), bmp.\n"); + exit(2); + case 1: /* unexpected end of file */ + fprintf(stderr, ""POTRACE": warning: %s: premature end of file\n", infile); + eof_flag = 1; + break; + } + + /* prepare progress bar, if requested */ + if (info.progress) { + r = info.progress_bar->init(&info.param->progress, infile, count); + if (r) { + fprintf(stderr, ""POTRACE": %s\n", strerror(errno)); + exit(2); + } + } else { + info.param->progress.callback = NULL; + } + + if (info.invert) { + bm_invert(bm); + } + + /* process the image */ + st = potrace_trace(info.param, bm); + if (!st || st->status != POTRACE_STATUS_OK) { + fprintf(stderr, ""POTRACE": %s: %s\n", infile, strerror(errno)); + exit(2); + } + + /* calculate image dimensions */ + imginfo.pixwidth = bm->w; + imginfo.pixheight = bm->h; + bm_free(bm); + + calc_dimensions(&imginfo, st->plist); + + r = b->page_f(fout, st->plist, &imginfo); + if (r) { + fprintf(stderr, ""POTRACE": %s: %s\n", outfile, strerror(errno)); + exit(2); + } + + potrace_state_free(st); + + if (info.progress) { + info.progress_bar->term(&info.param->progress); + } + + if (eof_flag || !b->multi) { + return; + } + } + /* not reached */ +} + +/* ---------------------------------------------------------------------- */ +/* main: handle file i/o */ + +#define TRY(x) if (x) goto try_error + +int main(int ac, char *av[]) { + backend_t *b; /* backend info */ + FILE *fin, *fout; + int i; + char *outfile; + + /* platform-specific initializations, e.g., set file i/o to binary */ + platform_init(); + + /* process options */ + dopts(ac, av); + + b = info.backend; + if (b==NULL) { + fprintf(stderr, ""POTRACE": internal error: selected backend not found\n"); + exit(1); + } + + /* fix some parameters */ + /* if backend cannot handle opticurve, disable it */ + if (b->opticurve == 0) { + info.param->opticurve = 0; + } + + /* there are several ways to call us: + potrace -- stdin to stdout + potrace -o outfile -- stdin to outfile + potrace file... -- encode each file and generate outfile names + potrace -o outfile file... -- concatenate files and write to outfile + + The latter form is only allowed one file for single-page + backends. For multi-page backends, each file must contain 0 or + more complete bitmaps. + */ + + if (!info.some_infiles) { /* read from stdin */ + + fout = my_fopen_write(info.outfile); + if (!fout) { + fprintf(stderr, ""POTRACE": %s: %s\n", info.outfile ? info.outfile : "stdout", strerror(errno)); + exit(2); + } + if (b->init_f) { + TRY(b->init_f(fout)); + } + process_file(b, "stdin", info.outfile ? info.outfile : "stdout", stdin, fout); + if (b->term_f) { + TRY(b->term_f(fout)); + } + my_fclose(fout, info.outfile); + free(info.outfile); + potrace_param_free(info.param); + return 0; + + } else if (!info.outfile) { /* infiles -> multiple outfiles */ + + for (i=0; i<info.infilecount; i++) { + outfile = make_outfilename(info.infiles[i], b->ext); + if (!outfile) { + fprintf(stderr, ""POTRACE": %s\n", strerror(errno)); + exit(2); + } + fin = my_fopen_read(info.infiles[i]); + if (!fin) { + fprintf(stderr, ""POTRACE": %s: %s\n", info.infiles[i], strerror(errno)); + exit(2); + } + fout = my_fopen_write(outfile); + if (!fout) { + fprintf(stderr, ""POTRACE": %s: %s\n", outfile, strerror(errno)); + exit(2); + } + if (b->init_f) { + TRY(b->init_f(fout)); + } + process_file(b, info.infiles[i], outfile, fin, fout); + if (b->term_f) { + TRY(b->term_f(fout)); + } + my_fclose(fin, info.infiles[i]); + my_fclose(fout, outfile); + free(outfile); + } + potrace_param_free(info.param); + return 0; + + } else { /* infiles to single outfile */ + + if (!b->multi && info.infilecount >= 2) { + fprintf(stderr, ""POTRACE": cannot use multiple input files with -o in %s mode\n", b->name); + exit(1); + } + if (info.infilecount == 0) { + fprintf(stderr, ""POTRACE": cannot use empty list of input files with -o\n"); + exit(1); + } + + fout = my_fopen_write(info.outfile); + if (!fout) { + fprintf(stderr, ""POTRACE": %s: %s\n", info.outfile, strerror(errno)); + exit(2); + } + if (b->init_f) { + TRY(b->init_f(fout)); + } + for (i=0; i<info.infilecount; i++) { + fin = my_fopen_read(info.infiles[i]); + if (!fin) { + fprintf(stderr, ""POTRACE": %s: %s\n", info.infiles[i], strerror(errno)); + exit(2); + } + process_file(b, info.infiles[i], info.outfile, fin, fout); + my_fclose(fin, info.infiles[i]); + } + if (b->term_f) { + TRY(b->term_f(fout)); + } + my_fclose(fout, info.outfile); + free(info.outfile); + potrace_param_free(info.param); + return 0; + + } + + /* not reached */ + + try_error: + fprintf(stderr, ""POTRACE": %s\n", strerror(errno)); + exit(2); +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/main.h b/Build/source/libs/potrace/potrace-1.11/src/main.h new file mode 100644 index 00000000000..03e7da9c80a --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/main.h @@ -0,0 +1,109 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef MAIN_H +#define MAIN_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "potracelib.h" +#include "progress_bar.h" +#include "auxiliary.h" +#include "trans.h" + +/* structure to hold a dimensioned value */ +struct dim_s { + double x; /* value */ + double d; /* dimension (in pt), or 0 if not given */ +}; +typedef struct dim_s dim_t; + +#define DIM_IN (72) +#define DIM_CM (72 / 2.54) +#define DIM_MM (72 / 25.4) +#define DIM_PT (1) + +/* set some configurable defaults */ + +#ifdef USE_METRIC +#define DEFAULT_DIM DIM_CM +#define DEFAULT_DIM_NAME "centimeters" +#else +#define DEFAULT_DIM DIM_IN +#define DEFAULT_DIM_NAME "inches" +#endif + +#ifdef USE_A4 +#define DEFAULT_PAPERWIDTH 595 +#define DEFAULT_PAPERHEIGHT 842 +#define DEFAULT_PAPERFORMAT "a4" +#else +#define DEFAULT_PAPERWIDTH 612 +#define DEFAULT_PAPERHEIGHT 792 +#define DEFAULT_PAPERFORMAT "letter" +#endif + +#ifdef DUMB_TTY +#define DEFAULT_PROGRESS_BAR progress_bar_simplified +#else +#define DEFAULT_PROGRESS_BAR progress_bar_vt100 +#endif + + + +struct backend_s; + +/* structure to hold command line options */ +struct info_s { + struct backend_s *backend; /* type of backend (eps,ps,pgm etc) */ + potrace_param_t *param; /* tracing parameters, see potracelib.h */ + int debug; /* type of output (0-2) (for BACKEND_PS/EPS only) */ + dim_t width_d; /* desired width of image */ + dim_t height_d; /* desired height of image */ + double rx; /* desired x resolution (in dpi) */ + double ry; /* desired y resolution (in dpi) */ + double sx; /* desired x scaling factor */ + double sy; /* desired y scaling factor */ + double stretch; /* ry/rx, if not otherwise determined */ + dim_t lmar_d, rmar_d, tmar_d, bmar_d; /* margins */ + double angle; /* rotate by this many degrees */ + int paperwidth, paperheight; /* paper size for ps backend (in pt) */ + int tight; /* should bounding box follow actual vector outline? */ + double unit; /* granularity of output grid */ + int compress; /* apply compression? */ + int pslevel; /* postscript level to use: affects only compression */ + int color; /* rgb color code 0xrrggbb: line color */ + int fillcolor; /* rgb color code 0xrrggbb: fill color */ + double gamma; /* gamma value for pgm backend */ + int longcoding; /* do not optimize for file size? */ + char *outfile; /* output filename, if given */ + char **infiles; /* array of input filenames */ + int infilecount; /* number of input filenames */ + int some_infiles; /* do we process a list of input filenames? */ + double blacklevel; /* 0 to 1: black/white cutoff in input file */ + int invert; /* invert bitmap? */ + int opaque; /* paint white shapes opaquely? */ + int grouping; /* 0=flat; 1=connected components; 2=hierarchical */ + int progress; /* should we display a progress bar? */ + progress_bar_t *progress_bar; /* which progress bar to use */ +}; +typedef struct info_s info_t; + +extern info_t info; + +/* structure to hold per-image information, set e.g. by calc_dimensions */ +struct imginfo_s { + int pixwidth; /* width of input pixmap */ + int pixheight; /* height of input pixmap */ + double width; /* desired width of image (in pt or pixels) */ + double height; /* desired height of image (in pt or pixels) */ + double lmar, rmar, tmar, bmar; /* requested margins (in pt) */ + trans_t trans; /* specify relative position of a tilted rectangle */ +}; +typedef struct imginfo_s imginfo_t; + +#endif /* MAIN_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/mkbitmap.c b/Build/source/libs/potrace/potrace-1.11/src/mkbitmap.c new file mode 100644 index 00000000000..fa377c1acf9 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/mkbitmap.c @@ -0,0 +1,788 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* mkbitmap.c: a standalone program for converting greymaps to bitmaps + while optionally applying the following enhancements: highpass + filter (evening out background gradients), lowpass filter + (smoothing foreground details), interpolated scaling, inversion. */ + +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <stdlib.h> +#include <math.h> +#include <getopt.h> + +#include "greymap.h" +#include "bitmap_io.h" +#include "platform.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define SAFE_MALLOC(var, n, typ) \ + if ((var = (typ *)malloc((n)*sizeof(typ))) == NULL) goto malloc_error + +/* structure to hold command line options */ +struct info_s { + char *outfile; /* output file */ + char **infiles; /* input files */ + int infilecount; /* how many input files? */ + int invert; /* invert input? */ + int highpass; /* use highpass filter? */ + double lambda; /* highpass filter radius */ + int lowpass; /* use lowpass filter? */ + double lambda1; /* lowpass filter radius */ + int scale; /* scaling factor */ + int linear; /* linear scaling? */ + int bilevel; /* convert to bilevel? */ + double level; /* cutoff grey level */ + char *outext; /* default output file extension */ +}; +typedef struct info_s info_t; + +static info_t info; + +/* apply lowpass filter (an approximate Gaussian blur) to greymap. + Lambda is the standard deviation of the kernel of the filter (i.e., + the approximate filter radius). */ +static void lowpass(greymap_t *gm, double lambda) { + double f, g; + double c, d; + double B; + int x, y; + + /* calculate filter coefficients from given lambda */ + B = 1+2/(lambda*lambda); + c = B-sqrt(B*B-1); + d = 1-c; + + for (y=0; y<gm->h; y++) { + /* apply low-pass filter to row y */ + /* left-to-right */ + f = g = 0; + for (x=0; x<gm->w; x++) { + f = f*c + GM_UGET(gm, x, y)*d; + g = g*c + f*d; + GM_UPUT(gm, x, y, g); + } + + /* right-to-left */ + for (x=gm->w-1; x>=0; x--) { + f = f*c + GM_UGET(gm, x, y)*d; + g = g*c + f*d; + GM_UPUT(gm, x, y, g); + } + + /* left-to-right mop-up */ + for (x=0; x<gm->w; x++) { + f = f*c; + g = g*c + f*d; + if (f+g < 1/255.0) { + break; + } + GM_UPUT(gm, x, y, GM_UGET(gm, x, y)+g); + } + } + + for (x=0; x<gm->w; x++) { + /* apply low-pass filter to column x */ + /* bottom-to-top */ + f = g = 0; + for (y=0; y<gm->h; y++) { + f = f*c + GM_UGET(gm, x, y)*d; + g = g*c + f*d; + GM_UPUT(gm, x, y, g); + } + + /* top-to-bottom */ + for (y=gm->h-1; y>=0; y--) { + f = f*c + GM_UGET(gm, x, y)*d; + g = g*c + f*d; + GM_UPUT(gm, x, y, g); + } + + /* bottom-to-top mop-up */ + for (y=0; y<gm->h; y++) { + f = f*c; + g = g*c + f*d; + if (f+g < 1/255.0) { + break; + } + GM_UPUT(gm, x, y, GM_UGET(gm, x, y)+g); + } + } +} + +/* apply highpass filter to greymap. Return 0 on success, 1 on error + with errno set. */ +static int highpass(greymap_t *gm, double lambda) { + greymap_t *gm1; + double f; + int x, y; + + /* create a copy */ + gm1 = gm_dup(gm); + if (!gm1) { + return 1; + } + + /* apply lowpass filter to the copy */ + lowpass(gm1, lambda); + + /* subtract copy from original */ + for (y=0; y<gm->h; y++) { + for (x=0; x<gm->w; x++) { + f = GM_UGET(gm, x, y); + f -= GM_UGET(gm1, x, y); + f += 128; /* normalize! */ + GM_UPUT(gm, x, y, f); + } + } + gm_free(gm1); + return 0; +} + +/* Convert greymap to bitmap by using cutoff threshold c (0=black, + 1=white). On error, return NULL with errno set. */ +static potrace_bitmap_t *threshold(greymap_t *gm, double c) { + int w, h; + potrace_bitmap_t *bm_out = NULL; + double c1; + int x, y; + double p; + + w = gm->w; + h = gm->h; + + /* allocate output bitmap */ + bm_out = bm_new(w, h); + if (!bm_out) { + return NULL; + } + + /* thresholding */ + c1 = c * 255; + + for (y=0; y<h; y++) { + for (x=0; x<w; x++) { + p = GM_UGET(gm, x, y); + BM_UPUT(bm_out, x, y, p < c1); + } + } + return bm_out; +} + +/* scale greymap by factor s, using linear interpolation. If + bilevel=0, return a pointer to a greymap_t. If bilevel=1, return a + pointer to a potrace_bitmap_t and use cutoff threshold c (0=black, + 1=white). On error, return NULL with errno set. */ + +static void *interpolate_linear(greymap_t *gm, int s, int bilevel, double c) { + int p00, p01, p10, p11; + int i, j, x, y; + double xx, yy, av; + double c1 = 0; + int w, h; + double p0, p1; + greymap_t *gm_out = NULL; + potrace_bitmap_t *bm_out = NULL; + + w = gm->w; + h = gm->h; + + /* allocate output bitmap/greymap */ + if (bilevel) { + bm_out = bm_new(w*s, h*s); + if (!bm_out) { + return NULL; + } + bm_clear(bm_out, 0); + c1 = c * 255; + } else { + gm_out = gm_new(w*s, h*s); + if (!gm_out) { + return NULL; + } + } + + /* interpolate */ + for (i=0; i<w; i++) { + for (j=0; j<h; j++) { + p00 = GM_BGET(gm, i, j); + p01 = GM_BGET(gm, i, j+1); + p10 = GM_BGET(gm, i+1, j); + p11 = GM_BGET(gm, i+1, j+1); + + if (bilevel) { + /* treat two special cases which are very common */ + if (p00 < c1 && p01 < c1 && p10 < c1 && p11 < c1) { + for (x=0; x<s; x++) { + for (y=0; y<s; y++) { + BM_UPUT(bm_out, i*s+x, j*s+y, 1); + } + } + continue; + } + if (p00 >= c1 && p01 >= c1 && p10 >= c1 && p11 >= c1) { + continue; + } + } + + /* the general case */ + for (x=0; x<s; x++) { + xx = x/(double)s; + p0 = p00*(1-xx) + p10*xx; + p1 = p01*(1-xx) + p11*xx; + for (y=0; y<s; y++) { + yy = y/(double)s; + av = p0*(1-yy) + p1*yy; + if (bilevel) { + BM_UPUT(bm_out, i*s+x, j*s+y, av < c1); + } else { + GM_UPUT(gm_out, i*s+x, j*s+y, av); + } + } + } + } + } + if (bilevel) { + return (void *)bm_out; + } else { + return (void *)gm_out; + } +} + +/* same as interpolate_linear, except use cubic interpolation (slower + and better). */ + +/* we need this typedef so that the SAFE_MALLOC macro will work */ +typedef double double4[4]; + +static void *interpolate_cubic(greymap_t *gm, int s, int bilevel, double c) { + int w, h; + double4 *poly = NULL; /* poly[s][4]: fixed interpolation polynomials */ + double p[4]; /* four current points */ + double4 *window = NULL; /* window[s][4]: current state */ + double t, v; + int k, l, i, j, x, y; + double c1 = 0; + greymap_t *gm_out = NULL; + potrace_bitmap_t *bm_out = NULL; + + SAFE_MALLOC(poly, s, double4); + SAFE_MALLOC(window, s, double4); + + w = gm->w; + h = gm->h; + + /* allocate output bitmap/greymap */ + if (bilevel) { + bm_out = bm_new(w*s, h*s); + if (!bm_out) { + goto malloc_error; + } + bm_clear(bm_out, 0); + c1 = c * 255; + } else { + gm_out = gm_new(w*s, h*s); + if (!gm_out) { + goto malloc_error; + } + } + + /* pre-calculate interpolation polynomials */ + for (k=0; k<s; k++) { + t = k/(double)s; + poly[k][0] = 0.5 * t * (t-1) * (1-t); + poly[k][1] = -(t+1) * (t-1) * (1-t) + 0.5 * (t-1) * (t-2) * t; + poly[k][2] = 0.5 * (t+1) * t * (1-t) - t * (t-2) * t; + poly[k][3] = 0.5 * t * (t-1) * t; + } + + /* interpolate */ + for (y=0; y<h; y++) { + x=0; + for (i=0; i<4; i++) { + for (j=0; j<4; j++) { + p[j] = GM_BGET(gm, x+i-1, y+j-1); + } + for (k=0; k<s; k++) { + window[k][i] = 0.0; + for (j=0; j<4; j++) { + window[k][i] += poly[k][j] * p[j]; + } + } + } + while (1) { + for (l=0; l<s; l++) { + for (k=0; k<s; k++) { + v = 0.0; + for (i=0; i<4; i++) { + v += window[k][i] * poly[l][i]; + } + if (bilevel) { + BM_UPUT(bm_out, x*s+l, y*s+k, v < c1); + } else { + GM_UPUT(gm_out, x*s+l, y*s+k, v); + } + } + } + x++; + if (x>=w) { + break; + } + for (i=0; i<3; i++) { + for (k=0; k<s; k++) { + window[k][i] = window[k][i+1]; + } + } + i=3; + for (j=0; j<4; j++) { + p[j] = GM_BGET(gm, x+i-1, y+j-1); + } + for (k=0; k<s; k++) { + window[k][i] = 0.0; + for (j=0; j<4; j++) { + window[k][i] += poly[k][j] * p[j]; + } + } + } + } + + free(poly); + free(window); + + if (bilevel) { + return (void *)bm_out; + } else { + return (void *)gm_out; + } + + malloc_error: + free(poly); + free(window); + return NULL; +} + +/* ---------------------------------------------------------------------- */ + +/* process a single file, containing one or more images. On error, + print error message to stderr and exit with code 2. On warning, + print warning message to stderr. */ + +static void process_file(FILE *fin, FILE *fout, char *infile, char *outfile) { + int r; + greymap_t *gm; + potrace_bitmap_t *bm; + void *sm; + int x, y; + int count; + + for (count=0; ; count++) { + r = gm_read(fin, &gm); + switch (r) { + case -1: /* system error */ + fprintf(stderr, ""MKBITMAP": %s: %s\n", infile, strerror(errno)); + exit(2); + case -2: /* corrupt file format */ + fprintf(stderr, ""MKBITMAP": %s: file format error: %s\n", infile, gm_read_error); + exit(2); + case -3: /* empty file */ + if (count>0) { /* end of file */ + return; + } + fprintf(stderr, ""MKBITMAP": %s: empty file\n", infile); + exit(2); + case -4: /* wrong magic */ + if (count>0) { + fprintf(stderr, ""MKBITMAP": %s: warning: junk at end of file\n", infile); + return; + } + fprintf(stderr, ""MKBITMAP": %s: file format not recognized\n", infile); + fprintf(stderr, "Possible input file formats are: pnm (pbm, pgm, ppm), bmp.\n"); + exit(2); + case 1: /* unexpected end of file */ + fprintf(stderr, ""MKBITMAP": %s: warning: premature end of file\n", infile); + break; + } + + if (info.invert) { + for (y=0; y<gm->h; y++) { + for (x=0; x<gm->w; x++) { + GM_UPUT(gm, x, y, 255-GM_UGET(gm, x, y)); + } + } + } + + if (info.highpass) { + r = highpass(gm, info.lambda); + if (r) { + fprintf(stderr, ""MKBITMAP": %s: %s\n", infile, strerror(errno)); + exit(2); + } + } + + if (info.lowpass) { + lowpass(gm, info.lambda1); + } + + if (info.scale == 1 && info.bilevel) { /* no interpolation necessary */ + sm = threshold(gm, info.level); + gm_free(gm); + } else if (info.scale == 1) { + sm = gm; + } else if (info.linear) { /* linear interpolation */ + sm = interpolate_linear(gm, info.scale, info.bilevel, info.level); + gm_free(gm); + } else { /* cubic interpolation */ + sm = interpolate_cubic(gm, info.scale, info.bilevel, info.level); + gm_free(gm); + } + if (!sm) { + fprintf(stderr, ""MKBITMAP": %s: %s\n", infile, strerror(errno)); + exit(2); + } + + if (info.bilevel) { + bm = (potrace_bitmap_t *)sm; + bm_writepbm(fout, bm); + bm_free(bm); + } else { + gm = (greymap_t *)sm; + gm_writepgm(fout, gm, NULL, 1, GM_MODE_POSITIVE, 1.0); + gm_free(gm); + } + } +} + +/* ---------------------------------------------------------------------- */ +/* some info functions and option processing */ + +static int license(FILE *f) { + fprintf(f, + "This program is free software; you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation; either version 2 of the License, or\n" + "(at your option) any later version.\n" + "\n" + "This program is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU General Public License for more details.\n" + "\n" + "You should have received a copy of the GNU General Public License\n" + "along with this program; if not, write to the Free Software\n" + "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n" + ); + return 0; +} + +static int usage(FILE *f) { + fprintf(f, "Usage: "MKBITMAP" [options] [file...]\n"); + fprintf(f, "Options:\n"); + fprintf(f, " -h, --help - print this help message and exit\n"); + fprintf(f, " -v, --version - print version info and exit\n"); + fprintf(f, " -l, --license - print license info and exit\n"); + fprintf(f, " -o, --output <file> - output to file\n"); + fprintf(f, " -x, --nodefaults - turn off default options\n"); + fprintf(f, "Inversion:\n"); + fprintf(f, " -i, --invert - invert the input (undo 'blackboard' effect)\n"); + fprintf(f, "Highpass filtering:\n"); + fprintf(f, " -f, --filter <n> - apply highpass filter with radius n (default 4)\n"); + fprintf(f, " -n, --nofilter - no highpass filtering\n"); + fprintf(f, " -b, --blur <n> - apply lowpass filter with radius n (default: none)\n"); + fprintf(f, "Scaling:\n"); + fprintf(f, " -s, --scale <n> - scale by integer factor n (default 2)\n"); + fprintf(f, " -1, --linear - use linear interpolation\n"); + fprintf(f, " -3, --cubic - use cubic interpolation (default)\n"); + fprintf(f, "Thresholding:\n"); + fprintf(f, " -t, --threshold <n> - set threshold for bilevel conversion (default 0.45)\n"); + fprintf(f, " -g, --grey - no bilevel conversion, output a greymap\n"); + + fprintf(f, "\n"); + fprintf(f, "Possible input file formats are: pnm (pbm, pgm, ppm), bmp.\n"); + fprintf(f, "The default options are: -f 4 -s 2 -3 -t 0.45\n"); + + return 0; +} + +static struct option longopts[] = { + {"help", 0, 0, 'h'}, + {"version", 0, 0, 'v'}, + {"license", 0, 0, 'l'}, + {"output", 1, 0, 'o'}, + {"reset", 0, 0, 'x'}, + {"invert", 0, 0, 'i'}, + {"filter", 1, 0, 'f'}, + {"nofilter", 0, 0, 'n'}, + {"blur", 1, 0, 'b'}, + {"scale", 1, 0, 's'}, + {"linear", 0, 0, '1'}, + {"cubic", 0, 0, '3'}, + {"grey", 0, 0, 'g'}, + {"threshold", 1, 0, 't'}, + {0, 0, 0, 0} +}; + +static char *shortopts = "hvlo:xif:nb:s:13gt:"; + +/* process options. On error, print error message to stderr and exit + with code 1 */ +static void dopts(int ac, char *av[]) { + int c; + char *p; + + /* set defaults for command line parameters */ + info.outfile = NULL; /* output file */ + info.infiles = NULL; /* input files */ + info.infilecount = 0; /* how many input files? */ + info.invert = 0; /* invert input? */ + info.highpass = 1; /* use highpass filter? */ + info.lambda = 4; /* highpass filter radius */ + info.lowpass = 0; /* use lowpass filter? */ + info.lambda1 = 0; /* lowpass filter radius */ + info.scale = 2; /* scaling factor */ + info.linear = 0; /* linear scaling? */ + info.bilevel = 1; /* convert to bilevel? */ + info.level = 0.45; /* cutoff grey level */ + info.outext = ".pbm"; /* output file extension */ + + while ((c = getopt_long(ac, av, shortopts, longopts, NULL)) != -1) { + switch (c) { + case 'h': + fprintf(stdout, ""MKBITMAP" "VERSION". Transforms images into bitmaps with scaling and filtering.\n\n"); + usage(stdout); + exit(0); + break; + case 'v': + fprintf(stdout, ""MKBITMAP" "VERSION". Copyright (C) 2001-2013 Peter Selinger.\n"); + exit(0); + break; + case 'l': + fprintf(stdout, ""MKBITMAP" "VERSION". Copyright (C) 2001-2013 Peter Selinger.\n\n"); + license(stdout); + exit(0); + break; + case 'o': + free(info.outfile); + info.outfile = strdup(optarg); + if (!info.outfile) { + fprintf(stderr, ""MKBITMAP": %s\n", strerror(errno)); + exit(2); + } + break; + case 'x': + info.invert = 0; + info.highpass = 0; + info.scale = 1; + info.bilevel = 0; + info.outext = ".pgm"; + break; + case 'i': + info.invert = 1; + break; + case 'f': + info.highpass = 1; + info.lambda = strtod(optarg, &p); + if (*p || info.lambda<0) { + fprintf(stderr, ""MKBITMAP": invalid filter radius -- %s\n", optarg); + exit(1); + } + break; + case 'n': + info.highpass = 0; + break; + case 'b': + info.lowpass = 1; + info.lambda1 = strtod(optarg, &p); + if (*p || info.lambda1<0) { + fprintf(stderr, ""MKBITMAP": invalid filter radius -- %s\n", optarg); + exit(1); + } + break; + case 's': + info.scale = strtol(optarg, &p, 0); + if (*p || info.scale<=0) { + fprintf(stderr, ""MKBITMAP": invalid scaling factor -- %s\n", optarg); + exit(1); + } + break; + case '1': + info.linear = 1; + break; + case '3': + info.linear = 0; + break; + case 'g': + info.bilevel = 0; + info.outext = ".pgm"; + break; + case 't': + info.bilevel = 1; + info.outext = ".pbm"; + info.level = strtod(optarg, &p); + if (*p || info.level<0) { + fprintf(stderr, ""MKBITMAP": invalid threshold -- %s\n", optarg); + exit(1); + } + break; + case '?': + fprintf(stderr, "Try --help for more info\n"); + exit(1); + break; + default: + fprintf(stderr, ""MKBITMAP": Unimplemented option -- %c\n", c); + exit(1); + } + } + info.infiles = &av[optind]; + info.infilecount = ac-optind; + return; +} + +/* ---------------------------------------------------------------------- */ +/* auxiliary functions for file handling */ + +/* open a file for reading. Return stdin if filename is NULL or "-" */ +static FILE *my_fopen_read(char *filename) { + if (filename == NULL || strcmp(filename, "-") == 0) { + return stdin; + } + return fopen(filename, "rb"); +} + +/* open a file for writing. Return stdout if filename is NULL or "-" */ +static FILE *my_fopen_write(char *filename) { + if (filename == NULL || strcmp(filename, "-") == 0) { + return stdout; + } + return fopen(filename, "wb"); +} + +/* close a file, but do nothing is filename is NULL or "-" */ +static void my_fclose(FILE *f, char *filename) { + if (filename == NULL || strcmp(filename, "-") == 0) { + return; + } + fclose(f); +} + +/* make output filename from input filename. Return an allocated value. */ +static char *make_outfilename(char *infile, char *ext) { + char *outfile; + char *p; + + if (strcmp(infile, "-") == 0) { + return strdup("-"); + } + + outfile = (char *) malloc(strlen(infile)+strlen(ext)+5); + if (!outfile) { + return NULL; + } + strcpy(outfile, infile); + p = strrchr(outfile, '.'); + if (p) { + *p = 0; + } + strcat(outfile, ext); + + /* check that input and output filenames are different */ + if (strcmp(infile, outfile) == 0) { + strcpy(outfile, infile); + strcat(outfile, "-out"); + } + + return outfile; +} + +/* ---------------------------------------------------------------------- */ +/* Main function */ + +int main(int ac, char *av[]) { + FILE *fin, *fout; + int i; + char *outfile; + + /* platform-specific initializations, e.g., set file i/o to binary */ + platform_init(); + + /* process options */ + dopts(ac, av); + + /* there are several ways to call us: + mkbitmap -- stdin to stdout + mkbitmap -o outfile -- stdin to outfile + mkbitmap file... -- encode each file and generate outfile names + mkbitmap file... -o outfile -- concatenate files and write to outfile + */ + + if (info.infilecount == 0 && info.outfile == NULL) { /* stdin to stdout */ + + process_file(stdin, stdout, "stdin", "stdout"); + return 0; + + } else if (info.infilecount == 0) { /* stdin to outfile */ + + fout = my_fopen_write(info.outfile); + if (!fout) { + fprintf(stderr, ""MKBITMAP": %s: %s\n", info.outfile, strerror(errno)); + exit(2); + } + process_file(stdin, fout, "stdin", info.outfile); + my_fclose(fout, info.outfile); + free(info.outfile); + return 0; + + } else if (info.outfile == NULL) { /* infiles -> multiple outfiles */ + + for (i=0; i<info.infilecount; i++) { + outfile = make_outfilename(info.infiles[i], info.outext); + if (!outfile) { + fprintf(stderr, ""MKBITMAP": %s\n", strerror(errno)); + exit(2); + } + fin = my_fopen_read(info.infiles[i]); + if (!fin) { + fprintf(stderr, ""MKBITMAP": %s: %s\n", info.infiles[i], strerror(errno)); + exit(2); + } + fout = my_fopen_write(outfile); + if (!fout) { + fprintf(stderr, ""MKBITMAP": %s: %s\n", outfile, strerror(errno)); + exit(2); + } + process_file(fin, fout, info.infiles[i], outfile); + my_fclose(fin, info.infiles[i]); + my_fclose(fout, outfile); + free(outfile); + } + return 0; + + } else { /* infiles to single outfile */ + + fout = my_fopen_write(info.outfile); + if (!fout) { + fprintf(stderr, ""MKBITMAP": %s: %s\n", info.outfile, strerror(errno)); + exit(2); + } + for (i=0; i<info.infilecount; i++) { + fin = my_fopen_read(info.infiles[i]); + if (!fin) { + fprintf(stderr, ""MKBITMAP": %s: %s\n", info.infiles[i], strerror(errno)); + exit(2); + } + process_file(fin, fout, info.infiles[i], info.outfile); + my_fclose(fin, info.infiles[i]); + } + my_fclose(fout, info.outfile); + free(info.outfile); + return 0; + + } + + /* not reached */ +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/platform.h b/Build/source/libs/potrace/potrace-1.11/src/platform.h new file mode 100644 index 00000000000..25e4aefb31d --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/platform.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* this header file contains some platform dependent stuff */ + +#ifndef PLATFORM_H +#define PLATFORM_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* in Windows, set all file i/o to binary */ +#ifdef __MINGW32__ +#include <fcntl.h> +unsigned int _CRT_fmode = _O_BINARY; +#endif + +#ifdef __CYGWIN__ +#include <fcntl.h> +#include <io.h> +static inline void platform_init(void) { + setmode(0,O_BINARY); + setmode(1,O_BINARY); +} +#else +static inline void platform_init(void) { + /* NOP */ +} +#endif + +#endif /* PLATFORM_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/potracelib.c b/Build/source/libs/potrace/potrace-1.11/src/potracelib.c new file mode 100644 index 00000000000..1031421b465 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/potracelib.c @@ -0,0 +1,114 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +#include <stdlib.h> +#include <string.h> + +#include "potracelib.h" +#include "curve.h" +#include "decompose.h" +#include "trace.h" +#include "progress.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* default parameters */ +static const potrace_param_t param_default = { + 2, /* turdsize */ + POTRACE_TURNPOLICY_MINORITY, /* turnpolicy */ + 1.0, /* alphamax */ + 1, /* opticurve */ + 0.2, /* opttolerance */ + { + NULL, /* callback function */ + NULL, /* callback data */ + 0.0, 1.0, /* progress range */ + 0.0, /* granularity */ + }, +}; + +/* Return a fresh copy of the set of default parameters, or NULL on + failure with errno set. */ +potrace_param_t *potrace_param_default(void) { + potrace_param_t *p; + + p = (potrace_param_t *) malloc(sizeof(potrace_param_t)); + if (!p) { + return NULL; + } + memcpy(p, ¶m_default, sizeof(potrace_param_t)); + return p; +} + +/* On success, returns a Potrace state st with st->status == + POTRACE_STATUS_OK. On failure, returns NULL if no Potrace state + could be created (with errno set), or returns an incomplete Potrace + state (with st->status == POTRACE_STATUS_INCOMPLETE, and with errno + set). Complete or incomplete Potrace state can be freed with + potrace_state_free(). */ +potrace_state_t *potrace_trace(const potrace_param_t *param, const potrace_bitmap_t *bm) { + int r; + path_t *plist = NULL; + potrace_state_t *st; + progress_t prog; + progress_t subprog; + + /* prepare private progress bar state */ + prog.callback = param->progress.callback; + prog.data = param->progress.data; + prog.min = param->progress.min; + prog.max = param->progress.max; + prog.epsilon = param->progress.epsilon; + prog.d_prev = param->progress.min; + + /* allocate state object */ + st = (potrace_state_t *)malloc(sizeof(potrace_state_t)); + if (!st) { + return NULL; + } + + progress_subrange_start(0.0, 0.1, &prog, &subprog); + + /* process the image */ + r = bm_to_pathlist(bm, &plist, param, &subprog); + if (r) { + free(st); + return NULL; + } + + st->status = POTRACE_STATUS_OK; + st->plist = plist; + st->priv = NULL; /* private state currently unused */ + + progress_subrange_end(&prog, &subprog); + + progress_subrange_start(0.1, 1.0, &prog, &subprog); + + /* partial success. */ + r = process_path(plist, param, &subprog); + if (r) { + st->status = POTRACE_STATUS_INCOMPLETE; + } + + progress_subrange_end(&prog, &subprog); + + return st; +} + +/* free a Potrace state, without disturbing errno. */ +void potrace_state_free(potrace_state_t *st) { + pathlist_free(st->plist); + free(st); +} + +/* free a parameter list, without disturbing errno. */ +void potrace_param_free(potrace_param_t *p) { + free(p); +} + +char *potrace_version(void) { + return "potracelib "VERSION""; +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/potracelib.h b/Build/source/libs/potrace/potrace-1.11/src/potracelib.h new file mode 100644 index 00000000000..5728ff1b5d8 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/potracelib.h @@ -0,0 +1,139 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +#ifndef POTRACELIB_H +#define POTRACELIB_H + +/* this file defines the API for the core Potrace library. For a more + detailed description of the API, see potracelib.pdf */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ---------------------------------------------------------------------- */ +/* tracing parameters */ + +/* turn policies */ +#define POTRACE_TURNPOLICY_BLACK 0 +#define POTRACE_TURNPOLICY_WHITE 1 +#define POTRACE_TURNPOLICY_LEFT 2 +#define POTRACE_TURNPOLICY_RIGHT 3 +#define POTRACE_TURNPOLICY_MINORITY 4 +#define POTRACE_TURNPOLICY_MAJORITY 5 +#define POTRACE_TURNPOLICY_RANDOM 6 + +/* structure to hold progress bar callback data */ +struct potrace_progress_s { + void (*callback)(double progress, void *privdata); /* callback fn */ + void *data; /* callback function's private data */ + double min, max; /* desired range of progress, e.g. 0.0 to 1.0 */ + double epsilon; /* granularity: can skip smaller increments */ +}; +typedef struct potrace_progress_s potrace_progress_t; + +/* structure to hold tracing parameters */ +struct potrace_param_s { + int turdsize; /* area of largest path to be ignored */ + int turnpolicy; /* resolves ambiguous turns in path decomposition */ + double alphamax; /* corner threshold */ + int opticurve; /* use curve optimization? */ + double opttolerance; /* curve optimization tolerance */ + potrace_progress_t progress; /* progress callback function */ +}; +typedef struct potrace_param_s potrace_param_t; + +/* ---------------------------------------------------------------------- */ +/* bitmaps */ + +/* native word size */ +typedef unsigned long potrace_word; + +/* Internal bitmap format. The n-th scanline starts at scanline(n) = + (map + n*dy). Raster data is stored as a sequence of potrace_words + (NOT bytes). The leftmost bit of scanline n is the most significant + bit of scanline(n)[0]. */ +struct potrace_bitmap_s { + int w, h; /* width and height, in pixels */ + int dy; /* words per scanline (not bytes) */ + potrace_word *map; /* raw data, dy*h words */ +}; +typedef struct potrace_bitmap_s potrace_bitmap_t; + +/* ---------------------------------------------------------------------- */ +/* curves */ + +/* point */ +struct potrace_dpoint_s { + double x, y; +}; +typedef struct potrace_dpoint_s potrace_dpoint_t; + +/* segment tags */ +#define POTRACE_CURVETO 1 +#define POTRACE_CORNER 2 + +/* closed curve segment */ +struct potrace_curve_s { + int n; /* number of segments */ + int *tag; /* tag[n]: POTRACE_CURVETO or POTRACE_CORNER */ + potrace_dpoint_t (*c)[3]; /* c[n][3]: control points. + c[n][0] is unused for tag[n]=POTRACE_CORNER */ +}; +typedef struct potrace_curve_s potrace_curve_t; + +/* Linked list of signed curve segments. Also carries a tree structure. */ +struct potrace_path_s { + int area; /* area of the bitmap path */ + int sign; /* '+' or '-', depending on orientation */ + potrace_curve_t curve; /* this path's vector data */ + + struct potrace_path_s *next; /* linked list structure */ + + struct potrace_path_s *childlist; /* tree structure */ + struct potrace_path_s *sibling; /* tree structure */ + + struct potrace_privpath_s *priv; /* private state */ +}; +typedef struct potrace_path_s potrace_path_t; + +/* ---------------------------------------------------------------------- */ +/* Potrace state */ + +#define POTRACE_STATUS_OK 0 +#define POTRACE_STATUS_INCOMPLETE 1 + +struct potrace_state_s { + int status; + potrace_path_t *plist; /* vector data */ + + struct potrace_privstate_s *priv; /* private state */ +}; +typedef struct potrace_state_s potrace_state_t; + +/* ---------------------------------------------------------------------- */ +/* API functions */ + +/* get default parameters */ +potrace_param_t *potrace_param_default(void); + +/* free parameter set */ +void potrace_param_free(potrace_param_t *p); + +/* trace a bitmap*/ +potrace_state_t *potrace_trace(const potrace_param_t *param, + const potrace_bitmap_t *bm); + +/* free a Potrace state */ +void potrace_state_free(potrace_state_t *st); + +/* return a static plain text version string identifying this version + of potracelib */ +char *potrace_version(void); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif /* POTRACELIB_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/potracelib_demo.c b/Build/source/libs/potrace/potrace-1.11/src/potracelib_demo.c new file mode 100644 index 00000000000..6fbb2e578c0 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/potracelib_demo.c @@ -0,0 +1,144 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* A simple and self-contained demo of the potracelib API */ + +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <stdlib.h> + +#include "potracelib.h" + +#define WIDTH 250 +#define HEIGHT 250 + +/* ---------------------------------------------------------------------- */ +/* auxiliary bitmap functions */ + +/* macros for writing individual bitmap pixels */ +#define BM_WORDSIZE ((int)sizeof(potrace_word)) +#define BM_WORDBITS (8*BM_WORDSIZE) +#define BM_HIBIT (((potrace_word)1)<<(BM_WORDBITS-1)) +#define bm_scanline(bm, y) ((bm)->map + (y)*(bm)->dy) +#define bm_index(bm, x, y) (&bm_scanline(bm, y)[(x)/BM_WORDBITS]) +#define bm_mask(x) (BM_HIBIT >> ((x) & (BM_WORDBITS-1))) +#define bm_range(x, a) ((int)(x) >= 0 && (int)(x) < (a)) +#define bm_safe(bm, x, y) (bm_range(x, (bm)->w) && bm_range(y, (bm)->h)) +#define BM_USET(bm, x, y) (*bm_index(bm, x, y) |= bm_mask(x)) +#define BM_UCLR(bm, x, y) (*bm_index(bm, x, y) &= ~bm_mask(x)) +#define BM_UPUT(bm, x, y, b) ((b) ? BM_USET(bm, x, y) : BM_UCLR(bm, x, y)) +#define BM_PUT(bm, x, y, b) (bm_safe(bm, x, y) ? BM_UPUT(bm, x, y, b) : 0) + +/* return new un-initialized bitmap. NULL with errno on error */ +static potrace_bitmap_t *bm_new(int w, int h) { + potrace_bitmap_t *bm; + int dy = (w + BM_WORDBITS - 1) / BM_WORDBITS; + + bm = (potrace_bitmap_t *) malloc(sizeof(potrace_bitmap_t)); + if (!bm) { + return NULL; + } + bm->w = w; + bm->h = h; + bm->dy = dy; + bm->map = (potrace_word *) malloc(dy * h * BM_WORDSIZE); + if (!bm->map) { + free(bm); + return NULL; + } + return bm; +} + +/* free a bitmap */ +static void bm_free(potrace_bitmap_t *bm) { + if (bm != NULL) { + free(bm->map); + } + free(bm); +} + +/* ---------------------------------------------------------------------- */ +/* demo */ + +int main() { + int x, y, i; + potrace_bitmap_t *bm; + potrace_param_t *param; + potrace_path_t *p; + potrace_state_t *st; + int n, *tag; + potrace_dpoint_t (*c)[3]; + + /* create a bitmap */ + bm = bm_new(WIDTH, HEIGHT); + if (!bm) { + fprintf(stderr, "Error allocating bitmap: %s\n", strerror(errno)); + return 1; + } + + /* fill the bitmap with some pattern */ + for (y=0; y<HEIGHT; y++) { + for (x=0; x<WIDTH; x++) { + BM_PUT(bm, x, y, ((x*x + y*y*y) % 10000 < 5000) ? 1 : 0); + } + } + + /* set tracing parameters, starting from defaults */ + param = potrace_param_default(); + if (!param) { + fprintf(stderr, "Error allocating parameters: %s\n", strerror(errno)); + return 1; + } + param->turdsize = 0; + + /* trace the bitmap */ + st = potrace_trace(param, bm); + if (!st || st->status != POTRACE_STATUS_OK) { + fprintf(stderr, "Error tracing bitmap: %s\n", strerror(errno)); + return 1; + } + bm_free(bm); + + /* output vector data, e.g. as a rudimentary EPS file */ + printf("%%!PS-Adobe-3.0 EPSF-3.0\n"); + printf("%%%%BoundingBox: 0 0 %d %d\n", WIDTH, HEIGHT); + printf("gsave\n"); + + /* draw each curve */ + p = st->plist; + while (p != NULL) { + n = p->curve.n; + tag = p->curve.tag; + c = p->curve.c; + printf("%f %f moveto\n", c[n-1][2].x, c[n-1][2].y); + for (i=0; i<n; i++) { + switch (tag[i]) { + case POTRACE_CORNER: + printf("%f %f lineto\n", c[i][1].x, c[i][1].y); + printf("%f %f lineto\n", c[i][2].x, c[i][2].y); + break; + case POTRACE_CURVETO: + printf("%f %f %f %f %f %f curveto\n", + c[i][0].x, c[i][0].y, + c[i][1].x, c[i][1].y, + c[i][2].x, c[i][2].y); + break; + } + } + /* at the end of a group of a positive path and its negative + children, fill. */ + if (p->next == NULL || p->next->sign == '+') { + printf("0 setgray fill\n"); + } + p = p->next; + } + printf("grestore\n"); + printf("%%EOF\n"); + + potrace_state_free(st); + potrace_param_free(param); + + return 0; +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/progress.h b/Build/source/libs/potrace/potrace-1.11/src/progress.h new file mode 100644 index 00000000000..166209a5226 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/progress.h @@ -0,0 +1,79 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* operations on potrace_progress_t objects, which are defined in + potracelib.h. Note: the code attempts to minimize runtime overhead + when no progress monitoring was requested. It also tries to + minimize excessive progress calculations beneath the "epsilon" + threshold. */ + +#ifndef PROGRESS_H +#define PROGRESS_H + +/* structure to hold progress bar callback data */ +struct progress_s { + void (*callback)(double progress, void *privdata); /* callback fn */ + void *data; /* callback function's private data */ + double min, max; /* desired range of progress, e.g. 0.0 to 1.0 */ + double epsilon; /* granularity: can skip smaller increments */ + double b; /* upper limit of subrange in superrange units */ + double d_prev; /* previous value of d */ +}; +typedef struct progress_s progress_t; + +/* notify given progress object of current progress. Note that d is + given in the 0.0-1.0 range, which will be scaled and translated to + the progress object's range. */ +static inline void progress_update(double d, progress_t *prog) { + double d_scaled; + + if (prog != NULL && prog->callback != NULL) { + d_scaled = prog->min * (1-d) + prog->max * d; + if (d == 1.0 || d_scaled >= prog->d_prev + prog->epsilon) { + prog->callback(prog->min * (1-d) + prog->max * d, prog->data); + prog->d_prev = d_scaled; + } + } +} + +/* start a subrange of the given progress object. The range is + narrowed to [a..b], relative to 0.0-1.0 coordinates. If new range + is below granularity threshold, disable further subdivisions. */ +static inline void progress_subrange_start(double a, double b, const progress_t *prog, progress_t *sub) { + double min, max; + + if (prog == NULL || prog->callback == NULL) { + sub->callback = NULL; + return; + } + + min = prog->min * (1-a) + prog->max * a; + max = prog->min * (1-b) + prog->max * b; + + if (max - min < prog->epsilon) { + sub->callback = NULL; /* no further progress info in subrange */ + sub->b = b; + return; + } + sub->callback = prog->callback; + sub->data = prog->data; + sub->epsilon = prog->epsilon; + sub->min = min; + sub->max = max; + sub->d_prev = prog->d_prev; + return; +} + +static inline void progress_subrange_end(progress_t *prog, progress_t *sub) { + if (prog != NULL && prog->callback != NULL) { + if (sub->callback == NULL) { + progress_update(sub->b, prog); + } else { + prog->d_prev = sub->d_prev; + } + } +} + +#endif /* PROGRESS_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/progress_bar.c b/Build/source/libs/potrace/potrace-1.11/src/progress_bar.c new file mode 100644 index 00000000000..3a6dac86993 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/progress_bar.c @@ -0,0 +1,203 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* functions to render a progress bar for main.c. We provide a + standard and a simplified progress bar. */ + +#include <stdio.h> +#include <math.h> +#include <stdlib.h> +#include <string.h> + +#include "potracelib.h" +#include "progress_bar.h" + +/* ---------------------------------------------------------------------- */ +/* vt100 progress bar */ + +#define COL0 "\033[G" /* reset cursor to column 0 */ + +struct vt100_progress_s { + char name[22]; /* filename for status bar */ + double dnext; /* threshold value for next tick */ +}; +typedef struct vt100_progress_s vt100_progress_t; + +/* print a progress bar using vt100 control characters. This is a + callback function that is potentially called often; thus, it has + been optimized for the typical case, which is when the progress bar + does not need updating. */ +static void vt100_progress(double d, void *data) { + vt100_progress_t *p = (vt100_progress_t *)data; + static char b[] = "========================================"; + int tick; /* number of visible tickmarks, 0..40 */ + int perc; /* visible percentage, 0..100 */ + + /* note: the 0.01 and 0.025 ensure that we always end on 40 + tickmarks and 100%, despite any rounding errors. The 0.995 + ensures that tick always increases when d >= p->dnext. */ + if (d >= p->dnext) { + tick = (int) floor(d*40+0.01); + perc = (int) floor(d*100+0.025); + fprintf(stderr, "%-21s |%-40s| %d%% "COL0"", p->name, b+40-tick, perc); + fflush(stderr); + p->dnext = (tick+0.995) / 40.0; + } +} + +/* Initialize progress bar. Return 0 on success or 1 on failure with + errno set. */ +static int init_vt100_progress(potrace_progress_t *prog, const char *filename, int count) { + vt100_progress_t *p; + const char *q, *s; + int len; + + p = (vt100_progress_t *) malloc(sizeof(vt100_progress_t)); + if (!p) { + return 1; + } + + /* initialize callback function's data */ + p->dnext = 0; + + if (count != 0) { + sprintf(p->name, " (p.%d):", count+1); + } else { + s = filename; + if ((q = strrchr(s, '/')) != NULL) { + s = q+1; + } + len = strlen(s); + strncpy(p->name, s, 21); + p->name[20] = 0; + if (len > 20) { + p->name[17] = '.'; + p->name[18] = '.'; + p->name[19] = '.'; + } + strcat(p->name, ":"); + } + + /* initialize progress parameters */ + prog->callback = &vt100_progress; + prog->data = (void *)p; + prog->min = 0.0; + prog->max = 1.0; + prog->epsilon = 0.0; + + /* draw first progress bar */ + vt100_progress(0.0, prog->data); + return 0; +} + +/* Finalize the progress bar. */ +static void term_vt100_progress(potrace_progress_t *prog) { + fprintf(stderr, "\n"); + fflush(stderr); + free(prog->data); + return; +} + +/* progress bar interface structure */ +static progress_bar_t progress_bar_vt100_struct = { + init_vt100_progress, + term_vt100_progress, +}; +progress_bar_t *progress_bar_vt100 = &progress_bar_vt100_struct; + +/* ---------------------------------------------------------------------- */ +/* another progress bar for dumb terminals */ + +struct simplified_progress_s { + int n; /* number of ticks displayed so far */ + double dnext; /* threshold value for next tick */ +}; +typedef struct simplified_progress_s simplified_progress_t; + +/* print a simplified progress bar, not using any special tty control + codes. Optimized for frequent calling. */ +static void simplified_progress(double d, void *data) { + simplified_progress_t *p = (simplified_progress_t *)data; + int tick; /* number of visible tickmarks, 0..40 */ + + /* note: the 0.01 and 0.025 ensure that we always end on 40 + tickmarks and 100%, despite any rounding errors. The 0.995 + ensures that tick always increases when d >= p->dnext. */ + if (d >= p->dnext) { + tick = (int) floor(d*40+0.01); + while (p->n < tick) { + fputc('=', stderr); + p->n++; + } + fflush(stderr); + p->dnext = (tick+0.995) / 40.0; + } +} + +/* Initialize parameters for simplified progress bar. Return 0 on + success or 1 on error with errno set. */ +static int init_simplified_progress(potrace_progress_t *prog, const char *filename, int count) { + simplified_progress_t *p; + const char *q, *s; + int len; + char buf[22]; + + p = (simplified_progress_t *) malloc(sizeof(simplified_progress_t)); + if (!p) { + return 1; + } + + /* initialize callback function's data */ + p->n = 0; + p->dnext = 0; + + if (count != 0) { + sprintf(buf, " (p.%d):", count+1); + } else { + s = filename; + if ((q = strrchr(s, '/')) != NULL) { + s = q+1; + } + len = strlen(s); + strncpy(buf, s, 21); + buf[20] = 0; + if (len > 20) { + buf[17] = '.'; + buf[18] = '.'; + buf[19] = '.'; + } + strcat(buf, ":"); + } + + fprintf(stderr, "%-21s |", buf); + + /* initialize progress parameters */ + prog->callback = &simplified_progress; + prog->data = (void *)p; + prog->min = 0.0; + prog->max = 1.0; + prog->epsilon = 0.0; + + /* draw first progress bar */ + simplified_progress(0.0, prog->data); + return 0; +} + +static void term_simplified_progress(potrace_progress_t *prog) { + simplified_progress_t *p = (simplified_progress_t *)prog->data; + + simplified_progress(1.0, (void *)p); + fprintf(stderr, "| 100%%\n"); + fflush(stderr); + free(p); + return; +} + +/* progress bar interface structure */ +static progress_bar_t progress_bar_simplified_struct = { + init_simplified_progress, + term_simplified_progress, +}; +progress_bar_t *progress_bar_simplified = &progress_bar_simplified_struct; + diff --git a/Build/source/libs/potrace/potrace-1.11/src/progress_bar.h b/Build/source/libs/potrace/potrace-1.11/src/progress_bar.h new file mode 100644 index 00000000000..26fec959e2a --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/progress_bar.h @@ -0,0 +1,26 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* functions to render a progress bar for main.c. We provide a + standard and a simplified progress bar. */ + +#ifndef PROGRESS_BAR_H +#define PROGRESS_BAR_H + +#include "potracelib.h" + +/* structure to hold a progress bar interface */ +struct progress_bar_s { + int (*init)(potrace_progress_t *prog, const char *filename, int count); + void (*term)(potrace_progress_t *prog); +}; +typedef struct progress_bar_s progress_bar_t; + +extern progress_bar_t *progress_bar_vt100; +extern progress_bar_t *progress_bar_simplified; + + + +#endif /* PROGRESS_BAR_H */ + diff --git a/Build/source/libs/potrace/potrace-1.11/src/render.c b/Build/source/libs/potrace/potrace-1.11/src/render.c new file mode 100644 index 00000000000..3e8a6259061 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/render.c @@ -0,0 +1,243 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> + +#include "render.h" +#include "greymap.h" +#include "auxiliary.h" + +/* ---------------------------------------------------------------------- */ +/* routines for anti-aliased rendering of curves */ + +/* we use the following method. Given a point (x,y) (with real-valued + coordinates) in the plane, let (xi,yi) be the integer part of the + coordinates, i.e., xi=floor(x), yi=floor(y). Define a path from + (x,y) to infinity as follows: path(x,y) = + (x,y)--(xi+1,y)--(xi+1,yi)--(+infty,yi). Now as the point (x,y) + moves smoothly across the plane, the path path(x,y) sweeps + (non-smoothly) across a certain area. We proportionately blacken + the area as the path moves "downward", and we whiten the area as + the path moves "upward". This way, after the point has traversed a + closed curve, the interior of the curve has been darkened + (counterclockwise movement) or lightened (clockwise movement). (The + "grey shift" is actually proportional to the winding number). By + choosing the above path with mostly integer coordinates, we achieve + that only pixels close to (x,y) receive grey values and are subject + to round-off errors. The grey value of pixels far away from (x,y) + is always in "integer" (where 0=black, 1=white). As a special + trick, we keep an accumulator rm->a1, which holds a double value to + be added to the grey value to be added to the current pixel + (xi,yi). Only when changing "current" pixels, we convert this + double value to an integer. This way we avoid round-off errors at + the meeting points of line segments. Another speedup measure is + that we sometimes use the rm->incrow_buf array to postpone + incrementing or decrementing an entire row. If incrow_buf[y]=x+1!=0, + then all the pixels (x,y),(x+1,y),(x+2,y),... are scheduled to be + incremented/decremented (which one is the case will be clear from + context). This keeps the greymap operations reasonably local. */ + +/* allocate a new rendering state */ +render_t *render_new(greymap_t *gm) { + render_t *rm; + + rm = (render_t *) malloc(sizeof(render_t)); + if (!rm) { + return NULL; + } + memset(rm, 0, sizeof(render_t)); + rm->gm = gm; + rm->incrow_buf = (int *) malloc(gm->h * sizeof(int)); + if (!rm->incrow_buf) { + free(rm); + return NULL; + } + memset(rm->incrow_buf, 0, gm->h * sizeof(int)); + return rm; +} + +/* free a given rendering state. Note: this does not free the + underlying greymap. */ +void render_free(render_t *rm) { + free(rm->incrow_buf); + free(rm); +} + +/* close path */ +void render_close(render_t *rm) { + if (rm->x0 != rm->x1 || rm->y0 != rm->y1) { + render_lineto(rm, rm->x0, rm->y0); + } + GM_INC(rm->gm, rm->x0i, rm->y0i, (rm->a0+rm->a1)*255); + + /* assert (rm->x0i != rm->x1i || rm->y0i != rm->y1i); */ + + /* the persistent state is now undefined */ +} + +/* move point */ +void render_moveto(render_t *rm, double x, double y) { + /* close the previous path */ + render_close(rm); + + rm->x0 = rm->x1 = x; + rm->y0 = rm->y1 = y; + rm->x0i = (int)floor(rm->x0); + rm->x1i = (int)floor(rm->x1); + rm->y0i = (int)floor(rm->y0); + rm->y1i = (int)floor(rm->y1); + rm->a0 = rm->a1 = 0; +} + +/* add b to pixels (x,y) and all pixels to the right of it. However, + use rm->incrow_buf as a buffer to economize on multiple calls */ +static void incrow(render_t *rm, int x, int y, int b) { + int i, x0; + + if (y < 0 || y >= rm->gm->h) { + return; + } + + if (x < 0) { + x = 0; + } else if (x > rm->gm->w) { + x = rm->gm->w; + } + if (rm->incrow_buf[y] == 0) { + rm->incrow_buf[y] = x+1; /* store x+1 so that we can use 0 for "vacant" */ + return; + } + x0 = rm->incrow_buf[y]-1; + rm->incrow_buf[y] = 0; + if (x0 < x) { + for (i=x0; i<x; i++) { + GM_INC(rm->gm, i, y, -b); + } + } else { + for (i=x; i<x0; i++) { + GM_INC(rm->gm, i, y, b); + } + } +} + +/* render a straight line */ +void render_lineto(render_t *rm, double x2, double y2) { + int x2i, y2i; + double t0=2, s0=2; + int sn, tn; + double ss=2, ts=2; + double r0, r1; + int i, j; + int rxi, ryi; + int s; + + x2i = (int)floor(x2); + y2i = (int)floor(y2); + + sn = abs(x2i - rm->x1i); + tn = abs(y2i - rm->y1i); + + if (sn) { + s0 = ((x2>rm->x1 ? rm->x1i+1 : rm->x1i) - rm->x1)/(x2-rm->x1); + ss = fabs(1.0/(x2-rm->x1)); + } + if (tn) { + t0 = ((y2>rm->y1 ? rm->y1i+1 : rm->y1i) - rm->y1)/(y2-rm->y1); + ts = fabs(1.0/(y2-rm->y1)); + } + + r0 = 0; + + i = 0; + j = 0; + + rxi = rm->x1i; + ryi = rm->y1i; + + while (i<sn || j<tn) { + if (j>=tn || (i<sn && s0+i*ss < t0+j*ts)) { + r1 = s0+i*ss; + i++; + s = 1; + } else { + r1 = t0+j*ts; + j++; + s = 0; + } + /* render line from r0 to r1 segment of (rm->x1,rm->y1)..(x2,y2) */ + + /* move point to r1 */ + rm->a1 += (r1-r0)*(y2-rm->y1)*(rxi+1-((r0+r1)/2.0*(x2-rm->x1)+rm->x1)); + + /* move point across pixel boundary */ + if (s && x2>rm->x1) { + GM_INC(rm->gm, rxi, ryi, rm->a1*255); + rm->a1 = 0; + rxi++; + rm->a1 += rm->y1+r1*(y2-rm->y1)-ryi; + } else if (!s && y2>rm->y1) { + GM_INC(rm->gm, rxi, ryi, rm->a1*255); + rm->a1 = 0; + incrow(rm, rxi+1, ryi, 255); + ryi++; + } else if (s && x2<=rm->x1) { + rm->a1 -= rm->y1+r1*(y2-rm->y1)-ryi; + GM_INC(rm->gm, rxi, ryi, rm->a1*255); + rm->a1 = 0; + rxi--; + } else if (!s && y2<=rm->y1) { + GM_INC(rm->gm, rxi, ryi, rm->a1*255); + rm->a1 = 0; + ryi--; + incrow(rm, rxi+1, ryi, -255); + } + + r0 = r1; + } + + /* move point to (x2,y2) */ + + r1 = 1; + rm->a1 += (r1-r0)*(y2-rm->y1)*(rxi+1-((r0+r1)/2.0*(x2-rm->x1)+rm->x1)); + + rm->x1i = x2i; + rm->y1i = y2i; + rm->x1 = x2; + rm->y1 = y2; + + /* assert (rxi != rm->x1i || ryi != rm->y1i); */ +} + +/* render a Bezier curve. */ +void render_curveto(render_t *rm, double x2, double y2, double x3, double y3, double x4, double y4) { + double x1, y1, dd0, dd1, dd, delta, e2, epsilon, t; + + x1 = rm->x1; /* starting point */ + y1 = rm->y1; + + /* we approximate the curve by small line segments. The interval + size, epsilon, is determined on the fly so that the distance + between the true curve and its approximation does not exceed the + desired accuracy delta. */ + + delta = .1; /* desired accuracy, in pixels */ + + /* let dd = maximal value of 2nd derivative over curve - this must + occur at an endpoint. */ + dd0 = sq(x1-2*x2+x3) + sq(y1-2*y2+y3); + dd1 = sq(x2-2*x3+x4) + sq(y2-2*y3+y4); + dd = 6*sqrt(max(dd0, dd1)); + e2 = 8*delta <= dd ? 8*delta/dd : 1; + epsilon = sqrt(e2); /* necessary interval size */ + + for (t=epsilon; t<1; t+=epsilon) { + render_lineto(rm, x1*cu(1-t)+3*x2*sq(1-t)*t+3*x3*(1-t)*sq(t)+x4*cu(t), + y1*cu(1-t)+3*y2*sq(1-t)*t+3*y3*(1-t)*sq(t)+y4*cu(t)); + } + render_lineto(rm, x4, y4); +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/render.h b/Build/source/libs/potrace/potrace-1.11/src/render.h new file mode 100644 index 00000000000..15205e235c9 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/render.h @@ -0,0 +1,27 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef RENDER_H +#define RENDER_H + +#include "greymap.h" + +struct render_s { + greymap_t *gm; + double x0, y0, x1, y1; + int x0i, y0i, x1i, y1i; + double a0, a1; + int *incrow_buf; +}; +typedef struct render_s render_t; + +render_t *render_new(greymap_t *gm); +void render_free(render_t *rm); +void render_close(render_t *rm); +void render_moveto(render_t *rm, double x, double y); +void render_lineto(render_t *rm, double x, double y); +void render_curveto(render_t *rm, double x2, double y2, double x3, double y3, double x4, double y4); + +#endif /* RENDER_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/trace.c b/Build/source/libs/potrace/potrace-1.11/src/trace.c new file mode 100644 index 00000000000..1464bd32948 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/trace.c @@ -0,0 +1,1245 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* transform jaggy paths into smooth curves */ + +#include <stdio.h> +#include <math.h> +#include <stdlib.h> +#include <string.h> + +#include "potracelib.h" +#include "curve.h" +#include "lists.h" +#include "auxiliary.h" +#include "trace.h" +#include "progress.h" + +#define INFTY 10000000 /* it suffices that this is longer than any + path; it need not be really infinite */ +#define COS179 -0.999847695156 /* the cosine of 179 degrees */ + +/* ---------------------------------------------------------------------- */ +#define SAFE_MALLOC(var, n, typ) \ + if ((var = (typ *)malloc((n)*sizeof(typ))) == NULL) goto malloc_error + +/* ---------------------------------------------------------------------- */ +/* auxiliary functions */ + +/* return a direction that is 90 degrees counterclockwise from p2-p0, + but then restricted to one of the major wind directions (n, nw, w, etc) */ +static inline point_t dorth_infty(dpoint_t p0, dpoint_t p2) { + point_t r; + + r.y = sign(p2.x-p0.x); + r.x = -sign(p2.y-p0.y); + + return r; +} + +/* return (p1-p0)x(p2-p0), the area of the parallelogram */ +static inline double dpara(dpoint_t p0, dpoint_t p1, dpoint_t p2) { + double x1, y1, x2, y2; + + x1 = p1.x-p0.x; + y1 = p1.y-p0.y; + x2 = p2.x-p0.x; + y2 = p2.y-p0.y; + + return x1*y2 - x2*y1; +} + +/* ddenom/dpara have the property that the square of radius 1 centered + at p1 intersects the line p0p2 iff |dpara(p0,p1,p2)| <= ddenom(p0,p2) */ +static inline double ddenom(dpoint_t p0, dpoint_t p2) { + point_t r = dorth_infty(p0, p2); + + return r.y*(p2.x-p0.x) - r.x*(p2.y-p0.y); +} + +/* return 1 if a <= b < c < a, in a cyclic sense (mod n) */ +static inline int cyclic(int a, int b, int c) { + if (a<=c) { + return (a<=b && b<c); + } else { + return (a<=b || b<c); + } +} + +/* determine the center and slope of the line i..j. Assume i<j. Needs + "sum" components of p to be set. */ +static void pointslope(privpath_t *pp, int i, int j, dpoint_t *ctr, dpoint_t *dir) { + /* assume i<j */ + + int n = pp->len; + sums_t *sums = pp->sums; + + double x, y, x2, xy, y2; + double k; + double a, b, c, lambda2, l; + int r=0; /* rotations from i to j */ + + while (j>=n) { + j-=n; + r+=1; + } + while (i>=n) { + i-=n; + r-=1; + } + while (j<0) { + j+=n; + r-=1; + } + while (i<0) { + i+=n; + r+=1; + } + + x = sums[j+1].x-sums[i].x+r*sums[n].x; + y = sums[j+1].y-sums[i].y+r*sums[n].y; + x2 = sums[j+1].x2-sums[i].x2+r*sums[n].x2; + xy = sums[j+1].xy-sums[i].xy+r*sums[n].xy; + y2 = sums[j+1].y2-sums[i].y2+r*sums[n].y2; + k = j+1-i+r*n; + + ctr->x = x/k; + ctr->y = y/k; + + a = (x2-(double)x*x/k)/k; + b = (xy-(double)x*y/k)/k; + c = (y2-(double)y*y/k)/k; + + lambda2 = (a+c+sqrt((a-c)*(a-c)+4*b*b))/2; /* larger e.value */ + + /* now find e.vector for lambda2 */ + a -= lambda2; + c -= lambda2; + + if (fabs(a) >= fabs(c)) { + l = sqrt(a*a+b*b); + if (l!=0) { + dir->x = -b/l; + dir->y = a/l; + } + } else { + l = sqrt(c*c+b*b); + if (l!=0) { + dir->x = -c/l; + dir->y = b/l; + } + } + if (l==0) { + dir->x = dir->y = 0; /* sometimes this can happen when k=4: + the two eigenvalues coincide */ + } +} + +/* the type of (affine) quadratic forms, represented as symmetric 3x3 + matrices. The value of the quadratic form at a vector (x,y) is v^t + Q v, where v = (x,y,1)^t. */ +typedef double quadform_t[3][3]; + +/* Apply quadratic form Q to vector w = (w.x,w.y) */ +static inline double quadform(quadform_t Q, dpoint_t w) { + double v[3]; + int i, j; + double sum; + + v[0] = w.x; + v[1] = w.y; + v[2] = 1; + sum = 0.0; + + for (i=0; i<3; i++) { + for (j=0; j<3; j++) { + sum += v[i] * Q[i][j] * v[j]; + } + } + return sum; +} + +/* calculate p1 x p2 */ +static inline int xprod(point_t p1, point_t p2) { + return p1.x*p2.y - p1.y*p2.x; +} + +/* calculate (p1-p0)x(p3-p2) */ +static inline double cprod(dpoint_t p0, dpoint_t p1, dpoint_t p2, dpoint_t p3) { + double x1, y1, x2, y2; + + x1 = p1.x - p0.x; + y1 = p1.y - p0.y; + x2 = p3.x - p2.x; + y2 = p3.y - p2.y; + + return x1*y2 - x2*y1; +} + +/* calculate (p1-p0)*(p2-p0) */ +static inline double iprod(dpoint_t p0, dpoint_t p1, dpoint_t p2) { + double x1, y1, x2, y2; + + x1 = p1.x - p0.x; + y1 = p1.y - p0.y; + x2 = p2.x - p0.x; + y2 = p2.y - p0.y; + + return x1*x2 + y1*y2; +} + +/* calculate (p1-p0)*(p3-p2) */ +static inline double iprod1(dpoint_t p0, dpoint_t p1, dpoint_t p2, dpoint_t p3) { + double x1, y1, x2, y2; + + x1 = p1.x - p0.x; + y1 = p1.y - p0.y; + x2 = p3.x - p2.x; + y2 = p3.y - p2.y; + + return x1*x2 + y1*y2; +} + +/* calculate distance between two points */ +static inline double ddist(dpoint_t p, dpoint_t q) { + return sqrt(sq(p.x-q.x)+sq(p.y-q.y)); +} + +/* calculate point of a bezier curve */ +static inline dpoint_t bezier(double t, dpoint_t p0, dpoint_t p1, dpoint_t p2, dpoint_t p3) { + double s = 1-t; + dpoint_t res; + + /* Note: a good optimizing compiler (such as gcc-3) reduces the + following to 16 multiplications, using common subexpression + elimination. */ + + res.x = s*s*s*p0.x + 3*(s*s*t)*p1.x + 3*(t*t*s)*p2.x + t*t*t*p3.x; + res.y = s*s*s*p0.y + 3*(s*s*t)*p1.y + 3*(t*t*s)*p2.y + t*t*t*p3.y; + + return res; +} + +/* calculate the point t in [0..1] on the (convex) bezier curve + (p0,p1,p2,p3) which is tangent to q1-q0. Return -1.0 if there is no + solution in [0..1]. */ +static double tangent(dpoint_t p0, dpoint_t p1, dpoint_t p2, dpoint_t p3, dpoint_t q0, dpoint_t q1) { + double A, B, C; /* (1-t)^2 A + 2(1-t)t B + t^2 C = 0 */ + double a, b, c; /* a t^2 + b t + c = 0 */ + double d, s, r1, r2; + + A = cprod(p0, p1, q0, q1); + B = cprod(p1, p2, q0, q1); + C = cprod(p2, p3, q0, q1); + + a = A - 2*B + C; + b = -2*A + 2*B; + c = A; + + d = b*b - 4*a*c; + + if (a==0 || d<0) { + return -1.0; + } + + s = sqrt(d); + + r1 = (-b + s) / (2 * a); + r2 = (-b - s) / (2 * a); + + if (r1 >= 0 && r1 <= 1) { + return r1; + } else if (r2 >= 0 && r2 <= 1) { + return r2; + } else { + return -1.0; + } +} + +/* ---------------------------------------------------------------------- */ +/* Preparation: fill in the sum* fields of a path (used for later + rapid summing). Return 0 on success, 1 with errno set on + failure. */ +static int calc_sums(privpath_t *pp) { + int i, x, y; + int n = pp->len; + + SAFE_MALLOC(pp->sums, pp->len+1, sums_t); + + /* origin */ + pp->x0 = pp->pt[0].x; + pp->y0 = pp->pt[0].y; + + /* preparatory computation for later fast summing */ + pp->sums[0].x2 = pp->sums[0].xy = pp->sums[0].y2 = pp->sums[0].x = pp->sums[0].y = 0; + for (i=0; i<n; i++) { + x = pp->pt[i].x - pp->x0; + y = pp->pt[i].y - pp->y0; + pp->sums[i+1].x = pp->sums[i].x + x; + pp->sums[i+1].y = pp->sums[i].y + y; + pp->sums[i+1].x2 = pp->sums[i].x2 + x*x; + pp->sums[i+1].xy = pp->sums[i].xy + x*y; + pp->sums[i+1].y2 = pp->sums[i].y2 + y*y; + } + return 0; + + malloc_error: + return 1; +} + +/* ---------------------------------------------------------------------- */ +/* Stage 1: determine the straight subpaths (Sec. 2.2.1). Fill in the + "lon" component of a path object (based on pt/len). For each i, + lon[i] is the furthest index such that a straight line can be drawn + from i to lon[i]. Return 1 on error with errno set, else 0. */ + +/* this algorithm depends on the fact that the existence of straight + subpaths is a triplewise property. I.e., there exists a straight + line through squares i0,...,in iff there exists a straight line + through i,j,k, for all i0<=i<j<k<=in. (Proof?) */ + +/* this implementation of calc_lon is O(n^2). It replaces an older + O(n^3) version. A "constraint" means that future points must + satisfy xprod(constraint[0], cur) >= 0 and xprod(constraint[1], + cur) <= 0. */ + +/* Remark for Potrace 1.1: the current implementation of calc_lon is + more complex than the implementation found in Potrace 1.0, but it + is considerably faster. The introduction of the "nc" data structure + means that we only have to test the constraints for "corner" + points. On a typical input file, this speeds up the calc_lon + function by a factor of 31.2, thereby decreasing its time share + within the overall Potrace algorithm from 72.6% to 7.82%, and + speeding up the overall algorithm by a factor of 3.36. On another + input file, calc_lon was sped up by a factor of 6.7, decreasing its + time share from 51.4% to 13.61%, and speeding up the overall + algorithm by a factor of 1.78. In any case, the savings are + substantial. */ + +/* returns 0 on success, 1 on error with errno set */ +static int calc_lon(privpath_t *pp) { + point_t *pt = pp->pt; + int n = pp->len; + int i, j, k, k1; + int ct[4], dir; + point_t constraint[2]; + point_t cur; + point_t off; + int *pivk = NULL; /* pivk[n] */ + int *nc = NULL; /* nc[n]: next corner */ + point_t dk; /* direction of k-k1 */ + int a, b, c, d; + + SAFE_MALLOC(pivk, n, int); + SAFE_MALLOC(nc, n, int); + + /* initialize the nc data structure. Point from each point to the + furthest future point to which it is connected by a vertical or + horizontal segment. We take advantage of the fact that there is + always a direction change at 0 (due to the path decomposition + algorithm). But even if this were not so, there is no harm, as + in practice, correctness does not depend on the word "furthest" + above. */ + k = 0; + for (i=n-1; i>=0; i--) { + if (pt[i].x != pt[k].x && pt[i].y != pt[k].y) { + k = i+1; /* necessarily i<n-1 in this case */ + } + nc[i] = k; + } + + SAFE_MALLOC(pp->lon, n, int); + + /* determine pivot points: for each i, let pivk[i] be the furthest k + such that all j with i<j<k lie on a line connecting i,k. */ + + for (i=n-1; i>=0; i--) { + ct[0] = ct[1] = ct[2] = ct[3] = 0; + + /* keep track of "directions" that have occurred */ + dir = (3+3*(pt[mod(i+1,n)].x-pt[i].x)+(pt[mod(i+1,n)].y-pt[i].y))/2; + ct[dir]++; + + constraint[0].x = 0; + constraint[0].y = 0; + constraint[1].x = 0; + constraint[1].y = 0; + + /* find the next k such that no straight line from i to k */ + k = nc[i]; + k1 = i; + while (1) { + + dir = (3+3*sign(pt[k].x-pt[k1].x)+sign(pt[k].y-pt[k1].y))/2; + ct[dir]++; + + /* if all four "directions" have occurred, cut this path */ + if (ct[0] && ct[1] && ct[2] && ct[3]) { + pivk[i] = k1; + goto foundk; + } + + cur.x = pt[k].x - pt[i].x; + cur.y = pt[k].y - pt[i].y; + + /* see if current constraint is violated */ + if (xprod(constraint[0], cur) < 0 || xprod(constraint[1], cur) > 0) { + goto constraint_viol; + } + + /* else, update constraint */ + if (abs(cur.x) <= 1 && abs(cur.y) <= 1) { + /* no constraint */ + } else { + off.x = cur.x + ((cur.y>=0 && (cur.y>0 || cur.x<0)) ? 1 : -1); + off.y = cur.y + ((cur.x<=0 && (cur.x<0 || cur.y<0)) ? 1 : -1); + if (xprod(constraint[0], off) >= 0) { + constraint[0] = off; + } + off.x = cur.x + ((cur.y<=0 && (cur.y<0 || cur.x<0)) ? 1 : -1); + off.y = cur.y + ((cur.x>=0 && (cur.x>0 || cur.y<0)) ? 1 : -1); + if (xprod(constraint[1], off) <= 0) { + constraint[1] = off; + } + } + k1 = k; + k = nc[k1]; + if (!cyclic(k,i,k1)) { + break; + } + } + constraint_viol: + /* k1 was the last "corner" satisfying the current constraint, and + k is the first one violating it. We now need to find the last + point along k1..k which satisfied the constraint. */ + dk.x = sign(pt[k].x-pt[k1].x); + dk.y = sign(pt[k].y-pt[k1].y); + cur.x = pt[k1].x - pt[i].x; + cur.y = pt[k1].y - pt[i].y; + /* find largest integer j such that xprod(constraint[0], cur+j*dk) + >= 0 and xprod(constraint[1], cur+j*dk) <= 0. Use bilinearity + of xprod. */ + a = xprod(constraint[0], cur); + b = xprod(constraint[0], dk); + c = xprod(constraint[1], cur); + d = xprod(constraint[1], dk); + /* find largest integer j such that a+j*b>=0 and c+j*d<=0. This + can be solved with integer arithmetic. */ + j = INFTY; + if (b<0) { + j = floordiv(a,-b); + } + if (d>0) { + j = min(j, floordiv(-c,d)); + } + pivk[i] = mod(k1+j,n); + foundk: + ; + } /* for i */ + + /* clean up: for each i, let lon[i] be the largest k such that for + all i' with i<=i'<k, i'<k<=pivk[i']. */ + + j=pivk[n-1]; + pp->lon[n-1]=j; + for (i=n-2; i>=0; i--) { + if (cyclic(i+1,pivk[i],j)) { + j=pivk[i]; + } + pp->lon[i]=j; + } + + for (i=n-1; cyclic(mod(i+1,n),j,pp->lon[i]); i--) { + pp->lon[i] = j; + } + + free(pivk); + free(nc); + return 0; + + malloc_error: + free(pivk); + free(nc); + return 1; +} + + +/* ---------------------------------------------------------------------- */ +/* Stage 2: calculate the optimal polygon (Sec. 2.2.2-2.2.4). */ + +/* Auxiliary function: calculate the penalty of an edge from i to j in + the given path. This needs the "lon" and "sum*" data. */ + +static double penalty3(privpath_t *pp, int i, int j) { + int n = pp->len; + point_t *pt = pp->pt; + sums_t *sums = pp->sums; + + /* assume 0<=i<j<=n */ + double x, y, x2, xy, y2; + double k; + double a, b, c, s; + double px, py, ex, ey; + + int r = 0; /* rotations from i to j */ + + if (j>=n) { + j -= n; + r = 1; + } + + /* critical inner loop: the "if" gives a 4.6 percent speedup */ + if (r == 0) { + x = sums[j+1].x - sums[i].x; + y = sums[j+1].y - sums[i].y; + x2 = sums[j+1].x2 - sums[i].x2; + xy = sums[j+1].xy - sums[i].xy; + y2 = sums[j+1].y2 - sums[i].y2; + k = j+1 - i; + } else { + x = sums[j+1].x - sums[i].x + sums[n].x; + y = sums[j+1].y - sums[i].y + sums[n].y; + x2 = sums[j+1].x2 - sums[i].x2 + sums[n].x2; + xy = sums[j+1].xy - sums[i].xy + sums[n].xy; + y2 = sums[j+1].y2 - sums[i].y2 + sums[n].y2; + k = j+1 - i + n; + } + + px = (pt[i].x + pt[j].x) / 2.0 - pt[0].x; + py = (pt[i].y + pt[j].y) / 2.0 - pt[0].y; + ey = (pt[j].x - pt[i].x); + ex = -(pt[j].y - pt[i].y); + + a = ((x2 - 2*x*px) / k + px*px); + b = ((xy - x*py - y*px) / k + px*py); + c = ((y2 - 2*y*py) / k + py*py); + + s = ex*ex*a + 2*ex*ey*b + ey*ey*c; + + return sqrt(s); +} + +/* find the optimal polygon. Fill in the m and po components. Return 1 + on failure with errno set, else 0. Non-cyclic version: assumes i=0 + is in the polygon. Fixme: implement cyclic version. */ +static int bestpolygon(privpath_t *pp) +{ + int i, j, m, k; + int n = pp->len; + double *pen = NULL; /* pen[n+1]: penalty vector */ + int *prev = NULL; /* prev[n+1]: best path pointer vector */ + int *clip0 = NULL; /* clip0[n]: longest segment pointer, non-cyclic */ + int *clip1 = NULL; /* clip1[n+1]: backwards segment pointer, non-cyclic */ + int *seg0 = NULL; /* seg0[m+1]: forward segment bounds, m<=n */ + int *seg1 = NULL; /* seg1[m+1]: backward segment bounds, m<=n */ + double thispen; + double best; + int c; + + SAFE_MALLOC(pen, n+1, double); + SAFE_MALLOC(prev, n+1, int); + SAFE_MALLOC(clip0, n, int); + SAFE_MALLOC(clip1, n+1, int); + SAFE_MALLOC(seg0, n+1, int); + SAFE_MALLOC(seg1, n+1, int); + + /* calculate clipped paths */ + for (i=0; i<n; i++) { + c = mod(pp->lon[mod(i-1,n)]-1,n); + if (c == i) { + c = mod(i+1,n); + } + if (c < i) { + clip0[i] = n; + } else { + clip0[i] = c; + } + } + + /* calculate backwards path clipping, non-cyclic. j <= clip0[i] iff + clip1[j] <= i, for i,j=0..n. */ + j = 1; + for (i=0; i<n; i++) { + while (j <= clip0[i]) { + clip1[j] = i; + j++; + } + } + + /* calculate seg0[j] = longest path from 0 with j segments */ + i = 0; + for (j=0; i<n; j++) { + seg0[j] = i; + i = clip0[i]; + } + seg0[j] = n; + m = j; + + /* calculate seg1[j] = longest path to n with m-j segments */ + i = n; + for (j=m; j>0; j--) { + seg1[j] = i; + i = clip1[i]; + } + seg1[0] = 0; + + /* now find the shortest path with m segments, based on penalty3 */ + /* note: the outer 2 loops jointly have at most n iterations, thus + the worst-case behavior here is quadratic. In practice, it is + close to linear since the inner loop tends to be short. */ + pen[0]=0; + for (j=1; j<=m; j++) { + for (i=seg1[j]; i<=seg0[j]; i++) { + best = -1; + for (k=seg0[j-1]; k>=clip1[i]; k--) { + thispen = penalty3(pp, k, i) + pen[k]; + if (best < 0 || thispen < best) { + prev[i] = k; + best = thispen; + } + } + pen[i] = best; + } + } + + pp->m = m; + SAFE_MALLOC(pp->po, m, int); + + /* read off shortest path */ + for (i=n, j=m-1; i>0; j--) { + i = prev[i]; + pp->po[j] = i; + } + + free(pen); + free(prev); + free(clip0); + free(clip1); + free(seg0); + free(seg1); + return 0; + + malloc_error: + free(pen); + free(prev); + free(clip0); + free(clip1); + free(seg0); + free(seg1); + return 1; +} + +/* ---------------------------------------------------------------------- */ +/* Stage 3: vertex adjustment (Sec. 2.3.1). */ + +/* Adjust vertices of optimal polygon: calculate the intersection of + the two "optimal" line segments, then move it into the unit square + if it lies outside. Return 1 with errno set on error; 0 on + success. */ + +static int adjust_vertices(privpath_t *pp) { + int m = pp->m; + int *po = pp->po; + int n = pp->len; + point_t *pt = pp->pt; + int x0 = pp->x0; + int y0 = pp->y0; + + dpoint_t *ctr = NULL; /* ctr[m] */ + dpoint_t *dir = NULL; /* dir[m] */ + quadform_t *q = NULL; /* q[m] */ + double v[3]; + double d; + int i, j, k, l; + dpoint_t s; + int r; + + SAFE_MALLOC(ctr, m, dpoint_t); + SAFE_MALLOC(dir, m, dpoint_t); + SAFE_MALLOC(q, m, quadform_t); + + r = privcurve_init(&pp->curve, m); + if (r) { + goto malloc_error; + } + + /* calculate "optimal" point-slope representation for each line + segment */ + for (i=0; i<m; i++) { + j = po[mod(i+1,m)]; + j = mod(j-po[i],n)+po[i]; + pointslope(pp, po[i], j, &ctr[i], &dir[i]); + } + + /* represent each line segment as a singular quadratic form; the + distance of a point (x,y) from the line segment will be + (x,y,1)Q(x,y,1)^t, where Q=q[i]. */ + for (i=0; i<m; i++) { + d = sq(dir[i].x) + sq(dir[i].y); + if (d == 0.0) { + for (j=0; j<3; j++) { + for (k=0; k<3; k++) { + q[i][j][k] = 0; + } + } + } else { + v[0] = dir[i].y; + v[1] = -dir[i].x; + v[2] = - v[1] * ctr[i].y - v[0] * ctr[i].x; + for (l=0; l<3; l++) { + for (k=0; k<3; k++) { + q[i][l][k] = v[l] * v[k] / d; + } + } + } + } + + /* now calculate the "intersections" of consecutive segments. + Instead of using the actual intersection, we find the point + within a given unit square which minimizes the square distance to + the two lines. */ + for (i=0; i<m; i++) { + quadform_t Q; + dpoint_t w; + double dx, dy; + double det; + double min, cand; /* minimum and candidate for minimum of quad. form */ + double xmin, ymin; /* coordinates of minimum */ + int z; + + /* let s be the vertex, in coordinates relative to x0/y0 */ + s.x = pt[po[i]].x-x0; + s.y = pt[po[i]].y-y0; + + /* intersect segments i-1 and i */ + + j = mod(i-1,m); + + /* add quadratic forms */ + for (l=0; l<3; l++) { + for (k=0; k<3; k++) { + Q[l][k] = q[j][l][k] + q[i][l][k]; + } + } + + while(1) { + /* minimize the quadratic form Q on the unit square */ + /* find intersection */ + +#ifdef HAVE_GCC_LOOP_BUG + /* work around gcc bug #12243 */ + free(NULL); +#endif + + det = Q[0][0]*Q[1][1] - Q[0][1]*Q[1][0]; + if (det != 0.0) { + w.x = (-Q[0][2]*Q[1][1] + Q[1][2]*Q[0][1]) / det; + w.y = ( Q[0][2]*Q[1][0] - Q[1][2]*Q[0][0]) / det; + break; + } + + /* matrix is singular - lines are parallel. Add another, + orthogonal axis, through the center of the unit square */ + if (Q[0][0]>Q[1][1]) { + v[0] = -Q[0][1]; + v[1] = Q[0][0]; + } else if (Q[1][1]) { + v[0] = -Q[1][1]; + v[1] = Q[1][0]; + } else { + v[0] = 1; + v[1] = 0; + } + d = sq(v[0]) + sq(v[1]); + v[2] = - v[1] * s.y - v[0] * s.x; + for (l=0; l<3; l++) { + for (k=0; k<3; k++) { + Q[l][k] += v[l] * v[k] / d; + } + } + } + dx = fabs(w.x-s.x); + dy = fabs(w.y-s.y); + if (dx <= .5 && dy <= .5) { + pp->curve.vertex[i].x = w.x+x0; + pp->curve.vertex[i].y = w.y+y0; + continue; + } + + /* the minimum was not in the unit square; now minimize quadratic + on boundary of square */ + min = quadform(Q, s); + xmin = s.x; + ymin = s.y; + + if (Q[0][0] == 0.0) { + goto fixx; + } + for (z=0; z<2; z++) { /* value of the y-coordinate */ + w.y = s.y-0.5+z; + w.x = - (Q[0][1] * w.y + Q[0][2]) / Q[0][0]; + dx = fabs(w.x-s.x); + cand = quadform(Q, w); + if (dx <= .5 && cand < min) { + min = cand; + xmin = w.x; + ymin = w.y; + } + } + fixx: + if (Q[1][1] == 0.0) { + goto corners; + } + for (z=0; z<2; z++) { /* value of the x-coordinate */ + w.x = s.x-0.5+z; + w.y = - (Q[1][0] * w.x + Q[1][2]) / Q[1][1]; + dy = fabs(w.y-s.y); + cand = quadform(Q, w); + if (dy <= .5 && cand < min) { + min = cand; + xmin = w.x; + ymin = w.y; + } + } + corners: + /* check four corners */ + for (l=0; l<2; l++) { + for (k=0; k<2; k++) { + w.x = s.x-0.5+l; + w.y = s.y-0.5+k; + cand = quadform(Q, w); + if (cand < min) { + min = cand; + xmin = w.x; + ymin = w.y; + } + } + } + + pp->curve.vertex[i].x = xmin + x0; + pp->curve.vertex[i].y = ymin + y0; + continue; + } + + free(ctr); + free(dir); + free(q); + return 0; + + malloc_error: + free(ctr); + free(dir); + free(q); + return 1; +} + +/* ---------------------------------------------------------------------- */ +/* Stage 4: smoothing and corner analysis (Sec. 2.3.3) */ + +/* reverse orientation of a path */ +static void reverse(privcurve_t *curve) { + int m = curve->n; + int i, j; + dpoint_t tmp; + + for (i=0, j=m-1; i<j; i++, j--) { + tmp = curve->vertex[i]; + curve->vertex[i] = curve->vertex[j]; + curve->vertex[j] = tmp; + } +} + +/* Always succeeds */ +static void smooth(privcurve_t *curve, double alphamax) { + int m = curve->n; + + int i, j, k; + double dd, denom, alpha; + dpoint_t p2, p3, p4; + + /* examine each vertex and find its best fit */ + for (i=0; i<m; i++) { + j = mod(i+1, m); + k = mod(i+2, m); + p4 = interval(1/2.0, curve->vertex[k], curve->vertex[j]); + + denom = ddenom(curve->vertex[i], curve->vertex[k]); + if (denom != 0.0) { + dd = dpara(curve->vertex[i], curve->vertex[j], curve->vertex[k]) / denom; + dd = fabs(dd); + alpha = dd>1 ? (1 - 1.0/dd) : 0; + alpha = alpha / 0.75; + } else { + alpha = 4/3.0; + } + curve->alpha0[j] = alpha; /* remember "original" value of alpha */ + + if (alpha >= alphamax) { /* pointed corner */ + curve->tag[j] = POTRACE_CORNER; + curve->c[j][1] = curve->vertex[j]; + curve->c[j][2] = p4; + } else { + if (alpha < 0.55) { + alpha = 0.55; + } else if (alpha > 1) { + alpha = 1; + } + p2 = interval(.5+.5*alpha, curve->vertex[i], curve->vertex[j]); + p3 = interval(.5+.5*alpha, curve->vertex[k], curve->vertex[j]); + curve->tag[j] = POTRACE_CURVETO; + curve->c[j][0] = p2; + curve->c[j][1] = p3; + curve->c[j][2] = p4; + } + curve->alpha[j] = alpha; /* store the "cropped" value of alpha */ + curve->beta[j] = 0.5; + } + curve->alphacurve = 1; + + return; +} + +/* ---------------------------------------------------------------------- */ +/* Stage 5: Curve optimization (Sec. 2.4) */ + +/* a private type for the result of opti_penalty */ +struct opti_s { + double pen; /* penalty */ + dpoint_t c[2]; /* curve parameters */ + double t, s; /* curve parameters */ + double alpha; /* curve parameter */ +}; +typedef struct opti_s opti_t; + +/* calculate best fit from i+.5 to j+.5. Assume i<j (cyclically). + Return 0 and set badness and parameters (alpha, beta), if + possible. Return 1 if impossible. */ +static int opti_penalty(privpath_t *pp, int i, int j, opti_t *res, double opttolerance, int *convc, double *areac) { + int m = pp->curve.n; + int k, k1, k2, conv, i1; + double area, alpha, d, d1, d2; + dpoint_t p0, p1, p2, p3, pt; + double A, R, A1, A2, A3, A4; + double s, t; + + /* check convexity, corner-freeness, and maximum bend < 179 degrees */ + + if (i==j) { /* sanity - a full loop can never be an opticurve */ + return 1; + } + + k = i; + i1 = mod(i+1, m); + k1 = mod(k+1, m); + conv = convc[k1]; + if (conv == 0) { + return 1; + } + d = ddist(pp->curve.vertex[i], pp->curve.vertex[i1]); + for (k=k1; k!=j; k=k1) { + k1 = mod(k+1, m); + k2 = mod(k+2, m); + if (convc[k1] != conv) { + return 1; + } + if (sign(cprod(pp->curve.vertex[i], pp->curve.vertex[i1], pp->curve.vertex[k1], pp->curve.vertex[k2])) != conv) { + return 1; + } + if (iprod1(pp->curve.vertex[i], pp->curve.vertex[i1], pp->curve.vertex[k1], pp->curve.vertex[k2]) < d * ddist(pp->curve.vertex[k1], pp->curve.vertex[k2]) * COS179) { + return 1; + } + } + + /* the curve we're working in: */ + p0 = pp->curve.c[mod(i,m)][2]; + p1 = pp->curve.vertex[mod(i+1,m)]; + p2 = pp->curve.vertex[mod(j,m)]; + p3 = pp->curve.c[mod(j,m)][2]; + + /* determine its area */ + area = areac[j] - areac[i]; + area -= dpara(pp->curve.vertex[0], pp->curve.c[i][2], pp->curve.c[j][2])/2; + if (i>=j) { + area += areac[m]; + } + + /* find intersection o of p0p1 and p2p3. Let t,s such that o = + interval(t,p0,p1) = interval(s,p3,p2). Let A be the area of the + triangle (p0,o,p3). */ + + A1 = dpara(p0, p1, p2); + A2 = dpara(p0, p1, p3); + A3 = dpara(p0, p2, p3); + /* A4 = dpara(p1, p2, p3); */ + A4 = A1+A3-A2; + + if (A2 == A1) { /* this should never happen */ + return 1; + } + + t = A3/(A3-A4); + s = A2/(A2-A1); + A = A2 * t / 2.0; + + if (A == 0.0) { /* this should never happen */ + return 1; + } + + R = area / A; /* relative area */ + alpha = 2 - sqrt(4 - R / 0.3); /* overall alpha for p0-o-p3 curve */ + + res->c[0] = interval(t * alpha, p0, p1); + res->c[1] = interval(s * alpha, p3, p2); + res->alpha = alpha; + res->t = t; + res->s = s; + + p1 = res->c[0]; + p2 = res->c[1]; /* the proposed curve is now (p0,p1,p2,p3) */ + + res->pen = 0; + + /* calculate penalty */ + /* check tangency with edges */ + for (k=mod(i+1,m); k!=j; k=k1) { + k1 = mod(k+1,m); + t = tangent(p0, p1, p2, p3, pp->curve.vertex[k], pp->curve.vertex[k1]); + if (t<-.5) { + return 1; + } + pt = bezier(t, p0, p1, p2, p3); + d = ddist(pp->curve.vertex[k], pp->curve.vertex[k1]); + if (d == 0.0) { /* this should never happen */ + return 1; + } + d1 = dpara(pp->curve.vertex[k], pp->curve.vertex[k1], pt) / d; + if (fabs(d1) > opttolerance) { + return 1; + } + if (iprod(pp->curve.vertex[k], pp->curve.vertex[k1], pt) < 0 || iprod(pp->curve.vertex[k1], pp->curve.vertex[k], pt) < 0) { + return 1; + } + res->pen += sq(d1); + } + + /* check corners */ + for (k=i; k!=j; k=k1) { + k1 = mod(k+1,m); + t = tangent(p0, p1, p2, p3, pp->curve.c[k][2], pp->curve.c[k1][2]); + if (t<-.5) { + return 1; + } + pt = bezier(t, p0, p1, p2, p3); + d = ddist(pp->curve.c[k][2], pp->curve.c[k1][2]); + if (d == 0.0) { /* this should never happen */ + return 1; + } + d1 = dpara(pp->curve.c[k][2], pp->curve.c[k1][2], pt) / d; + d2 = dpara(pp->curve.c[k][2], pp->curve.c[k1][2], pp->curve.vertex[k1]) / d; + d2 *= 0.75 * pp->curve.alpha[k1]; + if (d2 < 0) { + d1 = -d1; + d2 = -d2; + } + if (d1 < d2 - opttolerance) { + return 1; + } + if (d1 < d2) { + res->pen += sq(d1 - d2); + } + } + + return 0; +} + +/* optimize the path p, replacing sequences of Bezier segments by a + single segment when possible. Return 0 on success, 1 with errno set + on failure. */ +static int opticurve(privpath_t *pp, double opttolerance) { + int m = pp->curve.n; + int *pt = NULL; /* pt[m+1] */ + double *pen = NULL; /* pen[m+1] */ + int *len = NULL; /* len[m+1] */ + opti_t *opt = NULL; /* opt[m+1] */ + int om; + int i,j,r; + opti_t o; + dpoint_t p0; + int i1; + double area; + double alpha; + double *s = NULL; + double *t = NULL; + + int *convc = NULL; /* conv[m]: pre-computed convexities */ + double *areac = NULL; /* cumarea[m+1]: cache for fast area computation */ + + SAFE_MALLOC(pt, m+1, int); + SAFE_MALLOC(pen, m+1, double); + SAFE_MALLOC(len, m+1, int); + SAFE_MALLOC(opt, m+1, opti_t); + SAFE_MALLOC(convc, m, int); + SAFE_MALLOC(areac, m+1, double); + + /* pre-calculate convexity: +1 = right turn, -1 = left turn, 0 = corner */ + for (i=0; i<m; i++) { + if (pp->curve.tag[i] == POTRACE_CURVETO) { + convc[i] = sign(dpara(pp->curve.vertex[mod(i-1,m)], pp->curve.vertex[i], pp->curve.vertex[mod(i+1,m)])); + } else { + convc[i] = 0; + } + } + + /* pre-calculate areas */ + area = 0.0; + areac[0] = 0.0; + p0 = pp->curve.vertex[0]; + for (i=0; i<m; i++) { + i1 = mod(i+1, m); + if (pp->curve.tag[i1] == POTRACE_CURVETO) { + alpha = pp->curve.alpha[i1]; + area += 0.3*alpha*(4-alpha)*dpara(pp->curve.c[i][2], pp->curve.vertex[i1], pp->curve.c[i1][2])/2; + area += dpara(p0, pp->curve.c[i][2], pp->curve.c[i1][2])/2; + } + areac[i+1] = area; + } + + pt[0] = -1; + pen[0] = 0; + len[0] = 0; + + /* Fixme: we always start from a fixed point -- should find the best + curve cyclically */ + + for (j=1; j<=m; j++) { + /* calculate best path from 0 to j */ + pt[j] = j-1; + pen[j] = pen[j-1]; + len[j] = len[j-1]+1; + + for (i=j-2; i>=0; i--) { + r = opti_penalty(pp, i, mod(j,m), &o, opttolerance, convc, areac); + if (r) { + break; + } + if (len[j] > len[i]+1 || (len[j] == len[i]+1 && pen[j] > pen[i] + o.pen)) { + pt[j] = i; + pen[j] = pen[i] + o.pen; + len[j] = len[i] + 1; + opt[j] = o; + } + } + } + om = len[m]; + r = privcurve_init(&pp->ocurve, om); + if (r) { + goto malloc_error; + } + SAFE_MALLOC(s, om, double); + SAFE_MALLOC(t, om, double); + + j = m; + for (i=om-1; i>=0; i--) { + if (pt[j]==j-1) { + pp->ocurve.tag[i] = pp->curve.tag[mod(j,m)]; + pp->ocurve.c[i][0] = pp->curve.c[mod(j,m)][0]; + pp->ocurve.c[i][1] = pp->curve.c[mod(j,m)][1]; + pp->ocurve.c[i][2] = pp->curve.c[mod(j,m)][2]; + pp->ocurve.vertex[i] = pp->curve.vertex[mod(j,m)]; + pp->ocurve.alpha[i] = pp->curve.alpha[mod(j,m)]; + pp->ocurve.alpha0[i] = pp->curve.alpha0[mod(j,m)]; + pp->ocurve.beta[i] = pp->curve.beta[mod(j,m)]; + s[i] = t[i] = 1.0; + } else { + pp->ocurve.tag[i] = POTRACE_CURVETO; + pp->ocurve.c[i][0] = opt[j].c[0]; + pp->ocurve.c[i][1] = opt[j].c[1]; + pp->ocurve.c[i][2] = pp->curve.c[mod(j,m)][2]; + pp->ocurve.vertex[i] = interval(opt[j].s, pp->curve.c[mod(j,m)][2], pp->curve.vertex[mod(j,m)]); + pp->ocurve.alpha[i] = opt[j].alpha; + pp->ocurve.alpha0[i] = opt[j].alpha; + s[i] = opt[j].s; + t[i] = opt[j].t; + } + j = pt[j]; + } + + /* calculate beta parameters */ + for (i=0; i<om; i++) { + i1 = mod(i+1,om); + pp->ocurve.beta[i] = s[i] / (s[i] + t[i1]); + } + pp->ocurve.alphacurve = 1; + + free(pt); + free(pen); + free(len); + free(opt); + free(s); + free(t); + free(convc); + free(areac); + return 0; + + malloc_error: + free(pt); + free(pen); + free(len); + free(opt); + free(s); + free(t); + free(convc); + free(areac); + return 1; +} + +/* ---------------------------------------------------------------------- */ + +#define TRY(x) if (x) goto try_error + +/* return 0 on success, 1 on error with errno set. */ +int process_path(path_t *plist, const potrace_param_t *param, progress_t *progress) { + path_t *p; + double nn = 0, cn = 0; + + if (progress->callback) { + /* precompute task size for progress estimates */ + nn = 0; + list_forall (p, plist) { + nn += p->priv->len; + } + cn = 0; + } + + /* call downstream function with each path */ + list_forall (p, plist) { + TRY(calc_sums(p->priv)); + TRY(calc_lon(p->priv)); + TRY(bestpolygon(p->priv)); + TRY(adjust_vertices(p->priv)); + if (p->sign == '-') { /* reverse orientation of negative paths */ + reverse(&p->priv->curve); + } + smooth(&p->priv->curve, param->alphamax); + if (param->opticurve) { + TRY(opticurve(p->priv, param->opttolerance)); + p->priv->fcurve = &p->priv->ocurve; + } else { + p->priv->fcurve = &p->priv->curve; + } + privcurve_to_curve(p->priv->fcurve, &p->curve); + + if (progress->callback) { + cn += p->priv->len; + progress_update(cn/nn, progress); + } + } + + progress_update(1.0, progress); + + return 0; + + try_error: + return 1; +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/trace.h b/Build/source/libs/potrace/potrace-1.11/src/trace.h new file mode 100644 index 00000000000..d24ffb354ec --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/trace.h @@ -0,0 +1,15 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef TRACE_H +#define TRACE_H + +#include "potracelib.h" +#include "progress.h" +#include "curve.h" + +int process_path(path_t *plist, const potrace_param_t *param, progress_t *progress); + +#endif /* TRACE_H */ diff --git a/Build/source/libs/potrace/potrace-1.11/src/trans.c b/Build/source/libs/potrace/potrace-1.11/src/trans.c new file mode 100644 index 00000000000..266a98e1543 --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/trans.c @@ -0,0 +1,123 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + +/* calculations with coordinate transformations and bounding boxes */ + +#include <math.h> +#include <string.h> + +#include "trans.h" +#include "bbox.h" + +/* rotate the coordinate system counterclockwise by alpha degrees. The + new bounding box will be the smallest box containing the rotated + old bounding box */ +void trans_rotate(trans_t *r, double alpha) { + double s, c, x0, x1, y0, y1, o0, o1; + trans_t t_struct; + trans_t *t = &t_struct; + + memcpy(t, r, sizeof(trans_t)); + + s = sin(alpha/180*M_PI); + c = cos(alpha/180*M_PI); + + /* apply the transformation matrix to the sides of the bounding box */ + x0 = c * t->bb[0]; + x1 = s * t->bb[0]; + y0 = -s * t->bb[1]; + y1 = c * t->bb[1]; + + /* determine new bounding box, and origin of old bb within new bb */ + r->bb[0] = fabs(x0) + fabs(y0); + r->bb[1] = fabs(x1) + fabs(y1); + o0 = - min(x0,0) - min(y0,0); + o1 = - min(x1,0) - min(y1,0); + + r->orig[0] = o0 + c * t->orig[0] - s * t->orig[1]; + r->orig[1] = o1 + s * t->orig[0] + c * t->orig[1]; + r->x[0] = c * t->x[0] - s * t->x[1]; + r->x[1] = s * t->x[0] + c * t->x[1]; + r->y[0] = c * t->y[0] - s * t->y[1]; + r->y[1] = s * t->y[0] + c * t->y[1]; +} + +/* return the standard cartesian coordinate system for an w x h rectangle. */ +void trans_from_rect(trans_t *r, double w, double h) { + r->bb[0] = w; + r->bb[1] = h; + r->orig[0] = 0.0; + r->orig[1] = 0.0; + r->x[0] = 1.0; + r->x[1] = 0.0; + r->y[0] = 0.0; + r->y[1] = 1.0; + r->scalex = 1.0; + r->scaley = 1.0; +} + +/* rescale the coordinate system r by factor sc >= 0. */ +void trans_rescale(trans_t *r, double sc) { + r->bb[0] *= sc; + r->bb[1] *= sc; + r->orig[0] *= sc; + r->orig[1] *= sc; + r->x[0] *= sc; + r->x[1] *= sc; + r->y[0] *= sc; + r->y[1] *= sc; + r->scalex *= sc; + r->scaley *= sc; +} + +/* rescale the coordinate system to size w x h */ +void trans_scale_to_size(trans_t *r, double w, double h) { + double xsc = w/r->bb[0]; + double ysc = h/r->bb[1]; + + r->bb[0] = w; + r->bb[1] = h; + r->orig[0] *= xsc; + r->orig[1] *= ysc; + r->x[0] *= xsc; + r->x[1] *= ysc; + r->y[0] *= xsc; + r->y[1] *= ysc; + r->scalex *= xsc; + r->scaley *= ysc; + + if (w<0) { + r->orig[0] -= w; + r->bb[0] = -w; + } + if (h<0) { + r->orig[1] -= h; + r->bb[1] = -h; + } +} + +/* adjust the bounding box to the actual vector outline */ +void trans_tighten(trans_t *r, potrace_path_t *plist) { + interval_t i; + dpoint_t dir; + int j; + + /* if pathlist is empty, do nothing */ + if (!plist) { + return; + } + + for (j=0; j<2; j++) { + dir.x = r->x[j]; + dir.y = r->y[j]; + path_limits(plist, dir, &i); + if (i.min == i.max) { + /* make the extent non-zero to avoid later division by zero errors */ + i.max = i.min+0.5; + i.min = i.min-0.5; + } + r->bb[j] = i.max - i.min; + r->orig[j] = -i.min; + } +} diff --git a/Build/source/libs/potrace/potrace-1.11/src/trans.h b/Build/source/libs/potrace/potrace-1.11/src/trans.h new file mode 100644 index 00000000000..be6e183a69b --- /dev/null +++ b/Build/source/libs/potrace/potrace-1.11/src/trans.h @@ -0,0 +1,36 @@ +/* Copyright (C) 2001-2013 Peter Selinger. + This file is part of Potrace. It is free software and it is covered + by the GNU General Public License. See the file COPYING for details. */ + + +#ifndef TRANS_H +#define TRANS_H + +#include "auxiliary.h" + +/* structure to hold a coordinate transformation */ +struct trans_s { + double bb[2]; /* dimensions of bounding box */ + double orig[2]; /* origin relative to bounding box */ + double x[2]; /* basis vector for the "x" direction */ + double y[2]; /* basis vector for the "y" direction */ + double scalex, scaley; /* redundant info for some backends' benefit */ +}; +typedef struct trans_s trans_t; + +/* apply a coordinate transformation to a point */ +static inline dpoint_t trans(dpoint_t p, trans_t t) { + dpoint_t res; + + res.x = t.orig[0] + p.x * t.x[0] + p.y * t.y[0]; + res.y = t.orig[1] + p.x * t.x[1] + p.y * t.y[1]; + return res; +} + +void trans_rotate(trans_t *r, double alpha); +void trans_from_rect(trans_t *r, double w, double h); +void trans_rescale(trans_t *r, double sc); +void trans_scale_to_size(trans_t *r, double w, double h); +void trans_tighten(trans_t *r, potrace_path_t *plist); + +#endif /* TRANS_H */ diff --git a/Build/source/libs/potrace/potrace.test b/Build/source/libs/potrace/potrace.test new file mode 100755 index 00000000000..b3b34995917 --- /dev/null +++ b/Build/source/libs/potrace/potrace.test @@ -0,0 +1,7 @@ +#! /bin/sh + +# Copyright (C) 2013 Peter Breitenlohner <tex-live@tug.org> +# You may freely use, modify and/or distribute this file. + +./potracetst || exit 1 + diff --git a/Build/source/libs/potrace/potracetst.c b/Build/source/libs/potrace/potracetst.c new file mode 100644 index 00000000000..25197c48132 --- /dev/null +++ b/Build/source/libs/potrace/potracetst.c @@ -0,0 +1,14 @@ +/* potracetst.c: Basic test for libpotrace + * + * Copyright (C) 2013 Peter Breitenlohner <tex-live@tug.org> + * You may freely use, modify and/or distribute this file. + */ + +#include <stdio.h> +#include <potracelib.h> + +int main (int argc, char **argv) +{ + printf ("%s: using %s\n", argv[0], potrace_version ()); + return 0; +} diff --git a/Build/source/libs/potrace/version.ac b/Build/source/libs/potrace/version.ac new file mode 100644 index 00000000000..2d1d6a1c69b --- /dev/null +++ b/Build/source/libs/potrace/version.ac @@ -0,0 +1,11 @@ +dnl +dnl Copyright (C) 2013 Peter Breitenlohner <tex-live@tug.org> +dnl +dnl This file is free software; the copyright holder +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl -------------------------------------------------------- +dnl +dnl m4-include this file to define the current potrace version +m4_define([potrace_version], [1.11]) |