Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Difference From d5cddb67f4e39e6b To 2f49a3a4f4792db1
2013-08-24
| ||
08:10 | upgrading to automake 1.13.4 Leaf check-in: 2f49a3a4f4 user: sandro tags: trunk | |
2013-02-18
| ||
09:37 | supporting SVG dasharray check-in: eeac5b1cd9 user: sandro tags: trunk | |
2011-11-12
| ||
09:48 | initial repository setp up check-in: e7d0f5bcc0 user: sandro tags: trunk | |
09:44 | initial empty check-in check-in: d5cddb67f4 user: sandro tags: trunk | |
Added AUTHORS.
1 +Original Author: 2 +Alessandro Furieri <a.furieri@lqt.it>
Added COPYING.
1 + GNU LESSER GENERAL PUBLIC LICENSE 2 + Version 3, 29 June 2007 3 + 4 + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> 5 + Everyone is permitted to copy and distribute verbatim copies 6 + of this license document, but changing it is not allowed. 7 + 8 + 9 + This version of the GNU Lesser General Public License incorporates 10 +the terms and conditions of version 3 of the GNU General Public 11 +License, supplemented by the additional permissions listed below. 12 + 13 + 0. Additional Definitions. 14 + 15 + As used herein, "this License" refers to version 3 of the GNU Lesser 16 +General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 +General Public License. 18 + 19 + "The Library" refers to a covered work governed by this License, 20 +other than an Application or a Combined Work as defined below. 21 + 22 + An "Application" is any work that makes use of an interface provided 23 +by the Library, but which is not otherwise based on the Library. 24 +Defining a subclass of a class defined by the Library is deemed a mode 25 +of using an interface provided by the Library. 26 + 27 + A "Combined Work" is a work produced by combining or linking an 28 +Application with the Library. The particular version of the Library 29 +with which the Combined Work was made is also called the "Linked 30 +Version". 31 + 32 + The "Minimal Corresponding Source" for a Combined Work means the 33 +Corresponding Source for the Combined Work, excluding any source code 34 +for portions of the Combined Work that, considered in isolation, are 35 +based on the Application, and not on the Linked Version. 36 + 37 + The "Corresponding Application Code" for a Combined Work means the 38 +object code and/or source code for the Application, including any data 39 +and utility programs needed for reproducing the Combined Work from the 40 +Application, but excluding the System Libraries of the Combined Work. 41 + 42 + 1. Exception to Section 3 of the GNU GPL. 43 + 44 + You may convey a covered work under sections 3 and 4 of this License 45 +without being bound by section 3 of the GNU GPL. 46 + 47 + 2. Conveying Modified Versions. 48 + 49 + If you modify a copy of the Library, and, in your modifications, a 50 +facility refers to a function or data to be supplied by an Application 51 +that uses the facility (other than as an argument passed when the 52 +facility is invoked), then you may convey a copy of the modified 53 +version: 54 + 55 + a) under this License, provided that you make a good faith effort to 56 + ensure that, in the event an Application does not supply the 57 + function or data, the facility still operates, and performs 58 + whatever part of its purpose remains meaningful, or 59 + 60 + b) under the GNU GPL, with none of the additional permissions of 61 + this License applicable to that copy. 62 + 63 + 3. Object Code Incorporating Material from Library Header Files. 64 + 65 + The object code form of an Application may incorporate material from 66 +a header file that is part of the Library. You may convey such object 67 +code under terms of your choice, provided that, if the incorporated 68 +material is not limited to numerical parameters, data structure 69 +layouts and accessors, or small macros, inline functions and templates 70 +(ten or fewer lines in length), you do both of the following: 71 + 72 + a) Give prominent notice with each copy of the object code that the 73 + Library is used in it and that the Library and its use are 74 + covered by this License. 75 + 76 + b) Accompany the object code with a copy of the GNU GPL and this license 77 + document. 78 + 79 + 4. Combined Works. 80 + 81 + You may convey a Combined Work under terms of your choice that, 82 +taken together, effectively do not restrict modification of the 83 +portions of the Library contained in the Combined Work and reverse 84 +engineering for debugging such modifications, if you also do each of 85 +the following: 86 + 87 + a) Give prominent notice with each copy of the Combined Work that 88 + the Library is used in it and that the Library and its use are 89 + covered by this License. 90 + 91 + b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 + document. 93 + 94 + c) For a Combined Work that displays copyright notices during 95 + execution, include the copyright notice for the Library among 96 + these notices, as well as a reference directing the user to the 97 + copies of the GNU GPL and this license document. 98 + 99 + d) Do one of the following: 100 + 101 + 0) Convey the Minimal Corresponding Source under the terms of this 102 + License, and the Corresponding Application Code in a form 103 + suitable for, and under terms that permit, the user to 104 + recombine or relink the Application with a modified version of 105 + the Linked Version to produce a modified Combined Work, in the 106 + manner specified by section 6 of the GNU GPL for conveying 107 + Corresponding Source. 108 + 109 + 1) Use a suitable shared library mechanism for linking with the 110 + Library. A suitable mechanism is one that (a) uses at run time 111 + a copy of the Library already present on the user's computer 112 + system, and (b) will operate properly with a modified version 113 + of the Library that is interface-compatible with the Linked 114 + Version. 115 + 116 + e) Provide Installation Information, but only if you would otherwise 117 + be required to provide such information under section 6 of the 118 + GNU GPL, and only to the extent that such information is 119 + necessary to install and execute a modified version of the 120 + Combined Work produced by recombining or relinking the 121 + Application with a modified version of the Linked Version. (If 122 + you use option 4d0, the Installation Information must accompany 123 + the Minimal Corresponding Source and Corresponding Application 124 + Code. If you use option 4d1, you must provide the Installation 125 + Information in the manner specified by section 6 of the GNU GPL 126 + for conveying Corresponding Source.) 127 + 128 + 5. Combined Libraries. 129 + 130 + You may place library facilities that are a work based on the 131 +Library side by side in a single library together with other library 132 +facilities that are not Applications and are not covered by this 133 +License, and convey such a combined library under terms of your 134 +choice, if you do both of the following: 135 + 136 + a) Accompany the combined library with a copy of the same work based 137 + on the Library, uncombined with any other library facilities, 138 + conveyed under the terms of this License. 139 + 140 + b) Give prominent notice with the combined library that part of it 141 + is a work based on the Library, and explaining where to find the 142 + accompanying uncombined form of the same work. 143 + 144 + 6. Revised Versions of the GNU Lesser General Public License. 145 + 146 + The Free Software Foundation may publish revised and/or new versions 147 +of the GNU Lesser General Public License from time to time. Such new 148 +versions will be similar in spirit to the present version, but may 149 +differ in detail to address new problems or concerns. 150 + 151 + Each version is given a distinguishing version number. If the 152 +Library as you received it specifies that a certain numbered version 153 +of the GNU Lesser General Public License "or any later version" 154 +applies to it, you have the option of following the terms and 155 +conditions either of that published version or of any later version 156 +published by the Free Software Foundation. If the Library as you 157 +received it does not specify a version number of the GNU Lesser 158 +General Public License, you may choose any version of the GNU Lesser 159 +General Public License ever published by the Free Software Foundation. 160 + 161 + If the Library as you received it specifies that a proxy can decide 162 +whether future versions of the GNU Lesser General Public License shall 163 +apply, that proxy's public statement of acceptance of any version is 164 +permanent authorization for you to choose that version for the 165 +Library. 166 +
Added ChangeLog.
Added INSTALL.
1 +Basic Installation 2 +================== 3 + 4 + These are generic installation instructions. 5 + 6 + The `configure' shell script attempts to guess correct values for 7 +various system-dependent variables used during compilation. It uses 8 +those values to create a `Makefile' in each directory of the package. 9 +It may also create one or more `.h' files containing system-dependent 10 +definitions. Finally, it creates a shell script `config.status' that 11 +you can run in the future to recreate the current configuration, a file 12 +`config.cache' that saves the results of its tests to speed up 13 +reconfiguring, and a file `config.log' containing compiler output 14 +(useful mainly for debugging `configure'). 15 + 16 + If you need to do unusual things to compile the package, please try 17 +to figure out how `configure' could check whether to do them, and mail 18 +diffs or instructions to the address given in the `README' so they can 19 +be considered for the next release. If at some point `config.cache' 20 +contains results you don't want to keep, you may remove or edit it. 21 + 22 + The file `configure.in' is used to create `configure' by a program 23 +called `autoconf'. You only need `configure.in' if you want to change 24 +it or regenerate `configure' using a newer version of `autoconf'. 25 + 26 +The simplest way to compile this package is: 27 + 28 + 1. `cd' to the directory containing the package's source code and type 29 + `./configure' to configure the package for your system. If you're 30 + using `csh' on an old version of System V, you might need to type 31 + `sh ./configure' instead to prevent `csh' from trying to execute 32 + `configure' itself. 33 + 34 + Running `configure' takes awhile. While running, it prints some 35 + messages telling which features it is checking for. 36 + 37 + 2. Type `make' to compile the package. 38 + 39 + 3. Optionally, type `make check' to run any self-tests that come with 40 + the package. 41 + 42 + 4. Type `make install' to install the programs and any data files and 43 + documentation. 44 + 45 + 5. You can remove the program binaries and object files from the 46 + source code directory by typing `make clean'. To also remove the 47 + files that `configure' created (so you can compile the package for 48 + a different kind of computer), type `make distclean'. There is 49 + also a `make maintainer-clean' target, but that is intended mainly 50 + for the package's developers. If you use it, you may have to get 51 + all sorts of other programs in order to regenerate files that came 52 + with the distribution. 53 + 54 +Compilers and Options 55 +===================== 56 + 57 + Some systems require unusual options for compilation or linking that 58 +the `configure' script does not know about. You can give `configure' 59 +initial values for variables by setting them in the environment. Using 60 +a Bourne-compatible shell, you can do that on the command line like 61 +this: 62 + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure 63 + 64 +Or on systems that have the `env' program, you can do it like this: 65 + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure 66 + 67 +Compiling For Multiple Architectures 68 +==================================== 69 + 70 + You can compile the package for more than one kind of computer at the 71 +same time, by placing the object files for each architecture in their 72 +own directory. To do this, you must use a version of `make' that 73 +supports the `VPATH' variable, such as GNU `make'. `cd' to the 74 +directory where you want the object files and executables to go and run 75 +the `configure' script. `configure' automatically checks for the 76 +source code in the directory that `configure' is in and in `..'. 77 + 78 + If you have to use a `make' that does not supports the `VPATH' 79 +variable, you have to compile the package for one architecture at a time 80 +in the source code directory. After you have installed the package for 81 +one architecture, use `make distclean' before reconfiguring for another 82 +architecture. 83 + 84 +Installation Names 85 +================== 86 + 87 + By default, `make install' will install the package's files in 88 +`/usr/local/bin', `/usr/local/man', etc. You can specify an 89 +installation prefix other than `/usr/local' by giving `configure' the 90 +option `--prefix=PATH'. 91 + 92 + You can specify separate installation prefixes for 93 +architecture-specific files and architecture-independent files. If you 94 +give `configure' the option `--exec-prefix=PATH', the package will use 95 +PATH as the prefix for installing programs and libraries. 96 +Documentation and other data files will still use the regular prefix. 97 + 98 + In addition, if you use an unusual directory layout you can give 99 +options like `--bindir=PATH' to specify different values for particular 100 +kinds of files. Run `configure --help' for a list of the directories 101 +you can set and what kinds of files go in them. 102 + 103 + If the package supports it, you can cause programs to be installed 104 +with an extra prefix or suffix on their names by giving `configure' the 105 +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. 106 + 107 +Optional Features 108 +================= 109 + 110 + Some packages pay attention to `--enable-FEATURE' options to 111 +`configure', where FEATURE indicates an optional part of the package. 112 +They may also pay attention to `--with-PACKAGE' options, where PACKAGE 113 +is something like `gnu-as' or `x' (for the X Window System). The 114 +`README' should mention any `--enable-' and `--with-' options that the 115 +package recognizes. 116 + 117 + For packages that use the X Window System, `configure' can usually 118 +find the X include and library files automatically, but if it doesn't, 119 +you can use the `configure' options `--x-includes=DIR' and 120 +`--x-libraries=DIR' to specify their locations. 121 + 122 +Specifying the System Type 123 +========================== 124 + 125 + There may be some features `configure' can not figure out 126 +automatically, but needs to determine by the type of host the package 127 +will run on. Usually `configure' can figure that out, but if it prints 128 +a message saying it can not guess the host type, give it the 129 +`--host=TYPE' option. TYPE can either be a short name for the system 130 +type, such as `sun4', or a canonical name with three fields: 131 + CPU-COMPANY-SYSTEM 132 + 133 +See the file `config.sub' for the possible values of each field. If 134 +`config.sub' isn't included in this package, then this package doesn't 135 +need to know the host type. 136 + 137 + If you are building compiler tools for cross-compiling, you can also 138 +use the `--target=TYPE' option to select the type of system they will 139 +produce code for and the `--build=TYPE' option to select the type of 140 +system on which you are compiling the package. 141 + 142 +Sharing Defaults 143 +================ 144 + 145 + If you want to set default values for `configure' scripts to share, 146 +you can create a site shell script called `config.site' that gives 147 +default values for variables like `CC', `cache_file', and `prefix'. 148 +`configure' looks for `PREFIX/share/config.site' if it exists, then 149 +`PREFIX/etc/config.site' if it exists. Or, you can set the 150 +`CONFIG_SITE' environment variable to the location of the site script. 151 +A warning: not all `configure' scripts look for a site script. 152 + 153 +Operation Controls 154 +================== 155 + 156 + `configure' recognizes the following options to control how it 157 +operates. 158 + 159 +`--cache-file=FILE' 160 + Use and save the results of the tests in FILE instead of 161 + `./config.cache'. Set FILE to `/dev/null' to disable caching, for 162 + debugging `configure'. 163 + 164 +`--help' 165 + Print a summary of the options to `configure', and exit. 166 + 167 +`--quiet' 168 +`--silent' 169 +`-q' 170 + Do not print messages saying which checks are being made. To 171 + suppress all normal output, redirect it to `/dev/null' (any error 172 + messages will still be shown). 173 + 174 +`--srcdir=DIR' 175 + Look for the package's source code in directory DIR. Usually 176 + `configure' can determine that directory automatically. 177 + 178 +`--version' 179 + Print the version of Autoconf used to generate the `configure' 180 + script, and exit. 181 + 182 +`configure' also accepts some other, not widely useful, options. 183 +
Added Makefile.am.
1 +ACLOCAL_AMFLAGS = -I m4 2 + 3 +SUBDIRS = headers src 4 + 5 +AUTOMAKE_OPTIONS = dist-zip 6 + 7 +pkgconfigdir = $(libdir)/pkgconfig 8 +pkgconfig_DATA = gaiagraphics.pc 9 +
Added Makefile.in.
1 +# Makefile.in generated by automake 1.13.4 from Makefile.am. 2 +# @configure_input@ 3 + 4 +# Copyright (C) 1994-2013 Free Software Foundation, Inc. 5 + 6 +# This Makefile.in is free software; the Free Software Foundation 7 +# gives unlimited permission to copy and/or distribute it, 8 +# with or without modifications, as long as this notice is preserved. 9 + 10 +# This program is distributed in the hope that it will be useful, 11 +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without 12 +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A 13 +# PARTICULAR PURPOSE. 14 + 15 +@SET_MAKE@ 16 + 17 +VPATH = @srcdir@ 18 +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 19 +am__make_running_with_option = \ 20 + case $${target_option-} in \ 21 + ?) ;; \ 22 + *) echo "am__make_running_with_option: internal error: invalid" \ 23 + "target option '$${target_option-}' specified" >&2; \ 24 + exit 1;; \ 25 + esac; \ 26 + has_opt=no; \ 27 + sane_makeflags=$$MAKEFLAGS; \ 28 + if $(am__is_gnu_make); then \ 29 + sane_makeflags=$$MFLAGS; \ 30 + else \ 31 + case $$MAKEFLAGS in \ 32 + *\\[\ \ ]*) \ 33 + bs=\\; \ 34 + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ 35 + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ 36 + esac; \ 37 + fi; \ 38 + skip_next=no; \ 39 + strip_trailopt () \ 40 + { \ 41 + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ 42 + }; \ 43 + for flg in $$sane_makeflags; do \ 44 + test $$skip_next = yes && { skip_next=no; continue; }; \ 45 + case $$flg in \ 46 + *=*|--*) continue;; \ 47 + -*I) strip_trailopt 'I'; skip_next=yes;; \ 48 + -*I?*) strip_trailopt 'I';; \ 49 + -*O) strip_trailopt 'O'; skip_next=yes;; \ 50 + -*O?*) strip_trailopt 'O';; \ 51 + -*l) strip_trailopt 'l'; skip_next=yes;; \ 52 + -*l?*) strip_trailopt 'l';; \ 53 + -[dEDm]) skip_next=yes;; \ 54 + -[JT]) skip_next=yes;; \ 55 + esac; \ 56 + case $$flg in \ 57 + *$$target_option*) has_opt=yes; break;; \ 58 + esac; \ 59 + done; \ 60 + test $$has_opt = yes 61 +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 62 +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 63 +pkgdatadir = $(datadir)/@PACKAGE@ 64 +pkgincludedir = $(includedir)/@PACKAGE@ 65 +pkglibdir = $(libdir)/@PACKAGE@ 66 +pkglibexecdir = $(libexecdir)/@PACKAGE@ 67 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 68 +install_sh_DATA = $(install_sh) -c -m 644 69 +install_sh_PROGRAM = $(install_sh) -c 70 +install_sh_SCRIPT = $(install_sh) -c 71 +INSTALL_HEADER = $(INSTALL_DATA) 72 +transform = $(program_transform_name) 73 +NORMAL_INSTALL = : 74 +PRE_INSTALL = : 75 +POST_INSTALL = : 76 +NORMAL_UNINSTALL = : 77 +PRE_UNINSTALL = : 78 +POST_UNINSTALL = : 79 +build_triplet = @build@ 80 +host_triplet = @host@ 81 +subdir = . 82 +DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ 83 + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ 84 + $(top_srcdir)/configure $(am__configure_deps) \ 85 + $(srcdir)/gaiagraphics.pc.in COPYING config.guess config.sub \ 86 + depcomp install-sh missing ltmain.sh 87 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 88 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ 89 + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ 90 + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ 91 + $(top_srcdir)/configure.ac 92 +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 93 + $(ACLOCAL_M4) 94 +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ 95 + configure.lineno config.status.lineno 96 +mkinstalldirs = $(install_sh) -d 97 +CONFIG_CLEAN_FILES = gaiagraphics.pc 98 +CONFIG_CLEAN_VPATH_FILES = 99 +AM_V_P = $(am__v_P_@AM_V@) 100 +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 101 +am__v_P_0 = false 102 +am__v_P_1 = : 103 +AM_V_GEN = $(am__v_GEN_@AM_V@) 104 +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 105 +am__v_GEN_0 = @echo " GEN " $@; 106 +am__v_GEN_1 = 107 +AM_V_at = $(am__v_at_@AM_V@) 108 +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 109 +am__v_at_0 = @ 110 +am__v_at_1 = 111 +SOURCES = 112 +DIST_SOURCES = 113 +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ 114 + ctags-recursive dvi-recursive html-recursive info-recursive \ 115 + install-data-recursive install-dvi-recursive \ 116 + install-exec-recursive install-html-recursive \ 117 + install-info-recursive install-pdf-recursive \ 118 + install-ps-recursive install-recursive installcheck-recursive \ 119 + installdirs-recursive pdf-recursive ps-recursive \ 120 + tags-recursive uninstall-recursive 121 +am__can_run_installinfo = \ 122 + case $$AM_UPDATE_INFO_DIR in \ 123 + n|no|NO) false;; \ 124 + *) (install-info --version) >/dev/null 2>&1;; \ 125 + esac 126 +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; 127 +am__vpath_adj = case $$p in \ 128 + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ 129 + *) f=$$p;; \ 130 + esac; 131 +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; 132 +am__install_max = 40 133 +am__nobase_strip_setup = \ 134 + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` 135 +am__nobase_strip = \ 136 + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" 137 +am__nobase_list = $(am__nobase_strip_setup); \ 138 + for p in $$list; do echo "$$p $$p"; done | \ 139 + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ 140 + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ 141 + if (++n[$$2] == $(am__install_max)) \ 142 + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ 143 + END { for (dir in files) print dir, files[dir] }' 144 +am__base_list = \ 145 + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ 146 + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' 147 +am__uninstall_files_from_dir = { \ 148 + test -z "$$files" \ 149 + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ 150 + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ 151 + $(am__cd) "$$dir" && rm -f $$files; }; \ 152 + } 153 +am__installdirs = "$(DESTDIR)$(pkgconfigdir)" 154 +DATA = $(pkgconfig_DATA) 155 +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ 156 + distclean-recursive maintainer-clean-recursive 157 +am__recursive_targets = \ 158 + $(RECURSIVE_TARGETS) \ 159 + $(RECURSIVE_CLEAN_TARGETS) \ 160 + $(am__extra_recursive_targets) 161 +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ 162 + cscope distdir dist dist-all distcheck 163 +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) 164 +# Read a list of newline-separated strings from the standard input, 165 +# and print each of them once, without duplicates. Input order is 166 +# *not* preserved. 167 +am__uniquify_input = $(AWK) '\ 168 + BEGIN { nonempty = 0; } \ 169 + { items[$$0] = 1; nonempty = 1; } \ 170 + END { if (nonempty) { for (i in items) print i; }; } \ 171 +' 172 +# Make sure the list of sources is unique. This is necessary because, 173 +# e.g., the same source file might be shared among _SOURCES variables 174 +# for different programs/libraries. 175 +am__define_uniq_tagged_files = \ 176 + list='$(am__tagged_files)'; \ 177 + unique=`for i in $$list; do \ 178 + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ 179 + done | $(am__uniquify_input)` 180 +ETAGS = etags 181 +CTAGS = ctags 182 +CSCOPE = cscope 183 +DIST_SUBDIRS = $(SUBDIRS) 184 +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 185 +distdir = $(PACKAGE)-$(VERSION) 186 +top_distdir = $(distdir) 187 +am__remove_distdir = \ 188 + if test -d "$(distdir)"; then \ 189 + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ 190 + && rm -rf "$(distdir)" \ 191 + || { sleep 5 && rm -rf "$(distdir)"; }; \ 192 + else :; fi 193 +am__post_remove_distdir = $(am__remove_distdir) 194 +am__relativize = \ 195 + dir0=`pwd`; \ 196 + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ 197 + sed_rest='s,^[^/]*/*,,'; \ 198 + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ 199 + sed_butlast='s,/*[^/]*$$,,'; \ 200 + while test -n "$$dir1"; do \ 201 + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ 202 + if test "$$first" != "."; then \ 203 + if test "$$first" = ".."; then \ 204 + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ 205 + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ 206 + else \ 207 + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ 208 + if test "$$first2" = "$$first"; then \ 209 + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ 210 + else \ 211 + dir2="../$$dir2"; \ 212 + fi; \ 213 + dir0="$$dir0"/"$$first"; \ 214 + fi; \ 215 + fi; \ 216 + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ 217 + done; \ 218 + reldir="$$dir2" 219 +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).zip 220 +GZIP_ENV = --best 221 +DIST_TARGETS = dist-gzip dist-zip 222 +distuninstallcheck_listfiles = find . -type f -print 223 +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ 224 + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' 225 +distcleancheck_listfiles = find . -type f -print 226 +ACLOCAL = @ACLOCAL@ 227 +AMTAR = @AMTAR@ 228 +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ 229 +AR = @AR@ 230 +AS = @AS@ 231 +AUTOCONF = @AUTOCONF@ 232 +AUTOHEADER = @AUTOHEADER@ 233 +AUTOMAKE = @AUTOMAKE@ 234 +AWK = @AWK@ 235 +CC = @CC@ 236 +CCDEPMODE = @CCDEPMODE@ 237 +CFLAGS = @CFLAGS@ 238 +CPP = @CPP@ 239 +CPPFLAGS = @CPPFLAGS@ 240 +CXX = @CXX@ 241 +CXXCPP = @CXXCPP@ 242 +CXXDEPMODE = @CXXDEPMODE@ 243 +CXXFLAGS = @CXXFLAGS@ 244 +CYGPATH_W = @CYGPATH_W@ 245 +DEFS = @DEFS@ 246 +DEPDIR = @DEPDIR@ 247 +DLLTOOL = @DLLTOOL@ 248 +DSYMUTIL = @DSYMUTIL@ 249 +DUMPBIN = @DUMPBIN@ 250 +ECHO_C = @ECHO_C@ 251 +ECHO_N = @ECHO_N@ 252 +ECHO_T = @ECHO_T@ 253 +EGREP = @EGREP@ 254 +EXEEXT = @EXEEXT@ 255 +FGREP = @FGREP@ 256 +GREP = @GREP@ 257 +INSTALL = @INSTALL@ 258 +INSTALL_DATA = @INSTALL_DATA@ 259 +INSTALL_PROGRAM = @INSTALL_PROGRAM@ 260 +INSTALL_SCRIPT = @INSTALL_SCRIPT@ 261 +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ 262 +LD = @LD@ 263 +LDFLAGS = @LDFLAGS@ 264 +LIBCAIRO_CFLAGS = @LIBCAIRO_CFLAGS@ 265 +LIBCAIRO_LIBS = @LIBCAIRO_LIBS@ 266 +LIBOBJS = @LIBOBJS@ 267 +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ 268 +LIBPNG_LIBS = @LIBPNG_LIBS@ 269 +LIBS = @LIBS@ 270 +LIBTOOL = @LIBTOOL@ 271 +LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ 272 +LIBXML2_LIBS = @LIBXML2_LIBS@ 273 +LIPO = @LIPO@ 274 +LN_S = @LN_S@ 275 +LTLIBOBJS = @LTLIBOBJS@ 276 +MAINT = @MAINT@ 277 +MAKEINFO = @MAKEINFO@ 278 +MANIFEST_TOOL = @MANIFEST_TOOL@ 279 +MKDIR_P = @MKDIR_P@ 280 +NM = @NM@ 281 +NMEDIT = @NMEDIT@ 282 +OBJDUMP = @OBJDUMP@ 283 +OBJEXT = @OBJEXT@ 284 +OTOOL = @OTOOL@ 285 +OTOOL64 = @OTOOL64@ 286 +PACKAGE = @PACKAGE@ 287 +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ 288 +PACKAGE_NAME = @PACKAGE_NAME@ 289 +PACKAGE_STRING = @PACKAGE_STRING@ 290 +PACKAGE_TARNAME = @PACKAGE_TARNAME@ 291 +PACKAGE_URL = @PACKAGE_URL@ 292 +PACKAGE_VERSION = @PACKAGE_VERSION@ 293 +PATH_SEPARATOR = @PATH_SEPARATOR@ 294 +PKG_CONFIG = @PKG_CONFIG@ 295 +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ 296 +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ 297 +RANLIB = @RANLIB@ 298 +SED = @SED@ 299 +SET_MAKE = @SET_MAKE@ 300 +SHELL = @SHELL@ 301 +STRIP = @STRIP@ 302 +VERSION = @VERSION@ 303 +abs_builddir = @abs_builddir@ 304 +abs_srcdir = @abs_srcdir@ 305 +abs_top_builddir = @abs_top_builddir@ 306 +abs_top_srcdir = @abs_top_srcdir@ 307 +ac_ct_AR = @ac_ct_AR@ 308 +ac_ct_CC = @ac_ct_CC@ 309 +ac_ct_CXX = @ac_ct_CXX@ 310 +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 311 +am__include = @am__include@ 312 +am__leading_dot = @am__leading_dot@ 313 +am__quote = @am__quote@ 314 +am__tar = @am__tar@ 315 +am__untar = @am__untar@ 316 +bindir = @bindir@ 317 +build = @build@ 318 +build_alias = @build_alias@ 319 +build_cpu = @build_cpu@ 320 +build_os = @build_os@ 321 +build_vendor = @build_vendor@ 322 +builddir = @builddir@ 323 +datadir = @datadir@ 324 +datarootdir = @datarootdir@ 325 +docdir = @docdir@ 326 +dvidir = @dvidir@ 327 +exec_prefix = @exec_prefix@ 328 +host = @host@ 329 +host_alias = @host_alias@ 330 +host_cpu = @host_cpu@ 331 +host_os = @host_os@ 332 +host_vendor = @host_vendor@ 333 +htmldir = @htmldir@ 334 +includedir = @includedir@ 335 +infodir = @infodir@ 336 +install_sh = @install_sh@ 337 +libdir = @libdir@ 338 +libexecdir = @libexecdir@ 339 +localedir = @localedir@ 340 +localstatedir = @localstatedir@ 341 +mandir = @mandir@ 342 +mkdir_p = @mkdir_p@ 343 +oldincludedir = @oldincludedir@ 344 +pdfdir = @pdfdir@ 345 +prefix = @prefix@ 346 +program_transform_name = @program_transform_name@ 347 +psdir = @psdir@ 348 +sbindir = @sbindir@ 349 +sharedstatedir = @sharedstatedir@ 350 +srcdir = @srcdir@ 351 +sysconfdir = @sysconfdir@ 352 +target_alias = @target_alias@ 353 +top_build_prefix = @top_build_prefix@ 354 +top_builddir = @top_builddir@ 355 +top_srcdir = @top_srcdir@ 356 +ACLOCAL_AMFLAGS = -I m4 357 +SUBDIRS = headers src 358 +AUTOMAKE_OPTIONS = dist-zip 359 +pkgconfigdir = $(libdir)/pkgconfig 360 +pkgconfig_DATA = gaiagraphics.pc 361 +all: all-recursive 362 + 363 +.SUFFIXES: 364 +am--refresh: Makefile 365 + @: 366 +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) 367 + @for dep in $?; do \ 368 + case '$(am__configure_deps)' in \ 369 + *$$dep*) \ 370 + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ 371 + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ 372 + && exit 0; \ 373 + exit 1;; \ 374 + esac; \ 375 + done; \ 376 + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ 377 + $(am__cd) $(top_srcdir) && \ 378 + $(AUTOMAKE) --gnu Makefile 379 +.PRECIOUS: Makefile 380 +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 381 + @case '$?' in \ 382 + *config.status*) \ 383 + echo ' $(SHELL) ./config.status'; \ 384 + $(SHELL) ./config.status;; \ 385 + *) \ 386 + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ 387 + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ 388 + esac; 389 + 390 +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) 391 + $(SHELL) ./config.status --recheck 392 + 393 +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 394 + $(am__cd) $(srcdir) && $(AUTOCONF) 395 +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) 396 + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) 397 +$(am__aclocal_m4_deps): 398 +gaiagraphics.pc: $(top_builddir)/config.status $(srcdir)/gaiagraphics.pc.in 399 + cd $(top_builddir) && $(SHELL) ./config.status $@ 400 + 401 +mostlyclean-libtool: 402 + -rm -f *.lo 403 + 404 +clean-libtool: 405 + -rm -rf .libs _libs 406 + 407 +distclean-libtool: 408 + -rm -f libtool config.lt 409 +install-pkgconfigDATA: $(pkgconfig_DATA) 410 + @$(NORMAL_INSTALL) 411 + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ 412 + if test -n "$$list"; then \ 413 + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ 414 + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ 415 + fi; \ 416 + for p in $$list; do \ 417 + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ 418 + echo "$$d$$p"; \ 419 + done | $(am__base_list) | \ 420 + while read files; do \ 421 + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ 422 + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ 423 + done 424 + 425 +uninstall-pkgconfigDATA: 426 + @$(NORMAL_UNINSTALL) 427 + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ 428 + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ 429 + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) 430 + 431 +# This directory's subdirectories are mostly independent; you can cd 432 +# into them and run 'make' without going through this Makefile. 433 +# To change the values of 'make' variables: instead of editing Makefiles, 434 +# (1) if the variable is set in 'config.status', edit 'config.status' 435 +# (which will cause the Makefiles to be regenerated when you run 'make'); 436 +# (2) otherwise, pass the desired values on the 'make' command line. 437 +$(am__recursive_targets): 438 + @fail=; \ 439 + if $(am__make_keepgoing); then \ 440 + failcom='fail=yes'; \ 441 + else \ 442 + failcom='exit 1'; \ 443 + fi; \ 444 + dot_seen=no; \ 445 + target=`echo $@ | sed s/-recursive//`; \ 446 + case "$@" in \ 447 + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ 448 + *) list='$(SUBDIRS)' ;; \ 449 + esac; \ 450 + for subdir in $$list; do \ 451 + echo "Making $$target in $$subdir"; \ 452 + if test "$$subdir" = "."; then \ 453 + dot_seen=yes; \ 454 + local_target="$$target-am"; \ 455 + else \ 456 + local_target="$$target"; \ 457 + fi; \ 458 + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ 459 + || eval $$failcom; \ 460 + done; \ 461 + if test "$$dot_seen" = "no"; then \ 462 + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ 463 + fi; test -z "$$fail" 464 + 465 +ID: $(am__tagged_files) 466 + $(am__define_uniq_tagged_files); mkid -fID $$unique 467 +tags: tags-recursive 468 +TAGS: tags 469 + 470 +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 471 + set x; \ 472 + here=`pwd`; \ 473 + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ 474 + include_option=--etags-include; \ 475 + empty_fix=.; \ 476 + else \ 477 + include_option=--include; \ 478 + empty_fix=; \ 479 + fi; \ 480 + list='$(SUBDIRS)'; for subdir in $$list; do \ 481 + if test "$$subdir" = .; then :; else \ 482 + test ! -f $$subdir/TAGS || \ 483 + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ 484 + fi; \ 485 + done; \ 486 + $(am__define_uniq_tagged_files); \ 487 + shift; \ 488 + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ 489 + test -n "$$unique" || unique=$$empty_fix; \ 490 + if test $$# -gt 0; then \ 491 + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ 492 + "$$@" $$unique; \ 493 + else \ 494 + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ 495 + $$unique; \ 496 + fi; \ 497 + fi 498 +ctags: ctags-recursive 499 + 500 +CTAGS: ctags 501 +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 502 + $(am__define_uniq_tagged_files); \ 503 + test -z "$(CTAGS_ARGS)$$unique" \ 504 + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ 505 + $$unique 506 + 507 +GTAGS: 508 + here=`$(am__cd) $(top_builddir) && pwd` \ 509 + && $(am__cd) $(top_srcdir) \ 510 + && gtags -i $(GTAGS_ARGS) "$$here" 511 +cscope: cscope.files 512 + test ! -s cscope.files \ 513 + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) 514 +clean-cscope: 515 + -rm -f cscope.files 516 +cscope.files: clean-cscope cscopelist 517 +cscopelist: cscopelist-recursive 518 + 519 +cscopelist-am: $(am__tagged_files) 520 + list='$(am__tagged_files)'; \ 521 + case "$(srcdir)" in \ 522 + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ 523 + *) sdir=$(subdir)/$(srcdir) ;; \ 524 + esac; \ 525 + for i in $$list; do \ 526 + if test -f "$$i"; then \ 527 + echo "$(subdir)/$$i"; \ 528 + else \ 529 + echo "$$sdir/$$i"; \ 530 + fi; \ 531 + done >> $(top_builddir)/cscope.files 532 + 533 +distclean-tags: 534 + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags 535 + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files 536 + 537 +distdir: $(DISTFILES) 538 + $(am__remove_distdir) 539 + test -d "$(distdir)" || mkdir "$(distdir)" 540 + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ 541 + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ 542 + list='$(DISTFILES)'; \ 543 + dist_files=`for file in $$list; do echo $$file; done | \ 544 + sed -e "s|^$$srcdirstrip/||;t" \ 545 + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ 546 + case $$dist_files in \ 547 + */*) $(MKDIR_P) `echo "$$dist_files" | \ 548 + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ 549 + sort -u` ;; \ 550 + esac; \ 551 + for file in $$dist_files; do \ 552 + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ 553 + if test -d $$d/$$file; then \ 554 + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ 555 + if test -d "$(distdir)/$$file"; then \ 556 + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ 557 + fi; \ 558 + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ 559 + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ 560 + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ 561 + fi; \ 562 + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ 563 + else \ 564 + test -f "$(distdir)/$$file" \ 565 + || cp -p $$d/$$file "$(distdir)/$$file" \ 566 + || exit 1; \ 567 + fi; \ 568 + done 569 + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ 570 + if test "$$subdir" = .; then :; else \ 571 + $(am__make_dryrun) \ 572 + || test -d "$(distdir)/$$subdir" \ 573 + || $(MKDIR_P) "$(distdir)/$$subdir" \ 574 + || exit 1; \ 575 + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ 576 + $(am__relativize); \ 577 + new_distdir=$$reldir; \ 578 + dir1=$$subdir; dir2="$(top_distdir)"; \ 579 + $(am__relativize); \ 580 + new_top_distdir=$$reldir; \ 581 + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ 582 + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ 583 + ($(am__cd) $$subdir && \ 584 + $(MAKE) $(AM_MAKEFLAGS) \ 585 + top_distdir="$$new_top_distdir" \ 586 + distdir="$$new_distdir" \ 587 + am__remove_distdir=: \ 588 + am__skip_length_check=: \ 589 + am__skip_mode_fix=: \ 590 + distdir) \ 591 + || exit 1; \ 592 + fi; \ 593 + done 594 + -test -n "$(am__skip_mode_fix)" \ 595 + || find "$(distdir)" -type d ! -perm -755 \ 596 + -exec chmod u+rwx,go+rx {} \; -o \ 597 + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ 598 + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ 599 + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ 600 + || chmod -R a+r "$(distdir)" 601 +dist-gzip: distdir 602 + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz 603 + $(am__post_remove_distdir) 604 + 605 +dist-bzip2: distdir 606 + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 607 + $(am__post_remove_distdir) 608 + 609 +dist-lzip: distdir 610 + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz 611 + $(am__post_remove_distdir) 612 + 613 +dist-xz: distdir 614 + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz 615 + $(am__post_remove_distdir) 616 + 617 +dist-tarZ: distdir 618 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z 619 + $(am__post_remove_distdir) 620 + 621 +dist-shar: distdir 622 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz 623 + $(am__post_remove_distdir) 624 +dist-zip: distdir 625 + -rm -f $(distdir).zip 626 + zip -rq $(distdir).zip $(distdir) 627 + $(am__post_remove_distdir) 628 + 629 +dist dist-all: 630 + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' 631 + $(am__post_remove_distdir) 632 + 633 +# This target untars the dist file and tries a VPATH configuration. Then 634 +# it guarantees that the distribution is self-contained by making another 635 +# tarfile. 636 +distcheck: dist 637 + case '$(DIST_ARCHIVES)' in \ 638 + *.tar.gz*) \ 639 + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ 640 + *.tar.bz2*) \ 641 + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ 642 + *.tar.lz*) \ 643 + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ 644 + *.tar.xz*) \ 645 + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ 646 + *.tar.Z*) \ 647 + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ 648 + *.shar.gz*) \ 649 + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ 650 + *.zip*) \ 651 + unzip $(distdir).zip ;;\ 652 + esac 653 + chmod -R a-w $(distdir) 654 + chmod u+w $(distdir) 655 + mkdir $(distdir)/_build $(distdir)/_inst 656 + chmod a-w $(distdir) 657 + test -d $(distdir)/_build || exit 0; \ 658 + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ 659 + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ 660 + && am__cwd=`pwd` \ 661 + && $(am__cd) $(distdir)/_build \ 662 + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ 663 + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ 664 + $(DISTCHECK_CONFIGURE_FLAGS) \ 665 + && $(MAKE) $(AM_MAKEFLAGS) \ 666 + && $(MAKE) $(AM_MAKEFLAGS) dvi \ 667 + && $(MAKE) $(AM_MAKEFLAGS) check \ 668 + && $(MAKE) $(AM_MAKEFLAGS) install \ 669 + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ 670 + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ 671 + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ 672 + distuninstallcheck \ 673 + && chmod -R a-w "$$dc_install_base" \ 674 + && ({ \ 675 + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ 676 + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ 677 + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ 678 + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ 679 + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ 680 + } || { rm -rf "$$dc_destdir"; exit 1; }) \ 681 + && rm -rf "$$dc_destdir" \ 682 + && $(MAKE) $(AM_MAKEFLAGS) dist \ 683 + && rm -rf $(DIST_ARCHIVES) \ 684 + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ 685 + && cd "$$am__cwd" \ 686 + || exit 1 687 + $(am__post_remove_distdir) 688 + @(echo "$(distdir) archives ready for distribution: "; \ 689 + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ 690 + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' 691 +distuninstallcheck: 692 + @test -n '$(distuninstallcheck_dir)' || { \ 693 + echo 'ERROR: trying to run $@ with an empty' \ 694 + '$$(distuninstallcheck_dir)' >&2; \ 695 + exit 1; \ 696 + }; \ 697 + $(am__cd) '$(distuninstallcheck_dir)' || { \ 698 + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ 699 + exit 1; \ 700 + }; \ 701 + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ 702 + || { echo "ERROR: files left after uninstall:" ; \ 703 + if test -n "$(DESTDIR)"; then \ 704 + echo " (check DESTDIR support)"; \ 705 + fi ; \ 706 + $(distuninstallcheck_listfiles) ; \ 707 + exit 1; } >&2 708 +distcleancheck: distclean 709 + @if test '$(srcdir)' = . ; then \ 710 + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ 711 + exit 1 ; \ 712 + fi 713 + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ 714 + || { echo "ERROR: files left in build directory after distclean:" ; \ 715 + $(distcleancheck_listfiles) ; \ 716 + exit 1; } >&2 717 +check-am: all-am 718 +check: check-recursive 719 +all-am: Makefile $(DATA) 720 +installdirs: installdirs-recursive 721 +installdirs-am: 722 + for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ 723 + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ 724 + done 725 +install: install-recursive 726 +install-exec: install-exec-recursive 727 +install-data: install-data-recursive 728 +uninstall: uninstall-recursive 729 + 730 +install-am: all-am 731 + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am 732 + 733 +installcheck: installcheck-recursive 734 +install-strip: 735 + if test -z '$(STRIP)'; then \ 736 + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ 737 + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ 738 + install; \ 739 + else \ 740 + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ 741 + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ 742 + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ 743 + fi 744 +mostlyclean-generic: 745 + 746 +clean-generic: 747 + 748 +distclean-generic: 749 + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) 750 + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) 751 + 752 +maintainer-clean-generic: 753 + @echo "This command is intended for maintainers to use" 754 + @echo "it deletes files that may require special tools to rebuild." 755 +clean: clean-recursive 756 + 757 +clean-am: clean-generic clean-libtool mostlyclean-am 758 + 759 +distclean: distclean-recursive 760 + -rm -f $(am__CONFIG_DISTCLEAN_FILES) 761 + -rm -f Makefile 762 +distclean-am: clean-am distclean-generic distclean-libtool \ 763 + distclean-tags 764 + 765 +dvi: dvi-recursive 766 + 767 +dvi-am: 768 + 769 +html: html-recursive 770 + 771 +html-am: 772 + 773 +info: info-recursive 774 + 775 +info-am: 776 + 777 +install-data-am: install-pkgconfigDATA 778 + 779 +install-dvi: install-dvi-recursive 780 + 781 +install-dvi-am: 782 + 783 +install-exec-am: 784 + 785 +install-html: install-html-recursive 786 + 787 +install-html-am: 788 + 789 +install-info: install-info-recursive 790 + 791 +install-info-am: 792 + 793 +install-man: 794 + 795 +install-pdf: install-pdf-recursive 796 + 797 +install-pdf-am: 798 + 799 +install-ps: install-ps-recursive 800 + 801 +install-ps-am: 802 + 803 +installcheck-am: 804 + 805 +maintainer-clean: maintainer-clean-recursive 806 + -rm -f $(am__CONFIG_DISTCLEAN_FILES) 807 + -rm -rf $(top_srcdir)/autom4te.cache 808 + -rm -f Makefile 809 +maintainer-clean-am: distclean-am maintainer-clean-generic 810 + 811 +mostlyclean: mostlyclean-recursive 812 + 813 +mostlyclean-am: mostlyclean-generic mostlyclean-libtool 814 + 815 +pdf: pdf-recursive 816 + 817 +pdf-am: 818 + 819 +ps: ps-recursive 820 + 821 +ps-am: 822 + 823 +uninstall-am: uninstall-pkgconfigDATA 824 + 825 +.MAKE: $(am__recursive_targets) install-am install-strip 826 + 827 +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ 828 + am--refresh check check-am clean clean-cscope clean-generic \ 829 + clean-libtool cscope cscopelist-am ctags ctags-am dist \ 830 + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ 831 + dist-xz dist-zip distcheck distclean distclean-generic \ 832 + distclean-libtool distclean-tags distcleancheck distdir \ 833 + distuninstallcheck dvi dvi-am html html-am info info-am \ 834 + install install-am install-data install-data-am install-dvi \ 835 + install-dvi-am install-exec install-exec-am install-html \ 836 + install-html-am install-info install-info-am install-man \ 837 + install-pdf install-pdf-am install-pkgconfigDATA install-ps \ 838 + install-ps-am install-strip installcheck installcheck-am \ 839 + installdirs installdirs-am maintainer-clean \ 840 + maintainer-clean-generic mostlyclean mostlyclean-generic \ 841 + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ 842 + uninstall-am uninstall-pkgconfigDATA 843 + 844 + 845 +# Tell versions [3.59,3.63) of GNU make to not export all variables. 846 +# Otherwise a system limit (for SysV at least) may be exceeded. 847 +.NOEXPORT:
Added NEWS.
Added README.
1 +If you get build (compilation) errors about missing symbols or types starting with wx, then try installing the GTK version of the WxWidgets packages (if any).
Added aclocal.m4.
1 +# generated automatically by aclocal 1.13.4 -*- Autoconf -*- 2 + 3 +# Copyright (C) 1996-2013 Free Software Foundation, Inc. 4 + 5 +# This file is free software; the Free Software Foundation 6 +# gives unlimited permission to copy and/or distribute it, 7 +# with or without modifications, as long as this notice is preserved. 8 + 9 +# This program is distributed in the hope that it will be useful, 10 +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without 11 +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A 12 +# PARTICULAR PURPOSE. 13 + 14 +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) 15 +m4_ifndef([AC_AUTOCONF_VERSION], 16 + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl 17 +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, 18 +[m4_warning([this file was generated for autoconf 2.69. 19 +You have another version of autoconf. It may work, but is not guaranteed to. 20 +If you have problems, you may need to regenerate the build system entirely. 21 +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) 22 + 23 +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- 24 +# serial 1 (pkg-config-0.24) 25 +# 26 +# Copyright © 2004 Scott James Remnant <scott@netsplit.com>. 27 +# 28 +# This program is free software; you can redistribute it and/or modify 29 +# it under the terms of the GNU General Public License as published by 30 +# the Free Software Foundation; either version 2 of the License, or 31 +# (at your option) any later version. 32 +# 33 +# This program is distributed in the hope that it will be useful, but 34 +# WITHOUT ANY WARRANTY; without even the implied warranty of 35 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 36 +# General Public License for more details. 37 +# 38 +# You should have received a copy of the GNU General Public License 39 +# along with this program; if not, write to the Free Software 40 +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 41 +# 42 +# As a special exception to the GNU General Public License, if you 43 +# distribute this file as part of a program that contains a 44 +# configuration script generated by Autoconf, you may include it under 45 +# the same distribution terms that you use for the rest of that program. 46 + 47 +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) 48 +# ---------------------------------- 49 +AC_DEFUN([PKG_PROG_PKG_CONFIG], 50 +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) 51 +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) 52 +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) 53 +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) 54 +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) 55 +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) 56 + 57 +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then 58 + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) 59 +fi 60 +if test -n "$PKG_CONFIG"; then 61 + _pkg_min_version=m4_default([$1], [0.9.0]) 62 + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) 63 + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then 64 + AC_MSG_RESULT([yes]) 65 + else 66 + AC_MSG_RESULT([no]) 67 + PKG_CONFIG="" 68 + fi 69 +fi[]dnl 70 +])# PKG_PROG_PKG_CONFIG 71 + 72 +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) 73 +# 74 +# Check to see whether a particular set of modules exists. Similar 75 +# to PKG_CHECK_MODULES(), but does not set variables or print errors. 76 +# 77 +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) 78 +# only at the first occurence in configure.ac, so if the first place 79 +# it's called might be skipped (such as if it is within an "if", you 80 +# have to call PKG_CHECK_EXISTS manually 81 +# -------------------------------------------------------------- 82 +AC_DEFUN([PKG_CHECK_EXISTS], 83 +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl 84 +if test -n "$PKG_CONFIG" && \ 85 + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then 86 + m4_default([$2], [:]) 87 +m4_ifvaln([$3], [else 88 + $3])dnl 89 +fi]) 90 + 91 +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) 92 +# --------------------------------------------- 93 +m4_define([_PKG_CONFIG], 94 +[if test -n "$$1"; then 95 + pkg_cv_[]$1="$$1" 96 + elif test -n "$PKG_CONFIG"; then 97 + PKG_CHECK_EXISTS([$3], 98 + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` 99 + test "x$?" != "x0" && pkg_failed=yes ], 100 + [pkg_failed=yes]) 101 + else 102 + pkg_failed=untried 103 +fi[]dnl 104 +])# _PKG_CONFIG 105 + 106 +# _PKG_SHORT_ERRORS_SUPPORTED 107 +# ----------------------------- 108 +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], 109 +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) 110 +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then 111 + _pkg_short_errors_supported=yes 112 +else 113 + _pkg_short_errors_supported=no 114 +fi[]dnl 115 +])# _PKG_SHORT_ERRORS_SUPPORTED 116 + 117 + 118 +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], 119 +# [ACTION-IF-NOT-FOUND]) 120 +# 121 +# 122 +# Note that if there is a possibility the first call to 123 +# PKG_CHECK_MODULES might not happen, you should be sure to include an 124 +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac 125 +# 126 +# 127 +# -------------------------------------------------------------- 128 +AC_DEFUN([PKG_CHECK_MODULES], 129 +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl 130 +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl 131 +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl 132 + 133 +pkg_failed=no 134 +AC_MSG_CHECKING([for $1]) 135 + 136 +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) 137 +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) 138 + 139 +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS 140 +and $1[]_LIBS to avoid the need to call pkg-config. 141 +See the pkg-config man page for more details.]) 142 + 143 +if test $pkg_failed = yes; then 144 + AC_MSG_RESULT([no]) 145 + _PKG_SHORT_ERRORS_SUPPORTED 146 + if test $_pkg_short_errors_supported = yes; then 147 + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` 148 + else 149 + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` 150 + fi 151 + # Put the nasty error message in config.log where it belongs 152 + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD 153 + 154 + m4_default([$4], [AC_MSG_ERROR( 155 +[Package requirements ($2) were not met: 156 + 157 +$$1_PKG_ERRORS 158 + 159 +Consider adjusting the PKG_CONFIG_PATH environment variable if you 160 +installed software in a non-standard prefix. 161 + 162 +_PKG_TEXT])[]dnl 163 + ]) 164 +elif test $pkg_failed = untried; then 165 + AC_MSG_RESULT([no]) 166 + m4_default([$4], [AC_MSG_FAILURE( 167 +[The pkg-config script could not be found or is too old. Make sure it 168 +is in your PATH or set the PKG_CONFIG environment variable to the full 169 +path to pkg-config. 170 + 171 +_PKG_TEXT 172 + 173 +To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl 174 + ]) 175 +else 176 + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS 177 + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS 178 + AC_MSG_RESULT([yes]) 179 + $3 180 +fi[]dnl 181 +])# PKG_CHECK_MODULES 182 + 183 + 184 +# PKG_INSTALLDIR(DIRECTORY) 185 +# ------------------------- 186 +# Substitutes the variable pkgconfigdir as the location where a module 187 +# should install pkg-config .pc files. By default the directory is 188 +# $libdir/pkgconfig, but the default can be changed by passing 189 +# DIRECTORY. The user can override through the --with-pkgconfigdir 190 +# parameter. 191 +AC_DEFUN([PKG_INSTALLDIR], 192 +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) 193 +m4_pushdef([pkg_description], 194 + [pkg-config installation directory @<:@]pkg_default[@:>@]) 195 +AC_ARG_WITH([pkgconfigdir], 196 + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, 197 + [with_pkgconfigdir=]pkg_default) 198 +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) 199 +m4_popdef([pkg_default]) 200 +m4_popdef([pkg_description]) 201 +]) dnl PKG_INSTALLDIR 202 + 203 + 204 +# PKG_NOARCH_INSTALLDIR(DIRECTORY) 205 +# ------------------------- 206 +# Substitutes the variable noarch_pkgconfigdir as the location where a 207 +# module should install arch-independent pkg-config .pc files. By 208 +# default the directory is $datadir/pkgconfig, but the default can be 209 +# changed by passing DIRECTORY. The user can override through the 210 +# --with-noarch-pkgconfigdir parameter. 211 +AC_DEFUN([PKG_NOARCH_INSTALLDIR], 212 +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) 213 +m4_pushdef([pkg_description], 214 + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) 215 +AC_ARG_WITH([noarch-pkgconfigdir], 216 + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, 217 + [with_noarch_pkgconfigdir=]pkg_default) 218 +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) 219 +m4_popdef([pkg_default]) 220 +m4_popdef([pkg_description]) 221 +]) dnl PKG_NOARCH_INSTALLDIR 222 + 223 +# Copyright (C) 2002-2013 Free Software Foundation, Inc. 224 +# 225 +# This file is free software; the Free Software Foundation 226 +# gives unlimited permission to copy and/or distribute it, 227 +# with or without modifications, as long as this notice is preserved. 228 + 229 +# AM_AUTOMAKE_VERSION(VERSION) 230 +# ---------------------------- 231 +# Automake X.Y traces this macro to ensure aclocal.m4 has been 232 +# generated from the m4 files accompanying Automake X.Y. 233 +# (This private macro should not be called outside this file.) 234 +AC_DEFUN([AM_AUTOMAKE_VERSION], 235 +[am__api_version='1.13' 236 +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to 237 +dnl require some minimum version. Point them to the right macro. 238 +m4_if([$1], [1.13.4], [], 239 + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl 240 +]) 241 + 242 +# _AM_AUTOCONF_VERSION(VERSION) 243 +# ----------------------------- 244 +# aclocal traces this macro to find the Autoconf version. 245 +# This is a private macro too. Using m4_define simplifies 246 +# the logic in aclocal, which can simply ignore this definition. 247 +m4_define([_AM_AUTOCONF_VERSION], []) 248 + 249 +# AM_SET_CURRENT_AUTOMAKE_VERSION 250 +# ------------------------------- 251 +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. 252 +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. 253 +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], 254 +[AM_AUTOMAKE_VERSION([1.13.4])dnl 255 +m4_ifndef([AC_AUTOCONF_VERSION], 256 + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl 257 +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) 258 + 259 +# AM_AUX_DIR_EXPAND -*- Autoconf -*- 260 + 261 +# Copyright (C) 2001-2013 Free Software Foundation, Inc. 262 +# 263 +# This file is free software; the Free Software Foundation 264 +# gives unlimited permission to copy and/or distribute it, 265 +# with or without modifications, as long as this notice is preserved. 266 + 267 +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets 268 +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to 269 +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. 270 +# 271 +# Of course, Automake must honor this variable whenever it calls a 272 +# tool from the auxiliary directory. The problem is that $srcdir (and 273 +# therefore $ac_aux_dir as well) can be either absolute or relative, 274 +# depending on how configure is run. This is pretty annoying, since 275 +# it makes $ac_aux_dir quite unusable in subdirectories: in the top 276 +# source directory, any form will work fine, but in subdirectories a 277 +# relative path needs to be adjusted first. 278 +# 279 +# $ac_aux_dir/missing 280 +# fails when called from a subdirectory if $ac_aux_dir is relative 281 +# $top_srcdir/$ac_aux_dir/missing 282 +# fails if $ac_aux_dir is absolute, 283 +# fails when called from a subdirectory in a VPATH build with 284 +# a relative $ac_aux_dir 285 +# 286 +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir 287 +# are both prefixed by $srcdir. In an in-source build this is usually 288 +# harmless because $srcdir is '.', but things will broke when you 289 +# start a VPATH build or use an absolute $srcdir. 290 +# 291 +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, 292 +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: 293 +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` 294 +# and then we would define $MISSING as 295 +# MISSING="\${SHELL} $am_aux_dir/missing" 296 +# This will work as long as MISSING is not called from configure, because 297 +# unfortunately $(top_srcdir) has no meaning in configure. 298 +# However there are other variables, like CC, which are often used in 299 +# configure, and could therefore not use this "fixed" $ac_aux_dir. 300 +# 301 +# Another solution, used here, is to always expand $ac_aux_dir to an 302 +# absolute PATH. The drawback is that using absolute paths prevent a 303 +# configured tree to be moved without reconfiguration. 304 + 305 +AC_DEFUN([AM_AUX_DIR_EXPAND], 306 +[dnl Rely on autoconf to set up CDPATH properly. 307 +AC_PREREQ([2.50])dnl 308 +# expand $ac_aux_dir to an absolute path 309 +am_aux_dir=`cd $ac_aux_dir && pwd` 310 +]) 311 + 312 +# AM_CONDITIONAL -*- Autoconf -*- 313 + 314 +# Copyright (C) 1997-2013 Free Software Foundation, Inc. 315 +# 316 +# This file is free software; the Free Software Foundation 317 +# gives unlimited permission to copy and/or distribute it, 318 +# with or without modifications, as long as this notice is preserved. 319 + 320 +# AM_CONDITIONAL(NAME, SHELL-CONDITION) 321 +# ------------------------------------- 322 +# Define a conditional. 323 +AC_DEFUN([AM_CONDITIONAL], 324 +[AC_PREREQ([2.52])dnl 325 + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], 326 + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl 327 +AC_SUBST([$1_TRUE])dnl 328 +AC_SUBST([$1_FALSE])dnl 329 +_AM_SUBST_NOTMAKE([$1_TRUE])dnl 330 +_AM_SUBST_NOTMAKE([$1_FALSE])dnl 331 +m4_define([_AM_COND_VALUE_$1], [$2])dnl 332 +if $2; then 333 + $1_TRUE= 334 + $1_FALSE='#' 335 +else 336 + $1_TRUE='#' 337 + $1_FALSE= 338 +fi 339 +AC_CONFIG_COMMANDS_PRE( 340 +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then 341 + AC_MSG_ERROR([[conditional "$1" was never defined. 342 +Usually this means the macro was only invoked conditionally.]]) 343 +fi])]) 344 + 345 +# Copyright (C) 1999-2013 Free Software Foundation, Inc. 346 +# 347 +# This file is free software; the Free Software Foundation 348 +# gives unlimited permission to copy and/or distribute it, 349 +# with or without modifications, as long as this notice is preserved. 350 + 351 + 352 +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be 353 +# written in clear, in which case automake, when reading aclocal.m4, 354 +# will think it sees a *use*, and therefore will trigger all it's 355 +# C support machinery. Also note that it means that autoscan, seeing 356 +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... 357 + 358 + 359 +# _AM_DEPENDENCIES(NAME) 360 +# ---------------------- 361 +# See how the compiler implements dependency checking. 362 +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". 363 +# We try a few techniques and use that to set a single cache variable. 364 +# 365 +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was 366 +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular 367 +# dependency, and given that the user is not expected to run this macro, 368 +# just rely on AC_PROG_CC. 369 +AC_DEFUN([_AM_DEPENDENCIES], 370 +[AC_REQUIRE([AM_SET_DEPDIR])dnl 371 +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl 372 +AC_REQUIRE([AM_MAKE_INCLUDE])dnl 373 +AC_REQUIRE([AM_DEP_TRACK])dnl 374 + 375 +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], 376 + [$1], [CXX], [depcc="$CXX" am_compiler_list=], 377 + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], 378 + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], 379 + [$1], [UPC], [depcc="$UPC" am_compiler_list=], 380 + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], 381 + [depcc="$$1" am_compiler_list=]) 382 + 383 +AC_CACHE_CHECK([dependency style of $depcc], 384 + [am_cv_$1_dependencies_compiler_type], 385 +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then 386 + # We make a subdir and do the tests there. Otherwise we can end up 387 + # making bogus files that we don't know about and never remove. For 388 + # instance it was reported that on HP-UX the gcc test will end up 389 + # making a dummy file named 'D' -- because '-MD' means "put the output 390 + # in D". 391 + rm -rf conftest.dir 392 + mkdir conftest.dir 393 + # Copy depcomp to subdir because otherwise we won't find it if we're 394 + # using a relative directory. 395 + cp "$am_depcomp" conftest.dir 396 + cd conftest.dir 397 + # We will build objects and dependencies in a subdirectory because 398 + # it helps to detect inapplicable dependency modes. For instance 399 + # both Tru64's cc and ICC support -MD to output dependencies as a 400 + # side effect of compilation, but ICC will put the dependencies in 401 + # the current directory while Tru64 will put them in the object 402 + # directory. 403 + mkdir sub 404 + 405 + am_cv_$1_dependencies_compiler_type=none 406 + if test "$am_compiler_list" = ""; then 407 + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` 408 + fi 409 + am__universal=false 410 + m4_case([$1], [CC], 411 + [case " $depcc " in #( 412 + *\ -arch\ *\ -arch\ *) am__universal=true ;; 413 + esac], 414 + [CXX], 415 + [case " $depcc " in #( 416 + *\ -arch\ *\ -arch\ *) am__universal=true ;; 417 + esac]) 418 + 419 + for depmode in $am_compiler_list; do 420 + # Setup a source with many dependencies, because some compilers 421 + # like to wrap large dependency lists on column 80 (with \), and 422 + # we should not choose a depcomp mode which is confused by this. 423 + # 424 + # We need to recreate these files for each test, as the compiler may 425 + # overwrite some of them when testing with obscure command lines. 426 + # This happens at least with the AIX C compiler. 427 + : > sub/conftest.c 428 + for i in 1 2 3 4 5 6; do 429 + echo '#include "conftst'$i'.h"' >> sub/conftest.c 430 + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with 431 + # Solaris 10 /bin/sh. 432 + echo '/* dummy */' > sub/conftst$i.h 433 + done 434 + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf 435 + 436 + # We check with '-c' and '-o' for the sake of the "dashmstdout" 437 + # mode. It turns out that the SunPro C++ compiler does not properly 438 + # handle '-M -o', and we need to detect this. Also, some Intel 439 + # versions had trouble with output in subdirs. 440 + am__obj=sub/conftest.${OBJEXT-o} 441 + am__minus_obj="-o $am__obj" 442 + case $depmode in 443 + gcc) 444 + # This depmode causes a compiler race in universal mode. 445 + test "$am__universal" = false || continue 446 + ;; 447 + nosideeffect) 448 + # After this tag, mechanisms are not by side-effect, so they'll 449 + # only be used when explicitly requested. 450 + if test "x$enable_dependency_tracking" = xyes; then 451 + continue 452 + else 453 + break 454 + fi 455 + ;; 456 + msvc7 | msvc7msys | msvisualcpp | msvcmsys) 457 + # This compiler won't grok '-c -o', but also, the minuso test has 458 + # not run yet. These depmodes are late enough in the game, and 459 + # so weak that their functioning should not be impacted. 460 + am__obj=conftest.${OBJEXT-o} 461 + am__minus_obj= 462 + ;; 463 + none) break ;; 464 + esac 465 + if depmode=$depmode \ 466 + source=sub/conftest.c object=$am__obj \ 467 + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ 468 + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ 469 + >/dev/null 2>conftest.err && 470 + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && 471 + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && 472 + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && 473 + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then 474 + # icc doesn't choke on unknown options, it will just issue warnings 475 + # or remarks (even with -Werror). So we grep stderr for any message 476 + # that says an option was ignored or not supported. 477 + # When given -MP, icc 7.0 and 7.1 complain thusly: 478 + # icc: Command line warning: ignoring option '-M'; no argument required 479 + # The diagnosis changed in icc 8.0: 480 + # icc: Command line remark: option '-MP' not supported 481 + if (grep 'ignoring option' conftest.err || 482 + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else 483 + am_cv_$1_dependencies_compiler_type=$depmode 484 + break 485 + fi 486 + fi 487 + done 488 + 489 + cd .. 490 + rm -rf conftest.dir 491 +else 492 + am_cv_$1_dependencies_compiler_type=none 493 +fi 494 +]) 495 +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) 496 +AM_CONDITIONAL([am__fastdep$1], [ 497 + test "x$enable_dependency_tracking" != xno \ 498 + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) 499 +]) 500 + 501 + 502 +# AM_SET_DEPDIR 503 +# ------------- 504 +# Choose a directory name for dependency files. 505 +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. 506 +AC_DEFUN([AM_SET_DEPDIR], 507 +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl 508 +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl 509 +]) 510 + 511 + 512 +# AM_DEP_TRACK 513 +# ------------ 514 +AC_DEFUN([AM_DEP_TRACK], 515 +[AC_ARG_ENABLE([dependency-tracking], [dnl 516 +AS_HELP_STRING( 517 + [--enable-dependency-tracking], 518 + [do not reject slow dependency extractors]) 519 +AS_HELP_STRING( 520 + [--disable-dependency-tracking], 521 + [speeds up one-time build])]) 522 +if test "x$enable_dependency_tracking" != xno; then 523 + am_depcomp="$ac_aux_dir/depcomp" 524 + AMDEPBACKSLASH='\' 525 + am__nodep='_no' 526 +fi 527 +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) 528 +AC_SUBST([AMDEPBACKSLASH])dnl 529 +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl 530 +AC_SUBST([am__nodep])dnl 531 +_AM_SUBST_NOTMAKE([am__nodep])dnl 532 +]) 533 + 534 +# Generate code to set up dependency tracking. -*- Autoconf -*- 535 + 536 +# Copyright (C) 1999-2013 Free Software Foundation, Inc. 537 +# 538 +# This file is free software; the Free Software Foundation 539 +# gives unlimited permission to copy and/or distribute it, 540 +# with or without modifications, as long as this notice is preserved. 541 + 542 + 543 +# _AM_OUTPUT_DEPENDENCY_COMMANDS 544 +# ------------------------------ 545 +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], 546 +[{ 547 + # Older Autoconf quotes --file arguments for eval, but not when files 548 + # are listed without --file. Let's play safe and only enable the eval 549 + # if we detect the quoting. 550 + case $CONFIG_FILES in 551 + *\'*) eval set x "$CONFIG_FILES" ;; 552 + *) set x $CONFIG_FILES ;; 553 + esac 554 + shift 555 + for mf 556 + do 557 + # Strip MF so we end up with the name of the file. 558 + mf=`echo "$mf" | sed -e 's/:.*$//'` 559 + # Check whether this is an Automake generated Makefile or not. 560 + # We used to match only the files named 'Makefile.in', but 561 + # some people rename them; so instead we look at the file content. 562 + # Grep'ing the first line is not enough: some people post-process 563 + # each Makefile.in and add a new line on top of each file to say so. 564 + # Grep'ing the whole file is not good either: AIX grep has a line 565 + # limit of 2048, but all sed's we know have understand at least 4000. 566 + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then 567 + dirpart=`AS_DIRNAME("$mf")` 568 + else 569 + continue 570 + fi 571 + # Extract the definition of DEPDIR, am__include, and am__quote 572 + # from the Makefile without running 'make'. 573 + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` 574 + test -z "$DEPDIR" && continue 575 + am__include=`sed -n 's/^am__include = //p' < "$mf"` 576 + test -z "$am__include" && continue 577 + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` 578 + # Find all dependency output files, they are included files with 579 + # $(DEPDIR) in their names. We invoke sed twice because it is the 580 + # simplest approach to changing $(DEPDIR) to its actual value in the 581 + # expansion. 582 + for file in `sed -n " 583 + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ 584 + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do 585 + # Make sure the directory exists. 586 + test -f "$dirpart/$file" && continue 587 + fdir=`AS_DIRNAME(["$file"])` 588 + AS_MKDIR_P([$dirpart/$fdir]) 589 + # echo "creating $dirpart/$file" 590 + echo '# dummy' > "$dirpart/$file" 591 + done 592 + done 593 +} 594 +])# _AM_OUTPUT_DEPENDENCY_COMMANDS 595 + 596 + 597 +# AM_OUTPUT_DEPENDENCY_COMMANDS 598 +# ----------------------------- 599 +# This macro should only be invoked once -- use via AC_REQUIRE. 600 +# 601 +# This code is only required when automatic dependency tracking 602 +# is enabled. FIXME. This creates each '.P' file that we will 603 +# need in order to bootstrap the dependency handling code. 604 +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], 605 +[AC_CONFIG_COMMANDS([depfiles], 606 + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], 607 + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) 608 +]) 609 + 610 +# Do all the work for Automake. -*- Autoconf -*- 611 + 612 +# Copyright (C) 1996-2013 Free Software Foundation, Inc. 613 +# 614 +# This file is free software; the Free Software Foundation 615 +# gives unlimited permission to copy and/or distribute it, 616 +# with or without modifications, as long as this notice is preserved. 617 + 618 +# This macro actually does too much. Some checks are only needed if 619 +# your package does certain things. But this isn't really a big deal. 620 + 621 +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) 622 +# AM_INIT_AUTOMAKE([OPTIONS]) 623 +# ----------------------------------------------- 624 +# The call with PACKAGE and VERSION arguments is the old style 625 +# call (pre autoconf-2.50), which is being phased out. PACKAGE 626 +# and VERSION should now be passed to AC_INIT and removed from 627 +# the call to AM_INIT_AUTOMAKE. 628 +# We support both call styles for the transition. After 629 +# the next Automake release, Autoconf can make the AC_INIT 630 +# arguments mandatory, and then we can depend on a new Autoconf 631 +# release and drop the old call support. 632 +AC_DEFUN([AM_INIT_AUTOMAKE], 633 +[AC_PREREQ([2.65])dnl 634 +dnl Autoconf wants to disallow AM_ names. We explicitly allow 635 +dnl the ones we care about. 636 +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl 637 +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl 638 +AC_REQUIRE([AC_PROG_INSTALL])dnl 639 +if test "`cd $srcdir && pwd`" != "`pwd`"; then 640 + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output 641 + # is not polluted with repeated "-I." 642 + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl 643 + # test to see if srcdir already configured 644 + if test -f $srcdir/config.status; then 645 + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) 646 + fi 647 +fi 648 + 649 +# test whether we have cygpath 650 +if test -z "$CYGPATH_W"; then 651 + if (cygpath --version) >/dev/null 2>/dev/null; then 652 + CYGPATH_W='cygpath -w' 653 + else 654 + CYGPATH_W=echo 655 + fi 656 +fi 657 +AC_SUBST([CYGPATH_W]) 658 + 659 +# Define the identity of the package. 660 +dnl Distinguish between old-style and new-style calls. 661 +m4_ifval([$2], 662 +[AC_DIAGNOSE([obsolete], 663 + [$0: two- and three-arguments forms are deprecated.]) 664 +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl 665 + AC_SUBST([PACKAGE], [$1])dnl 666 + AC_SUBST([VERSION], [$2])], 667 +[_AM_SET_OPTIONS([$1])dnl 668 +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. 669 +m4_if( 670 + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), 671 + [ok:ok],, 672 + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl 673 + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl 674 + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl 675 + 676 +_AM_IF_OPTION([no-define],, 677 +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) 678 + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl 679 + 680 +# Some tools Automake needs. 681 +AC_REQUIRE([AM_SANITY_CHECK])dnl 682 +AC_REQUIRE([AC_ARG_PROGRAM])dnl 683 +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) 684 +AM_MISSING_PROG([AUTOCONF], [autoconf]) 685 +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) 686 +AM_MISSING_PROG([AUTOHEADER], [autoheader]) 687 +AM_MISSING_PROG([MAKEINFO], [makeinfo]) 688 +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl 689 +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl 690 +AC_REQUIRE([AC_PROG_MKDIR_P])dnl 691 +# For better backward compatibility. To be removed once Automake 1.9.x 692 +# dies out for good. For more background, see: 693 +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> 694 +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> 695 +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) 696 +# We need awk for the "check" target. The system "awk" is bad on 697 +# some platforms. 698 +AC_REQUIRE([AC_PROG_AWK])dnl 699 +AC_REQUIRE([AC_PROG_MAKE_SET])dnl 700 +AC_REQUIRE([AM_SET_LEADING_DOT])dnl 701 +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], 702 + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], 703 + [_AM_PROG_TAR([v7])])]) 704 +_AM_IF_OPTION([no-dependencies],, 705 +[AC_PROVIDE_IFELSE([AC_PROG_CC], 706 + [_AM_DEPENDENCIES([CC])], 707 + [m4_define([AC_PROG_CC], 708 + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl 709 +AC_PROVIDE_IFELSE([AC_PROG_CXX], 710 + [_AM_DEPENDENCIES([CXX])], 711 + [m4_define([AC_PROG_CXX], 712 + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl 713 +AC_PROVIDE_IFELSE([AC_PROG_OBJC], 714 + [_AM_DEPENDENCIES([OBJC])], 715 + [m4_define([AC_PROG_OBJC], 716 + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl 717 +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], 718 + [_AM_DEPENDENCIES([OBJCXX])], 719 + [m4_define([AC_PROG_OBJCXX], 720 + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl 721 +]) 722 +AC_REQUIRE([AM_SILENT_RULES])dnl 723 +dnl The testsuite driver may need to know about EXEEXT, so add the 724 +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This 725 +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. 726 +AC_CONFIG_COMMANDS_PRE(dnl 727 +[m4_provide_if([_AM_COMPILER_EXEEXT], 728 + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl 729 +]) 730 + 731 +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not 732 +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further 733 +dnl mangled by Autoconf and run in a shell conditional statement. 734 +m4_define([_AC_COMPILER_EXEEXT], 735 +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) 736 + 737 + 738 +# When config.status generates a header, we must update the stamp-h file. 739 +# This file resides in the same directory as the config header 740 +# that is generated. The stamp files are numbered to have different names. 741 + 742 +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the 743 +# loop where config.status creates the headers, so we can generate 744 +# our stamp files there. 745 +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], 746 +[# Compute $1's index in $config_headers. 747 +_am_arg=$1 748 +_am_stamp_count=1 749 +for _am_header in $config_headers :; do 750 + case $_am_header in 751 + $_am_arg | $_am_arg:* ) 752 + break ;; 753 + * ) 754 + _am_stamp_count=`expr $_am_stamp_count + 1` ;; 755 + esac 756 +done 757 +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) 758 + 759 +# Copyright (C) 2001-2013 Free Software Foundation, Inc. 760 +# 761 +# This file is free software; the Free Software Foundation 762 +# gives unlimited permission to copy and/or distribute it, 763 +# with or without modifications, as long as this notice is preserved. 764 + 765 +# AM_PROG_INSTALL_SH 766 +# ------------------ 767 +# Define $install_sh. 768 +AC_DEFUN([AM_PROG_INSTALL_SH], 769 +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl 770 +if test x"${install_sh}" != xset; then 771 + case $am_aux_dir in 772 + *\ * | *\ *) 773 + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; 774 + *) 775 + install_sh="\${SHELL} $am_aux_dir/install-sh" 776 + esac 777 +fi 778 +AC_SUBST([install_sh])]) 779 + 780 +# Copyright (C) 2003-2013 Free Software Foundation, Inc. 781 +# 782 +# This file is free software; the Free Software Foundation 783 +# gives unlimited permission to copy and/or distribute it, 784 +# with or without modifications, as long as this notice is preserved. 785 + 786 +# Check whether the underlying file-system supports filenames 787 +# with a leading dot. For instance MS-DOS doesn't. 788 +AC_DEFUN([AM_SET_LEADING_DOT], 789 +[rm -rf .tst 2>/dev/null 790 +mkdir .tst 2>/dev/null 791 +if test -d .tst; then 792 + am__leading_dot=. 793 +else 794 + am__leading_dot=_ 795 +fi 796 +rmdir .tst 2>/dev/null 797 +AC_SUBST([am__leading_dot])]) 798 + 799 +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- 800 +# From Jim Meyering 801 + 802 +# Copyright (C) 1996-2013 Free Software Foundation, Inc. 803 +# 804 +# This file is free software; the Free Software Foundation 805 +# gives unlimited permission to copy and/or distribute it, 806 +# with or without modifications, as long as this notice is preserved. 807 + 808 +# AM_MAINTAINER_MODE([DEFAULT-MODE]) 809 +# ---------------------------------- 810 +# Control maintainer-specific portions of Makefiles. 811 +# Default is to disable them, unless 'enable' is passed literally. 812 +# For symmetry, 'disable' may be passed as well. Anyway, the user 813 +# can override the default with the --enable/--disable switch. 814 +AC_DEFUN([AM_MAINTAINER_MODE], 815 +[m4_case(m4_default([$1], [disable]), 816 + [enable], [m4_define([am_maintainer_other], [disable])], 817 + [disable], [m4_define([am_maintainer_other], [enable])], 818 + [m4_define([am_maintainer_other], [enable]) 819 + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) 820 +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) 821 + dnl maintainer-mode's default is 'disable' unless 'enable' is passed 822 + AC_ARG_ENABLE([maintainer-mode], 823 + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], 824 + am_maintainer_other[ make rules and dependencies not useful 825 + (and sometimes confusing) to the casual installer])], 826 + [USE_MAINTAINER_MODE=$enableval], 827 + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) 828 + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) 829 + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) 830 + MAINT=$MAINTAINER_MODE_TRUE 831 + AC_SUBST([MAINT])dnl 832 +] 833 +) 834 + 835 +# Check to see how 'make' treats includes. -*- Autoconf -*- 836 + 837 +# Copyright (C) 2001-2013 Free Software Foundation, Inc. 838 +# 839 +# This file is free software; the Free Software Foundation 840 +# gives unlimited permission to copy and/or distribute it, 841 +# with or without modifications, as long as this notice is preserved. 842 + 843 +# AM_MAKE_INCLUDE() 844 +# ----------------- 845 +# Check to see how make treats includes. 846 +AC_DEFUN([AM_MAKE_INCLUDE], 847 +[am_make=${MAKE-make} 848 +cat > confinc << 'END' 849 +am__doit: 850 + @echo this is the am__doit target 851 +.PHONY: am__doit 852 +END 853 +# If we don't find an include directive, just comment out the code. 854 +AC_MSG_CHECKING([for style of include used by $am_make]) 855 +am__include="#" 856 +am__quote= 857 +_am_result=none 858 +# First try GNU make style include. 859 +echo "include confinc" > confmf 860 +# Ignore all kinds of additional output from 'make'. 861 +case `$am_make -s -f confmf 2> /dev/null` in #( 862 +*the\ am__doit\ target*) 863 + am__include=include 864 + am__quote= 865 + _am_result=GNU 866 + ;; 867 +esac 868 +# Now try BSD make style include. 869 +if test "$am__include" = "#"; then 870 + echo '.include "confinc"' > confmf 871 + case `$am_make -s -f confmf 2> /dev/null` in #( 872 + *the\ am__doit\ target*) 873 + am__include=.include 874 + am__quote="\"" 875 + _am_result=BSD 876 + ;; 877 + esac 878 +fi 879 +AC_SUBST([am__include]) 880 +AC_SUBST([am__quote]) 881 +AC_MSG_RESULT([$_am_result]) 882 +rm -f confinc confmf 883 +]) 884 + 885 +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- 886 + 887 +# Copyright (C) 1997-2013 Free Software Foundation, Inc. 888 +# 889 +# This file is free software; the Free Software Foundation 890 +# gives unlimited permission to copy and/or distribute it, 891 +# with or without modifications, as long as this notice is preserved. 892 + 893 +# AM_MISSING_PROG(NAME, PROGRAM) 894 +# ------------------------------ 895 +AC_DEFUN([AM_MISSING_PROG], 896 +[AC_REQUIRE([AM_MISSING_HAS_RUN]) 897 +$1=${$1-"${am_missing_run}$2"} 898 +AC_SUBST($1)]) 899 + 900 +# AM_MISSING_HAS_RUN 901 +# ------------------ 902 +# Define MISSING if not defined so far and test if it is modern enough. 903 +# If it is, set am_missing_run to use it, otherwise, to nothing. 904 +AC_DEFUN([AM_MISSING_HAS_RUN], 905 +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl 906 +AC_REQUIRE_AUX_FILE([missing])dnl 907 +if test x"${MISSING+set}" != xset; then 908 + case $am_aux_dir in 909 + *\ * | *\ *) 910 + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; 911 + *) 912 + MISSING="\${SHELL} $am_aux_dir/missing" ;; 913 + esac 914 +fi 915 +# Use eval to expand $SHELL 916 +if eval "$MISSING --is-lightweight"; then 917 + am_missing_run="$MISSING " 918 +else 919 + am_missing_run= 920 + AC_MSG_WARN(['missing' script is too old or missing]) 921 +fi 922 +]) 923 + 924 +# Helper functions for option handling. -*- Autoconf -*- 925 + 926 +# Copyright (C) 2001-2013 Free Software Foundation, Inc. 927 +# 928 +# This file is free software; the Free Software Foundation 929 +# gives unlimited permission to copy and/or distribute it, 930 +# with or without modifications, as long as this notice is preserved. 931 + 932 +# _AM_MANGLE_OPTION(NAME) 933 +# ----------------------- 934 +AC_DEFUN([_AM_MANGLE_OPTION], 935 +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) 936 + 937 +# _AM_SET_OPTION(NAME) 938 +# -------------------- 939 +# Set option NAME. Presently that only means defining a flag for this option. 940 +AC_DEFUN([_AM_SET_OPTION], 941 +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) 942 + 943 +# _AM_SET_OPTIONS(OPTIONS) 944 +# ------------------------ 945 +# OPTIONS is a space-separated list of Automake options. 946 +AC_DEFUN([_AM_SET_OPTIONS], 947 +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) 948 + 949 +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) 950 +# ------------------------------------------- 951 +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. 952 +AC_DEFUN([_AM_IF_OPTION], 953 +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) 954 + 955 +# Check to make sure that the build environment is sane. -*- Autoconf -*- 956 + 957 +# Copyright (C) 1996-2013 Free Software Foundation, Inc. 958 +# 959 +# This file is free software; the Free Software Foundation 960 +# gives unlimited permission to copy and/or distribute it, 961 +# with or without modifications, as long as this notice is preserved. 962 + 963 +# AM_SANITY_CHECK 964 +# --------------- 965 +AC_DEFUN([AM_SANITY_CHECK], 966 +[AC_MSG_CHECKING([whether build environment is sane]) 967 +# Reject unsafe characters in $srcdir or the absolute working directory 968 +# name. Accept space and tab only in the latter. 969 +am_lf=' 970 +' 971 +case `pwd` in 972 + *[[\\\"\#\$\&\'\`$am_lf]]*) 973 + AC_MSG_ERROR([unsafe absolute working directory name]);; 974 +esac 975 +case $srcdir in 976 + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) 977 + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; 978 +esac 979 + 980 +# Do 'set' in a subshell so we don't clobber the current shell's 981 +# arguments. Must try -L first in case configure is actually a 982 +# symlink; some systems play weird games with the mod time of symlinks 983 +# (eg FreeBSD returns the mod time of the symlink's containing 984 +# directory). 985 +if ( 986 + am_has_slept=no 987 + for am_try in 1 2; do 988 + echo "timestamp, slept: $am_has_slept" > conftest.file 989 + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` 990 + if test "$[*]" = "X"; then 991 + # -L didn't work. 992 + set X `ls -t "$srcdir/configure" conftest.file` 993 + fi 994 + if test "$[*]" != "X $srcdir/configure conftest.file" \ 995 + && test "$[*]" != "X conftest.file $srcdir/configure"; then 996 + 997 + # If neither matched, then we have a broken ls. This can happen 998 + # if, for instance, CONFIG_SHELL is bash and it inherits a 999 + # broken ls alias from the environment. This has actually 1000 + # happened. Such a system could not be considered "sane". 1001 + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken 1002 + alias in your environment]) 1003 + fi 1004 + if test "$[2]" = conftest.file || test $am_try -eq 2; then 1005 + break 1006 + fi 1007 + # Just in case. 1008 + sleep 1 1009 + am_has_slept=yes 1010 + done 1011 + test "$[2]" = conftest.file 1012 + ) 1013 +then 1014 + # Ok. 1015 + : 1016 +else 1017 + AC_MSG_ERROR([newly created file is older than distributed files! 1018 +Check your system clock]) 1019 +fi 1020 +AC_MSG_RESULT([yes]) 1021 +# If we didn't sleep, we still need to ensure time stamps of config.status and 1022 +# generated files are strictly newer. 1023 +am_sleep_pid= 1024 +if grep 'slept: no' conftest.file >/dev/null 2>&1; then 1025 + ( sleep 1 ) & 1026 + am_sleep_pid=$! 1027 +fi 1028 +AC_CONFIG_COMMANDS_PRE( 1029 + [AC_MSG_CHECKING([that generated files are newer than configure]) 1030 + if test -n "$am_sleep_pid"; then 1031 + # Hide warnings about reused PIDs. 1032 + wait $am_sleep_pid 2>/dev/null 1033 + fi 1034 + AC_MSG_RESULT([done])]) 1035 +rm -f conftest.file 1036 +]) 1037 + 1038 +# Copyright (C) 2009-2013 Free Software Foundation, Inc. 1039 +# 1040 +# This file is free software; the Free Software Foundation 1041 +# gives unlimited permission to copy and/or distribute it, 1042 +# with or without modifications, as long as this notice is preserved. 1043 + 1044 +# AM_SILENT_RULES([DEFAULT]) 1045 +# -------------------------- 1046 +# Enable less verbose build rules; with the default set to DEFAULT 1047 +# ("yes" being less verbose, "no" or empty being verbose). 1048 +AC_DEFUN([AM_SILENT_RULES], 1049 +[AC_ARG_ENABLE([silent-rules], [dnl 1050 +AS_HELP_STRING( 1051 + [--enable-silent-rules], 1052 + [less verbose build output (undo: "make V=1")]) 1053 +AS_HELP_STRING( 1054 + [--disable-silent-rules], 1055 + [verbose build output (undo: "make V=0")])dnl 1056 +]) 1057 +case $enable_silent_rules in @%:@ ((( 1058 + yes) AM_DEFAULT_VERBOSITY=0;; 1059 + no) AM_DEFAULT_VERBOSITY=1;; 1060 + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; 1061 +esac 1062 +dnl 1063 +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) 1064 +dnl do not support nested variable expansions. 1065 +dnl See automake bug#9928 and bug#10237. 1066 +am_make=${MAKE-make} 1067 +AC_CACHE_CHECK([whether $am_make supports nested variables], 1068 + [am_cv_make_support_nested_variables], 1069 + [if AS_ECHO([['TRUE=$(BAR$(V)) 1070 +BAR0=false 1071 +BAR1=true 1072 +V=1 1073 +am__doit: 1074 + @$(TRUE) 1075 +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then 1076 + am_cv_make_support_nested_variables=yes 1077 +else 1078 + am_cv_make_support_nested_variables=no 1079 +fi]) 1080 +if test $am_cv_make_support_nested_variables = yes; then 1081 + dnl Using '$V' instead of '$(V)' breaks IRIX make. 1082 + AM_V='$(V)' 1083 + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' 1084 +else 1085 + AM_V=$AM_DEFAULT_VERBOSITY 1086 + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY 1087 +fi 1088 +AC_SUBST([AM_V])dnl 1089 +AM_SUBST_NOTMAKE([AM_V])dnl 1090 +AC_SUBST([AM_DEFAULT_V])dnl 1091 +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl 1092 +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl 1093 +AM_BACKSLASH='\' 1094 +AC_SUBST([AM_BACKSLASH])dnl 1095 +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl 1096 +]) 1097 + 1098 +# Copyright (C) 2001-2013 Free Software Foundation, Inc. 1099 +# 1100 +# This file is free software; the Free Software Foundation 1101 +# gives unlimited permission to copy and/or distribute it, 1102 +# with or without modifications, as long as this notice is preserved. 1103 + 1104 +# AM_PROG_INSTALL_STRIP 1105 +# --------------------- 1106 +# One issue with vendor 'install' (even GNU) is that you can't 1107 +# specify the program used to strip binaries. This is especially 1108 +# annoying in cross-compiling environments, where the build's strip 1109 +# is unlikely to handle the host's binaries. 1110 +# Fortunately install-sh will honor a STRIPPROG variable, so we 1111 +# always use install-sh in "make install-strip", and initialize 1112 +# STRIPPROG with the value of the STRIP variable (set by the user). 1113 +AC_DEFUN([AM_PROG_INSTALL_STRIP], 1114 +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl 1115 +# Installed binaries are usually stripped using 'strip' when the user 1116 +# run "make install-strip". However 'strip' might not be the right 1117 +# tool to use in cross-compilation environments, therefore Automake 1118 +# will honor the 'STRIP' environment variable to overrule this program. 1119 +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. 1120 +if test "$cross_compiling" != no; then 1121 + AC_CHECK_TOOL([STRIP], [strip], :) 1122 +fi 1123 +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" 1124 +AC_SUBST([INSTALL_STRIP_PROGRAM])]) 1125 + 1126 +# Copyright (C) 2006-2013 Free Software Foundation, Inc. 1127 +# 1128 +# This file is free software; the Free Software Foundation 1129 +# gives unlimited permission to copy and/or distribute it, 1130 +# with or without modifications, as long as this notice is preserved. 1131 + 1132 +# _AM_SUBST_NOTMAKE(VARIABLE) 1133 +# --------------------------- 1134 +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. 1135 +# This macro is traced by Automake. 1136 +AC_DEFUN([_AM_SUBST_NOTMAKE]) 1137 + 1138 +# AM_SUBST_NOTMAKE(VARIABLE) 1139 +# -------------------------- 1140 +# Public sister of _AM_SUBST_NOTMAKE. 1141 +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) 1142 + 1143 +# Check how to create a tarball. -*- Autoconf -*- 1144 + 1145 +# Copyright (C) 2004-2013 Free Software Foundation, Inc. 1146 +# 1147 +# This file is free software; the Free Software Foundation 1148 +# gives unlimited permission to copy and/or distribute it, 1149 +# with or without modifications, as long as this notice is preserved. 1150 + 1151 +# _AM_PROG_TAR(FORMAT) 1152 +# -------------------- 1153 +# Check how to create a tarball in format FORMAT. 1154 +# FORMAT should be one of 'v7', 'ustar', or 'pax'. 1155 +# 1156 +# Substitute a variable $(am__tar) that is a command 1157 +# writing to stdout a FORMAT-tarball containing the directory 1158 +# $tardir. 1159 +# tardir=directory && $(am__tar) > result.tar 1160 +# 1161 +# Substitute a variable $(am__untar) that extract such 1162 +# a tarball read from stdin. 1163 +# $(am__untar) < result.tar 1164 +# 1165 +AC_DEFUN([_AM_PROG_TAR], 1166 +[# Always define AMTAR for backward compatibility. Yes, it's still used 1167 +# in the wild :-( We should find a proper way to deprecate it ... 1168 +AC_SUBST([AMTAR], ['$${TAR-tar}']) 1169 + 1170 +# We'll loop over all known methods to create a tar archive until one works. 1171 +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' 1172 + 1173 +m4_if([$1], [v7], 1174 + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], 1175 + 1176 + [m4_case([$1], 1177 + [ustar], 1178 + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. 1179 + # There is notably a 21 bits limit for the UID and the GID. In fact, 1180 + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 1181 + # and bug#13588). 1182 + am_max_uid=2097151 # 2^21 - 1 1183 + am_max_gid=$am_max_uid 1184 + # The $UID and $GID variables are not portable, so we need to resort 1185 + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls 1186 + # below are definitely unexpected, so allow the users to see them 1187 + # (that is, avoid stderr redirection). 1188 + am_uid=`id -u || echo unknown` 1189 + am_gid=`id -g || echo unknown` 1190 + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) 1191 + if test $am_uid -le $am_max_uid; then 1192 + AC_MSG_RESULT([yes]) 1193 + else 1194 + AC_MSG_RESULT([no]) 1195 + _am_tools=none 1196 + fi 1197 + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) 1198 + if test $am_gid -le $am_max_gid; then 1199 + AC_MSG_RESULT([yes]) 1200 + else 1201 + AC_MSG_RESULT([no]) 1202 + _am_tools=none 1203 + fi], 1204 + 1205 + [pax], 1206 + [], 1207 + 1208 + [m4_fatal([Unknown tar format])]) 1209 + 1210 + AC_MSG_CHECKING([how to create a $1 tar archive]) 1211 + 1212 + # Go ahead even if we have the value already cached. We do so because we 1213 + # need to set the values for the 'am__tar' and 'am__untar' variables. 1214 + _am_tools=${am_cv_prog_tar_$1-$_am_tools} 1215 + 1216 + for _am_tool in $_am_tools; do 1217 + case $_am_tool in 1218 + gnutar) 1219 + for _am_tar in tar gnutar gtar; do 1220 + AM_RUN_LOG([$_am_tar --version]) && break 1221 + done 1222 + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' 1223 + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' 1224 + am__untar="$_am_tar -xf -" 1225 + ;; 1226 + plaintar) 1227 + # Must skip GNU tar: if it does not support --format= it doesn't create 1228 + # ustar tarball either. 1229 + (tar --version) >/dev/null 2>&1 && continue 1230 + am__tar='tar chf - "$$tardir"' 1231 + am__tar_='tar chf - "$tardir"' 1232 + am__untar='tar xf -' 1233 + ;; 1234 + pax) 1235 + am__tar='pax -L -x $1 -w "$$tardir"' 1236 + am__tar_='pax -L -x $1 -w "$tardir"' 1237 + am__untar='pax -r' 1238 + ;; 1239 + cpio) 1240 + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' 1241 + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' 1242 + am__untar='cpio -i -H $1 -d' 1243 + ;; 1244 + none) 1245 + am__tar=false 1246 + am__tar_=false 1247 + am__untar=false 1248 + ;; 1249 + esac 1250 + 1251 + # If the value was cached, stop now. We just wanted to have am__tar 1252 + # and am__untar set. 1253 + test -n "${am_cv_prog_tar_$1}" && break 1254 + 1255 + # tar/untar a dummy directory, and stop if the command works. 1256 + rm -rf conftest.dir 1257 + mkdir conftest.dir 1258 + echo GrepMe > conftest.dir/file 1259 + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) 1260 + rm -rf conftest.dir 1261 + if test -s conftest.tar; then 1262 + AM_RUN_LOG([$am__untar <conftest.tar]) 1263 + AM_RUN_LOG([cat conftest.dir/file]) 1264 + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break 1265 + fi 1266 + done 1267 + rm -rf conftest.dir 1268 + 1269 + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) 1270 + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) 1271 + 1272 +AC_SUBST([am__tar]) 1273 +AC_SUBST([am__untar]) 1274 +]) # _AM_PROG_TAR 1275 + 1276 +m4_include([m4/libtool.m4]) 1277 +m4_include([m4/ltoptions.m4]) 1278 +m4_include([m4/ltsugar.m4]) 1279 +m4_include([m4/ltversion.m4]) 1280 +m4_include([m4/lt~obsolete.m4])
Added config.guess.
1 +#! /bin/sh 2 +# Attempt to guess a canonical system name. 3 +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 4 +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 5 +# 2011, 2012 Free Software Foundation, Inc. 6 + 7 +timestamp='2012-02-10' 8 + 9 +# This file is free software; you can redistribute it and/or modify it 10 +# under the terms of the GNU General Public License as published by 11 +# the Free Software Foundation; either version 2 of the License, or 12 +# (at your option) any later version. 13 +# 14 +# This program is distributed in the hope that it will be useful, but 15 +# WITHOUT ANY WARRANTY; without even the implied warranty of 16 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 +# General Public License for more details. 18 +# 19 +# You should have received a copy of the GNU General Public License 20 +# along with this program; if not, see <http://www.gnu.org/licenses/>. 21 +# 22 +# As a special exception to the GNU General Public License, if you 23 +# distribute this file as part of a program that contains a 24 +# configuration script generated by Autoconf, you may include it under 25 +# the same distribution terms that you use for the rest of that program. 26 + 27 + 28 +# Originally written by Per Bothner. Please send patches (context 29 +# diff format) to <config-patches@gnu.org> and include a ChangeLog 30 +# entry. 31 +# 32 +# This script attempts to guess a canonical system name similar to 33 +# config.sub. If it succeeds, it prints the system name on stdout, and 34 +# exits with 0. Otherwise, it exits with 1. 35 +# 36 +# You can get the latest version of this script from: 37 +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD 38 + 39 +me=`echo "$0" | sed -e 's,.*/,,'` 40 + 41 +usage="\ 42 +Usage: $0 [OPTION] 43 + 44 +Output the configuration name of the system \`$me' is run on. 45 + 46 +Operation modes: 47 + -h, --help print this help, then exit 48 + -t, --time-stamp print date of last modification, then exit 49 + -v, --version print version number, then exit 50 + 51 +Report bugs and patches to <config-patches@gnu.org>." 52 + 53 +version="\ 54 +GNU config.guess ($timestamp) 55 + 56 +Originally written by Per Bothner. 57 +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 58 +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 59 +Free Software Foundation, Inc. 60 + 61 +This is free software; see the source for copying conditions. There is NO 62 +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." 63 + 64 +help=" 65 +Try \`$me --help' for more information." 66 + 67 +# Parse command line 68 +while test $# -gt 0 ; do 69 + case $1 in 70 + --time-stamp | --time* | -t ) 71 + echo "$timestamp" ; exit ;; 72 + --version | -v ) 73 + echo "$version" ; exit ;; 74 + --help | --h* | -h ) 75 + echo "$usage"; exit ;; 76 + -- ) # Stop option processing 77 + shift; break ;; 78 + - ) # Use stdin as input. 79 + break ;; 80 + -* ) 81 + echo "$me: invalid option $1$help" >&2 82 + exit 1 ;; 83 + * ) 84 + break ;; 85 + esac 86 +done 87 + 88 +if test $# != 0; then 89 + echo "$me: too many arguments$help" >&2 90 + exit 1 91 +fi 92 + 93 +trap 'exit 1' 1 2 15 94 + 95 +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a 96 +# compiler to aid in system detection is discouraged as it requires 97 +# temporary files to be created and, as you can see below, it is a 98 +# headache to deal with in a portable fashion. 99 + 100 +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still 101 +# use `HOST_CC' if defined, but it is deprecated. 102 + 103 +# Portable tmp directory creation inspired by the Autoconf team. 104 + 105 +set_cc_for_build=' 106 +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; 107 +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; 108 +: ${TMPDIR=/tmp} ; 109 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || 110 + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || 111 + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || 112 + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; 113 +dummy=$tmp/dummy ; 114 +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; 115 +case $CC_FOR_BUILD,$HOST_CC,$CC in 116 + ,,) echo "int x;" > $dummy.c ; 117 + for c in cc gcc c89 c99 ; do 118 + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then 119 + CC_FOR_BUILD="$c"; break ; 120 + fi ; 121 + done ; 122 + if test x"$CC_FOR_BUILD" = x ; then 123 + CC_FOR_BUILD=no_compiler_found ; 124 + fi 125 + ;; 126 + ,,*) CC_FOR_BUILD=$CC ;; 127 + ,*,*) CC_FOR_BUILD=$HOST_CC ;; 128 +esac ; set_cc_for_build= ;' 129 + 130 +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. 131 +# (ghazi@noc.rutgers.edu 1994-08-24) 132 +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then 133 + PATH=$PATH:/.attbin ; export PATH 134 +fi 135 + 136 +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown 137 +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown 138 +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown 139 +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown 140 + 141 +# Note: order is significant - the case branches are not exclusive. 142 + 143 +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in 144 + *:NetBSD:*:*) 145 + # NetBSD (nbsd) targets should (where applicable) match one or 146 + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, 147 + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently 148 + # switched to ELF, *-*-netbsd* would select the old 149 + # object file format. This provides both forward 150 + # compatibility and a consistent mechanism for selecting the 151 + # object file format. 152 + # 153 + # Note: NetBSD doesn't particularly care about the vendor 154 + # portion of the name. We always set it to "unknown". 155 + sysctl="sysctl -n hw.machine_arch" 156 + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ 157 + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` 158 + case "${UNAME_MACHINE_ARCH}" in 159 + armeb) machine=armeb-unknown ;; 160 + arm*) machine=arm-unknown ;; 161 + sh3el) machine=shl-unknown ;; 162 + sh3eb) machine=sh-unknown ;; 163 + sh5el) machine=sh5le-unknown ;; 164 + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; 165 + esac 166 + # The Operating System including object format, if it has switched 167 + # to ELF recently, or will in the future. 168 + case "${UNAME_MACHINE_ARCH}" in 169 + arm*|i386|m68k|ns32k|sh3*|sparc|vax) 170 + eval $set_cc_for_build 171 + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ 172 + | grep -q __ELF__ 173 + then 174 + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). 175 + # Return netbsd for either. FIX? 176 + os=netbsd 177 + else 178 + os=netbsdelf 179 + fi 180 + ;; 181 + *) 182 + os=netbsd 183 + ;; 184 + esac 185 + # The OS release 186 + # Debian GNU/NetBSD machines have a different userland, and 187 + # thus, need a distinct triplet. However, they do not need 188 + # kernel version information, so it can be replaced with a 189 + # suitable tag, in the style of linux-gnu. 190 + case "${UNAME_VERSION}" in 191 + Debian*) 192 + release='-gnu' 193 + ;; 194 + *) 195 + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` 196 + ;; 197 + esac 198 + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: 199 + # contains redundant information, the shorter form: 200 + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. 201 + echo "${machine}-${os}${release}" 202 + exit ;; 203 + *:OpenBSD:*:*) 204 + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` 205 + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} 206 + exit ;; 207 + *:ekkoBSD:*:*) 208 + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} 209 + exit ;; 210 + *:SolidBSD:*:*) 211 + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} 212 + exit ;; 213 + macppc:MirBSD:*:*) 214 + echo powerpc-unknown-mirbsd${UNAME_RELEASE} 215 + exit ;; 216 + *:MirBSD:*:*) 217 + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} 218 + exit ;; 219 + alpha:OSF1:*:*) 220 + case $UNAME_RELEASE in 221 + *4.0) 222 + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` 223 + ;; 224 + *5.*) 225 + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` 226 + ;; 227 + esac 228 + # According to Compaq, /usr/sbin/psrinfo has been available on 229 + # OSF/1 and Tru64 systems produced since 1995. I hope that 230 + # covers most systems running today. This code pipes the CPU 231 + # types through head -n 1, so we only detect the type of CPU 0. 232 + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` 233 + case "$ALPHA_CPU_TYPE" in 234 + "EV4 (21064)") 235 + UNAME_MACHINE="alpha" ;; 236 + "EV4.5 (21064)") 237 + UNAME_MACHINE="alpha" ;; 238 + "LCA4 (21066/21068)") 239 + UNAME_MACHINE="alpha" ;; 240 + "EV5 (21164)") 241 + UNAME_MACHINE="alphaev5" ;; 242 + "EV5.6 (21164A)") 243 + UNAME_MACHINE="alphaev56" ;; 244 + "EV5.6 (21164PC)") 245 + UNAME_MACHINE="alphapca56" ;; 246 + "EV5.7 (21164PC)") 247 + UNAME_MACHINE="alphapca57" ;; 248 + "EV6 (21264)") 249 + UNAME_MACHINE="alphaev6" ;; 250 + "EV6.7 (21264A)") 251 + UNAME_MACHINE="alphaev67" ;; 252 + "EV6.8CB (21264C)") 253 + UNAME_MACHINE="alphaev68" ;; 254 + "EV6.8AL (21264B)") 255 + UNAME_MACHINE="alphaev68" ;; 256 + "EV6.8CX (21264D)") 257 + UNAME_MACHINE="alphaev68" ;; 258 + "EV6.9A (21264/EV69A)") 259 + UNAME_MACHINE="alphaev69" ;; 260 + "EV7 (21364)") 261 + UNAME_MACHINE="alphaev7" ;; 262 + "EV7.9 (21364A)") 263 + UNAME_MACHINE="alphaev79" ;; 264 + esac 265 + # A Pn.n version is a patched version. 266 + # A Vn.n version is a released version. 267 + # A Tn.n version is a released field test version. 268 + # A Xn.n version is an unreleased experimental baselevel. 269 + # 1.2 uses "1.2" for uname -r. 270 + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` 271 + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. 272 + exitcode=$? 273 + trap '' 0 274 + exit $exitcode ;; 275 + Alpha\ *:Windows_NT*:*) 276 + # How do we know it's Interix rather than the generic POSIX subsystem? 277 + # Should we change UNAME_MACHINE based on the output of uname instead 278 + # of the specific Alpha model? 279 + echo alpha-pc-interix 280 + exit ;; 281 + 21064:Windows_NT:50:3) 282 + echo alpha-dec-winnt3.5 283 + exit ;; 284 + Amiga*:UNIX_System_V:4.0:*) 285 + echo m68k-unknown-sysv4 286 + exit ;; 287 + *:[Aa]miga[Oo][Ss]:*:*) 288 + echo ${UNAME_MACHINE}-unknown-amigaos 289 + exit ;; 290 + *:[Mm]orph[Oo][Ss]:*:*) 291 + echo ${UNAME_MACHINE}-unknown-morphos 292 + exit ;; 293 + *:OS/390:*:*) 294 + echo i370-ibm-openedition 295 + exit ;; 296 + *:z/VM:*:*) 297 + echo s390-ibm-zvmoe 298 + exit ;; 299 + *:OS400:*:*) 300 + echo powerpc-ibm-os400 301 + exit ;; 302 + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) 303 + echo arm-acorn-riscix${UNAME_RELEASE} 304 + exit ;; 305 + arm:riscos:*:*|arm:RISCOS:*:*) 306 + echo arm-unknown-riscos 307 + exit ;; 308 + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) 309 + echo hppa1.1-hitachi-hiuxmpp 310 + exit ;; 311 + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) 312 + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. 313 + if test "`(/bin/universe) 2>/dev/null`" = att ; then 314 + echo pyramid-pyramid-sysv3 315 + else 316 + echo pyramid-pyramid-bsd 317 + fi 318 + exit ;; 319 + NILE*:*:*:dcosx) 320 + echo pyramid-pyramid-svr4 321 + exit ;; 322 + DRS?6000:unix:4.0:6*) 323 + echo sparc-icl-nx6 324 + exit ;; 325 + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) 326 + case `/usr/bin/uname -p` in 327 + sparc) echo sparc-icl-nx7; exit ;; 328 + esac ;; 329 + s390x:SunOS:*:*) 330 + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 331 + exit ;; 332 + sun4H:SunOS:5.*:*) 333 + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 334 + exit ;; 335 + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) 336 + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 337 + exit ;; 338 + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) 339 + echo i386-pc-auroraux${UNAME_RELEASE} 340 + exit ;; 341 + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) 342 + eval $set_cc_for_build 343 + SUN_ARCH="i386" 344 + # If there is a compiler, see if it is configured for 64-bit objects. 345 + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. 346 + # This test works for both compilers. 347 + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then 348 + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ 349 + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ 350 + grep IS_64BIT_ARCH >/dev/null 351 + then 352 + SUN_ARCH="x86_64" 353 + fi 354 + fi 355 + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 356 + exit ;; 357 + sun4*:SunOS:6*:*) 358 + # According to config.sub, this is the proper way to canonicalize 359 + # SunOS6. Hard to guess exactly what SunOS6 will be like, but 360 + # it's likely to be more like Solaris than SunOS4. 361 + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 362 + exit ;; 363 + sun4*:SunOS:*:*) 364 + case "`/usr/bin/arch -k`" in 365 + Series*|S4*) 366 + UNAME_RELEASE=`uname -v` 367 + ;; 368 + esac 369 + # Japanese Language versions have a version number like `4.1.3-JL'. 370 + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` 371 + exit ;; 372 + sun3*:SunOS:*:*) 373 + echo m68k-sun-sunos${UNAME_RELEASE} 374 + exit ;; 375 + sun*:*:4.2BSD:*) 376 + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` 377 + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 378 + case "`/bin/arch`" in 379 + sun3) 380 + echo m68k-sun-sunos${UNAME_RELEASE} 381 + ;; 382 + sun4) 383 + echo sparc-sun-sunos${UNAME_RELEASE} 384 + ;; 385 + esac 386 + exit ;; 387 + aushp:SunOS:*:*) 388 + echo sparc-auspex-sunos${UNAME_RELEASE} 389 + exit ;; 390 + # The situation for MiNT is a little confusing. The machine name 391 + # can be virtually everything (everything which is not 392 + # "atarist" or "atariste" at least should have a processor 393 + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" 394 + # to the lowercase version "mint" (or "freemint"). Finally 395 + # the system name "TOS" denotes a system which is actually not 396 + # MiNT. But MiNT is downward compatible to TOS, so this should 397 + # be no problem. 398 + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) 399 + echo m68k-atari-mint${UNAME_RELEASE} 400 + exit ;; 401 + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) 402 + echo m68k-atari-mint${UNAME_RELEASE} 403 + exit ;; 404 + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) 405 + echo m68k-atari-mint${UNAME_RELEASE} 406 + exit ;; 407 + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) 408 + echo m68k-milan-mint${UNAME_RELEASE} 409 + exit ;; 410 + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) 411 + echo m68k-hades-mint${UNAME_RELEASE} 412 + exit ;; 413 + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) 414 + echo m68k-unknown-mint${UNAME_RELEASE} 415 + exit ;; 416 + m68k:machten:*:*) 417 + echo m68k-apple-machten${UNAME_RELEASE} 418 + exit ;; 419 + powerpc:machten:*:*) 420 + echo powerpc-apple-machten${UNAME_RELEASE} 421 + exit ;; 422 + RISC*:Mach:*:*) 423 + echo mips-dec-mach_bsd4.3 424 + exit ;; 425 + RISC*:ULTRIX:*:*) 426 + echo mips-dec-ultrix${UNAME_RELEASE} 427 + exit ;; 428 + VAX*:ULTRIX*:*:*) 429 + echo vax-dec-ultrix${UNAME_RELEASE} 430 + exit ;; 431 + 2020:CLIX:*:* | 2430:CLIX:*:*) 432 + echo clipper-intergraph-clix${UNAME_RELEASE} 433 + exit ;; 434 + mips:*:*:UMIPS | mips:*:*:RISCos) 435 + eval $set_cc_for_build 436 + sed 's/^ //' << EOF >$dummy.c 437 +#ifdef __cplusplus 438 +#include <stdio.h> /* for printf() prototype */ 439 + int main (int argc, char *argv[]) { 440 +#else 441 + int main (argc, argv) int argc; char *argv[]; { 442 +#endif 443 + #if defined (host_mips) && defined (MIPSEB) 444 + #if defined (SYSTYPE_SYSV) 445 + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); 446 + #endif 447 + #if defined (SYSTYPE_SVR4) 448 + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); 449 + #endif 450 + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) 451 + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); 452 + #endif 453 + #endif 454 + exit (-1); 455 + } 456 +EOF 457 + $CC_FOR_BUILD -o $dummy $dummy.c && 458 + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && 459 + SYSTEM_NAME=`$dummy $dummyarg` && 460 + { echo "$SYSTEM_NAME"; exit; } 461 + echo mips-mips-riscos${UNAME_RELEASE} 462 + exit ;; 463 + Motorola:PowerMAX_OS:*:*) 464 + echo powerpc-motorola-powermax 465 + exit ;; 466 + Motorola:*:4.3:PL8-*) 467 + echo powerpc-harris-powermax 468 + exit ;; 469 + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) 470 + echo powerpc-harris-powermax 471 + exit ;; 472 + Night_Hawk:Power_UNIX:*:*) 473 + echo powerpc-harris-powerunix 474 + exit ;; 475 + m88k:CX/UX:7*:*) 476 + echo m88k-harris-cxux7 477 + exit ;; 478 + m88k:*:4*:R4*) 479 + echo m88k-motorola-sysv4 480 + exit ;; 481 + m88k:*:3*:R3*) 482 + echo m88k-motorola-sysv3 483 + exit ;; 484 + AViiON:dgux:*:*) 485 + # DG/UX returns AViiON for all architectures 486 + UNAME_PROCESSOR=`/usr/bin/uname -p` 487 + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] 488 + then 489 + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ 490 + [ ${TARGET_BINARY_INTERFACE}x = x ] 491 + then 492 + echo m88k-dg-dgux${UNAME_RELEASE} 493 + else 494 + echo m88k-dg-dguxbcs${UNAME_RELEASE} 495 + fi 496 + else 497 + echo i586-dg-dgux${UNAME_RELEASE} 498 + fi 499 + exit ;; 500 + M88*:DolphinOS:*:*) # DolphinOS (SVR3) 501 + echo m88k-dolphin-sysv3 502 + exit ;; 503 + M88*:*:R3*:*) 504 + # Delta 88k system running SVR3 505 + echo m88k-motorola-sysv3 506 + exit ;; 507 + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) 508 + echo m88k-tektronix-sysv3 509 + exit ;; 510 + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) 511 + echo m68k-tektronix-bsd 512 + exit ;; 513 + *:IRIX*:*:*) 514 + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` 515 + exit ;; 516 + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. 517 + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id 518 + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' 519 + i*86:AIX:*:*) 520 + echo i386-ibm-aix 521 + exit ;; 522 + ia64:AIX:*:*) 523 + if [ -x /usr/bin/oslevel ] ; then 524 + IBM_REV=`/usr/bin/oslevel` 525 + else 526 + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} 527 + fi 528 + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} 529 + exit ;; 530 + *:AIX:2:3) 531 + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then 532 + eval $set_cc_for_build 533 + sed 's/^ //' << EOF >$dummy.c 534 + #include <sys/systemcfg.h> 535 + 536 + main() 537 + { 538 + if (!__power_pc()) 539 + exit(1); 540 + puts("powerpc-ibm-aix3.2.5"); 541 + exit(0); 542 + } 543 +EOF 544 + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` 545 + then 546 + echo "$SYSTEM_NAME" 547 + else 548 + echo rs6000-ibm-aix3.2.5 549 + fi 550 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then 551 + echo rs6000-ibm-aix3.2.4 552 + else 553 + echo rs6000-ibm-aix3.2 554 + fi 555 + exit ;; 556 + *:AIX:*:[4567]) 557 + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` 558 + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then 559 + IBM_ARCH=rs6000 560 + else 561 + IBM_ARCH=powerpc 562 + fi 563 + if [ -x /usr/bin/oslevel ] ; then 564 + IBM_REV=`/usr/bin/oslevel` 565 + else 566 + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} 567 + fi 568 + echo ${IBM_ARCH}-ibm-aix${IBM_REV} 569 + exit ;; 570 + *:AIX:*:*) 571 + echo rs6000-ibm-aix 572 + exit ;; 573 + ibmrt:4.4BSD:*|romp-ibm:BSD:*) 574 + echo romp-ibm-bsd4.4 575 + exit ;; 576 + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and 577 + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to 578 + exit ;; # report: romp-ibm BSD 4.3 579 + *:BOSX:*:*) 580 + echo rs6000-bull-bosx 581 + exit ;; 582 + DPX/2?00:B.O.S.:*:*) 583 + echo m68k-bull-sysv3 584 + exit ;; 585 + 9000/[34]??:4.3bsd:1.*:*) 586 + echo m68k-hp-bsd 587 + exit ;; 588 + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) 589 + echo m68k-hp-bsd4.4 590 + exit ;; 591 + 9000/[34678]??:HP-UX:*:*) 592 + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` 593 + case "${UNAME_MACHINE}" in 594 + 9000/31? ) HP_ARCH=m68000 ;; 595 + 9000/[34]?? ) HP_ARCH=m68k ;; 596 + 9000/[678][0-9][0-9]) 597 + if [ -x /usr/bin/getconf ]; then 598 + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` 599 + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` 600 + case "${sc_cpu_version}" in 601 + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 602 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 603 + 532) # CPU_PA_RISC2_0 604 + case "${sc_kernel_bits}" in 605 + 32) HP_ARCH="hppa2.0n" ;; 606 + 64) HP_ARCH="hppa2.0w" ;; 607 + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 608 + esac ;; 609 + esac 610 + fi 611 + if [ "${HP_ARCH}" = "" ]; then 612 + eval $set_cc_for_build 613 + sed 's/^ //' << EOF >$dummy.c 614 + 615 + #define _HPUX_SOURCE 616 + #include <stdlib.h> 617 + #include <unistd.h> 618 + 619 + int main () 620 + { 621 + #if defined(_SC_KERNEL_BITS) 622 + long bits = sysconf(_SC_KERNEL_BITS); 623 + #endif 624 + long cpu = sysconf (_SC_CPU_VERSION); 625 + 626 + switch (cpu) 627 + { 628 + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; 629 + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; 630 + case CPU_PA_RISC2_0: 631 + #if defined(_SC_KERNEL_BITS) 632 + switch (bits) 633 + { 634 + case 64: puts ("hppa2.0w"); break; 635 + case 32: puts ("hppa2.0n"); break; 636 + default: puts ("hppa2.0"); break; 637 + } break; 638 + #else /* !defined(_SC_KERNEL_BITS) */ 639 + puts ("hppa2.0"); break; 640 + #endif 641 + default: puts ("hppa1.0"); break; 642 + } 643 + exit (0); 644 + } 645 +EOF 646 + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` 647 + test -z "$HP_ARCH" && HP_ARCH=hppa 648 + fi ;; 649 + esac 650 + if [ ${HP_ARCH} = "hppa2.0w" ] 651 + then 652 + eval $set_cc_for_build 653 + 654 + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating 655 + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler 656 + # generating 64-bit code. GNU and HP use different nomenclature: 657 + # 658 + # $ CC_FOR_BUILD=cc ./config.guess 659 + # => hppa2.0w-hp-hpux11.23 660 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess 661 + # => hppa64-hp-hpux11.23 662 + 663 + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | 664 + grep -q __LP64__ 665 + then 666 + HP_ARCH="hppa2.0w" 667 + else 668 + HP_ARCH="hppa64" 669 + fi 670 + fi 671 + echo ${HP_ARCH}-hp-hpux${HPUX_REV} 672 + exit ;; 673 + ia64:HP-UX:*:*) 674 + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` 675 + echo ia64-hp-hpux${HPUX_REV} 676 + exit ;; 677 + 3050*:HI-UX:*:*) 678 + eval $set_cc_for_build 679 + sed 's/^ //' << EOF >$dummy.c 680 + #include <unistd.h> 681 + int 682 + main () 683 + { 684 + long cpu = sysconf (_SC_CPU_VERSION); 685 + /* The order matters, because CPU_IS_HP_MC68K erroneously returns 686 + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct 687 + results, however. */ 688 + if (CPU_IS_PA_RISC (cpu)) 689 + { 690 + switch (cpu) 691 + { 692 + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; 693 + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; 694 + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; 695 + default: puts ("hppa-hitachi-hiuxwe2"); break; 696 + } 697 + } 698 + else if (CPU_IS_HP_MC68K (cpu)) 699 + puts ("m68k-hitachi-hiuxwe2"); 700 + else puts ("unknown-hitachi-hiuxwe2"); 701 + exit (0); 702 + } 703 +EOF 704 + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && 705 + { echo "$SYSTEM_NAME"; exit; } 706 + echo unknown-hitachi-hiuxwe2 707 + exit ;; 708 + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) 709 + echo hppa1.1-hp-bsd 710 + exit ;; 711 + 9000/8??:4.3bsd:*:*) 712 + echo hppa1.0-hp-bsd 713 + exit ;; 714 + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) 715 + echo hppa1.0-hp-mpeix 716 + exit ;; 717 + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) 718 + echo hppa1.1-hp-osf 719 + exit ;; 720 + hp8??:OSF1:*:*) 721 + echo hppa1.0-hp-osf 722 + exit ;; 723 + i*86:OSF1:*:*) 724 + if [ -x /usr/sbin/sysversion ] ; then 725 + echo ${UNAME_MACHINE}-unknown-osf1mk 726 + else 727 + echo ${UNAME_MACHINE}-unknown-osf1 728 + fi 729 + exit ;; 730 + parisc*:Lites*:*:*) 731 + echo hppa1.1-hp-lites 732 + exit ;; 733 + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) 734 + echo c1-convex-bsd 735 + exit ;; 736 + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) 737 + if getsysinfo -f scalar_acc 738 + then echo c32-convex-bsd 739 + else echo c2-convex-bsd 740 + fi 741 + exit ;; 742 + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) 743 + echo c34-convex-bsd 744 + exit ;; 745 + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) 746 + echo c38-convex-bsd 747 + exit ;; 748 + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) 749 + echo c4-convex-bsd 750 + exit ;; 751 + CRAY*Y-MP:*:*:*) 752 + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 753 + exit ;; 754 + CRAY*[A-Z]90:*:*:*) 755 + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ 756 + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ 757 + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ 758 + -e 's/\.[^.]*$/.X/' 759 + exit ;; 760 + CRAY*TS:*:*:*) 761 + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 762 + exit ;; 763 + CRAY*T3E:*:*:*) 764 + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 765 + exit ;; 766 + CRAY*SV1:*:*:*) 767 + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 768 + exit ;; 769 + *:UNICOS/mp:*:*) 770 + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 771 + exit ;; 772 + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) 773 + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` 774 + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` 775 + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` 776 + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" 777 + exit ;; 778 + 5000:UNIX_System_V:4.*:*) 779 + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` 780 + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` 781 + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" 782 + exit ;; 783 + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) 784 + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} 785 + exit ;; 786 + sparc*:BSD/OS:*:*) 787 + echo sparc-unknown-bsdi${UNAME_RELEASE} 788 + exit ;; 789 + *:BSD/OS:*:*) 790 + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} 791 + exit ;; 792 + *:FreeBSD:*:*) 793 + UNAME_PROCESSOR=`/usr/bin/uname -p` 794 + case ${UNAME_PROCESSOR} in 795 + amd64) 796 + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; 797 + *) 798 + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; 799 + esac 800 + exit ;; 801 + i*:CYGWIN*:*) 802 + echo ${UNAME_MACHINE}-pc-cygwin 803 + exit ;; 804 + *:MINGW*:*) 805 + echo ${UNAME_MACHINE}-pc-mingw32 806 + exit ;; 807 + i*:MSYS*:*) 808 + echo ${UNAME_MACHINE}-pc-msys 809 + exit ;; 810 + i*:windows32*:*) 811 + # uname -m includes "-pc" on this system. 812 + echo ${UNAME_MACHINE}-mingw32 813 + exit ;; 814 + i*:PW*:*) 815 + echo ${UNAME_MACHINE}-pc-pw32 816 + exit ;; 817 + *:Interix*:*) 818 + case ${UNAME_MACHINE} in 819 + x86) 820 + echo i586-pc-interix${UNAME_RELEASE} 821 + exit ;; 822 + authenticamd | genuineintel | EM64T) 823 + echo x86_64-unknown-interix${UNAME_RELEASE} 824 + exit ;; 825 + IA64) 826 + echo ia64-unknown-interix${UNAME_RELEASE} 827 + exit ;; 828 + esac ;; 829 + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) 830 + echo i${UNAME_MACHINE}-pc-mks 831 + exit ;; 832 + 8664:Windows_NT:*) 833 + echo x86_64-pc-mks 834 + exit ;; 835 + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) 836 + # How do we know it's Interix rather than the generic POSIX subsystem? 837 + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we 838 + # UNAME_MACHINE based on the output of uname instead of i386? 839 + echo i586-pc-interix 840 + exit ;; 841 + i*:UWIN*:*) 842 + echo ${UNAME_MACHINE}-pc-uwin 843 + exit ;; 844 + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) 845 + echo x86_64-unknown-cygwin 846 + exit ;; 847 + p*:CYGWIN*:*) 848 + echo powerpcle-unknown-cygwin 849 + exit ;; 850 + prep*:SunOS:5.*:*) 851 + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 852 + exit ;; 853 + *:GNU:*:*) 854 + # the GNU system 855 + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` 856 + exit ;; 857 + *:GNU/*:*:*) 858 + # other systems with GNU libc and userland 859 + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu 860 + exit ;; 861 + i*86:Minix:*:*) 862 + echo ${UNAME_MACHINE}-pc-minix 863 + exit ;; 864 + aarch64:Linux:*:*) 865 + echo ${UNAME_MACHINE}-unknown-linux-gnu 866 + exit ;; 867 + aarch64_be:Linux:*:*) 868 + UNAME_MACHINE=aarch64_be 869 + echo ${UNAME_MACHINE}-unknown-linux-gnu 870 + exit ;; 871 + alpha:Linux:*:*) 872 + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in 873 + EV5) UNAME_MACHINE=alphaev5 ;; 874 + EV56) UNAME_MACHINE=alphaev56 ;; 875 + PCA56) UNAME_MACHINE=alphapca56 ;; 876 + PCA57) UNAME_MACHINE=alphapca56 ;; 877 + EV6) UNAME_MACHINE=alphaev6 ;; 878 + EV67) UNAME_MACHINE=alphaev67 ;; 879 + EV68*) UNAME_MACHINE=alphaev68 ;; 880 + esac 881 + objdump --private-headers /bin/sh | grep -q ld.so.1 882 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi 883 + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} 884 + exit ;; 885 + arm*:Linux:*:*) 886 + eval $set_cc_for_build 887 + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ 888 + | grep -q __ARM_EABI__ 889 + then 890 + echo ${UNAME_MACHINE}-unknown-linux-gnu 891 + else 892 + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ 893 + | grep -q __ARM_PCS_VFP 894 + then 895 + echo ${UNAME_MACHINE}-unknown-linux-gnueabi 896 + else 897 + echo ${UNAME_MACHINE}-unknown-linux-gnueabihf 898 + fi 899 + fi 900 + exit ;; 901 + avr32*:Linux:*:*) 902 + echo ${UNAME_MACHINE}-unknown-linux-gnu 903 + exit ;; 904 + cris:Linux:*:*) 905 + echo ${UNAME_MACHINE}-axis-linux-gnu 906 + exit ;; 907 + crisv32:Linux:*:*) 908 + echo ${UNAME_MACHINE}-axis-linux-gnu 909 + exit ;; 910 + frv:Linux:*:*) 911 + echo ${UNAME_MACHINE}-unknown-linux-gnu 912 + exit ;; 913 + hexagon:Linux:*:*) 914 + echo ${UNAME_MACHINE}-unknown-linux-gnu 915 + exit ;; 916 + i*86:Linux:*:*) 917 + LIBC=gnu 918 + eval $set_cc_for_build 919 + sed 's/^ //' << EOF >$dummy.c 920 + #ifdef __dietlibc__ 921 + LIBC=dietlibc 922 + #endif 923 +EOF 924 + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` 925 + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" 926 + exit ;; 927 + ia64:Linux:*:*) 928 + echo ${UNAME_MACHINE}-unknown-linux-gnu 929 + exit ;; 930 + m32r*:Linux:*:*) 931 + echo ${UNAME_MACHINE}-unknown-linux-gnu 932 + exit ;; 933 + m68*:Linux:*:*) 934 + echo ${UNAME_MACHINE}-unknown-linux-gnu 935 + exit ;; 936 + mips:Linux:*:* | mips64:Linux:*:*) 937 + eval $set_cc_for_build 938 + sed 's/^ //' << EOF >$dummy.c 939 + #undef CPU 940 + #undef ${UNAME_MACHINE} 941 + #undef ${UNAME_MACHINE}el 942 + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) 943 + CPU=${UNAME_MACHINE}el 944 + #else 945 + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) 946 + CPU=${UNAME_MACHINE} 947 + #else 948 + CPU= 949 + #endif 950 + #endif 951 +EOF 952 + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` 953 + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } 954 + ;; 955 + or32:Linux:*:*) 956 + echo ${UNAME_MACHINE}-unknown-linux-gnu 957 + exit ;; 958 + padre:Linux:*:*) 959 + echo sparc-unknown-linux-gnu 960 + exit ;; 961 + parisc64:Linux:*:* | hppa64:Linux:*:*) 962 + echo hppa64-unknown-linux-gnu 963 + exit ;; 964 + parisc:Linux:*:* | hppa:Linux:*:*) 965 + # Look for CPU level 966 + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in 967 + PA7*) echo hppa1.1-unknown-linux-gnu ;; 968 + PA8*) echo hppa2.0-unknown-linux-gnu ;; 969 + *) echo hppa-unknown-linux-gnu ;; 970 + esac 971 + exit ;; 972 + ppc64:Linux:*:*) 973 + echo powerpc64-unknown-linux-gnu 974 + exit ;; 975 + ppc:Linux:*:*) 976 + echo powerpc-unknown-linux-gnu 977 + exit ;; 978 + s390:Linux:*:* | s390x:Linux:*:*) 979 + echo ${UNAME_MACHINE}-ibm-linux 980 + exit ;; 981 + sh64*:Linux:*:*) 982 + echo ${UNAME_MACHINE}-unknown-linux-gnu 983 + exit ;; 984 + sh*:Linux:*:*) 985 + echo ${UNAME_MACHINE}-unknown-linux-gnu 986 + exit ;; 987 + sparc:Linux:*:* | sparc64:Linux:*:*) 988 + echo ${UNAME_MACHINE}-unknown-linux-gnu 989 + exit ;; 990 + tile*:Linux:*:*) 991 + echo ${UNAME_MACHINE}-unknown-linux-gnu 992 + exit ;; 993 + vax:Linux:*:*) 994 + echo ${UNAME_MACHINE}-dec-linux-gnu 995 + exit ;; 996 + x86_64:Linux:*:*) 997 + echo ${UNAME_MACHINE}-unknown-linux-gnu 998 + exit ;; 999 + xtensa*:Linux:*:*) 1000 + echo ${UNAME_MACHINE}-unknown-linux-gnu 1001 + exit ;; 1002 + i*86:DYNIX/ptx:4*:*) 1003 + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. 1004 + # earlier versions are messed up and put the nodename in both 1005 + # sysname and nodename. 1006 + echo i386-sequent-sysv4 1007 + exit ;; 1008 + i*86:UNIX_SV:4.2MP:2.*) 1009 + # Unixware is an offshoot of SVR4, but it has its own version 1010 + # number series starting with 2... 1011 + # I am not positive that other SVR4 systems won't match this, 1012 + # I just have to hope. -- rms. 1013 + # Use sysv4.2uw... so that sysv4* matches it. 1014 + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} 1015 + exit ;; 1016 + i*86:OS/2:*:*) 1017 + # If we were able to find `uname', then EMX Unix compatibility 1018 + # is probably installed. 1019 + echo ${UNAME_MACHINE}-pc-os2-emx 1020 + exit ;; 1021 + i*86:XTS-300:*:STOP) 1022 + echo ${UNAME_MACHINE}-unknown-stop 1023 + exit ;; 1024 + i*86:atheos:*:*) 1025 + echo ${UNAME_MACHINE}-unknown-atheos 1026 + exit ;; 1027 + i*86:syllable:*:*) 1028 + echo ${UNAME_MACHINE}-pc-syllable 1029 + exit ;; 1030 + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) 1031 + echo i386-unknown-lynxos${UNAME_RELEASE} 1032 + exit ;; 1033 + i*86:*DOS:*:*) 1034 + echo ${UNAME_MACHINE}-pc-msdosdjgpp 1035 + exit ;; 1036 + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) 1037 + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` 1038 + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then 1039 + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} 1040 + else 1041 + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} 1042 + fi 1043 + exit ;; 1044 + i*86:*:5:[678]*) 1045 + # UnixWare 7.x, OpenUNIX and OpenServer 6. 1046 + case `/bin/uname -X | grep "^Machine"` in 1047 + *486*) UNAME_MACHINE=i486 ;; 1048 + *Pentium) UNAME_MACHINE=i586 ;; 1049 + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; 1050 + esac 1051 + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} 1052 + exit ;; 1053 + i*86:*:3.2:*) 1054 + if test -f /usr/options/cb.name; then 1055 + UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` 1056 + echo ${UNAME_MACHINE}-pc-isc$UNAME_REL 1057 + elif /bin/uname -X 2>/dev/null >/dev/null ; then 1058 + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` 1059 + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 1060 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ 1061 + && UNAME_MACHINE=i586 1062 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ 1063 + && UNAME_MACHINE=i686 1064 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ 1065 + && UNAME_MACHINE=i686 1066 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL 1067 + else 1068 + echo ${UNAME_MACHINE}-pc-sysv32 1069 + fi 1070 + exit ;; 1071 + pc:*:*:*) 1072 + # Left here for compatibility: 1073 + # uname -m prints for DJGPP always 'pc', but it prints nothing about 1074 + # the processor, so we play safe by assuming i586. 1075 + # Note: whatever this is, it MUST be the same as what config.sub 1076 + # prints for the "djgpp" host, or else GDB configury will decide that 1077 + # this is a cross-build. 1078 + echo i586-pc-msdosdjgpp 1079 + exit ;; 1080 + Intel:Mach:3*:*) 1081 + echo i386-pc-mach3 1082 + exit ;; 1083 + paragon:*:*:*) 1084 + echo i860-intel-osf1 1085 + exit ;; 1086 + i860:*:4.*:*) # i860-SVR4 1087 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then 1088 + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 1089 + else # Add other i860-SVR4 vendors below as they are discovered. 1090 + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 1091 + fi 1092 + exit ;; 1093 + mini*:CTIX:SYS*5:*) 1094 + # "miniframe" 1095 + echo m68010-convergent-sysv 1096 + exit ;; 1097 + mc68k:UNIX:SYSTEM5:3.51m) 1098 + echo m68k-convergent-sysv 1099 + exit ;; 1100 + M680?0:D-NIX:5.3:*) 1101 + echo m68k-diab-dnix 1102 + exit ;; 1103 + M68*:*:R3V[5678]*:*) 1104 + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 1105 + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) 1106 + OS_REL='' 1107 + test -r /etc/.relid \ 1108 + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` 1109 + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ 1110 + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } 1111 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ 1112 + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 1113 + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) 1114 + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ 1115 + && { echo i486-ncr-sysv4; exit; } ;; 1116 + NCR*:*:4.2:* | MPRAS*:*:4.2:*) 1117 + OS_REL='.3' 1118 + test -r /etc/.relid \ 1119 + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` 1120 + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ 1121 + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } 1122 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ 1123 + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } 1124 + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ 1125 + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 1126 + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) 1127 + echo m68k-unknown-lynxos${UNAME_RELEASE} 1128 + exit ;; 1129 + mc68030:UNIX_System_V:4.*:*) 1130 + echo m68k-atari-sysv4 1131 + exit ;; 1132 + TSUNAMI:LynxOS:2.*:*) 1133 + echo sparc-unknown-lynxos${UNAME_RELEASE} 1134 + exit ;; 1135 + rs6000:LynxOS:2.*:*) 1136 + echo rs6000-unknown-lynxos${UNAME_RELEASE} 1137 + exit ;; 1138 + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) 1139 + echo powerpc-unknown-lynxos${UNAME_RELEASE} 1140 + exit ;; 1141 + SM[BE]S:UNIX_SV:*:*) 1142 + echo mips-dde-sysv${UNAME_RELEASE} 1143 + exit ;; 1144 + RM*:ReliantUNIX-*:*:*) 1145 + echo mips-sni-sysv4 1146 + exit ;; 1147 + RM*:SINIX-*:*:*) 1148 + echo mips-sni-sysv4 1149 + exit ;; 1150 + *:SINIX-*:*:*) 1151 + if uname -p 2>/dev/null >/dev/null ; then 1152 + UNAME_MACHINE=`(uname -p) 2>/dev/null` 1153 + echo ${UNAME_MACHINE}-sni-sysv4 1154 + else 1155 + echo ns32k-sni-sysv 1156 + fi 1157 + exit ;; 1158 + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort 1159 + # says <Richard.M.Bartel@ccMail.Census.GOV> 1160 + echo i586-unisys-sysv4 1161 + exit ;; 1162 + *:UNIX_System_V:4*:FTX*) 1163 + # From Gerald Hewes <hewes@openmarket.com>. 1164 + # How about differentiating between stratus architectures? -djm 1165 + echo hppa1.1-stratus-sysv4 1166 + exit ;; 1167 + *:*:*:FTX*) 1168 + # From seanf@swdc.stratus.com. 1169 + echo i860-stratus-sysv4 1170 + exit ;; 1171 + i*86:VOS:*:*) 1172 + # From Paul.Green@stratus.com. 1173 + echo ${UNAME_MACHINE}-stratus-vos 1174 + exit ;; 1175 + *:VOS:*:*) 1176 + # From Paul.Green@stratus.com. 1177 + echo hppa1.1-stratus-vos 1178 + exit ;; 1179 + mc68*:A/UX:*:*) 1180 + echo m68k-apple-aux${UNAME_RELEASE} 1181 + exit ;; 1182 + news*:NEWS-OS:6*:*) 1183 + echo mips-sony-newsos6 1184 + exit ;; 1185 + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) 1186 + if [ -d /usr/nec ]; then 1187 + echo mips-nec-sysv${UNAME_RELEASE} 1188 + else 1189 + echo mips-unknown-sysv${UNAME_RELEASE} 1190 + fi 1191 + exit ;; 1192 + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. 1193 + echo powerpc-be-beos 1194 + exit ;; 1195 + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. 1196 + echo powerpc-apple-beos 1197 + exit ;; 1198 + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. 1199 + echo i586-pc-beos 1200 + exit ;; 1201 + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. 1202 + echo i586-pc-haiku 1203 + exit ;; 1204 + SX-4:SUPER-UX:*:*) 1205 + echo sx4-nec-superux${UNAME_RELEASE} 1206 + exit ;; 1207 + SX-5:SUPER-UX:*:*) 1208 + echo sx5-nec-superux${UNAME_RELEASE} 1209 + exit ;; 1210 + SX-6:SUPER-UX:*:*) 1211 + echo sx6-nec-superux${UNAME_RELEASE} 1212 + exit ;; 1213 + SX-7:SUPER-UX:*:*) 1214 + echo sx7-nec-superux${UNAME_RELEASE} 1215 + exit ;; 1216 + SX-8:SUPER-UX:*:*) 1217 + echo sx8-nec-superux${UNAME_RELEASE} 1218 + exit ;; 1219 + SX-8R:SUPER-UX:*:*) 1220 + echo sx8r-nec-superux${UNAME_RELEASE} 1221 + exit ;; 1222 + Power*:Rhapsody:*:*) 1223 + echo powerpc-apple-rhapsody${UNAME_RELEASE} 1224 + exit ;; 1225 + *:Rhapsody:*:*) 1226 + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} 1227 + exit ;; 1228 + *:Darwin:*:*) 1229 + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown 1230 + case $UNAME_PROCESSOR in 1231 + i386) 1232 + eval $set_cc_for_build 1233 + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then 1234 + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ 1235 + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ 1236 + grep IS_64BIT_ARCH >/dev/null 1237 + then 1238 + UNAME_PROCESSOR="x86_64" 1239 + fi 1240 + fi ;; 1241 + unknown) UNAME_PROCESSOR=powerpc ;; 1242 + esac 1243 + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} 1244 + exit ;; 1245 + *:procnto*:*:* | *:QNX:[0123456789]*:*) 1246 + UNAME_PROCESSOR=`uname -p` 1247 + if test "$UNAME_PROCESSOR" = "x86"; then 1248 + UNAME_PROCESSOR=i386 1249 + UNAME_MACHINE=pc 1250 + fi 1251 + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} 1252 + exit ;; 1253 + *:QNX:*:4*) 1254 + echo i386-pc-qnx 1255 + exit ;; 1256 + NEO-?:NONSTOP_KERNEL:*:*) 1257 + echo neo-tandem-nsk${UNAME_RELEASE} 1258 + exit ;; 1259 + NSE-?:NONSTOP_KERNEL:*:*) 1260 + echo nse-tandem-nsk${UNAME_RELEASE} 1261 + exit ;; 1262 + NSR-?:NONSTOP_KERNEL:*:*) 1263 + echo nsr-tandem-nsk${UNAME_RELEASE} 1264 + exit ;; 1265 + *:NonStop-UX:*:*) 1266 + echo mips-compaq-nonstopux 1267 + exit ;; 1268 + BS2000:POSIX*:*:*) 1269 + echo bs2000-siemens-sysv 1270 + exit ;; 1271 + DS/*:UNIX_System_V:*:*) 1272 + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} 1273 + exit ;; 1274 + *:Plan9:*:*) 1275 + # "uname -m" is not consistent, so use $cputype instead. 386 1276 + # is converted to i386 for consistency with other x86 1277 + # operating systems. 1278 + if test "$cputype" = "386"; then 1279 + UNAME_MACHINE=i386 1280 + else 1281 + UNAME_MACHINE="$cputype" 1282 + fi 1283 + echo ${UNAME_MACHINE}-unknown-plan9 1284 + exit ;; 1285 + *:TOPS-10:*:*) 1286 + echo pdp10-unknown-tops10 1287 + exit ;; 1288 + *:TENEX:*:*) 1289 + echo pdp10-unknown-tenex 1290 + exit ;; 1291 + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) 1292 + echo pdp10-dec-tops20 1293 + exit ;; 1294 + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) 1295 + echo pdp10-xkl-tops20 1296 + exit ;; 1297 + *:TOPS-20:*:*) 1298 + echo pdp10-unknown-tops20 1299 + exit ;; 1300 + *:ITS:*:*) 1301 + echo pdp10-unknown-its 1302 + exit ;; 1303 + SEI:*:*:SEIUX) 1304 + echo mips-sei-seiux${UNAME_RELEASE} 1305 + exit ;; 1306 + *:DragonFly:*:*) 1307 + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` 1308 + exit ;; 1309 + *:*VMS:*:*) 1310 + UNAME_MACHINE=`(uname -p) 2>/dev/null` 1311 + case "${UNAME_MACHINE}" in 1312 + A*) echo alpha-dec-vms ; exit ;; 1313 + I*) echo ia64-dec-vms ; exit ;; 1314 + V*) echo vax-dec-vms ; exit ;; 1315 + esac ;; 1316 + *:XENIX:*:SysV) 1317 + echo i386-pc-xenix 1318 + exit ;; 1319 + i*86:skyos:*:*) 1320 + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' 1321 + exit ;; 1322 + i*86:rdos:*:*) 1323 + echo ${UNAME_MACHINE}-pc-rdos 1324 + exit ;; 1325 + i*86:AROS:*:*) 1326 + echo ${UNAME_MACHINE}-pc-aros 1327 + exit ;; 1328 + x86_64:VMkernel:*:*) 1329 + echo ${UNAME_MACHINE}-unknown-esx 1330 + exit ;; 1331 +esac 1332 + 1333 +#echo '(No uname command or uname output not recognized.)' 1>&2 1334 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 1335 + 1336 +eval $set_cc_for_build 1337 +cat >$dummy.c <<EOF 1338 +#ifdef _SEQUENT_ 1339 +# include <sys/types.h> 1340 +# include <sys/utsname.h> 1341 +#endif 1342 +main () 1343 +{ 1344 +#if defined (sony) 1345 +#if defined (MIPSEB) 1346 + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, 1347 + I don't know.... */ 1348 + printf ("mips-sony-bsd\n"); exit (0); 1349 +#else 1350 +#include <sys/param.h> 1351 + printf ("m68k-sony-newsos%s\n", 1352 +#ifdef NEWSOS4 1353 + "4" 1354 +#else 1355 + "" 1356 +#endif 1357 + ); exit (0); 1358 +#endif 1359 +#endif 1360 + 1361 +#if defined (__arm) && defined (__acorn) && defined (__unix) 1362 + printf ("arm-acorn-riscix\n"); exit (0); 1363 +#endif 1364 + 1365 +#if defined (hp300) && !defined (hpux) 1366 + printf ("m68k-hp-bsd\n"); exit (0); 1367 +#endif 1368 + 1369 +#if defined (NeXT) 1370 +#if !defined (__ARCHITECTURE__) 1371 +#define __ARCHITECTURE__ "m68k" 1372 +#endif 1373 + int version; 1374 + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; 1375 + if (version < 4) 1376 + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); 1377 + else 1378 + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); 1379 + exit (0); 1380 +#endif 1381 + 1382 +#if defined (MULTIMAX) || defined (n16) 1383 +#if defined (UMAXV) 1384 + printf ("ns32k-encore-sysv\n"); exit (0); 1385 +#else 1386 +#if defined (CMU) 1387 + printf ("ns32k-encore-mach\n"); exit (0); 1388 +#else 1389 + printf ("ns32k-encore-bsd\n"); exit (0); 1390 +#endif 1391 +#endif 1392 +#endif 1393 + 1394 +#if defined (__386BSD__) 1395 + printf ("i386-pc-bsd\n"); exit (0); 1396 +#endif 1397 + 1398 +#if defined (sequent) 1399 +#if defined (i386) 1400 + printf ("i386-sequent-dynix\n"); exit (0); 1401 +#endif 1402 +#if defined (ns32000) 1403 + printf ("ns32k-sequent-dynix\n"); exit (0); 1404 +#endif 1405 +#endif 1406 + 1407 +#if defined (_SEQUENT_) 1408 + struct utsname un; 1409 + 1410 + uname(&un); 1411 + 1412 + if (strncmp(un.version, "V2", 2) == 0) { 1413 + printf ("i386-sequent-ptx2\n"); exit (0); 1414 + } 1415 + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ 1416 + printf ("i386-sequent-ptx1\n"); exit (0); 1417 + } 1418 + printf ("i386-sequent-ptx\n"); exit (0); 1419 + 1420 +#endif 1421 + 1422 +#if defined (vax) 1423 +# if !defined (ultrix) 1424 +# include <sys/param.h> 1425 +# if defined (BSD) 1426 +# if BSD == 43 1427 + printf ("vax-dec-bsd4.3\n"); exit (0); 1428 +# else 1429 +# if BSD == 199006 1430 + printf ("vax-dec-bsd4.3reno\n"); exit (0); 1431 +# else 1432 + printf ("vax-dec-bsd\n"); exit (0); 1433 +# endif 1434 +# endif 1435 +# else 1436 + printf ("vax-dec-bsd\n"); exit (0); 1437 +# endif 1438 +# else 1439 + printf ("vax-dec-ultrix\n"); exit (0); 1440 +# endif 1441 +#endif 1442 + 1443 +#if defined (alliant) && defined (i860) 1444 + printf ("i860-alliant-bsd\n"); exit (0); 1445 +#endif 1446 + 1447 + exit (1); 1448 +} 1449 +EOF 1450 + 1451 +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && 1452 + { echo "$SYSTEM_NAME"; exit; } 1453 + 1454 +# Apollos put the system type in the environment. 1455 + 1456 +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } 1457 + 1458 +# Convex versions that predate uname can use getsysinfo(1) 1459 + 1460 +if [ -x /usr/convex/getsysinfo ] 1461 +then 1462 + case `getsysinfo -f cpu_type` in 1463 + c1*) 1464 + echo c1-convex-bsd 1465 + exit ;; 1466 + c2*) 1467 + if getsysinfo -f scalar_acc 1468 + then echo c32-convex-bsd 1469 + else echo c2-convex-bsd 1470 + fi 1471 + exit ;; 1472 + c34*) 1473 + echo c34-convex-bsd 1474 + exit ;; 1475 + c38*) 1476 + echo c38-convex-bsd 1477 + exit ;; 1478 + c4*) 1479 + echo c4-convex-bsd 1480 + exit ;; 1481 + esac 1482 +fi 1483 + 1484 +cat >&2 <<EOF 1485 +$0: unable to guess system type 1486 + 1487 +This script, last modified $timestamp, has failed to recognize 1488 +the operating system you are using. It is advised that you 1489 +download the most up to date version of the config scripts from 1490 + 1491 + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD 1492 +and 1493 + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD 1494 + 1495 +If the version you run ($0) is already up to date, please 1496 +send the following data and any information you think might be 1497 +pertinent to <config-patches@gnu.org> in order to provide the needed 1498 +information to handle your system. 1499 + 1500 +config.guess timestamp = $timestamp 1501 + 1502 +uname -m = `(uname -m) 2>/dev/null || echo unknown` 1503 +uname -r = `(uname -r) 2>/dev/null || echo unknown` 1504 +uname -s = `(uname -s) 2>/dev/null || echo unknown` 1505 +uname -v = `(uname -v) 2>/dev/null || echo unknown` 1506 + 1507 +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` 1508 +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` 1509 + 1510 +hostinfo = `(hostinfo) 2>/dev/null` 1511 +/bin/universe = `(/bin/universe) 2>/dev/null` 1512 +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` 1513 +/bin/arch = `(/bin/arch) 2>/dev/null` 1514 +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` 1515 +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` 1516 + 1517 +UNAME_MACHINE = ${UNAME_MACHINE} 1518 +UNAME_RELEASE = ${UNAME_RELEASE} 1519 +UNAME_SYSTEM = ${UNAME_SYSTEM} 1520 +UNAME_VERSION = ${UNAME_VERSION} 1521 +EOF 1522 + 1523 +exit 1 1524 + 1525 +# Local variables: 1526 +# eval: (add-hook 'write-file-hooks 'time-stamp) 1527 +# time-stamp-start: "timestamp='" 1528 +# time-stamp-format: "%:y-%02m-%02d" 1529 +# time-stamp-end: "'" 1530 +# End:
Added config.sub.
1 +#! /bin/sh 2 +# Configuration validation subroutine script. 3 +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 4 +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 5 +# 2011, 2012 Free Software Foundation, Inc. 6 + 7 +timestamp='2012-02-10' 8 + 9 +# This file is (in principle) common to ALL GNU software. 10 +# The presence of a machine in this file suggests that SOME GNU software 11 +# can handle that machine. It does not imply ALL GNU software can. 12 +# 13 +# This file is free software; you can redistribute it and/or modify 14 +# it under the terms of the GNU General Public License as published by 15 +# the Free Software Foundation; either version 2 of the License, or 16 +# (at your option) any later version. 17 +# 18 +# This program is distributed in the hope that it will be useful, 19 +# but WITHOUT ANY WARRANTY; without even the implied warranty of 20 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21 +# GNU General Public License for more details. 22 +# 23 +# You should have received a copy of the GNU General Public License 24 +# along with this program; if not, see <http://www.gnu.org/licenses/>. 25 +# 26 +# As a special exception to the GNU General Public License, if you 27 +# distribute this file as part of a program that contains a 28 +# configuration script generated by Autoconf, you may include it under 29 +# the same distribution terms that you use for the rest of that program. 30 + 31 + 32 +# Please send patches to <config-patches@gnu.org>. Submit a context 33 +# diff and a properly formatted GNU ChangeLog entry. 34 +# 35 +# Configuration subroutine to validate and canonicalize a configuration type. 36 +# Supply the specified configuration type as an argument. 37 +# If it is invalid, we print an error message on stderr and exit with code 1. 38 +# Otherwise, we print the canonical config type on stdout and succeed. 39 + 40 +# You can get the latest version of this script from: 41 +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD 42 + 43 +# This file is supposed to be the same for all GNU packages 44 +# and recognize all the CPU types, system types and aliases 45 +# that are meaningful with *any* GNU software. 46 +# Each package is responsible for reporting which valid configurations 47 +# it does not support. The user should be able to distinguish 48 +# a failure to support a valid configuration from a meaningless 49 +# configuration. 50 + 51 +# The goal of this file is to map all the various variations of a given 52 +# machine specification into a single specification in the form: 53 +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM 54 +# or in some cases, the newer four-part form: 55 +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM 56 +# It is wrong to echo any other type of specification. 57 + 58 +me=`echo "$0" | sed -e 's,.*/,,'` 59 + 60 +usage="\ 61 +Usage: $0 [OPTION] CPU-MFR-OPSYS 62 + $0 [OPTION] ALIAS 63 + 64 +Canonicalize a configuration name. 65 + 66 +Operation modes: 67 + -h, --help print this help, then exit 68 + -t, --time-stamp print date of last modification, then exit 69 + -v, --version print version number, then exit 70 + 71 +Report bugs and patches to <config-patches@gnu.org>." 72 + 73 +version="\ 74 +GNU config.sub ($timestamp) 75 + 76 +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 77 +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 78 +Free Software Foundation, Inc. 79 + 80 +This is free software; see the source for copying conditions. There is NO 81 +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." 82 + 83 +help=" 84 +Try \`$me --help' for more information." 85 + 86 +# Parse command line 87 +while test $# -gt 0 ; do 88 + case $1 in 89 + --time-stamp | --time* | -t ) 90 + echo "$timestamp" ; exit ;; 91 + --version | -v ) 92 + echo "$version" ; exit ;; 93 + --help | --h* | -h ) 94 + echo "$usage"; exit ;; 95 + -- ) # Stop option processing 96 + shift; break ;; 97 + - ) # Use stdin as input. 98 + break ;; 99 + -* ) 100 + echo "$me: invalid option $1$help" 101 + exit 1 ;; 102 + 103 + *local*) 104 + # First pass through any local machine types. 105 + echo $1 106 + exit ;; 107 + 108 + * ) 109 + break ;; 110 + esac 111 +done 112 + 113 +case $# in 114 + 0) echo "$me: missing argument$help" >&2 115 + exit 1;; 116 + 1) ;; 117 + *) echo "$me: too many arguments$help" >&2 118 + exit 1;; 119 +esac 120 + 121 +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). 122 +# Here we must recognize all the valid KERNEL-OS combinations. 123 +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` 124 +case $maybe_os in 125 + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ 126 + linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ 127 + knetbsd*-gnu* | netbsd*-gnu* | \ 128 + kopensolaris*-gnu* | \ 129 + storm-chaos* | os2-emx* | rtmk-nova*) 130 + os=-$maybe_os 131 + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` 132 + ;; 133 + android-linux) 134 + os=-linux-android 135 + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown 136 + ;; 137 + *) 138 + basic_machine=`echo $1 | sed 's/-[^-]*$//'` 139 + if [ $basic_machine != $1 ] 140 + then os=`echo $1 | sed 's/.*-/-/'` 141 + else os=; fi 142 + ;; 143 +esac 144 + 145 +### Let's recognize common machines as not being operating systems so 146 +### that things like config.sub decstation-3100 work. We also 147 +### recognize some manufacturers as not being operating systems, so we 148 +### can provide default operating systems below. 149 +case $os in 150 + -sun*os*) 151 + # Prevent following clause from handling this invalid input. 152 + ;; 153 + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ 154 + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ 155 + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ 156 + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ 157 + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ 158 + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ 159 + -apple | -axis | -knuth | -cray | -microblaze) 160 + os= 161 + basic_machine=$1 162 + ;; 163 + -bluegene*) 164 + os=-cnk 165 + ;; 166 + -sim | -cisco | -oki | -wec | -winbond) 167 + os= 168 + basic_machine=$1 169 + ;; 170 + -scout) 171 + ;; 172 + -wrs) 173 + os=-vxworks 174 + basic_machine=$1 175 + ;; 176 + -chorusos*) 177 + os=-chorusos 178 + basic_machine=$1 179 + ;; 180 + -chorusrdb) 181 + os=-chorusrdb 182 + basic_machine=$1 183 + ;; 184 + -hiux*) 185 + os=-hiuxwe2 186 + ;; 187 + -sco6) 188 + os=-sco5v6 189 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 190 + ;; 191 + -sco5) 192 + os=-sco3.2v5 193 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 194 + ;; 195 + -sco4) 196 + os=-sco3.2v4 197 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 198 + ;; 199 + -sco3.2.[4-9]*) 200 + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` 201 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 202 + ;; 203 + -sco3.2v[4-9]*) 204 + # Don't forget version if it is 3.2v4 or newer. 205 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 206 + ;; 207 + -sco5v6*) 208 + # Don't forget version if it is 3.2v4 or newer. 209 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 210 + ;; 211 + -sco*) 212 + os=-sco3.2v2 213 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 214 + ;; 215 + -udk*) 216 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 217 + ;; 218 + -isc) 219 + os=-isc2.2 220 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 221 + ;; 222 + -clix*) 223 + basic_machine=clipper-intergraph 224 + ;; 225 + -isc*) 226 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 227 + ;; 228 + -lynx*) 229 + os=-lynxos 230 + ;; 231 + -ptx*) 232 + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` 233 + ;; 234 + -windowsnt*) 235 + os=`echo $os | sed -e 's/windowsnt/winnt/'` 236 + ;; 237 + -psos*) 238 + os=-psos 239 + ;; 240 + -mint | -mint[0-9]*) 241 + basic_machine=m68k-atari 242 + os=-mint 243 + ;; 244 +esac 245 + 246 +# Decode aliases for certain CPU-COMPANY combinations. 247 +case $basic_machine in 248 + # Recognize the basic CPU types without company name. 249 + # Some are omitted here because they have special meanings below. 250 + 1750a | 580 \ 251 + | a29k \ 252 + | aarch64 | aarch64_be \ 253 + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ 254 + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ 255 + | am33_2.0 \ 256 + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ 257 + | be32 | be64 \ 258 + | bfin \ 259 + | c4x | clipper \ 260 + | d10v | d30v | dlx | dsp16xx \ 261 + | epiphany \ 262 + | fido | fr30 | frv \ 263 + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ 264 + | hexagon \ 265 + | i370 | i860 | i960 | ia64 \ 266 + | ip2k | iq2000 \ 267 + | le32 | le64 \ 268 + | lm32 \ 269 + | m32c | m32r | m32rle | m68000 | m68k | m88k \ 270 + | maxq | mb | microblaze | mcore | mep | metag \ 271 + | mips | mipsbe | mipseb | mipsel | mipsle \ 272 + | mips16 \ 273 + | mips64 | mips64el \ 274 + | mips64octeon | mips64octeonel \ 275 + | mips64orion | mips64orionel \ 276 + | mips64r5900 | mips64r5900el \ 277 + | mips64vr | mips64vrel \ 278 + | mips64vr4100 | mips64vr4100el \ 279 + | mips64vr4300 | mips64vr4300el \ 280 + | mips64vr5000 | mips64vr5000el \ 281 + | mips64vr5900 | mips64vr5900el \ 282 + | mipsisa32 | mipsisa32el \ 283 + | mipsisa32r2 | mipsisa32r2el \ 284 + | mipsisa64 | mipsisa64el \ 285 + | mipsisa64r2 | mipsisa64r2el \ 286 + | mipsisa64sb1 | mipsisa64sb1el \ 287 + | mipsisa64sr71k | mipsisa64sr71kel \ 288 + | mipstx39 | mipstx39el \ 289 + | mn10200 | mn10300 \ 290 + | moxie \ 291 + | mt \ 292 + | msp430 \ 293 + | nds32 | nds32le | nds32be \ 294 + | nios | nios2 \ 295 + | ns16k | ns32k \ 296 + | open8 \ 297 + | or32 \ 298 + | pdp10 | pdp11 | pj | pjl \ 299 + | powerpc | powerpc64 | powerpc64le | powerpcle \ 300 + | pyramid \ 301 + | rl78 | rx \ 302 + | score \ 303 + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ 304 + | sh64 | sh64le \ 305 + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ 306 + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ 307 + | spu \ 308 + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ 309 + | ubicom32 \ 310 + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ 311 + | we32k \ 312 + | x86 | xc16x | xstormy16 | xtensa \ 313 + | z8k | z80) 314 + basic_machine=$basic_machine-unknown 315 + ;; 316 + c54x) 317 + basic_machine=tic54x-unknown 318 + ;; 319 + c55x) 320 + basic_machine=tic55x-unknown 321 + ;; 322 + c6x) 323 + basic_machine=tic6x-unknown 324 + ;; 325 + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) 326 + basic_machine=$basic_machine-unknown 327 + os=-none 328 + ;; 329 + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) 330 + ;; 331 + ms1) 332 + basic_machine=mt-unknown 333 + ;; 334 + 335 + strongarm | thumb | xscale) 336 + basic_machine=arm-unknown 337 + ;; 338 + xgate) 339 + basic_machine=$basic_machine-unknown 340 + os=-none 341 + ;; 342 + xscaleeb) 343 + basic_machine=armeb-unknown 344 + ;; 345 + 346 + xscaleel) 347 + basic_machine=armel-unknown 348 + ;; 349 + 350 + # We use `pc' rather than `unknown' 351 + # because (1) that's what they normally are, and 352 + # (2) the word "unknown" tends to confuse beginning users. 353 + i*86 | x86_64) 354 + basic_machine=$basic_machine-pc 355 + ;; 356 + # Object if more than one company name word. 357 + *-*-*) 358 + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 359 + exit 1 360 + ;; 361 + # Recognize the basic CPU types with company name. 362 + 580-* \ 363 + | a29k-* \ 364 + | aarch64-* | aarch64_be-* \ 365 + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ 366 + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ 367 + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ 368 + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ 369 + | avr-* | avr32-* \ 370 + | be32-* | be64-* \ 371 + | bfin-* | bs2000-* \ 372 + | c[123]* | c30-* | [cjt]90-* | c4x-* \ 373 + | clipper-* | craynv-* | cydra-* \ 374 + | d10v-* | d30v-* | dlx-* \ 375 + | elxsi-* \ 376 + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ 377 + | h8300-* | h8500-* \ 378 + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ 379 + | hexagon-* \ 380 + | i*86-* | i860-* | i960-* | ia64-* \ 381 + | ip2k-* | iq2000-* \ 382 + | le32-* | le64-* \ 383 + | lm32-* \ 384 + | m32c-* | m32r-* | m32rle-* \ 385 + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ 386 + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ 387 + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ 388 + | mips16-* \ 389 + | mips64-* | mips64el-* \ 390 + | mips64octeon-* | mips64octeonel-* \ 391 + | mips64orion-* | mips64orionel-* \ 392 + | mips64r5900-* | mips64r5900el-* \ 393 + | mips64vr-* | mips64vrel-* \ 394 + | mips64vr4100-* | mips64vr4100el-* \ 395 + | mips64vr4300-* | mips64vr4300el-* \ 396 + | mips64vr5000-* | mips64vr5000el-* \ 397 + | mips64vr5900-* | mips64vr5900el-* \ 398 + | mipsisa32-* | mipsisa32el-* \ 399 + | mipsisa32r2-* | mipsisa32r2el-* \ 400 + | mipsisa64-* | mipsisa64el-* \ 401 + | mipsisa64r2-* | mipsisa64r2el-* \ 402 + | mipsisa64sb1-* | mipsisa64sb1el-* \ 403 + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ 404 + | mipstx39-* | mipstx39el-* \ 405 + | mmix-* \ 406 + | mt-* \ 407 + | msp430-* \ 408 + | nds32-* | nds32le-* | nds32be-* \ 409 + | nios-* | nios2-* \ 410 + | none-* | np1-* | ns16k-* | ns32k-* \ 411 + | open8-* \ 412 + | orion-* \ 413 + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ 414 + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ 415 + | pyramid-* \ 416 + | rl78-* | romp-* | rs6000-* | rx-* \ 417 + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ 418 + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ 419 + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ 420 + | sparclite-* \ 421 + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ 422 + | tahoe-* \ 423 + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ 424 + | tile*-* \ 425 + | tron-* \ 426 + | ubicom32-* \ 427 + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ 428 + | vax-* \ 429 + | we32k-* \ 430 + | x86-* | x86_64-* | xc16x-* | xps100-* \ 431 + | xstormy16-* | xtensa*-* \ 432 + | ymp-* \ 433 + | z8k-* | z80-*) 434 + ;; 435 + # Recognize the basic CPU types without company name, with glob match. 436 + xtensa*) 437 + basic_machine=$basic_machine-unknown 438 + ;; 439 + # Recognize the various machine names and aliases which stand 440 + # for a CPU type and a company and sometimes even an OS. 441 + 386bsd) 442 + basic_machine=i386-unknown 443 + os=-bsd 444 + ;; 445 + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) 446 + basic_machine=m68000-att 447 + ;; 448 + 3b*) 449 + basic_machine=we32k-att 450 + ;; 451 + a29khif) 452 + basic_machine=a29k-amd 453 + os=-udi 454 + ;; 455 + abacus) 456 + basic_machine=abacus-unknown 457 + ;; 458 + adobe68k) 459 + basic_machine=m68010-adobe 460 + os=-scout 461 + ;; 462 + alliant | fx80) 463 + basic_machine=fx80-alliant 464 + ;; 465 + altos | altos3068) 466 + basic_machine=m68k-altos 467 + ;; 468 + am29k) 469 + basic_machine=a29k-none 470 + os=-bsd 471 + ;; 472 + amd64) 473 + basic_machine=x86_64-pc 474 + ;; 475 + amd64-*) 476 + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` 477 + ;; 478 + amdahl) 479 + basic_machine=580-amdahl 480 + os=-sysv 481 + ;; 482 + amiga | amiga-*) 483 + basic_machine=m68k-unknown 484 + ;; 485 + amigaos | amigados) 486 + basic_machine=m68k-unknown 487 + os=-amigaos 488 + ;; 489 + amigaunix | amix) 490 + basic_machine=m68k-unknown 491 + os=-sysv4 492 + ;; 493 + apollo68) 494 + basic_machine=m68k-apollo 495 + os=-sysv 496 + ;; 497 + apollo68bsd) 498 + basic_machine=m68k-apollo 499 + os=-bsd 500 + ;; 501 + aros) 502 + basic_machine=i386-pc 503 + os=-aros 504 + ;; 505 + aux) 506 + basic_machine=m68k-apple 507 + os=-aux 508 + ;; 509 + balance) 510 + basic_machine=ns32k-sequent 511 + os=-dynix 512 + ;; 513 + blackfin) 514 + basic_machine=bfin-unknown 515 + os=-linux 516 + ;; 517 + blackfin-*) 518 + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` 519 + os=-linux 520 + ;; 521 + bluegene*) 522 + basic_machine=powerpc-ibm 523 + os=-cnk 524 + ;; 525 + c54x-*) 526 + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` 527 + ;; 528 + c55x-*) 529 + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` 530 + ;; 531 + c6x-*) 532 + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` 533 + ;; 534 + c90) 535 + basic_machine=c90-cray 536 + os=-unicos 537 + ;; 538 + cegcc) 539 + basic_machine=arm-unknown 540 + os=-cegcc 541 + ;; 542 + convex-c1) 543 + basic_machine=c1-convex 544 + os=-bsd 545 + ;; 546 + convex-c2) 547 + basic_machine=c2-convex 548 + os=-bsd 549 + ;; 550 + convex-c32) 551 + basic_machine=c32-convex 552 + os=-bsd 553 + ;; 554 + convex-c34) 555 + basic_machine=c34-convex 556 + os=-bsd 557 + ;; 558 + convex-c38) 559 + basic_machine=c38-convex 560 + os=-bsd 561 + ;; 562 + cray | j90) 563 + basic_machine=j90-cray 564 + os=-unicos 565 + ;; 566 + craynv) 567 + basic_machine=craynv-cray 568 + os=-unicosmp 569 + ;; 570 + cr16 | cr16-*) 571 + basic_machine=cr16-unknown 572 + os=-elf 573 + ;; 574 + crds | unos) 575 + basic_machine=m68k-crds 576 + ;; 577 + crisv32 | crisv32-* | etraxfs*) 578 + basic_machine=crisv32-axis 579 + ;; 580 + cris | cris-* | etrax*) 581 + basic_machine=cris-axis 582 + ;; 583 + crx) 584 + basic_machine=crx-unknown 585 + os=-elf 586 + ;; 587 + da30 | da30-*) 588 + basic_machine=m68k-da30 589 + ;; 590 + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) 591 + basic_machine=mips-dec 592 + ;; 593 + decsystem10* | dec10*) 594 + basic_machine=pdp10-dec 595 + os=-tops10 596 + ;; 597 + decsystem20* | dec20*) 598 + basic_machine=pdp10-dec 599 + os=-tops20 600 + ;; 601 + delta | 3300 | motorola-3300 | motorola-delta \ 602 + | 3300-motorola | delta-motorola) 603 + basic_machine=m68k-motorola 604 + ;; 605 + delta88) 606 + basic_machine=m88k-motorola 607 + os=-sysv3 608 + ;; 609 + dicos) 610 + basic_machine=i686-pc 611 + os=-dicos 612 + ;; 613 + djgpp) 614 + basic_machine=i586-pc 615 + os=-msdosdjgpp 616 + ;; 617 + dpx20 | dpx20-*) 618 + basic_machine=rs6000-bull 619 + os=-bosx 620 + ;; 621 + dpx2* | dpx2*-bull) 622 + basic_machine=m68k-bull 623 + os=-sysv3 624 + ;; 625 + ebmon29k) 626 + basic_machine=a29k-amd 627 + os=-ebmon 628 + ;; 629 + elxsi) 630 + basic_machine=elxsi-elxsi 631 + os=-bsd 632 + ;; 633 + encore | umax | mmax) 634 + basic_machine=ns32k-encore 635 + ;; 636 + es1800 | OSE68k | ose68k | ose | OSE) 637 + basic_machine=m68k-ericsson 638 + os=-ose 639 + ;; 640 + fx2800) 641 + basic_machine=i860-alliant 642 + ;; 643 + genix) 644 + basic_machine=ns32k-ns 645 + ;; 646 + gmicro) 647 + basic_machine=tron-gmicro 648 + os=-sysv 649 + ;; 650 + go32) 651 + basic_machine=i386-pc 652 + os=-go32 653 + ;; 654 + h3050r* | hiux*) 655 + basic_machine=hppa1.1-hitachi 656 + os=-hiuxwe2 657 + ;; 658 + h8300hms) 659 + basic_machine=h8300-hitachi 660 + os=-hms 661 + ;; 662 + h8300xray) 663 + basic_machine=h8300-hitachi 664 + os=-xray 665 + ;; 666 + h8500hms) 667 + basic_machine=h8500-hitachi 668 + os=-hms 669 + ;; 670 + harris) 671 + basic_machine=m88k-harris 672 + os=-sysv3 673 + ;; 674 + hp300-*) 675 + basic_machine=m68k-hp 676 + ;; 677 + hp300bsd) 678 + basic_machine=m68k-hp 679 + os=-bsd 680 + ;; 681 + hp300hpux) 682 + basic_machine=m68k-hp 683 + os=-hpux 684 + ;; 685 + hp3k9[0-9][0-9] | hp9[0-9][0-9]) 686 + basic_machine=hppa1.0-hp 687 + ;; 688 + hp9k2[0-9][0-9] | hp9k31[0-9]) 689 + basic_machine=m68000-hp 690 + ;; 691 + hp9k3[2-9][0-9]) 692 + basic_machine=m68k-hp 693 + ;; 694 + hp9k6[0-9][0-9] | hp6[0-9][0-9]) 695 + basic_machine=hppa1.0-hp 696 + ;; 697 + hp9k7[0-79][0-9] | hp7[0-79][0-9]) 698 + basic_machine=hppa1.1-hp 699 + ;; 700 + hp9k78[0-9] | hp78[0-9]) 701 + # FIXME: really hppa2.0-hp 702 + basic_machine=hppa1.1-hp 703 + ;; 704 + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) 705 + # FIXME: really hppa2.0-hp 706 + basic_machine=hppa1.1-hp 707 + ;; 708 + hp9k8[0-9][13679] | hp8[0-9][13679]) 709 + basic_machine=hppa1.1-hp 710 + ;; 711 + hp9k8[0-9][0-9] | hp8[0-9][0-9]) 712 + basic_machine=hppa1.0-hp 713 + ;; 714 + hppa-next) 715 + os=-nextstep3 716 + ;; 717 + hppaosf) 718 + basic_machine=hppa1.1-hp 719 + os=-osf 720 + ;; 721 + hppro) 722 + basic_machine=hppa1.1-hp 723 + os=-proelf 724 + ;; 725 + i370-ibm* | ibm*) 726 + basic_machine=i370-ibm 727 + ;; 728 + i*86v32) 729 + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` 730 + os=-sysv32 731 + ;; 732 + i*86v4*) 733 + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` 734 + os=-sysv4 735 + ;; 736 + i*86v) 737 + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` 738 + os=-sysv 739 + ;; 740 + i*86sol2) 741 + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` 742 + os=-solaris2 743 + ;; 744 + i386mach) 745 + basic_machine=i386-mach 746 + os=-mach 747 + ;; 748 + i386-vsta | vsta) 749 + basic_machine=i386-unknown 750 + os=-vsta 751 + ;; 752 + iris | iris4d) 753 + basic_machine=mips-sgi 754 + case $os in 755 + -irix*) 756 + ;; 757 + *) 758 + os=-irix4 759 + ;; 760 + esac 761 + ;; 762 + isi68 | isi) 763 + basic_machine=m68k-isi 764 + os=-sysv 765 + ;; 766 + m68knommu) 767 + basic_machine=m68k-unknown 768 + os=-linux 769 + ;; 770 + m68knommu-*) 771 + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` 772 + os=-linux 773 + ;; 774 + m88k-omron*) 775 + basic_machine=m88k-omron 776 + ;; 777 + magnum | m3230) 778 + basic_machine=mips-mips 779 + os=-sysv 780 + ;; 781 + merlin) 782 + basic_machine=ns32k-utek 783 + os=-sysv 784 + ;; 785 + microblaze) 786 + basic_machine=microblaze-xilinx 787 + ;; 788 + mingw32) 789 + basic_machine=i386-pc 790 + os=-mingw32 791 + ;; 792 + mingw32ce) 793 + basic_machine=arm-unknown 794 + os=-mingw32ce 795 + ;; 796 + miniframe) 797 + basic_machine=m68000-convergent 798 + ;; 799 + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) 800 + basic_machine=m68k-atari 801 + os=-mint 802 + ;; 803 + mips3*-*) 804 + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` 805 + ;; 806 + mips3*) 807 + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown 808 + ;; 809 + monitor) 810 + basic_machine=m68k-rom68k 811 + os=-coff 812 + ;; 813 + morphos) 814 + basic_machine=powerpc-unknown 815 + os=-morphos 816 + ;; 817 + msdos) 818 + basic_machine=i386-pc 819 + os=-msdos 820 + ;; 821 + ms1-*) 822 + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` 823 + ;; 824 + msys) 825 + basic_machine=i386-pc 826 + os=-msys 827 + ;; 828 + mvs) 829 + basic_machine=i370-ibm 830 + os=-mvs 831 + ;; 832 + nacl) 833 + basic_machine=le32-unknown 834 + os=-nacl 835 + ;; 836 + ncr3000) 837 + basic_machine=i486-ncr 838 + os=-sysv4 839 + ;; 840 + netbsd386) 841 + basic_machine=i386-unknown 842 + os=-netbsd 843 + ;; 844 + netwinder) 845 + basic_machine=armv4l-rebel 846 + os=-linux 847 + ;; 848 + news | news700 | news800 | news900) 849 + basic_machine=m68k-sony 850 + os=-newsos 851 + ;; 852 + news1000) 853 + basic_machine=m68030-sony 854 + os=-newsos 855 + ;; 856 + news-3600 | risc-news) 857 + basic_machine=mips-sony 858 + os=-newsos 859 + ;; 860 + necv70) 861 + basic_machine=v70-nec 862 + os=-sysv 863 + ;; 864 + next | m*-next ) 865 + basic_machine=m68k-next 866 + case $os in 867 + -nextstep* ) 868 + ;; 869 + -ns2*) 870 + os=-nextstep2 871 + ;; 872 + *) 873 + os=-nextstep3 874 + ;; 875 + esac 876 + ;; 877 + nh3000) 878 + basic_machine=m68k-harris 879 + os=-cxux 880 + ;; 881 + nh[45]000) 882 + basic_machine=m88k-harris 883 + os=-cxux 884 + ;; 885 + nindy960) 886 + basic_machine=i960-intel 887 + os=-nindy 888 + ;; 889 + mon960) 890 + basic_machine=i960-intel 891 + os=-mon960 892 + ;; 893 + nonstopux) 894 + basic_machine=mips-compaq 895 + os=-nonstopux 896 + ;; 897 + np1) 898 + basic_machine=np1-gould 899 + ;; 900 + neo-tandem) 901 + basic_machine=neo-tandem 902 + ;; 903 + nse-tandem) 904 + basic_machine=nse-tandem 905 + ;; 906 + nsr-tandem) 907 + basic_machine=nsr-tandem 908 + ;; 909 + op50n-* | op60c-*) 910 + basic_machine=hppa1.1-oki 911 + os=-proelf 912 + ;; 913 + openrisc | openrisc-*) 914 + basic_machine=or32-unknown 915 + ;; 916 + os400) 917 + basic_machine=powerpc-ibm 918 + os=-os400 919 + ;; 920 + OSE68000 | ose68000) 921 + basic_machine=m68000-ericsson 922 + os=-ose 923 + ;; 924 + os68k) 925 + basic_machine=m68k-none 926 + os=-os68k 927 + ;; 928 + pa-hitachi) 929 + basic_machine=hppa1.1-hitachi 930 + os=-hiuxwe2 931 + ;; 932 + paragon) 933 + basic_machine=i860-intel 934 + os=-osf 935 + ;; 936 + parisc) 937 + basic_machine=hppa-unknown 938 + os=-linux 939 + ;; 940 + parisc-*) 941 + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` 942 + os=-linux 943 + ;; 944 + pbd) 945 + basic_machine=sparc-tti 946 + ;; 947 + pbb) 948 + basic_machine=m68k-tti 949 + ;; 950 + pc532 | pc532-*) 951 + basic_machine=ns32k-pc532 952 + ;; 953 + pc98) 954 + basic_machine=i386-pc 955 + ;; 956 + pc98-*) 957 + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` 958 + ;; 959 + pentium | p5 | k5 | k6 | nexgen | viac3) 960 + basic_machine=i586-pc 961 + ;; 962 + pentiumpro | p6 | 6x86 | athlon | athlon_*) 963 + basic_machine=i686-pc 964 + ;; 965 + pentiumii | pentium2 | pentiumiii | pentium3) 966 + basic_machine=i686-pc 967 + ;; 968 + pentium4) 969 + basic_machine=i786-pc 970 + ;; 971 + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) 972 + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` 973 + ;; 974 + pentiumpro-* | p6-* | 6x86-* | athlon-*) 975 + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` 976 + ;; 977 + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) 978 + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` 979 + ;; 980 + pentium4-*) 981 + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` 982 + ;; 983 + pn) 984 + basic_machine=pn-gould 985 + ;; 986 + power) basic_machine=power-ibm 987 + ;; 988 + ppc | ppcbe) basic_machine=powerpc-unknown 989 + ;; 990 + ppc-* | ppcbe-*) 991 + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` 992 + ;; 993 + ppcle | powerpclittle | ppc-le | powerpc-little) 994 + basic_machine=powerpcle-unknown 995 + ;; 996 + ppcle-* | powerpclittle-*) 997 + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` 998 + ;; 999 + ppc64) basic_machine=powerpc64-unknown 1000 + ;; 1001 + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` 1002 + ;; 1003 + ppc64le | powerpc64little | ppc64-le | powerpc64-little) 1004 + basic_machine=powerpc64le-unknown 1005 + ;; 1006 + ppc64le-* | powerpc64little-*) 1007 + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` 1008 + ;; 1009 + ps2) 1010 + basic_machine=i386-ibm 1011 + ;; 1012 + pw32) 1013 + basic_machine=i586-unknown 1014 + os=-pw32 1015 + ;; 1016 + rdos) 1017 + basic_machine=i386-pc 1018 + os=-rdos 1019 + ;; 1020 + rom68k) 1021 + basic_machine=m68k-rom68k 1022 + os=-coff 1023 + ;; 1024 + rm[46]00) 1025 + basic_machine=mips-siemens 1026 + ;; 1027 + rtpc | rtpc-*) 1028 + basic_machine=romp-ibm 1029 + ;; 1030 + s390 | s390-*) 1031 + basic_machine=s390-ibm 1032 + ;; 1033 + s390x | s390x-*) 1034 + basic_machine=s390x-ibm 1035 + ;; 1036 + sa29200) 1037 + basic_machine=a29k-amd 1038 + os=-udi 1039 + ;; 1040 + sb1) 1041 + basic_machine=mipsisa64sb1-unknown 1042 + ;; 1043 + sb1el) 1044 + basic_machine=mipsisa64sb1el-unknown 1045 + ;; 1046 + sde) 1047 + basic_machine=mipsisa32-sde 1048 + os=-elf 1049 + ;; 1050 + sei) 1051 + basic_machine=mips-sei 1052 + os=-seiux 1053 + ;; 1054 + sequent) 1055 + basic_machine=i386-sequent 1056 + ;; 1057 + sh) 1058 + basic_machine=sh-hitachi 1059 + os=-hms 1060 + ;; 1061 + sh5el) 1062 + basic_machine=sh5le-unknown 1063 + ;; 1064 + sh64) 1065 + basic_machine=sh64-unknown 1066 + ;; 1067 + sparclite-wrs | simso-wrs) 1068 + basic_machine=sparclite-wrs 1069 + os=-vxworks 1070 + ;; 1071 + sps7) 1072 + basic_machine=m68k-bull 1073 + os=-sysv2 1074 + ;; 1075 + spur) 1076 + basic_machine=spur-unknown 1077 + ;; 1078 + st2000) 1079 + basic_machine=m68k-tandem 1080 + ;; 1081 + stratus) 1082 + basic_machine=i860-stratus 1083 + os=-sysv4 1084 + ;; 1085 + strongarm-* | thumb-*) 1086 + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` 1087 + ;; 1088 + sun2) 1089 + basic_machine=m68000-sun 1090 + ;; 1091 + sun2os3) 1092 + basic_machine=m68000-sun 1093 + os=-sunos3 1094 + ;; 1095 + sun2os4) 1096 + basic_machine=m68000-sun 1097 + os=-sunos4 1098 + ;; 1099 + sun3os3) 1100 + basic_machine=m68k-sun 1101 + os=-sunos3 1102 + ;; 1103 + sun3os4) 1104 + basic_machine=m68k-sun 1105 + os=-sunos4 1106 + ;; 1107 + sun4os3) 1108 + basic_machine=sparc-sun 1109 + os=-sunos3 1110 + ;; 1111 + sun4os4) 1112 + basic_machine=sparc-sun 1113 + os=-sunos4 1114 + ;; 1115 + sun4sol2) 1116 + basic_machine=sparc-sun 1117 + os=-solaris2 1118 + ;; 1119 + sun3 | sun3-*) 1120 + basic_machine=m68k-sun 1121 + ;; 1122 + sun4) 1123 + basic_machine=sparc-sun 1124 + ;; 1125 + sun386 | sun386i | roadrunner) 1126 + basic_machine=i386-sun 1127 + ;; 1128 + sv1) 1129 + basic_machine=sv1-cray 1130 + os=-unicos 1131 + ;; 1132 + symmetry) 1133 + basic_machine=i386-sequent 1134 + os=-dynix 1135 + ;; 1136 + t3e) 1137 + basic_machine=alphaev5-cray 1138 + os=-unicos 1139 + ;; 1140 + t90) 1141 + basic_machine=t90-cray 1142 + os=-unicos 1143 + ;; 1144 + tile*) 1145 + basic_machine=$basic_machine-unknown 1146 + os=-linux-gnu 1147 + ;; 1148 + tx39) 1149 + basic_machine=mipstx39-unknown 1150 + ;; 1151 + tx39el) 1152 + basic_machine=mipstx39el-unknown 1153 + ;; 1154 + toad1) 1155 + basic_machine=pdp10-xkl 1156 + os=-tops20 1157 + ;; 1158 + tower | tower-32) 1159 + basic_machine=m68k-ncr 1160 + ;; 1161 + tpf) 1162 + basic_machine=s390x-ibm 1163 + os=-tpf 1164 + ;; 1165 + udi29k) 1166 + basic_machine=a29k-amd 1167 + os=-udi 1168 + ;; 1169 + ultra3) 1170 + basic_machine=a29k-nyu 1171 + os=-sym1 1172 + ;; 1173 + v810 | necv810) 1174 + basic_machine=v810-nec 1175 + os=-none 1176 + ;; 1177 + vaxv) 1178 + basic_machine=vax-dec 1179 + os=-sysv 1180 + ;; 1181 + vms) 1182 + basic_machine=vax-dec 1183 + os=-vms 1184 + ;; 1185 + vpp*|vx|vx-*) 1186 + basic_machine=f301-fujitsu 1187 + ;; 1188 + vxworks960) 1189 + basic_machine=i960-wrs 1190 + os=-vxworks 1191 + ;; 1192 + vxworks68) 1193 + basic_machine=m68k-wrs 1194 + os=-vxworks 1195 + ;; 1196 + vxworks29k) 1197 + basic_machine=a29k-wrs 1198 + os=-vxworks 1199 + ;; 1200 + w65*) 1201 + basic_machine=w65-wdc 1202 + os=-none 1203 + ;; 1204 + w89k-*) 1205 + basic_machine=hppa1.1-winbond 1206 + os=-proelf 1207 + ;; 1208 + xbox) 1209 + basic_machine=i686-pc 1210 + os=-mingw32 1211 + ;; 1212 + xps | xps100) 1213 + basic_machine=xps100-honeywell 1214 + ;; 1215 + xscale-* | xscalee[bl]-*) 1216 + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` 1217 + ;; 1218 + ymp) 1219 + basic_machine=ymp-cray 1220 + os=-unicos 1221 + ;; 1222 + z8k-*-coff) 1223 + basic_machine=z8k-unknown 1224 + os=-sim 1225 + ;; 1226 + z80-*-coff) 1227 + basic_machine=z80-unknown 1228 + os=-sim 1229 + ;; 1230 + none) 1231 + basic_machine=none-none 1232 + os=-none 1233 + ;; 1234 + 1235 +# Here we handle the default manufacturer of certain CPU types. It is in 1236 +# some cases the only manufacturer, in others, it is the most popular. 1237 + w89k) 1238 + basic_machine=hppa1.1-winbond 1239 + ;; 1240 + op50n) 1241 + basic_machine=hppa1.1-oki 1242 + ;; 1243 + op60c) 1244 + basic_machine=hppa1.1-oki 1245 + ;; 1246 + romp) 1247 + basic_machine=romp-ibm 1248 + ;; 1249 + mmix) 1250 + basic_machine=mmix-knuth 1251 + ;; 1252 + rs6000) 1253 + basic_machine=rs6000-ibm 1254 + ;; 1255 + vax) 1256 + basic_machine=vax-dec 1257 + ;; 1258 + pdp10) 1259 + # there are many clones, so DEC is not a safe bet 1260 + basic_machine=pdp10-unknown 1261 + ;; 1262 + pdp11) 1263 + basic_machine=pdp11-dec 1264 + ;; 1265 + we32k) 1266 + basic_machine=we32k-att 1267 + ;; 1268 + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) 1269 + basic_machine=sh-unknown 1270 + ;; 1271 + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) 1272 + basic_machine=sparc-sun 1273 + ;; 1274 + cydra) 1275 + basic_machine=cydra-cydrome 1276 + ;; 1277 + orion) 1278 + basic_machine=orion-highlevel 1279 + ;; 1280 + orion105) 1281 + basic_machine=clipper-highlevel 1282 + ;; 1283 + mac | mpw | mac-mpw) 1284 + basic_machine=m68k-apple 1285 + ;; 1286 + pmac | pmac-mpw) 1287 + basic_machine=powerpc-apple 1288 + ;; 1289 + *-unknown) 1290 + # Make sure to match an already-canonicalized machine name. 1291 + ;; 1292 + *) 1293 + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 1294 + exit 1 1295 + ;; 1296 +esac 1297 + 1298 +# Here we canonicalize certain aliases for manufacturers. 1299 +case $basic_machine in 1300 + *-digital*) 1301 + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` 1302 + ;; 1303 + *-commodore*) 1304 + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` 1305 + ;; 1306 + *) 1307 + ;; 1308 +esac 1309 + 1310 +# Decode manufacturer-specific aliases for certain operating systems. 1311 + 1312 +if [ x"$os" != x"" ] 1313 +then 1314 +case $os in 1315 + # First match some system type aliases 1316 + # that might get confused with valid system types. 1317 + # -solaris* is a basic system type, with this one exception. 1318 + -auroraux) 1319 + os=-auroraux 1320 + ;; 1321 + -solaris1 | -solaris1.*) 1322 + os=`echo $os | sed -e 's|solaris1|sunos4|'` 1323 + ;; 1324 + -solaris) 1325 + os=-solaris2 1326 + ;; 1327 + -svr4*) 1328 + os=-sysv4 1329 + ;; 1330 + -unixware*) 1331 + os=-sysv4.2uw 1332 + ;; 1333 + -gnu/linux*) 1334 + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` 1335 + ;; 1336 + # First accept the basic system types. 1337 + # The portable systems comes first. 1338 + # Each alternative MUST END IN A *, to match a version number. 1339 + # -sysv* is not here because it comes later, after sysvr4. 1340 + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ 1341 + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ 1342 + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ 1343 + | -sym* | -kopensolaris* \ 1344 + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ 1345 + | -aos* | -aros* \ 1346 + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ 1347 + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ 1348 + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ 1349 + | -openbsd* | -solidbsd* \ 1350 + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ 1351 + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ 1352 + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ 1353 + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ 1354 + | -chorusos* | -chorusrdb* | -cegcc* \ 1355 + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ 1356 + | -mingw32* | -linux-gnu* | -linux-android* \ 1357 + | -linux-newlib* | -linux-uclibc* \ 1358 + | -uxpv* | -beos* | -mpeix* | -udk* \ 1359 + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ 1360 + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ 1361 + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ 1362 + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ 1363 + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ 1364 + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ 1365 + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) 1366 + # Remember, each alternative MUST END IN *, to match a version number. 1367 + ;; 1368 + -qnx*) 1369 + case $basic_machine in 1370 + x86-* | i*86-*) 1371 + ;; 1372 + *) 1373 + os=-nto$os 1374 + ;; 1375 + esac 1376 + ;; 1377 + -nto-qnx*) 1378 + ;; 1379 + -nto*) 1380 + os=`echo $os | sed -e 's|nto|nto-qnx|'` 1381 + ;; 1382 + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ 1383 + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ 1384 + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) 1385 + ;; 1386 + -mac*) 1387 + os=`echo $os | sed -e 's|mac|macos|'` 1388 + ;; 1389 + -linux-dietlibc) 1390 + os=-linux-dietlibc 1391 + ;; 1392 + -linux*) 1393 + os=`echo $os | sed -e 's|linux|linux-gnu|'` 1394 + ;; 1395 + -sunos5*) 1396 + os=`echo $os | sed -e 's|sunos5|solaris2|'` 1397 + ;; 1398 + -sunos6*) 1399 + os=`echo $os | sed -e 's|sunos6|solaris3|'` 1400 + ;; 1401 + -opened*) 1402 + os=-openedition 1403 + ;; 1404 + -os400*) 1405 + os=-os400 1406 + ;; 1407 + -wince*) 1408 + os=-wince 1409 + ;; 1410 + -osfrose*) 1411 + os=-osfrose 1412 + ;; 1413 + -osf*) 1414 + os=-osf 1415 + ;; 1416 + -utek*) 1417 + os=-bsd 1418 + ;; 1419 + -dynix*) 1420 + os=-bsd 1421 + ;; 1422 + -acis*) 1423 + os=-aos 1424 + ;; 1425 + -atheos*) 1426 + os=-atheos 1427 + ;; 1428 + -syllable*) 1429 + os=-syllable 1430 + ;; 1431 + -386bsd) 1432 + os=-bsd 1433 + ;; 1434 + -ctix* | -uts*) 1435 + os=-sysv 1436 + ;; 1437 + -nova*) 1438 + os=-rtmk-nova 1439 + ;; 1440 + -ns2 ) 1441 + os=-nextstep2 1442 + ;; 1443 + -nsk*) 1444 + os=-nsk 1445 + ;; 1446 + # Preserve the version number of sinix5. 1447 + -sinix5.*) 1448 + os=`echo $os | sed -e 's|sinix|sysv|'` 1449 + ;; 1450 + -sinix*) 1451 + os=-sysv4 1452 + ;; 1453 + -tpf*) 1454 + os=-tpf 1455 + ;; 1456 + -triton*) 1457 + os=-sysv3 1458 + ;; 1459 + -oss*) 1460 + os=-sysv3 1461 + ;; 1462 + -svr4) 1463 + os=-sysv4 1464 + ;; 1465 + -svr3) 1466 + os=-sysv3 1467 + ;; 1468 + -sysvr4) 1469 + os=-sysv4 1470 + ;; 1471 + # This must come after -sysvr4. 1472 + -sysv*) 1473 + ;; 1474 + -ose*) 1475 + os=-ose 1476 + ;; 1477 + -es1800*) 1478 + os=-ose 1479 + ;; 1480 + -xenix) 1481 + os=-xenix 1482 + ;; 1483 + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) 1484 + os=-mint 1485 + ;; 1486 + -aros*) 1487 + os=-aros 1488 + ;; 1489 + -kaos*) 1490 + os=-kaos 1491 + ;; 1492 + -zvmoe) 1493 + os=-zvmoe 1494 + ;; 1495 + -dicos*) 1496 + os=-dicos 1497 + ;; 1498 + -nacl*) 1499 + ;; 1500 + -none) 1501 + ;; 1502 + *) 1503 + # Get rid of the `-' at the beginning of $os. 1504 + os=`echo $os | sed 's/[^-]*-//'` 1505 + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 1506 + exit 1 1507 + ;; 1508 +esac 1509 +else 1510 + 1511 +# Here we handle the default operating systems that come with various machines. 1512 +# The value should be what the vendor currently ships out the door with their 1513 +# machine or put another way, the most popular os provided with the machine. 1514 + 1515 +# Note that if you're going to try to match "-MANUFACTURER" here (say, 1516 +# "-sun"), then you have to tell the case statement up towards the top 1517 +# that MANUFACTURER isn't an operating system. Otherwise, code above 1518 +# will signal an error saying that MANUFACTURER isn't an operating 1519 +# system, and we'll never get to this point. 1520 + 1521 +case $basic_machine in 1522 + score-*) 1523 + os=-elf 1524 + ;; 1525 + spu-*) 1526 + os=-elf 1527 + ;; 1528 + *-acorn) 1529 + os=-riscix1.2 1530 + ;; 1531 + arm*-rebel) 1532 + os=-linux 1533 + ;; 1534 + arm*-semi) 1535 + os=-aout 1536 + ;; 1537 + c4x-* | tic4x-*) 1538 + os=-coff 1539 + ;; 1540 + tic54x-*) 1541 + os=-coff 1542 + ;; 1543 + tic55x-*) 1544 + os=-coff 1545 + ;; 1546 + tic6x-*) 1547 + os=-coff 1548 + ;; 1549 + # This must come before the *-dec entry. 1550 + pdp10-*) 1551 + os=-tops20 1552 + ;; 1553 + pdp11-*) 1554 + os=-none 1555 + ;; 1556 + *-dec | vax-*) 1557 + os=-ultrix4.2 1558 + ;; 1559 + m68*-apollo) 1560 + os=-domain 1561 + ;; 1562 + i386-sun) 1563 + os=-sunos4.0.2 1564 + ;; 1565 + m68000-sun) 1566 + os=-sunos3 1567 + ;; 1568 + m68*-cisco) 1569 + os=-aout 1570 + ;; 1571 + mep-*) 1572 + os=-elf 1573 + ;; 1574 + mips*-cisco) 1575 + os=-elf 1576 + ;; 1577 + mips*-*) 1578 + os=-elf 1579 + ;; 1580 + or32-*) 1581 + os=-coff 1582 + ;; 1583 + *-tti) # must be before sparc entry or we get the wrong os. 1584 + os=-sysv3 1585 + ;; 1586 + sparc-* | *-sun) 1587 + os=-sunos4.1.1 1588 + ;; 1589 + *-be) 1590 + os=-beos 1591 + ;; 1592 + *-haiku) 1593 + os=-haiku 1594 + ;; 1595 + *-ibm) 1596 + os=-aix 1597 + ;; 1598 + *-knuth) 1599 + os=-mmixware 1600 + ;; 1601 + *-wec) 1602 + os=-proelf 1603 + ;; 1604 + *-winbond) 1605 + os=-proelf 1606 + ;; 1607 + *-oki) 1608 + os=-proelf 1609 + ;; 1610 + *-hp) 1611 + os=-hpux 1612 + ;; 1613 + *-hitachi) 1614 + os=-hiux 1615 + ;; 1616 + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) 1617 + os=-sysv 1618 + ;; 1619 + *-cbm) 1620 + os=-amigaos 1621 + ;; 1622 + *-dg) 1623 + os=-dgux 1624 + ;; 1625 + *-dolphin) 1626 + os=-sysv3 1627 + ;; 1628 + m68k-ccur) 1629 + os=-rtu 1630 + ;; 1631 + m88k-omron*) 1632 + os=-luna 1633 + ;; 1634 + *-next ) 1635 + os=-nextstep 1636 + ;; 1637 + *-sequent) 1638 + os=-ptx 1639 + ;; 1640 + *-crds) 1641 + os=-unos 1642 + ;; 1643 + *-ns) 1644 + os=-genix 1645 + ;; 1646 + i370-*) 1647 + os=-mvs 1648 + ;; 1649 + *-next) 1650 + os=-nextstep3 1651 + ;; 1652 + *-gould) 1653 + os=-sysv 1654 + ;; 1655 + *-highlevel) 1656 + os=-bsd 1657 + ;; 1658 + *-encore) 1659 + os=-bsd 1660 + ;; 1661 + *-sgi) 1662 + os=-irix 1663 + ;; 1664 + *-siemens) 1665 + os=-sysv4 1666 + ;; 1667 + *-masscomp) 1668 + os=-rtu 1669 + ;; 1670 + f30[01]-fujitsu | f700-fujitsu) 1671 + os=-uxpv 1672 + ;; 1673 + *-rom68k) 1674 + os=-coff 1675 + ;; 1676 + *-*bug) 1677 + os=-coff 1678 + ;; 1679 + *-apple) 1680 + os=-macos 1681 + ;; 1682 + *-atari*) 1683 + os=-mint 1684 + ;; 1685 + *) 1686 + os=-none 1687 + ;; 1688 +esac 1689 +fi 1690 + 1691 +# Here we handle the case where we know the os, and the CPU type, but not the 1692 +# manufacturer. We pick the logical manufacturer. 1693 +vendor=unknown 1694 +case $basic_machine in 1695 + *-unknown) 1696 + case $os in 1697 + -riscix*) 1698 + vendor=acorn 1699 + ;; 1700 + -sunos*) 1701 + vendor=sun 1702 + ;; 1703 + -cnk*|-aix*) 1704 + vendor=ibm 1705 + ;; 1706 + -beos*) 1707 + vendor=be 1708 + ;; 1709 + -hpux*) 1710 + vendor=hp 1711 + ;; 1712 + -mpeix*) 1713 + vendor=hp 1714 + ;; 1715 + -hiux*) 1716 + vendor=hitachi 1717 + ;; 1718 + -unos*) 1719 + vendor=crds 1720 + ;; 1721 + -dgux*) 1722 + vendor=dg 1723 + ;; 1724 + -luna*) 1725 + vendor=omron 1726 + ;; 1727 + -genix*) 1728 + vendor=ns 1729 + ;; 1730 + -mvs* | -opened*) 1731 + vendor=ibm 1732 + ;; 1733 + -os400*) 1734 + vendor=ibm 1735 + ;; 1736 + -ptx*) 1737 + vendor=sequent 1738 + ;; 1739 + -tpf*) 1740 + vendor=ibm 1741 + ;; 1742 + -vxsim* | -vxworks* | -windiss*) 1743 + vendor=wrs 1744 + ;; 1745 + -aux*) 1746 + vendor=apple 1747 + ;; 1748 + -hms*) 1749 + vendor=hitachi 1750 + ;; 1751 + -mpw* | -macos*) 1752 + vendor=apple 1753 + ;; 1754 + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) 1755 + vendor=atari 1756 + ;; 1757 + -vos*) 1758 + vendor=stratus 1759 + ;; 1760 + esac 1761 + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` 1762 + ;; 1763 +esac 1764 + 1765 +echo $basic_machine$os 1766 +exit 1767 + 1768 +# Local variables: 1769 +# eval: (add-hook 'write-file-hooks 'time-stamp) 1770 +# time-stamp-start: "timestamp='" 1771 +# time-stamp-format: "%:y-%02m-%02d" 1772 +# time-stamp-end: "'" 1773 +# End:
Added configure.
more than 10,000 changes
Added configure.ac.
1 +# -*- Autoconf -*- 2 +# Process this file with autoconf to produce a configure script. 3 + 4 +AC_PREREQ(2.61) 5 +AC_INIT(libgaiagraphics, 0.5, a.furieri @ lqt.it) 6 +AC_LANG(C) 7 +AC_CONFIG_AUX_DIR([.]) 8 +AC_CONFIG_MACRO_DIR([m4]) 9 + 10 +AM_INIT_AUTOMAKE 11 +AM_MAINTAINER_MODE 12 + 13 +# Checks for header files. 14 +AC_CHECK_HEADERS(stdlib.h,, [AC_MSG_ERROR([cannot find stdlib.h, bailing out])]) 15 +AC_CHECK_HEADERS(stdio.h,,[AC_MSG_ERROR([cannot find stdio.h, bailing out])]) 16 +AC_CHECK_HEADERS(string.h,, [AC_MSG_ERROR([cannot find string.h, bailing out])]) 17 +AC_CHECK_HEADERS(memory.h,, [AC_MSG_ERROR([cannot find memory.h, bailing out])]) 18 +AC_CHECK_HEADERS(math.h,,[AC_MSG_ERROR([cannot find math.h, bailing out])]) 19 +AC_CHECK_HEADERS(float.h,,[AC_MSG_ERROR([cannot find float.h, bailing out])]) 20 +AC_CHECK_HEADERS(fcntl.h,,[AC_MSG_ERROR([cannot find fcntl.h, bailing out])]) 21 +AC_CHECK_HEADERS(inttypes.h,, [AC_MSG_ERROR([cannot find inttypes.h, bailing out])]) 22 +AC_CHECK_HEADERS(stddef.h,, [AC_MSG_ERROR([cannot find stddef.h, bailing out])]) 23 +AC_CHECK_HEADERS(stdint.h,, [AC_MSG_ERROR([cannot find stdint.h, bailing out])]) 24 +AC_CHECK_HEADERS(sys/time.h,, [AC_MSG_ERROR([cannot find sys/time.h, bailing out])]) 25 +AC_CHECK_HEADERS(unistd.h,, [AC_MSG_ERROR([cannot find unistd.h, bailing out])]) 26 +AC_CHECK_HEADERS(jpeglib.h,, [AC_MSG_ERROR([cannot find jpeglib.h, bailing out])]) 27 +AC_CHECK_HEADERS(jerror.h,, [AC_MSG_ERROR([cannot find jerror.h, bailing out])]) 28 + 29 +# 30 +# testing GeoTiff headers 31 +# on some systems they are located on -/include 32 +# on other systems they are on -/include/geotiff 33 +# or even on -/include/libgeotiff 34 +# 35 +# this patch was kindly contributed by Brad Hards 36 +# 2011-09-02 37 +# 38 +AC_CHECK_HEADERS(geotiff/geotiff.h) 39 +AC_CHECK_HEADERS(libgeotiff/geotiff.h) 40 +AC_CHECK_HEADERS(geotiff.h) 41 +if test x"$ac_cv_header_geotiff_geotiff_h" != x"yes" && 42 + test x"$ac_cv_header_libgeotiff_geotiff_h" != x"yes" && 43 + test x"$ac_cv_header_geotiff_h" != x"yes"; 44 +then 45 + AC_MSG_ERROR(['libgeotiff' is required but the header (geotiff.h) doesn't seem to be installed on this system]) 46 +fi 47 + 48 +# Checks for programs. 49 +AC_PROG_CXX 50 +AC_PROG_CC 51 +AC_PROG_CPP 52 +AC_PROG_INSTALL 53 +AC_PROG_LN_S 54 +AC_PROG_MAKE_SET 55 +AC_LIBTOOL_WIN32_DLL 56 +AC_PROG_LIBTOOL 57 + 58 +# Checks for typedefs, structures, and compiler characteristics. 59 +AC_C_CONST 60 +AC_TYPE_OFF_T 61 +AC_TYPE_SIZE_T 62 +AC_HEADER_TIME 63 +AC_STRUCT_TM 64 +AC_C_VOLATILE 65 + 66 +# Checks for library functions. 67 +AC_FUNC_LSTAT 68 +AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK 69 +AC_FUNC_MEMCMP 70 +AC_FUNC_STAT 71 +AC_FUNC_STRFTIME 72 +AC_CHECK_FUNCS([memset sqrt strcasecmp strerror strncasecmp strstr fdatasync ftruncate getcwd gettimeofday localtime_r memmove strerror]) 73 + 74 +# Checks for installed libraries 75 +AC_CHECK_LIB(z,inflateInit_,,AC_MSG_ERROR(['libz' is required but it doesn't seems to be installed on this system.]),-lm) 76 +AC_CHECK_LIB(jpeg,jpeg_start_compress,,AC_MSG_ERROR(['libjpeg' is required but it doesn't seems to be installed on this system.]),-lm) 77 +AC_CHECK_LIB(tiff,TIFFClientOpen,,AC_MSG_ERROR(['libtiff' is required but it doesn't seems to be installed on this system.]),-lm) 78 +AC_CHECK_LIB(proj,pj_init_plus,,AC_MSG_ERROR(['libproj' is required but it doesn't seems to be installed on this system.]),-lm) 79 +AC_CHECK_LIB(geotiff,GTIFSetFromProj4,,AC_MSG_ERROR(['libgeotiff' [>= v.1.2.5] is required but it doesn't seems to be installed on this system.]),-lm) 80 + 81 +PKG_CHECK_MODULES([LIBPNG], [libpng], , AC_MSG_ERROR(['libpng' is required but it doesn't seems to be installed on this system.])) 82 +AC_SUBST(LIBPNG_CFLAGS) 83 +AC_SUBST(LIBPNG_LIBS) 84 + 85 +PKG_CHECK_MODULES([LIBCAIRO], [cairo], , AC_MSG_ERROR(['libcairo' is required but it doesn't seems to be installed on this system.])) 86 +AC_SUBST(LIBCAIRO_CFLAGS) 87 +AC_SUBST(LIBCAIRO_LIBS) 88 + 89 +PKG_CHECK_MODULES([LIBXML2], [libxml-2.0], , AC_MSG_ERROR(['libxml2' is required but it doesn't seem to be installed on this system.])) 90 + AC_SUBST(LIBXML2_CFLAGS) 91 + AC_SUBST(LIBXML2_LIBS) 92 + 93 +AC_CONFIG_FILES([Makefile \ 94 + headers/Makefile \ 95 + src/Makefile \ 96 + gaiagraphics.pc]) 97 + 98 +# Checking for MinGW 99 +AM_CONDITIONAL([MINGW], [test "$target_alias" = "mingw32"]) 100 + 101 +AC_OUTPUT
Added depcomp.
1 +#! /bin/sh 2 +# depcomp - compile a program generating dependencies as side-effects 3 + 4 +scriptversion=2012-03-27.16; # UTC 5 + 6 +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 7 +# 2011, 2012 Free Software Foundation, Inc. 8 + 9 +# This program is free software; you can redistribute it and/or modify 10 +# it under the terms of the GNU General Public License as published by 11 +# the Free Software Foundation; either version 2, or (at your option) 12 +# any later version. 13 + 14 +# This program is distributed in the hope that it will be useful, 15 +# but WITHOUT ANY WARRANTY; without even the implied warranty of 16 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 +# GNU General Public License for more details. 18 + 19 +# You should have received a copy of the GNU General Public License 20 +# along with this program. If not, see <http://www.gnu.org/licenses/>. 21 + 22 +# As a special exception to the GNU General Public License, if you 23 +# distribute this file as part of a program that contains a 24 +# configuration script generated by Autoconf, you may include it under 25 +# the same distribution terms that you use for the rest of that program. 26 + 27 +# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. 28 + 29 +case $1 in 30 + '') 31 + echo "$0: No command. Try '$0 --help' for more information." 1>&2 32 + exit 1; 33 + ;; 34 + -h | --h*) 35 + cat <<\EOF 36 +Usage: depcomp [--help] [--version] PROGRAM [ARGS] 37 + 38 +Run PROGRAMS ARGS to compile a file, generating dependencies 39 +as side-effects. 40 + 41 +Environment variables: 42 + depmode Dependency tracking mode. 43 + source Source file read by 'PROGRAMS ARGS'. 44 + object Object file output by 'PROGRAMS ARGS'. 45 + DEPDIR directory where to store dependencies. 46 + depfile Dependency file to output. 47 + tmpdepfile Temporary file to use when outputting dependencies. 48 + libtool Whether libtool is used (yes/no). 49 + 50 +Report bugs to <bug-automake@gnu.org>. 51 +EOF 52 + exit $? 53 + ;; 54 + -v | --v*) 55 + echo "depcomp $scriptversion" 56 + exit $? 57 + ;; 58 +esac 59 + 60 +# A tabulation character. 61 +tab=' ' 62 +# A newline character. 63 +nl=' 64 +' 65 + 66 +if test -z "$depmode" || test -z "$source" || test -z "$object"; then 67 + echo "depcomp: Variables source, object and depmode must be set" 1>&2 68 + exit 1 69 +fi 70 + 71 +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. 72 +depfile=${depfile-`echo "$object" | 73 + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} 74 +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} 75 + 76 +rm -f "$tmpdepfile" 77 + 78 +# Some modes work just like other modes, but use different flags. We 79 +# parameterize here, but still list the modes in the big case below, 80 +# to make depend.m4 easier to write. Note that we *cannot* use a case 81 +# here, because this file can only contain one case statement. 82 +if test "$depmode" = hp; then 83 + # HP compiler uses -M and no extra arg. 84 + gccflag=-M 85 + depmode=gcc 86 +fi 87 + 88 +if test "$depmode" = dashXmstdout; then 89 + # This is just like dashmstdout with a different argument. 90 + dashmflag=-xM 91 + depmode=dashmstdout 92 +fi 93 + 94 +cygpath_u="cygpath -u -f -" 95 +if test "$depmode" = msvcmsys; then 96 + # This is just like msvisualcpp but w/o cygpath translation. 97 + # Just convert the backslash-escaped backslashes to single forward 98 + # slashes to satisfy depend.m4 99 + cygpath_u='sed s,\\\\,/,g' 100 + depmode=msvisualcpp 101 +fi 102 + 103 +if test "$depmode" = msvc7msys; then 104 + # This is just like msvc7 but w/o cygpath translation. 105 + # Just convert the backslash-escaped backslashes to single forward 106 + # slashes to satisfy depend.m4 107 + cygpath_u='sed s,\\\\,/,g' 108 + depmode=msvc7 109 +fi 110 + 111 +if test "$depmode" = xlc; then 112 + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. 113 + gccflag=-qmakedep=gcc,-MF 114 + depmode=gcc 115 +fi 116 + 117 +case "$depmode" in 118 +gcc3) 119 +## gcc 3 implements dependency tracking that does exactly what 120 +## we want. Yay! Note: for some reason libtool 1.4 doesn't like 121 +## it if -MD -MP comes after the -MF stuff. Hmm. 122 +## Unfortunately, FreeBSD c89 acceptance of flags depends upon 123 +## the command line argument order; so add the flags where they 124 +## appear in depend2.am. Note that the slowdown incurred here 125 +## affects only configure: in makefiles, %FASTDEP% shortcuts this. 126 + for arg 127 + do 128 + case $arg in 129 + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; 130 + *) set fnord "$@" "$arg" ;; 131 + esac 132 + shift # fnord 133 + shift # $arg 134 + done 135 + "$@" 136 + stat=$? 137 + if test $stat -eq 0; then : 138 + else 139 + rm -f "$tmpdepfile" 140 + exit $stat 141 + fi 142 + mv "$tmpdepfile" "$depfile" 143 + ;; 144 + 145 +gcc) 146 +## There are various ways to get dependency output from gcc. Here's 147 +## why we pick this rather obscure method: 148 +## - Don't want to use -MD because we'd like the dependencies to end 149 +## up in a subdir. Having to rename by hand is ugly. 150 +## (We might end up doing this anyway to support other compilers.) 151 +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 152 +## -MM, not -M (despite what the docs say). 153 +## - Using -M directly means running the compiler twice (even worse 154 +## than renaming). 155 + if test -z "$gccflag"; then 156 + gccflag=-MD, 157 + fi 158 + "$@" -Wp,"$gccflag$tmpdepfile" 159 + stat=$? 160 + if test $stat -eq 0; then : 161 + else 162 + rm -f "$tmpdepfile" 163 + exit $stat 164 + fi 165 + rm -f "$depfile" 166 + echo "$object : \\" > "$depfile" 167 + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 168 +## The second -e expression handles DOS-style file names with drive letters. 169 + sed -e 's/^[^:]*: / /' \ 170 + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 171 +## This next piece of magic avoids the "deleted header file" problem. 172 +## The problem is that when a header file which appears in a .P file 173 +## is deleted, the dependency causes make to die (because there is 174 +## typically no way to rebuild the header). We avoid this by adding 175 +## dummy dependencies for each header file. Too bad gcc doesn't do 176 +## this for us directly. 177 + tr ' ' "$nl" < "$tmpdepfile" | 178 +## Some versions of gcc put a space before the ':'. On the theory 179 +## that the space means something, we add a space to the output as 180 +## well. hp depmode also adds that space, but also prefixes the VPATH 181 +## to the object. Take care to not repeat it in the output. 182 +## Some versions of the HPUX 10.20 sed can't process this invocation 183 +## correctly. Breaking it into two sed invocations is a workaround. 184 + sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 185 + | sed -e 's/$/ :/' >> "$depfile" 186 + rm -f "$tmpdepfile" 187 + ;; 188 + 189 +hp) 190 + # This case exists only to let depend.m4 do its work. It works by 191 + # looking at the text of this script. This case will never be run, 192 + # since it is checked for above. 193 + exit 1 194 + ;; 195 + 196 +sgi) 197 + if test "$libtool" = yes; then 198 + "$@" "-Wp,-MDupdate,$tmpdepfile" 199 + else 200 + "$@" -MDupdate "$tmpdepfile" 201 + fi 202 + stat=$? 203 + if test $stat -eq 0; then : 204 + else 205 + rm -f "$tmpdepfile" 206 + exit $stat 207 + fi 208 + rm -f "$depfile" 209 + 210 + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 211 + echo "$object : \\" > "$depfile" 212 + 213 + # Clip off the initial element (the dependent). Don't try to be 214 + # clever and replace this with sed code, as IRIX sed won't handle 215 + # lines with more than a fixed number of characters (4096 in 216 + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 217 + # the IRIX cc adds comments like '#:fec' to the end of the 218 + # dependency line. 219 + tr ' ' "$nl" < "$tmpdepfile" \ 220 + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ 221 + tr "$nl" ' ' >> "$depfile" 222 + echo >> "$depfile" 223 + 224 + # The second pass generates a dummy entry for each header file. 225 + tr ' ' "$nl" < "$tmpdepfile" \ 226 + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 227 + >> "$depfile" 228 + else 229 + # The sourcefile does not contain any dependencies, so just 230 + # store a dummy comment line, to avoid errors with the Makefile 231 + # "include basename.Plo" scheme. 232 + echo "#dummy" > "$depfile" 233 + fi 234 + rm -f "$tmpdepfile" 235 + ;; 236 + 237 +xlc) 238 + # This case exists only to let depend.m4 do its work. It works by 239 + # looking at the text of this script. This case will never be run, 240 + # since it is checked for above. 241 + exit 1 242 + ;; 243 + 244 +aix) 245 + # The C for AIX Compiler uses -M and outputs the dependencies 246 + # in a .u file. In older versions, this file always lives in the 247 + # current directory. Also, the AIX compiler puts '$object:' at the 248 + # start of each line; $object doesn't have directory information. 249 + # Version 6 uses the directory in both cases. 250 + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` 251 + test "x$dir" = "x$object" && dir= 252 + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 253 + if test "$libtool" = yes; then 254 + tmpdepfile1=$dir$base.u 255 + tmpdepfile2=$base.u 256 + tmpdepfile3=$dir.libs/$base.u 257 + "$@" -Wc,-M 258 + else 259 + tmpdepfile1=$dir$base.u 260 + tmpdepfile2=$dir$base.u 261 + tmpdepfile3=$dir$base.u 262 + "$@" -M 263 + fi 264 + stat=$? 265 + 266 + if test $stat -eq 0; then : 267 + else 268 + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 269 + exit $stat 270 + fi 271 + 272 + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 273 + do 274 + test -f "$tmpdepfile" && break 275 + done 276 + if test -f "$tmpdepfile"; then 277 + # Each line is of the form 'foo.o: dependent.h'. 278 + # Do two passes, one to just change these to 279 + # '$object: dependent.h' and one to simply 'dependent.h:'. 280 + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" 281 + sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" 282 + else 283 + # The sourcefile does not contain any dependencies, so just 284 + # store a dummy comment line, to avoid errors with the Makefile 285 + # "include basename.Plo" scheme. 286 + echo "#dummy" > "$depfile" 287 + fi 288 + rm -f "$tmpdepfile" 289 + ;; 290 + 291 +icc) 292 + # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. 293 + # However on 294 + # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c 295 + # ICC 7.0 will fill foo.d with something like 296 + # foo.o: sub/foo.c 297 + # foo.o: sub/foo.h 298 + # which is wrong. We want 299 + # sub/foo.o: sub/foo.c 300 + # sub/foo.o: sub/foo.h 301 + # sub/foo.c: 302 + # sub/foo.h: 303 + # ICC 7.1 will output 304 + # foo.o: sub/foo.c sub/foo.h 305 + # and will wrap long lines using '\': 306 + # foo.o: sub/foo.c ... \ 307 + # sub/foo.h ... \ 308 + # ... 309 + # tcc 0.9.26 (FIXME still under development at the moment of writing) 310 + # will emit a similar output, but also prepend the continuation lines 311 + # with horizontal tabulation characters. 312 + "$@" -MD -MF "$tmpdepfile" 313 + stat=$? 314 + if test $stat -eq 0; then : 315 + else 316 + rm -f "$tmpdepfile" 317 + exit $stat 318 + fi 319 + rm -f "$depfile" 320 + # Each line is of the form 'foo.o: dependent.h', 321 + # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. 322 + # Do two passes, one to just change these to 323 + # '$object: dependent.h' and one to simply 'dependent.h:'. 324 + sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ 325 + < "$tmpdepfile" > "$depfile" 326 + sed ' 327 + s/[ '"$tab"'][ '"$tab"']*/ /g 328 + s/^ *// 329 + s/ *\\*$// 330 + s/^[^:]*: *// 331 + /^$/d 332 + /:$/d 333 + s/$/ :/ 334 + ' < "$tmpdepfile" >> "$depfile" 335 + rm -f "$tmpdepfile" 336 + ;; 337 + 338 +hp2) 339 + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 340 + # compilers, which have integrated preprocessors. The correct option 341 + # to use with these is +Maked; it writes dependencies to a file named 342 + # 'foo.d', which lands next to the object file, wherever that 343 + # happens to be. 344 + # Much of this is similar to the tru64 case; see comments there. 345 + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` 346 + test "x$dir" = "x$object" && dir= 347 + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 348 + if test "$libtool" = yes; then 349 + tmpdepfile1=$dir$base.d 350 + tmpdepfile2=$dir.libs/$base.d 351 + "$@" -Wc,+Maked 352 + else 353 + tmpdepfile1=$dir$base.d 354 + tmpdepfile2=$dir$base.d 355 + "$@" +Maked 356 + fi 357 + stat=$? 358 + if test $stat -eq 0; then : 359 + else 360 + rm -f "$tmpdepfile1" "$tmpdepfile2" 361 + exit $stat 362 + fi 363 + 364 + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" 365 + do 366 + test -f "$tmpdepfile" && break 367 + done 368 + if test -f "$tmpdepfile"; then 369 + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" 370 + # Add 'dependent.h:' lines. 371 + sed -ne '2,${ 372 + s/^ *// 373 + s/ \\*$// 374 + s/$/:/ 375 + p 376 + }' "$tmpdepfile" >> "$depfile" 377 + else 378 + echo "#dummy" > "$depfile" 379 + fi 380 + rm -f "$tmpdepfile" "$tmpdepfile2" 381 + ;; 382 + 383 +tru64) 384 + # The Tru64 compiler uses -MD to generate dependencies as a side 385 + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 386 + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 387 + # dependencies in 'foo.d' instead, so we check for that too. 388 + # Subdirectories are respected. 389 + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` 390 + test "x$dir" = "x$object" && dir= 391 + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 392 + 393 + if test "$libtool" = yes; then 394 + # With Tru64 cc, shared objects can also be used to make a 395 + # static library. This mechanism is used in libtool 1.4 series to 396 + # handle both shared and static libraries in a single compilation. 397 + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. 398 + # 399 + # With libtool 1.5 this exception was removed, and libtool now 400 + # generates 2 separate objects for the 2 libraries. These two 401 + # compilations output dependencies in $dir.libs/$base.o.d and 402 + # in $dir$base.o.d. We have to check for both files, because 403 + # one of the two compilations can be disabled. We should prefer 404 + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 405 + # automatically cleaned when .libs/ is deleted, while ignoring 406 + # the former would cause a distcleancheck panic. 407 + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 408 + tmpdepfile2=$dir$base.o.d # libtool 1.5 409 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 410 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 411 + "$@" -Wc,-MD 412 + else 413 + tmpdepfile1=$dir$base.o.d 414 + tmpdepfile2=$dir$base.d 415 + tmpdepfile3=$dir$base.d 416 + tmpdepfile4=$dir$base.d 417 + "$@" -MD 418 + fi 419 + 420 + stat=$? 421 + if test $stat -eq 0; then : 422 + else 423 + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" 424 + exit $stat 425 + fi 426 + 427 + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" 428 + do 429 + test -f "$tmpdepfile" && break 430 + done 431 + if test -f "$tmpdepfile"; then 432 + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" 433 + sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" 434 + else 435 + echo "#dummy" > "$depfile" 436 + fi 437 + rm -f "$tmpdepfile" 438 + ;; 439 + 440 +msvc7) 441 + if test "$libtool" = yes; then 442 + showIncludes=-Wc,-showIncludes 443 + else 444 + showIncludes=-showIncludes 445 + fi 446 + "$@" $showIncludes > "$tmpdepfile" 447 + stat=$? 448 + grep -v '^Note: including file: ' "$tmpdepfile" 449 + if test "$stat" = 0; then : 450 + else 451 + rm -f "$tmpdepfile" 452 + exit $stat 453 + fi 454 + rm -f "$depfile" 455 + echo "$object : \\" > "$depfile" 456 + # The first sed program below extracts the file names and escapes 457 + # backslashes for cygpath. The second sed program outputs the file 458 + # name when reading, but also accumulates all include files in the 459 + # hold buffer in order to output them again at the end. This only 460 + # works with sed implementations that can handle large buffers. 461 + sed < "$tmpdepfile" -n ' 462 +/^Note: including file: *\(.*\)/ { 463 + s//\1/ 464 + s/\\/\\\\/g 465 + p 466 +}' | $cygpath_u | sort -u | sed -n ' 467 +s/ /\\ /g 468 +s/\(.*\)/'"$tab"'\1 \\/p 469 +s/.\(.*\) \\/\1:/ 470 +H 471 +$ { 472 + s/.*/'"$tab"'/ 473 + G 474 + p 475 +}' >> "$depfile" 476 + rm -f "$tmpdepfile" 477 + ;; 478 + 479 +msvc7msys) 480 + # This case exists only to let depend.m4 do its work. It works by 481 + # looking at the text of this script. This case will never be run, 482 + # since it is checked for above. 483 + exit 1 484 + ;; 485 + 486 +#nosideeffect) 487 + # This comment above is used by automake to tell side-effect 488 + # dependency tracking mechanisms from slower ones. 489 + 490 +dashmstdout) 491 + # Important note: in order to support this mode, a compiler *must* 492 + # always write the preprocessed file to stdout, regardless of -o. 493 + "$@" || exit $? 494 + 495 + # Remove the call to Libtool. 496 + if test "$libtool" = yes; then 497 + while test "X$1" != 'X--mode=compile'; do 498 + shift 499 + done 500 + shift 501 + fi 502 + 503 + # Remove '-o $object'. 504 + IFS=" " 505 + for arg 506 + do 507 + case $arg in 508 + -o) 509 + shift 510 + ;; 511 + $object) 512 + shift 513 + ;; 514 + *) 515 + set fnord "$@" "$arg" 516 + shift # fnord 517 + shift # $arg 518 + ;; 519 + esac 520 + done 521 + 522 + test -z "$dashmflag" && dashmflag=-M 523 + # Require at least two characters before searching for ':' 524 + # in the target name. This is to cope with DOS-style filenames: 525 + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. 526 + "$@" $dashmflag | 527 + sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" 528 + rm -f "$depfile" 529 + cat < "$tmpdepfile" > "$depfile" 530 + tr ' ' "$nl" < "$tmpdepfile" | \ 531 +## Some versions of the HPUX 10.20 sed can't process this invocation 532 +## correctly. Breaking it into two sed invocations is a workaround. 533 + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 534 + rm -f "$tmpdepfile" 535 + ;; 536 + 537 +dashXmstdout) 538 + # This case only exists to satisfy depend.m4. It is never actually 539 + # run, as this mode is specially recognized in the preamble. 540 + exit 1 541 + ;; 542 + 543 +makedepend) 544 + "$@" || exit $? 545 + # Remove any Libtool call 546 + if test "$libtool" = yes; then 547 + while test "X$1" != 'X--mode=compile'; do 548 + shift 549 + done 550 + shift 551 + fi 552 + # X makedepend 553 + shift 554 + cleared=no eat=no 555 + for arg 556 + do 557 + case $cleared in 558 + no) 559 + set ""; shift 560 + cleared=yes ;; 561 + esac 562 + if test $eat = yes; then 563 + eat=no 564 + continue 565 + fi 566 + case "$arg" in 567 + -D*|-I*) 568 + set fnord "$@" "$arg"; shift ;; 569 + # Strip any option that makedepend may not understand. Remove 570 + # the object too, otherwise makedepend will parse it as a source file. 571 + -arch) 572 + eat=yes ;; 573 + -*|$object) 574 + ;; 575 + *) 576 + set fnord "$@" "$arg"; shift ;; 577 + esac 578 + done 579 + obj_suffix=`echo "$object" | sed 's/^.*\././'` 580 + touch "$tmpdepfile" 581 + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" 582 + rm -f "$depfile" 583 + # makedepend may prepend the VPATH from the source file name to the object. 584 + # No need to regex-escape $object, excess matching of '.' is harmless. 585 + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 586 + sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ 587 +## Some versions of the HPUX 10.20 sed can't process this invocation 588 +## correctly. Breaking it into two sed invocations is a workaround. 589 + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 590 + rm -f "$tmpdepfile" "$tmpdepfile".bak 591 + ;; 592 + 593 +cpp) 594 + # Important note: in order to support this mode, a compiler *must* 595 + # always write the preprocessed file to stdout. 596 + "$@" || exit $? 597 + 598 + # Remove the call to Libtool. 599 + if test "$libtool" = yes; then 600 + while test "X$1" != 'X--mode=compile'; do 601 + shift 602 + done 603 + shift 604 + fi 605 + 606 + # Remove '-o $object'. 607 + IFS=" " 608 + for arg 609 + do 610 + case $arg in 611 + -o) 612 + shift 613 + ;; 614 + $object) 615 + shift 616 + ;; 617 + *) 618 + set fnord "$@" "$arg" 619 + shift # fnord 620 + shift # $arg 621 + ;; 622 + esac 623 + done 624 + 625 + "$@" -E | 626 + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 627 + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | 628 + sed '$ s: \\$::' > "$tmpdepfile" 629 + rm -f "$depfile" 630 + echo "$object : \\" > "$depfile" 631 + cat < "$tmpdepfile" >> "$depfile" 632 + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" 633 + rm -f "$tmpdepfile" 634 + ;; 635 + 636 +msvisualcpp) 637 + # Important note: in order to support this mode, a compiler *must* 638 + # always write the preprocessed file to stdout. 639 + "$@" || exit $? 640 + 641 + # Remove the call to Libtool. 642 + if test "$libtool" = yes; then 643 + while test "X$1" != 'X--mode=compile'; do 644 + shift 645 + done 646 + shift 647 + fi 648 + 649 + IFS=" " 650 + for arg 651 + do 652 + case "$arg" in 653 + -o) 654 + shift 655 + ;; 656 + $object) 657 + shift 658 + ;; 659 + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 660 + set fnord "$@" 661 + shift 662 + shift 663 + ;; 664 + *) 665 + set fnord "$@" "$arg" 666 + shift 667 + shift 668 + ;; 669 + esac 670 + done 671 + "$@" -E 2>/dev/null | 672 + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" 673 + rm -f "$depfile" 674 + echo "$object : \\" > "$depfile" 675 + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" 676 + echo "$tab" >> "$depfile" 677 + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 678 + rm -f "$tmpdepfile" 679 + ;; 680 + 681 +msvcmsys) 682 + # This case exists only to let depend.m4 do its work. It works by 683 + # looking at the text of this script. This case will never be run, 684 + # since it is checked for above. 685 + exit 1 686 + ;; 687 + 688 +none) 689 + exec "$@" 690 + ;; 691 + 692 +*) 693 + echo "Unknown depmode $depmode" 1>&2 694 + exit 1 695 + ;; 696 +esac 697 + 698 +exit 0 699 + 700 +# Local Variables: 701 +# mode: shell-script 702 +# sh-indentation: 2 703 +# eval: (add-hook 'write-file-hooks 'time-stamp) 704 +# time-stamp-start: "scriptversion=" 705 +# time-stamp-format: "%:y-%02m-%02d.%02H" 706 +# time-stamp-time-zone: "UTC" 707 +# time-stamp-end: "; # UTC" 708 +# End:
Added gaiagraphics.pc.in.
1 +# Package Information for pkg-config 2 + 3 +prefix=@prefix@ 4 +exec_prefix=@exec_prefix@ 5 +libdir=@libdir@ 6 +includedir=@includedir@ 7 + 8 +Name: gaiagraphics 9 +Description: Gaia Common Graphics Support 10 +Version: 1.0 11 +Libs: -L${libdir} -lgaiagraphics 12 +Cflags: -I${includedir}
Added headers/Makefile.am.
1 + 2 +noinst_HEADERS = gaiagraphics_internals.h 3 +include_HEADERS = gaiagraphics.h 4 +
Added headers/Makefile.in.
1 +# Makefile.in generated by automake 1.13.4 from Makefile.am. 2 +# @configure_input@ 3 + 4 +# Copyright (C) 1994-2013 Free Software Foundation, Inc. 5 + 6 +# This Makefile.in is free software; the Free Software Foundation 7 +# gives unlimited permission to copy and/or distribute it, 8 +# with or without modifications, as long as this notice is preserved. 9 + 10 +# This program is distributed in the hope that it will be useful, 11 +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without 12 +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A 13 +# PARTICULAR PURPOSE. 14 + 15 +@SET_MAKE@ 16 + 17 +VPATH = @srcdir@ 18 +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 19 +am__make_running_with_option = \ 20 + case $${target_option-} in \ 21 + ?) ;; \ 22 + *) echo "am__make_running_with_option: internal error: invalid" \ 23 + "target option '$${target_option-}' specified" >&2; \ 24 + exit 1;; \ 25 + esac; \ 26 + has_opt=no; \ 27 + sane_makeflags=$$MAKEFLAGS; \ 28 + if $(am__is_gnu_make); then \ 29 + sane_makeflags=$$MFLAGS; \ 30 + else \ 31 + case $$MAKEFLAGS in \ 32 + *\\[\ \ ]*) \ 33 + bs=\\; \ 34 + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ 35 + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ 36 + esac; \ 37 + fi; \ 38 + skip_next=no; \ 39 + strip_trailopt () \ 40 + { \ 41 + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ 42 + }; \ 43 + for flg in $$sane_makeflags; do \ 44 + test $$skip_next = yes && { skip_next=no; continue; }; \ 45 + case $$flg in \ 46 + *=*|--*) continue;; \ 47 + -*I) strip_trailopt 'I'; skip_next=yes;; \ 48 + -*I?*) strip_trailopt 'I';; \ 49 + -*O) strip_trailopt 'O'; skip_next=yes;; \ 50 + -*O?*) strip_trailopt 'O';; \ 51 + -*l) strip_trailopt 'l'; skip_next=yes;; \ 52 + -*l?*) strip_trailopt 'l';; \ 53 + -[dEDm]) skip_next=yes;; \ 54 + -[JT]) skip_next=yes;; \ 55 + esac; \ 56 + case $$flg in \ 57 + *$$target_option*) has_opt=yes; break;; \ 58 + esac; \ 59 + done; \ 60 + test $$has_opt = yes 61 +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 62 +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 63 +pkgdatadir = $(datadir)/@PACKAGE@ 64 +pkgincludedir = $(includedir)/@PACKAGE@ 65 +pkglibdir = $(libdir)/@PACKAGE@ 66 +pkglibexecdir = $(libexecdir)/@PACKAGE@ 67 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 68 +install_sh_DATA = $(install_sh) -c -m 644 69 +install_sh_PROGRAM = $(install_sh) -c 70 +install_sh_SCRIPT = $(install_sh) -c 71 +INSTALL_HEADER = $(INSTALL_DATA) 72 +transform = $(program_transform_name) 73 +NORMAL_INSTALL = : 74 +PRE_INSTALL = : 75 +POST_INSTALL = : 76 +NORMAL_UNINSTALL = : 77 +PRE_UNINSTALL = : 78 +POST_UNINSTALL = : 79 +build_triplet = @build@ 80 +host_triplet = @host@ 81 +subdir = headers 82 +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ 83 + $(include_HEADERS) $(noinst_HEADERS) 84 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 85 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ 86 + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ 87 + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ 88 + $(top_srcdir)/configure.ac 89 +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 90 + $(ACLOCAL_M4) 91 +mkinstalldirs = $(install_sh) -d 92 +CONFIG_CLEAN_FILES = 93 +CONFIG_CLEAN_VPATH_FILES = 94 +AM_V_P = $(am__v_P_@AM_V@) 95 +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 96 +am__v_P_0 = false 97 +am__v_P_1 = : 98 +AM_V_GEN = $(am__v_GEN_@AM_V@) 99 +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 100 +am__v_GEN_0 = @echo " GEN " $@; 101 +am__v_GEN_1 = 102 +AM_V_at = $(am__v_at_@AM_V@) 103 +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 104 +am__v_at_0 = @ 105 +am__v_at_1 = 106 +SOURCES = 107 +DIST_SOURCES = 108 +am__can_run_installinfo = \ 109 + case $$AM_UPDATE_INFO_DIR in \ 110 + n|no|NO) false;; \ 111 + *) (install-info --version) >/dev/null 2>&1;; \ 112 + esac 113 +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; 114 +am__vpath_adj = case $$p in \ 115 + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ 116 + *) f=$$p;; \ 117 + esac; 118 +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; 119 +am__install_max = 40 120 +am__nobase_strip_setup = \ 121 + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` 122 +am__nobase_strip = \ 123 + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" 124 +am__nobase_list = $(am__nobase_strip_setup); \ 125 + for p in $$list; do echo "$$p $$p"; done | \ 126 + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ 127 + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ 128 + if (++n[$$2] == $(am__install_max)) \ 129 + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ 130 + END { for (dir in files) print dir, files[dir] }' 131 +am__base_list = \ 132 + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ 133 + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' 134 +am__uninstall_files_from_dir = { \ 135 + test -z "$$files" \ 136 + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ 137 + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ 138 + $(am__cd) "$$dir" && rm -f $$files; }; \ 139 + } 140 +am__installdirs = "$(DESTDIR)$(includedir)" 141 +HEADERS = $(include_HEADERS) $(noinst_HEADERS) 142 +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) 143 +# Read a list of newline-separated strings from the standard input, 144 +# and print each of them once, without duplicates. Input order is 145 +# *not* preserved. 146 +am__uniquify_input = $(AWK) '\ 147 + BEGIN { nonempty = 0; } \ 148 + { items[$$0] = 1; nonempty = 1; } \ 149 + END { if (nonempty) { for (i in items) print i; }; } \ 150 +' 151 +# Make sure the list of sources is unique. This is necessary because, 152 +# e.g., the same source file might be shared among _SOURCES variables 153 +# for different programs/libraries. 154 +am__define_uniq_tagged_files = \ 155 + list='$(am__tagged_files)'; \ 156 + unique=`for i in $$list; do \ 157 + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ 158 + done | $(am__uniquify_input)` 159 +ETAGS = etags 160 +CTAGS = ctags 161 +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 162 +ACLOCAL = @ACLOCAL@ 163 +AMTAR = @AMTAR@ 164 +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ 165 +AR = @AR@ 166 +AS = @AS@ 167 +AUTOCONF = @AUTOCONF@ 168 +AUTOHEADER = @AUTOHEADER@ 169 +AUTOMAKE = @AUTOMAKE@ 170 +AWK = @AWK@ 171 +CC = @CC@ 172 +CCDEPMODE = @CCDEPMODE@ 173 +CFLAGS = @CFLAGS@ 174 +CPP = @CPP@ 175 +CPPFLAGS = @CPPFLAGS@ 176 +CXX = @CXX@ 177 +CXXCPP = @CXXCPP@ 178 +CXXDEPMODE = @CXXDEPMODE@ 179 +CXXFLAGS = @CXXFLAGS@ 180 +CYGPATH_W = @CYGPATH_W@ 181 +DEFS = @DEFS@ 182 +DEPDIR = @DEPDIR@ 183 +DLLTOOL = @DLLTOOL@ 184 +DSYMUTIL = @DSYMUTIL@ 185 +DUMPBIN = @DUMPBIN@ 186 +ECHO_C = @ECHO_C@ 187 +ECHO_N = @ECHO_N@ 188 +ECHO_T = @ECHO_T@ 189 +EGREP = @EGREP@ 190 +EXEEXT = @EXEEXT@ 191 +FGREP = @FGREP@ 192 +GREP = @GREP@ 193 +INSTALL = @INSTALL@ 194 +INSTALL_DATA = @INSTALL_DATA@ 195 +INSTALL_PROGRAM = @INSTALL_PROGRAM@ 196 +INSTALL_SCRIPT = @INSTALL_SCRIPT@ 197 +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ 198 +LD = @LD@ 199 +LDFLAGS = @LDFLAGS@ 200 +LIBCAIRO_CFLAGS = @LIBCAIRO_CFLAGS@ 201 +LIBCAIRO_LIBS = @LIBCAIRO_LIBS@ 202 +LIBOBJS = @LIBOBJS@ 203 +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ 204 +LIBPNG_LIBS = @LIBPNG_LIBS@ 205 +LIBS = @LIBS@ 206 +LIBTOOL = @LIBTOOL@ 207 +LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ 208 +LIBXML2_LIBS = @LIBXML2_LIBS@ 209 +LIPO = @LIPO@ 210 +LN_S = @LN_S@ 211 +LTLIBOBJS = @LTLIBOBJS@ 212 +MAINT = @MAINT@ 213 +MAKEINFO = @MAKEINFO@ 214 +MANIFEST_TOOL = @MANIFEST_TOOL@ 215 +MKDIR_P = @MKDIR_P@ 216 +NM = @NM@ 217 +NMEDIT = @NMEDIT@ 218 +OBJDUMP = @OBJDUMP@ 219 +OBJEXT = @OBJEXT@ 220 +OTOOL = @OTOOL@ 221 +OTOOL64 = @OTOOL64@ 222 +PACKAGE = @PACKAGE@ 223 +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ 224 +PACKAGE_NAME = @PACKAGE_NAME@ 225 +PACKAGE_STRING = @PACKAGE_STRING@ 226 +PACKAGE_TARNAME = @PACKAGE_TARNAME@ 227 +PACKAGE_URL = @PACKAGE_URL@ 228 +PACKAGE_VERSION = @PACKAGE_VERSION@ 229 +PATH_SEPARATOR = @PATH_SEPARATOR@ 230 +PKG_CONFIG = @PKG_CONFIG@ 231 +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ 232 +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ 233 +RANLIB = @RANLIB@ 234 +SED = @SED@ 235 +SET_MAKE = @SET_MAKE@ 236 +SHELL = @SHELL@ 237 +STRIP = @STRIP@ 238 +VERSION = @VERSION@ 239 +abs_builddir = @abs_builddir@ 240 +abs_srcdir = @abs_srcdir@ 241 +abs_top_builddir = @abs_top_builddir@ 242 +abs_top_srcdir = @abs_top_srcdir@ 243 +ac_ct_AR = @ac_ct_AR@ 244 +ac_ct_CC = @ac_ct_CC@ 245 +ac_ct_CXX = @ac_ct_CXX@ 246 +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 247 +am__include = @am__include@ 248 +am__leading_dot = @am__leading_dot@ 249 +am__quote = @am__quote@ 250 +am__tar = @am__tar@ 251 +am__untar = @am__untar@ 252 +bindir = @bindir@ 253 +build = @build@ 254 +build_alias = @build_alias@ 255 +build_cpu = @build_cpu@ 256 +build_os = @build_os@ 257 +build_vendor = @build_vendor@ 258 +builddir = @builddir@ 259 +datadir = @datadir@ 260 +datarootdir = @datarootdir@ 261 +docdir = @docdir@ 262 +dvidir = @dvidir@ 263 +exec_prefix = @exec_prefix@ 264 +host = @host@ 265 +host_alias = @host_alias@ 266 +host_cpu = @host_cpu@ 267 +host_os = @host_os@ 268 +host_vendor = @host_vendor@ 269 +htmldir = @htmldir@ 270 +includedir = @includedir@ 271 +infodir = @infodir@ 272 +install_sh = @install_sh@ 273 +libdir = @libdir@ 274 +libexecdir = @libexecdir@ 275 +localedir = @localedir@ 276 +localstatedir = @localstatedir@ 277 +mandir = @mandir@ 278 +mkdir_p = @mkdir_p@ 279 +oldincludedir = @oldincludedir@ 280 +pdfdir = @pdfdir@ 281 +prefix = @prefix@ 282 +program_transform_name = @program_transform_name@ 283 +psdir = @psdir@ 284 +sbindir = @sbindir@ 285 +sharedstatedir = @sharedstatedir@ 286 +srcdir = @srcdir@ 287 +sysconfdir = @sysconfdir@ 288 +target_alias = @target_alias@ 289 +top_build_prefix = @top_build_prefix@ 290 +top_builddir = @top_builddir@ 291 +top_srcdir = @top_srcdir@ 292 +noinst_HEADERS = gaiagraphics_internals.h 293 +include_HEADERS = gaiagraphics.h 294 +all: all-am 295 + 296 +.SUFFIXES: 297 +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) 298 + @for dep in $?; do \ 299 + case '$(am__configure_deps)' in \ 300 + *$$dep*) \ 301 + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ 302 + && { if test -f $@; then exit 0; else break; fi; }; \ 303 + exit 1;; \ 304 + esac; \ 305 + done; \ 306 + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu headers/Makefile'; \ 307 + $(am__cd) $(top_srcdir) && \ 308 + $(AUTOMAKE) --gnu headers/Makefile 309 +.PRECIOUS: Makefile 310 +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 311 + @case '$?' in \ 312 + *config.status*) \ 313 + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ 314 + *) \ 315 + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ 316 + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 317 + esac; 318 + 319 +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) 320 + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh 321 + 322 +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 323 + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh 324 +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) 325 + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh 326 +$(am__aclocal_m4_deps): 327 + 328 +mostlyclean-libtool: 329 + -rm -f *.lo 330 + 331 +clean-libtool: 332 + -rm -rf .libs _libs 333 +install-includeHEADERS: $(include_HEADERS) 334 + @$(NORMAL_INSTALL) 335 + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ 336 + if test -n "$$list"; then \ 337 + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ 338 + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ 339 + fi; \ 340 + for p in $$list; do \ 341 + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ 342 + echo "$$d$$p"; \ 343 + done | $(am__base_list) | \ 344 + while read files; do \ 345 + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ 346 + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ 347 + done 348 + 349 +uninstall-includeHEADERS: 350 + @$(NORMAL_UNINSTALL) 351 + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ 352 + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ 353 + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) 354 + 355 +ID: $(am__tagged_files) 356 + $(am__define_uniq_tagged_files); mkid -fID $$unique 357 +tags: tags-am 358 +TAGS: tags 359 + 360 +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 361 + set x; \ 362 + here=`pwd`; \ 363 + $(am__define_uniq_tagged_files); \ 364 + shift; \ 365 + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ 366 + test -n "$$unique" || unique=$$empty_fix; \ 367 + if test $$# -gt 0; then \ 368 + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ 369 + "$$@" $$unique; \ 370 + else \ 371 + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ 372 + $$unique; \ 373 + fi; \ 374 + fi 375 +ctags: ctags-am 376 + 377 +CTAGS: ctags 378 +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 379 + $(am__define_uniq_tagged_files); \ 380 + test -z "$(CTAGS_ARGS)$$unique" \ 381 + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ 382 + $$unique 383 + 384 +GTAGS: 385 + here=`$(am__cd) $(top_builddir) && pwd` \ 386 + && $(am__cd) $(top_srcdir) \ 387 + && gtags -i $(GTAGS_ARGS) "$$here" 388 +cscopelist: cscopelist-am 389 + 390 +cscopelist-am: $(am__tagged_files) 391 + list='$(am__tagged_files)'; \ 392 + case "$(srcdir)" in \ 393 + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ 394 + *) sdir=$(subdir)/$(srcdir) ;; \ 395 + esac; \ 396 + for i in $$list; do \ 397 + if test -f "$$i"; then \ 398 + echo "$(subdir)/$$i"; \ 399 + else \ 400 + echo "$$sdir/$$i"; \ 401 + fi; \ 402 + done >> $(top_builddir)/cscope.files 403 + 404 +distclean-tags: 405 + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags 406 + 407 +distdir: $(DISTFILES) 408 + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ 409 + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ 410 + list='$(DISTFILES)'; \ 411 + dist_files=`for file in $$list; do echo $$file; done | \ 412 + sed -e "s|^$$srcdirstrip/||;t" \ 413 + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ 414 + case $$dist_files in \ 415 + */*) $(MKDIR_P) `echo "$$dist_files" | \ 416 + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ 417 + sort -u` ;; \ 418 + esac; \ 419 + for file in $$dist_files; do \ 420 + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ 421 + if test -d $$d/$$file; then \ 422 + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ 423 + if test -d "$(distdir)/$$file"; then \ 424 + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ 425 + fi; \ 426 + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ 427 + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ 428 + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ 429 + fi; \ 430 + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ 431 + else \ 432 + test -f "$(distdir)/$$file" \ 433 + || cp -p $$d/$$file "$(distdir)/$$file" \ 434 + || exit 1; \ 435 + fi; \ 436 + done 437 +check-am: all-am 438 +check: check-am 439 +all-am: Makefile $(HEADERS) 440 +installdirs: 441 + for dir in "$(DESTDIR)$(includedir)"; do \ 442 + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ 443 + done 444 +install: install-am 445 +install-exec: install-exec-am 446 +install-data: install-data-am 447 +uninstall: uninstall-am 448 + 449 +install-am: all-am 450 + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am 451 + 452 +installcheck: installcheck-am 453 +install-strip: 454 + if test -z '$(STRIP)'; then \ 455 + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ 456 + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ 457 + install; \ 458 + else \ 459 + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ 460 + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ 461 + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ 462 + fi 463 +mostlyclean-generic: 464 + 465 +clean-generic: 466 + 467 +distclean-generic: 468 + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) 469 + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) 470 + 471 +maintainer-clean-generic: 472 + @echo "This command is intended for maintainers to use" 473 + @echo "it deletes files that may require special tools to rebuild." 474 +clean: clean-am 475 + 476 +clean-am: clean-generic clean-libtool mostlyclean-am 477 + 478 +distclean: distclean-am 479 + -rm -f Makefile 480 +distclean-am: clean-am distclean-generic distclean-tags 481 + 482 +dvi: dvi-am 483 + 484 +dvi-am: 485 + 486 +html: html-am 487 + 488 +html-am: 489 + 490 +info: info-am 491 + 492 +info-am: 493 + 494 +install-data-am: install-includeHEADERS 495 + 496 +install-dvi: install-dvi-am 497 + 498 +install-dvi-am: 499 + 500 +install-exec-am: 501 + 502 +install-html: install-html-am 503 + 504 +install-html-am: 505 + 506 +install-info: install-info-am 507 + 508 +install-info-am: 509 + 510 +install-man: 511 + 512 +install-pdf: install-pdf-am 513 + 514 +install-pdf-am: 515 + 516 +install-ps: install-ps-am 517 + 518 +install-ps-am: 519 + 520 +installcheck-am: 521 + 522 +maintainer-clean: maintainer-clean-am 523 + -rm -f Makefile 524 +maintainer-clean-am: distclean-am maintainer-clean-generic 525 + 526 +mostlyclean: mostlyclean-am 527 + 528 +mostlyclean-am: mostlyclean-generic mostlyclean-libtool 529 + 530 +pdf: pdf-am 531 + 532 +pdf-am: 533 + 534 +ps: ps-am 535 + 536 +ps-am: 537 + 538 +uninstall-am: uninstall-includeHEADERS 539 + 540 +.MAKE: install-am install-strip 541 + 542 +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ 543 + clean-libtool cscopelist-am ctags ctags-am distclean \ 544 + distclean-generic distclean-libtool distclean-tags distdir dvi \ 545 + dvi-am html html-am info info-am install install-am \ 546 + install-data install-data-am install-dvi install-dvi-am \ 547 + install-exec install-exec-am install-html install-html-am \ 548 + install-includeHEADERS install-info install-info-am \ 549 + install-man install-pdf install-pdf-am install-ps \ 550 + install-ps-am install-strip installcheck installcheck-am \ 551 + installdirs maintainer-clean maintainer-clean-generic \ 552 + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ 553 + ps ps-am tags tags-am uninstall uninstall-am \ 554 + uninstall-includeHEADERS 555 + 556 + 557 +# Tell versions [3.59,3.63) of GNU make to not export all variables. 558 +# Otherwise a system limit (for SysV at least) may be exceeded. 559 +.NOEXPORT:
Added headers/gaiagraphics.h.
1 +/* 2 +/ gGraph.h 3 +/ 4 +/ public gGraph declarations 5 +/ 6 +/ version 1.0, 2010 July 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2010 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#ifdef _WIN32 28 +#ifdef DLL_EXPORT 29 +#define GGRAPH_DECLARE __declspec(dllexport) 30 +#else 31 +#define GGRAPH_DECLARE extern 32 +#endif 33 +#else 34 +#define GGRAPH_DECLARE __attribute__ ((visibility("default"))) 35 +#endif 36 + 37 +#ifndef _GGRAPH_H 38 +#define _GGRAPH_H 39 + 40 +#ifdef __cplusplus 41 +extern "C" 42 +{ 43 +#endif 44 + 45 +#define GGRAPH_COLORSPACE_UNKNOWN -1000 46 +#define GGRAPH_COLORSPACE_MONOCHROME 1001 47 +#define GGRAPH_COLORSPACE_PALETTE 1002 48 +#define GGRAPH_COLORSPACE_GRAYSCALE 1003 49 +#define GGRAPH_COLORSPACE_TRUECOLOR 1004 50 +#define GGRAPH_COLORSPACE_TRUECOLOR_ALPHA 1005 51 +#define GGRAPH_COLORSPACE_GRID 1006 52 + 53 +#define GGRAPH_SAMPLE_UNKNOWN -1500 54 +#define GGRAPH_SAMPLE_UINT 1501 55 +#define GGRAPH_SAMPLE_INT 1502 56 +#define GGRAPH_SAMPLE_FLOAT 1503 57 + 58 +#define GGRAPH_TIFF_DEFAULT -1001 59 + 60 +#define GGRAPH_TIFF_LAYOUT_STRIPS 2001 61 +#define GGRAPH_TIFF_LAYOUT_TILES 2002 62 + 63 +#define GGRAPH_TIFF_COMPRESSION_UNKNOWN -3000 64 +#define GGRAPH_TIFF_COMPRESSION_NONE 3001 65 +#define GGRAPH_TIFF_COMPRESSION_CCITTFAX3 3002 66 +#define GGRAPH_TIFF_COMPRESSION_CCITTFAX4 3003 67 +#define GGRAPH_TIFF_COMPRESSION_LZW 3004 68 +#define GGRAPH_TIFF_COMPRESSION_DEFLATE 3005 69 +#define GGRAPH_TIFF_COMPRESSION_JPEG 3006 70 + 71 +#define GGRAPH_IMAGE_UNKNOWN -4000 72 +#define GGRAPH_IMAGE_GIF 4001 73 +#define GGRAPH_IMAGE_PNG 4002 74 +#define GGRAPH_IMAGE_JPEG 4003 75 +#define GGRAPH_IMAGE_TIFF 4004 76 +#define GGRAPH_IMAGE_GEOTIFF 4005 77 +#define GGRAPH_IMAGE_HGT 4006 78 +#define GGRAPH_IMAGE_BIN_HDR 4007 79 +#define GGRAPH_IMAGE_FLT_HDR 4008 80 +#define GGRAPH_IMAGE_DEM_HDR 4009 81 +#define GGRAPH_IMAGE_ASCII_GRID 4010 82 + 83 +#define GGRAPH_PENSTYLE_SOLID 5001 84 +#define GGRAPH_PENSTYLE_DOT 5002 85 +#define GGRAPH_PENSTYLE_LONG_DASH 5003 86 +#define GGRAPH_PENSTYLE_SHORT_DASH 5004 87 +#define GGRAPH_PENSTYLE_DOT_DASH 5005 88 + 89 +#define GGRAPH_FONTSTYLE_NORMAL 5101 90 +#define GGRAPH_FONTSTYLE_ITALIC 5102 91 + 92 +#define GGRAPH_FONTWEIGHT_NORMAL 5201 93 +#define GGRAPH_FONTWEIGHT_BOLD 5202 94 + 95 +#define GGRAPH_CLEAR_PATH 5100 96 +#define GGRAPH_PRESERVE_PATH 5101 97 + 98 + 99 +#define GGRAPH_OK 0 100 +#define GGRAPH_ERROR -1 101 +#define GGRAPH_INVALID_IMAGE -2 102 +#define GGRAPH_INSUFFICIENT_MEMORY -3 103 +#define GGRAPH_FILE_OPEN_ERROR -4 104 +#define GGRAPH_FILE_READ_ERROR -5 105 +#define GGRAPH_FILE_WRITE_ERROR -6 106 +#define GGRAPH_GIF_CODEC_ERROR -7 107 +#define GGRAPH_PNG_CODEC_ERROR -8 108 +#define GGRAPH_JPEG_CODEC_ERROR -9 109 +#define GGRAPH_TIFF_CODEC_ERROR -10 110 +#define GGRAPH_GEOTIFF_CODEC_ERROR -11 111 +#define GGRAPH_HGT_CODEC_ERROR -12 112 +#define GGRAPH_BIN_CODEC_ERROR -13 113 +#define GGRAPH_FLT_CODEC_ERROR -14 114 +#define GGRAPH_DEM_CODEC_ERROR -15 115 +#define GGRAPH_ASCII_CODEC_ERROR -16 116 +#define GGRAPH_UNSUPPORTED_TIFF_LAYOUT -17 117 +#define GGRAPH_MISSING_GEO_DEFS -18 118 +#define GGRAPH_INVALID_COLOR_RULE -19 119 +#define GGRAPH_INVALID_COLOR_MAP -20 120 +#define GGRAPH_INVALID_SHADED_RELIEF_3ROWS -21 121 +#define GGRAPH_INVALID_PAINT_CONTEXT -22 122 +#define GGRAPH_INVALID_PAINT_BITMAP -23 123 +#define GGRAPH_INVALID_PAINT_BRUSH -24 124 +#define GGRAPH_INVALID_PAINT_FONT -25 125 +#define GGRAPH_INVALID_SVG -26 126 + 127 +#define GGRAPH_TRUE -1 128 +#define GGRAPH_FALSE -2 129 + 130 + typedef struct gaia_graphics_landsat_recalibration 131 + { 132 +/* a struct used for Landsat Radiometric Recalibration */ 133 + double sun_distance; /* Earth-Sun distance (in AU) */ 134 + double sun_elevation; /* Sun elevation (in degrees) */ 135 +/* RED band params (#3) */ 136 + double lmin_red; /* LMIN (from metafile) */ 137 + double lmax_red; /* LMAX (from metafile) */ 138 + double qcalmin_red; /* QCALMIN (from metafile) */ 139 + double qcalmax_red; /* QCALMAX (from metafile) */ 140 + int is_gain_low_red; /* GAIN LOW (1=yes 0=no) (from metafile) */ 141 + double spectral_irradiance_red; /* SPECTRAL IRRADIANCE constant */ 142 + double low_gain_factor_red; /* LOW GAIN multiplicator */ 143 + double high_gain_factor_red; /* HIGH GAIN multiplicator */ 144 + unsigned char recalibration_min_red; /* color recalibration MIN DN [0-255] */ 145 + unsigned char recalibration_max_red; /* color recalibration MAX DN [0-255] */ 146 +/* GREEN band params (#2) */ 147 + double lmin_green; /* same as RED band */ 148 + double lmax_green; 149 + double qcalmin_green; 150 + double qcalmax_green; 151 + int is_gain_low_green; 152 + double spectral_irradiance_green; 153 + double low_gain_factor_green; 154 + double high_gain_factor_green; 155 + unsigned char recalibration_min_green; 156 + unsigned char recalibration_max_green; 157 +/* BLUE band params (#1) */ 158 + double lmin_blue; /* same as RED band */ 159 + double lmax_blue; 160 + double qcalmin_blue; 161 + double qcalmax_blue; 162 + int is_gain_low_blue; 163 + double spectral_irradiance_blue; 164 + double low_gain_factor_blue; 165 + double high_gain_factor_blue; 166 + unsigned char recalibration_min_blue; 167 + unsigned char recalibration_max_blue; 168 +/* PANCHRO band params (#8) */ 169 + double lmin_panchro; /* same as RED band */ 170 + double lmax_panchro; 171 + double qcalmin_panchro; 172 + double qcalmax_panchro; 173 + int is_gain_low_panchro; 174 + double spectral_irradiance_panchro; 175 + double low_gain_factor_panchro; 176 + double high_gain_factor_panchro; 177 + unsigned char recalibration_min_panchro; 178 + unsigned char recalibration_max_panchro; 179 + } gGraphLandsatRecalibration; 180 + typedef gGraphLandsatRecalibration *gGraphLandsatRecalibrationPtr; 181 + 182 + GGRAPH_DECLARE int gGraphCreateContext (int width, int height, 183 + const void **context); 184 + GGRAPH_DECLARE int gGraphDestroyContext (const void *context); 185 + GGRAPH_DECLARE int gGraphCreateSvgContext (const char *path, int width, 186 + int height, 187 + const void **context); 188 + GGRAPH_DECLARE int gGraphDestroySvgContext (const void *context); 189 + GGRAPH_DECLARE int gGraphCreatePdfContext (const char *path, int page_width, 190 + int page_height, int width, 191 + int height, 192 + const void **context); 193 + GGRAPH_DECLARE int gGraphDestroyPdfContext (const void *context); 194 + GGRAPH_DECLARE int gGraphSetPen (const void *context, unsigned char red, 195 + unsigned char green, unsigned char blue, 196 + unsigned char alpha, double width, 197 + int style); 198 + GGRAPH_DECLARE int gGraphSetBrush (const void *context, unsigned char red, 199 + unsigned char green, unsigned char blue, 200 + unsigned char alpha); 201 + GGRAPH_DECLARE int gGraphSetLinearGradientBrush (const void *context, 202 + double x, double y, 203 + double width, 204 + double height, 205 + unsigned char red1, 206 + unsigned char green1, 207 + unsigned char blue1, 208 + unsigned char alpha1, 209 + unsigned char red2, 210 + unsigned char green2, 211 + unsigned char blue2, 212 + unsigned char alpha2); 213 + GGRAPH_DECLARE int gGraphSetPatternBrush (const void *context, 214 + const void *brush); 215 + GGRAPH_DECLARE int gGraphSetFont (const void *context, const void *font); 216 + GGRAPH_DECLARE int gGraphFillPath (const void *context, int preserve); 217 + GGRAPH_DECLARE int gGraphStrokePath (const void *context, int preserve); 218 + GGRAPH_DECLARE int gGraphMoveToPoint (const void *context, double x, 219 + double y); 220 + GGRAPH_DECLARE int gGraphAddLineToPath (const void *context, double x, 221 + double y); 222 + GGRAPH_DECLARE int gGraphCloseSubpath (const void *context); 223 + GGRAPH_DECLARE int gGraphStrokeLine (const void *context, double x0, 224 + double y0, double x1, double y1); 225 + GGRAPH_DECLARE int gGraphDrawEllipse (const void *context, double x, 226 + double y, double width, 227 + double height); 228 + GGRAPH_DECLARE int gGraphDrawRectangle (const void *context, double x, 229 + double y, double width, 230 + double height); 231 + GGRAPH_DECLARE int gGraphDrawRoundedRectangle (const void *context, 232 + double x, double y, 233 + double width, double height, 234 + double radius); 235 + GGRAPH_DECLARE int gGraphDrawCircleSector (const void *context, 236 + double center_x, double center_y, 237 + double radius, double from_angle, 238 + double to_angle); 239 + GGRAPH_DECLARE int gGraphGetTextExtent (const void *context, 240 + const char *text, double *pre_x, 241 + double *pre_y, double *width, 242 + double *height, double *post_x, 243 + double *post_y); 244 + GGRAPH_DECLARE int gGraphDrawText (const void *context, const char *text, 245 + double x, double y, double angle); 246 + GGRAPH_DECLARE int gGraphGetContextRgbArray (const void *context, 247 + unsigned char **rgbArray); 248 + GGRAPH_DECLARE int gGraphGetContextAlphaArray (const void *context, 249 + unsigned char **alphaArray); 250 + GGRAPH_DECLARE int gGraphDrawBitmap (const void *context, 251 + const void *bitmap, int x, int y); 252 + GGRAPH_DECLARE int gGraphCreateBitmap (unsigned char *rgbaArray, int width, 253 + int height, const void **bitmap); 254 + GGRAPH_DECLARE int gGraphDestroyBitmap (const void *bitmap); 255 + GGRAPH_DECLARE int gGraphCreateBrush (unsigned char *rgbaArray, int width, 256 + int height, const void **brush); 257 + GGRAPH_DECLARE int gGraphDestroyBrush (const void *brush); 258 + GGRAPH_DECLARE int gGraphCreateFont (double size, int style, int weight, 259 + const void **font); 260 + GGRAPH_DECLARE int gGraphDestroyFont (const void *font); 261 + GGRAPH_DECLARE int gGraphFontSetColor (const void *font, unsigned char red, 262 + unsigned char green, 263 + unsigned char blue, 264 + unsigned char alpha); 265 + GGRAPH_DECLARE int gGraphFontSetOutline (const void *font, double width); 266 + 267 +/* 268 +/ image access methods 269 +*/ 270 + GGRAPH_DECLARE const void *gGraphCreateRgbImage (int width, int height); 271 + GGRAPH_DECLARE const void *gGraphCreateRgbImageFromBitmap (unsigned char 272 + *bitmap, 273 + int width, 274 + int height); 275 + GGRAPH_DECLARE const void *gGraphCreateRgbaImage (int width, int height); 276 + GGRAPH_DECLARE const void *gGraphCreateGrayscaleImage (int width, 277 + int height); 278 + GGRAPH_DECLARE const void *gGraphCreatePaletteImage (int width, int height); 279 + GGRAPH_DECLARE const void *gGraphCreateMonochromeImage (int width, 280 + int height); 281 + GGRAPH_DECLARE const void *gGraphCreateGridInt16Image (int width, 282 + int height); 283 + GGRAPH_DECLARE const void *gGraphCreateGridUInt16Image (int width, 284 + int height); 285 + GGRAPH_DECLARE const void *gGraphCreateGridInt32Image (int width, 286 + int height); 287 + GGRAPH_DECLARE const void *gGraphCreateGridUInt32Image (int width, 288 + int height); 289 + GGRAPH_DECLARE const void *gGraphCreateGridFloatImage (int width, 290 + int height); 291 + GGRAPH_DECLARE const void *gGraphCreateGridDoubleImage (int width, 292 + int height); 293 + GGRAPH_DECLARE int gGraphImageBackgroundFill (const void *img, 294 + unsigned char red, 295 + unsigned char green, 296 + unsigned char blue, 297 + unsigned char alpha); 298 + GGRAPH_DECLARE int gGraphImageSetTransparentColor (const void *img, 299 + unsigned char red, 300 + unsigned char green, 301 + unsigned char blue); 302 + GGRAPH_DECLARE int gGraphImageGetTransparentColor (const void *img, 303 + unsigned char *red, 304 + unsigned char *green, 305 + unsigned char *blue); 306 + GGRAPH_DECLARE int gGraphGridBackgroundFill (const void *img, 307 + double no_data_value); 308 + GGRAPH_DECLARE int gGraphImageSetNoDataValue (const void *img, 309 + double no_data_vale); 310 + GGRAPH_DECLARE int gGraphImageGetNoDataValue (const void *img, 311 + double *no_data_value); 312 + GGRAPH_DECLARE void gGraphDestroyImage (const void *img); 313 + GGRAPH_DECLARE void gGraphDestroyImageInfos (const void *img); 314 + GGRAPH_DECLARE int gGraphGetImageDims (const void *img, int *width, 315 + int *height); 316 + GGRAPH_DECLARE int gGraphGetImageInfos (const void *img, int *width, 317 + int *height, int *colorspace, 318 + int *max_palette, 319 + int *bits_per_sample, 320 + int *samples_per_pixel, 321 + int *sample_format, int *tile_width, 322 + int *tile_height, 323 + int *rows_per_strip, 324 + int *compression, 325 + double *no_data_value, 326 + double *min_value, 327 + double *max_value, int *scale_1_2, 328 + int *scale_1_4, int *scale_1_8); 329 + GGRAPH_DECLARE int gGraphGetImageSize (const void *img, int *size); 330 + GGRAPH_DECLARE int gGraphImageColorSpaceOptimize (const void *img); 331 + GGRAPH_DECLARE int gGraphImageResampleAsRgb (const void *img); 332 + GGRAPH_DECLARE int gGraphImageResampleAsMonochrome (const void *img); 333 + GGRAPH_DECLARE int gGraphImageResampleAsPalette (const void *img, 334 + int num_colors); 335 + GGRAPH_DECLARE int gGraphImageResampleAsGrayscale (const void *img); 336 + GGRAPH_DECLARE int gGraphImageResampleAsPhotographic (const void *img); 337 + GGRAPH_DECLARE int gGraphImageResampleAsGridInt16 (const void *img); 338 + GGRAPH_DECLARE int gGraphImageResampleAsGridUInt16 (const void *img); 339 + GGRAPH_DECLARE int gGraphImageResampleAsGridInt32 (const void *img); 340 + GGRAPH_DECLARE int gGraphImageResampleAsGridUInt32 (const void *img); 341 + GGRAPH_DECLARE int gGraphImageResampleAsGridFloat (const void *img); 342 + GGRAPH_DECLARE int gGraphImageResampleAsGridDouble (const void *img); 343 + GGRAPH_DECLARE int gGraphImageTransparentResample (const void *img); 344 + GGRAPH_DECLARE int gGraphImageGuessFormat (const void *mem_buf, 345 + int mem_buf_size); 346 + GGRAPH_DECLARE int gGraphFileImageGuessFormat (const char *path, int *type); 347 + 348 +/* 349 +/ the following methods return a copy of the internal image buffer 350 +/ PLEASE NOTE: you are responsible to free() the returned memory block 351 +*/ 352 + GGRAPH_DECLARE int gGraphImageBufferReferenceRGB (const void *img, 353 + unsigned char **buffer); 354 + GGRAPH_DECLARE int gGraphImageBufferReferenceRGBA (const void *img, 355 + unsigned char **buffer); 356 + GGRAPH_DECLARE int gGraphImageBufferReferenceARGB (const void *img, 357 + unsigned char **buffer); 358 + GGRAPH_DECLARE int gGraphImageBufferReferenceBGR (const void *img, 359 + unsigned char **buffer); 360 + GGRAPH_DECLARE int gGraphImageBufferReferenceBGRA (const void *img, 361 + unsigned char **buffer); 362 + 363 +/* 364 +/ image resizing / image subsetting 365 +*/ 366 + GGRAPH_DECLARE int gGraphImageResizeNormal (const void *orig, 367 + const void **dest, int width, 368 + int height); 369 + GGRAPH_DECLARE int gGraphImageResizeHighQuality (const void *orig, 370 + const void **dest, 371 + int width, int height); 372 + GGRAPH_DECLARE int gGraphImageResizeToResolution (const void *orig, 373 + const void **dest, 374 + double pixel_x_size, 375 + double pixel_y_size, 376 + int *width, int *height); 377 + GGRAPH_DECLARE int gGraphImageSubSet (const void *orig, const void **dest, 378 + int upper_left_x, int upper_left_y, 379 + int width, int height); 380 + 381 +/* 382 +/ utility functions handling image georeferencing 383 +*/ 384 + GGRAPH_DECLARE int gGraphGetWorldFilePath (const char *main_path, 385 + char *world_file_path); 386 + 387 + GGRAPH_DECLARE int gGraphCheckHgtPath (const char *path, int *lat, 388 + int *lon); 389 + GGRAPH_DECLARE int gGraphCheckBinPath (const char *path, char *hdr_path, 390 + int dont_test); 391 + GGRAPH_DECLARE int gGraphCheckFltPath (const char *path, char *hdr_path, 392 + int dont_test); 393 + GGRAPH_DECLARE int gGraphCheckDemPath (const char *path, char *hdr_path, 394 + int dont_test); 395 + GGRAPH_DECLARE int gGraphCheckAscPath (const char *path); 396 + 397 + GGRAPH_DECLARE int gGraphImageIsGeoRef (const void *img); 398 + GGRAPH_DECLARE int gGraphImageSetGeoRef (const void *img, int srid, 399 + const char *srs_name, 400 + const char *proj4text, 401 + double upper_left_x, 402 + double upper_left_y, 403 + double pixel_x_size, 404 + double pixel_y_size); 405 + GGRAPH_DECLARE int gGraphImageGetGeoRef (const void *img, int *srid, 406 + char *srs_name, 407 + char *proj4text, 408 + double *upper_left_x, 409 + double *upper_left_y, 410 + double *pixel_x_size, 411 + double *pixel_y_size); 412 + GGRAPH_DECLARE int gGraphImageInfosGetGeoRef (const void *img, 413 + int *srid, 414 + char *srs_name, 415 + char *proj4text, 416 + double *upper_left_x, 417 + double *upper_left_y, 418 + double *pixel_x_size, 419 + double *pixel_y_size); 420 + GGRAPH_DECLARE int gGraphReadWorldFile (const char *path, 421 + double *upper_left_x, 422 + double *upper_left_y, 423 + double *pixel_x_size, 424 + double *pixel_y_size); 425 + 426 +/* 427 +/ utility functions returning an image 428 +*/ 429 + GGRAPH_DECLARE int gGraphImageFromFile (const char *path, int image_type, 430 + const void **image_handle, 431 + int scale); 432 + GGRAPH_DECLARE int gGraphImageFromMemBuf (const void *mem_buf, 433 + int mem_buf_size, int image_type, 434 + const void **image_handle, 435 + int scale); 436 + 437 +/* 438 +/ utility functions returning image infos 439 +*/ 440 + GGRAPH_DECLARE int gGraphImageInfosFromHgtFile (const char *path, 441 + int lat, int lon, 442 + const void **infos_handle); 443 + GGRAPH_DECLARE int gGraphImageInfosFromBinFile (const char *path, 444 + const char *hdr_path, 445 + const void **infos_handle); 446 + GGRAPH_DECLARE int gGraphImageInfosFromFltFile (const char *path, 447 + const char *hdr_path, 448 + const void **infos_handle); 449 + GGRAPH_DECLARE int gGraphImageInfosFromDemFile (const char *path, 450 + const char *hdr_path, 451 + const void **infos_handle); 452 + GGRAPH_DECLARE int gGraphImageInfosFromAscFile (const char *path, 453 + const void **infos_handle); 454 + GGRAPH_DECLARE int gGraphImageInfosFromFile (const char *path, 455 + int image_type, 456 + const void **infos_handle); 457 + GGRAPH_DECLARE int gGraphImageInfosFromMemBuf (const void *mem_buf, 458 + int mem_buf_size, 459 + int image_type, 460 + const void **infos_handle); 461 + 462 +/* 463 +/ utility functions generating a file from an image 464 +*/ 465 + GGRAPH_DECLARE int gGraphImageToJpegFile (const void *img, const char *path, 466 + int quality); 467 + GGRAPH_DECLARE int gGraphImageToPngFile (const void *img, const char *path, 468 + int compression_level, 469 + int quantization_factor, 470 + int interlaced); 471 + GGRAPH_DECLARE int gGraphImageToGifFile (const void *img, const char *path); 472 + 473 +/* 474 +/ utility functions generating a memory buffer from an image 475 +*/ 476 + GGRAPH_DECLARE int gGraphImageToJpegMemBuf (const void *img, void **mem_buf, 477 + int *mem_buf_size, 478 + int jpeg_quality); 479 + GGRAPH_DECLARE int gGraphImageToPngMemBuf (const void *img, void **mem_buf, 480 + int *mem_buf_size, 481 + int compression_level, 482 + int quantization_factor, 483 + int interlaced, 484 + int is_transparent); 485 + GGRAPH_DECLARE int gGraphImageToGifMemBuf (const void *img, void **mem_buf, 486 + int *mem_buf_size, 487 + int is_transparent); 488 + 489 +/* 490 +/ utility functions handling Adam7 and Monochrome encoding 491 +*/ 492 + GGRAPH_DECLARE int gGraphImageToAdam7 (const void *img, void *mem_bufs[7], 493 + int mem_buf_sizes[7], void **palette, 494 + int *palette_size); 495 + GGRAPH_DECLARE int gGraphImageFromAdam7 (void *mem_bufs[7], 496 + int mem_buf_sizes[7], 497 + void *palette, int palette_size, 498 + const void **image_handle, 499 + int scale); 500 + GGRAPH_DECLARE int gGraphImageToMonochrome (const void *img, void **mem_buf, 501 + int *mem_buf_size); 502 + GGRAPH_DECLARE int gGraphImageFromMonochrome (const void *mem_buf, 503 + int mem_buf_size, 504 + const void **image_handle); 505 + 506 +/* 507 +/ functions for RAW image handling 508 +*/ 509 + GGRAPH_DECLARE int gGraphImageFromRawMemBuf (const void *mem_buf, 510 + int mem_buf_size, 511 + const void **image_handle); 512 + GGRAPH_DECLARE int gGraphIsRawImage (const void *mem_buf, int mem_buf_size); 513 + 514 +/* 515 +/ methods accessing a file-based Image by Strips 516 +*/ 517 + GGRAPH_DECLARE int gGraphImageFromHgtFileByStrips (const char *path, 518 + int lat, int lon, 519 + const void 520 + **strip_handle); 521 + GGRAPH_DECLARE int gGraphImageFromBinFileByStrips (const char *path, 522 + const char *hdr_path, 523 + const void 524 + **strip_handle); 525 + GGRAPH_DECLARE int gGraphImageFromFltFileByStrips (const char *path, 526 + const char *hdr_path, 527 + const void 528 + **strip_handle); 529 + GGRAPH_DECLARE int gGraphImageFromDemFileByStrips (const char *path, 530 + const char *hdr_path, 531 + const void 532 + **strip_handle); 533 + GGRAPH_DECLARE int gGraphImageFromAscFileByStrips (const char *path, 534 + const void 535 + **strip_handle); 536 + GGRAPH_DECLARE int gGraphImageFromFileByStrips (const char *path, 537 + int image_type, 538 + const void **strip_handle); 539 + GGRAPH_DECLARE int gGraphReadNextStrip (const void *strip_handle, 540 + int *progress); 541 + 542 + GGRAPH_DECLARE int gGraphImageToJpegFileByStrips (const void **strip_handle, 543 + const char *path, 544 + int width, int height, 545 + int color_model, 546 + int quality); 547 + GGRAPH_DECLARE int gGraphImageToPngFileByStrips (const void **strip_handle, 548 + const char *path, 549 + int width, int height, 550 + int color_model, 551 + int bits_per_sample, 552 + int num_palette, 553 + unsigned char *red, 554 + unsigned char *green, 555 + unsigned char *blue, 556 + int compression_level, 557 + int quantization_factor); 558 + GGRAPH_DECLARE int gGraphImageToTiffFileByStrips (const void **strip_handle, 559 + const char *path, 560 + int width, int height, 561 + int color_model, 562 + int is_tiled, 563 + int tile_width, 564 + int tile_height, 565 + int rows_per_strip, 566 + int bits_per_sample, 567 + int sample_format, 568 + int num_palette, 569 + unsigned char *red, 570 + unsigned char *green, 571 + unsigned char *blue, 572 + int compression); 573 + GGRAPH_DECLARE int gGraphImageToGeoTiffFileByStrips (const void 574 + **strip_handle, 575 + const char *path, 576 + int width, int height, 577 + int color_model, 578 + int is_tiled, 579 + int tile_width, 580 + int tile_height, 581 + int rows_per_strip, 582 + int bits_per_sample, 583 + int sample_format, 584 + int num_palette, 585 + unsigned char *red, 586 + unsigned char *green, 587 + unsigned char *blue, 588 + int compression, 589 + int srid, 590 + const char *srs_name, 591 + const char *proj4text, 592 + double upper_left_x, 593 + double upper_left_y, 594 + double pixel_x_size, 595 + double pixel_y_size); 596 + GGRAPH_DECLARE int gGraphImageToBinHdrFileByStrips (const void 597 + **strip_handle, 598 + const char *path, 599 + int width, int height, 600 + int bits_per_sample, 601 + double upper_left_x, 602 + double upper_left_y, 603 + double pixel_x_size, 604 + double pixel_y_size, 605 + double no_data_value); 606 + GGRAPH_DECLARE int gGraphImageToFltHdrFileByStrips (const void 607 + **strip_handle, 608 + const char *path, 609 + int width, int height, 610 + int bits_per_sample, 611 + double upper_left_x, 612 + double upper_left_y, 613 + double pixel_x_size, 614 + double pixel_y_size, 615 + double no_data_value); 616 + GGRAPH_DECLARE int gGraphImageToAscFileByStrips (const void **strip_handle, 617 + const char *path, 618 + int width, int height, 619 + int sample, 620 + int bits_per_sample, 621 + double upper_left_x, 622 + double upper_left_y, 623 + double pixel_x_size, 624 + double pixel_y_size, 625 + double no_data_value); 626 + GGRAPH_DECLARE int gGraphWriteNextStrip (const void *strip_handle, 627 + int *progress); 628 + GGRAPH_DECLARE int gGraphWriteBinHeader (const char *hdr_path, 629 + const void *strip_handle); 630 + GGRAPH_DECLARE int gGraphWriteFltHeader (const char *hdr_path, 631 + const void *strip_handle); 632 + 633 + GGRAPH_DECLARE int gGraphStripImageClonePalette (const void *strip_handle, 634 + int *color_model, 635 + int *num_palette, 636 + unsigned char *red, 637 + unsigned char *green, 638 + unsigned char *blue); 639 + GGRAPH_DECLARE int gGraphStripImageAllocPixels (const void *strip_handle, 640 + int rows_per_block); 641 + GGRAPH_DECLARE int gGraphStripImageEOF (const void *strip_handle); 642 + GGRAPH_DECLARE int gGraphStripImageCopyPixels (const void *in_strip_handle, 643 + const void 644 + *out_strip_handle); 645 + GGRAPH_DECLARE int gGraphStripImageRenderGridPixels (const void 646 + *in_strip_handle, 647 + const void 648 + *out_strip_handle, 649 + const void 650 + *color_map_handle, 651 + int num_threads); 652 + GGRAPH_DECLARE int gGraphStripImageSubSetPixels (const void 653 + *in_strip_handle, 654 + const void 655 + *out_strip_handle, 656 + int start_from, int row); 657 + GGRAPH_DECLARE int gGraphStripImageGetNextRow (const void *in_strip_handle, 658 + int *next_row); 659 + GGRAPH_DECLARE int gGraphStripIsFull (const void *in_strip_handle); 660 + GGRAPH_DECLARE int gGraphGetStripImageMinMaxValue (const void 661 + *in_strip_handle, 662 + double *min_value, 663 + double *max_value, 664 + double no_data_value); 665 + 666 + GGRAPH_DECLARE int gGraphStripImageRewind (const void *in_strip_handle); 667 + GGRAPH_DECLARE int gGraphStripImageGetCurrentRows (const void 668 + *in_strip_handle, 669 + int *rows); 670 + GGRAPH_DECLARE int gGraphStripImageSetCurrentRows (const void 671 + *in_strip_handle, 672 + int rows); 673 + GGRAPH_DECLARE int gGraphStripImageGetPixelRGB (const void *in_strip_handle, 674 + int col, int row, 675 + unsigned char *red, 676 + unsigned char *green, 677 + unsigned char *blue); 678 + GGRAPH_DECLARE int gGraphStripImageSetPixelRGB (const void *in_strip_handle, 679 + int col, int row, 680 + unsigned char red, 681 + unsigned char green, 682 + unsigned char blue); 683 + 684 + GGRAPH_DECLARE int gGraphCountColors (const char *path, int image_type, 685 + int rows_per_block); 686 + GGRAPH_DECLARE void gGraphSmartPrintf (double value, char *buf); 687 + 688 + GGRAPH_DECLARE int gGraphColorRuleFromFile (const char *path, 689 + const void **color_rule); 690 + GGRAPH_DECLARE int gGraphColorRuleFromMemBuf (char *buf, 691 + const void **color_rule); 692 + GGRAPH_DECLARE void gGraphDestroyColorRule (const void *color_rule); 693 + GGRAPH_DECLARE int gGraphIsColorRuleRelative (const void *color_rule, 694 + int *relative); 695 + GGRAPH_DECLARE int gGraphCreateColorMapAbsolute (const void *color_rule, 696 + unsigned char 697 + background_red, 698 + unsigned char 699 + background_green, 700 + unsigned char 701 + background_blue, 702 + const void **color_map); 703 + GGRAPH_DECLARE int gGraphCreateColorMapRelative (const void *color_rule, 704 + double min, double max, 705 + unsigned char 706 + background_red, 707 + unsigned char 708 + background_green, 709 + unsigned char 710 + background_blue, 711 + const void **color_map); 712 + GGRAPH_DECLARE void gGraphDestroyColorMap (const void *color_map); 713 + 714 + GGRAPH_DECLARE int gGraphCreateShadedReliefTripleRow (int width, 715 + unsigned char 716 + background_red, 717 + unsigned char 718 + background_green, 719 + unsigned char 720 + background_blue, 721 + double no_data, 722 + const void 723 + *color_map_handle, 724 + unsigned char 725 + mono_red, 726 + unsigned char 727 + mono_green, 728 + unsigned char 729 + mono_blue, 730 + double z_factor, 731 + double scale_factor, 732 + double azimuth, 733 + double altitude, 734 + const void 735 + **triple_row_handle); 736 + GGRAPH_DECLARE void gGraphDestroyShadedReliefTripleRow (const void 737 + *triple_row_handle); 738 + 739 + GGRAPH_DECLARE int gGraphShadedReliefRenderPixels (const void 740 + *triple_row_handle, 741 + int num_threads, 742 + int *out_row_ready); 743 + GGRAPH_DECLARE int gGraphStripImageGetShadedReliefScanline (const void 744 + *in_img_handle, 745 + int row_index, 746 + const void 747 + *triple_row_handle); 748 + GGRAPH_DECLARE int gGraphStripImageSetShadedReliefScanline (const void 749 + *triple_row_handle, 750 + const void 751 + *out_img_handle, 752 + int row_index); 753 + GGRAPH_DECLARE int gGraphLandsatRGB (const void *img_red, 754 + const void *img_green, 755 + const void *img_blue, 756 + const void *img_rgb, int width, 757 + int num_rows, 758 + gGraphLandsatRecalibrationPtr params, 759 + int num_threads); 760 + GGRAPH_DECLARE int gGraphLandsatBW (const void *img_in, const void *img_out, 761 + int width, int num_rows, 762 + gGraphLandsatRecalibrationPtr params, 763 + int num_threads); 764 + GGRAPH_DECLARE int gGraphGetLandsatSceneExtent (const void *img_in, 765 + int base_row, double *top_x, 766 + double *top_y, 767 + double *bottom_x, 768 + double *bottom_y, 769 + double *left_x, 770 + double *left_y, 771 + double *right_x, 772 + double *right_y); 773 + GGRAPH_DECLARE int gGraphLandsatMergePixels (const void *img_in, 774 + int base_row, 775 + const void *img_out); 776 + GGRAPH_DECLARE int gGraphOutputPixelsToStripImage (const void *img_in, 777 + const void *img_out, 778 + int in_row, int out_row); 779 + GGRAPH_DECLARE int gGraphInputPixelsFromStripImage (const void *img_in, 780 + const void *img_out, 781 + int in_col); 782 + GGRAPH_DECLARE int gGraphGeoMergePixels (const void *img_in, 783 + const void *img_out); 784 + GGRAPH_DECLARE int gGraphImageFromStripImage (const void *img_in, 785 + int color_space, 786 + int sample_format, 787 + int bits_per_sample, 788 + int samples_per_pixel, 789 + int start_line, 790 + const void **img_out); 791 + 792 +/* SVG images */ 793 + GGRAPH_DECLARE int gGraphCreateSVG (const unsigned char *svg_document, 794 + int svg_bytes, void **svg_handle); 795 + GGRAPH_DECLARE int gGraphGetSVGDims (void *svg_handle, double *width, 796 + double *height); 797 + GGRAPH_DECLARE int gGraphImageFromSVG (void *handle, double size, 798 + const void **img_out); 799 + GGRAPH_DECLARE int gGraphFreeSVG (void *sgv_handle); 800 + 801 +#ifdef __cplusplus 802 +} 803 +#endif 804 + 805 +#endif /* _GGRAPH_H */
Added headers/gaiagraphics_internals.h.
1 +/* 2 +/ GGRAPH_internals.h 3 +/ 4 +/ internal declarations 5 +/ 6 +/ version 1.0, 2010 July 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2010 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <cairo/cairo.h> 28 +#include <cairo/cairo-svg.h> 29 +#include <cairo/cairo-pdf.h> 30 + 31 +#ifdef _WIN32 32 +#ifdef DLL_EXPORT 33 +#define GGRAPH_PRIVATE 34 +#else 35 +#define GGRAPH_PRIVATE 36 +#endif 37 +#else 38 +#define GGRAPH_PRIVATE __attribute__ ((visibility("hidden"))) 39 +#endif 40 + 41 +#define GG_IMAGE_JPEG_RGB 100 42 +#define GG_IMAGE_JPEG_BW 101 43 +#define GG_IMAGE_TIFF_FAX4 102 44 +#define GG_IMAGE_TIFF_PALETTE 103 45 +#define GG_IMAGE_TIFF_GRAYSCALE 104 46 +#define GG_IMAGE_TIFF_RGB 105 47 +#define GG_IMAGE_PNG_PALETTE 106 48 +#define GG_IMAGE_PNG_GRAYSCALE 107 49 +#define GG_IMAGE_PNG_RGB 108 50 +#define GG_IMAGE_GIF_PALETTE 109 51 + 52 +#define GG_PIXEL_UNKNOWN -200 53 +#define GG_PIXEL_RGB 201 54 +#define GG_PIXEL_RGBA 202 55 +#define GG_PIXEL_ARGB 203 56 +#define GG_PIXEL_BGR 204 57 +#define GG_PIXEL_BGRA 205 58 +#define GG_PIXEL_GRAYSCALE 206 59 +#define GG_PIXEL_PALETTE 207 60 +#define GG_PIXEL_GRID 208 61 + 62 +#define GG_TARGET_IS_MEMORY 2001 63 +#define GG_TARGET_IS_FILE 2002 64 + 65 +#define GG_IMAGE_MAGIC_SIGNATURE 65391 66 +#define GG_IMAGE_INFOS_MAGIC_SIGNATURE 37183 67 +#define GG_STRIP_IMAGE_MAGIC_SIGNATURE 17359 68 +#define GG_COLOR_RULE_MAGIC_SIGNATURE 23713 69 +#define GG_COLOR_MAP_MAGIC_SIGNATURE 27317 70 +#define GG_SHADED_RELIEF_3ROWS_MAGIC_SIGNATURE 18573 71 + 72 +#define GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE 1314 73 +#define GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE 1334 74 +#define GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE 1374 75 +#define GG_GRAPHICS_BITMAP_MAGIC_SIGNATURE 5317 76 +#define GG_GRAPHICS_BRUSH_MAGIC_SIGNATURE 2671 77 +#define GG_GRAPHICS_FONT_MAGIC_SIGNATURE 7459 78 +#define GG_GRAPHICS_SVG_MAGIC_SIGNATURE 3265 79 + 80 +/* ADAM7/RAW markers */ 81 +#define GG_MONOCHROME_START 3301 82 +#define GG_MONOCHROME_END 3311 83 +#define GG_ADAM7_PALETTE_START 3901 84 +#define GG_ADAM7_PALETTE_END 3911 85 +#define GG_ADAM7_0_RGB_START 3001 86 +#define GG_ADAM7_0_RGB_END 3011 87 +#define GG_ADAM7_1_RGB_START 3002 88 +#define GG_ADAM7_1_RGB_END 3012 89 +#define GG_ADAM7_2_RGB_START 3003 90 +#define GG_ADAM7_2_RGB_END 3013 91 +#define GG_ADAM7_3_RGB_START 3004 92 +#define GG_ADAM7_3_RGB_END 3014 93 +#define GG_ADAM7_4_RGB_START 3005 94 +#define GG_ADAM7_4_RGB_END 3015 95 +#define GG_ADAM7_5_RGB_START 3006 96 +#define GG_ADAM7_5_RGB_END 3016 97 +#define GG_ADAM7_6_RGB_START 3007 98 +#define GG_ADAM7_6_RGB_END 3017 99 +#define GG_ADAM7_0_GRAYSCALE_START 3101 100 +#define GG_ADAM7_0_GRAYSCALE_END 3111 101 +#define GG_ADAM7_1_GRAYSCALE_START 3102 102 +#define GG_ADAM7_1_GRAYSCALE_END 3112 103 +#define GG_ADAM7_2_GRAYSCALE_START 3103 104 +#define GG_ADAM7_2_GRAYSCALE_END 3113 105 +#define GG_ADAM7_3_GRAYSCALE_START 3104 106 +#define GG_ADAM7_3_GRAYSCALE_END 3114 107 +#define GG_ADAM7_4_GRAYSCALE_START 3105 108 +#define GG_ADAM7_4_GRAYSCALE_END 3115 109 +#define GG_ADAM7_5_GRAYSCALE_START 3106 110 +#define GG_ADAM7_5_GRAYSCALE_END 3116 111 +#define GG_ADAM7_6_GRAYSCALE_START 3107 112 +#define GG_ADAM7_6_GRAYSCALE_END 3117 113 +#define GG_ADAM7_0_PALETTE_START 3201 114 +#define GG_ADAM7_0_PALETTE_END 3211 115 +#define GG_ADAM7_1_PALETTE_START 3202 116 +#define GG_ADAM7_1_PALETTE_END 3212 117 +#define GG_ADAM7_2_PALETTE_START 3203 118 +#define GG_ADAM7_2_PALETTE_END 3213 119 +#define GG_ADAM7_3_PALETTE_START 3204 120 +#define GG_ADAM7_3_PALETTE_END 3214 121 +#define GG_ADAM7_4_PALETTE_START 3205 122 +#define GG_ADAM7_4_PALETTE_END 3215 123 +#define GG_ADAM7_5_PALETTE_START 3206 124 +#define GG_ADAM7_5_PALETTE_END 3216 125 +#define GG_ADAM7_6_PALETTE_START 3207 126 +#define GG_ADAM7_6_PALETTE_END 3217 127 +#define GG_ADAM7_0_INT16_START 3401 128 +#define GG_ADAM7_0_INT16_END 3411 129 +#define GG_ADAM7_1_INT16_START 3402 130 +#define GG_ADAM7_1_INT16_END 3412 131 +#define GG_ADAM7_2_INT16_START 3403 132 +#define GG_ADAM7_2_INT16_END 3413 133 +#define GG_ADAM7_3_INT16_START 3404 134 +#define GG_ADAM7_3_INT16_END 3414 135 +#define GG_ADAM7_4_INT16_START 3405 136 +#define GG_ADAM7_4_INT16_END 3415 137 +#define GG_ADAM7_5_INT16_START 3406 138 +#define GG_ADAM7_5_INT16_END 3416 139 +#define GG_ADAM7_6_INT16_START 3407 140 +#define GG_ADAM7_6_INT16_END 3417 141 +#define GG_ADAM7_0_UINT16_START 3501 142 +#define GG_ADAM7_0_UINT16_END 3511 143 +#define GG_ADAM7_1_UINT16_START 3502 144 +#define GG_ADAM7_1_UINT16_END 3512 145 +#define GG_ADAM7_2_UINT16_START 3503 146 +#define GG_ADAM7_2_UINT16_END 3513 147 +#define GG_ADAM7_3_UINT16_START 3504 148 +#define GG_ADAM7_3_UINT16_END 3514 149 +#define GG_ADAM7_4_UINT16_START 3505 150 +#define GG_ADAM7_4_UINT16_END 3515 151 +#define GG_ADAM7_5_UINT16_START 3506 152 +#define GG_ADAM7_5_UINT16_END 3516 153 +#define GG_ADAM7_6_UINT16_START 3507 154 +#define GG_ADAM7_6_UINT16_END 3517 155 +#define GG_ADAM7_0_INT32_START 3501 156 +#define GG_ADAM7_0_INT32_END 3511 157 +#define GG_ADAM7_1_INT32_START 3502 158 +#define GG_ADAM7_1_INT32_END 3512 159 +#define GG_ADAM7_2_INT32_START 3503 160 +#define GG_ADAM7_2_INT32_END 3513 161 +#define GG_ADAM7_3_INT32_START 3504 162 +#define GG_ADAM7_3_INT32_END 3514 163 +#define GG_ADAM7_4_INT32_START 3505 164 +#define GG_ADAM7_4_INT32_END 3515 165 +#define GG_ADAM7_5_INT32_START 3506 166 +#define GG_ADAM7_5_INT32_END 3516 167 +#define GG_ADAM7_6_INT32_START 3507 168 +#define GG_ADAM7_6_INT32_END 3517 169 +#define GG_ADAM7_0_UINT32_START 3601 170 +#define GG_ADAM7_0_UINT32_END 3611 171 +#define GG_ADAM7_1_UINT32_START 3602 172 +#define GG_ADAM7_1_UINT32_END 3612 173 +#define GG_ADAM7_2_UINT32_START 3603 174 +#define GG_ADAM7_2_UINT32_END 3613 175 +#define GG_ADAM7_3_UINT32_START 3604 176 +#define GG_ADAM7_3_UINT32_END 3614 177 +#define GG_ADAM7_4_UINT32_START 3605 178 +#define GG_ADAM7_4_UINT32_END 3615 179 +#define GG_ADAM7_5_UINT32_START 3606 180 +#define GG_ADAM7_5_UINT32_END 3616 181 +#define GG_ADAM7_6_UINT32_START 3607 182 +#define GG_ADAM7_6_UINT32_END 3617 183 +#define GG_ADAM7_0_FLOAT_START 3701 184 +#define GG_ADAM7_0_FLOAT_END 3711 185 +#define GG_ADAM7_1_FLOAT_START 3702 186 +#define GG_ADAM7_1_FLOAT_END 3712 187 +#define GG_ADAM7_2_FLOAT_START 3703 188 +#define GG_ADAM7_2_FLOAT_END 3713 189 +#define GG_ADAM7_3_FLOAT_START 3704 190 +#define GG_ADAM7_3_FLOAT_END 3714 191 +#define GG_ADAM7_4_FLOAT_START 3705 192 +#define GG_ADAM7_4_FLOAT_END 3715 193 +#define GG_ADAM7_5_FLOAT_START 3706 194 +#define GG_ADAM7_5_FLOAT_END 3716 195 +#define GG_ADAM7_6_FLOAT_START 3707 196 +#define GG_ADAM7_6_FLOAT_END 3717 197 +#define GG_ADAM7_0_DOUBLE_START 3801 198 +#define GG_ADAM7_0_DOUBLE_END 3811 199 +#define GG_ADAM7_1_DOUBLE_START 3802 200 +#define GG_ADAM7_1_DOUBLE_END 3812 201 +#define GG_ADAM7_2_DOUBLE_START 3803 202 +#define GG_ADAM7_2_DOUBLE_END 3813 203 +#define GG_ADAM7_3_DOUBLE_START 3804 204 +#define GG_ADAM7_3_DOUBLE_END 3814 205 +#define GG_ADAM7_4_DOUBLE_START 3805 206 +#define GG_ADAM7_4_DOUBLE_END 3815 207 +#define GG_ADAM7_5_DOUBLE_START 3806 208 +#define GG_ADAM7_5_DOUBLE_END 3816 209 +#define GG_ADAM7_6_DOUBLE_START 3807 210 +#define GG_ADAM7_6_DOUBLE_END 3817 211 + 212 +/* SVG constants */ 213 +#define GG_SVG_UNKNOWN 0 214 + 215 +/* SVG basic shapes */ 216 +#define GG_SVG_RECT 1 217 +#define GG_SVG_CIRCLE 2 218 +#define GG_SVG_ELLIPSE 3 219 +#define GG_SVG_LINE 4 220 +#define GG_SVG_POLYLINE 5 221 +#define GG_SVG_POLYGON 6 222 +#define GG_SVG_PATH 7 223 + 224 +/* SVG transformations */ 225 +#define GG_SVG_MATRIX 8 226 +#define GG_SVG_TRANSLATE 9 227 +#define GG_SVG_SCALE 10 228 +#define GG_SVG_ROTATE 11 229 +#define GG_SVG_SKEW_X 12 230 +#define GG_SVG_SKEW_Y 13 231 + 232 +/* SVG Path actions */ 233 +#define GG_SVG_MOVE_TO 14 234 +#define GG_SVG_LINE_TO 15 235 +#define GG_SVG_CURVE_3 16 236 +#define GG_SVG_CURVE_4 17 237 +#define GG_SVG_ELLIPT_ARC 18 238 +#define GG_SVG_CLOSE_PATH 19 239 + 240 +/* SGV Items */ 241 +#define GG_SVG_ITEM_GROUP 20 242 +#define GG_SVG_ITEM_SHAPE 21 243 +#define GG_SVG_ITEM_USE 22 244 +#define GG_SVG_ITEM_CLIP 23 245 + 246 +/* SVG Gradients */ 247 +#define GG_SVG_LINEAR_GRADIENT 24 248 +#define GG_SVG_RADIAL_GRADIENT 25 249 +#define GG_SVG_USER_SPACE 26 250 +#define GG_SVG_BOUNDING_BOX 27 251 + 252 +typedef struct gaia_graphics_image_infos 253 +{ 254 +/* a generic image INFOS */ 255 + int signature; 256 + int width; 257 + int height; 258 + int pixel_format; 259 + int bits_per_sample; 260 + int samples_per_pixel; 261 + int sample_format; 262 + int max_palette; 263 + unsigned char palette_red[256]; 264 + unsigned char palette_green[256]; 265 + unsigned char palette_blue[256]; 266 + int is_transparent; 267 + int tile_width; 268 + int tile_height; 269 + int rows_per_strip; 270 + int compression; 271 + int scale_1_2; 272 + int scale_1_4; 273 + int scale_1_8; 274 + int is_georeferenced; 275 + int srid; 276 + char *srs_name; 277 + char *proj4text; 278 + double upper_left_x; 279 + double upper_left_y; 280 + double pixel_x_size; 281 + double pixel_y_size; 282 + double no_data_value; 283 + double min_value; 284 + double max_value; 285 +} gGraphImageInfos; 286 +typedef gGraphImageInfos *gGraphImageInfosPtr; 287 + 288 +typedef struct gaia_graphics_image 289 +{ 290 +/* a generic image */ 291 + int signature; 292 + unsigned char *pixels; 293 + int width; 294 + int height; 295 + int bits_per_sample; 296 + int samples_per_pixel; 297 + int sample_format; 298 + int scanline_width; 299 + int pixel_size; 300 + int pixel_format; 301 + int max_palette; 302 + unsigned char palette_red[256]; 303 + unsigned char palette_green[256]; 304 + unsigned char palette_blue[256]; 305 + int is_transparent; 306 + unsigned char transparent_red; 307 + unsigned char transparent_green; 308 + unsigned char transparent_blue; 309 + int tile_width; 310 + int tile_height; 311 + int rows_per_strip; 312 + int compression; 313 + int is_georeferenced; 314 + int srid; 315 + char *srs_name; 316 + char *proj4text; 317 + double upper_left_x; 318 + double upper_left_y; 319 + double pixel_x_size; 320 + double pixel_y_size; 321 + double no_data_value; 322 + double min_value; 323 + double max_value; 324 +} gGraphImage; 325 +typedef gGraphImage *gGraphImagePtr; 326 + 327 +typedef struct gaia_graphics_strip_image 328 +{ 329 +/* a file-based image accessed by strips */ 330 + int signature; 331 + FILE *file_handle; 332 + int codec_id; 333 + int rows_per_block; 334 + int current_available_rows; 335 + int next_row; 336 + unsigned char *pixels; 337 + int width; 338 + int height; 339 + int bits_per_sample; 340 + int samples_per_pixel; 341 + int sample_format; 342 + int scanline_width; 343 + int pixel_size; 344 + int pixel_format; 345 + int max_palette; 346 + unsigned char palette_red[256]; 347 + unsigned char palette_green[256]; 348 + unsigned char palette_blue[256]; 349 + int is_transparent; 350 + unsigned char transparent_red; 351 + unsigned char transparent_green; 352 + unsigned char transparent_blue; 353 + int tile_width; 354 + int tile_height; 355 + int rows_per_strip; 356 + int compression; 357 + int is_georeferenced; 358 + int srid; 359 + char *srs_name; 360 + char *proj4text; 361 + double upper_left_x; 362 + double upper_left_y; 363 + double pixel_x_size; 364 + double pixel_y_size; 365 + double no_data_value; 366 + double min_value; 367 + double max_value; 368 + void *codec_data; 369 +} gGraphStripImage; 370 +typedef gGraphStripImage *gGraphStripImagePtr; 371 + 372 +typedef struct gaia_graphics_color_rule_item 373 +{ 374 +/* a Color Rule Item */ 375 + double value; 376 + double percent_value; 377 + unsigned char is_percent; 378 + unsigned char red; 379 + unsigned char green; 380 + unsigned char blue; 381 + struct gaia_graphics_color_rule_item *next; 382 +} gGraphColorRuleItem; 383 +typedef gGraphColorRuleItem *gGraphColorRuleItemPtr; 384 + 385 +typedef struct gaia_graphics_color_rule 386 +{ 387 +/* a Color Rule definition [GRASS-like] */ 388 + int signature; 389 + struct gaia_graphics_color_rule_item *first; 390 + struct gaia_graphics_color_rule_item *last; 391 + unsigned char no_data_red; 392 + unsigned char no_data_green; 393 + unsigned char no_data_blue; 394 + unsigned char needs_range; 395 +} gGraphColorRule; 396 +typedef gGraphColorRule *gGraphColorRulePtr; 397 + 398 +typedef struct gaia_graphics_color_map_entry 399 +{ 400 +/* a Color Map Entry */ 401 + double min; 402 + double max; 403 + unsigned char red; 404 + unsigned char green; 405 + unsigned char blue; 406 + struct gaia_graphics_color_map_entry *next; 407 +} gGraphColorMapEntry; 408 +typedef gGraphColorMapEntry *gGraphColorMapEntryPtr; 409 + 410 +typedef struct gaia_graphics_color_map 411 +{ 412 +/* a Color Map */ 413 + int signature; 414 + unsigned char no_data_red; 415 + unsigned char no_data_green; 416 + unsigned char no_data_blue; 417 + unsigned char not_found_red; 418 + unsigned char not_found_green; 419 + unsigned char not_found_blue; 420 + struct gaia_graphics_color_map_entry *first; 421 + struct gaia_graphics_color_map_entry *last; 422 + int num_entries; 423 + struct gaia_graphics_color_map_entry **array; 424 +} gGraphColorMap; 425 +typedef gGraphColorMap *gGraphColorMapPtr; 426 + 427 +typedef struct shaded_relief_triple_row 428 +{ 429 +/* the 3-scanlines object for Shaded Relief */ 430 + int signature; 431 + int width; 432 + float *in_row1; 433 + float *in_row2; 434 + float *in_row3; 435 + float *current_row; 436 + unsigned char *out_rgb; 437 + struct gaia_graphics_color_map *color_map; 438 + unsigned char mono_red; 439 + unsigned char mono_green; 440 + unsigned char mono_blue; 441 + double z_factor; 442 + double scale_factor; 443 + double azimuth; 444 + double altitude; 445 + float no_data_value; 446 + unsigned char no_red; 447 + unsigned char no_green; 448 + unsigned char no_blue; 449 +} gGraphShadedReliefTripleRow; 450 +typedef gGraphShadedReliefTripleRow *gGraphShadedReliefTripleRowPtr; 451 + 452 +struct gaia_graphics_pen 453 +{ 454 +/* a struct wrapping a Cairo Pen */ 455 + double red; 456 + double green; 457 + double blue; 458 + double alpha; 459 + double width; 460 + double lengths[4]; 461 + int lengths_count; 462 +}; 463 + 464 +struct gaia_graphics_brush 465 +{ 466 +/* a struct wrapping a Cairo Brush */ 467 + int is_solid_color; 468 + int is_linear_gradient; 469 + int is_pattern; 470 + double red; 471 + double green; 472 + double blue; 473 + double alpha; 474 + double x0; 475 + double y0; 476 + double x1; 477 + double y1; 478 + double red2; 479 + double green2; 480 + double blue2; 481 + double alpha2; 482 + cairo_pattern_t *pattern; 483 +}; 484 + 485 +typedef struct gaia_graphics_context 486 +{ 487 +/* a Cairo based painting context */ 488 + int signature; 489 + cairo_surface_t *surface; 490 + cairo_t *cairo; 491 + struct gaia_graphics_pen current_pen; 492 + struct gaia_graphics_brush current_brush; 493 + double font_red; 494 + double font_green; 495 + double font_blue; 496 + double font_alpha; 497 + int is_font_outlined; 498 + double font_outline_width; 499 +} gGraphContext; 500 +typedef gGraphContext *gGraphContextPtr; 501 + 502 +typedef struct gaia_graphics_bitmap 503 +{ 504 +/* a Cairo based symbol bitmap */ 505 + int signature; 506 + int width; 507 + int height; 508 + cairo_surface_t *bitmap; 509 + cairo_pattern_t *pattern; 510 +} gGraphBitmap; 511 +typedef gGraphBitmap *gGraphBitmapPtr; 512 + 513 +typedef struct gaia_graphics_pattern_brush 514 +{ 515 +/* a Cairo based pattern brush */ 516 + int signature; 517 + int width; 518 + int height; 519 + cairo_surface_t *bitmap; 520 + cairo_pattern_t *pattern; 521 +} gGraphPatternBrush; 522 +typedef gGraphPatternBrush *gGraphPatternBrushPtr; 523 + 524 +typedef struct gaia_graphics_font 525 +{ 526 +/* a struct wrapping a Cairo Font */ 527 + int signature; 528 + double size; 529 + int is_outlined; 530 + double outline_width; 531 + int style; 532 + int weight; 533 + double red; 534 + double green; 535 + double blue; 536 + double alpha; 537 +} gGraphFont; 538 +typedef gGraphFont *gGraphFontPtr; 539 + 540 +struct gg_svg_matrix 541 +{ 542 +/* SVG Matrix data */ 543 + double a; 544 + double b; 545 + double c; 546 + double d; 547 + double e; 548 + double f; 549 +}; 550 + 551 +struct gg_svg_translate 552 +{ 553 +/* SVG Translate data */ 554 + double tx; 555 + double ty; 556 +}; 557 + 558 +struct gg_svg_scale 559 +{ 560 +/* SVG Scale data */ 561 + double sx; 562 + double sy; 563 +}; 564 + 565 +struct gg_svg_rotate 566 +{ 567 +/* SVG Rotate data */ 568 + double angle; 569 + double cx; 570 + double cy; 571 +}; 572 + 573 +struct gg_svg_skew 574 +{ 575 +/* SVG Skew data */ 576 + double angle; 577 +}; 578 + 579 +struct gg_svg_transform 580 +{ 581 +/* SVG Transform (linked list) */ 582 + int type; 583 + void *data; 584 + struct gg_svg_transform *next; 585 +}; 586 + 587 +struct gg_svg_gradient_stop 588 +{ 589 +/* SVG Gradient Stop */ 590 + char *id; 591 + double offset; 592 + double red; 593 + double green; 594 + double blue; 595 + double opacity; 596 + struct gg_svg_gradient_stop *next; 597 +}; 598 + 599 +struct gg_svg_gradient 600 +{ 601 +/* SVG Gradient */ 602 + int type; 603 + char *id; 604 + char *xlink_href; 605 + int gradient_units; 606 + double x1; 607 + double y1; 608 + double x2; 609 + double y2; 610 + double cx; 611 + double cy; 612 + double fx; 613 + double fy; 614 + double r; 615 + struct gg_svg_gradient_stop *first_stop; 616 + struct gg_svg_gradient_stop *last_stop; 617 + struct gg_svg_transform *first_trans; 618 + struct gg_svg_transform *last_trans; 619 + struct gg_svg_gradient *prev; 620 + struct gg_svg_gradient *next; 621 +}; 622 + 623 +struct gg_svg_rect 624 +{ 625 +/* SVG Rect data */ 626 + double x; 627 + double y; 628 + double width; 629 + double height; 630 + double rx; 631 + double ry; 632 +}; 633 + 634 +struct gg_svg_circle 635 +{ 636 +/* SVG Circle data */ 637 + double cx; 638 + double cy; 639 + double r; 640 +}; 641 + 642 +struct gg_svg_ellipse 643 +{ 644 +/* SVG Ellipse data */ 645 + double cx; 646 + double cy; 647 + double rx; 648 + double ry; 649 +}; 650 + 651 +struct gg_svg_line 652 +{ 653 +/* SVG Line data */ 654 + double x1; 655 + double y1; 656 + double x2; 657 + double y2; 658 +}; 659 + 660 +struct gg_svg_polyline 661 +{ 662 +/* SVG Polyline data */ 663 + int points; 664 + double *x; 665 + double *y; 666 +}; 667 + 668 +struct gg_svg_polygon 669 +{ 670 +/* SVG Polygon data */ 671 + int points; 672 + double *x; 673 + double *y; 674 +}; 675 + 676 +struct gg_svg_path_move 677 +{ 678 +/* SVG Path: MoveTo and LineTo data */ 679 + double x; 680 + double y; 681 +}; 682 + 683 +struct gg_svg_path_bezier 684 +{ 685 +/* SVG Path: any Bezier Curve */ 686 + double x1; 687 + double y1; 688 + double x2; 689 + double y2; 690 + double x; 691 + double y; 692 +}; 693 + 694 +struct gg_svg_path_ellipt_arc 695 +{ 696 +/* SVG Path: Elliptical Arc */ 697 + double rx; 698 + double ry; 699 + double rotation; 700 + int large_arc; 701 + int sweep; 702 + double x; 703 + double y; 704 +}; 705 + 706 +struct gg_svg_path_item 707 +{ 708 +/* SVG Path item (linked list) */ 709 + int type; 710 + void *data; 711 + struct gg_svg_path_item *next; 712 +}; 713 + 714 +struct gg_svg_path 715 +{ 716 +/* SVG Path */ 717 + struct gg_svg_path_item *first; 718 + struct gg_svg_path_item *last; 719 + int error; 720 +}; 721 + 722 +struct gg_svg_style 723 +{ 724 +/* SVG Style-related definitions */ 725 + char visibility; 726 + double opacity; 727 + char fill; 728 + char no_fill; 729 + int fill_rule; 730 + char *fill_url; 731 + struct gg_svg_gradient *fill_pointer; 732 + double fill_red; 733 + double fill_green; 734 + double fill_blue; 735 + double fill_opacity; 736 + char stroke; 737 + char no_stroke; 738 + double stroke_width; 739 + int stroke_linecap; 740 + int stroke_linejoin; 741 + double stroke_miterlimit; 742 + int stroke_dashitems; 743 + double *stroke_dasharray; 744 + double stroke_dashoffset; 745 + char *stroke_url; 746 + struct gg_svg_gradient *stroke_pointer; 747 + double stroke_red; 748 + double stroke_green; 749 + double stroke_blue; 750 + double stroke_opacity; 751 + char *clip_url; 752 + struct gg_svg_item *clip_pointer; 753 +}; 754 + 755 +struct gg_svg_shape 756 +{ 757 +/* generic SVG shape container */ 758 + char *id; 759 + int type; 760 + void *data; 761 + struct gg_svg_group *parent; 762 + struct gg_svg_style style; 763 + struct gg_svg_transform *first_trans; 764 + struct gg_svg_transform *last_trans; 765 + int is_defs; 766 + int is_flow_root; 767 + struct gg_svg_shape *next; 768 +}; 769 + 770 +struct gg_svg_use 771 +{ 772 +/* SVG Use (xlink:href) */ 773 + char *xlink_href; 774 + double x; 775 + double y; 776 + double width; 777 + double height; 778 + struct gg_svg_style style; 779 + struct gg_svg_group *parent; 780 + struct gg_svg_transform *first_trans; 781 + struct gg_svg_transform *last_trans; 782 + struct gg_svg_use *next; 783 +}; 784 + 785 +struct gg_svg_item 786 +{ 787 +/* SVG generic item */ 788 + int type; 789 + void *pointer; 790 + struct gg_svg_item *next; 791 +}; 792 + 793 +struct gg_svg_group 794 +{ 795 +/* SVG group container: <g> */ 796 + char *id; 797 + struct gg_svg_style style; 798 + struct gg_svg_group *parent; 799 + struct gg_svg_item *first; 800 + struct gg_svg_item *last; 801 + struct gg_svg_transform *first_trans; 802 + struct gg_svg_transform *last_trans; 803 + int is_defs; 804 + int is_flow_root; 805 + struct gg_svg_group *next; 806 +}; 807 + 808 +struct gg_svg_clip 809 +{ 810 +/* SVG group container: <clipPath> */ 811 + char *id; 812 + struct gg_svg_item *first; 813 + struct gg_svg_item *last; 814 + struct gg_svg_clip *next; 815 +}; 816 + 817 + 818 +struct gg_svg_document 819 +{ 820 +/* SVG document main container */ 821 + int signature; 822 + cairo_matrix_t matrix; 823 + double width; 824 + double height; 825 + double viewbox_x; 826 + double viewbox_y; 827 + double viewbox_width; 828 + double viewbox_height; 829 + struct gg_svg_item *first; 830 + struct gg_svg_item *last; 831 + struct gg_svg_gradient *first_grad; 832 + struct gg_svg_gradient *last_grad; 833 + struct gg_svg_group *current_group; 834 + struct gg_svg_shape *current_shape; 835 + struct gg_svg_clip *current_clip; 836 + int defs_count; 837 + int flow_root_count; 838 +}; 839 + 840 +GGRAPH_PRIVATE gGraphColorRulePtr gg_color_rule_create (void); 841 +GGRAPH_PRIVATE void gg_color_rule_destroy (gGraphColorRulePtr color_rule); 842 +GGRAPH_PRIVATE gGraphColorMapPtr gg_color_map_create (void); 843 +GGRAPH_PRIVATE void gg_color_map_destroy (gGraphColorMapPtr color_map); 844 + 845 +GGRAPH_PRIVATE gGraphShadedReliefTripleRowPtr 846 +gg_shaded_relief_triple_row_create (void); 847 +GGRAPH_PRIVATE void 848 +gg_shaded_relief_triple_row_destroy (gGraphShadedReliefTripleRowPtr triple_row); 849 + 850 +GGRAPH_PRIVATE gGraphImageInfosPtr gg_image_infos_create (int pixel_format, 851 + int width, int height, 852 + int bits_per_sample, 853 + int samples_per_pixel, 854 + int sample_format, 855 + const char *srs_name, 856 + const char 857 + *proj4text); 858 +GGRAPH_PRIVATE void gg_image_infos_destroy (gGraphImageInfosPtr img); 859 +GGRAPH_PRIVATE gGraphImagePtr gg_image_create (int pixel_format, int width, 860 + int height, int bits_per_sample, 861 + int samples_per_pixel, 862 + int sample_format, 863 + const char *srs_name, 864 + const char *proj4text); 865 +GGRAPH_PRIVATE gGraphImagePtr gg_image_create_from_bitmap (unsigned char 866 + *bitmap, 867 + int pixel_format, 868 + int width, 869 + int height, 870 + int bits_per_sample, 871 + int 872 + samples_per_pixel, 873 + int sample_format, 874 + const char *srs_name, 875 + const char 876 + *proj4text); 877 +GGRAPH_PRIVATE void gg_image_destroy (gGraphImagePtr img); 878 +GGRAPH_PRIVATE gGraphStripImagePtr gg_strip_image_create (FILE * file_handle, 879 + int codec_id, 880 + int pixel_format, 881 + int width, int height, 882 + int bits_per_sample, 883 + int samples_per_pixel, 884 + int sample_format, 885 + const char *srs_name, 886 + const char 887 + *proj4text); 888 +GGRAPH_PRIVATE void gg_strip_image_destroy (gGraphStripImagePtr img); 889 +GGRAPH_PRIVATE void gg_png_codec_destroy (void *p); 890 +GGRAPH_PRIVATE void gg_jpeg_codec_destroy (void *p); 891 +GGRAPH_PRIVATE void gg_tiff_codec_destroy (void *p); 892 +GGRAPH_PRIVATE void gg_grid_codec_destroy (void *p); 893 +GGRAPH_PRIVATE void gg_image_fill (const gGraphImagePtr img, unsigned char r, 894 + unsigned char g, unsigned char b, 895 + unsigned char alpha); 896 +GGRAPH_PRIVATE unsigned char gg_match_palette (const gGraphImagePtr img, 897 + unsigned char r, unsigned char g, 898 + unsigned char b); 899 +GGRAPH_PRIVATE int gg_set_image_transparent_color (unsigned char r, 900 + unsigned char g, 901 + unsigned char b); 902 +GGRAPH_PRIVATE int gg_is_image_monochrome (const gGraphImagePtr img); 903 +GGRAPH_PRIVATE int gg_is_image_monochrome_ready (const gGraphImagePtr img); 904 +GGRAPH_PRIVATE int gg_is_image_grayscale (const gGraphImagePtr img); 905 +GGRAPH_PRIVATE int gg_is_image_palette256 (const gGraphImagePtr img); 906 + 907 +GGRAPH_PRIVATE void gg_make_thumbnail (const gGraphImagePtr thumbnail, 908 + const gGraphImagePtr image); 909 +GGRAPH_PRIVATE void gg_image_resize (const gGraphImagePtr dst, 910 + const gGraphImagePtr src); 911 +GGRAPH_PRIVATE void gg_make_grid_thumbnail (const gGraphImagePtr thumbnail, 912 + const gGraphImagePtr image); 913 +GGRAPH_PRIVATE void gg_grid_resize (const gGraphImagePtr dst, 914 + const gGraphImagePtr src); 915 +GGRAPH_PRIVATE void gg_image_clone_georeferencing (const gGraphImagePtr dst, 916 + const gGraphImagePtr src); 917 +GGRAPH_PRIVATE void gg_image_sub_set (const gGraphImagePtr dst, 918 + const gGraphImagePtr src, 919 + int upper_left_x, int upper_left_y); 920 + 921 +GGRAPH_PRIVATE int gg_image_to_jpeg (const gGraphImagePtr img, void **mem_buf, 922 + int *mem_buf_size, FILE * out, 923 + int dest_type, int quality); 924 +GGRAPH_PRIVATE int gg_image_prepare_to_jpeg_by_strip (const gGraphStripImagePtr 925 + img, FILE * out, 926 + int quality); 927 +GGRAPH_PRIVATE int gg_image_write_to_jpeg_by_strip (const gGraphStripImagePtr 928 + img, int *progress); 929 +GGRAPH_PRIVATE int gg_image_to_png (const gGraphImagePtr img, void **mem_buf, 930 + int *mem_buf_size, FILE * out, 931 + int dest_type, int compression_level, 932 + int quantization_factor, int interlaced, 933 + int is_transparent); 934 +GGRAPH_PRIVATE int gg_image_prepare_to_png_by_strip (const gGraphStripImagePtr 935 + img, FILE * out, 936 + int compression_level, 937 + int quantization_factor); 938 +GGRAPH_PRIVATE int gg_image_write_to_png_by_strip (const gGraphStripImagePtr 939 + img, int *progress); 940 +GGRAPH_PRIVATE int gg_image_to_gif (const gGraphImagePtr img, void **mem_buf, 941 + int *mem_buf_size, FILE * out, 942 + int dest_type, int is_transparent); 943 +GGRAPH_PRIVATE int gg_image_write_to_bin_hdr_by_strip (const gGraphStripImagePtr 944 + img, int *progress); 945 +GGRAPH_PRIVATE int gg_image_write_to_flt_hdr_by_strip (const gGraphStripImagePtr 946 + img, int *progress); 947 +GGRAPH_PRIVATE int gg_image_write_to_ascii_grid_by_strip (const 948 + gGraphStripImagePtr 949 + img, int *progress); 950 +GGRAPH_PRIVATE int gg_image_prepare_to_tiff_by_strip (const gGraphStripImagePtr 951 + img, const char *path, 952 + int layout, 953 + int tile_width, 954 + int tile_height, 955 + int rows_per_strip, 956 + int color_model, 957 + int bits_per_sample, 958 + int sample_format, 959 + int num_palette, 960 + unsigned char *red, 961 + unsigned char *green, 962 + unsigned char *blue, 963 + int compression); 964 +GGRAPH_PRIVATE int gg_image_prepare_to_geotiff_by_strip (const 965 + gGraphStripImagePtr 966 + img, const char *path, 967 + int layout, 968 + int tile_width, 969 + int tile_height, 970 + int rows_per_strip, 971 + int color_model, 972 + int bits_per_sample, 973 + int sample_format, 974 + int num_palette, 975 + unsigned char *red, 976 + unsigned char *green, 977 + unsigned char *blue, 978 + int compression); 979 +GGRAPH_PRIVATE int gg_image_prepare_to_bin_hdr_by_strip (const 980 + gGraphStripImagePtr 981 + img); 982 +GGRAPH_PRIVATE int gg_image_prepare_to_flt_hdr_by_strip (const 983 + gGraphStripImagePtr 984 + img); 985 +GGRAPH_PRIVATE int gg_image_prepare_to_ascii_grid_by_strip (const 986 + gGraphStripImagePtr 987 + img, FILE * out); 988 +GGRAPH_PRIVATE int gg_image_write_to_tiff_by_strip (const gGraphStripImagePtr 989 + img, int *progress); 990 + 991 +GGRAPH_PRIVATE int gg_convert_image_to_rgb (const gGraphImagePtr img); 992 +GGRAPH_PRIVATE int gg_convert_image_to_rgba (const gGraphImagePtr img); 993 +GGRAPH_PRIVATE int gg_convert_image_to_argb (const gGraphImagePtr img); 994 +GGRAPH_PRIVATE int gg_convert_image_to_bgr (const gGraphImagePtr img); 995 +GGRAPH_PRIVATE int gg_convert_image_to_bgra (const gGraphImagePtr img); 996 +GGRAPH_PRIVATE int gg_convert_image_to_grayscale (const gGraphImagePtr img); 997 +GGRAPH_PRIVATE int gg_convert_image_to_palette (const gGraphImagePtr img); 998 +GGRAPH_PRIVATE int gg_image_resample_as_palette (const gGraphImagePtr img, 999 + int num_colors); 1000 +GGRAPH_PRIVATE int gg_convert_image_to_monochrome (const gGraphImagePtr img); 1001 +GGRAPH_PRIVATE int gg_convert_image_to_grid_int16 (const gGraphImagePtr img); 1002 +GGRAPH_PRIVATE int gg_convert_image_to_grid_uint16 (const gGraphImagePtr img); 1003 +GGRAPH_PRIVATE int gg_convert_image_to_grid_int32 (const gGraphImagePtr img); 1004 +GGRAPH_PRIVATE int gg_convert_image_to_grid_uint32 (const gGraphImagePtr img); 1005 +GGRAPH_PRIVATE int gg_convert_image_to_grid_float (const gGraphImagePtr img); 1006 +GGRAPH_PRIVATE int gg_convert_image_to_grid_double (const gGraphImagePtr img); 1007 + 1008 +GGRAPH_PRIVATE int gg_resample_transparent_rgb (const gGraphImagePtr img); 1009 +GGRAPH_PRIVATE int gg_resample_transparent_rgba (const gGraphImagePtr img); 1010 +GGRAPH_PRIVATE int gg_resample_transparent_grayscale (const gGraphImagePtr img); 1011 +GGRAPH_PRIVATE int gg_resample_transparent_palette (const gGraphImagePtr img); 1012 + 1013 +GGRAPH_PRIVATE int gg_image_from_raw (int size, const void *data, 1014 + gGraphImagePtr * image_handle); 1015 +GGRAPH_PRIVATE int gg_image_from_jpeg (int size, const void *data, 1016 + int source_type, 1017 + gGraphImagePtr * image_handle, 1018 + int scale); 1019 +GGRAPH_PRIVATE int gg_image_from_png (int size, const void *data, 1020 + int source_type, 1021 + gGraphImagePtr * image_handle, int scale); 1022 +GGRAPH_PRIVATE int gg_image_from_gif (int size, const void *data, 1023 + int source_type, 1024 + gGraphImagePtr * image_handle); 1025 +GGRAPH_PRIVATE int gg_image_from_mem_tiff (int size, const void *data, 1026 + gGraphImagePtr * image_handle); 1027 + 1028 +GGRAPH_PRIVATE int gg_image_strip_prepare_from_png (FILE * in, 1029 + gGraphStripImagePtr * 1030 + image_handle); 1031 +GGRAPH_PRIVATE int gg_image_strip_prepare_from_jpeg (FILE * in, 1032 + gGraphStripImagePtr * 1033 + image_handle); 1034 +GGRAPH_PRIVATE int gg_image_strip_prepare_from_jpeg (FILE * in, 1035 + gGraphStripImagePtr * 1036 + image_handle); 1037 +GGRAPH_PRIVATE int gg_image_strip_prepare_from_tiff (const char *path, 1038 + gGraphStripImagePtr * 1039 + image_handle); 1040 +GGRAPH_PRIVATE int gg_image_strip_prepare_from_geotiff (const char *path, 1041 + gGraphStripImagePtr * 1042 + image_handle); 1043 +GGRAPH_PRIVATE int gg_image_strip_prepare_from_hgt (FILE * in, int lon, int lat, 1044 + gGraphStripImagePtr * 1045 + image_handle); 1046 +GGRAPH_PRIVATE int gg_image_strip_prepare_from_bin_hdr (FILE * in, 1047 + const char *hdr_path, 1048 + gGraphStripImagePtr * 1049 + image_handle); 1050 +GGRAPH_PRIVATE int gg_image_strip_prepare_from_flt_hdr (FILE * in, 1051 + const char *hdr_path, 1052 + gGraphStripImagePtr * 1053 + image_handle); 1054 +GGRAPH_PRIVATE int gg_image_strip_prepare_from_dem_hdr (FILE * in, 1055 + const char *hdr_path, 1056 + gGraphStripImagePtr * 1057 + image_handle); 1058 +GGRAPH_PRIVATE int gg_image_strip_prepare_from_ascii_grid (FILE * in, 1059 + gGraphStripImagePtr * 1060 + image_handle); 1061 + 1062 +GGRAPH_PRIVATE int gg_image_strip_read_from_png (gGraphStripImagePtr 1063 + image_handle, int *progress); 1064 +GGRAPH_PRIVATE int gg_image_strip_read_from_jpeg (gGraphStripImagePtr 1065 + image_handle, int *progress); 1066 +GGRAPH_PRIVATE int gg_image_strip_read_from_tiff (gGraphStripImagePtr 1067 + image_handle, int *progress); 1068 +GGRAPH_PRIVATE int gg_image_strip_read_from_hgt (gGraphStripImagePtr 1069 + image_handle, int *progress); 1070 +GGRAPH_PRIVATE int gg_image_strip_read_from_bin_grid (gGraphStripImagePtr 1071 + image_handle, 1072 + int *progress); 1073 +GGRAPH_PRIVATE int gg_image_strip_read_from_dem_grid (gGraphStripImagePtr 1074 + image_handle, 1075 + int *progress); 1076 +GGRAPH_PRIVATE int gg_image_strip_read_from_ascii_grid (gGraphStripImagePtr 1077 + image_handle, 1078 + int *progress); 1079 + 1080 +GGRAPH_PRIVATE int gg_image_infos_from_jpeg (int size, const void *data, 1081 + int source_type, 1082 + gGraphImageInfosPtr * 1083 + infos_handle); 1084 +GGRAPH_PRIVATE int gg_image_infos_from_png (int size, const void *data, 1085 + int source_type, 1086 + gGraphImageInfosPtr * infos_handle); 1087 +GGRAPH_PRIVATE int gg_image_infos_from_gif (int size, const void *data, 1088 + int source_type, 1089 + gGraphImageInfosPtr * infos_handle); 1090 +GGRAPH_PRIVATE int gg_image_infos_from_mem_tiff (int size, const void *data, 1091 + gGraphImageInfosPtr * 1092 + infos_handle); 1093 +GGRAPH_PRIVATE int gg_image_infos_from_tiff (const char *path, 1094 + gGraphImageInfosPtr * 1095 + infos_handle); 1096 +GGRAPH_PRIVATE int gg_image_infos_from_geo_tiff (const char *path, 1097 + gGraphImageInfosPtr * 1098 + infos_handle); 1099 + 1100 +GGRAPH_PRIVATE int gg_endian_arch (void); 1101 +GGRAPH_PRIVATE short gg_import_int16 (const unsigned char *p, 1102 + int little_endian, 1103 + int little_endian_arch); 1104 +GGRAPH_PRIVATE int gg_import_int32 (const unsigned char *p, int little_endian, 1105 + int little_endian_arch); 1106 +GGRAPH_PRIVATE unsigned short gg_import_uint16 (const unsigned char *p, 1107 + int little_endian, 1108 + int little_endian_arch); 1109 +GGRAPH_PRIVATE unsigned int gg_import_uint32 (const unsigned char *p, 1110 + int little_endian, 1111 + int little_endian_arch); 1112 +GGRAPH_PRIVATE float gg_import_float (const unsigned char *p, int little_endian, 1113 + int little_endian_arch); 1114 +GGRAPH_PRIVATE double gg_import_double (const unsigned char *p, 1115 + int little_endian, 1116 + int little_endian_arch); 1117 + 1118 +GGRAPH_PRIVATE void gg_export_int16 (short value, unsigned char *p, 1119 + int little_endian, int little_endian_arch); 1120 +GGRAPH_PRIVATE void gg_export_int32 (int value, unsigned char *p, 1121 + int little_endian, int little_endian_arch); 1122 +GGRAPH_PRIVATE void gg_export_uint16 (unsigned short value, unsigned char *p, 1123 + int little_endian, 1124 + int little_endian_arch); 1125 +GGRAPH_PRIVATE void gg_export_uint32 (unsigned int value, unsigned char *p, 1126 + int little_endian, 1127 + int little_endian_arch); 1128 +GGRAPH_PRIVATE void gg_export_float (float value, unsigned char *p, 1129 + int little_endian, int little_endian_arch); 1130 +GGRAPH_PRIVATE void gg_export_double (double value, unsigned char *p, 1131 + int little_endian, 1132 + int little_endian_arch); 1133 + 1134 + 1135 +GGRAPH_PRIVATE struct gg_svg_transform *gg_svg_alloc_transform (int type, 1136 + void *data); 1137 +GGRAPH_PRIVATE void gg_svg_free_transform (struct gg_svg_transform *p); 1138 +GGRAPH_PRIVATE struct gg_svg_polyline *gg_svg_alloc_polyline (int points, 1139 + double *x, 1140 + double *y); 1141 +GGRAPH_PRIVATE void gg_svg_free_polyline (struct gg_svg_polyline *p); 1142 +GGRAPH_PRIVATE struct gg_svg_polygon *gg_svg_alloc_polygon (int points, 1143 + double *x, 1144 + double *y); 1145 +GGRAPH_PRIVATE void gg_svg_free_polygon (struct gg_svg_polygon *p); 1146 +GGRAPH_PRIVATE struct gg_svg_path_item *gg_svg_alloc_path_item (int type, 1147 + void *data); 1148 +GGRAPH_PRIVATE void gg_svg_free_path_item (struct gg_svg_path_item *p); 1149 +GGRAPH_PRIVATE struct gg_svg_path *gg_svg_alloc_path (void); 1150 +GGRAPH_PRIVATE void gg_svg_free_path (struct gg_svg_path *p); 1151 +GGRAPH_PRIVATE struct gg_svg_shape *gg_svg_alloc_shape (int type, void *data, 1152 + struct gg_svg_group 1153 + *parent); 1154 +GGRAPH_PRIVATE void gg_svg_free_shape (struct gg_svg_shape *p); 1155 +GGRAPH_PRIVATE void gg_svg_add_shape_id (struct gg_svg_shape *p, 1156 + const char *id); 1157 +GGRAPH_PRIVATE struct gg_svg_use *gg_svg_alloc_use (void *parent, 1158 + const char *xlink_href, 1159 + double x, double y, 1160 + double width, 1161 + double height); 1162 +GGRAPH_PRIVATE void gg_svg_free_use (struct gg_svg_use *p); 1163 +GGRAPH_PRIVATE struct gg_svg_group *gg_svg_alloc_group (void); 1164 +GGRAPH_PRIVATE void gg_svg_free_group (struct gg_svg_group *p); 1165 +GGRAPH_PRIVATE void gg_svg_add_group_id (struct gg_svg_group *p, 1166 + const char *id); 1167 +GGRAPH_PRIVATE struct gg_svg_clip *svg_alloc_clip (void); 1168 +GGRAPH_PRIVATE void gg_svg_free_clip (struct gg_svg_clip *p); 1169 +GGRAPH_PRIVATE void gg_svg_add_clip_id (struct gg_svg_clip *p, const char *id); 1170 +GGRAPH_PRIVATE struct gg_svg_gradient_stop *gg_svg_alloc_gradient_stop (double 1171 + offset, 1172 + double 1173 + red, 1174 + double 1175 + green, 1176 + double 1177 + blue, 1178 + double 1179 + opacity); 1180 +GGRAPH_PRIVATE struct gg_svg_gradient_stop *gg_svg_clone_gradient_stop (struct 1181 + gg_svg_gradient_stop 1182 + *in); 1183 +GGRAPH_PRIVATE void gg_svg_free_gradient_stop (struct gg_svg_gradient_stop *p); 1184 +GGRAPH_PRIVATE struct gg_svg_gradient *gg_svg_clone_gradient (struct 1185 + gg_svg_gradient 1186 + *in, 1187 + struct 1188 + gg_svg_gradient 1189 + *old); 1190 +GGRAPH_PRIVATE void gg_svg_free_gradient (struct gg_svg_gradient *p); 1191 +GGRAPH_PRIVATE struct gg_svg_document *gg_svg_alloc_document (void); 1192 +GGRAPH_PRIVATE void gg_svg_free_document (struct gg_svg_document *p); 1193 +GGRAPH_PRIVATE struct gg_svg_item *gg_svg_alloc_item (int type, void *pointer); 1194 +GGRAPH_PRIVATE struct gg_svg_matrix *gg_svg_alloc_matrix (double a, double b, 1195 + double c, double d, 1196 + double e, double f); 1197 +GGRAPH_PRIVATE struct gg_svg_translate *gg_svg_alloc_translate (double tx, 1198 + double ty); 1199 +GGRAPH_PRIVATE struct gg_svg_scale *gg_svg_alloc_scale (double sx, double sy); 1200 +GGRAPH_PRIVATE struct gg_svg_rotate *gg_svg_alloc_rotate (double angle, 1201 + double cx, double cy); 1202 +GGRAPH_PRIVATE struct gg_svg_skew *gg_svg_alloc_skew (double angle); 1203 +GGRAPH_PRIVATE struct gg_svg_rect *gg_svg_alloc_rect (double x, double y, 1204 + double width, 1205 + double height, double rx, 1206 + double ry); 1207 +GGRAPH_PRIVATE struct gg_svg_circle *gg_svg_alloc_circle (double cx, double cy, 1208 + double r); 1209 +GGRAPH_PRIVATE struct gg_svg_ellipse *gg_svg_alloc_ellipse (double cx, 1210 + double cy, 1211 + double rx, 1212 + double ry); 1213 +GGRAPH_PRIVATE struct gg_svg_line *gg_svg_alloc_line (double x1, double y1, 1214 + double x2, double y2); 1215 +GGRAPH_PRIVATE struct gg_svg_path_move *gg_svg_alloc_path_move (double x, 1216 + double y); 1217 +GGRAPH_PRIVATE struct gg_svg_path_bezier *gg_svg_alloc_path_bezier (double x1, 1218 + double y1, 1219 + double x2, 1220 + double y2, 1221 + double x, 1222 + double y); 1223 +GGRAPH_PRIVATE struct gg_svg_path_ellipt_arc 1224 + *gg_svg_alloc_path_ellipt_arc (double rx, double ry, double rotation, 1225 + int large_arc, int sweep, double x, 1226 + double y); 1227 + 1228 +GGRAPH_PRIVATE void gg_svg_add_path_item (struct gg_svg_path *path, int type, 1229 + void *data); 1230 +GGRAPH_PRIVATE void gg_svg_insert_shape (struct gg_svg_document *svg_doc, 1231 + int type, void *data); 1232 +GGRAPH_PRIVATE struct gg_svg_use *gg_svg_insert_use (struct gg_svg_document 1233 + *svg_doc, 1234 + const char *xlink_href, 1235 + double x, double y, 1236 + double width, 1237 + double height); 1238 +GGRAPH_PRIVATE void gg_svg_insert_group (struct gg_svg_document *svg_doc); 1239 +GGRAPH_PRIVATE void gg_svg_close_group (struct gg_svg_document *svg_doc); 1240 +GGRAPH_PRIVATE void gg_svg_insert_clip (struct gg_svg_document *svg_doc); 1241 +GGRAPH_PRIVATE void gg_svg_close_clip (struct gg_svg_document *svg_doc); 1242 +GGRAPH_PRIVATE struct gg_svg_gradient *gg_svg_insert_linear_gradient (struct 1243 + gg_svg_document 1244 + *svg_doc, 1245 + const char 1246 + *id, 1247 + const char 1248 + *xlink_href, 1249 + double x1, 1250 + double y1, 1251 + double x2, 1252 + double y2, 1253 + int 1254 + units); 1255 +GGRAPH_PRIVATE void gg_svg_insert_gradient_stop (struct gg_svg_gradient 1256 + *gradient, double offset, 1257 + double red, double green, 1258 + double blue, double opacity); 1259 +GGRAPH_PRIVATE struct gg_svg_gradient *gg_svg_insert_radial_gradient (struct 1260 + gg_svg_document 1261 + *svg_doc, 1262 + const char 1263 + *id, 1264 + const char 1265 + *xlink_href, 1266 + double cx, 1267 + double cy, 1268 + double fx, 1269 + double fy, 1270 + double r, 1271 + int 1272 + units); 1273 + 1274 +GGRAPH_PRIVATE struct gg_svg_document *gg_svg_parse_doc (const unsigned char 1275 + *svg, int svg_len); 1276 + 1277 +GGRAPH_PRIVATE struct gg_svg_shape *gg_svg_clone_shape (struct gg_svg_shape *in, 1278 + struct gg_svg_use *use); 1279 +GGRAPH_PRIVATE struct gg_svg_group *gg_svg_clone_group (struct gg_svg_group *in, 1280 + struct gg_svg_use *use); 1281 +GGRAPH_PRIVATE struct gg_svg_clip *gg_svg_clone_clip (struct gg_svg_clip *in); 1282 +GGRAPH_PRIVATE void gg_svg_set_group_parent (struct gg_svg_item *item, 1283 + struct gg_svg_group *group); 1284 +GGRAPH_PRIVATE struct gg_svg_item *gg_svg_clone_item (struct gg_svg_item *in); 1285 +GGRAPH_PRIVATE void gg_svg_add_fill_gradient_url (struct gg_svg_style *style, 1286 + const char *url); 1287 +GGRAPH_PRIVATE void gg_svg_add_stroke_gradient_url (struct gg_svg_style *style, 1288 + const char *url); 1289 +GGRAPH_PRIVATE void gg_svg_add_clip_url (struct gg_svg_style *style, 1290 + const char *url); 1291 + 1292 +/* 1293 +/ 1294 +/ DISCLAIMER: 1295 +/ all the following code merely represents an 'ad hoc' adaption 1296 +/ deriving from the original GD lib code [BSD-like licensed] 1297 +/ 1298 +*/ 1299 + 1300 +#define XGD_CTX_FREE 300 1301 +#define XGD_CTX_DONT_FREE 400 1302 + 1303 +typedef struct xgdIOCtx 1304 +{ 1305 + int (*getC) (struct xgdIOCtx *); 1306 + int (*getBuf) (struct xgdIOCtx *, void *, int); 1307 + void (*putC) (struct xgdIOCtx *, int); 1308 + int (*putBuf) (struct xgdIOCtx *, const void *, int); 1309 + int (*seek) (struct xgdIOCtx *, const int); 1310 + long (*tell) (struct xgdIOCtx *); 1311 + void (*xgd_free) (struct xgdIOCtx *); 1312 +} 1313 +xgdIOCtx; 1314 + 1315 +typedef struct xgdIOCtx *xgdIOCtxPtr; 1316 + 1317 +typedef struct dpStruct 1318 +{ 1319 + FILE *file; 1320 + void *data; 1321 + int logicalSize; 1322 + int realSize; 1323 + int dataGood; 1324 + int pos; 1325 + int freeOK; 1326 +} 1327 +dynamicPtr; 1328 + 1329 +typedef struct dpIOCtx 1330 +{ 1331 + xgdIOCtx ctx; 1332 + dynamicPtr *dp; 1333 +} 1334 +dpIOCtx; 1335 + 1336 +typedef struct dpIOCtx *dpIOCtxPtr; 1337 + 1338 +GGRAPH_PRIVATE int overflow2 (int a, int b); 1339 +GGRAPH_PRIVATE void *xgdDPExtractData (struct xgdIOCtx *ctx, int *size); 1340 +GGRAPH_PRIVATE xgdIOCtx *xgdNewDynamicCtx (int initialSize, const void *data, 1341 + int mem_or_file); 1342 +GGRAPH_PRIVATE xgdIOCtx *xgdNewDynamicCtxEx (int initialSize, const void *data, 1343 + int freeOKFlag, int mem_or_file); 1344 +GGRAPH_PRIVATE int xgdPutBuf (const void *buf, int size, xgdIOCtx * ctx); 1345 +GGRAPH_PRIVATE int xgdGetBuf (void *, int, xgdIOCtx *);
Added install-sh.
1 +#!/bin/sh 2 +# install - install a program, script, or datafile 3 + 4 +scriptversion=2011-01-19.21; # UTC 5 + 6 +# This originates from X11R5 (mit/util/scripts/install.sh), which was 7 +# later released in X11R6 (xc/config/util/install.sh) with the 8 +# following copyright and license. 9 +# 10 +# Copyright (C) 1994 X Consortium 11 +# 12 +# Permission is hereby granted, free of charge, to any person obtaining a copy 13 +# of this software and associated documentation files (the "Software"), to 14 +# deal in the Software without restriction, including without limitation the 15 +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16 +# sell copies of the Software, and to permit persons to whom the Software is 17 +# furnished to do so, subject to the following conditions: 18 +# 19 +# The above copyright notice and this permission notice shall be included in 20 +# all copies or substantial portions of the Software. 21 +# 22 +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23 +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25 +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26 +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27 +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28 +# 29 +# Except as contained in this notice, the name of the X Consortium shall not 30 +# be used in advertising or otherwise to promote the sale, use or other deal- 31 +# ings in this Software without prior written authorization from the X Consor- 32 +# tium. 33 +# 34 +# 35 +# FSF changes to this file are in the public domain. 36 +# 37 +# Calling this script install-sh is preferred over install.sh, to prevent 38 +# `make' implicit rules from creating a file called install from it 39 +# when there is no Makefile. 40 +# 41 +# This script is compatible with the BSD install script, but was written 42 +# from scratch. 43 + 44 +nl=' 45 +' 46 +IFS=" "" $nl" 47 + 48 +# set DOITPROG to echo to test this script 49 + 50 +# Don't use :- since 4.3BSD and earlier shells don't like it. 51 +doit=${DOITPROG-} 52 +if test -z "$doit"; then 53 + doit_exec=exec 54 +else 55 + doit_exec=$doit 56 +fi 57 + 58 +# Put in absolute file names if you don't have them in your path; 59 +# or use environment vars. 60 + 61 +chgrpprog=${CHGRPPROG-chgrp} 62 +chmodprog=${CHMODPROG-chmod} 63 +chownprog=${CHOWNPROG-chown} 64 +cmpprog=${CMPPROG-cmp} 65 +cpprog=${CPPROG-cp} 66 +mkdirprog=${MKDIRPROG-mkdir} 67 +mvprog=${MVPROG-mv} 68 +rmprog=${RMPROG-rm} 69 +stripprog=${STRIPPROG-strip} 70 + 71 +posix_glob='?' 72 +initialize_posix_glob=' 73 + test "$posix_glob" != "?" || { 74 + if (set -f) 2>/dev/null; then 75 + posix_glob= 76 + else 77 + posix_glob=: 78 + fi 79 + } 80 +' 81 + 82 +posix_mkdir= 83 + 84 +# Desired mode of installed file. 85 +mode=0755 86 + 87 +chgrpcmd= 88 +chmodcmd=$chmodprog 89 +chowncmd= 90 +mvcmd=$mvprog 91 +rmcmd="$rmprog -f" 92 +stripcmd= 93 + 94 +src= 95 +dst= 96 +dir_arg= 97 +dst_arg= 98 + 99 +copy_on_change=false 100 +no_target_directory= 101 + 102 +usage="\ 103 +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE 104 + or: $0 [OPTION]... SRCFILES... DIRECTORY 105 + or: $0 [OPTION]... -t DIRECTORY SRCFILES... 106 + or: $0 [OPTION]... -d DIRECTORIES... 107 + 108 +In the 1st form, copy SRCFILE to DSTFILE. 109 +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 110 +In the 4th, create DIRECTORIES. 111 + 112 +Options: 113 + --help display this help and exit. 114 + --version display version info and exit. 115 + 116 + -c (ignored) 117 + -C install only if different (preserve the last data modification time) 118 + -d create directories instead of installing files. 119 + -g GROUP $chgrpprog installed files to GROUP. 120 + -m MODE $chmodprog installed files to MODE. 121 + -o USER $chownprog installed files to USER. 122 + -s $stripprog installed files. 123 + -t DIRECTORY install into DIRECTORY. 124 + -T report an error if DSTFILE is a directory. 125 + 126 +Environment variables override the default commands: 127 + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 128 + RMPROG STRIPPROG 129 +" 130 + 131 +while test $# -ne 0; do 132 + case $1 in 133 + -c) ;; 134 + 135 + -C) copy_on_change=true;; 136 + 137 + -d) dir_arg=true;; 138 + 139 + -g) chgrpcmd="$chgrpprog $2" 140 + shift;; 141 + 142 + --help) echo "$usage"; exit $?;; 143 + 144 + -m) mode=$2 145 + case $mode in 146 + *' '* | *' '* | *' 147 +'* | *'*'* | *'?'* | *'['*) 148 + echo "$0: invalid mode: $mode" >&2 149 + exit 1;; 150 + esac 151 + shift;; 152 + 153 + -o) chowncmd="$chownprog $2" 154 + shift;; 155 + 156 + -s) stripcmd=$stripprog;; 157 + 158 + -t) dst_arg=$2 159 + # Protect names problematic for `test' and other utilities. 160 + case $dst_arg in 161 + -* | [=\(\)!]) dst_arg=./$dst_arg;; 162 + esac 163 + shift;; 164 + 165 + -T) no_target_directory=true;; 166 + 167 + --version) echo "$0 $scriptversion"; exit $?;; 168 + 169 + --) shift 170 + break;; 171 + 172 + -*) echo "$0: invalid option: $1" >&2 173 + exit 1;; 174 + 175 + *) break;; 176 + esac 177 + shift 178 +done 179 + 180 +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 181 + # When -d is used, all remaining arguments are directories to create. 182 + # When -t is used, the destination is already specified. 183 + # Otherwise, the last argument is the destination. Remove it from $@. 184 + for arg 185 + do 186 + if test -n "$dst_arg"; then 187 + # $@ is not empty: it contains at least $arg. 188 + set fnord "$@" "$dst_arg" 189 + shift # fnord 190 + fi 191 + shift # arg 192 + dst_arg=$arg 193 + # Protect names problematic for `test' and other utilities. 194 + case $dst_arg in 195 + -* | [=\(\)!]) dst_arg=./$dst_arg;; 196 + esac 197 + done 198 +fi 199 + 200 +if test $# -eq 0; then 201 + if test -z "$dir_arg"; then 202 + echo "$0: no input file specified." >&2 203 + exit 1 204 + fi 205 + # It's OK to call `install-sh -d' without argument. 206 + # This can happen when creating conditional directories. 207 + exit 0 208 +fi 209 + 210 +if test -z "$dir_arg"; then 211 + do_exit='(exit $ret); exit $ret' 212 + trap "ret=129; $do_exit" 1 213 + trap "ret=130; $do_exit" 2 214 + trap "ret=141; $do_exit" 13 215 + trap "ret=143; $do_exit" 15 216 + 217 + # Set umask so as not to create temps with too-generous modes. 218 + # However, 'strip' requires both read and write access to temps. 219 + case $mode in 220 + # Optimize common cases. 221 + *644) cp_umask=133;; 222 + *755) cp_umask=22;; 223 + 224 + *[0-7]) 225 + if test -z "$stripcmd"; then 226 + u_plus_rw= 227 + else 228 + u_plus_rw='% 200' 229 + fi 230 + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 231 + *) 232 + if test -z "$stripcmd"; then 233 + u_plus_rw= 234 + else 235 + u_plus_rw=,u+rw 236 + fi 237 + cp_umask=$mode$u_plus_rw;; 238 + esac 239 +fi 240 + 241 +for src 242 +do 243 + # Protect names problematic for `test' and other utilities. 244 + case $src in 245 + -* | [=\(\)!]) src=./$src;; 246 + esac 247 + 248 + if test -n "$dir_arg"; then 249 + dst=$src 250 + dstdir=$dst 251 + test -d "$dstdir" 252 + dstdir_status=$? 253 + else 254 + 255 + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 256 + # might cause directories to be created, which would be especially bad 257 + # if $src (and thus $dsttmp) contains '*'. 258 + if test ! -f "$src" && test ! -d "$src"; then 259 + echo "$0: $src does not exist." >&2 260 + exit 1 261 + fi 262 + 263 + if test -z "$dst_arg"; then 264 + echo "$0: no destination specified." >&2 265 + exit 1 266 + fi 267 + dst=$dst_arg 268 + 269 + # If destination is a directory, append the input filename; won't work 270 + # if double slashes aren't ignored. 271 + if test -d "$dst"; then 272 + if test -n "$no_target_directory"; then 273 + echo "$0: $dst_arg: Is a directory" >&2 274 + exit 1 275 + fi 276 + dstdir=$dst 277 + dst=$dstdir/`basename "$src"` 278 + dstdir_status=0 279 + else 280 + # Prefer dirname, but fall back on a substitute if dirname fails. 281 + dstdir=` 282 + (dirname "$dst") 2>/dev/null || 283 + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 284 + X"$dst" : 'X\(//\)[^/]' \| \ 285 + X"$dst" : 'X\(//\)$' \| \ 286 + X"$dst" : 'X\(/\)' \| . 2>/dev/null || 287 + echo X"$dst" | 288 + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 289 + s//\1/ 290 + q 291 + } 292 + /^X\(\/\/\)[^/].*/{ 293 + s//\1/ 294 + q 295 + } 296 + /^X\(\/\/\)$/{ 297 + s//\1/ 298 + q 299 + } 300 + /^X\(\/\).*/{ 301 + s//\1/ 302 + q 303 + } 304 + s/.*/./; q' 305 + ` 306 + 307 + test -d "$dstdir" 308 + dstdir_status=$? 309 + fi 310 + fi 311 + 312 + obsolete_mkdir_used=false 313 + 314 + if test $dstdir_status != 0; then 315 + case $posix_mkdir in 316 + '') 317 + # Create intermediate dirs using mode 755 as modified by the umask. 318 + # This is like FreeBSD 'install' as of 1997-10-28. 319 + umask=`umask` 320 + case $stripcmd.$umask in 321 + # Optimize common cases. 322 + *[2367][2367]) mkdir_umask=$umask;; 323 + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 324 + 325 + *[0-7]) 326 + mkdir_umask=`expr $umask + 22 \ 327 + - $umask % 100 % 40 + $umask % 20 \ 328 + - $umask % 10 % 4 + $umask % 2 329 + `;; 330 + *) mkdir_umask=$umask,go-w;; 331 + esac 332 + 333 + # With -d, create the new directory with the user-specified mode. 334 + # Otherwise, rely on $mkdir_umask. 335 + if test -n "$dir_arg"; then 336 + mkdir_mode=-m$mode 337 + else 338 + mkdir_mode= 339 + fi 340 + 341 + posix_mkdir=false 342 + case $umask in 343 + *[123567][0-7][0-7]) 344 + # POSIX mkdir -p sets u+wx bits regardless of umask, which 345 + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 346 + ;; 347 + *) 348 + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 349 + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 350 + 351 + if (umask $mkdir_umask && 352 + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 353 + then 354 + if test -z "$dir_arg" || { 355 + # Check for POSIX incompatibilities with -m. 356 + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 357 + # other-writeable bit of parent directory when it shouldn't. 358 + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 359 + ls_ld_tmpdir=`ls -ld "$tmpdir"` 360 + case $ls_ld_tmpdir in 361 + d????-?r-*) different_mode=700;; 362 + d????-?--*) different_mode=755;; 363 + *) false;; 364 + esac && 365 + $mkdirprog -m$different_mode -p -- "$tmpdir" && { 366 + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 367 + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 368 + } 369 + } 370 + then posix_mkdir=: 371 + fi 372 + rmdir "$tmpdir/d" "$tmpdir" 373 + else 374 + # Remove any dirs left behind by ancient mkdir implementations. 375 + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 376 + fi 377 + trap '' 0;; 378 + esac;; 379 + esac 380 + 381 + if 382 + $posix_mkdir && ( 383 + umask $mkdir_umask && 384 + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 385 + ) 386 + then : 387 + else 388 + 389 + # The umask is ridiculous, or mkdir does not conform to POSIX, 390 + # or it failed possibly due to a race condition. Create the 391 + # directory the slow way, step by step, checking for races as we go. 392 + 393 + case $dstdir in 394 + /*) prefix='/';; 395 + [-=\(\)!]*) prefix='./';; 396 + *) prefix='';; 397 + esac 398 + 399 + eval "$initialize_posix_glob" 400 + 401 + oIFS=$IFS 402 + IFS=/ 403 + $posix_glob set -f 404 + set fnord $dstdir 405 + shift 406 + $posix_glob set +f 407 + IFS=$oIFS 408 + 409 + prefixes= 410 + 411 + for d 412 + do 413 + test X"$d" = X && continue 414 + 415 + prefix=$prefix$d 416 + if test -d "$prefix"; then 417 + prefixes= 418 + else 419 + if $posix_mkdir; then 420 + (umask=$mkdir_umask && 421 + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 422 + # Don't fail if two instances are running concurrently. 423 + test -d "$prefix" || exit 1 424 + else 425 + case $prefix in 426 + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 427 + *) qprefix=$prefix;; 428 + esac 429 + prefixes="$prefixes '$qprefix'" 430 + fi 431 + fi 432 + prefix=$prefix/ 433 + done 434 + 435 + if test -n "$prefixes"; then 436 + # Don't fail if two instances are running concurrently. 437 + (umask $mkdir_umask && 438 + eval "\$doit_exec \$mkdirprog $prefixes") || 439 + test -d "$dstdir" || exit 1 440 + obsolete_mkdir_used=true 441 + fi 442 + fi 443 + fi 444 + 445 + if test -n "$dir_arg"; then 446 + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 447 + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 448 + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 449 + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 450 + else 451 + 452 + # Make a couple of temp file names in the proper directory. 453 + dsttmp=$dstdir/_inst.$$_ 454 + rmtmp=$dstdir/_rm.$$_ 455 + 456 + # Trap to clean up those temp files at exit. 457 + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 458 + 459 + # Copy the file name to the temp name. 460 + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 461 + 462 + # and set any options; do chmod last to preserve setuid bits. 463 + # 464 + # If any of these fail, we abort the whole thing. If we want to 465 + # ignore errors from any of these, just make sure not to ignore 466 + # errors from the above "$doit $cpprog $src $dsttmp" command. 467 + # 468 + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 469 + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 470 + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 471 + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 472 + 473 + # If -C, don't bother to copy if it wouldn't change the file. 474 + if $copy_on_change && 475 + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 476 + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 477 + 478 + eval "$initialize_posix_glob" && 479 + $posix_glob set -f && 480 + set X $old && old=:$2:$4:$5:$6 && 481 + set X $new && new=:$2:$4:$5:$6 && 482 + $posix_glob set +f && 483 + 484 + test "$old" = "$new" && 485 + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 486 + then 487 + rm -f "$dsttmp" 488 + else 489 + # Rename the file to the real destination. 490 + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 491 + 492 + # The rename failed, perhaps because mv can't rename something else 493 + # to itself, or perhaps because mv is so ancient that it does not 494 + # support -f. 495 + { 496 + # Now remove or move aside any old file at destination location. 497 + # We try this two ways since rm can't unlink itself on some 498 + # systems and the destination file might be busy for other 499 + # reasons. In this case, the final cleanup might fail but the new 500 + # file should still install successfully. 501 + { 502 + test ! -f "$dst" || 503 + $doit $rmcmd -f "$dst" 2>/dev/null || 504 + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 505 + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 506 + } || 507 + { echo "$0: cannot unlink or rename $dst" >&2 508 + (exit 1); exit 1 509 + } 510 + } && 511 + 512 + # Now rename the file to the real destination. 513 + $doit $mvcmd "$dsttmp" "$dst" 514 + } 515 + fi || exit 1 516 + 517 + trap '' 0 518 + fi 519 +done 520 + 521 +# Local variables: 522 +# eval: (add-hook 'write-file-hooks 'time-stamp) 523 +# time-stamp-start: "scriptversion=" 524 +# time-stamp-format: "%:y-%02m-%02d.%02H" 525 +# time-stamp-time-zone: "UTC" 526 +# time-stamp-end: "; # UTC" 527 +# End:
Added ltmain.sh.
1 + 2 +# libtool (GNU libtool) 2.4.2 3 +# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 4 + 5 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 6 +# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 7 +# This is free software; see the source for copying conditions. There is NO 8 +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 9 + 10 +# GNU Libtool is free software; you can redistribute it and/or modify 11 +# it under the terms of the GNU General Public License as published by 12 +# the Free Software Foundation; either version 2 of the License, or 13 +# (at your option) any later version. 14 +# 15 +# As a special exception to the GNU General Public License, 16 +# if you distribute this file as part of a program or library that 17 +# is built using GNU Libtool, you may include this file under the 18 +# same distribution terms that you use for the rest of that program. 19 +# 20 +# GNU Libtool is distributed in the hope that it will be useful, but 21 +# WITHOUT ANY WARRANTY; without even the implied warranty of 22 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23 +# General Public License for more details. 24 +# 25 +# You should have received a copy of the GNU General Public License 26 +# along with GNU Libtool; see the file COPYING. If not, a copy 27 +# can be downloaded from http://www.gnu.org/licenses/gpl.html, 28 +# or obtained by writing to the Free Software Foundation, Inc., 29 +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 30 + 31 +# Usage: $progname [OPTION]... [MODE-ARG]... 32 +# 33 +# Provide generalized library-building support services. 34 +# 35 +# --config show all configuration variables 36 +# --debug enable verbose shell tracing 37 +# -n, --dry-run display commands without modifying any files 38 +# --features display basic configuration information and exit 39 +# --mode=MODE use operation mode MODE 40 +# --preserve-dup-deps don't remove duplicate dependency libraries 41 +# --quiet, --silent don't print informational messages 42 +# --no-quiet, --no-silent 43 +# print informational messages (default) 44 +# --no-warn don't display warning messages 45 +# --tag=TAG use configuration variables from tag TAG 46 +# -v, --verbose print more informational messages than default 47 +# --no-verbose don't print the extra informational messages 48 +# --version print version information 49 +# -h, --help, --help-all print short, long, or detailed help message 50 +# 51 +# MODE must be one of the following: 52 +# 53 +# clean remove files from the build directory 54 +# compile compile a source file into a libtool object 55 +# execute automatically set library path, then run a program 56 +# finish complete the installation of libtool libraries 57 +# install install libraries or executables 58 +# link create a library or an executable 59 +# uninstall remove libraries from an installed directory 60 +# 61 +# MODE-ARGS vary depending on the MODE. When passed as first option, 62 +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. 63 +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. 64 +# 65 +# When reporting a bug, please describe a test case to reproduce it and 66 +# include the following information: 67 +# 68 +# host-triplet: $host 69 +# shell: $SHELL 70 +# compiler: $LTCC 71 +# compiler flags: $LTCFLAGS 72 +# linker: $LD (gnu? $with_gnu_ld) 73 +# $progname: (GNU libtool) 2.4.2 74 +# automake: $automake_version 75 +# autoconf: $autoconf_version 76 +# 77 +# Report bugs to <bug-libtool@gnu.org>. 78 +# GNU libtool home page: <http://www.gnu.org/software/libtool/>. 79 +# General help using GNU software: <http://www.gnu.org/gethelp/>. 80 + 81 +PROGRAM=libtool 82 +PACKAGE=libtool 83 +VERSION=2.4.2 84 +TIMESTAMP="" 85 +package_revision=1.3337 86 + 87 +# Be Bourne compatible 88 +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then 89 + emulate sh 90 + NULLCMD=: 91 + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which 92 + # is contrary to our usage. Disable this feature. 93 + alias -g '${1+"$@"}'='"$@"' 94 + setopt NO_GLOB_SUBST 95 +else 96 + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac 97 +fi 98 +BIN_SH=xpg4; export BIN_SH # for Tru64 99 +DUALCASE=1; export DUALCASE # for MKS sh 100 + 101 +# A function that is used when there is no print builtin or printf. 102 +func_fallback_echo () 103 +{ 104 + eval 'cat <<_LTECHO_EOF 105 +$1 106 +_LTECHO_EOF' 107 +} 108 + 109 +# NLS nuisances: We save the old values to restore during execute mode. 110 +lt_user_locale= 111 +lt_safe_locale= 112 +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES 113 +do 114 + eval "if test \"\${$lt_var+set}\" = set; then 115 + save_$lt_var=\$$lt_var 116 + $lt_var=C 117 + export $lt_var 118 + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" 119 + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" 120 + fi" 121 +done 122 +LC_ALL=C 123 +LANGUAGE=C 124 +export LANGUAGE LC_ALL 125 + 126 +$lt_unset CDPATH 127 + 128 + 129 +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh 130 +# is ksh but when the shell is invoked as "sh" and the current value of 131 +# the _XPG environment variable is not equal to 1 (one), the special 132 +# positional parameter $0, within a function call, is the name of the 133 +# function. 134 +progpath="$0" 135 + 136 + 137 + 138 +: ${CP="cp -f"} 139 +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} 140 +: ${MAKE="make"} 141 +: ${MKDIR="mkdir"} 142 +: ${MV="mv -f"} 143 +: ${RM="rm -f"} 144 +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} 145 +: ${Xsed="$SED -e 1s/^X//"} 146 + 147 +# Global variables: 148 +EXIT_SUCCESS=0 149 +EXIT_FAILURE=1 150 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. 151 +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. 152 + 153 +exit_status=$EXIT_SUCCESS 154 + 155 +# Make sure IFS has a sensible default 156 +lt_nl=' 157 +' 158 +IFS=" $lt_nl" 159 + 160 +dirname="s,/[^/]*$,," 161 +basename="s,^.*/,," 162 + 163 +# func_dirname file append nondir_replacement 164 +# Compute the dirname of FILE. If nonempty, add APPEND to the result, 165 +# otherwise set result to NONDIR_REPLACEMENT. 166 +func_dirname () 167 +{ 168 + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` 169 + if test "X$func_dirname_result" = "X${1}"; then 170 + func_dirname_result="${3}" 171 + else 172 + func_dirname_result="$func_dirname_result${2}" 173 + fi 174 +} # func_dirname may be replaced by extended shell implementation 175 + 176 + 177 +# func_basename file 178 +func_basename () 179 +{ 180 + func_basename_result=`$ECHO "${1}" | $SED "$basename"` 181 +} # func_basename may be replaced by extended shell implementation 182 + 183 + 184 +# func_dirname_and_basename file append nondir_replacement 185 +# perform func_basename and func_dirname in a single function 186 +# call: 187 +# dirname: Compute the dirname of FILE. If nonempty, 188 +# add APPEND to the result, otherwise set result 189 +# to NONDIR_REPLACEMENT. 190 +# value returned in "$func_dirname_result" 191 +# basename: Compute filename of FILE. 192 +# value retuned in "$func_basename_result" 193 +# Implementation must be kept synchronized with func_dirname 194 +# and func_basename. For efficiency, we do not delegate to 195 +# those functions but instead duplicate the functionality here. 196 +func_dirname_and_basename () 197 +{ 198 + # Extract subdirectory from the argument. 199 + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` 200 + if test "X$func_dirname_result" = "X${1}"; then 201 + func_dirname_result="${3}" 202 + else 203 + func_dirname_result="$func_dirname_result${2}" 204 + fi 205 + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` 206 +} # func_dirname_and_basename may be replaced by extended shell implementation 207 + 208 + 209 +# func_stripname prefix suffix name 210 +# strip PREFIX and SUFFIX off of NAME. 211 +# PREFIX and SUFFIX must not contain globbing or regex special 212 +# characters, hashes, percent signs, but SUFFIX may contain a leading 213 +# dot (in which case that matches only a dot). 214 +# func_strip_suffix prefix name 215 +func_stripname () 216 +{ 217 + case ${2} in 218 + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; 219 + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; 220 + esac 221 +} # func_stripname may be replaced by extended shell implementation 222 + 223 + 224 +# These SED scripts presuppose an absolute path with a trailing slash. 225 +pathcar='s,^/\([^/]*\).*$,\1,' 226 +pathcdr='s,^/[^/]*,,' 227 +removedotparts=':dotsl 228 + s@/\./@/@g 229 + t dotsl 230 + s,/\.$,/,' 231 +collapseslashes='s@/\{1,\}@/@g' 232 +finalslash='s,/*$,/,' 233 + 234 +# func_normal_abspath PATH 235 +# Remove doubled-up and trailing slashes, "." path components, 236 +# and cancel out any ".." path components in PATH after making 237 +# it an absolute path. 238 +# value returned in "$func_normal_abspath_result" 239 +func_normal_abspath () 240 +{ 241 + # Start from root dir and reassemble the path. 242 + func_normal_abspath_result= 243 + func_normal_abspath_tpath=$1 244 + func_normal_abspath_altnamespace= 245 + case $func_normal_abspath_tpath in 246 + "") 247 + # Empty path, that just means $cwd. 248 + func_stripname '' '/' "`pwd`" 249 + func_normal_abspath_result=$func_stripname_result 250 + return 251 + ;; 252 + # The next three entries are used to spot a run of precisely 253 + # two leading slashes without using negated character classes; 254 + # we take advantage of case's first-match behaviour. 255 + ///*) 256 + # Unusual form of absolute path, do nothing. 257 + ;; 258 + //*) 259 + # Not necessarily an ordinary path; POSIX reserves leading '//' 260 + # and for example Cygwin uses it to access remote file shares 261 + # over CIFS/SMB, so we conserve a leading double slash if found. 262 + func_normal_abspath_altnamespace=/ 263 + ;; 264 + /*) 265 + # Absolute path, do nothing. 266 + ;; 267 + *) 268 + # Relative path, prepend $cwd. 269 + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath 270 + ;; 271 + esac 272 + # Cancel out all the simple stuff to save iterations. We also want 273 + # the path to end with a slash for ease of parsing, so make sure 274 + # there is one (and only one) here. 275 + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ 276 + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` 277 + while :; do 278 + # Processed it all yet? 279 + if test "$func_normal_abspath_tpath" = / ; then 280 + # If we ascended to the root using ".." the result may be empty now. 281 + if test -z "$func_normal_abspath_result" ; then 282 + func_normal_abspath_result=/ 283 + fi 284 + break 285 + fi 286 + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ 287 + -e "$pathcar"` 288 + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ 289 + -e "$pathcdr"` 290 + # Figure out what to do with it 291 + case $func_normal_abspath_tcomponent in 292 + "") 293 + # Trailing empty path component, ignore it. 294 + ;; 295 + ..) 296 + # Parent dir; strip last assembled component from result. 297 + func_dirname "$func_normal_abspath_result" 298 + func_normal_abspath_result=$func_dirname_result 299 + ;; 300 + *) 301 + # Actual path component, append it. 302 + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent 303 + ;; 304 + esac 305 + done 306 + # Restore leading double-slash if one was found on entry. 307 + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result 308 +} 309 + 310 +# func_relative_path SRCDIR DSTDIR 311 +# generates a relative path from SRCDIR to DSTDIR, with a trailing 312 +# slash if non-empty, suitable for immediately appending a filename 313 +# without needing to append a separator. 314 +# value returned in "$func_relative_path_result" 315 +func_relative_path () 316 +{ 317 + func_relative_path_result= 318 + func_normal_abspath "$1" 319 + func_relative_path_tlibdir=$func_normal_abspath_result 320 + func_normal_abspath "$2" 321 + func_relative_path_tbindir=$func_normal_abspath_result 322 + 323 + # Ascend the tree starting from libdir 324 + while :; do 325 + # check if we have found a prefix of bindir 326 + case $func_relative_path_tbindir in 327 + $func_relative_path_tlibdir) 328 + # found an exact match 329 + func_relative_path_tcancelled= 330 + break 331 + ;; 332 + $func_relative_path_tlibdir*) 333 + # found a matching prefix 334 + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" 335 + func_relative_path_tcancelled=$func_stripname_result 336 + if test -z "$func_relative_path_result"; then 337 + func_relative_path_result=. 338 + fi 339 + break 340 + ;; 341 + *) 342 + func_dirname $func_relative_path_tlibdir 343 + func_relative_path_tlibdir=${func_dirname_result} 344 + if test "x$func_relative_path_tlibdir" = x ; then 345 + # Have to descend all the way to the root! 346 + func_relative_path_result=../$func_relative_path_result 347 + func_relative_path_tcancelled=$func_relative_path_tbindir 348 + break 349 + fi 350 + func_relative_path_result=../$func_relative_path_result 351 + ;; 352 + esac 353 + done 354 + 355 + # Now calculate path; take care to avoid doubling-up slashes. 356 + func_stripname '' '/' "$func_relative_path_result" 357 + func_relative_path_result=$func_stripname_result 358 + func_stripname '/' '/' "$func_relative_path_tcancelled" 359 + if test "x$func_stripname_result" != x ; then 360 + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} 361 + fi 362 + 363 + # Normalisation. If bindir is libdir, return empty string, 364 + # else relative path ending with a slash; either way, target 365 + # file name can be directly appended. 366 + if test ! -z "$func_relative_path_result"; then 367 + func_stripname './' '' "$func_relative_path_result/" 368 + func_relative_path_result=$func_stripname_result 369 + fi 370 +} 371 + 372 +# The name of this program: 373 +func_dirname_and_basename "$progpath" 374 +progname=$func_basename_result 375 + 376 +# Make sure we have an absolute path for reexecution: 377 +case $progpath in 378 + [\\/]*|[A-Za-z]:\\*) ;; 379 + *[\\/]*) 380 + progdir=$func_dirname_result 381 + progdir=`cd "$progdir" && pwd` 382 + progpath="$progdir/$progname" 383 + ;; 384 + *) 385 + save_IFS="$IFS" 386 + IFS=${PATH_SEPARATOR-:} 387 + for progdir in $PATH; do 388 + IFS="$save_IFS" 389 + test -x "$progdir/$progname" && break 390 + done 391 + IFS="$save_IFS" 392 + test -n "$progdir" || progdir=`pwd` 393 + progpath="$progdir/$progname" 394 + ;; 395 +esac 396 + 397 +# Sed substitution that helps us do robust quoting. It backslashifies 398 +# metacharacters that are still active within double-quoted strings. 399 +Xsed="${SED}"' -e 1s/^X//' 400 +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' 401 + 402 +# Same as above, but do not quote variable references. 403 +double_quote_subst='s/\(["`\\]\)/\\\1/g' 404 + 405 +# Sed substitution that turns a string into a regex matching for the 406 +# string literally. 407 +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' 408 + 409 +# Sed substitution that converts a w32 file name or path 410 +# which contains forward slashes, into one that contains 411 +# (escaped) backslashes. A very naive implementation. 412 +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' 413 + 414 +# Re-`\' parameter expansions in output of double_quote_subst that were 415 +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' 416 +# in input to double_quote_subst, that '$' was protected from expansion. 417 +# Since each input `\' is now two `\'s, look for any number of runs of 418 +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. 419 +bs='\\' 420 +bs2='\\\\' 421 +bs4='\\\\\\\\' 422 +dollar='\$' 423 +sed_double_backslash="\ 424 + s/$bs4/&\\ 425 +/g 426 + s/^$bs2$dollar/$bs&/ 427 + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g 428 + s/\n//g" 429 + 430 +# Standard options: 431 +opt_dry_run=false 432 +opt_help=false 433 +opt_quiet=false 434 +opt_verbose=false 435 +opt_warning=: 436 + 437 +# func_echo arg... 438 +# Echo program name prefixed message, along with the current mode 439 +# name if it has been set yet. 440 +func_echo () 441 +{ 442 + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" 443 +} 444 + 445 +# func_verbose arg... 446 +# Echo program name prefixed message in verbose mode only. 447 +func_verbose () 448 +{ 449 + $opt_verbose && func_echo ${1+"$@"} 450 + 451 + # A bug in bash halts the script if the last line of a function 452 + # fails when set -e is in force, so we need another command to 453 + # work around that: 454 + : 455 +} 456 + 457 +# func_echo_all arg... 458 +# Invoke $ECHO with all args, space-separated. 459 +func_echo_all () 460 +{ 461 + $ECHO "$*" 462 +} 463 + 464 +# func_error arg... 465 +# Echo program name prefixed message to standard error. 466 +func_error () 467 +{ 468 + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 469 +} 470 + 471 +# func_warning arg... 472 +# Echo program name prefixed warning message to standard error. 473 +func_warning () 474 +{ 475 + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 476 + 477 + # bash bug again: 478 + : 479 +} 480 + 481 +# func_fatal_error arg... 482 +# Echo program name prefixed message to standard error, and exit. 483 +func_fatal_error () 484 +{ 485 + func_error ${1+"$@"} 486 + exit $EXIT_FAILURE 487 +} 488 + 489 +# func_fatal_help arg... 490 +# Echo program name prefixed message to standard error, followed by 491 +# a help hint, and exit. 492 +func_fatal_help () 493 +{ 494 + func_error ${1+"$@"} 495 + func_fatal_error "$help" 496 +} 497 +help="Try \`$progname --help' for more information." ## default 498 + 499 + 500 +# func_grep expression filename 501 +# Check whether EXPRESSION matches any line of FILENAME, without output. 502 +func_grep () 503 +{ 504 + $GREP "$1" "$2" >/dev/null 2>&1 505 +} 506 + 507 + 508 +# func_mkdir_p directory-path 509 +# Make sure the entire path to DIRECTORY-PATH is available. 510 +func_mkdir_p () 511 +{ 512 + my_directory_path="$1" 513 + my_dir_list= 514 + 515 + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then 516 + 517 + # Protect directory names starting with `-' 518 + case $my_directory_path in 519 + -*) my_directory_path="./$my_directory_path" ;; 520 + esac 521 + 522 + # While some portion of DIR does not yet exist... 523 + while test ! -d "$my_directory_path"; do 524 + # ...make a list in topmost first order. Use a colon delimited 525 + # list incase some portion of path contains whitespace. 526 + my_dir_list="$my_directory_path:$my_dir_list" 527 + 528 + # If the last portion added has no slash in it, the list is done 529 + case $my_directory_path in */*) ;; *) break ;; esac 530 + 531 + # ...otherwise throw away the child directory and loop 532 + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` 533 + done 534 + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` 535 + 536 + save_mkdir_p_IFS="$IFS"; IFS=':' 537 + for my_dir in $my_dir_list; do 538 + IFS="$save_mkdir_p_IFS" 539 + # mkdir can fail with a `File exist' error if two processes 540 + # try to create one of the directories concurrently. Don't 541 + # stop in that case! 542 + $MKDIR "$my_dir" 2>/dev/null || : 543 + done 544 + IFS="$save_mkdir_p_IFS" 545 + 546 + # Bail out if we (or some other process) failed to create a directory. 547 + test -d "$my_directory_path" || \ 548 + func_fatal_error "Failed to create \`$1'" 549 + fi 550 +} 551 + 552 + 553 +# func_mktempdir [string] 554 +# Make a temporary directory that won't clash with other running 555 +# libtool processes, and avoids race conditions if possible. If 556 +# given, STRING is the basename for that directory. 557 +func_mktempdir () 558 +{ 559 + my_template="${TMPDIR-/tmp}/${1-$progname}" 560 + 561 + if test "$opt_dry_run" = ":"; then 562 + # Return a directory name, but don't create it in dry-run mode 563 + my_tmpdir="${my_template}-$$" 564 + else 565 + 566 + # If mktemp works, use that first and foremost 567 + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` 568 + 569 + if test ! -d "$my_tmpdir"; then 570 + # Failing that, at least try and use $RANDOM to avoid a race 571 + my_tmpdir="${my_template}-${RANDOM-0}$$" 572 + 573 + save_mktempdir_umask=`umask` 574 + umask 0077 575 + $MKDIR "$my_tmpdir" 576 + umask $save_mktempdir_umask 577 + fi 578 + 579 + # If we're not in dry-run mode, bomb out on failure 580 + test -d "$my_tmpdir" || \ 581 + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" 582 + fi 583 + 584 + $ECHO "$my_tmpdir" 585 +} 586 + 587 + 588 +# func_quote_for_eval arg 589 +# Aesthetically quote ARG to be evaled later. 590 +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT 591 +# is double-quoted, suitable for a subsequent eval, whereas 592 +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters 593 +# which are still active within double quotes backslashified. 594 +func_quote_for_eval () 595 +{ 596 + case $1 in 597 + *[\\\`\"\$]*) 598 + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; 599 + *) 600 + func_quote_for_eval_unquoted_result="$1" ;; 601 + esac 602 + 603 + case $func_quote_for_eval_unquoted_result in 604 + # Double-quote args containing shell metacharacters to delay 605 + # word splitting, command substitution and and variable 606 + # expansion for a subsequent eval. 607 + # Many Bourne shells cannot handle close brackets correctly 608 + # in scan sets, so we specify it separately. 609 + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") 610 + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" 611 + ;; 612 + *) 613 + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" 614 + esac 615 +} 616 + 617 + 618 +# func_quote_for_expand arg 619 +# Aesthetically quote ARG to be evaled later; same as above, 620 +# but do not quote variable references. 621 +func_quote_for_expand () 622 +{ 623 + case $1 in 624 + *[\\\`\"]*) 625 + my_arg=`$ECHO "$1" | $SED \ 626 + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; 627 + *) 628 + my_arg="$1" ;; 629 + esac 630 + 631 + case $my_arg in 632 + # Double-quote args containing shell metacharacters to delay 633 + # word splitting and command substitution for a subsequent eval. 634 + # Many Bourne shells cannot handle close brackets correctly 635 + # in scan sets, so we specify it separately. 636 + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") 637 + my_arg="\"$my_arg\"" 638 + ;; 639 + esac 640 + 641 + func_quote_for_expand_result="$my_arg" 642 +} 643 + 644 + 645 +# func_show_eval cmd [fail_exp] 646 +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is 647 +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP 648 +# is given, then evaluate it. 649 +func_show_eval () 650 +{ 651 + my_cmd="$1" 652 + my_fail_exp="${2-:}" 653 + 654 + ${opt_silent-false} || { 655 + func_quote_for_expand "$my_cmd" 656 + eval "func_echo $func_quote_for_expand_result" 657 + } 658 + 659 + if ${opt_dry_run-false}; then :; else 660 + eval "$my_cmd" 661 + my_status=$? 662 + if test "$my_status" -eq 0; then :; else 663 + eval "(exit $my_status); $my_fail_exp" 664 + fi 665 + fi 666 +} 667 + 668 + 669 +# func_show_eval_locale cmd [fail_exp] 670 +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is 671 +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP 672 +# is given, then evaluate it. Use the saved locale for evaluation. 673 +func_show_eval_locale () 674 +{ 675 + my_cmd="$1" 676 + my_fail_exp="${2-:}" 677 + 678 + ${opt_silent-false} || { 679 + func_quote_for_expand "$my_cmd" 680 + eval "func_echo $func_quote_for_expand_result" 681 + } 682 + 683 + if ${opt_dry_run-false}; then :; else 684 + eval "$lt_user_locale 685 + $my_cmd" 686 + my_status=$? 687 + eval "$lt_safe_locale" 688 + if test "$my_status" -eq 0; then :; else 689 + eval "(exit $my_status); $my_fail_exp" 690 + fi 691 + fi 692 +} 693 + 694 +# func_tr_sh 695 +# Turn $1 into a string suitable for a shell variable name. 696 +# Result is stored in $func_tr_sh_result. All characters 697 +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, 698 +# if $1 begins with a digit, a '_' is prepended as well. 699 +func_tr_sh () 700 +{ 701 + case $1 in 702 + [0-9]* | *[!a-zA-Z0-9_]*) 703 + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` 704 + ;; 705 + * ) 706 + func_tr_sh_result=$1 707 + ;; 708 + esac 709 +} 710 + 711 + 712 +# func_version 713 +# Echo version message to standard output and exit. 714 +func_version () 715 +{ 716 + $opt_debug 717 + 718 + $SED -n '/(C)/!b go 719 + :more 720 + /\./!{ 721 + N 722 + s/\n# / / 723 + b more 724 + } 725 + :go 726 + /^# '$PROGRAM' (GNU /,/# warranty; / { 727 + s/^# // 728 + s/^# *$// 729 + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ 730 + p 731 + }' < "$progpath" 732 + exit $? 733 +} 734 + 735 +# func_usage 736 +# Echo short help message to standard output and exit. 737 +func_usage () 738 +{ 739 + $opt_debug 740 + 741 + $SED -n '/^# Usage:/,/^# *.*--help/ { 742 + s/^# // 743 + s/^# *$// 744 + s/\$progname/'$progname'/ 745 + p 746 + }' < "$progpath" 747 + echo 748 + $ECHO "run \`$progname --help | more' for full usage" 749 + exit $? 750 +} 751 + 752 +# func_help [NOEXIT] 753 +# Echo long help message to standard output and exit, 754 +# unless 'noexit' is passed as argument. 755 +func_help () 756 +{ 757 + $opt_debug 758 + 759 + $SED -n '/^# Usage:/,/# Report bugs to/ { 760 + :print 761 + s/^# // 762 + s/^# *$// 763 + s*\$progname*'$progname'* 764 + s*\$host*'"$host"'* 765 + s*\$SHELL*'"$SHELL"'* 766 + s*\$LTCC*'"$LTCC"'* 767 + s*\$LTCFLAGS*'"$LTCFLAGS"'* 768 + s*\$LD*'"$LD"'* 769 + s/\$with_gnu_ld/'"$with_gnu_ld"'/ 770 + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ 771 + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ 772 + p 773 + d 774 + } 775 + /^# .* home page:/b print 776 + /^# General help using/b print 777 + ' < "$progpath" 778 + ret=$? 779 + if test -z "$1"; then 780 + exit $ret 781 + fi 782 +} 783 + 784 +# func_missing_arg argname 785 +# Echo program name prefixed message to standard error and set global 786 +# exit_cmd. 787 +func_missing_arg () 788 +{ 789 + $opt_debug 790 + 791 + func_error "missing argument for $1." 792 + exit_cmd=exit 793 +} 794 + 795 + 796 +# func_split_short_opt shortopt 797 +# Set func_split_short_opt_name and func_split_short_opt_arg shell 798 +# variables after splitting SHORTOPT after the 2nd character. 799 +func_split_short_opt () 800 +{ 801 + my_sed_short_opt='1s/^\(..\).*$/\1/;q' 802 + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' 803 + 804 + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` 805 + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` 806 +} # func_split_short_opt may be replaced by extended shell implementation 807 + 808 + 809 +# func_split_long_opt longopt 810 +# Set func_split_long_opt_name and func_split_long_opt_arg shell 811 +# variables after splitting LONGOPT at the `=' sign. 812 +func_split_long_opt () 813 +{ 814 + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' 815 + my_sed_long_arg='1s/^--[^=]*=//' 816 + 817 + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` 818 + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` 819 +} # func_split_long_opt may be replaced by extended shell implementation 820 + 821 +exit_cmd=: 822 + 823 + 824 + 825 + 826 + 827 +magic="%%%MAGIC variable%%%" 828 +magic_exe="%%%MAGIC EXE variable%%%" 829 + 830 +# Global variables. 831 +nonopt= 832 +preserve_args= 833 +lo2o="s/\\.lo\$/.${objext}/" 834 +o2lo="s/\\.${objext}\$/.lo/" 835 +extracted_archives= 836 +extracted_serial=0 837 + 838 +# If this variable is set in any of the actions, the command in it 839 +# will be execed at the end. This prevents here-documents from being 840 +# left over by shells. 841 +exec_cmd= 842 + 843 +# func_append var value 844 +# Append VALUE to the end of shell variable VAR. 845 +func_append () 846 +{ 847 + eval "${1}=\$${1}\${2}" 848 +} # func_append may be replaced by extended shell implementation 849 + 850 +# func_append_quoted var value 851 +# Quote VALUE and append to the end of shell variable VAR, separated 852 +# by a space. 853 +func_append_quoted () 854 +{ 855 + func_quote_for_eval "${2}" 856 + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" 857 +} # func_append_quoted may be replaced by extended shell implementation 858 + 859 + 860 +# func_arith arithmetic-term... 861 +func_arith () 862 +{ 863 + func_arith_result=`expr "${@}"` 864 +} # func_arith may be replaced by extended shell implementation 865 + 866 + 867 +# func_len string 868 +# STRING may not start with a hyphen. 869 +func_len () 870 +{ 871 + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` 872 +} # func_len may be replaced by extended shell implementation 873 + 874 + 875 +# func_lo2o object 876 +func_lo2o () 877 +{ 878 + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` 879 +} # func_lo2o may be replaced by extended shell implementation 880 + 881 + 882 +# func_xform libobj-or-source 883 +func_xform () 884 +{ 885 + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` 886 +} # func_xform may be replaced by extended shell implementation 887 + 888 + 889 +# func_fatal_configuration arg... 890 +# Echo program name prefixed message to standard error, followed by 891 +# a configuration failure hint, and exit. 892 +func_fatal_configuration () 893 +{ 894 + func_error ${1+"$@"} 895 + func_error "See the $PACKAGE documentation for more information." 896 + func_fatal_error "Fatal configuration error." 897 +} 898 + 899 + 900 +# func_config 901 +# Display the configuration for all the tags in this script. 902 +func_config () 903 +{ 904 + re_begincf='^# ### BEGIN LIBTOOL' 905 + re_endcf='^# ### END LIBTOOL' 906 + 907 + # Default configuration. 908 + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" 909 + 910 + # Now print the configurations for the tags. 911 + for tagname in $taglist; do 912 + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" 913 + done 914 + 915 + exit $? 916 +} 917 + 918 +# func_features 919 +# Display the features supported by this script. 920 +func_features () 921 +{ 922 + echo "host: $host" 923 + if test "$build_libtool_libs" = yes; then 924 + echo "enable shared libraries" 925 + else 926 + echo "disable shared libraries" 927 + fi 928 + if test "$build_old_libs" = yes; then 929 + echo "enable static libraries" 930 + else 931 + echo "disable static libraries" 932 + fi 933 + 934 + exit $? 935 +} 936 + 937 +# func_enable_tag tagname 938 +# Verify that TAGNAME is valid, and either flag an error and exit, or 939 +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist 940 +# variable here. 941 +func_enable_tag () 942 +{ 943 + # Global variable: 944 + tagname="$1" 945 + 946 + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" 947 + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" 948 + sed_extractcf="/$re_begincf/,/$re_endcf/p" 949 + 950 + # Validate tagname. 951 + case $tagname in 952 + *[!-_A-Za-z0-9,/]*) 953 + func_fatal_error "invalid tag name: $tagname" 954 + ;; 955 + esac 956 + 957 + # Don't test for the "default" C tag, as we know it's 958 + # there but not specially marked. 959 + case $tagname in 960 + CC) ;; 961 + *) 962 + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then 963 + taglist="$taglist $tagname" 964 + 965 + # Evaluate the configuration. Be careful to quote the path 966 + # and the sed script, to avoid splitting on whitespace, but 967 + # also don't use non-portable quotes within backquotes within 968 + # quotes we have to do it in 2 steps: 969 + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` 970 + eval "$extractedcf" 971 + else 972 + func_error "ignoring unknown tag $tagname" 973 + fi 974 + ;; 975 + esac 976 +} 977 + 978 +# func_check_version_match 979 +# Ensure that we are using m4 macros, and libtool script from the same 980 +# release of libtool. 981 +func_check_version_match () 982 +{ 983 + if test "$package_revision" != "$macro_revision"; then 984 + if test "$VERSION" != "$macro_version"; then 985 + if test -z "$macro_version"; then 986 + cat >&2 <<_LT_EOF 987 +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the 988 +$progname: definition of this LT_INIT comes from an older release. 989 +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION 990 +$progname: and run autoconf again. 991 +_LT_EOF 992 + else 993 + cat >&2 <<_LT_EOF 994 +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the 995 +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. 996 +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION 997 +$progname: and run autoconf again. 998 +_LT_EOF 999 + fi 1000 + else 1001 + cat >&2 <<_LT_EOF 1002 +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, 1003 +$progname: but the definition of this LT_INIT comes from revision $macro_revision. 1004 +$progname: You should recreate aclocal.m4 with macros from revision $package_revision 1005 +$progname: of $PACKAGE $VERSION and run autoconf again. 1006 +_LT_EOF 1007 + fi 1008 + 1009 + exit $EXIT_MISMATCH 1010 + fi 1011 +} 1012 + 1013 + 1014 +# Shorthand for --mode=foo, only valid as the first argument 1015 +case $1 in 1016 +clean|clea|cle|cl) 1017 + shift; set dummy --mode clean ${1+"$@"}; shift 1018 + ;; 1019 +compile|compil|compi|comp|com|co|c) 1020 + shift; set dummy --mode compile ${1+"$@"}; shift 1021 + ;; 1022 +execute|execut|execu|exec|exe|ex|e) 1023 + shift; set dummy --mode execute ${1+"$@"}; shift 1024 + ;; 1025 +finish|finis|fini|fin|fi|f) 1026 + shift; set dummy --mode finish ${1+"$@"}; shift 1027 + ;; 1028 +install|instal|insta|inst|ins|in|i) 1029 + shift; set dummy --mode install ${1+"$@"}; shift 1030 + ;; 1031 +link|lin|li|l) 1032 + shift; set dummy --mode link ${1+"$@"}; shift 1033 + ;; 1034 +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) 1035 + shift; set dummy --mode uninstall ${1+"$@"}; shift 1036 + ;; 1037 +esac 1038 + 1039 + 1040 + 1041 +# Option defaults: 1042 +opt_debug=: 1043 +opt_dry_run=false 1044 +opt_config=false 1045 +opt_preserve_dup_deps=false 1046 +opt_features=false 1047 +opt_finish=false 1048 +opt_help=false 1049 +opt_help_all=false 1050 +opt_silent=: 1051 +opt_warning=: 1052 +opt_verbose=: 1053 +opt_silent=false 1054 +opt_verbose=false 1055 + 1056 + 1057 +# Parse options once, thoroughly. This comes as soon as possible in the 1058 +# script to make things like `--version' happen as quickly as we can. 1059 +{ 1060 + # this just eases exit handling 1061 + while test $# -gt 0; do 1062 + opt="$1" 1063 + shift 1064 + case $opt in 1065 + --debug|-x) opt_debug='set -x' 1066 + func_echo "enabling shell trace mode" 1067 + $opt_debug 1068 + ;; 1069 + --dry-run|--dryrun|-n) 1070 + opt_dry_run=: 1071 + ;; 1072 + --config) 1073 + opt_config=: 1074 +func_config 1075 + ;; 1076 + --dlopen|-dlopen) 1077 + optarg="$1" 1078 + opt_dlopen="${opt_dlopen+$opt_dlopen 1079 +}$optarg" 1080 + shift 1081 + ;; 1082 + --preserve-dup-deps) 1083 + opt_preserve_dup_deps=: 1084 + ;; 1085 + --features) 1086 + opt_features=: 1087 +func_features 1088 + ;; 1089 + --finish) 1090 + opt_finish=: 1091 +set dummy --mode finish ${1+"$@"}; shift 1092 + ;; 1093 + --help) 1094 + opt_help=: 1095 + ;; 1096 + --help-all) 1097 + opt_help_all=: 1098 +opt_help=': help-all' 1099 + ;; 1100 + --mode) 1101 + test $# = 0 && func_missing_arg $opt && break 1102 + optarg="$1" 1103 + opt_mode="$optarg" 1104 +case $optarg in 1105 + # Valid mode arguments: 1106 + clean|compile|execute|finish|install|link|relink|uninstall) ;; 1107 + 1108 + # Catch anything else as an error 1109 + *) func_error "invalid argument for $opt" 1110 + exit_cmd=exit 1111 + break 1112 + ;; 1113 +esac 1114 + shift 1115 + ;; 1116 + --no-silent|--no-quiet) 1117 + opt_silent=false 1118 +func_append preserve_args " $opt" 1119 + ;; 1120 + --no-warning|--no-warn) 1121 + opt_warning=false 1122 +func_append preserve_args " $opt" 1123 + ;; 1124 + --no-verbose) 1125 + opt_verbose=false 1126 +func_append preserve_args " $opt" 1127 + ;; 1128 + --silent|--quiet) 1129 + opt_silent=: 1130 +func_append preserve_args " $opt" 1131 + opt_verbose=false 1132 + ;; 1133 + --verbose|-v) 1134 + opt_verbose=: 1135 +func_append preserve_args " $opt" 1136 +opt_silent=false 1137 + ;; 1138 + --tag) 1139 + test $# = 0 && func_missing_arg $opt && break 1140 + optarg="$1" 1141 + opt_tag="$optarg" 1142 +func_append preserve_args " $opt $optarg" 1143 +func_enable_tag "$optarg" 1144 + shift 1145 + ;; 1146 + 1147 + -\?|-h) func_usage ;; 1148 + --help) func_help ;; 1149 + --version) func_version ;; 1150 + 1151 + # Separate optargs to long options: 1152 + --*=*) 1153 + func_split_long_opt "$opt" 1154 + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} 1155 + shift 1156 + ;; 1157 + 1158 + # Separate non-argument short options: 1159 + -\?*|-h*|-n*|-v*) 1160 + func_split_short_opt "$opt" 1161 + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} 1162 + shift 1163 + ;; 1164 + 1165 + --) break ;; 1166 + -*) func_fatal_help "unrecognized option \`$opt'" ;; 1167 + *) set dummy "$opt" ${1+"$@"}; shift; break ;; 1168 + esac 1169 + done 1170 + 1171 + # Validate options: 1172 + 1173 + # save first non-option argument 1174 + if test "$#" -gt 0; then 1175 + nonopt="$opt" 1176 + shift 1177 + fi 1178 + 1179 + # preserve --debug 1180 + test "$opt_debug" = : || func_append preserve_args " --debug" 1181 + 1182 + case $host in 1183 + *cygwin* | *mingw* | *pw32* | *cegcc*) 1184 + # don't eliminate duplications in $postdeps and $predeps 1185 + opt_duplicate_compiler_generated_deps=: 1186 + ;; 1187 + *) 1188 + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps 1189 + ;; 1190 + esac 1191 + 1192 + $opt_help || { 1193 + # Sanity checks first: 1194 + func_check_version_match 1195 + 1196 + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then 1197 + func_fatal_configuration "not configured to build any kind of library" 1198 + fi 1199 + 1200 + # Darwin sucks 1201 + eval std_shrext=\"$shrext_cmds\" 1202 + 1203 + # Only execute mode is allowed to have -dlopen flags. 1204 + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then 1205 + func_error "unrecognized option \`-dlopen'" 1206 + $ECHO "$help" 1>&2 1207 + exit $EXIT_FAILURE 1208 + fi 1209 + 1210 + # Change the help message to a mode-specific one. 1211 + generic_help="$help" 1212 + help="Try \`$progname --help --mode=$opt_mode' for more information." 1213 + } 1214 + 1215 + 1216 + # Bail if the options were screwed 1217 + $exit_cmd $EXIT_FAILURE 1218 +} 1219 + 1220 + 1221 + 1222 + 1223 +## ----------- ## 1224 +## Main. ## 1225 +## ----------- ## 1226 + 1227 +# func_lalib_p file 1228 +# True iff FILE is a libtool `.la' library or `.lo' object file. 1229 +# This function is only a basic sanity check; it will hardly flush out 1230 +# determined imposters. 1231 +func_lalib_p () 1232 +{ 1233 + test -f "$1" && 1234 + $SED -e 4q "$1" 2>/dev/null \ 1235 + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 1236 +} 1237 + 1238 +# func_lalib_unsafe_p file 1239 +# True iff FILE is a libtool `.la' library or `.lo' object file. 1240 +# This function implements the same check as func_lalib_p without 1241 +# resorting to external programs. To this end, it redirects stdin and 1242 +# closes it afterwards, without saving the original file descriptor. 1243 +# As a safety measure, use it only where a negative result would be 1244 +# fatal anyway. Works if `file' does not exist. 1245 +func_lalib_unsafe_p () 1246 +{ 1247 + lalib_p=no 1248 + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then 1249 + for lalib_p_l in 1 2 3 4 1250 + do 1251 + read lalib_p_line 1252 + case "$lalib_p_line" in 1253 + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; 1254 + esac 1255 + done 1256 + exec 0<&5 5<&- 1257 + fi 1258 + test "$lalib_p" = yes 1259 +} 1260 + 1261 +# func_ltwrapper_script_p file 1262 +# True iff FILE is a libtool wrapper script 1263 +# This function is only a basic sanity check; it will hardly flush out 1264 +# determined imposters. 1265 +func_ltwrapper_script_p () 1266 +{ 1267 + func_lalib_p "$1" 1268 +} 1269 + 1270 +# func_ltwrapper_executable_p file 1271 +# True iff FILE is a libtool wrapper executable 1272 +# This function is only a basic sanity check; it will hardly flush out 1273 +# determined imposters. 1274 +func_ltwrapper_executable_p () 1275 +{ 1276 + func_ltwrapper_exec_suffix= 1277 + case $1 in 1278 + *.exe) ;; 1279 + *) func_ltwrapper_exec_suffix=.exe ;; 1280 + esac 1281 + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 1282 +} 1283 + 1284 +# func_ltwrapper_scriptname file 1285 +# Assumes file is an ltwrapper_executable 1286 +# uses $file to determine the appropriate filename for a 1287 +# temporary ltwrapper_script. 1288 +func_ltwrapper_scriptname () 1289 +{ 1290 + func_dirname_and_basename "$1" "" "." 1291 + func_stripname '' '.exe' "$func_basename_result" 1292 + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" 1293 +} 1294 + 1295 +# func_ltwrapper_p file 1296 +# True iff FILE is a libtool wrapper script or wrapper executable 1297 +# This function is only a basic sanity check; it will hardly flush out 1298 +# determined imposters. 1299 +func_ltwrapper_p () 1300 +{ 1301 + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" 1302 +} 1303 + 1304 + 1305 +# func_execute_cmds commands fail_cmd 1306 +# Execute tilde-delimited COMMANDS. 1307 +# If FAIL_CMD is given, eval that upon failure. 1308 +# FAIL_CMD may read-access the current command in variable CMD! 1309 +func_execute_cmds () 1310 +{ 1311 + $opt_debug 1312 + save_ifs=$IFS; IFS='~' 1313 + for cmd in $1; do 1314 + IFS=$save_ifs 1315 + eval cmd=\"$cmd\" 1316 + func_show_eval "$cmd" "${2-:}" 1317 + done 1318 + IFS=$save_ifs 1319 +} 1320 + 1321 + 1322 +# func_source file 1323 +# Source FILE, adding directory component if necessary. 1324 +# Note that it is not necessary on cygwin/mingw to append a dot to 1325 +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe 1326 +# behavior happens only for exec(3), not for open(2)! Also, sourcing 1327 +# `FILE.' does not work on cygwin managed mounts. 1328 +func_source () 1329 +{ 1330 + $opt_debug 1331 + case $1 in 1332 + */* | *\\*) . "$1" ;; 1333 + *) . "./$1" ;; 1334 + esac 1335 +} 1336 + 1337 + 1338 +# func_resolve_sysroot PATH 1339 +# Replace a leading = in PATH with a sysroot. Store the result into 1340 +# func_resolve_sysroot_result 1341 +func_resolve_sysroot () 1342 +{ 1343 + func_resolve_sysroot_result=$1 1344 + case $func_resolve_sysroot_result in 1345 + =*) 1346 + func_stripname '=' '' "$func_resolve_sysroot_result" 1347 + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result 1348 + ;; 1349 + esac 1350 +} 1351 + 1352 +# func_replace_sysroot PATH 1353 +# If PATH begins with the sysroot, replace it with = and 1354 +# store the result into func_replace_sysroot_result. 1355 +func_replace_sysroot () 1356 +{ 1357 + case "$lt_sysroot:$1" in 1358 + ?*:"$lt_sysroot"*) 1359 + func_stripname "$lt_sysroot" '' "$1" 1360 + func_replace_sysroot_result="=$func_stripname_result" 1361 + ;; 1362 + *) 1363 + # Including no sysroot. 1364 + func_replace_sysroot_result=$1 1365 + ;; 1366 + esac 1367 +} 1368 + 1369 +# func_infer_tag arg 1370 +# Infer tagged configuration to use if any are available and 1371 +# if one wasn't chosen via the "--tag" command line option. 1372 +# Only attempt this if the compiler in the base compile 1373 +# command doesn't match the default compiler. 1374 +# arg is usually of the form 'gcc ...' 1375 +func_infer_tag () 1376 +{ 1377 + $opt_debug 1378 + if test -n "$available_tags" && test -z "$tagname"; then 1379 + CC_quoted= 1380 + for arg in $CC; do 1381 + func_append_quoted CC_quoted "$arg" 1382 + done 1383 + CC_expanded=`func_echo_all $CC` 1384 + CC_quoted_expanded=`func_echo_all $CC_quoted` 1385 + case $@ in 1386 + # Blanks in the command may have been stripped by the calling shell, 1387 + # but not from the CC environment variable when configure was run. 1388 + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ 1389 + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; 1390 + # Blanks at the start of $base_compile will cause this to fail 1391 + # if we don't check for them as well. 1392 + *) 1393 + for z in $available_tags; do 1394 + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then 1395 + # Evaluate the configuration. 1396 + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" 1397 + CC_quoted= 1398 + for arg in $CC; do 1399 + # Double-quote args containing other shell metacharacters. 1400 + func_append_quoted CC_quoted "$arg" 1401 + done 1402 + CC_expanded=`func_echo_all $CC` 1403 + CC_quoted_expanded=`func_echo_all $CC_quoted` 1404 + case "$@ " in 1405 + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ 1406 + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) 1407 + # The compiler in the base compile command matches 1408 + # the one in the tagged configuration. 1409 + # Assume this is the tagged configuration we want. 1410 + tagname=$z 1411 + break 1412 + ;; 1413 + esac 1414 + fi 1415 + done 1416 + # If $tagname still isn't set, then no tagged configuration 1417 + # was found and let the user know that the "--tag" command 1418 + # line option must be used. 1419 + if test -z "$tagname"; then 1420 + func_echo "unable to infer tagged configuration" 1421 + func_fatal_error "specify a tag with \`--tag'" 1422 +# else 1423 +# func_verbose "using $tagname tagged configuration" 1424 + fi 1425 + ;; 1426 + esac 1427 + fi 1428 +} 1429 + 1430 + 1431 + 1432 +# func_write_libtool_object output_name pic_name nonpic_name 1433 +# Create a libtool object file (analogous to a ".la" file), 1434 +# but don't create it if we're doing a dry run. 1435 +func_write_libtool_object () 1436 +{ 1437 + write_libobj=${1} 1438 + if test "$build_libtool_libs" = yes; then 1439 + write_lobj=\'${2}\' 1440 + else 1441 + write_lobj=none 1442 + fi 1443 + 1444 + if test "$build_old_libs" = yes; then 1445 + write_oldobj=\'${3}\' 1446 + else 1447 + write_oldobj=none 1448 + fi 1449 + 1450 + $opt_dry_run || { 1451 + cat >${write_libobj}T <<EOF 1452 +# $write_libobj - a libtool object file 1453 +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION 1454 +# 1455 +# Please DO NOT delete this file! 1456 +# It is necessary for linking the library. 1457 + 1458 +# Name of the PIC object. 1459 +pic_object=$write_lobj 1460 + 1461 +# Name of the non-PIC object 1462 +non_pic_object=$write_oldobj 1463 + 1464 +EOF 1465 + $MV "${write_libobj}T" "${write_libobj}" 1466 + } 1467 +} 1468 + 1469 + 1470 +################################################## 1471 +# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS # 1472 +################################################## 1473 + 1474 +# func_convert_core_file_wine_to_w32 ARG 1475 +# Helper function used by file name conversion functions when $build is *nix, 1476 +# and $host is mingw, cygwin, or some other w32 environment. Relies on a 1477 +# correctly configured wine environment available, with the winepath program 1478 +# in $build's $PATH. 1479 +# 1480 +# ARG is the $build file name to be converted to w32 format. 1481 +# Result is available in $func_convert_core_file_wine_to_w32_result, and will 1482 +# be empty on error (or when ARG is empty) 1483 +func_convert_core_file_wine_to_w32 () 1484 +{ 1485 + $opt_debug 1486 + func_convert_core_file_wine_to_w32_result="$1" 1487 + if test -n "$1"; then 1488 + # Unfortunately, winepath does not exit with a non-zero error code, so we 1489 + # are forced to check the contents of stdout. On the other hand, if the 1490 + # command is not found, the shell will set an exit code of 127 and print 1491 + # *an error message* to stdout. So we must check for both error code of 1492 + # zero AND non-empty stdout, which explains the odd construction: 1493 + func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null` 1494 + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then 1495 + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | 1496 + $SED -e "$lt_sed_naive_backslashify"` 1497 + else 1498 + func_convert_core_file_wine_to_w32_result= 1499 + fi 1500 + fi 1501 +} 1502 +# end: func_convert_core_file_wine_to_w32 1503 + 1504 + 1505 +# func_convert_core_path_wine_to_w32 ARG 1506 +# Helper function used by path conversion functions when $build is *nix, and 1507 +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly 1508 +# configured wine environment available, with the winepath program in $build's 1509 +# $PATH. Assumes ARG has no leading or trailing path separator characters. 1510 +# 1511 +# ARG is path to be converted from $build format to win32. 1512 +# Result is available in $func_convert_core_path_wine_to_w32_result. 1513 +# Unconvertible file (directory) names in ARG are skipped; if no directory names 1514 +# are convertible, then the result may be empty. 1515 +func_convert_core_path_wine_to_w32 () 1516 +{ 1517 + $opt_debug 1518 + # unfortunately, winepath doesn't convert paths, only file names 1519 + func_convert_core_path_wine_to_w32_result="" 1520 + if test -n "$1"; then 1521 + oldIFS=$IFS 1522 + IFS=: 1523 + for func_convert_core_path_wine_to_w32_f in $1; do 1524 + IFS=$oldIFS 1525 + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" 1526 + if test -n "$func_convert_core_file_wine_to_w32_result" ; then 1527 + if test -z "$func_convert_core_path_wine_to_w32_result"; then 1528 + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" 1529 + else 1530 + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" 1531 + fi 1532 + fi 1533 + done 1534 + IFS=$oldIFS 1535 + fi 1536 +} 1537 +# end: func_convert_core_path_wine_to_w32 1538 + 1539 + 1540 +# func_cygpath ARGS... 1541 +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when 1542 +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) 1543 +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or 1544 +# (2), returns the Cygwin file name or path in func_cygpath_result (input 1545 +# file name or path is assumed to be in w32 format, as previously converted 1546 +# from $build's *nix or MSYS format). In case (3), returns the w32 file name 1547 +# or path in func_cygpath_result (input file name or path is assumed to be in 1548 +# Cygwin format). Returns an empty string on error. 1549 +# 1550 +# ARGS are passed to cygpath, with the last one being the file name or path to 1551 +# be converted. 1552 +# 1553 +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH 1554 +# environment variable; do not put it in $PATH. 1555 +func_cygpath () 1556 +{ 1557 + $opt_debug 1558 + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then 1559 + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` 1560 + if test "$?" -ne 0; then 1561 + # on failure, ensure result is empty 1562 + func_cygpath_result= 1563 + fi 1564 + else 1565 + func_cygpath_result= 1566 + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" 1567 + fi 1568 +} 1569 +#end: func_cygpath 1570 + 1571 + 1572 +# func_convert_core_msys_to_w32 ARG 1573 +# Convert file name or path ARG from MSYS format to w32 format. Return 1574 +# result in func_convert_core_msys_to_w32_result. 1575 +func_convert_core_msys_to_w32 () 1576 +{ 1577 + $opt_debug 1578 + # awkward: cmd appends spaces to result 1579 + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | 1580 + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` 1581 +} 1582 +#end: func_convert_core_msys_to_w32 1583 + 1584 + 1585 +# func_convert_file_check ARG1 ARG2 1586 +# Verify that ARG1 (a file name in $build format) was converted to $host 1587 +# format in ARG2. Otherwise, emit an error message, but continue (resetting 1588 +# func_to_host_file_result to ARG1). 1589 +func_convert_file_check () 1590 +{ 1591 + $opt_debug 1592 + if test -z "$2" && test -n "$1" ; then 1593 + func_error "Could not determine host file name corresponding to" 1594 + func_error " \`$1'" 1595 + func_error "Continuing, but uninstalled executables may not work." 1596 + # Fallback: 1597 + func_to_host_file_result="$1" 1598 + fi 1599 +} 1600 +# end func_convert_file_check 1601 + 1602 + 1603 +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH 1604 +# Verify that FROM_PATH (a path in $build format) was converted to $host 1605 +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting 1606 +# func_to_host_file_result to a simplistic fallback value (see below). 1607 +func_convert_path_check () 1608 +{ 1609 + $opt_debug 1610 + if test -z "$4" && test -n "$3"; then 1611 + func_error "Could not determine the host path corresponding to" 1612 + func_error " \`$3'" 1613 + func_error "Continuing, but uninstalled executables may not work." 1614 + # Fallback. This is a deliberately simplistic "conversion" and 1615 + # should not be "improved". See libtool.info. 1616 + if test "x$1" != "x$2"; then 1617 + lt_replace_pathsep_chars="s|$1|$2|g" 1618 + func_to_host_path_result=`echo "$3" | 1619 + $SED -e "$lt_replace_pathsep_chars"` 1620 + else 1621 + func_to_host_path_result="$3" 1622 + fi 1623 + fi 1624 +} 1625 +# end func_convert_path_check 1626 + 1627 + 1628 +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG 1629 +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT 1630 +# and appending REPL if ORIG matches BACKPAT. 1631 +func_convert_path_front_back_pathsep () 1632 +{ 1633 + $opt_debug 1634 + case $4 in 1635 + $1 ) func_to_host_path_result="$3$func_to_host_path_result" 1636 + ;; 1637 + esac 1638 + case $4 in 1639 + $2 ) func_append func_to_host_path_result "$3" 1640 + ;; 1641 + esac 1642 +} 1643 +# end func_convert_path_front_back_pathsep 1644 + 1645 + 1646 +################################################## 1647 +# $build to $host FILE NAME CONVERSION FUNCTIONS # 1648 +################################################## 1649 +# invoked via `$to_host_file_cmd ARG' 1650 +# 1651 +# In each case, ARG is the path to be converted from $build to $host format. 1652 +# Result will be available in $func_to_host_file_result. 1653 + 1654 + 1655 +# func_to_host_file ARG 1656 +# Converts the file name ARG from $build format to $host format. Return result 1657 +# in func_to_host_file_result. 1658 +func_to_host_file () 1659 +{ 1660 + $opt_debug 1661 + $to_host_file_cmd "$1" 1662 +} 1663 +# end func_to_host_file 1664 + 1665 + 1666 +# func_to_tool_file ARG LAZY 1667 +# converts the file name ARG from $build format to toolchain format. Return 1668 +# result in func_to_tool_file_result. If the conversion in use is listed 1669 +# in (the comma separated) LAZY, no conversion takes place. 1670 +func_to_tool_file () 1671 +{ 1672 + $opt_debug 1673 + case ,$2, in 1674 + *,"$to_tool_file_cmd",*) 1675 + func_to_tool_file_result=$1 1676 + ;; 1677 + *) 1678 + $to_tool_file_cmd "$1" 1679 + func_to_tool_file_result=$func_to_host_file_result 1680 + ;; 1681 + esac 1682 +} 1683 +# end func_to_tool_file 1684 + 1685 + 1686 +# func_convert_file_noop ARG 1687 +# Copy ARG to func_to_host_file_result. 1688 +func_convert_file_noop () 1689 +{ 1690 + func_to_host_file_result="$1" 1691 +} 1692 +# end func_convert_file_noop 1693 + 1694 + 1695 +# func_convert_file_msys_to_w32 ARG 1696 +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic 1697 +# conversion to w32 is not available inside the cwrapper. Returns result in 1698 +# func_to_host_file_result. 1699 +func_convert_file_msys_to_w32 () 1700 +{ 1701 + $opt_debug 1702 + func_to_host_file_result="$1" 1703 + if test -n "$1"; then 1704 + func_convert_core_msys_to_w32 "$1" 1705 + func_to_host_file_result="$func_convert_core_msys_to_w32_result" 1706 + fi 1707 + func_convert_file_check "$1" "$func_to_host_file_result" 1708 +} 1709 +# end func_convert_file_msys_to_w32 1710 + 1711 + 1712 +# func_convert_file_cygwin_to_w32 ARG 1713 +# Convert file name ARG from Cygwin to w32 format. Returns result in 1714 +# func_to_host_file_result. 1715 +func_convert_file_cygwin_to_w32 () 1716 +{ 1717 + $opt_debug 1718 + func_to_host_file_result="$1" 1719 + if test -n "$1"; then 1720 + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use 1721 + # LT_CYGPATH in this case. 1722 + func_to_host_file_result=`cygpath -m "$1"` 1723 + fi 1724 + func_convert_file_check "$1" "$func_to_host_file_result" 1725 +} 1726 +# end func_convert_file_cygwin_to_w32 1727 + 1728 + 1729 +# func_convert_file_nix_to_w32 ARG 1730 +# Convert file name ARG from *nix to w32 format. Requires a wine environment 1731 +# and a working winepath. Returns result in func_to_host_file_result. 1732 +func_convert_file_nix_to_w32 () 1733 +{ 1734 + $opt_debug 1735 + func_to_host_file_result="$1" 1736 + if test -n "$1"; then 1737 + func_convert_core_file_wine_to_w32 "$1" 1738 + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" 1739 + fi 1740 + func_convert_file_check "$1" "$func_to_host_file_result" 1741 +} 1742 +# end func_convert_file_nix_to_w32 1743 + 1744 + 1745 +# func_convert_file_msys_to_cygwin ARG 1746 +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. 1747 +# Returns result in func_to_host_file_result. 1748 +func_convert_file_msys_to_cygwin () 1749 +{ 1750 + $opt_debug 1751 + func_to_host_file_result="$1" 1752 + if test -n "$1"; then 1753 + func_convert_core_msys_to_w32 "$1" 1754 + func_cygpath -u "$func_convert_core_msys_to_w32_result" 1755 + func_to_host_file_result="$func_cygpath_result" 1756 + fi 1757 + func_convert_file_check "$1" "$func_to_host_file_result" 1758 +} 1759 +# end func_convert_file_msys_to_cygwin 1760 + 1761 + 1762 +# func_convert_file_nix_to_cygwin ARG 1763 +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed 1764 +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result 1765 +# in func_to_host_file_result. 1766 +func_convert_file_nix_to_cygwin () 1767 +{ 1768 + $opt_debug 1769 + func_to_host_file_result="$1" 1770 + if test -n "$1"; then 1771 + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. 1772 + func_convert_core_file_wine_to_w32 "$1" 1773 + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" 1774 + func_to_host_file_result="$func_cygpath_result" 1775 + fi 1776 + func_convert_file_check "$1" "$func_to_host_file_result" 1777 +} 1778 +# end func_convert_file_nix_to_cygwin 1779 + 1780 + 1781 +############################################# 1782 +# $build to $host PATH CONVERSION FUNCTIONS # 1783 +############################################# 1784 +# invoked via `$to_host_path_cmd ARG' 1785 +# 1786 +# In each case, ARG is the path to be converted from $build to $host format. 1787 +# The result will be available in $func_to_host_path_result. 1788 +# 1789 +# Path separators are also converted from $build format to $host format. If 1790 +# ARG begins or ends with a path separator character, it is preserved (but 1791 +# converted to $host format) on output. 1792 +# 1793 +# All path conversion functions are named using the following convention: 1794 +# file name conversion function : func_convert_file_X_to_Y () 1795 +# path conversion function : func_convert_path_X_to_Y () 1796 +# where, for any given $build/$host combination the 'X_to_Y' value is the 1797 +# same. If conversion functions are added for new $build/$host combinations, 1798 +# the two new functions must follow this pattern, or func_init_to_host_path_cmd 1799 +# will break. 1800 + 1801 + 1802 +# func_init_to_host_path_cmd 1803 +# Ensures that function "pointer" variable $to_host_path_cmd is set to the 1804 +# appropriate value, based on the value of $to_host_file_cmd. 1805 +to_host_path_cmd= 1806 +func_init_to_host_path_cmd () 1807 +{ 1808 + $opt_debug 1809 + if test -z "$to_host_path_cmd"; then 1810 + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" 1811 + to_host_path_cmd="func_convert_path_${func_stripname_result}" 1812 + fi 1813 +} 1814 + 1815 + 1816 +# func_to_host_path ARG 1817 +# Converts the path ARG from $build format to $host format. Return result 1818 +# in func_to_host_path_result. 1819 +func_to_host_path () 1820 +{ 1821 + $opt_debug 1822 + func_init_to_host_path_cmd 1823 + $to_host_path_cmd "$1" 1824 +} 1825 +# end func_to_host_path 1826 + 1827 + 1828 +# func_convert_path_noop ARG 1829 +# Copy ARG to func_to_host_path_result. 1830 +func_convert_path_noop () 1831 +{ 1832 + func_to_host_path_result="$1" 1833 +} 1834 +# end func_convert_path_noop 1835 + 1836 + 1837 +# func_convert_path_msys_to_w32 ARG 1838 +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic 1839 +# conversion to w32 is not available inside the cwrapper. Returns result in 1840 +# func_to_host_path_result. 1841 +func_convert_path_msys_to_w32 () 1842 +{ 1843 + $opt_debug 1844 + func_to_host_path_result="$1" 1845 + if test -n "$1"; then 1846 + # Remove leading and trailing path separator characters from ARG. MSYS 1847 + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; 1848 + # and winepath ignores them completely. 1849 + func_stripname : : "$1" 1850 + func_to_host_path_tmp1=$func_stripname_result 1851 + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" 1852 + func_to_host_path_result="$func_convert_core_msys_to_w32_result" 1853 + func_convert_path_check : ";" \ 1854 + "$func_to_host_path_tmp1" "$func_to_host_path_result" 1855 + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" 1856 + fi 1857 +} 1858 +# end func_convert_path_msys_to_w32 1859 + 1860 + 1861 +# func_convert_path_cygwin_to_w32 ARG 1862 +# Convert path ARG from Cygwin to w32 format. Returns result in 1863 +# func_to_host_file_result. 1864 +func_convert_path_cygwin_to_w32 () 1865 +{ 1866 + $opt_debug 1867 + func_to_host_path_result="$1" 1868 + if test -n "$1"; then 1869 + # See func_convert_path_msys_to_w32: 1870 + func_stripname : : "$1" 1871 + func_to_host_path_tmp1=$func_stripname_result 1872 + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` 1873 + func_convert_path_check : ";" \ 1874 + "$func_to_host_path_tmp1" "$func_to_host_path_result" 1875 + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" 1876 + fi 1877 +} 1878 +# end func_convert_path_cygwin_to_w32 1879 + 1880 + 1881 +# func_convert_path_nix_to_w32 ARG 1882 +# Convert path ARG from *nix to w32 format. Requires a wine environment and 1883 +# a working winepath. Returns result in func_to_host_file_result. 1884 +func_convert_path_nix_to_w32 () 1885 +{ 1886 + $opt_debug 1887 + func_to_host_path_result="$1" 1888 + if test -n "$1"; then 1889 + # See func_convert_path_msys_to_w32: 1890 + func_stripname : : "$1" 1891 + func_to_host_path_tmp1=$func_stripname_result 1892 + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" 1893 + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" 1894 + func_convert_path_check : ";" \ 1895 + "$func_to_host_path_tmp1" "$func_to_host_path_result" 1896 + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" 1897 + fi 1898 +} 1899 +# end func_convert_path_nix_to_w32 1900 + 1901 + 1902 +# func_convert_path_msys_to_cygwin ARG 1903 +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. 1904 +# Returns result in func_to_host_file_result. 1905 +func_convert_path_msys_to_cygwin () 1906 +{ 1907 + $opt_debug 1908 + func_to_host_path_result="$1" 1909 + if test -n "$1"; then 1910 + # See func_convert_path_msys_to_w32: 1911 + func_stripname : : "$1" 1912 + func_to_host_path_tmp1=$func_stripname_result 1913 + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" 1914 + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" 1915 + func_to_host_path_result="$func_cygpath_result" 1916 + func_convert_path_check : : \ 1917 + "$func_to_host_path_tmp1" "$func_to_host_path_result" 1918 + func_convert_path_front_back_pathsep ":*" "*:" : "$1" 1919 + fi 1920 +} 1921 +# end func_convert_path_msys_to_cygwin 1922 + 1923 + 1924 +# func_convert_path_nix_to_cygwin ARG 1925 +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a 1926 +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in 1927 +# func_to_host_file_result. 1928 +func_convert_path_nix_to_cygwin () 1929 +{ 1930 + $opt_debug 1931 + func_to_host_path_result="$1" 1932 + if test -n "$1"; then 1933 + # Remove leading and trailing path separator characters from 1934 + # ARG. msys behavior is inconsistent here, cygpath turns them 1935 + # into '.;' and ';.', and winepath ignores them completely. 1936 + func_stripname : : "$1" 1937 + func_to_host_path_tmp1=$func_stripname_result 1938 + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" 1939 + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" 1940 + func_to_host_path_result="$func_cygpath_result" 1941 + func_convert_path_check : : \ 1942 + "$func_to_host_path_tmp1" "$func_to_host_path_result" 1943 + func_convert_path_front_back_pathsep ":*" "*:" : "$1" 1944 + fi 1945 +} 1946 +# end func_convert_path_nix_to_cygwin 1947 + 1948 + 1949 +# func_mode_compile arg... 1950 +func_mode_compile () 1951 +{ 1952 + $opt_debug 1953 + # Get the compilation command and the source file. 1954 + base_compile= 1955 + srcfile="$nonopt" # always keep a non-empty value in "srcfile" 1956 + suppress_opt=yes 1957 + suppress_output= 1958 + arg_mode=normal 1959 + libobj= 1960 + later= 1961 + pie_flag= 1962 + 1963 + for arg 1964 + do 1965 + case $arg_mode in 1966 + arg ) 1967 + # do not "continue". Instead, add this to base_compile 1968 + lastarg="$arg" 1969 + arg_mode=normal 1970 + ;; 1971 + 1972 + target ) 1973 + libobj="$arg" 1974 + arg_mode=normal 1975 + continue 1976 + ;; 1977 + 1978 + normal ) 1979 + # Accept any command-line options. 1980 + case $arg in 1981 + -o) 1982 + test -n "$libobj" && \ 1983 + func_fatal_error "you cannot specify \`-o' more than once" 1984 + arg_mode=target 1985 + continue 1986 + ;; 1987 + 1988 + -pie | -fpie | -fPIE) 1989 + func_append pie_flag " $arg" 1990 + continue 1991 + ;; 1992 + 1993 + -shared | -static | -prefer-pic | -prefer-non-pic) 1994 + func_append later " $arg" 1995 + continue 1996 + ;; 1997 + 1998 + -no-suppress) 1999 + suppress_opt=no 2000 + continue 2001 + ;; 2002 + 2003 + -Xcompiler) 2004 + arg_mode=arg # the next one goes into the "base_compile" arg list 2005 + continue # The current "srcfile" will either be retained or 2006 + ;; # replaced later. I would guess that would be a bug. 2007 + 2008 + -Wc,*) 2009 + func_stripname '-Wc,' '' "$arg" 2010 + args=$func_stripname_result 2011 + lastarg= 2012 + save_ifs="$IFS"; IFS=',' 2013 + for arg in $args; do 2014 + IFS="$save_ifs" 2015 + func_append_quoted lastarg "$arg" 2016 + done 2017 + IFS="$save_ifs" 2018 + func_stripname ' ' '' "$lastarg" 2019 + lastarg=$func_stripname_result 2020 + 2021 + # Add the arguments to base_compile. 2022 + func_append base_compile " $lastarg" 2023 + continue 2024 + ;; 2025 + 2026 + *) 2027 + # Accept the current argument as the source file. 2028 + # The previous "srcfile" becomes the current argument. 2029 + # 2030 + lastarg="$srcfile" 2031 + srcfile="$arg" 2032 + ;; 2033 + esac # case $arg 2034 + ;; 2035 + esac # case $arg_mode 2036 + 2037 + # Aesthetically quote the previous argument. 2038 + func_append_quoted base_compile "$lastarg" 2039 + done # for arg 2040 + 2041 + case $arg_mode in 2042 + arg) 2043 + func_fatal_error "you must specify an argument for -Xcompile" 2044 + ;; 2045 + target) 2046 + func_fatal_error "you must specify a target with \`-o'" 2047 + ;; 2048 + *) 2049 + # Get the name of the library object. 2050 + test -z "$libobj" && { 2051 + func_basename "$srcfile" 2052 + libobj="$func_basename_result" 2053 + } 2054 + ;; 2055 + esac 2056 + 2057 + # Recognize several different file suffixes. 2058 + # If the user specifies -o file.o, it is replaced with file.lo 2059 + case $libobj in 2060 + *.[cCFSifmso] | \ 2061 + *.ada | *.adb | *.ads | *.asm | \ 2062 + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ 2063 + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) 2064 + func_xform "$libobj" 2065 + libobj=$func_xform_result 2066 + ;; 2067 + esac 2068 + 2069 + case $libobj in 2070 + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; 2071 + *) 2072 + func_fatal_error "cannot determine name of library object from \`$libobj'" 2073 + ;; 2074 + esac 2075 + 2076 + func_infer_tag $base_compile 2077 + 2078 + for arg in $later; do 2079 + case $arg in 2080 + -shared) 2081 + test "$build_libtool_libs" != yes && \ 2082 + func_fatal_configuration "can not build a shared library" 2083 + build_old_libs=no 2084 + continue 2085 + ;; 2086 + 2087 + -static) 2088 + build_libtool_libs=no 2089 + build_old_libs=yes 2090 + continue 2091 + ;; 2092 + 2093 + -prefer-pic) 2094 + pic_mode=yes 2095 + continue 2096 + ;; 2097 + 2098 + -prefer-non-pic) 2099 + pic_mode=no 2100 + continue 2101 + ;; 2102 + esac 2103 + done 2104 + 2105 + func_quote_for_eval "$libobj" 2106 + test "X$libobj" != "X$func_quote_for_eval_result" \ 2107 + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ 2108 + && func_warning "libobj name \`$libobj' may not contain shell special characters." 2109 + func_dirname_and_basename "$obj" "/" "" 2110 + objname="$func_basename_result" 2111 + xdir="$func_dirname_result" 2112 + lobj=${xdir}$objdir/$objname 2113 + 2114 + test -z "$base_compile" && \ 2115 + func_fatal_help "you must specify a compilation command" 2116 + 2117 + # Delete any leftover library objects. 2118 + if test "$build_old_libs" = yes; then 2119 + removelist="$obj $lobj $libobj ${libobj}T" 2120 + else 2121 + removelist="$lobj $libobj ${libobj}T" 2122 + fi 2123 + 2124 + # On Cygwin there's no "real" PIC flag so we must build both object types 2125 + case $host_os in 2126 + cygwin* | mingw* | pw32* | os2* | cegcc*) 2127 + pic_mode=default 2128 + ;; 2129 + esac 2130 + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then 2131 + # non-PIC code in shared libraries is not supported 2132 + pic_mode=default 2133 + fi 2134 + 2135 + # Calculate the filename of the output object if compiler does 2136 + # not support -o with -c 2137 + if test "$compiler_c_o" = no; then 2138 + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} 2139 + lockfile="$output_obj.lock" 2140 + else 2141 + output_obj= 2142 + need_locks=no 2143 + lockfile= 2144 + fi 2145 + 2146 + # Lock this critical section if it is needed 2147 + # We use this script file to make the link, it avoids creating a new file 2148 + if test "$need_locks" = yes; then 2149 + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do 2150 + func_echo "Waiting for $lockfile to be removed" 2151 + sleep 2 2152 + done 2153 + elif test "$need_locks" = warn; then 2154 + if test -f "$lockfile"; then 2155 + $ECHO "\ 2156 +*** ERROR, $lockfile exists and contains: 2157 +`cat $lockfile 2>/dev/null` 2158 + 2159 +This indicates that another process is trying to use the same 2160 +temporary object file, and libtool could not work around it because 2161 +your compiler does not support \`-c' and \`-o' together. If you 2162 +repeat this compilation, it may succeed, by chance, but you had better 2163 +avoid parallel builds (make -j) in this platform, or get a better 2164 +compiler." 2165 + 2166 + $opt_dry_run || $RM $removelist 2167 + exit $EXIT_FAILURE 2168 + fi 2169 + func_append removelist " $output_obj" 2170 + $ECHO "$srcfile" > "$lockfile" 2171 + fi 2172 + 2173 + $opt_dry_run || $RM $removelist 2174 + func_append removelist " $lockfile" 2175 + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 2176 + 2177 + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 2178 + srcfile=$func_to_tool_file_result 2179 + func_quote_for_eval "$srcfile" 2180 + qsrcfile=$func_quote_for_eval_result 2181 + 2182 + # Only build a PIC object if we are building libtool libraries. 2183 + if test "$build_libtool_libs" = yes; then 2184 + # Without this assignment, base_compile gets emptied. 2185 + fbsd_hideous_sh_bug=$base_compile 2186 + 2187 + if test "$pic_mode" != no; then 2188 + command="$base_compile $qsrcfile $pic_flag" 2189 + else 2190 + # Don't build PIC code 2191 + command="$base_compile $qsrcfile" 2192 + fi 2193 + 2194 + func_mkdir_p "$xdir$objdir" 2195 + 2196 + if test -z "$output_obj"; then 2197 + # Place PIC objects in $objdir 2198 + func_append command " -o $lobj" 2199 + fi 2200 + 2201 + func_show_eval_locale "$command" \ 2202 + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' 2203 + 2204 + if test "$need_locks" = warn && 2205 + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then 2206 + $ECHO "\ 2207 +*** ERROR, $lockfile contains: 2208 +`cat $lockfile 2>/dev/null` 2209 + 2210 +but it should contain: 2211 +$srcfile 2212 + 2213 +This indicates that another process is trying to use the same 2214 +temporary object file, and libtool could not work around it because 2215 +your compiler does not support \`-c' and \`-o' together. If you 2216 +repeat this compilation, it may succeed, by chance, but you had better 2217 +avoid parallel builds (make -j) in this platform, or get a better 2218 +compiler." 2219 + 2220 + $opt_dry_run || $RM $removelist 2221 + exit $EXIT_FAILURE 2222 + fi 2223 + 2224 + # Just move the object if needed, then go on to compile the next one 2225 + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then 2226 + func_show_eval '$MV "$output_obj" "$lobj"' \ 2227 + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' 2228 + fi 2229 + 2230 + # Allow error messages only from the first compilation. 2231 + if test "$suppress_opt" = yes; then 2232 + suppress_output=' >/dev/null 2>&1' 2233 + fi 2234 + fi 2235 + 2236 + # Only build a position-dependent object if we build old libraries. 2237 + if test "$build_old_libs" = yes; then 2238 + if test "$pic_mode" != yes; then 2239 + # Don't build PIC code 2240 + command="$base_compile $qsrcfile$pie_flag" 2241 + else 2242 + command="$base_compile $qsrcfile $pic_flag" 2243 + fi 2244 + if test "$compiler_c_o" = yes; then 2245 + func_append command " -o $obj" 2246 + fi 2247 + 2248 + # Suppress compiler output if we already did a PIC compilation. 2249 + func_append command "$suppress_output" 2250 + func_show_eval_locale "$command" \ 2251 + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 2252 + 2253 + if test "$need_locks" = warn && 2254 + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then 2255 + $ECHO "\ 2256 +*** ERROR, $lockfile contains: 2257 +`cat $lockfile 2>/dev/null` 2258 + 2259 +but it should contain: 2260 +$srcfile 2261 + 2262 +This indicates that another process is trying to use the same 2263 +temporary object file, and libtool could not work around it because 2264 +your compiler does not support \`-c' and \`-o' together. If you 2265 +repeat this compilation, it may succeed, by chance, but you had better 2266 +avoid parallel builds (make -j) in this platform, or get a better 2267 +compiler." 2268 + 2269 + $opt_dry_run || $RM $removelist 2270 + exit $EXIT_FAILURE 2271 + fi 2272 + 2273 + # Just move the object if needed 2274 + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then 2275 + func_show_eval '$MV "$output_obj" "$obj"' \ 2276 + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' 2277 + fi 2278 + fi 2279 + 2280 + $opt_dry_run || { 2281 + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" 2282 + 2283 + # Unlock the critical section if it was locked 2284 + if test "$need_locks" != no; then 2285 + removelist=$lockfile 2286 + $RM "$lockfile" 2287 + fi 2288 + } 2289 + 2290 + exit $EXIT_SUCCESS 2291 +} 2292 + 2293 +$opt_help || { 2294 + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} 2295 +} 2296 + 2297 +func_mode_help () 2298 +{ 2299 + # We need to display help for each of the modes. 2300 + case $opt_mode in 2301 + "") 2302 + # Generic help is extracted from the usage comments 2303 + # at the start of this file. 2304 + func_help 2305 + ;; 2306 + 2307 + clean) 2308 + $ECHO \ 2309 +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... 2310 + 2311 +Remove files from the build directory. 2312 + 2313 +RM is the name of the program to use to delete files associated with each FILE 2314 +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed 2315 +to RM. 2316 + 2317 +If FILE is a libtool library, object or program, all the files associated 2318 +with it are deleted. Otherwise, only FILE itself is deleted using RM." 2319 + ;; 2320 + 2321 + compile) 2322 + $ECHO \ 2323 +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE 2324 + 2325 +Compile a source file into a libtool library object. 2326 + 2327 +This mode accepts the following additional options: 2328 + 2329 + -o OUTPUT-FILE set the output file name to OUTPUT-FILE 2330 + -no-suppress do not suppress compiler output for multiple passes 2331 + -prefer-pic try to build PIC objects only 2332 + -prefer-non-pic try to build non-PIC objects only 2333 + -shared do not build a \`.o' file suitable for static linking 2334 + -static only build a \`.o' file suitable for static linking 2335 + -Wc,FLAG pass FLAG directly to the compiler 2336 + 2337 +COMPILE-COMMAND is a command to be used in creating a \`standard' object file 2338 +from the given SOURCEFILE. 2339 + 2340 +The output file name is determined by removing the directory component from 2341 +SOURCEFILE, then substituting the C source code suffix \`.c' with the 2342 +library object suffix, \`.lo'." 2343 + ;; 2344 + 2345 + execute) 2346 + $ECHO \ 2347 +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... 2348 + 2349 +Automatically set library path, then run a program. 2350 + 2351 +This mode accepts the following additional options: 2352 + 2353 + -dlopen FILE add the directory containing FILE to the library path 2354 + 2355 +This mode sets the library path environment variable according to \`-dlopen' 2356 +flags. 2357 + 2358 +If any of the ARGS are libtool executable wrappers, then they are translated 2359 +into their corresponding uninstalled binary, and any of their required library 2360 +directories are added to the library path. 2361 + 2362 +Then, COMMAND is executed, with ARGS as arguments." 2363 + ;; 2364 + 2365 + finish) 2366 + $ECHO \ 2367 +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... 2368 + 2369 +Complete the installation of libtool libraries. 2370 + 2371 +Each LIBDIR is a directory that contains libtool libraries. 2372 + 2373 +The commands that this mode executes may require superuser privileges. Use 2374 +the \`--dry-run' option if you just want to see what would be executed." 2375 + ;; 2376 + 2377 + install) 2378 + $ECHO \ 2379 +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... 2380 + 2381 +Install executables or libraries. 2382 + 2383 +INSTALL-COMMAND is the installation command. The first component should be 2384 +either the \`install' or \`cp' program. 2385 + 2386 +The following components of INSTALL-COMMAND are treated specially: 2387 + 2388 + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation 2389 + 2390 +The rest of the components are interpreted as arguments to that command (only 2391 +BSD-compatible install options are recognized)." 2392 + ;; 2393 + 2394 + link) 2395 + $ECHO \ 2396 +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... 2397 + 2398 +Link object files or libraries together to form another library, or to 2399 +create an executable program. 2400 + 2401 +LINK-COMMAND is a command using the C compiler that you would use to create 2402 +a program from several object files. 2403 + 2404 +The following components of LINK-COMMAND are treated specially: 2405 + 2406 + -all-static do not do any dynamic linking at all 2407 + -avoid-version do not add a version suffix if possible 2408 + -bindir BINDIR specify path to binaries directory (for systems where 2409 + libraries must be found in the PATH setting at runtime) 2410 + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime 2411 + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols 2412 + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) 2413 + -export-symbols SYMFILE 2414 + try to export only the symbols listed in SYMFILE 2415 + -export-symbols-regex REGEX 2416 + try to export only the symbols matching REGEX 2417 + -LLIBDIR search LIBDIR for required installed libraries 2418 + -lNAME OUTPUT-FILE requires the installed library libNAME 2419 + -module build a library that can dlopened 2420 + -no-fast-install disable the fast-install mode 2421 + -no-install link a not-installable executable 2422 + -no-undefined declare that a library does not refer to external symbols 2423 + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects 2424 + -objectlist FILE Use a list of object files found in FILE to specify objects 2425 + -precious-files-regex REGEX 2426 + don't remove output files matching REGEX 2427 + -release RELEASE specify package release information 2428 + -rpath LIBDIR the created library will eventually be installed in LIBDIR 2429 + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries 2430 + -shared only do dynamic linking of libtool libraries 2431 + -shrext SUFFIX override the standard shared library file extension 2432 + -static do not do any dynamic linking of uninstalled libtool libraries 2433 + -static-libtool-libs 2434 + do not do any dynamic linking of libtool libraries 2435 + -version-info CURRENT[:REVISION[:AGE]] 2436 + specify library version info [each variable defaults to 0] 2437 + -weak LIBNAME declare that the target provides the LIBNAME interface 2438 + -Wc,FLAG 2439 + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler 2440 + -Wl,FLAG 2441 + -Xlinker FLAG pass linker-specific FLAG directly to the linker 2442 + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) 2443 + 2444 +All other options (arguments beginning with \`-') are ignored. 2445 + 2446 +Every other argument is treated as a filename. Files ending in \`.la' are 2447 +treated as uninstalled libtool libraries, other files are standard or library 2448 +object files. 2449 + 2450 +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, 2451 +only library objects (\`.lo' files) may be specified, and \`-rpath' is 2452 +required, except when creating a convenience library. 2453 + 2454 +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created 2455 +using \`ar' and \`ranlib', or on Windows using \`lib'. 2456 + 2457 +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file 2458 +is created, otherwise an executable program is created." 2459 + ;; 2460 + 2461 + uninstall) 2462 + $ECHO \ 2463 +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... 2464 + 2465 +Remove libraries from an installation directory. 2466 + 2467 +RM is the name of the program to use to delete files associated with each FILE 2468 +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed 2469 +to RM. 2470 + 2471 +If FILE is a libtool library, all the files associated with it are deleted. 2472 +Otherwise, only FILE itself is deleted using RM." 2473 + ;; 2474 + 2475 + *) 2476 + func_fatal_help "invalid operation mode \`$opt_mode'" 2477 + ;; 2478 + esac 2479 + 2480 + echo 2481 + $ECHO "Try \`$progname --help' for more information about other modes." 2482 +} 2483 + 2484 +# Now that we've collected a possible --mode arg, show help if necessary 2485 +if $opt_help; then 2486 + if test "$opt_help" = :; then 2487 + func_mode_help 2488 + else 2489 + { 2490 + func_help noexit 2491 + for opt_mode in compile link execute install finish uninstall clean; do 2492 + func_mode_help 2493 + done 2494 + } | sed -n '1p; 2,$s/^Usage:/ or: /p' 2495 + { 2496 + func_help noexit 2497 + for opt_mode in compile link execute install finish uninstall clean; do 2498 + echo 2499 + func_mode_help 2500 + done 2501 + } | 2502 + sed '1d 2503 + /^When reporting/,/^Report/{ 2504 + H 2505 + d 2506 + } 2507 + $x 2508 + /information about other modes/d 2509 + /more detailed .*MODE/d 2510 + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' 2511 + fi 2512 + exit $? 2513 +fi 2514 + 2515 + 2516 +# func_mode_execute arg... 2517 +func_mode_execute () 2518 +{ 2519 + $opt_debug 2520 + # The first argument is the command name. 2521 + cmd="$nonopt" 2522 + test -z "$cmd" && \ 2523 + func_fatal_help "you must specify a COMMAND" 2524 + 2525 + # Handle -dlopen flags immediately. 2526 + for file in $opt_dlopen; do 2527 + test -f "$file" \ 2528 + || func_fatal_help "\`$file' is not a file" 2529 + 2530 + dir= 2531 + case $file in 2532 + *.la) 2533 + func_resolve_sysroot "$file" 2534 + file=$func_resolve_sysroot_result 2535 + 2536 + # Check to see that this really is a libtool archive. 2537 + func_lalib_unsafe_p "$file" \ 2538 + || func_fatal_help "\`$lib' is not a valid libtool archive" 2539 + 2540 + # Read the libtool library. 2541 + dlname= 2542 + library_names= 2543 + func_source "$file" 2544 + 2545 + # Skip this library if it cannot be dlopened. 2546 + if test -z "$dlname"; then 2547 + # Warn if it was a shared library. 2548 + test -n "$library_names" && \ 2549 + func_warning "\`$file' was not linked with \`-export-dynamic'" 2550 + continue 2551 + fi 2552 + 2553 + func_dirname "$file" "" "." 2554 + dir="$func_dirname_result" 2555 + 2556 + if test -f "$dir/$objdir/$dlname"; then 2557 + func_append dir "/$objdir" 2558 + else 2559 + if test ! -f "$dir/$dlname"; then 2560 + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 2561 + fi 2562 + fi 2563 + ;; 2564 + 2565 + *.lo) 2566 + # Just add the directory containing the .lo file. 2567 + func_dirname "$file" "" "." 2568 + dir="$func_dirname_result" 2569 + ;; 2570 + 2571 + *) 2572 + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" 2573 + continue 2574 + ;; 2575 + esac 2576 + 2577 + # Get the absolute pathname. 2578 + absdir=`cd "$dir" && pwd` 2579 + test -n "$absdir" && dir="$absdir" 2580 + 2581 + # Now add the directory to shlibpath_var. 2582 + if eval "test -z \"\$$shlibpath_var\""; then 2583 + eval "$shlibpath_var=\"\$dir\"" 2584 + else 2585 + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" 2586 + fi 2587 + done 2588 + 2589 + # This variable tells wrapper scripts just to set shlibpath_var 2590 + # rather than running their programs. 2591 + libtool_execute_magic="$magic" 2592 + 2593 + # Check if any of the arguments is a wrapper script. 2594 + args= 2595 + for file 2596 + do 2597 + case $file in 2598 + -* | *.la | *.lo ) ;; 2599 + *) 2600 + # Do a test to see if this is really a libtool program. 2601 + if func_ltwrapper_script_p "$file"; then 2602 + func_source "$file" 2603 + # Transform arg to wrapped name. 2604 + file="$progdir/$program" 2605 + elif func_ltwrapper_executable_p "$file"; then 2606 + func_ltwrapper_scriptname "$file" 2607 + func_source "$func_ltwrapper_scriptname_result" 2608 + # Transform arg to wrapped name. 2609 + file="$progdir/$program" 2610 + fi 2611 + ;; 2612 + esac 2613 + # Quote arguments (to preserve shell metacharacters). 2614 + func_append_quoted args "$file" 2615 + done 2616 + 2617 + if test "X$opt_dry_run" = Xfalse; then 2618 + if test -n "$shlibpath_var"; then 2619 + # Export the shlibpath_var. 2620 + eval "export $shlibpath_var" 2621 + fi 2622 + 2623 + # Restore saved environment variables 2624 + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES 2625 + do 2626 + eval "if test \"\${save_$lt_var+set}\" = set; then 2627 + $lt_var=\$save_$lt_var; export $lt_var 2628 + else 2629 + $lt_unset $lt_var 2630 + fi" 2631 + done 2632 + 2633 + # Now prepare to actually exec the command. 2634 + exec_cmd="\$cmd$args" 2635 + else 2636 + # Display what would be done. 2637 + if test -n "$shlibpath_var"; then 2638 + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" 2639 + echo "export $shlibpath_var" 2640 + fi 2641 + $ECHO "$cmd$args" 2642 + exit $EXIT_SUCCESS 2643 + fi 2644 +} 2645 + 2646 +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} 2647 + 2648 + 2649 +# func_mode_finish arg... 2650 +func_mode_finish () 2651 +{ 2652 + $opt_debug 2653 + libs= 2654 + libdirs= 2655 + admincmds= 2656 + 2657 + for opt in "$nonopt" ${1+"$@"} 2658 + do 2659 + if test -d "$opt"; then 2660 + func_append libdirs " $opt" 2661 + 2662 + elif test -f "$opt"; then 2663 + if func_lalib_unsafe_p "$opt"; then 2664 + func_append libs " $opt" 2665 + else 2666 + func_warning "\`$opt' is not a valid libtool archive" 2667 + fi 2668 + 2669 + else 2670 + func_fatal_error "invalid argument \`$opt'" 2671 + fi 2672 + done 2673 + 2674 + if test -n "$libs"; then 2675 + if test -n "$lt_sysroot"; then 2676 + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` 2677 + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" 2678 + else 2679 + sysroot_cmd= 2680 + fi 2681 + 2682 + # Remove sysroot references 2683 + if $opt_dry_run; then 2684 + for lib in $libs; do 2685 + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" 2686 + done 2687 + else 2688 + tmpdir=`func_mktempdir` 2689 + for lib in $libs; do 2690 + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ 2691 + > $tmpdir/tmp-la 2692 + mv -f $tmpdir/tmp-la $lib 2693 + done 2694 + ${RM}r "$tmpdir" 2695 + fi 2696 + fi 2697 + 2698 + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then 2699 + for libdir in $libdirs; do 2700 + if test -n "$finish_cmds"; then 2701 + # Do each command in the finish commands. 2702 + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds 2703 +'"$cmd"'"' 2704 + fi 2705 + if test -n "$finish_eval"; then 2706 + # Do the single finish_eval. 2707 + eval cmds=\"$finish_eval\" 2708 + $opt_dry_run || eval "$cmds" || func_append admincmds " 2709 + $cmds" 2710 + fi 2711 + done 2712 + fi 2713 + 2714 + # Exit here if they wanted silent mode. 2715 + $opt_silent && exit $EXIT_SUCCESS 2716 + 2717 + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then 2718 + echo "----------------------------------------------------------------------" 2719 + echo "Libraries have been installed in:" 2720 + for libdir in $libdirs; do 2721 + $ECHO " $libdir" 2722 + done 2723 + echo 2724 + echo "If you ever happen to want to link against installed libraries" 2725 + echo "in a given directory, LIBDIR, you must either use libtool, and" 2726 + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" 2727 + echo "flag during linking and do at least one of the following:" 2728 + if test -n "$shlibpath_var"; then 2729 + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" 2730 + echo " during execution" 2731 + fi 2732 + if test -n "$runpath_var"; then 2733 + echo " - add LIBDIR to the \`$runpath_var' environment variable" 2734 + echo " during linking" 2735 + fi 2736 + if test -n "$hardcode_libdir_flag_spec"; then 2737 + libdir=LIBDIR 2738 + eval flag=\"$hardcode_libdir_flag_spec\" 2739 + 2740 + $ECHO " - use the \`$flag' linker flag" 2741 + fi 2742 + if test -n "$admincmds"; then 2743 + $ECHO " - have your system administrator run these commands:$admincmds" 2744 + fi 2745 + if test -f /etc/ld.so.conf; then 2746 + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" 2747 + fi 2748 + echo 2749 + 2750 + echo "See any operating system documentation about shared libraries for" 2751 + case $host in 2752 + solaris2.[6789]|solaris2.1[0-9]) 2753 + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" 2754 + echo "pages." 2755 + ;; 2756 + *) 2757 + echo "more information, such as the ld(1) and ld.so(8) manual pages." 2758 + ;; 2759 + esac 2760 + echo "----------------------------------------------------------------------" 2761 + fi 2762 + exit $EXIT_SUCCESS 2763 +} 2764 + 2765 +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} 2766 + 2767 + 2768 +# func_mode_install arg... 2769 +func_mode_install () 2770 +{ 2771 + $opt_debug 2772 + # There may be an optional sh(1) argument at the beginning of 2773 + # install_prog (especially on Windows NT). 2774 + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || 2775 + # Allow the use of GNU shtool's install command. 2776 + case $nonopt in *shtool*) :;; *) false;; esac; then 2777 + # Aesthetically quote it. 2778 + func_quote_for_eval "$nonopt" 2779 + install_prog="$func_quote_for_eval_result " 2780 + arg=$1 2781 + shift 2782 + else 2783 + install_prog= 2784 + arg=$nonopt 2785 + fi 2786 + 2787 + # The real first argument should be the name of the installation program. 2788 + # Aesthetically quote it. 2789 + func_quote_for_eval "$arg" 2790 + func_append install_prog "$func_quote_for_eval_result" 2791 + install_shared_prog=$install_prog 2792 + case " $install_prog " in 2793 + *[\\\ /]cp\ *) install_cp=: ;; 2794 + *) install_cp=false ;; 2795 + esac 2796 + 2797 + # We need to accept at least all the BSD install flags. 2798 + dest= 2799 + files= 2800 + opts= 2801 + prev= 2802 + install_type= 2803 + isdir=no 2804 + stripme= 2805 + no_mode=: 2806 + for arg 2807 + do 2808 + arg2= 2809 + if test -n "$dest"; then 2810 + func_append files " $dest" 2811 + dest=$arg 2812 + continue 2813 + fi 2814 + 2815 + case $arg in 2816 + -d) isdir=yes ;; 2817 + -f) 2818 + if $install_cp; then :; else 2819 + prev=$arg 2820 + fi 2821 + ;; 2822 + -g | -m | -o) 2823 + prev=$arg 2824 + ;; 2825 + -s) 2826 + stripme=" -s" 2827 + continue 2828 + ;; 2829 + -*) 2830 + ;; 2831 + *) 2832 + # If the previous option needed an argument, then skip it. 2833 + if test -n "$prev"; then 2834 + if test "x$prev" = x-m && test -n "$install_override_mode"; then 2835 + arg2=$install_override_mode 2836 + no_mode=false 2837 + fi 2838 + prev= 2839 + else 2840 + dest=$arg 2841 + continue 2842 + fi 2843 + ;; 2844 + esac 2845 + 2846 + # Aesthetically quote the argument. 2847 + func_quote_for_eval "$arg" 2848 + func_append install_prog " $func_quote_for_eval_result" 2849 + if test -n "$arg2"; then 2850 + func_quote_for_eval "$arg2" 2851 + fi 2852 + func_append install_shared_prog " $func_quote_for_eval_result" 2853 + done 2854 + 2855 + test -z "$install_prog" && \ 2856 + func_fatal_help "you must specify an install program" 2857 + 2858 + test -n "$prev" && \ 2859 + func_fatal_help "the \`$prev' option requires an argument" 2860 + 2861 + if test -n "$install_override_mode" && $no_mode; then 2862 + if $install_cp; then :; else 2863 + func_quote_for_eval "$install_override_mode" 2864 + func_append install_shared_prog " -m $func_quote_for_eval_result" 2865 + fi 2866 + fi 2867 + 2868 + if test -z "$files"; then 2869 + if test -z "$dest"; then 2870 + func_fatal_help "no file or destination specified" 2871 + else 2872 + func_fatal_help "you must specify a destination" 2873 + fi 2874 + fi 2875 + 2876 + # Strip any trailing slash from the destination. 2877 + func_stripname '' '/' "$dest" 2878 + dest=$func_stripname_result 2879 + 2880 + # Check to see that the destination is a directory. 2881 + test -d "$dest" && isdir=yes 2882 + if test "$isdir" = yes; then 2883 + destdir="$dest" 2884 + destname= 2885 + else 2886 + func_dirname_and_basename "$dest" "" "." 2887 + destdir="$func_dirname_result" 2888 + destname="$func_basename_result" 2889 + 2890 + # Not a directory, so check to see that there is only one file specified. 2891 + set dummy $files; shift 2892 + test "$#" -gt 1 && \ 2893 + func_fatal_help "\`$dest' is not a directory" 2894 + fi 2895 + case $destdir in 2896 + [\\/]* | [A-Za-z]:[\\/]*) ;; 2897 + *) 2898 + for file in $files; do 2899 + case $file in 2900 + *.lo) ;; 2901 + *) 2902 + func_fatal_help "\`$destdir' must be an absolute directory name" 2903 + ;; 2904 + esac 2905 + done 2906 + ;; 2907 + esac 2908 + 2909 + # This variable tells wrapper scripts just to set variables rather 2910 + # than running their programs. 2911 + libtool_install_magic="$magic" 2912 + 2913 + staticlibs= 2914 + future_libdirs= 2915 + current_libdirs= 2916 + for file in $files; do 2917 + 2918 + # Do each installation. 2919 + case $file in 2920 + *.$libext) 2921 + # Do the static libraries later. 2922 + func_append staticlibs " $file" 2923 + ;; 2924 + 2925 + *.la) 2926 + func_resolve_sysroot "$file" 2927 + file=$func_resolve_sysroot_result 2928 + 2929 + # Check to see that this really is a libtool archive. 2930 + func_lalib_unsafe_p "$file" \ 2931 + || func_fatal_help "\`$file' is not a valid libtool archive" 2932 + 2933 + library_names= 2934 + old_library= 2935 + relink_command= 2936 + func_source "$file" 2937 + 2938 + # Add the libdir to current_libdirs if it is the destination. 2939 + if test "X$destdir" = "X$libdir"; then 2940 + case "$current_libdirs " in 2941 + *" $libdir "*) ;; 2942 + *) func_append current_libdirs " $libdir" ;; 2943 + esac 2944 + else 2945 + # Note the libdir as a future libdir. 2946 + case "$future_libdirs " in 2947 + *" $libdir "*) ;; 2948 + *) func_append future_libdirs " $libdir" ;; 2949 + esac 2950 + fi 2951 + 2952 + func_dirname "$file" "/" "" 2953 + dir="$func_dirname_result" 2954 + func_append dir "$objdir" 2955 + 2956 + if test -n "$relink_command"; then 2957 + # Determine the prefix the user has applied to our future dir. 2958 + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` 2959 + 2960 + # Don't allow the user to place us outside of our expected 2961 + # location b/c this prevents finding dependent libraries that 2962 + # are installed to the same prefix. 2963 + # At present, this check doesn't affect windows .dll's that 2964 + # are installed into $libdir/../bin (currently, that works fine) 2965 + # but it's something to keep an eye on. 2966 + test "$inst_prefix_dir" = "$destdir" && \ 2967 + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" 2968 + 2969 + if test -n "$inst_prefix_dir"; then 2970 + # Stick the inst_prefix_dir data into the link command. 2971 + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` 2972 + else 2973 + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` 2974 + fi 2975 + 2976 + func_warning "relinking \`$file'" 2977 + func_show_eval "$relink_command" \ 2978 + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' 2979 + fi 2980 + 2981 + # See the names of the shared library. 2982 + set dummy $library_names; shift 2983 + if test -n "$1"; then 2984 + realname="$1" 2985 + shift 2986 + 2987 + srcname="$realname" 2988 + test -n "$relink_command" && srcname="$realname"T 2989 + 2990 + # Install the shared library and build the symlinks. 2991 + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 2992 + 'exit $?' 2993 + tstripme="$stripme" 2994 + case $host_os in 2995 + cygwin* | mingw* | pw32* | cegcc*) 2996 + case $realname in 2997 + *.dll.a) 2998 + tstripme="" 2999 + ;; 3000 + esac 3001 + ;; 3002 + esac 3003 + if test -n "$tstripme" && test -n "$striplib"; then 3004 + func_show_eval "$striplib $destdir/$realname" 'exit $?' 3005 + fi 3006 + 3007 + if test "$#" -gt 0; then 3008 + # Delete the old symlinks, and create new ones. 3009 + # Try `ln -sf' first, because the `ln' binary might depend on 3010 + # the symlink we replace! Solaris /bin/ln does not understand -f, 3011 + # so we also need to try rm && ln -s. 3012 + for linkname 3013 + do 3014 + test "$linkname" != "$realname" \ 3015 + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" 3016 + done 3017 + fi 3018 + 3019 + # Do each command in the postinstall commands. 3020 + lib="$destdir/$realname" 3021 + func_execute_cmds "$postinstall_cmds" 'exit $?' 3022 + fi 3023 + 3024 + # Install the pseudo-library for information purposes. 3025 + func_basename "$file" 3026 + name="$func_basename_result" 3027 + instname="$dir/$name"i 3028 + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' 3029 + 3030 + # Maybe install the static library, too. 3031 + test -n "$old_library" && func_append staticlibs " $dir/$old_library" 3032 + ;; 3033 + 3034 + *.lo) 3035 + # Install (i.e. copy) a libtool object. 3036 + 3037 + # Figure out destination file name, if it wasn't already specified. 3038 + if test -n "$destname"; then 3039 + destfile="$destdir/$destname" 3040 + else 3041 + func_basename "$file" 3042 + destfile="$func_basename_result" 3043 + destfile="$destdir/$destfile" 3044 + fi 3045 + 3046 + # Deduce the name of the destination old-style object file. 3047 + case $destfile in 3048 + *.lo) 3049 + func_lo2o "$destfile" 3050 + staticdest=$func_lo2o_result 3051 + ;; 3052 + *.$objext) 3053 + staticdest="$destfile" 3054 + destfile= 3055 + ;; 3056 + *) 3057 + func_fatal_help "cannot copy a libtool object to \`$destfile'" 3058 + ;; 3059 + esac 3060 + 3061 + # Install the libtool object if requested. 3062 + test -n "$destfile" && \ 3063 + func_show_eval "$install_prog $file $destfile" 'exit $?' 3064 + 3065 + # Install the old object if enabled. 3066 + if test "$build_old_libs" = yes; then 3067 + # Deduce the name of the old-style object file. 3068 + func_lo2o "$file" 3069 + staticobj=$func_lo2o_result 3070 + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' 3071 + fi 3072 + exit $EXIT_SUCCESS 3073 + ;; 3074 + 3075 + *) 3076 + # Figure out destination file name, if it wasn't already specified. 3077 + if test -n "$destname"; then 3078 + destfile="$destdir/$destname" 3079 + else 3080 + func_basename "$file" 3081 + destfile="$func_basename_result" 3082 + destfile="$destdir/$destfile" 3083 + fi 3084 + 3085 + # If the file is missing, and there is a .exe on the end, strip it 3086 + # because it is most likely a libtool script we actually want to 3087 + # install 3088 + stripped_ext="" 3089 + case $file in 3090 + *.exe) 3091 + if test ! -f "$file"; then 3092 + func_stripname '' '.exe' "$file" 3093 + file=$func_stripname_result 3094 + stripped_ext=".exe" 3095 + fi 3096 + ;; 3097 + esac 3098 + 3099 + # Do a test to see if this is really a libtool program. 3100 + case $host in 3101 + *cygwin* | *mingw*) 3102 + if func_ltwrapper_executable_p "$file"; then 3103 + func_ltwrapper_scriptname "$file" 3104 + wrapper=$func_ltwrapper_scriptname_result 3105 + else 3106 + func_stripname '' '.exe' "$file" 3107 + wrapper=$func_stripname_result 3108 + fi 3109 + ;; 3110 + *) 3111 + wrapper=$file 3112 + ;; 3113 + esac 3114 + if func_ltwrapper_script_p "$wrapper"; then 3115 + notinst_deplibs= 3116 + relink_command= 3117 + 3118 + func_source "$wrapper" 3119 + 3120 + # Check the variables that should have been set. 3121 + test -z "$generated_by_libtool_version" && \ 3122 + func_fatal_error "invalid libtool wrapper script \`$wrapper'" 3123 + 3124 + finalize=yes 3125 + for lib in $notinst_deplibs; do 3126 + # Check to see that each library is installed. 3127 + libdir= 3128 + if test -f "$lib"; then 3129 + func_source "$lib" 3130 + fi 3131 + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test 3132 + if test -n "$libdir" && test ! -f "$libfile"; then 3133 + func_warning "\`$lib' has not been installed in \`$libdir'" 3134 + finalize=no 3135 + fi 3136 + done 3137 + 3138 + relink_command= 3139 + func_source "$wrapper" 3140 + 3141 + outputname= 3142 + if test "$fast_install" = no && test -n "$relink_command"; then 3143 + $opt_dry_run || { 3144 + if test "$finalize" = yes; then 3145 + tmpdir=`func_mktempdir` 3146 + func_basename "$file$stripped_ext" 3147 + file="$func_basename_result" 3148 + outputname="$tmpdir/$file" 3149 + # Replace the output file specification. 3150 + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` 3151 + 3152 + $opt_silent || { 3153 + func_quote_for_expand "$relink_command" 3154 + eval "func_echo $func_quote_for_expand_result" 3155 + } 3156 + if eval "$relink_command"; then : 3157 + else 3158 + func_error "error: relink \`$file' with the above command before installing it" 3159 + $opt_dry_run || ${RM}r "$tmpdir" 3160 + continue 3161 + fi 3162 + file="$outputname" 3163 + else 3164 + func_warning "cannot relink \`$file'" 3165 + fi 3166 + } 3167 + else 3168 + # Install the binary that we compiled earlier. 3169 + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` 3170 + fi 3171 + fi 3172 + 3173 + # remove .exe since cygwin /usr/bin/install will append another 3174 + # one anyway 3175 + case $install_prog,$host in 3176 + */usr/bin/install*,*cygwin*) 3177 + case $file:$destfile in 3178 + *.exe:*.exe) 3179 + # this is ok 3180 + ;; 3181 + *.exe:*) 3182 + destfile=$destfile.exe 3183 + ;; 3184 + *:*.exe) 3185 + func_stripname '' '.exe' "$destfile" 3186 + destfile=$func_stripname_result 3187 + ;; 3188 + esac 3189 + ;; 3190 + esac 3191 + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' 3192 + $opt_dry_run || if test -n "$outputname"; then 3193 + ${RM}r "$tmpdir" 3194 + fi 3195 + ;; 3196 + esac 3197 + done 3198 + 3199 + for file in $staticlibs; do 3200 + func_basename "$file" 3201 + name="$func_basename_result" 3202 + 3203 + # Set up the ranlib parameters. 3204 + oldlib="$destdir/$name" 3205 + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 3206 + tool_oldlib=$func_to_tool_file_result 3207 + 3208 + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' 3209 + 3210 + if test -n "$stripme" && test -n "$old_striplib"; then 3211 + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' 3212 + fi 3213 + 3214 + # Do each command in the postinstall commands. 3215 + func_execute_cmds "$old_postinstall_cmds" 'exit $?' 3216 + done 3217 + 3218 + test -n "$future_libdirs" && \ 3219 + func_warning "remember to run \`$progname --finish$future_libdirs'" 3220 + 3221 + if test -n "$current_libdirs"; then 3222 + # Maybe just do a dry run. 3223 + $opt_dry_run && current_libdirs=" -n$current_libdirs" 3224 + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' 3225 + else 3226 + exit $EXIT_SUCCESS 3227 + fi 3228 +} 3229 + 3230 +test "$opt_mode" = install && func_mode_install ${1+"$@"} 3231 + 3232 + 3233 +# func_generate_dlsyms outputname originator pic_p 3234 +# Extract symbols from dlprefiles and create ${outputname}S.o with 3235 +# a dlpreopen symbol table. 3236 +func_generate_dlsyms () 3237 +{ 3238 + $opt_debug 3239 + my_outputname="$1" 3240 + my_originator="$2" 3241 + my_pic_p="${3-no}" 3242 + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` 3243 + my_dlsyms= 3244 + 3245 + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then 3246 + if test -n "$NM" && test -n "$global_symbol_pipe"; then 3247 + my_dlsyms="${my_outputname}S.c" 3248 + else 3249 + func_error "not configured to extract global symbols from dlpreopened files" 3250 + fi 3251 + fi 3252 + 3253 + if test -n "$my_dlsyms"; then 3254 + case $my_dlsyms in 3255 + "") ;; 3256 + *.c) 3257 + # Discover the nlist of each of the dlfiles. 3258 + nlist="$output_objdir/${my_outputname}.nm" 3259 + 3260 + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" 3261 + 3262 + # Parse the name list into a source file. 3263 + func_verbose "creating $output_objdir/$my_dlsyms" 3264 + 3265 + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ 3266 +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ 3267 +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ 3268 + 3269 +#ifdef __cplusplus 3270 +extern \"C\" { 3271 +#endif 3272 + 3273 +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) 3274 +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" 3275 +#endif 3276 + 3277 +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ 3278 +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) 3279 +/* DATA imports from DLLs on WIN32 con't be const, because runtime 3280 + relocations are performed -- see ld's documentation on pseudo-relocs. */ 3281 +# define LT_DLSYM_CONST 3282 +#elif defined(__osf__) 3283 +/* This system does not cope well with relocations in const data. */ 3284 +# define LT_DLSYM_CONST 3285 +#else 3286 +# define LT_DLSYM_CONST const 3287 +#endif 3288 + 3289 +/* External symbol declarations for the compiler. */\ 3290 +" 3291 + 3292 + if test "$dlself" = yes; then 3293 + func_verbose "generating symbol list for \`$output'" 3294 + 3295 + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" 3296 + 3297 + # Add our own program objects to the symbol list. 3298 + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` 3299 + for progfile in $progfiles; do 3300 + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 3301 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" 3302 + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" 3303 + done 3304 + 3305 + if test -n "$exclude_expsyms"; then 3306 + $opt_dry_run || { 3307 + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' 3308 + eval '$MV "$nlist"T "$nlist"' 3309 + } 3310 + fi 3311 + 3312 + if test -n "$export_symbols_regex"; then 3313 + $opt_dry_run || { 3314 + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' 3315 + eval '$MV "$nlist"T "$nlist"' 3316 + } 3317 + fi 3318 + 3319 + # Prepare the list of exported symbols 3320 + if test -z "$export_symbols"; then 3321 + export_symbols="$output_objdir/$outputname.exp" 3322 + $opt_dry_run || { 3323 + $RM $export_symbols 3324 + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' 3325 + case $host in 3326 + *cygwin* | *mingw* | *cegcc* ) 3327 + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' 3328 + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' 3329 + ;; 3330 + esac 3331 + } 3332 + else 3333 + $opt_dry_run || { 3334 + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' 3335 + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' 3336 + eval '$MV "$nlist"T "$nlist"' 3337 + case $host in 3338 + *cygwin* | *mingw* | *cegcc* ) 3339 + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' 3340 + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' 3341 + ;; 3342 + esac 3343 + } 3344 + fi 3345 + fi 3346 + 3347 + for dlprefile in $dlprefiles; do 3348 + func_verbose "extracting global C symbols from \`$dlprefile'" 3349 + func_basename "$dlprefile" 3350 + name="$func_basename_result" 3351 + case $host in 3352 + *cygwin* | *mingw* | *cegcc* ) 3353 + # if an import library, we need to obtain dlname 3354 + if func_win32_import_lib_p "$dlprefile"; then 3355 + func_tr_sh "$dlprefile" 3356 + eval "curr_lafile=\$libfile_$func_tr_sh_result" 3357 + dlprefile_dlbasename="" 3358 + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then 3359 + # Use subshell, to avoid clobbering current variable values 3360 + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` 3361 + if test -n "$dlprefile_dlname" ; then 3362 + func_basename "$dlprefile_dlname" 3363 + dlprefile_dlbasename="$func_basename_result" 3364 + else 3365 + # no lafile. user explicitly requested -dlpreopen <import library>. 3366 + $sharedlib_from_linklib_cmd "$dlprefile" 3367 + dlprefile_dlbasename=$sharedlib_from_linklib_result 3368 + fi 3369 + fi 3370 + $opt_dry_run || { 3371 + if test -n "$dlprefile_dlbasename" ; then 3372 + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' 3373 + else 3374 + func_warning "Could not compute DLL name from $name" 3375 + eval '$ECHO ": $name " >> "$nlist"' 3376 + fi 3377 + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 3378 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | 3379 + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" 3380 + } 3381 + else # not an import lib 3382 + $opt_dry_run || { 3383 + eval '$ECHO ": $name " >> "$nlist"' 3384 + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 3385 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" 3386 + } 3387 + fi 3388 + ;; 3389 + *) 3390 + $opt_dry_run || { 3391 + eval '$ECHO ": $name " >> "$nlist"' 3392 + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 3393 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" 3394 + } 3395 + ;; 3396 + esac 3397 + done 3398 + 3399 + $opt_dry_run || { 3400 + # Make sure we have at least an empty file. 3401 + test -f "$nlist" || : > "$nlist" 3402 + 3403 + if test -n "$exclude_expsyms"; then 3404 + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T 3405 + $MV "$nlist"T "$nlist" 3406 + fi 3407 + 3408 + # Try sorting and uniquifying the output. 3409 + if $GREP -v "^: " < "$nlist" | 3410 + if sort -k 3 </dev/null >/dev/null 2>&1; then 3411 + sort -k 3 3412 + else 3413 + sort +2 3414 + fi | 3415 + uniq > "$nlist"S; then 3416 + : 3417 + else 3418 + $GREP -v "^: " < "$nlist" > "$nlist"S 3419 + fi 3420 + 3421 + if test -f "$nlist"S; then 3422 + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' 3423 + else 3424 + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" 3425 + fi 3426 + 3427 + echo >> "$output_objdir/$my_dlsyms" "\ 3428 + 3429 +/* The mapping between symbol names and symbols. */ 3430 +typedef struct { 3431 + const char *name; 3432 + void *address; 3433 +} lt_dlsymlist; 3434 +extern LT_DLSYM_CONST lt_dlsymlist 3435 +lt_${my_prefix}_LTX_preloaded_symbols[]; 3436 +LT_DLSYM_CONST lt_dlsymlist 3437 +lt_${my_prefix}_LTX_preloaded_symbols[] = 3438 +{\ 3439 + { \"$my_originator\", (void *) 0 }," 3440 + 3441 + case $need_lib_prefix in 3442 + no) 3443 + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" 3444 + ;; 3445 + *) 3446 + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" 3447 + ;; 3448 + esac 3449 + echo >> "$output_objdir/$my_dlsyms" "\ 3450 + {0, (void *) 0} 3451 +}; 3452 + 3453 +/* This works around a problem in FreeBSD linker */ 3454 +#ifdef FREEBSD_WORKAROUND 3455 +static const void *lt_preloaded_setup() { 3456 + return lt_${my_prefix}_LTX_preloaded_symbols; 3457 +} 3458 +#endif 3459 + 3460 +#ifdef __cplusplus 3461 +} 3462 +#endif\ 3463 +" 3464 + } # !$opt_dry_run 3465 + 3466 + pic_flag_for_symtable= 3467 + case "$compile_command " in 3468 + *" -static "*) ;; 3469 + *) 3470 + case $host in 3471 + # compiling the symbol table file with pic_flag works around 3472 + # a FreeBSD bug that causes programs to crash when -lm is 3473 + # linked before any other PIC object. But we must not use 3474 + # pic_flag when linking with -static. The problem exists in 3475 + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. 3476 + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) 3477 + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; 3478 + *-*-hpux*) 3479 + pic_flag_for_symtable=" $pic_flag" ;; 3480 + *) 3481 + if test "X$my_pic_p" != Xno; then 3482 + pic_flag_for_symtable=" $pic_flag" 3483 + fi 3484 + ;; 3485 + esac 3486 + ;; 3487 + esac 3488 + symtab_cflags= 3489 + for arg in $LTCFLAGS; do 3490 + case $arg in 3491 + -pie | -fpie | -fPIE) ;; 3492 + *) func_append symtab_cflags " $arg" ;; 3493 + esac 3494 + done 3495 + 3496 + # Now compile the dynamic symbol file. 3497 + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' 3498 + 3499 + # Clean up the generated files. 3500 + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' 3501 + 3502 + # Transform the symbol file into the correct name. 3503 + symfileobj="$output_objdir/${my_outputname}S.$objext" 3504 + case $host in 3505 + *cygwin* | *mingw* | *cegcc* ) 3506 + if test -f "$output_objdir/$my_outputname.def"; then 3507 + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` 3508 + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` 3509 + else 3510 + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` 3511 + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` 3512 + fi 3513 + ;; 3514 + *) 3515 + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` 3516 + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` 3517 + ;; 3518 + esac 3519 + ;; 3520 + *) 3521 + func_fatal_error "unknown suffix for \`$my_dlsyms'" 3522 + ;; 3523 + esac 3524 + else 3525 + # We keep going just in case the user didn't refer to 3526 + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe 3527 + # really was required. 3528 + 3529 + # Nullify the symbol file. 3530 + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` 3531 + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` 3532 + fi 3533 +} 3534 + 3535 +# func_win32_libid arg 3536 +# return the library type of file 'arg' 3537 +# 3538 +# Need a lot of goo to handle *both* DLLs and import libs 3539 +# Has to be a shell function in order to 'eat' the argument 3540 +# that is supplied when $file_magic_command is called. 3541 +# Despite the name, also deal with 64 bit binaries. 3542 +func_win32_libid () 3543 +{ 3544 + $opt_debug 3545 + win32_libid_type="unknown" 3546 + win32_fileres=`file -L $1 2>/dev/null` 3547 + case $win32_fileres in 3548 + *ar\ archive\ import\ library*) # definitely import 3549 + win32_libid_type="x86 archive import" 3550 + ;; 3551 + *ar\ archive*) # could be an import, or static 3552 + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. 3553 + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | 3554 + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then 3555 + func_to_tool_file "$1" func_convert_file_msys_to_w32 3556 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | 3557 + $SED -n -e ' 3558 + 1,100{ 3559 + / I /{ 3560 + s,.*,import, 3561 + p 3562 + q 3563 + } 3564 + }'` 3565 + case $win32_nmres in 3566 + import*) win32_libid_type="x86 archive import";; 3567 + *) win32_libid_type="x86 archive static";; 3568 + esac 3569 + fi 3570 + ;; 3571 + *DLL*) 3572 + win32_libid_type="x86 DLL" 3573 + ;; 3574 + *executable*) # but shell scripts are "executable" too... 3575 + case $win32_fileres in 3576 + *MS\ Windows\ PE\ Intel*) 3577 + win32_libid_type="x86 DLL" 3578 + ;; 3579 + esac 3580 + ;; 3581 + esac 3582 + $ECHO "$win32_libid_type" 3583 +} 3584 + 3585 +# func_cygming_dll_for_implib ARG 3586 +# 3587 +# Platform-specific function to extract the 3588 +# name of the DLL associated with the specified 3589 +# import library ARG. 3590 +# Invoked by eval'ing the libtool variable 3591 +# $sharedlib_from_linklib_cmd 3592 +# Result is available in the variable 3593 +# $sharedlib_from_linklib_result 3594 +func_cygming_dll_for_implib () 3595 +{ 3596 + $opt_debug 3597 + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` 3598 +} 3599 + 3600 +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs 3601 +# 3602 +# The is the core of a fallback implementation of a 3603 +# platform-specific function to extract the name of the 3604 +# DLL associated with the specified import library LIBNAME. 3605 +# 3606 +# SECTION_NAME is either .idata$6 or .idata$7, depending 3607 +# on the platform and compiler that created the implib. 3608 +# 3609 +# Echos the name of the DLL associated with the 3610 +# specified import library. 3611 +func_cygming_dll_for_implib_fallback_core () 3612 +{ 3613 + $opt_debug 3614 + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` 3615 + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | 3616 + $SED '/^Contents of section '"$match_literal"':/{ 3617 + # Place marker at beginning of archive member dllname section 3618 + s/.*/====MARK====/ 3619 + p 3620 + d 3621 + } 3622 + # These lines can sometimes be longer than 43 characters, but 3623 + # are always uninteresting 3624 + /:[ ]*file format pe[i]\{,1\}-/d 3625 + /^In archive [^:]*:/d 3626 + # Ensure marker is printed 3627 + /^====MARK====/p 3628 + # Remove all lines with less than 43 characters 3629 + /^.\{43\}/!d 3630 + # From remaining lines, remove first 43 characters 3631 + s/^.\{43\}//' | 3632 + $SED -n ' 3633 + # Join marker and all lines until next marker into a single line 3634 + /^====MARK====/ b para 3635 + H 3636 + $ b para 3637 + b 3638 + :para 3639 + x 3640 + s/\n//g 3641 + # Remove the marker 3642 + s/^====MARK====// 3643 + # Remove trailing dots and whitespace 3644 + s/[\. \t]*$// 3645 + # Print 3646 + /./p' | 3647 + # we now have a list, one entry per line, of the stringified 3648 + # contents of the appropriate section of all members of the 3649 + # archive which possess that section. Heuristic: eliminate 3650 + # all those which have a first or second character that is 3651 + # a '.' (that is, objdump's representation of an unprintable 3652 + # character.) This should work for all archives with less than 3653 + # 0x302f exports -- but will fail for DLLs whose name actually 3654 + # begins with a literal '.' or a single character followed by 3655 + # a '.'. 3656 + # 3657 + # Of those that remain, print the first one. 3658 + $SED -e '/^\./d;/^.\./d;q' 3659 +} 3660 + 3661 +# func_cygming_gnu_implib_p ARG 3662 +# This predicate returns with zero status (TRUE) if 3663 +# ARG is a GNU/binutils-style import library. Returns 3664 +# with nonzero status (FALSE) otherwise. 3665 +func_cygming_gnu_implib_p () 3666 +{ 3667 + $opt_debug 3668 + func_to_tool_file "$1" func_convert_file_msys_to_w32 3669 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` 3670 + test -n "$func_cygming_gnu_implib_tmp" 3671 +} 3672 + 3673 +# func_cygming_ms_implib_p ARG 3674 +# This predicate returns with zero status (TRUE) if 3675 +# ARG is an MS-style import library. Returns 3676 +# with nonzero status (FALSE) otherwise. 3677 +func_cygming_ms_implib_p () 3678 +{ 3679 + $opt_debug 3680 + func_to_tool_file "$1" func_convert_file_msys_to_w32 3681 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` 3682 + test -n "$func_cygming_ms_implib_tmp" 3683 +} 3684 + 3685 +# func_cygming_dll_for_implib_fallback ARG 3686 +# Platform-specific function to extract the 3687 +# name of the DLL associated with the specified 3688 +# import library ARG. 3689 +# 3690 +# This fallback implementation is for use when $DLLTOOL 3691 +# does not support the --identify-strict option. 3692 +# Invoked by eval'ing the libtool variable 3693 +# $sharedlib_from_linklib_cmd 3694 +# Result is available in the variable 3695 +# $sharedlib_from_linklib_result 3696 +func_cygming_dll_for_implib_fallback () 3697 +{ 3698 + $opt_debug 3699 + if func_cygming_gnu_implib_p "$1" ; then 3700 + # binutils import library 3701 + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` 3702 + elif func_cygming_ms_implib_p "$1" ; then 3703 + # ms-generated import library 3704 + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` 3705 + else 3706 + # unknown 3707 + sharedlib_from_linklib_result="" 3708 + fi 3709 +} 3710 + 3711 + 3712 +# func_extract_an_archive dir oldlib 3713 +func_extract_an_archive () 3714 +{ 3715 + $opt_debug 3716 + f_ex_an_ar_dir="$1"; shift 3717 + f_ex_an_ar_oldlib="$1" 3718 + if test "$lock_old_archive_extraction" = yes; then 3719 + lockfile=$f_ex_an_ar_oldlib.lock 3720 + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do 3721 + func_echo "Waiting for $lockfile to be removed" 3722 + sleep 2 3723 + done 3724 + fi 3725 + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 3726 + 'stat=$?; rm -f "$lockfile"; exit $stat' 3727 + if test "$lock_old_archive_extraction" = yes; then 3728 + $opt_dry_run || rm -f "$lockfile" 3729 + fi 3730 + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then 3731 + : 3732 + else 3733 + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 3734 + fi 3735 +} 3736 + 3737 + 3738 +# func_extract_archives gentop oldlib ... 3739 +func_extract_archives () 3740 +{ 3741 + $opt_debug 3742 + my_gentop="$1"; shift 3743 + my_oldlibs=${1+"$@"} 3744 + my_oldobjs="" 3745 + my_xlib="" 3746 + my_xabs="" 3747 + my_xdir="" 3748 + 3749 + for my_xlib in $my_oldlibs; do 3750 + # Extract the objects. 3751 + case $my_xlib in 3752 + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; 3753 + *) my_xabs=`pwd`"/$my_xlib" ;; 3754 + esac 3755 + func_basename "$my_xlib" 3756 + my_xlib="$func_basename_result" 3757 + my_xlib_u=$my_xlib 3758 + while :; do 3759 + case " $extracted_archives " in 3760 + *" $my_xlib_u "*) 3761 + func_arith $extracted_serial + 1 3762 + extracted_serial=$func_arith_result 3763 + my_xlib_u=lt$extracted_serial-$my_xlib ;; 3764 + *) break ;; 3765 + esac 3766 + done 3767 + extracted_archives="$extracted_archives $my_xlib_u" 3768 + my_xdir="$my_gentop/$my_xlib_u" 3769 + 3770 + func_mkdir_p "$my_xdir" 3771 + 3772 + case $host in 3773 + *-darwin*) 3774 + func_verbose "Extracting $my_xabs" 3775 + # Do not bother doing anything if just a dry run 3776 + $opt_dry_run || { 3777 + darwin_orig_dir=`pwd` 3778 + cd $my_xdir || exit $? 3779 + darwin_archive=$my_xabs 3780 + darwin_curdir=`pwd` 3781 + darwin_base_archive=`basename "$darwin_archive"` 3782 + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` 3783 + if test -n "$darwin_arches"; then 3784 + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` 3785 + darwin_arch= 3786 + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" 3787 + for darwin_arch in $darwin_arches ; do 3788 + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" 3789 + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" 3790 + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" 3791 + func_extract_an_archive "`pwd`" "${darwin_base_archive}" 3792 + cd "$darwin_curdir" 3793 + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" 3794 + done # $darwin_arches 3795 + ## Okay now we've a bunch of thin objects, gotta fatten them up :) 3796 + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` 3797 + darwin_file= 3798 + darwin_files= 3799 + for darwin_file in $darwin_filelist; do 3800 + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` 3801 + $LIPO -create -output "$darwin_file" $darwin_files 3802 + done # $darwin_filelist 3803 + $RM -rf unfat-$$ 3804 + cd "$darwin_orig_dir" 3805 + else 3806 + cd $darwin_orig_dir 3807 + func_extract_an_archive "$my_xdir" "$my_xabs" 3808 + fi # $darwin_arches 3809 + } # !$opt_dry_run 3810 + ;; 3811 + *) 3812 + func_extract_an_archive "$my_xdir" "$my_xabs" 3813 + ;; 3814 + esac 3815 + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` 3816 + done 3817 + 3818 + func_extract_archives_result="$my_oldobjs" 3819 +} 3820 + 3821 + 3822 +# func_emit_wrapper [arg=no] 3823 +# 3824 +# Emit a libtool wrapper script on stdout. 3825 +# Don't directly open a file because we may want to 3826 +# incorporate the script contents within a cygwin/mingw 3827 +# wrapper executable. Must ONLY be called from within 3828 +# func_mode_link because it depends on a number of variables 3829 +# set therein. 3830 +# 3831 +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR 3832 +# variable will take. If 'yes', then the emitted script 3833 +# will assume that the directory in which it is stored is 3834 +# the $objdir directory. This is a cygwin/mingw-specific 3835 +# behavior. 3836 +func_emit_wrapper () 3837 +{ 3838 + func_emit_wrapper_arg1=${1-no} 3839 + 3840 + $ECHO "\ 3841 +#! $SHELL 3842 + 3843 +# $output - temporary wrapper script for $objdir/$outputname 3844 +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION 3845 +# 3846 +# The $output program cannot be directly executed until all the libtool 3847 +# libraries that it depends on are installed. 3848 +# 3849 +# This wrapper script should never be moved out of the build directory. 3850 +# If it is, it will not operate correctly. 3851 + 3852 +# Sed substitution that helps us do robust quoting. It backslashifies 3853 +# metacharacters that are still active within double-quoted strings. 3854 +sed_quote_subst='$sed_quote_subst' 3855 + 3856 +# Be Bourne compatible 3857 +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then 3858 + emulate sh 3859 + NULLCMD=: 3860 + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which 3861 + # is contrary to our usage. Disable this feature. 3862 + alias -g '\${1+\"\$@\"}'='\"\$@\"' 3863 + setopt NO_GLOB_SUBST 3864 +else 3865 + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac 3866 +fi 3867 +BIN_SH=xpg4; export BIN_SH # for Tru64 3868 +DUALCASE=1; export DUALCASE # for MKS sh 3869 + 3870 +# The HP-UX ksh and POSIX shell print the target directory to stdout 3871 +# if CDPATH is set. 3872 +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH 3873 + 3874 +relink_command=\"$relink_command\" 3875 + 3876 +# This environment variable determines our operation mode. 3877 +if test \"\$libtool_install_magic\" = \"$magic\"; then 3878 + # install mode needs the following variables: 3879 + generated_by_libtool_version='$macro_version' 3880 + notinst_deplibs='$notinst_deplibs' 3881 +else 3882 + # When we are sourced in execute mode, \$file and \$ECHO are already set. 3883 + if test \"\$libtool_execute_magic\" != \"$magic\"; then 3884 + file=\"\$0\"" 3885 + 3886 + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` 3887 + $ECHO "\ 3888 + 3889 +# A function that is used when there is no print builtin or printf. 3890 +func_fallback_echo () 3891 +{ 3892 + eval 'cat <<_LTECHO_EOF 3893 +\$1 3894 +_LTECHO_EOF' 3895 +} 3896 + ECHO=\"$qECHO\" 3897 + fi 3898 + 3899 +# Very basic option parsing. These options are (a) specific to 3900 +# the libtool wrapper, (b) are identical between the wrapper 3901 +# /script/ and the wrapper /executable/ which is used only on 3902 +# windows platforms, and (c) all begin with the string "--lt-" 3903 +# (application programs are unlikely to have options which match 3904 +# this pattern). 3905 +# 3906 +# There are only two supported options: --lt-debug and 3907 +# --lt-dump-script. There is, deliberately, no --lt-help. 3908 +# 3909 +# The first argument to this parsing function should be the 3910 +# script's $0 value, followed by "$@". 3911 +lt_option_debug= 3912 +func_parse_lt_options () 3913 +{ 3914 + lt_script_arg0=\$0 3915 + shift 3916 + for lt_opt 3917 + do 3918 + case \"\$lt_opt\" in 3919 + --lt-debug) lt_option_debug=1 ;; 3920 + --lt-dump-script) 3921 + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` 3922 + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. 3923 + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` 3924 + cat \"\$lt_dump_D/\$lt_dump_F\" 3925 + exit 0 3926 + ;; 3927 + --lt-*) 3928 + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 3929 + exit 1 3930 + ;; 3931 + esac 3932 + done 3933 + 3934 + # Print the debug banner immediately: 3935 + if test -n \"\$lt_option_debug\"; then 3936 + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 3937 + fi 3938 +} 3939 + 3940 +# Used when --lt-debug. Prints its arguments to stdout 3941 +# (redirection is the responsibility of the caller) 3942 +func_lt_dump_args () 3943 +{ 3944 + lt_dump_args_N=1; 3945 + for lt_arg 3946 + do 3947 + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" 3948 + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` 3949 + done 3950 +} 3951 + 3952 +# Core function for launching the target application 3953 +func_exec_program_core () 3954 +{ 3955 +" 3956 + case $host in 3957 + # Backslashes separate directories on plain windows 3958 + *-*-mingw | *-*-os2* | *-cegcc*) 3959 + $ECHO "\ 3960 + if test -n \"\$lt_option_debug\"; then 3961 + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 3962 + func_lt_dump_args \${1+\"\$@\"} 1>&2 3963 + fi 3964 + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} 3965 +" 3966 + ;; 3967 + 3968 + *) 3969 + $ECHO "\ 3970 + if test -n \"\$lt_option_debug\"; then 3971 + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 3972 + func_lt_dump_args \${1+\"\$@\"} 1>&2 3973 + fi 3974 + exec \"\$progdir/\$program\" \${1+\"\$@\"} 3975 +" 3976 + ;; 3977 + esac 3978 + $ECHO "\ 3979 + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 3980 + exit 1 3981 +} 3982 + 3983 +# A function to encapsulate launching the target application 3984 +# Strips options in the --lt-* namespace from \$@ and 3985 +# launches target application with the remaining arguments. 3986 +func_exec_program () 3987 +{ 3988 + case \" \$* \" in 3989 + *\\ --lt-*) 3990 + for lt_wr_arg 3991 + do 3992 + case \$lt_wr_arg in 3993 + --lt-*) ;; 3994 + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; 3995 + esac 3996 + shift 3997 + done ;; 3998 + esac 3999 + func_exec_program_core \${1+\"\$@\"} 4000 +} 4001 + 4002 + # Parse options 4003 + func_parse_lt_options \"\$0\" \${1+\"\$@\"} 4004 + 4005 + # Find the directory that this script lives in. 4006 + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` 4007 + test \"x\$thisdir\" = \"x\$file\" && thisdir=. 4008 + 4009 + # Follow symbolic links until we get to the real thisdir. 4010 + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` 4011 + while test -n \"\$file\"; do 4012 + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` 4013 + 4014 + # If there was a directory component, then change thisdir. 4015 + if test \"x\$destdir\" != \"x\$file\"; then 4016 + case \"\$destdir\" in 4017 + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; 4018 + *) thisdir=\"\$thisdir/\$destdir\" ;; 4019 + esac 4020 + fi 4021 + 4022 + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` 4023 + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` 4024 + done 4025 + 4026 + # Usually 'no', except on cygwin/mingw when embedded into 4027 + # the cwrapper. 4028 + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 4029 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then 4030 + # special case for '.' 4031 + if test \"\$thisdir\" = \".\"; then 4032 + thisdir=\`pwd\` 4033 + fi 4034 + # remove .libs from thisdir 4035 + case \"\$thisdir\" in 4036 + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; 4037 + $objdir ) thisdir=. ;; 4038 + esac 4039 + fi 4040 + 4041 + # Try to get the absolute directory name. 4042 + absdir=\`cd \"\$thisdir\" && pwd\` 4043 + test -n \"\$absdir\" && thisdir=\"\$absdir\" 4044 +" 4045 + 4046 + if test "$fast_install" = yes; then 4047 + $ECHO "\ 4048 + program=lt-'$outputname'$exeext 4049 + progdir=\"\$thisdir/$objdir\" 4050 + 4051 + if test ! -f \"\$progdir/\$program\" || 4052 + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ 4053 + test \"X\$file\" != \"X\$progdir/\$program\"; }; then 4054 + 4055 + file=\"\$\$-\$program\" 4056 + 4057 + if test ! -d \"\$progdir\"; then 4058 + $MKDIR \"\$progdir\" 4059 + else 4060 + $RM \"\$progdir/\$file\" 4061 + fi" 4062 + 4063 + $ECHO "\ 4064 + 4065 + # relink executable if necessary 4066 + if test -n \"\$relink_command\"; then 4067 + if relink_command_output=\`eval \$relink_command 2>&1\`; then : 4068 + else 4069 + $ECHO \"\$relink_command_output\" >&2 4070 + $RM \"\$progdir/\$file\" 4071 + exit 1 4072 + fi 4073 + fi 4074 + 4075 + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || 4076 + { $RM \"\$progdir/\$program\"; 4077 + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } 4078 + $RM \"\$progdir/\$file\" 4079 + fi" 4080 + else 4081 + $ECHO "\ 4082 + program='$outputname' 4083 + progdir=\"\$thisdir/$objdir\" 4084 +" 4085 + fi 4086 + 4087 + $ECHO "\ 4088 + 4089 + if test -f \"\$progdir/\$program\"; then" 4090 + 4091 + # fixup the dll searchpath if we need to. 4092 + # 4093 + # Fix the DLL searchpath if we need to. Do this before prepending 4094 + # to shlibpath, because on Windows, both are PATH and uninstalled 4095 + # libraries must come first. 4096 + if test -n "$dllsearchpath"; then 4097 + $ECHO "\ 4098 + # Add the dll search path components to the executable PATH 4099 + PATH=$dllsearchpath:\$PATH 4100 +" 4101 + fi 4102 + 4103 + # Export our shlibpath_var if we have one. 4104 + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then 4105 + $ECHO "\ 4106 + # Add our own library path to $shlibpath_var 4107 + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" 4108 + 4109 + # Some systems cannot cope with colon-terminated $shlibpath_var 4110 + # The second colon is a workaround for a bug in BeOS R4 sed 4111 + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` 4112 + 4113 + export $shlibpath_var 4114 +" 4115 + fi 4116 + 4117 + $ECHO "\ 4118 + if test \"\$libtool_execute_magic\" != \"$magic\"; then 4119 + # Run the actual program with our arguments. 4120 + func_exec_program \${1+\"\$@\"} 4121 + fi 4122 + else 4123 + # The program doesn't exist. 4124 + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 4125 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 4126 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 4127 + exit 1 4128 + fi 4129 +fi\ 4130 +" 4131 +} 4132 + 4133 + 4134 +# func_emit_cwrapperexe_src 4135 +# emit the source code for a wrapper executable on stdout 4136 +# Must ONLY be called from within func_mode_link because 4137 +# it depends on a number of variable set therein. 4138 +func_emit_cwrapperexe_src () 4139 +{ 4140 + cat <<EOF 4141 + 4142 +/* $cwrappersource - temporary wrapper executable for $objdir/$outputname 4143 + Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION 4144 + 4145 + The $output program cannot be directly executed until all the libtool 4146 + libraries that it depends on are installed. 4147 + 4148 + This wrapper executable should never be moved out of the build directory. 4149 + If it is, it will not operate correctly. 4150 +*/ 4151 +EOF 4152 + cat <<"EOF" 4153 +#ifdef _MSC_VER 4154 +# define _CRT_SECURE_NO_DEPRECATE 1 4155 +#endif 4156 +#include <stdio.h> 4157 +#include <stdlib.h> 4158 +#ifdef _MSC_VER 4159 +# include <direct.h> 4160 +# include <process.h> 4161 +# include <io.h> 4162 +#else 4163 +# include <unistd.h> 4164 +# include <stdint.h> 4165 +# ifdef __CYGWIN__ 4166 +# include <io.h> 4167 +# endif 4168 +#endif 4169 +#include <malloc.h> 4170 +#include <stdarg.h> 4171 +#include <assert.h> 4172 +#include <string.h> 4173 +#include <ctype.h> 4174 +#include <errno.h> 4175 +#include <fcntl.h> 4176 +#include <sys/stat.h> 4177 + 4178 +/* declarations of non-ANSI functions */ 4179 +#if defined(__MINGW32__) 4180 +# ifdef __STRICT_ANSI__ 4181 +int _putenv (const char *); 4182 +# endif 4183 +#elif defined(__CYGWIN__) 4184 +# ifdef __STRICT_ANSI__ 4185 +char *realpath (const char *, char *); 4186 +int putenv (char *); 4187 +int setenv (const char *, const char *, int); 4188 +# endif 4189 +/* #elif defined (other platforms) ... */ 4190 +#endif 4191 + 4192 +/* portability defines, excluding path handling macros */ 4193 +#if defined(_MSC_VER) 4194 +# define setmode _setmode 4195 +# define stat _stat 4196 +# define chmod _chmod 4197 +# define getcwd _getcwd 4198 +# define putenv _putenv 4199 +# define S_IXUSR _S_IEXEC 4200 +# ifndef _INTPTR_T_DEFINED 4201 +# define _INTPTR_T_DEFINED 4202 +# define intptr_t int 4203 +# endif 4204 +#elif defined(__MINGW32__) 4205 +# define setmode _setmode 4206 +# define stat _stat 4207 +# define chmod _chmod 4208 +# define getcwd _getcwd 4209 +# define putenv _putenv 4210 +#elif defined(__CYGWIN__) 4211 +# define HAVE_SETENV 4212 +# define FOPEN_WB "wb" 4213 +/* #elif defined (other platforms) ... */ 4214 +#endif 4215 + 4216 +#if defined(PATH_MAX) 4217 +# define LT_PATHMAX PATH_MAX 4218 +#elif defined(MAXPATHLEN) 4219 +# define LT_PATHMAX MAXPATHLEN 4220 +#else 4221 +# define LT_PATHMAX 1024 4222 +#endif 4223 + 4224 +#ifndef S_IXOTH 4225 +# define S_IXOTH 0 4226 +#endif 4227 +#ifndef S_IXGRP 4228 +# define S_IXGRP 0 4229 +#endif 4230 + 4231 +/* path handling portability macros */ 4232 +#ifndef DIR_SEPARATOR 4233 +# define DIR_SEPARATOR '/' 4234 +# define PATH_SEPARATOR ':' 4235 +#endif 4236 + 4237 +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ 4238 + defined (__OS2__) 4239 +# define HAVE_DOS_BASED_FILE_SYSTEM 4240 +# define FOPEN_WB "wb" 4241 +# ifndef DIR_SEPARATOR_2 4242 +# define DIR_SEPARATOR_2 '\\' 4243 +# endif 4244 +# ifndef PATH_SEPARATOR_2 4245 +# define PATH_SEPARATOR_2 ';' 4246 +# endif 4247 +#endif 4248 + 4249 +#ifndef DIR_SEPARATOR_2 4250 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) 4251 +#else /* DIR_SEPARATOR_2 */ 4252 +# define IS_DIR_SEPARATOR(ch) \ 4253 + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) 4254 +#endif /* DIR_SEPARATOR_2 */ 4255 + 4256 +#ifndef PATH_SEPARATOR_2 4257 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) 4258 +#else /* PATH_SEPARATOR_2 */ 4259 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) 4260 +#endif /* PATH_SEPARATOR_2 */ 4261 + 4262 +#ifndef FOPEN_WB 4263 +# define FOPEN_WB "w" 4264 +#endif 4265 +#ifndef _O_BINARY 4266 +# define _O_BINARY 0 4267 +#endif 4268 + 4269 +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) 4270 +#define XFREE(stale) do { \ 4271 + if (stale) { free ((void *) stale); stale = 0; } \ 4272 +} while (0) 4273 + 4274 +#if defined(LT_DEBUGWRAPPER) 4275 +static int lt_debug = 1; 4276 +#else 4277 +static int lt_debug = 0; 4278 +#endif 4279 + 4280 +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ 4281 + 4282 +void *xmalloc (size_t num); 4283 +char *xstrdup (const char *string); 4284 +const char *base_name (const char *name); 4285 +char *find_executable (const char *wrapper); 4286 +char *chase_symlinks (const char *pathspec); 4287 +int make_executable (const char *path); 4288 +int check_executable (const char *path); 4289 +char *strendzap (char *str, const char *pat); 4290 +void lt_debugprintf (const char *file, int line, const char *fmt, ...); 4291 +void lt_fatal (const char *file, int line, const char *message, ...); 4292 +static const char *nonnull (const char *s); 4293 +static const char *nonempty (const char *s); 4294 +void lt_setenv (const char *name, const char *value); 4295 +char *lt_extend_str (const char *orig_value, const char *add, int to_end); 4296 +void lt_update_exe_path (const char *name, const char *value); 4297 +void lt_update_lib_path (const char *name, const char *value); 4298 +char **prepare_spawn (char **argv); 4299 +void lt_dump_script (FILE *f); 4300 +EOF 4301 + 4302 + cat <<EOF 4303 +volatile const char * MAGIC_EXE = "$magic_exe"; 4304 +const char * LIB_PATH_VARNAME = "$shlibpath_var"; 4305 +EOF 4306 + 4307 + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then 4308 + func_to_host_path "$temp_rpath" 4309 + cat <<EOF 4310 +const char * LIB_PATH_VALUE = "$func_to_host_path_result"; 4311 +EOF 4312 + else 4313 + cat <<"EOF" 4314 +const char * LIB_PATH_VALUE = ""; 4315 +EOF 4316 + fi 4317 + 4318 + if test -n "$dllsearchpath"; then 4319 + func_to_host_path "$dllsearchpath:" 4320 + cat <<EOF 4321 +const char * EXE_PATH_VARNAME = "PATH"; 4322 +const char * EXE_PATH_VALUE = "$func_to_host_path_result"; 4323 +EOF 4324 + else 4325 + cat <<"EOF" 4326 +const char * EXE_PATH_VARNAME = ""; 4327 +const char * EXE_PATH_VALUE = ""; 4328 +EOF 4329 + fi 4330 + 4331 + if test "$fast_install" = yes; then 4332 + cat <<EOF 4333 +const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */ 4334 +EOF 4335 + else 4336 + cat <<EOF 4337 +const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */ 4338 +EOF 4339 + fi 4340 + 4341 + 4342 + cat <<"EOF" 4343 + 4344 +#define LTWRAPPER_OPTION_PREFIX "--lt-" 4345 + 4346 +static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; 4347 +static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; 4348 +static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug"; 4349 + 4350 +int 4351 +main (int argc, char *argv[]) 4352 +{ 4353 + char **newargz; 4354 + int newargc; 4355 + char *tmp_pathspec; 4356 + char *actual_cwrapper_path; 4357 + char *actual_cwrapper_name; 4358 + char *target_name; 4359 + char *lt_argv_zero; 4360 + intptr_t rval = 127; 4361 + 4362 + int i; 4363 + 4364 + program_name = (char *) xstrdup (base_name (argv[0])); 4365 + newargz = XMALLOC (char *, argc + 1); 4366 + 4367 + /* very simple arg parsing; don't want to rely on getopt 4368 + * also, copy all non cwrapper options to newargz, except 4369 + * argz[0], which is handled differently 4370 + */ 4371 + newargc=0; 4372 + for (i = 1; i < argc; i++) 4373 + { 4374 + if (strcmp (argv[i], dumpscript_opt) == 0) 4375 + { 4376 +EOF 4377 + case "$host" in 4378 + *mingw* | *cygwin* ) 4379 + # make stdout use "unix" line endings 4380 + echo " setmode(1,_O_BINARY);" 4381 + ;; 4382 + esac 4383 + 4384 + cat <<"EOF" 4385 + lt_dump_script (stdout); 4386 + return 0; 4387 + } 4388 + if (strcmp (argv[i], debug_opt) == 0) 4389 + { 4390 + lt_debug = 1; 4391 + continue; 4392 + } 4393 + if (strcmp (argv[i], ltwrapper_option_prefix) == 0) 4394 + { 4395 + /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX 4396 + namespace, but it is not one of the ones we know about and 4397 + have already dealt with, above (inluding dump-script), then 4398 + report an error. Otherwise, targets might begin to believe 4399 + they are allowed to use options in the LTWRAPPER_OPTION_PREFIX 4400 + namespace. The first time any user complains about this, we'll 4401 + need to make LTWRAPPER_OPTION_PREFIX a configure-time option 4402 + or a configure.ac-settable value. 4403 + */ 4404 + lt_fatal (__FILE__, __LINE__, 4405 + "unrecognized %s option: '%s'", 4406 + ltwrapper_option_prefix, argv[i]); 4407 + } 4408 + /* otherwise ... */ 4409 + newargz[++newargc] = xstrdup (argv[i]); 4410 + } 4411 + newargz[++newargc] = NULL; 4412 + 4413 +EOF 4414 + cat <<EOF 4415 + /* The GNU banner must be the first non-error debug message */ 4416 + lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n"); 4417 +EOF 4418 + cat <<"EOF" 4419 + lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]); 4420 + lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name); 4421 + 4422 + tmp_pathspec = find_executable (argv[0]); 4423 + if (tmp_pathspec == NULL) 4424 + lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]); 4425 + lt_debugprintf (__FILE__, __LINE__, 4426 + "(main) found exe (before symlink chase) at: %s\n", 4427 + tmp_pathspec); 4428 + 4429 + actual_cwrapper_path = chase_symlinks (tmp_pathspec); 4430 + lt_debugprintf (__FILE__, __LINE__, 4431 + "(main) found exe (after symlink chase) at: %s\n", 4432 + actual_cwrapper_path); 4433 + XFREE (tmp_pathspec); 4434 + 4435 + actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path)); 4436 + strendzap (actual_cwrapper_path, actual_cwrapper_name); 4437 + 4438 + /* wrapper name transforms */ 4439 + strendzap (actual_cwrapper_name, ".exe"); 4440 + tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1); 4441 + XFREE (actual_cwrapper_name); 4442 + actual_cwrapper_name = tmp_pathspec; 4443 + tmp_pathspec = 0; 4444 + 4445 + /* target_name transforms -- use actual target program name; might have lt- prefix */ 4446 + target_name = xstrdup (base_name (TARGET_PROGRAM_NAME)); 4447 + strendzap (target_name, ".exe"); 4448 + tmp_pathspec = lt_extend_str (target_name, ".exe", 1); 4449 + XFREE (target_name); 4450 + target_name = tmp_pathspec; 4451 + tmp_pathspec = 0; 4452 + 4453 + lt_debugprintf (__FILE__, __LINE__, 4454 + "(main) libtool target name: %s\n", 4455 + target_name); 4456 +EOF 4457 + 4458 + cat <<EOF 4459 + newargz[0] = 4460 + XMALLOC (char, (strlen (actual_cwrapper_path) + 4461 + strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1)); 4462 + strcpy (newargz[0], actual_cwrapper_path); 4463 + strcat (newargz[0], "$objdir"); 4464 + strcat (newargz[0], "/"); 4465 +EOF 4466 + 4467 + cat <<"EOF" 4468 + /* stop here, and copy so we don't have to do this twice */ 4469 + tmp_pathspec = xstrdup (newargz[0]); 4470 + 4471 + /* do NOT want the lt- prefix here, so use actual_cwrapper_name */ 4472 + strcat (newargz[0], actual_cwrapper_name); 4473 + 4474 + /* DO want the lt- prefix here if it exists, so use target_name */ 4475 + lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1); 4476 + XFREE (tmp_pathspec); 4477 + tmp_pathspec = NULL; 4478 +EOF 4479 + 4480 + case $host_os in 4481 + mingw*) 4482 + cat <<"EOF" 4483 + { 4484 + char* p; 4485 + while ((p = strchr (newargz[0], '\\')) != NULL) 4486 + { 4487 + *p = '/'; 4488 + } 4489 + while ((p = strchr (lt_argv_zero, '\\')) != NULL) 4490 + { 4491 + *p = '/'; 4492 + } 4493 + } 4494 +EOF 4495 + ;; 4496 + esac 4497 + 4498 + cat <<"EOF" 4499 + XFREE (target_name); 4500 + XFREE (actual_cwrapper_path); 4501 + XFREE (actual_cwrapper_name); 4502 + 4503 + lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */ 4504 + lt_setenv ("DUALCASE", "1"); /* for MSK sh */ 4505 + /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must 4506 + be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath) 4507 + because on Windows, both *_VARNAMEs are PATH but uninstalled 4508 + libraries must come first. */ 4509 + lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); 4510 + lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); 4511 + 4512 + lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", 4513 + nonnull (lt_argv_zero)); 4514 + for (i = 0; i < newargc; i++) 4515 + { 4516 + lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", 4517 + i, nonnull (newargz[i])); 4518 + } 4519 + 4520 +EOF 4521 + 4522 + case $host_os in 4523 + mingw*) 4524 + cat <<"EOF" 4525 + /* execv doesn't actually work on mingw as expected on unix */ 4526 + newargz = prepare_spawn (newargz); 4527 + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); 4528 + if (rval == -1) 4529 + { 4530 + /* failed to start process */ 4531 + lt_debugprintf (__FILE__, __LINE__, 4532 + "(main) failed to launch target \"%s\": %s\n", 4533 + lt_argv_zero, nonnull (strerror (errno))); 4534 + return 127; 4535 + } 4536 + return rval; 4537 +EOF 4538 + ;; 4539 + *) 4540 + cat <<"EOF" 4541 + execv (lt_argv_zero, newargz); 4542 + return rval; /* =127, but avoids unused variable warning */ 4543 +EOF 4544 + ;; 4545 + esac 4546 + 4547 + cat <<"EOF" 4548 +} 4549 + 4550 +void * 4551 +xmalloc (size_t num) 4552 +{ 4553 + void *p = (void *) malloc (num); 4554 + if (!p) 4555 + lt_fatal (__FILE__, __LINE__, "memory exhausted"); 4556 + 4557 + return p; 4558 +} 4559 + 4560 +char * 4561 +xstrdup (const char *string) 4562 +{ 4563 + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), 4564 + string) : NULL; 4565 +} 4566 + 4567 +const char * 4568 +base_name (const char *name) 4569 +{ 4570 + const char *base; 4571 + 4572 +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) 4573 + /* Skip over the disk name in MSDOS pathnames. */ 4574 + if (isalpha ((unsigned char) name[0]) && name[1] == ':') 4575 + name += 2; 4576 +#endif 4577 + 4578 + for (base = name; *name; name++) 4579 + if (IS_DIR_SEPARATOR (*name)) 4580 + base = name + 1; 4581 + return base; 4582 +} 4583 + 4584 +int 4585 +check_executable (const char *path) 4586 +{ 4587 + struct stat st; 4588 + 4589 + lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", 4590 + nonempty (path)); 4591 + if ((!path) || (!*path)) 4592 + return 0; 4593 + 4594 + if ((stat (path, &st) >= 0) 4595 + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) 4596 + return 1; 4597 + else 4598 + return 0; 4599 +} 4600 + 4601 +int 4602 +make_executable (const char *path) 4603 +{ 4604 + int rval = 0; 4605 + struct stat st; 4606 + 4607 + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", 4608 + nonempty (path)); 4609 + if ((!path) || (!*path)) 4610 + return 0; 4611 + 4612 + if (stat (path, &st) >= 0) 4613 + { 4614 + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); 4615 + } 4616 + return rval; 4617 +} 4618 + 4619 +/* Searches for the full path of the wrapper. Returns 4620 + newly allocated full path name if found, NULL otherwise 4621 + Does not chase symlinks, even on platforms that support them. 4622 +*/ 4623 +char * 4624 +find_executable (const char *wrapper) 4625 +{ 4626 + int has_slash = 0; 4627 + const char *p; 4628 + const char *p_next; 4629 + /* static buffer for getcwd */ 4630 + char tmp[LT_PATHMAX + 1]; 4631 + int tmp_len; 4632 + char *concat_name; 4633 + 4634 + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", 4635 + nonempty (wrapper)); 4636 + 4637 + if ((wrapper == NULL) || (*wrapper == '\0')) 4638 + return NULL; 4639 + 4640 + /* Absolute path? */ 4641 +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) 4642 + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') 4643 + { 4644 + concat_name = xstrdup (wrapper); 4645 + if (check_executable (concat_name)) 4646 + return concat_name; 4647 + XFREE (concat_name); 4648 + } 4649 + else 4650 + { 4651 +#endif 4652 + if (IS_DIR_SEPARATOR (wrapper[0])) 4653 + { 4654 + concat_name = xstrdup (wrapper); 4655 + if (check_executable (concat_name)) 4656 + return concat_name; 4657 + XFREE (concat_name); 4658 + } 4659 +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) 4660 + } 4661 +#endif 4662 + 4663 + for (p = wrapper; *p; p++) 4664 + if (*p == '/') 4665 + { 4666 + has_slash = 1; 4667 + break; 4668 + } 4669 + if (!has_slash) 4670 + { 4671 + /* no slashes; search PATH */ 4672 + const char *path = getenv ("PATH"); 4673 + if (path != NULL) 4674 + { 4675 + for (p = path; *p; p = p_next) 4676 + { 4677 + const char *q; 4678 + size_t p_len; 4679 + for (q = p; *q; q++) 4680 + if (IS_PATH_SEPARATOR (*q)) 4681 + break; 4682 + p_len = q - p; 4683 + p_next = (*q == '\0' ? q : q + 1); 4684 + if (p_len == 0) 4685 + { 4686 + /* empty path: current directory */ 4687 + if (getcwd (tmp, LT_PATHMAX) == NULL) 4688 + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", 4689 + nonnull (strerror (errno))); 4690 + tmp_len = strlen (tmp); 4691 + concat_name = 4692 + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); 4693 + memcpy (concat_name, tmp, tmp_len); 4694 + concat_name[tmp_len] = '/'; 4695 + strcpy (concat_name + tmp_len + 1, wrapper); 4696 + } 4697 + else 4698 + { 4699 + concat_name = 4700 + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); 4701 + memcpy (concat_name, p, p_len); 4702 + concat_name[p_len] = '/'; 4703 + strcpy (concat_name + p_len + 1, wrapper); 4704 + } 4705 + if (check_executable (concat_name)) 4706 + return concat_name; 4707 + XFREE (concat_name); 4708 + } 4709 + } 4710 + /* not found in PATH; assume curdir */ 4711 + } 4712 + /* Relative path | not found in path: prepend cwd */ 4713 + if (getcwd (tmp, LT_PATHMAX) == NULL) 4714 + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", 4715 + nonnull (strerror (errno))); 4716 + tmp_len = strlen (tmp); 4717 + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); 4718 + memcpy (concat_name, tmp, tmp_len); 4719 + concat_name[tmp_len] = '/'; 4720 + strcpy (concat_name + tmp_len + 1, wrapper); 4721 + 4722 + if (check_executable (concat_name)) 4723 + return concat_name; 4724 + XFREE (concat_name); 4725 + return NULL; 4726 +} 4727 + 4728 +char * 4729 +chase_symlinks (const char *pathspec) 4730 +{ 4731 +#ifndef S_ISLNK 4732 + return xstrdup (pathspec); 4733 +#else 4734 + char buf[LT_PATHMAX]; 4735 + struct stat s; 4736 + char *tmp_pathspec = xstrdup (pathspec); 4737 + char *p; 4738 + int has_symlinks = 0; 4739 + while (strlen (tmp_pathspec) && !has_symlinks) 4740 + { 4741 + lt_debugprintf (__FILE__, __LINE__, 4742 + "checking path component for symlinks: %s\n", 4743 + tmp_pathspec); 4744 + if (lstat (tmp_pathspec, &s) == 0) 4745 + { 4746 + if (S_ISLNK (s.st_mode) != 0) 4747 + { 4748 + has_symlinks = 1; 4749 + break; 4750 + } 4751 + 4752 + /* search backwards for last DIR_SEPARATOR */ 4753 + p = tmp_pathspec + strlen (tmp_pathspec) - 1; 4754 + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) 4755 + p--; 4756 + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) 4757 + { 4758 + /* no more DIR_SEPARATORS left */ 4759 + break; 4760 + } 4761 + *p = '\0'; 4762 + } 4763 + else 4764 + { 4765 + lt_fatal (__FILE__, __LINE__, 4766 + "error accessing file \"%s\": %s", 4767 + tmp_pathspec, nonnull (strerror (errno))); 4768 + } 4769 + } 4770 + XFREE (tmp_pathspec); 4771 + 4772 + if (!has_symlinks) 4773 + { 4774 + return xstrdup (pathspec); 4775 + } 4776 + 4777 + tmp_pathspec = realpath (pathspec, buf); 4778 + if (tmp_pathspec == 0) 4779 + { 4780 + lt_fatal (__FILE__, __LINE__, 4781 + "could not follow symlinks for %s", pathspec); 4782 + } 4783 + return xstrdup (tmp_pathspec); 4784 +#endif 4785 +} 4786 + 4787 +char * 4788 +strendzap (char *str, const char *pat) 4789 +{ 4790 + size_t len, patlen; 4791 + 4792 + assert (str != NULL); 4793 + assert (pat != NULL); 4794 + 4795 + len = strlen (str); 4796 + patlen = strlen (pat); 4797 + 4798 + if (patlen <= len) 4799 + { 4800 + str += len - patlen; 4801 + if (strcmp (str, pat) == 0) 4802 + *str = '\0'; 4803 + } 4804 + return str; 4805 +} 4806 + 4807 +void 4808 +lt_debugprintf (const char *file, int line, const char *fmt, ...) 4809 +{ 4810 + va_list args; 4811 + if (lt_debug) 4812 + { 4813 + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); 4814 + va_start (args, fmt); 4815 + (void) vfprintf (stderr, fmt, args); 4816 + va_end (args); 4817 + } 4818 +} 4819 + 4820 +static void 4821 +lt_error_core (int exit_status, const char *file, 4822 + int line, const char *mode, 4823 + const char *message, va_list ap) 4824 +{ 4825 + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); 4826 + vfprintf (stderr, message, ap); 4827 + fprintf (stderr, ".\n"); 4828 + 4829 + if (exit_status >= 0) 4830 + exit (exit_status); 4831 +} 4832 + 4833 +void 4834 +lt_fatal (const char *file, int line, const char *message, ...) 4835 +{ 4836 + va_list ap; 4837 + va_start (ap, message); 4838 + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); 4839 + va_end (ap); 4840 +} 4841 + 4842 +static const char * 4843 +nonnull (const char *s) 4844 +{ 4845 + return s ? s : "(null)"; 4846 +} 4847 + 4848 +static const char * 4849 +nonempty (const char *s) 4850 +{ 4851 + return (s && !*s) ? "(empty)" : nonnull (s); 4852 +} 4853 + 4854 +void 4855 +lt_setenv (const char *name, const char *value) 4856 +{ 4857 + lt_debugprintf (__FILE__, __LINE__, 4858 + "(lt_setenv) setting '%s' to '%s'\n", 4859 + nonnull (name), nonnull (value)); 4860 + { 4861 +#ifdef HAVE_SETENV 4862 + /* always make a copy, for consistency with !HAVE_SETENV */ 4863 + char *str = xstrdup (value); 4864 + setenv (name, str, 1); 4865 +#else 4866 + int len = strlen (name) + 1 + strlen (value) + 1; 4867 + char *str = XMALLOC (char, len); 4868 + sprintf (str, "%s=%s", name, value); 4869 + if (putenv (str) != EXIT_SUCCESS) 4870 + { 4871 + XFREE (str); 4872 + } 4873 +#endif 4874 + } 4875 +} 4876 + 4877 +char * 4878 +lt_extend_str (const char *orig_value, const char *add, int to_end) 4879 +{ 4880 + char *new_value; 4881 + if (orig_value && *orig_value) 4882 + { 4883 + int orig_value_len = strlen (orig_value); 4884 + int add_len = strlen (add); 4885 + new_value = XMALLOC (char, add_len + orig_value_len + 1); 4886 + if (to_end) 4887 + { 4888 + strcpy (new_value, orig_value); 4889 + strcpy (new_value + orig_value_len, add); 4890 + } 4891 + else 4892 + { 4893 + strcpy (new_value, add); 4894 + strcpy (new_value + add_len, orig_value); 4895 + } 4896 + } 4897 + else 4898 + { 4899 + new_value = xstrdup (add); 4900 + } 4901 + return new_value; 4902 +} 4903 + 4904 +void 4905 +lt_update_exe_path (const char *name, const char *value) 4906 +{ 4907 + lt_debugprintf (__FILE__, __LINE__, 4908 + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", 4909 + nonnull (name), nonnull (value)); 4910 + 4911 + if (name && *name && value && *value) 4912 + { 4913 + char *new_value = lt_extend_str (getenv (name), value, 0); 4914 + /* some systems can't cope with a ':'-terminated path #' */ 4915 + int len = strlen (new_value); 4916 + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) 4917 + { 4918 + new_value[len-1] = '\0'; 4919 + } 4920 + lt_setenv (name, new_value); 4921 + XFREE (new_value); 4922 + } 4923 +} 4924 + 4925 +void 4926 +lt_update_lib_path (const char *name, const char *value) 4927 +{ 4928 + lt_debugprintf (__FILE__, __LINE__, 4929 + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", 4930 + nonnull (name), nonnull (value)); 4931 + 4932 + if (name && *name && value && *value) 4933 + { 4934 + char *new_value = lt_extend_str (getenv (name), value, 0); 4935 + lt_setenv (name, new_value); 4936 + XFREE (new_value); 4937 + } 4938 +} 4939 + 4940 +EOF 4941 + case $host_os in 4942 + mingw*) 4943 + cat <<"EOF" 4944 + 4945 +/* Prepares an argument vector before calling spawn(). 4946 + Note that spawn() does not by itself call the command interpreter 4947 + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : 4948 + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 4949 + GetVersionEx(&v); 4950 + v.dwPlatformId == VER_PLATFORM_WIN32_NT; 4951 + }) ? "cmd.exe" : "command.com"). 4952 + Instead it simply concatenates the arguments, separated by ' ', and calls 4953 + CreateProcess(). We must quote the arguments since Win32 CreateProcess() 4954 + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a 4955 + special way: 4956 + - Space and tab are interpreted as delimiters. They are not treated as 4957 + delimiters if they are surrounded by double quotes: "...". 4958 + - Unescaped double quotes are removed from the input. Their only effect is 4959 + that within double quotes, space and tab are treated like normal 4960 + characters. 4961 + - Backslashes not followed by double quotes are not special. 4962 + - But 2*n+1 backslashes followed by a double quote become 4963 + n backslashes followed by a double quote (n >= 0): 4964 + \" -> " 4965 + \\\" -> \" 4966 + \\\\\" -> \\" 4967 + */ 4968 +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" 4969 +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" 4970 +char ** 4971 +prepare_spawn (char **argv) 4972 +{ 4973 + size_t argc; 4974 + char **new_argv; 4975 + size_t i; 4976 + 4977 + /* Count number of arguments. */ 4978 + for (argc = 0; argv[argc] != NULL; argc++) 4979 + ; 4980 + 4981 + /* Allocate new argument vector. */ 4982 + new_argv = XMALLOC (char *, argc + 1); 4983 + 4984 + /* Put quoted arguments into the new argument vector. */ 4985 + for (i = 0; i < argc; i++) 4986 + { 4987 + const char *string = argv[i]; 4988 + 4989 + if (string[0] == '\0') 4990 + new_argv[i] = xstrdup ("\"\""); 4991 + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) 4992 + { 4993 + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); 4994 + size_t length; 4995 + unsigned int backslashes; 4996 + const char *s; 4997 + char *quoted_string; 4998 + char *p; 4999 + 5000 + length = 0; 5001 + backslashes = 0; 5002 + if (quote_around) 5003 + length++; 5004 + for (s = string; *s != '\0'; s++) 5005 + { 5006 + char c = *s; 5007 + if (c == '"') 5008 + length += backslashes + 1; 5009 + length++; 5010 + if (c == '\\') 5011 + backslashes++; 5012 + else 5013 + backslashes = 0; 5014 + } 5015 + if (quote_around) 5016 + length += backslashes + 1; 5017 + 5018 + quoted_string = XMALLOC (char, length + 1); 5019 + 5020 + p = quoted_string; 5021 + backslashes = 0; 5022 + if (quote_around) 5023 + *p++ = '"'; 5024 + for (s = string; *s != '\0'; s++) 5025 + { 5026 + char c = *s; 5027 + if (c == '"') 5028 + { 5029 + unsigned int j; 5030 + for (j = backslashes + 1; j > 0; j--) 5031 + *p++ = '\\'; 5032 + } 5033 + *p++ = c; 5034 + if (c == '\\') 5035 + backslashes++; 5036 + else 5037 + backslashes = 0; 5038 + } 5039 + if (quote_around) 5040 + { 5041 + unsigned int j; 5042 + for (j = backslashes; j > 0; j--) 5043 + *p++ = '\\'; 5044 + *p++ = '"'; 5045 + } 5046 + *p = '\0'; 5047 + 5048 + new_argv[i] = quoted_string; 5049 + } 5050 + else 5051 + new_argv[i] = (char *) string; 5052 + } 5053 + new_argv[argc] = NULL; 5054 + 5055 + return new_argv; 5056 +} 5057 +EOF 5058 + ;; 5059 + esac 5060 + 5061 + cat <<"EOF" 5062 +void lt_dump_script (FILE* f) 5063 +{ 5064 +EOF 5065 + func_emit_wrapper yes | 5066 + $SED -n -e ' 5067 +s/^\(.\{79\}\)\(..*\)/\1\ 5068 +\2/ 5069 +h 5070 +s/\([\\"]\)/\\\1/g 5071 +s/$/\\n/ 5072 +s/\([^\n]*\).*/ fputs ("\1", f);/p 5073 +g 5074 +D' 5075 + cat <<"EOF" 5076 +} 5077 +EOF 5078 +} 5079 +# end: func_emit_cwrapperexe_src 5080 + 5081 +# func_win32_import_lib_p ARG 5082 +# True if ARG is an import lib, as indicated by $file_magic_cmd 5083 +func_win32_import_lib_p () 5084 +{ 5085 + $opt_debug 5086 + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in 5087 + *import*) : ;; 5088 + *) false ;; 5089 + esac 5090 +} 5091 + 5092 +# func_mode_link arg... 5093 +func_mode_link () 5094 +{ 5095 + $opt_debug 5096 + case $host in 5097 + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) 5098 + # It is impossible to link a dll without this setting, and 5099 + # we shouldn't force the makefile maintainer to figure out 5100 + # which system we are compiling for in order to pass an extra 5101 + # flag for every libtool invocation. 5102 + # allow_undefined=no 5103 + 5104 + # FIXME: Unfortunately, there are problems with the above when trying 5105 + # to make a dll which has undefined symbols, in which case not 5106 + # even a static library is built. For now, we need to specify 5107 + # -no-undefined on the libtool link line when we can be certain 5108 + # that all symbols are satisfied, otherwise we get a static library. 5109 + allow_undefined=yes 5110 + ;; 5111 + *) 5112 + allow_undefined=yes 5113 + ;; 5114 + esac 5115 + libtool_args=$nonopt 5116 + base_compile="$nonopt $@" 5117 + compile_command=$nonopt 5118 + finalize_command=$nonopt 5119 + 5120 + compile_rpath= 5121 + finalize_rpath= 5122 + compile_shlibpath= 5123 + finalize_shlibpath= 5124 + convenience= 5125 + old_convenience= 5126 + deplibs= 5127 + old_deplibs= 5128 + compiler_flags= 5129 + linker_flags= 5130 + dllsearchpath= 5131 + lib_search_path=`pwd` 5132 + inst_prefix_dir= 5133 + new_inherited_linker_flags= 5134 + 5135 + avoid_version=no 5136 + bindir= 5137 + dlfiles= 5138 + dlprefiles= 5139 + dlself=no 5140 + export_dynamic=no 5141 + export_symbols= 5142 + export_symbols_regex= 5143 + generated= 5144 + libobjs= 5145 + ltlibs= 5146 + module=no 5147 + no_install=no 5148 + objs= 5149 + non_pic_objects= 5150 + precious_files_regex= 5151 + prefer_static_libs=no 5152 + preload=no 5153 + prev= 5154 + prevarg= 5155 + release= 5156 + rpath= 5157 + xrpath= 5158 + perm_rpath= 5159 + temp_rpath= 5160 + thread_safe=no 5161 + vinfo= 5162 + vinfo_number=no 5163 + weak_libs= 5164 + single_module="${wl}-single_module" 5165 + func_infer_tag $base_compile 5166 + 5167 + # We need to know -static, to get the right output filenames. 5168 + for arg 5169 + do 5170 + case $arg in 5171 + -shared) 5172 + test "$build_libtool_libs" != yes && \ 5173 + func_fatal_configuration "can not build a shared library" 5174 + build_old_libs=no 5175 + break 5176 + ;; 5177 + -all-static | -static | -static-libtool-libs) 5178 + case $arg in 5179 + -all-static) 5180 + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then 5181 + func_warning "complete static linking is impossible in this configuration" 5182 + fi 5183 + if test -n "$link_static_flag"; then 5184 + dlopen_self=$dlopen_self_static 5185 + fi 5186 + prefer_static_libs=yes 5187 + ;; 5188 + -static) 5189 + if test -z "$pic_flag" && test -n "$link_static_flag"; then 5190 + dlopen_self=$dlopen_self_static 5191 + fi 5192 + prefer_static_libs=built 5193 + ;; 5194 + -static-libtool-libs) 5195 + if test -z "$pic_flag" && test -n "$link_static_flag"; then 5196 + dlopen_self=$dlopen_self_static 5197 + fi 5198 + prefer_static_libs=yes 5199 + ;; 5200 + esac 5201 + build_libtool_libs=no 5202 + build_old_libs=yes 5203 + break 5204 + ;; 5205 + esac 5206 + done 5207 + 5208 + # See if our shared archives depend on static archives. 5209 + test -n "$old_archive_from_new_cmds" && build_old_libs=yes 5210 + 5211 + # Go through the arguments, transforming them on the way. 5212 + while test "$#" -gt 0; do 5213 + arg="$1" 5214 + shift 5215 + func_quote_for_eval "$arg" 5216 + qarg=$func_quote_for_eval_unquoted_result 5217 + func_append libtool_args " $func_quote_for_eval_result" 5218 + 5219 + # If the previous option needs an argument, assign it. 5220 + if test -n "$prev"; then 5221 + case $prev in 5222 + output) 5223 + func_append compile_command " @OUTPUT@" 5224 + func_append finalize_command " @OUTPUT@" 5225 + ;; 5226 + esac 5227 + 5228 + case $prev in 5229 + bindir) 5230 + bindir="$arg" 5231 + prev= 5232 + continue 5233 + ;; 5234 + dlfiles|dlprefiles) 5235 + if test "$preload" = no; then 5236 + # Add the symbol object into the linking commands. 5237 + func_append compile_command " @SYMFILE@" 5238 + func_append finalize_command " @SYMFILE@" 5239 + preload=yes 5240 + fi 5241 + case $arg in 5242 + *.la | *.lo) ;; # We handle these cases below. 5243 + force) 5244 + if test "$dlself" = no; then 5245 + dlself=needless 5246 + export_dynamic=yes 5247 + fi 5248 + prev= 5249 + continue 5250 + ;; 5251 + self) 5252 + if test "$prev" = dlprefiles; then 5253 + dlself=yes 5254 + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then 5255 + dlself=yes 5256 + else 5257 + dlself=needless 5258 + export_dynamic=yes 5259 + fi 5260 + prev= 5261 + continue 5262 + ;; 5263 + *) 5264 + if test "$prev" = dlfiles; then 5265 + func_append dlfiles " $arg" 5266 + else 5267 + func_append dlprefiles " $arg" 5268 + fi 5269 + prev= 5270 + continue 5271 + ;; 5272 + esac 5273 + ;; 5274 + expsyms) 5275 + export_symbols="$arg" 5276 + test -f "$arg" \ 5277 + || func_fatal_error "symbol file \`$arg' does not exist" 5278 + prev= 5279 + continue 5280 + ;; 5281 + expsyms_regex) 5282 + export_symbols_regex="$arg" 5283 + prev= 5284 + continue 5285 + ;; 5286 + framework) 5287 + case $host in 5288 + *-*-darwin*) 5289 + case "$deplibs " in 5290 + *" $qarg.ltframework "*) ;; 5291 + *) func_append deplibs " $qarg.ltframework" # this is fixed later 5292 + ;; 5293 + esac 5294 + ;; 5295 + esac 5296 + prev= 5297 + continue 5298 + ;; 5299 + inst_prefix) 5300 + inst_prefix_dir="$arg" 5301 + prev= 5302 + continue 5303 + ;; 5304 + objectlist) 5305 + if test -f "$arg"; then 5306 + save_arg=$arg 5307 + moreargs= 5308 + for fil in `cat "$save_arg"` 5309 + do 5310 +# func_append moreargs " $fil" 5311 + arg=$fil 5312 + # A libtool-controlled object. 5313 + 5314 + # Check to see that this really is a libtool object. 5315 + if func_lalib_unsafe_p "$arg"; then 5316 + pic_object= 5317 + non_pic_object= 5318 + 5319 + # Read the .lo file 5320 + func_source "$arg" 5321 + 5322 + if test -z "$pic_object" || 5323 + test -z "$non_pic_object" || 5324 + test "$pic_object" = none && 5325 + test "$non_pic_object" = none; then 5326 + func_fatal_error "cannot find name of object for \`$arg'" 5327 + fi 5328 + 5329 + # Extract subdirectory from the argument. 5330 + func_dirname "$arg" "/" "" 5331 + xdir="$func_dirname_result" 5332 + 5333 + if test "$pic_object" != none; then 5334 + # Prepend the subdirectory the object is found in. 5335 + pic_object="$xdir$pic_object" 5336 + 5337 + if test "$prev" = dlfiles; then 5338 + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then 5339 + func_append dlfiles " $pic_object" 5340 + prev= 5341 + continue 5342 + else 5343 + # If libtool objects are unsupported, then we need to preload. 5344 + prev=dlprefiles 5345 + fi 5346 + fi 5347 + 5348 + # CHECK ME: I think I busted this. -Ossama 5349 + if test "$prev" = dlprefiles; then 5350 + # Preload the old-style object. 5351 + func_append dlprefiles " $pic_object" 5352 + prev= 5353 + fi 5354 + 5355 + # A PIC object. 5356 + func_append libobjs " $pic_object" 5357 + arg="$pic_object" 5358 + fi 5359 + 5360 + # Non-PIC object. 5361 + if test "$non_pic_object" != none; then 5362 + # Prepend the subdirectory the object is found in. 5363 + non_pic_object="$xdir$non_pic_object" 5364 + 5365 + # A standard non-PIC object 5366 + func_append non_pic_objects " $non_pic_object" 5367 + if test -z "$pic_object" || test "$pic_object" = none ; then 5368 + arg="$non_pic_object" 5369 + fi 5370 + else 5371 + # If the PIC object exists, use it instead. 5372 + # $xdir was prepended to $pic_object above. 5373 + non_pic_object="$pic_object" 5374 + func_append non_pic_objects " $non_pic_object" 5375 + fi 5376 + else 5377 + # Only an error if not doing a dry-run. 5378 + if $opt_dry_run; then 5379 + # Extract subdirectory from the argument. 5380 + func_dirname "$arg" "/" "" 5381 + xdir="$func_dirname_result" 5382 + 5383 + func_lo2o "$arg" 5384 + pic_object=$xdir$objdir/$func_lo2o_result 5385 + non_pic_object=$xdir$func_lo2o_result 5386 + func_append libobjs " $pic_object" 5387 + func_append non_pic_objects " $non_pic_object" 5388 + else 5389 + func_fatal_error "\`$arg' is not a valid libtool object" 5390 + fi 5391 + fi 5392 + done 5393 + else 5394 + func_fatal_error "link input file \`$arg' does not exist" 5395 + fi 5396 + arg=$save_arg 5397 + prev= 5398 + continue 5399 + ;; 5400 + precious_regex) 5401 + precious_files_regex="$arg" 5402 + prev= 5403 + continue 5404 + ;; 5405 + release) 5406 + release="-$arg" 5407 + prev= 5408 + continue 5409 + ;; 5410 + rpath | xrpath) 5411 + # We need an absolute path. 5412 + case $arg in 5413 + [\\/]* | [A-Za-z]:[\\/]*) ;; 5414 + *) 5415 + func_fatal_error "only absolute run-paths are allowed" 5416 + ;; 5417 + esac 5418 + if test "$prev" = rpath; then 5419 + case "$rpath " in 5420 + *" $arg "*) ;; 5421 + *) func_append rpath " $arg" ;; 5422 + esac 5423 + else 5424 + case "$xrpath " in 5425 + *" $arg "*) ;; 5426 + *) func_append xrpath " $arg" ;; 5427 + esac 5428 + fi 5429 + prev= 5430 + continue 5431 + ;; 5432 + shrext) 5433 + shrext_cmds="$arg" 5434 + prev= 5435 + continue 5436 + ;; 5437 + weak) 5438 + func_append weak_libs " $arg" 5439 + prev= 5440 + continue 5441 + ;; 5442 + xcclinker) 5443 + func_append linker_flags " $qarg" 5444 + func_append compiler_flags " $qarg" 5445 + prev= 5446 + func_append compile_command " $qarg" 5447 + func_append finalize_command " $qarg" 5448 + continue 5449 + ;; 5450 + xcompiler) 5451 + func_append compiler_flags " $qarg" 5452 + prev= 5453 + func_append compile_command " $qarg" 5454 + func_append finalize_command " $qarg" 5455 + continue 5456 + ;; 5457 + xlinker) 5458 + func_append linker_flags " $qarg" 5459 + func_append compiler_flags " $wl$qarg" 5460 + prev= 5461 + func_append compile_command " $wl$qarg" 5462 + func_append finalize_command " $wl$qarg" 5463 + continue 5464 + ;; 5465 + *) 5466 + eval "$prev=\"\$arg\"" 5467 + prev= 5468 + continue 5469 + ;; 5470 + esac 5471 + fi # test -n "$prev" 5472 + 5473 + prevarg="$arg" 5474 + 5475 + case $arg in 5476 + -all-static) 5477 + if test -n "$link_static_flag"; then 5478 + # See comment for -static flag below, for more details. 5479 + func_append compile_command " $link_static_flag" 5480 + func_append finalize_command " $link_static_flag" 5481 + fi 5482 + continue 5483 + ;; 5484 + 5485 + -allow-undefined) 5486 + # FIXME: remove this flag sometime in the future. 5487 + func_fatal_error "\`-allow-undefined' must not be used because it is the default" 5488 + ;; 5489 + 5490 + -avoid-version) 5491 + avoid_version=yes 5492 + continue 5493 + ;; 5494 + 5495 + -bindir) 5496 + prev=bindir 5497 + continue 5498 + ;; 5499 + 5500 + -dlopen) 5501 + prev=dlfiles 5502 + continue 5503 + ;; 5504 + 5505 + -dlpreopen) 5506 + prev=dlprefiles 5507 + continue 5508 + ;; 5509 + 5510 + -export-dynamic) 5511 + export_dynamic=yes 5512 + continue 5513 + ;; 5514 + 5515 + -export-symbols | -export-symbols-regex) 5516 + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then 5517 + func_fatal_error "more than one -exported-symbols argument is not allowed" 5518 + fi 5519 + if test "X$arg" = "X-export-symbols"; then 5520 + prev=expsyms 5521 + else 5522 + prev=expsyms_regex 5523 + fi 5524 + continue 5525 + ;; 5526 + 5527 + -framework) 5528 + prev=framework 5529 + continue 5530 + ;; 5531 + 5532 + -inst-prefix-dir) 5533 + prev=inst_prefix 5534 + continue 5535 + ;; 5536 + 5537 + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* 5538 + # so, if we see these flags be careful not to treat them like -L 5539 + -L[A-Z][A-Z]*:*) 5540 + case $with_gcc/$host in 5541 + no/*-*-irix* | /*-*-irix*) 5542 + func_append compile_command " $arg" 5543 + func_append finalize_command " $arg" 5544 + ;; 5545 + esac 5546 + continue 5547 + ;; 5548 + 5549 + -L*) 5550 + func_stripname "-L" '' "$arg" 5551 + if test -z "$func_stripname_result"; then 5552 + if test "$#" -gt 0; then 5553 + func_fatal_error "require no space between \`-L' and \`$1'" 5554 + else 5555 + func_fatal_error "need path for \`-L' option" 5556 + fi 5557 + fi 5558 + func_resolve_sysroot "$func_stripname_result" 5559 + dir=$func_resolve_sysroot_result 5560 + # We need an absolute path. 5561 + case $dir in 5562 + [\\/]* | [A-Za-z]:[\\/]*) ;; 5563 + *) 5564 + absdir=`cd "$dir" && pwd` 5565 + test -z "$absdir" && \ 5566 + func_fatal_error "cannot determine absolute directory name of \`$dir'" 5567 + dir="$absdir" 5568 + ;; 5569 + esac 5570 + case "$deplibs " in 5571 + *" -L$dir "* | *" $arg "*) 5572 + # Will only happen for absolute or sysroot arguments 5573 + ;; 5574 + *) 5575 + # Preserve sysroot, but never include relative directories 5576 + case $dir in 5577 + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; 5578 + *) func_append deplibs " -L$dir" ;; 5579 + esac 5580 + func_append lib_search_path " $dir" 5581 + ;; 5582 + esac 5583 + case $host in 5584 + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) 5585 + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` 5586 + case :$dllsearchpath: in 5587 + *":$dir:"*) ;; 5588 + ::) dllsearchpath=$dir;; 5589 + *) func_append dllsearchpath ":$dir";; 5590 + esac 5591 + case :$dllsearchpath: in 5592 + *":$testbindir:"*) ;; 5593 + ::) dllsearchpath=$testbindir;; 5594 + *) func_append dllsearchpath ":$testbindir";; 5595 + esac 5596 + ;; 5597 + esac 5598 + continue 5599 + ;; 5600 + 5601 + -l*) 5602 + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then 5603 + case $host in 5604 + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) 5605 + # These systems don't actually have a C or math library (as such) 5606 + continue 5607 + ;; 5608 + *-*-os2*) 5609 + # These systems don't actually have a C library (as such) 5610 + test "X$arg" = "X-lc" && continue 5611 + ;; 5612 + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) 5613 + # Do not include libc due to us having libc/libc_r. 5614 + test "X$arg" = "X-lc" && continue 5615 + ;; 5616 + *-*-rhapsody* | *-*-darwin1.[012]) 5617 + # Rhapsody C and math libraries are in the System framework 5618 + func_append deplibs " System.ltframework" 5619 + continue 5620 + ;; 5621 + *-*-sco3.2v5* | *-*-sco5v6*) 5622 + # Causes problems with __ctype 5623 + test "X$arg" = "X-lc" && continue 5624 + ;; 5625 + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) 5626 + # Compiler inserts libc in the correct place for threads to work 5627 + test "X$arg" = "X-lc" && continue 5628 + ;; 5629 + esac 5630 + elif test "X$arg" = "X-lc_r"; then 5631 + case $host in 5632 + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) 5633 + # Do not include libc_r directly, use -pthread flag. 5634 + continue 5635 + ;; 5636 + esac 5637 + fi 5638 + func_append deplibs " $arg" 5639 + continue 5640 + ;; 5641 + 5642 + -module) 5643 + module=yes 5644 + continue 5645 + ;; 5646 + 5647 + # Tru64 UNIX uses -model [arg] to determine the layout of C++ 5648 + # classes, name mangling, and exception handling. 5649 + # Darwin uses the -arch flag to determine output architecture. 5650 + -model|-arch|-isysroot|--sysroot) 5651 + func_append compiler_flags " $arg" 5652 + func_append compile_command " $arg" 5653 + func_append finalize_command " $arg" 5654 + prev=xcompiler 5655 + continue 5656 + ;; 5657 + 5658 + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ 5659 + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) 5660 + func_append compiler_flags " $arg" 5661 + func_append compile_command " $arg" 5662 + func_append finalize_command " $arg" 5663 + case "$new_inherited_linker_flags " in 5664 + *" $arg "*) ;; 5665 + * ) func_append new_inherited_linker_flags " $arg" ;; 5666 + esac 5667 + continue 5668 + ;; 5669 + 5670 + -multi_module) 5671 + single_module="${wl}-multi_module" 5672 + continue 5673 + ;; 5674 + 5675 + -no-fast-install) 5676 + fast_install=no 5677 + continue 5678 + ;; 5679 + 5680 + -no-install) 5681 + case $host in 5682 + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) 5683 + # The PATH hackery in wrapper scripts is required on Windows 5684 + # and Darwin in order for the loader to find any dlls it needs. 5685 + func_warning "\`-no-install' is ignored for $host" 5686 + func_warning "assuming \`-no-fast-install' instead" 5687 + fast_install=no 5688 + ;; 5689 + *) no_install=yes ;; 5690 + esac 5691 + continue 5692 + ;; 5693 + 5694 + -no-undefined) 5695 + allow_undefined=no 5696 + continue 5697 + ;; 5698 + 5699 + -objectlist) 5700 + prev=objectlist 5701 + continue 5702 + ;; 5703 + 5704 + -o) prev=output ;; 5705 + 5706 + -precious-files-regex) 5707 + prev=precious_regex 5708 + continue 5709 + ;; 5710 + 5711 + -release) 5712 + prev=release 5713 + continue 5714 + ;; 5715 + 5716 + -rpath) 5717 + prev=rpath 5718 + continue 5719 + ;; 5720 + 5721 + -R) 5722 + prev=xrpath 5723 + continue 5724 + ;; 5725 + 5726 + -R*) 5727 + func_stripname '-R' '' "$arg" 5728 + dir=$func_stripname_result 5729 + # We need an absolute path. 5730 + case $dir in 5731 + [\\/]* | [A-Za-z]:[\\/]*) ;; 5732 + =*) 5733 + func_stripname '=' '' "$dir" 5734 + dir=$lt_sysroot$func_stripname_result 5735 + ;; 5736 + *) 5737 + func_fatal_error "only absolute run-paths are allowed" 5738 + ;; 5739 + esac 5740 + case "$xrpath " in 5741 + *" $dir "*) ;; 5742 + *) func_append xrpath " $dir" ;; 5743 + esac 5744 + continue 5745 + ;; 5746 + 5747 + -shared) 5748 + # The effects of -shared are defined in a previous loop. 5749 + continue 5750 + ;; 5751 + 5752 + -shrext) 5753 + prev=shrext 5754 + continue 5755 + ;; 5756 + 5757 + -static | -static-libtool-libs) 5758 + # The effects of -static are defined in a previous loop. 5759 + # We used to do the same as -all-static on platforms that 5760 + # didn't have a PIC flag, but the assumption that the effects 5761 + # would be equivalent was wrong. It would break on at least 5762 + # Digital Unix and AIX. 5763 + continue 5764 + ;; 5765 + 5766 + -thread-safe) 5767 + thread_safe=yes 5768 + continue 5769 + ;; 5770 + 5771 + -version-info) 5772 + prev=vinfo 5773 + continue 5774 + ;; 5775 + 5776 + -version-number) 5777 + prev=vinfo 5778 + vinfo_number=yes 5779 + continue 5780 + ;; 5781 + 5782 + -weak) 5783 + prev=weak 5784 + continue 5785 + ;; 5786 + 5787 + -Wc,*) 5788 + func_stripname '-Wc,' '' "$arg" 5789 + args=$func_stripname_result 5790 + arg= 5791 + save_ifs="$IFS"; IFS=',' 5792 + for flag in $args; do 5793 + IFS="$save_ifs" 5794 + func_quote_for_eval "$flag" 5795 + func_append arg " $func_quote_for_eval_result" 5796 + func_append compiler_flags " $func_quote_for_eval_result" 5797 + done 5798 + IFS="$save_ifs" 5799 + func_stripname ' ' '' "$arg" 5800 + arg=$func_stripname_result 5801 + ;; 5802 + 5803 + -Wl,*) 5804 + func_stripname '-Wl,' '' "$arg" 5805 + args=$func_stripname_result 5806 + arg= 5807 + save_ifs="$IFS"; IFS=',' 5808 + for flag in $args; do 5809 + IFS="$save_ifs" 5810 + func_quote_for_eval "$flag" 5811 + func_append arg " $wl$func_quote_for_eval_result" 5812 + func_append compiler_flags " $wl$func_quote_for_eval_result" 5813 + func_append linker_flags " $func_quote_for_eval_result" 5814 + done 5815 + IFS="$save_ifs" 5816 + func_stripname ' ' '' "$arg" 5817 + arg=$func_stripname_result 5818 + ;; 5819 + 5820 + -Xcompiler) 5821 + prev=xcompiler 5822 + continue 5823 + ;; 5824 + 5825 + -Xlinker) 5826 + prev=xlinker 5827 + continue 5828 + ;; 5829 + 5830 + -XCClinker) 5831 + prev=xcclinker 5832 + continue 5833 + ;; 5834 + 5835 + # -msg_* for osf cc 5836 + -msg_*) 5837 + func_quote_for_eval "$arg" 5838 + arg="$func_quote_for_eval_result" 5839 + ;; 5840 + 5841 + # Flags to be passed through unchanged, with rationale: 5842 + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler 5843 + # -r[0-9][0-9]* specify processor for the SGI compiler 5844 + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler 5845 + # +DA*, +DD* enable 64-bit mode for the HP compiler 5846 + # -q* compiler args for the IBM compiler 5847 + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC 5848 + # -F/path path to uninstalled frameworks, gcc on darwin 5849 + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC 5850 + # @file GCC response files 5851 + # -tp=* Portland pgcc target processor selection 5852 + # --sysroot=* for sysroot support 5853 + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization 5854 + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ 5855 + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ 5856 + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) 5857 + func_quote_for_eval "$arg" 5858 + arg="$func_quote_for_eval_result" 5859 + func_append compile_command " $arg" 5860 + func_append finalize_command " $arg" 5861 + func_append compiler_flags " $arg" 5862 + continue 5863 + ;; 5864 + 5865 + # Some other compiler flag. 5866 + -* | +*) 5867 + func_quote_for_eval "$arg" 5868 + arg="$func_quote_for_eval_result" 5869 + ;; 5870 + 5871 + *.$objext) 5872 + # A standard object. 5873 + func_append objs " $arg" 5874 + ;; 5875 + 5876 + *.lo) 5877 + # A libtool-controlled object. 5878 + 5879 + # Check to see that this really is a libtool object. 5880 + if func_lalib_unsafe_p "$arg"; then 5881 + pic_object= 5882 + non_pic_object= 5883 + 5884 + # Read the .lo file 5885 + func_source "$arg" 5886 + 5887 + if test -z "$pic_object" || 5888 + test -z "$non_pic_object" || 5889 + test "$pic_object" = none && 5890 + test "$non_pic_object" = none; then 5891 + func_fatal_error "cannot find name of object for \`$arg'" 5892 + fi 5893 + 5894 + # Extract subdirectory from the argument. 5895 + func_dirname "$arg" "/" "" 5896 + xdir="$func_dirname_result" 5897 + 5898 + if test "$pic_object" != none; then 5899 + # Prepend the subdirectory the object is found in. 5900 + pic_object="$xdir$pic_object" 5901 + 5902 + if test "$prev" = dlfiles; then 5903 + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then 5904 + func_append dlfiles " $pic_object" 5905 + prev= 5906 + continue 5907 + else 5908 + # If libtool objects are unsupported, then we need to preload. 5909 + prev=dlprefiles 5910 + fi 5911 + fi 5912 + 5913 + # CHECK ME: I think I busted this. -Ossama 5914 + if test "$prev" = dlprefiles; then 5915 + # Preload the old-style object. 5916 + func_append dlprefiles " $pic_object" 5917 + prev= 5918 + fi 5919 + 5920 + # A PIC object. 5921 + func_append libobjs " $pic_object" 5922 + arg="$pic_object" 5923 + fi 5924 + 5925 + # Non-PIC object. 5926 + if test "$non_pic_object" != none; then 5927 + # Prepend the subdirectory the object is found in. 5928 + non_pic_object="$xdir$non_pic_object" 5929 + 5930 + # A standard non-PIC object 5931 + func_append non_pic_objects " $non_pic_object" 5932 + if test -z "$pic_object" || test "$pic_object" = none ; then 5933 + arg="$non_pic_object" 5934 + fi 5935 + else 5936 + # If the PIC object exists, use it instead. 5937 + # $xdir was prepended to $pic_object above. 5938 + non_pic_object="$pic_object" 5939 + func_append non_pic_objects " $non_pic_object" 5940 + fi 5941 + else 5942 + # Only an error if not doing a dry-run. 5943 + if $opt_dry_run; then 5944 + # Extract subdirectory from the argument. 5945 + func_dirname "$arg" "/" "" 5946 + xdir="$func_dirname_result" 5947 + 5948 + func_lo2o "$arg" 5949 + pic_object=$xdir$objdir/$func_lo2o_result 5950 + non_pic_object=$xdir$func_lo2o_result 5951 + func_append libobjs " $pic_object" 5952 + func_append non_pic_objects " $non_pic_object" 5953 + else 5954 + func_fatal_error "\`$arg' is not a valid libtool object" 5955 + fi 5956 + fi 5957 + ;; 5958 + 5959 + *.$libext) 5960 + # An archive. 5961 + func_append deplibs " $arg" 5962 + func_append old_deplibs " $arg" 5963 + continue 5964 + ;; 5965 + 5966 + *.la) 5967 + # A libtool-controlled library. 5968 + 5969 + func_resolve_sysroot "$arg" 5970 + if test "$prev" = dlfiles; then 5971 + # This library was specified with -dlopen. 5972 + func_append dlfiles " $func_resolve_sysroot_result" 5973 + prev= 5974 + elif test "$prev" = dlprefiles; then 5975 + # The library was specified with -dlpreopen. 5976 + func_append dlprefiles " $func_resolve_sysroot_result" 5977 + prev= 5978 + else 5979 + func_append deplibs " $func_resolve_sysroot_result" 5980 + fi 5981 + continue 5982 + ;; 5983 + 5984 + # Some other compiler argument. 5985 + *) 5986 + # Unknown arguments in both finalize_command and compile_command need 5987 + # to be aesthetically quoted because they are evaled later. 5988 + func_quote_for_eval "$arg" 5989 + arg="$func_quote_for_eval_result" 5990 + ;; 5991 + esac # arg 5992 + 5993 + # Now actually substitute the argument into the commands. 5994 + if test -n "$arg"; then 5995 + func_append compile_command " $arg" 5996 + func_append finalize_command " $arg" 5997 + fi 5998 + done # argument parsing loop 5999 + 6000 + test -n "$prev" && \ 6001 + func_fatal_help "the \`$prevarg' option requires an argument" 6002 + 6003 + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then 6004 + eval arg=\"$export_dynamic_flag_spec\" 6005 + func_append compile_command " $arg" 6006 + func_append finalize_command " $arg" 6007 + fi 6008 + 6009 + oldlibs= 6010 + # calculate the name of the file, without its directory 6011 + func_basename "$output" 6012 + outputname="$func_basename_result" 6013 + libobjs_save="$libobjs" 6014 + 6015 + if test -n "$shlibpath_var"; then 6016 + # get the directories listed in $shlibpath_var 6017 + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` 6018 + else 6019 + shlib_search_path= 6020 + fi 6021 + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" 6022 + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" 6023 + 6024 + func_dirname "$output" "/" "" 6025 + output_objdir="$func_dirname_result$objdir" 6026 + func_to_tool_file "$output_objdir/" 6027 + tool_output_objdir=$func_to_tool_file_result 6028 + # Create the object directory. 6029 + func_mkdir_p "$output_objdir" 6030 + 6031 + # Determine the type of output 6032 + case $output in 6033 + "") 6034 + func_fatal_help "you must specify an output file" 6035 + ;; 6036 + *.$libext) linkmode=oldlib ;; 6037 + *.lo | *.$objext) linkmode=obj ;; 6038 + *.la) linkmode=lib ;; 6039 + *) linkmode=prog ;; # Anything else should be a program. 6040 + esac 6041 + 6042 + specialdeplibs= 6043 + 6044 + libs= 6045 + # Find all interdependent deplibs by searching for libraries 6046 + # that are linked more than once (e.g. -la -lb -la) 6047 + for deplib in $deplibs; do 6048 + if $opt_preserve_dup_deps ; then 6049 + case "$libs " in 6050 + *" $deplib "*) func_append specialdeplibs " $deplib" ;; 6051 + esac 6052 + fi 6053 + func_append libs " $deplib" 6054 + done 6055 + 6056 + if test "$linkmode" = lib; then 6057 + libs="$predeps $libs $compiler_lib_search_path $postdeps" 6058 + 6059 + # Compute libraries that are listed more than once in $predeps 6060 + # $postdeps and mark them as special (i.e., whose duplicates are 6061 + # not to be eliminated). 6062 + pre_post_deps= 6063 + if $opt_duplicate_compiler_generated_deps; then 6064 + for pre_post_dep in $predeps $postdeps; do 6065 + case "$pre_post_deps " in 6066 + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; 6067 + esac 6068 + func_append pre_post_deps " $pre_post_dep" 6069 + done 6070 + fi 6071 + pre_post_deps= 6072 + fi 6073 + 6074 + deplibs= 6075 + newdependency_libs= 6076 + newlib_search_path= 6077 + need_relink=no # whether we're linking any uninstalled libtool libraries 6078 + notinst_deplibs= # not-installed libtool libraries 6079 + notinst_path= # paths that contain not-installed libtool libraries 6080 + 6081 + case $linkmode in 6082 + lib) 6083 + passes="conv dlpreopen link" 6084 + for file in $dlfiles $dlprefiles; do 6085 + case $file in 6086 + *.la) ;; 6087 + *) 6088 + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" 6089 + ;; 6090 + esac 6091 + done 6092 + ;; 6093 + prog) 6094 + compile_deplibs= 6095 + finalize_deplibs= 6096 + alldeplibs=no 6097 + newdlfiles= 6098 + newdlprefiles= 6099 + passes="conv scan dlopen dlpreopen link" 6100 + ;; 6101 + *) passes="conv" 6102 + ;; 6103 + esac 6104 + 6105 + for pass in $passes; do 6106 + # The preopen pass in lib mode reverses $deplibs; put it back here 6107 + # so that -L comes before libs that need it for instance... 6108 + if test "$linkmode,$pass" = "lib,link"; then 6109 + ## FIXME: Find the place where the list is rebuilt in the wrong 6110 + ## order, and fix it there properly 6111 + tmp_deplibs= 6112 + for deplib in $deplibs; do 6113 + tmp_deplibs="$deplib $tmp_deplibs" 6114 + done 6115 + deplibs="$tmp_deplibs" 6116 + fi 6117 + 6118 + if test "$linkmode,$pass" = "lib,link" || 6119 + test "$linkmode,$pass" = "prog,scan"; then 6120 + libs="$deplibs" 6121 + deplibs= 6122 + fi 6123 + if test "$linkmode" = prog; then 6124 + case $pass in 6125 + dlopen) libs="$dlfiles" ;; 6126 + dlpreopen) libs="$dlprefiles" ;; 6127 + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; 6128 + esac 6129 + fi 6130 + if test "$linkmode,$pass" = "lib,dlpreopen"; then 6131 + # Collect and forward deplibs of preopened libtool libs 6132 + for lib in $dlprefiles; do 6133 + # Ignore non-libtool-libs 6134 + dependency_libs= 6135 + func_resolve_sysroot "$lib" 6136 + case $lib in 6137 + *.la) func_source "$func_resolve_sysroot_result" ;; 6138 + esac 6139 + 6140 + # Collect preopened libtool deplibs, except any this library 6141 + # has declared as weak libs 6142 + for deplib in $dependency_libs; do 6143 + func_basename "$deplib" 6144 + deplib_base=$func_basename_result 6145 + case " $weak_libs " in 6146 + *" $deplib_base "*) ;; 6147 + *) func_append deplibs " $deplib" ;; 6148 + esac 6149 + done 6150 + done 6151 + libs="$dlprefiles" 6152 + fi 6153 + if test "$pass" = dlopen; then 6154 + # Collect dlpreopened libraries 6155 + save_deplibs="$deplibs" 6156 + deplibs= 6157 + fi 6158 + 6159 + for deplib in $libs; do 6160 + lib= 6161 + found=no 6162 + case $deplib in 6163 + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ 6164 + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) 6165 + if test "$linkmode,$pass" = "prog,link"; then 6166 + compile_deplibs="$deplib $compile_deplibs" 6167 + finalize_deplibs="$deplib $finalize_deplibs" 6168 + else 6169 + func_append compiler_flags " $deplib" 6170 + if test "$linkmode" = lib ; then 6171 + case "$new_inherited_linker_flags " in 6172 + *" $deplib "*) ;; 6173 + * ) func_append new_inherited_linker_flags " $deplib" ;; 6174 + esac 6175 + fi 6176 + fi 6177 + continue 6178 + ;; 6179 + -l*) 6180 + if test "$linkmode" != lib && test "$linkmode" != prog; then 6181 + func_warning "\`-l' is ignored for archives/objects" 6182 + continue 6183 + fi 6184 + func_stripname '-l' '' "$deplib" 6185 + name=$func_stripname_result 6186 + if test "$linkmode" = lib; then 6187 + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" 6188 + else 6189 + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" 6190 + fi 6191 + for searchdir in $searchdirs; do 6192 + for search_ext in .la $std_shrext .so .a; do 6193 + # Search the libtool library 6194 + lib="$searchdir/lib${name}${search_ext}" 6195 + if test -f "$lib"; then 6196 + if test "$search_ext" = ".la"; then 6197 + found=yes 6198 + else 6199 + found=no 6200 + fi 6201 + break 2 6202 + fi 6203 + done 6204 + done 6205 + if test "$found" != yes; then 6206 + # deplib doesn't seem to be a libtool library 6207 + if test "$linkmode,$pass" = "prog,link"; then 6208 + compile_deplibs="$deplib $compile_deplibs" 6209 + finalize_deplibs="$deplib $finalize_deplibs" 6210 + else 6211 + deplibs="$deplib $deplibs" 6212 + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" 6213 + fi 6214 + continue 6215 + else # deplib is a libtool library 6216 + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, 6217 + # We need to do some special things here, and not later. 6218 + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then 6219 + case " $predeps $postdeps " in 6220 + *" $deplib "*) 6221 + if func_lalib_p "$lib"; then 6222 + library_names= 6223 + old_library= 6224 + func_source "$lib" 6225 + for l in $old_library $library_names; do 6226 + ll="$l" 6227 + done 6228 + if test "X$ll" = "X$old_library" ; then # only static version available 6229 + found=no 6230 + func_dirname "$lib" "" "." 6231 + ladir="$func_dirname_result" 6232 + lib=$ladir/$old_library 6233 + if test "$linkmode,$pass" = "prog,link"; then 6234 + compile_deplibs="$deplib $compile_deplibs" 6235 + finalize_deplibs="$deplib $finalize_deplibs" 6236 + else 6237 + deplibs="$deplib $deplibs" 6238 + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" 6239 + fi 6240 + continue 6241 + fi 6242 + fi 6243 + ;; 6244 + *) ;; 6245 + esac 6246 + fi 6247 + fi 6248 + ;; # -l 6249 + *.ltframework) 6250 + if test "$linkmode,$pass" = "prog,link"; then 6251 + compile_deplibs="$deplib $compile_deplibs" 6252 + finalize_deplibs="$deplib $finalize_deplibs" 6253 + else 6254 + deplibs="$deplib $deplibs" 6255 + if test "$linkmode" = lib ; then 6256 + case "$new_inherited_linker_flags " in 6257 + *" $deplib "*) ;; 6258 + * ) func_append new_inherited_linker_flags " $deplib" ;; 6259 + esac 6260 + fi 6261 + fi 6262 + continue 6263 + ;; 6264 + -L*) 6265 + case $linkmode in 6266 + lib) 6267 + deplibs="$deplib $deplibs" 6268 + test "$pass" = conv && continue 6269 + newdependency_libs="$deplib $newdependency_libs" 6270 + func_stripname '-L' '' "$deplib" 6271 + func_resolve_sysroot "$func_stripname_result" 6272 + func_append newlib_search_path " $func_resolve_sysroot_result" 6273 + ;; 6274 + prog) 6275 + if test "$pass" = conv; then 6276 + deplibs="$deplib $deplibs" 6277 + continue 6278 + fi 6279 + if test "$pass" = scan; then 6280 + deplibs="$deplib $deplibs" 6281 + else 6282 + compile_deplibs="$deplib $compile_deplibs" 6283 + finalize_deplibs="$deplib $finalize_deplibs" 6284 + fi 6285 + func_stripname '-L' '' "$deplib" 6286 + func_resolve_sysroot "$func_stripname_result" 6287 + func_append newlib_search_path " $func_resolve_sysroot_result" 6288 + ;; 6289 + *) 6290 + func_warning "\`-L' is ignored for archives/objects" 6291 + ;; 6292 + esac # linkmode 6293 + continue 6294 + ;; # -L 6295 + -R*) 6296 + if test "$pass" = link; then 6297 + func_stripname '-R' '' "$deplib" 6298 + func_resolve_sysroot "$func_stripname_result" 6299 + dir=$func_resolve_sysroot_result 6300 + # Make sure the xrpath contains only unique directories. 6301 + case "$xrpath " in 6302 + *" $dir "*) ;; 6303 + *) func_append xrpath " $dir" ;; 6304 + esac 6305 + fi 6306 + deplibs="$deplib $deplibs" 6307 + continue 6308 + ;; 6309 + *.la) 6310 + func_resolve_sysroot "$deplib" 6311 + lib=$func_resolve_sysroot_result 6312 + ;; 6313 + *.$libext) 6314 + if test "$pass" = conv; then 6315 + deplibs="$deplib $deplibs" 6316 + continue 6317 + fi 6318 + case $linkmode in 6319 + lib) 6320 + # Linking convenience modules into shared libraries is allowed, 6321 + # but linking other static libraries is non-portable. 6322 + case " $dlpreconveniencelibs " in 6323 + *" $deplib "*) ;; 6324 + *) 6325 + valid_a_lib=no 6326 + case $deplibs_check_method in 6327 + match_pattern*) 6328 + set dummy $deplibs_check_method; shift 6329 + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` 6330 + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ 6331 + | $EGREP "$match_pattern_regex" > /dev/null; then 6332 + valid_a_lib=yes 6333 + fi 6334 + ;; 6335 + pass_all) 6336 + valid_a_lib=yes 6337 + ;; 6338 + esac 6339 + if test "$valid_a_lib" != yes; then 6340 + echo 6341 + $ECHO "*** Warning: Trying to link with static lib archive $deplib." 6342 + echo "*** I have the capability to make that library automatically link in when" 6343 + echo "*** you link to this library. But I can only do this if you have a" 6344 + echo "*** shared version of the library, which you do not appear to have" 6345 + echo "*** because the file extensions .$libext of this argument makes me believe" 6346 + echo "*** that it is just a static archive that I should not use here." 6347 + else 6348 + echo 6349 + $ECHO "*** Warning: Linking the shared library $output against the" 6350 + $ECHO "*** static library $deplib is not portable!" 6351 + deplibs="$deplib $deplibs" 6352 + fi 6353 + ;; 6354 + esac 6355 + continue 6356 + ;; 6357 + prog) 6358 + if test "$pass" != link; then 6359 + deplibs="$deplib $deplibs" 6360 + else 6361 + compile_deplibs="$deplib $compile_deplibs" 6362 + finalize_deplibs="$deplib $finalize_deplibs" 6363 + fi 6364 + continue 6365 + ;; 6366 + esac # linkmode 6367 + ;; # *.$libext 6368 + *.lo | *.$objext) 6369 + if test "$pass" = conv; then 6370 + deplibs="$deplib $deplibs" 6371 + elif test "$linkmode" = prog; then 6372 + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then 6373 + # If there is no dlopen support or we're linking statically, 6374 + # we need to preload. 6375 + func_append newdlprefiles " $deplib" 6376 + compile_deplibs="$deplib $compile_deplibs" 6377 + finalize_deplibs="$deplib $finalize_deplibs" 6378 + else 6379 + func_append newdlfiles " $deplib" 6380 + fi 6381 + fi 6382 + continue 6383 + ;; 6384 + %DEPLIBS%) 6385 + alldeplibs=yes 6386 + continue 6387 + ;; 6388 + esac # case $deplib 6389 + 6390 + if test "$found" = yes || test -f "$lib"; then : 6391 + else 6392 + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" 6393 + fi 6394 + 6395 + # Check to see that this really is a libtool archive. 6396 + func_lalib_unsafe_p "$lib" \ 6397 + || func_fatal_error "\`$lib' is not a valid libtool archive" 6398 + 6399 + func_dirname "$lib" "" "." 6400 + ladir="$func_dirname_result" 6401 + 6402 + dlname= 6403 + dlopen= 6404 + dlpreopen= 6405 + libdir= 6406 + library_names= 6407 + old_library= 6408 + inherited_linker_flags= 6409 + # If the library was installed with an old release of libtool, 6410 + # it will not redefine variables installed, or shouldnotlink 6411 + installed=yes 6412 + shouldnotlink=no 6413 + avoidtemprpath= 6414 + 6415 + 6416 + # Read the .la file 6417 + func_source "$lib" 6418 + 6419 + # Convert "-framework foo" to "foo.ltframework" 6420 + if test -n "$inherited_linker_flags"; then 6421 + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` 6422 + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do 6423 + case " $new_inherited_linker_flags " in 6424 + *" $tmp_inherited_linker_flag "*) ;; 6425 + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; 6426 + esac 6427 + done 6428 + fi 6429 + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 6430 + if test "$linkmode,$pass" = "lib,link" || 6431 + test "$linkmode,$pass" = "prog,scan" || 6432 + { test "$linkmode" != prog && test "$linkmode" != lib; }; then 6433 + test -n "$dlopen" && func_append dlfiles " $dlopen" 6434 + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" 6435 + fi 6436 + 6437 + if test "$pass" = conv; then 6438 + # Only check for convenience libraries 6439 + deplibs="$lib $deplibs" 6440 + if test -z "$libdir"; then 6441 + if test -z "$old_library"; then 6442 + func_fatal_error "cannot find name of link library for \`$lib'" 6443 + fi 6444 + # It is a libtool convenience library, so add in its objects. 6445 + func_append convenience " $ladir/$objdir/$old_library" 6446 + func_append old_convenience " $ladir/$objdir/$old_library" 6447 + elif test "$linkmode" != prog && test "$linkmode" != lib; then 6448 + func_fatal_error "\`$lib' is not a convenience library" 6449 + fi 6450 + tmp_libs= 6451 + for deplib in $dependency_libs; do 6452 + deplibs="$deplib $deplibs" 6453 + if $opt_preserve_dup_deps ; then 6454 + case "$tmp_libs " in 6455 + *" $deplib "*) func_append specialdeplibs " $deplib" ;; 6456 + esac 6457 + fi 6458 + func_append tmp_libs " $deplib" 6459 + done 6460 + continue 6461 + fi # $pass = conv 6462 + 6463 + 6464 + # Get the name of the library we link against. 6465 + linklib= 6466 + if test -n "$old_library" && 6467 + { test "$prefer_static_libs" = yes || 6468 + test "$prefer_static_libs,$installed" = "built,no"; }; then 6469 + linklib=$old_library 6470 + else 6471 + for l in $old_library $library_names; do 6472 + linklib="$l" 6473 + done 6474 + fi 6475 + if test -z "$linklib"; then 6476 + func_fatal_error "cannot find name of link library for \`$lib'" 6477 + fi 6478 + 6479 + # This library was specified with -dlopen. 6480 + if test "$pass" = dlopen; then 6481 + if test -z "$libdir"; then 6482 + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" 6483 + fi 6484 + if test -z "$dlname" || 6485 + test "$dlopen_support" != yes || 6486 + test "$build_libtool_libs" = no; then 6487 + # If there is no dlname, no dlopen support or we're linking 6488 + # statically, we need to preload. We also need to preload any 6489 + # dependent libraries so libltdl's deplib preloader doesn't 6490 + # bomb out in the load deplibs phase. 6491 + func_append dlprefiles " $lib $dependency_libs" 6492 + else 6493 + func_append newdlfiles " $lib" 6494 + fi 6495 + continue 6496 + fi # $pass = dlopen 6497 + 6498 + # We need an absolute path. 6499 + case $ladir in 6500 + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; 6501 + *) 6502 + abs_ladir=`cd "$ladir" && pwd` 6503 + if test -z "$abs_ladir"; then 6504 + func_warning "cannot determine absolute directory name of \`$ladir'" 6505 + func_warning "passing it literally to the linker, although it might fail" 6506 + abs_ladir="$ladir" 6507 + fi 6508 + ;; 6509 + esac 6510 + func_basename "$lib" 6511 + laname="$func_basename_result" 6512 + 6513 + # Find the relevant object directory and library name. 6514 + if test "X$installed" = Xyes; then 6515 + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then 6516 + func_warning "library \`$lib' was moved." 6517 + dir="$ladir" 6518 + absdir="$abs_ladir" 6519 + libdir="$abs_ladir" 6520 + else 6521 + dir="$lt_sysroot$libdir" 6522 + absdir="$lt_sysroot$libdir" 6523 + fi 6524 + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes 6525 + else 6526 + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then 6527 + dir="$ladir" 6528 + absdir="$abs_ladir" 6529 + # Remove this search path later 6530 + func_append notinst_path " $abs_ladir" 6531 + else 6532 + dir="$ladir/$objdir" 6533 + absdir="$abs_ladir/$objdir" 6534 + # Remove this search path later 6535 + func_append notinst_path " $abs_ladir" 6536 + fi 6537 + fi # $installed = yes 6538 + func_stripname 'lib' '.la' "$laname" 6539 + name=$func_stripname_result 6540 + 6541 + # This library was specified with -dlpreopen. 6542 + if test "$pass" = dlpreopen; then 6543 + if test -z "$libdir" && test "$linkmode" = prog; then 6544 + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" 6545 + fi 6546 + case "$host" in 6547 + # special handling for platforms with PE-DLLs. 6548 + *cygwin* | *mingw* | *cegcc* ) 6549 + # Linker will automatically link against shared library if both 6550 + # static and shared are present. Therefore, ensure we extract 6551 + # symbols from the import library if a shared library is present 6552 + # (otherwise, the dlopen module name will be incorrect). We do 6553 + # this by putting the import library name into $newdlprefiles. 6554 + # We recover the dlopen module name by 'saving' the la file 6555 + # name in a special purpose variable, and (later) extracting the 6556 + # dlname from the la file. 6557 + if test -n "$dlname"; then 6558 + func_tr_sh "$dir/$linklib" 6559 + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" 6560 + func_append newdlprefiles " $dir/$linklib" 6561 + else 6562 + func_append newdlprefiles " $dir/$old_library" 6563 + # Keep a list of preopened convenience libraries to check 6564 + # that they are being used correctly in the link pass. 6565 + test -z "$libdir" && \ 6566 + func_append dlpreconveniencelibs " $dir/$old_library" 6567 + fi 6568 + ;; 6569 + * ) 6570 + # Prefer using a static library (so that no silly _DYNAMIC symbols 6571 + # are required to link). 6572 + if test -n "$old_library"; then 6573 + func_append newdlprefiles " $dir/$old_library" 6574 + # Keep a list of preopened convenience libraries to check 6575 + # that they are being used correctly in the link pass. 6576 + test -z "$libdir" && \ 6577 + func_append dlpreconveniencelibs " $dir/$old_library" 6578 + # Otherwise, use the dlname, so that lt_dlopen finds it. 6579 + elif test -n "$dlname"; then 6580 + func_append newdlprefiles " $dir/$dlname" 6581 + else 6582 + func_append newdlprefiles " $dir/$linklib" 6583 + fi 6584 + ;; 6585 + esac 6586 + fi # $pass = dlpreopen 6587 + 6588 + if test -z "$libdir"; then 6589 + # Link the convenience library 6590 + if test "$linkmode" = lib; then 6591 + deplibs="$dir/$old_library $deplibs" 6592 + elif test "$linkmode,$pass" = "prog,link"; then 6593 + compile_deplibs="$dir/$old_library $compile_deplibs" 6594 + finalize_deplibs="$dir/$old_library $finalize_deplibs" 6595 + else 6596 + deplibs="$lib $deplibs" # used for prog,scan pass 6597 + fi 6598 + continue 6599 + fi 6600 + 6601 + 6602 + if test "$linkmode" = prog && test "$pass" != link; then 6603 + func_append newlib_search_path " $ladir" 6604 + deplibs="$lib $deplibs" 6605 + 6606 + linkalldeplibs=no 6607 + if test "$link_all_deplibs" != no || test -z "$library_names" || 6608 + test "$build_libtool_libs" = no; then 6609 + linkalldeplibs=yes 6610 + fi 6611 + 6612 + tmp_libs= 6613 + for deplib in $dependency_libs; do 6614 + case $deplib in 6615 + -L*) func_stripname '-L' '' "$deplib" 6616 + func_resolve_sysroot "$func_stripname_result" 6617 + func_append newlib_search_path " $func_resolve_sysroot_result" 6618 + ;; 6619 + esac 6620 + # Need to link against all dependency_libs? 6621 + if test "$linkalldeplibs" = yes; then 6622 + deplibs="$deplib $deplibs" 6623 + else 6624 + # Need to hardcode shared library paths 6625 + # or/and link against static libraries 6626 + newdependency_libs="$deplib $newdependency_libs" 6627 + fi 6628 + if $opt_preserve_dup_deps ; then 6629 + case "$tmp_libs " in 6630 + *" $deplib "*) func_append specialdeplibs " $deplib" ;; 6631 + esac 6632 + fi 6633 + func_append tmp_libs " $deplib" 6634 + done # for deplib 6635 + continue 6636 + fi # $linkmode = prog... 6637 + 6638 + if test "$linkmode,$pass" = "prog,link"; then 6639 + if test -n "$library_names" && 6640 + { { test "$prefer_static_libs" = no || 6641 + test "$prefer_static_libs,$installed" = "built,yes"; } || 6642 + test -z "$old_library"; }; then 6643 + # We need to hardcode the library path 6644 + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then 6645 + # Make sure the rpath contains only unique directories. 6646 + case "$temp_rpath:" in 6647 + *"$absdir:"*) ;; 6648 + *) func_append temp_rpath "$absdir:" ;; 6649 + esac 6650 + fi 6651 + 6652 + # Hardcode the library path. 6653 + # Skip directories that are in the system default run-time 6654 + # search path. 6655 + case " $sys_lib_dlsearch_path " in 6656 + *" $absdir "*) ;; 6657 + *) 6658 + case "$compile_rpath " in 6659 + *" $absdir "*) ;; 6660 + *) func_append compile_rpath " $absdir" ;; 6661 + esac 6662 + ;; 6663 + esac 6664 + case " $sys_lib_dlsearch_path " in 6665 + *" $libdir "*) ;; 6666 + *) 6667 + case "$finalize_rpath " in 6668 + *" $libdir "*) ;; 6669 + *) func_append finalize_rpath " $libdir" ;; 6670 + esac 6671 + ;; 6672 + esac 6673 + fi # $linkmode,$pass = prog,link... 6674 + 6675 + if test "$alldeplibs" = yes && 6676 + { test "$deplibs_check_method" = pass_all || 6677 + { test "$build_libtool_libs" = yes && 6678 + test -n "$library_names"; }; }; then 6679 + # We only need to search for static libraries 6680 + continue 6681 + fi 6682 + fi 6683 + 6684 + link_static=no # Whether the deplib will be linked statically 6685 + use_static_libs=$prefer_static_libs 6686 + if test "$use_static_libs" = built && test "$installed" = yes; then 6687 + use_static_libs=no 6688 + fi 6689 + if test -n "$library_names" && 6690 + { test "$use_static_libs" = no || test -z "$old_library"; }; then 6691 + case $host in 6692 + *cygwin* | *mingw* | *cegcc*) 6693 + # No point in relinking DLLs because paths are not encoded 6694 + func_append notinst_deplibs " $lib" 6695 + need_relink=no 6696 + ;; 6697 + *) 6698 + if test "$installed" = no; then 6699 + func_append notinst_deplibs " $lib" 6700 + need_relink=yes 6701 + fi 6702 + ;; 6703 + esac 6704 + # This is a shared library 6705 + 6706 + # Warn about portability, can't link against -module's on some 6707 + # systems (darwin). Don't bleat about dlopened modules though! 6708 + dlopenmodule="" 6709 + for dlpremoduletest in $dlprefiles; do 6710 + if test "X$dlpremoduletest" = "X$lib"; then 6711 + dlopenmodule="$dlpremoduletest" 6712 + break 6713 + fi 6714 + done 6715 + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then 6716 + echo 6717 + if test "$linkmode" = prog; then 6718 + $ECHO "*** Warning: Linking the executable $output against the loadable module" 6719 + else 6720 + $ECHO "*** Warning: Linking the shared library $output against the loadable module" 6721 + fi 6722 + $ECHO "*** $linklib is not portable!" 6723 + fi 6724 + if test "$linkmode" = lib && 6725 + test "$hardcode_into_libs" = yes; then 6726 + # Hardcode the library path. 6727 + # Skip directories that are in the system default run-time 6728 + # search path. 6729 + case " $sys_lib_dlsearch_path " in 6730 + *" $absdir "*) ;; 6731 + *) 6732 + case "$compile_rpath " in 6733 + *" $absdir "*) ;; 6734 + *) func_append compile_rpath " $absdir" ;; 6735 + esac 6736 + ;; 6737 + esac 6738 + case " $sys_lib_dlsearch_path " in 6739 + *" $libdir "*) ;; 6740 + *) 6741 + case "$finalize_rpath " in 6742 + *" $libdir "*) ;; 6743 + *) func_append finalize_rpath " $libdir" ;; 6744 + esac 6745 + ;; 6746 + esac 6747 + fi 6748 + 6749 + if test -n "$old_archive_from_expsyms_cmds"; then 6750 + # figure out the soname 6751 + set dummy $library_names 6752 + shift 6753 + realname="$1" 6754 + shift 6755 + libname=`eval "\\$ECHO \"$libname_spec\""` 6756 + # use dlname if we got it. it's perfectly good, no? 6757 + if test -n "$dlname"; then 6758 + soname="$dlname" 6759 + elif test -n "$soname_spec"; then 6760 + # bleh windows 6761 + case $host in 6762 + *cygwin* | mingw* | *cegcc*) 6763 + func_arith $current - $age 6764 + major=$func_arith_result 6765 + versuffix="-$major" 6766 + ;; 6767 + esac 6768 + eval soname=\"$soname_spec\" 6769 + else 6770 + soname="$realname" 6771 + fi 6772 + 6773 + # Make a new name for the extract_expsyms_cmds to use 6774 + soroot="$soname" 6775 + func_basename "$soroot" 6776 + soname="$func_basename_result" 6777 + func_stripname 'lib' '.dll' "$soname" 6778 + newlib=libimp-$func_stripname_result.a 6779 + 6780 + # If the library has no export list, then create one now 6781 + if test -f "$output_objdir/$soname-def"; then : 6782 + else 6783 + func_verbose "extracting exported symbol list from \`$soname'" 6784 + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' 6785 + fi 6786 + 6787 + # Create $newlib 6788 + if test -f "$output_objdir/$newlib"; then :; else 6789 + func_verbose "generating import library for \`$soname'" 6790 + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' 6791 + fi 6792 + # make sure the library variables are pointing to the new library 6793 + dir=$output_objdir 6794 + linklib=$newlib 6795 + fi # test -n "$old_archive_from_expsyms_cmds" 6796 + 6797 + if test "$linkmode" = prog || test "$opt_mode" != relink; then 6798 + add_shlibpath= 6799 + add_dir= 6800 + add= 6801 + lib_linked=yes 6802 + case $hardcode_action in 6803 + immediate | unsupported) 6804 + if test "$hardcode_direct" = no; then 6805 + add="$dir/$linklib" 6806 + case $host in 6807 + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; 6808 + *-*-sysv4*uw2*) add_dir="-L$dir" ;; 6809 + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ 6810 + *-*-unixware7*) add_dir="-L$dir" ;; 6811 + *-*-darwin* ) 6812 + # if the lib is a (non-dlopened) module then we can not 6813 + # link against it, someone is ignoring the earlier warnings 6814 + if /usr/bin/file -L $add 2> /dev/null | 6815 + $GREP ": [^:]* bundle" >/dev/null ; then 6816 + if test "X$dlopenmodule" != "X$lib"; then 6817 + $ECHO "*** Warning: lib $linklib is a module, not a shared library" 6818 + if test -z "$old_library" ; then 6819 + echo 6820 + echo "*** And there doesn't seem to be a static archive available" 6821 + echo "*** The link will probably fail, sorry" 6822 + else 6823 + add="$dir/$old_library" 6824 + fi 6825 + elif test -n "$old_library"; then 6826 + add="$dir/$old_library" 6827 + fi 6828 + fi 6829 + esac 6830 + elif test "$hardcode_minus_L" = no; then 6831 + case $host in 6832 + *-*-sunos*) add_shlibpath="$dir" ;; 6833 + esac 6834 + add_dir="-L$dir" 6835 + add="-l$name" 6836 + elif test "$hardcode_shlibpath_var" = no; then 6837 + add_shlibpath="$dir" 6838 + add="-l$name" 6839 + else 6840 + lib_linked=no 6841 + fi 6842 + ;; 6843 + relink) 6844 + if test "$hardcode_direct" = yes && 6845 + test "$hardcode_direct_absolute" = no; then 6846 + add="$dir/$linklib" 6847 + elif test "$hardcode_minus_L" = yes; then 6848 + add_dir="-L$absdir" 6849 + # Try looking first in the location we're being installed to. 6850 + if test -n "$inst_prefix_dir"; then 6851 + case $libdir in 6852 + [\\/]*) 6853 + func_append add_dir " -L$inst_prefix_dir$libdir" 6854 + ;; 6855 + esac 6856 + fi 6857 + add="-l$name" 6858 + elif test "$hardcode_shlibpath_var" = yes; then 6859 + add_shlibpath="$dir" 6860 + add="-l$name" 6861 + else 6862 + lib_linked=no 6863 + fi 6864 + ;; 6865 + *) lib_linked=no ;; 6866 + esac 6867 + 6868 + if test "$lib_linked" != yes; then 6869 + func_fatal_configuration "unsupported hardcode properties" 6870 + fi 6871 + 6872 + if test -n "$add_shlibpath"; then 6873 + case :$compile_shlibpath: in 6874 + *":$add_shlibpath:"*) ;; 6875 + *) func_append compile_shlibpath "$add_shlibpath:" ;; 6876 + esac 6877 + fi 6878 + if test "$linkmode" = prog; then 6879 + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" 6880 + test -n "$add" && compile_deplibs="$add $compile_deplibs" 6881 + else 6882 + test -n "$add_dir" && deplibs="$add_dir $deplibs" 6883 + test -n "$add" && deplibs="$add $deplibs" 6884 + if test "$hardcode_direct" != yes && 6885 + test "$hardcode_minus_L" != yes && 6886 + test "$hardcode_shlibpath_var" = yes; then 6887 + case :$finalize_shlibpath: in 6888 + *":$libdir:"*) ;; 6889 + *) func_append finalize_shlibpath "$libdir:" ;; 6890 + esac 6891 + fi 6892 + fi 6893 + fi 6894 + 6895 + if test "$linkmode" = prog || test "$opt_mode" = relink; then 6896 + add_shlibpath= 6897 + add_dir= 6898 + add= 6899 + # Finalize command for both is simple: just hardcode it. 6900 + if test "$hardcode_direct" = yes && 6901 + test "$hardcode_direct_absolute" = no; then 6902 + add="$libdir/$linklib" 6903 + elif test "$hardcode_minus_L" = yes; then 6904 + add_dir="-L$libdir" 6905 + add="-l$name" 6906 + elif test "$hardcode_shlibpath_var" = yes; then 6907 + case :$finalize_shlibpath: in 6908 + *":$libdir:"*) ;; 6909 + *) func_append finalize_shlibpath "$libdir:" ;; 6910 + esac 6911 + add="-l$name" 6912 + elif test "$hardcode_automatic" = yes; then 6913 + if test -n "$inst_prefix_dir" && 6914 + test -f "$inst_prefix_dir$libdir/$linklib" ; then 6915 + add="$inst_prefix_dir$libdir/$linklib" 6916 + else 6917 + add="$libdir/$linklib" 6918 + fi 6919 + else 6920 + # We cannot seem to hardcode it, guess we'll fake it. 6921 + add_dir="-L$libdir" 6922 + # Try looking first in the location we're being installed to. 6923 + if test -n "$inst_prefix_dir"; then 6924 + case $libdir in 6925 + [\\/]*) 6926 + func_append add_dir " -L$inst_prefix_dir$libdir" 6927 + ;; 6928 + esac 6929 + fi 6930 + add="-l$name" 6931 + fi 6932 + 6933 + if test "$linkmode" = prog; then 6934 + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" 6935 + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" 6936 + else 6937 + test -n "$add_dir" && deplibs="$add_dir $deplibs" 6938 + test -n "$add" && deplibs="$add $deplibs" 6939 + fi 6940 + fi 6941 + elif test "$linkmode" = prog; then 6942 + # Here we assume that one of hardcode_direct or hardcode_minus_L 6943 + # is not unsupported. This is valid on all known static and 6944 + # shared platforms. 6945 + if test "$hardcode_direct" != unsupported; then 6946 + test -n "$old_library" && linklib="$old_library" 6947 + compile_deplibs="$dir/$linklib $compile_deplibs" 6948 + finalize_deplibs="$dir/$linklib $finalize_deplibs" 6949 + else 6950 + compile_deplibs="-l$name -L$dir $compile_deplibs" 6951 + finalize_deplibs="-l$name -L$dir $finalize_deplibs" 6952 + fi 6953 + elif test "$build_libtool_libs" = yes; then 6954 + # Not a shared library 6955 + if test "$deplibs_check_method" != pass_all; then 6956 + # We're trying link a shared library against a static one 6957 + # but the system doesn't support it. 6958 + 6959 + # Just print a warning and add the library to dependency_libs so 6960 + # that the program can be linked against the static library. 6961 + echo 6962 + $ECHO "*** Warning: This system can not link to static lib archive $lib." 6963 + echo "*** I have the capability to make that library automatically link in when" 6964 + echo "*** you link to this library. But I can only do this if you have a" 6965 + echo "*** shared version of the library, which you do not appear to have." 6966 + if test "$module" = yes; then 6967 + echo "*** But as you try to build a module library, libtool will still create " 6968 + echo "*** a static module, that should work as long as the dlopening application" 6969 + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." 6970 + if test -z "$global_symbol_pipe"; then 6971 + echo 6972 + echo "*** However, this would only work if libtool was able to extract symbol" 6973 + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" 6974 + echo "*** not find such a program. So, this module is probably useless." 6975 + echo "*** \`nm' from GNU binutils and a full rebuild may help." 6976 + fi 6977 + if test "$build_old_libs" = no; then 6978 + build_libtool_libs=module 6979 + build_old_libs=yes 6980 + else 6981 + build_libtool_libs=no 6982 + fi 6983 + fi 6984 + else 6985 + deplibs="$dir/$old_library $deplibs" 6986 + link_static=yes 6987 + fi 6988 + fi # link shared/static library? 6989 + 6990 + if test "$linkmode" = lib; then 6991 + if test -n "$dependency_libs" && 6992 + { test "$hardcode_into_libs" != yes || 6993 + test "$build_old_libs" = yes || 6994 + test "$link_static" = yes; }; then 6995 + # Extract -R from dependency_libs 6996 + temp_deplibs= 6997 + for libdir in $dependency_libs; do 6998 + case $libdir in 6999 + -R*) func_stripname '-R' '' "$libdir" 7000 + temp_xrpath=$func_stripname_result 7001 + case " $xrpath " in 7002 + *" $temp_xrpath "*) ;; 7003 + *) func_append xrpath " $temp_xrpath";; 7004 + esac;; 7005 + *) func_append temp_deplibs " $libdir";; 7006 + esac 7007 + done 7008 + dependency_libs="$temp_deplibs" 7009 + fi 7010 + 7011 + func_append newlib_search_path " $absdir" 7012 + # Link against this library 7013 + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" 7014 + # ... and its dependency_libs 7015 + tmp_libs= 7016 + for deplib in $dependency_libs; do 7017 + newdependency_libs="$deplib $newdependency_libs" 7018 + case $deplib in 7019 + -L*) func_stripname '-L' '' "$deplib" 7020 + func_resolve_sysroot "$func_stripname_result";; 7021 + *) func_resolve_sysroot "$deplib" ;; 7022 + esac 7023 + if $opt_preserve_dup_deps ; then 7024 + case "$tmp_libs " in 7025 + *" $func_resolve_sysroot_result "*) 7026 + func_append specialdeplibs " $func_resolve_sysroot_result" ;; 7027 + esac 7028 + fi 7029 + func_append tmp_libs " $func_resolve_sysroot_result" 7030 + done 7031 + 7032 + if test "$link_all_deplibs" != no; then 7033 + # Add the search paths of all dependency libraries 7034 + for deplib in $dependency_libs; do 7035 + path= 7036 + case $deplib in 7037 + -L*) path="$deplib" ;; 7038 + *.la) 7039 + func_resolve_sysroot "$deplib" 7040 + deplib=$func_resolve_sysroot_result 7041 + func_dirname "$deplib" "" "." 7042 + dir=$func_dirname_result 7043 + # We need an absolute path. 7044 + case $dir in 7045 + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; 7046 + *) 7047 + absdir=`cd "$dir" && pwd` 7048 + if test -z "$absdir"; then 7049 + func_warning "cannot determine absolute directory name of \`$dir'" 7050 + absdir="$dir" 7051 + fi 7052 + ;; 7053 + esac 7054 + if $GREP "^installed=no" $deplib > /dev/null; then 7055 + case $host in 7056 + *-*-darwin*) 7057 + depdepl= 7058 + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` 7059 + if test -n "$deplibrary_names" ; then 7060 + for tmp in $deplibrary_names ; do 7061 + depdepl=$tmp 7062 + done 7063 + if test -f "$absdir/$objdir/$depdepl" ; then 7064 + depdepl="$absdir/$objdir/$depdepl" 7065 + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` 7066 + if test -z "$darwin_install_name"; then 7067 + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` 7068 + fi 7069 + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" 7070 + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" 7071 + path= 7072 + fi 7073 + fi 7074 + ;; 7075 + *) 7076 + path="-L$absdir/$objdir" 7077 + ;; 7078 + esac 7079 + else 7080 + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` 7081 + test -z "$libdir" && \ 7082 + func_fatal_error "\`$deplib' is not a valid libtool archive" 7083 + test "$absdir" != "$libdir" && \ 7084 + func_warning "\`$deplib' seems to be moved" 7085 + 7086 + path="-L$absdir" 7087 + fi 7088 + ;; 7089 + esac 7090 + case " $deplibs " in 7091 + *" $path "*) ;; 7092 + *) deplibs="$path $deplibs" ;; 7093 + esac 7094 + done 7095 + fi # link_all_deplibs != no 7096 + fi # linkmode = lib 7097 + done # for deplib in $libs 7098 + if test "$pass" = link; then 7099 + if test "$linkmode" = "prog"; then 7100 + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" 7101 + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" 7102 + else 7103 + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 7104 + fi 7105 + fi 7106 + dependency_libs="$newdependency_libs" 7107 + if test "$pass" = dlpreopen; then 7108 + # Link the dlpreopened libraries before other libraries 7109 + for deplib in $save_deplibs; do 7110 + deplibs="$deplib $deplibs" 7111 + done 7112 + fi 7113 + if test "$pass" != dlopen; then 7114 + if test "$pass" != conv; then 7115 + # Make sure lib_search_path contains only unique directories. 7116 + lib_search_path= 7117 + for dir in $newlib_search_path; do 7118 + case "$lib_search_path " in 7119 + *" $dir "*) ;; 7120 + *) func_append lib_search_path " $dir" ;; 7121 + esac 7122 + done 7123 + newlib_search_path= 7124 + fi 7125 + 7126 + if test "$linkmode,$pass" != "prog,link"; then 7127 + vars="deplibs" 7128 + else 7129 + vars="compile_deplibs finalize_deplibs" 7130 + fi 7131 + for var in $vars dependency_libs; do 7132 + # Add libraries to $var in reverse order 7133 + eval tmp_libs=\"\$$var\" 7134 + new_libs= 7135 + for deplib in $tmp_libs; do 7136 + # FIXME: Pedantically, this is the right thing to do, so 7137 + # that some nasty dependency loop isn't accidentally 7138 + # broken: 7139 + #new_libs="$deplib $new_libs" 7140 + # Pragmatically, this seems to cause very few problems in 7141 + # practice: 7142 + case $deplib in 7143 + -L*) new_libs="$deplib $new_libs" ;; 7144 + -R*) ;; 7145 + *) 7146 + # And here is the reason: when a library appears more 7147 + # than once as an explicit dependence of a library, or 7148 + # is implicitly linked in more than once by the 7149 + # compiler, it is considered special, and multiple 7150 + # occurrences thereof are not removed. Compare this 7151 + # with having the same library being listed as a 7152 + # dependency of multiple other libraries: in this case, 7153 + # we know (pedantically, we assume) the library does not 7154 + # need to be listed more than once, so we keep only the 7155 + # last copy. This is not always right, but it is rare 7156 + # enough that we require users that really mean to play 7157 + # such unportable linking tricks to link the library 7158 + # using -Wl,-lname, so that libtool does not consider it 7159 + # for duplicate removal. 7160 + case " $specialdeplibs " in 7161 + *" $deplib "*) new_libs="$deplib $new_libs" ;; 7162 + *) 7163 + case " $new_libs " in 7164 + *" $deplib "*) ;; 7165 + *) new_libs="$deplib $new_libs" ;; 7166 + esac 7167 + ;; 7168 + esac 7169 + ;; 7170 + esac 7171 + done 7172 + tmp_libs= 7173 + for deplib in $new_libs; do 7174 + case $deplib in 7175 + -L*) 7176 + case " $tmp_libs " in 7177 + *" $deplib "*) ;; 7178 + *) func_append tmp_libs " $deplib" ;; 7179 + esac 7180 + ;; 7181 + *) func_append tmp_libs " $deplib" ;; 7182 + esac 7183 + done 7184 + eval $var=\"$tmp_libs\" 7185 + done # for var 7186 + fi 7187 + # Last step: remove runtime libs from dependency_libs 7188 + # (they stay in deplibs) 7189 + tmp_libs= 7190 + for i in $dependency_libs ; do 7191 + case " $predeps $postdeps $compiler_lib_search_path " in 7192 + *" $i "*) 7193 + i="" 7194 + ;; 7195 + esac 7196 + if test -n "$i" ; then 7197 + func_append tmp_libs " $i" 7198 + fi 7199 + done 7200 + dependency_libs=$tmp_libs 7201 + done # for pass 7202 + if test "$linkmode" = prog; then 7203 + dlfiles="$newdlfiles" 7204 + fi 7205 + if test "$linkmode" = prog || test "$linkmode" = lib; then 7206 + dlprefiles="$newdlprefiles" 7207 + fi 7208 + 7209 + case $linkmode in 7210 + oldlib) 7211 + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then 7212 + func_warning "\`-dlopen' is ignored for archives" 7213 + fi 7214 + 7215 + case " $deplibs" in 7216 + *\ -l* | *\ -L*) 7217 + func_warning "\`-l' and \`-L' are ignored for archives" ;; 7218 + esac 7219 + 7220 + test -n "$rpath" && \ 7221 + func_warning "\`-rpath' is ignored for archives" 7222 + 7223 + test -n "$xrpath" && \ 7224 + func_warning "\`-R' is ignored for archives" 7225 + 7226 + test -n "$vinfo" && \ 7227 + func_warning "\`-version-info/-version-number' is ignored for archives" 7228 + 7229 + test -n "$release" && \ 7230 + func_warning "\`-release' is ignored for archives" 7231 + 7232 + test -n "$export_symbols$export_symbols_regex" && \ 7233 + func_warning "\`-export-symbols' is ignored for archives" 7234 + 7235 + # Now set the variables for building old libraries. 7236 + build_libtool_libs=no 7237 + oldlibs="$output" 7238 + func_append objs "$old_deplibs" 7239 + ;; 7240 + 7241 + lib) 7242 + # Make sure we only generate libraries of the form `libNAME.la'. 7243 + case $outputname in 7244 + lib*) 7245 + func_stripname 'lib' '.la' "$outputname" 7246 + name=$func_stripname_result 7247 + eval shared_ext=\"$shrext_cmds\" 7248 + eval libname=\"$libname_spec\" 7249 + ;; 7250 + *) 7251 + test "$module" = no && \ 7252 + func_fatal_help "libtool library \`$output' must begin with \`lib'" 7253 + 7254 + if test "$need_lib_prefix" != no; then 7255 + # Add the "lib" prefix for modules if required 7256 + func_stripname '' '.la' "$outputname" 7257 + name=$func_stripname_result 7258 + eval shared_ext=\"$shrext_cmds\" 7259 + eval libname=\"$libname_spec\" 7260 + else 7261 + func_stripname '' '.la' "$outputname" 7262 + libname=$func_stripname_result 7263 + fi 7264 + ;; 7265 + esac 7266 + 7267 + if test -n "$objs"; then 7268 + if test "$deplibs_check_method" != pass_all; then 7269 + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 7270 + else 7271 + echo 7272 + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" 7273 + $ECHO "*** objects $objs is not portable!" 7274 + func_append libobjs " $objs" 7275 + fi 7276 + fi 7277 + 7278 + test "$dlself" != no && \ 7279 + func_warning "\`-dlopen self' is ignored for libtool libraries" 7280 + 7281 + set dummy $rpath 7282 + shift 7283 + test "$#" -gt 1 && \ 7284 + func_warning "ignoring multiple \`-rpath's for a libtool library" 7285 + 7286 + install_libdir="$1" 7287 + 7288 + oldlibs= 7289 + if test -z "$rpath"; then 7290 + if test "$build_libtool_libs" = yes; then 7291 + # Building a libtool convenience library. 7292 + # Some compilers have problems with a `.al' extension so 7293 + # convenience libraries should have the same extension an 7294 + # archive normally would. 7295 + oldlibs="$output_objdir/$libname.$libext $oldlibs" 7296 + build_libtool_libs=convenience 7297 + build_old_libs=yes 7298 + fi 7299 + 7300 + test -n "$vinfo" && \ 7301 + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" 7302 + 7303 + test -n "$release" && \ 7304 + func_warning "\`-release' is ignored for convenience libraries" 7305 + else 7306 + 7307 + # Parse the version information argument. 7308 + save_ifs="$IFS"; IFS=':' 7309 + set dummy $vinfo 0 0 0 7310 + shift 7311 + IFS="$save_ifs" 7312 + 7313 + test -n "$7" && \ 7314 + func_fatal_help "too many parameters to \`-version-info'" 7315 + 7316 + # convert absolute version numbers to libtool ages 7317 + # this retains compatibility with .la files and attempts 7318 + # to make the code below a bit more comprehensible 7319 + 7320 + case $vinfo_number in 7321 + yes) 7322 + number_major="$1" 7323 + number_minor="$2" 7324 + number_revision="$3" 7325 + # 7326 + # There are really only two kinds -- those that 7327 + # use the current revision as the major version 7328 + # and those that subtract age and use age as 7329 + # a minor version. But, then there is irix 7330 + # which has an extra 1 added just for fun 7331 + # 7332 + case $version_type in 7333 + # correct linux to gnu/linux during the next big refactor 7334 + darwin|linux|osf|windows|none) 7335 + func_arith $number_major + $number_minor 7336 + current=$func_arith_result 7337 + age="$number_minor" 7338 + revision="$number_revision" 7339 + ;; 7340 + freebsd-aout|freebsd-elf|qnx|sunos) 7341 + current="$number_major" 7342 + revision="$number_minor" 7343 + age="0" 7344 + ;; 7345 + irix|nonstopux) 7346 + func_arith $number_major + $number_minor 7347 + current=$func_arith_result 7348 + age="$number_minor" 7349 + revision="$number_minor" 7350 + lt_irix_increment=no 7351 + ;; 7352 + esac 7353 + ;; 7354 + no) 7355 + current="$1" 7356 + revision="$2" 7357 + age="$3" 7358 + ;; 7359 + esac 7360 + 7361 + # Check that each of the things are valid numbers. 7362 + case $current in 7363 + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; 7364 + *) 7365 + func_error "CURRENT \`$current' must be a nonnegative integer" 7366 + func_fatal_error "\`$vinfo' is not valid version information" 7367 + ;; 7368 + esac 7369 + 7370 + case $revision in 7371 + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; 7372 + *) 7373 + func_error "REVISION \`$revision' must be a nonnegative integer" 7374 + func_fatal_error "\`$vinfo' is not valid version information" 7375 + ;; 7376 + esac 7377 + 7378 + case $age in 7379 + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; 7380 + *) 7381 + func_error "AGE \`$age' must be a nonnegative integer" 7382 + func_fatal_error "\`$vinfo' is not valid version information" 7383 + ;; 7384 + esac 7385 + 7386 + if test "$age" -gt "$current"; then 7387 + func_error "AGE \`$age' is greater than the current interface number \`$current'" 7388 + func_fatal_error "\`$vinfo' is not valid version information" 7389 + fi 7390 + 7391 + # Calculate the version variables. 7392 + major= 7393 + versuffix= 7394 + verstring= 7395 + case $version_type in 7396 + none) ;; 7397 + 7398 + darwin) 7399 + # Like Linux, but with the current version available in 7400 + # verstring for coding it into the library header 7401 + func_arith $current - $age 7402 + major=.$func_arith_result 7403 + versuffix="$major.$age.$revision" 7404 + # Darwin ld doesn't like 0 for these options... 7405 + func_arith $current + 1 7406 + minor_current=$func_arith_result 7407 + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" 7408 + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" 7409 + ;; 7410 + 7411 + freebsd-aout) 7412 + major=".$current" 7413 + versuffix=".$current.$revision"; 7414 + ;; 7415 + 7416 + freebsd-elf) 7417 + major=".$current" 7418 + versuffix=".$current" 7419 + ;; 7420 + 7421 + irix | nonstopux) 7422 + if test "X$lt_irix_increment" = "Xno"; then 7423 + func_arith $current - $age 7424 + else 7425 + func_arith $current - $age + 1 7426 + fi 7427 + major=$func_arith_result 7428 + 7429 + case $version_type in 7430 + nonstopux) verstring_prefix=nonstopux ;; 7431 + *) verstring_prefix=sgi ;; 7432 + esac 7433 + verstring="$verstring_prefix$major.$revision" 7434 + 7435 + # Add in all the interfaces that we are compatible with. 7436 + loop=$revision 7437 + while test "$loop" -ne 0; do 7438 + func_arith $revision - $loop 7439 + iface=$func_arith_result 7440 + func_arith $loop - 1 7441 + loop=$func_arith_result 7442 + verstring="$verstring_prefix$major.$iface:$verstring" 7443 + done 7444 + 7445 + # Before this point, $major must not contain `.'. 7446 + major=.$major 7447 + versuffix="$major.$revision" 7448 + ;; 7449 + 7450 + linux) # correct to gnu/linux during the next big refactor 7451 + func_arith $current - $age 7452 + major=.$func_arith_result 7453 + versuffix="$major.$age.$revision" 7454 + ;; 7455 + 7456 + osf) 7457 + func_arith $current - $age 7458 + major=.$func_arith_result 7459 + versuffix=".$current.$age.$revision" 7460 + verstring="$current.$age.$revision" 7461 + 7462 + # Add in all the interfaces that we are compatible with. 7463 + loop=$age 7464 + while test "$loop" -ne 0; do 7465 + func_arith $current - $loop 7466 + iface=$func_arith_result 7467 + func_arith $loop - 1 7468 + loop=$func_arith_result 7469 + verstring="$verstring:${iface}.0" 7470 + done 7471 + 7472 + # Make executables depend on our current version. 7473 + func_append verstring ":${current}.0" 7474 + ;; 7475 + 7476 + qnx) 7477 + major=".$current" 7478 + versuffix=".$current" 7479 + ;; 7480 + 7481 + sunos) 7482 + major=".$current" 7483 + versuffix=".$current.$revision" 7484 + ;; 7485 + 7486 + windows) 7487 + # Use '-' rather than '.', since we only want one 7488 + # extension on DOS 8.3 filesystems. 7489 + func_arith $current - $age 7490 + major=$func_arith_result 7491 + versuffix="-$major" 7492 + ;; 7493 + 7494 + *) 7495 + func_fatal_configuration "unknown library version type \`$version_type'" 7496 + ;; 7497 + esac 7498 + 7499 + # Clear the version info if we defaulted, and they specified a release. 7500 + if test -z "$vinfo" && test -n "$release"; then 7501 + major= 7502 + case $version_type in 7503 + darwin) 7504 + # we can't check for "0.0" in archive_cmds due to quoting 7505 + # problems, so we reset it completely 7506 + verstring= 7507 + ;; 7508 + *) 7509 + verstring="0.0" 7510 + ;; 7511 + esac 7512 + if test "$need_version" = no; then 7513 + versuffix= 7514 + else 7515 + versuffix=".0.0" 7516 + fi 7517 + fi 7518 + 7519 + # Remove version info from name if versioning should be avoided 7520 + if test "$avoid_version" = yes && test "$need_version" = no; then 7521 + major= 7522 + versuffix= 7523 + verstring="" 7524 + fi 7525 + 7526 + # Check to see if the archive will have undefined symbols. 7527 + if test "$allow_undefined" = yes; then 7528 + if test "$allow_undefined_flag" = unsupported; then 7529 + func_warning "undefined symbols not allowed in $host shared libraries" 7530 + build_libtool_libs=no 7531 + build_old_libs=yes 7532 + fi 7533 + else 7534 + # Don't allow undefined symbols. 7535 + allow_undefined_flag="$no_undefined_flag" 7536 + fi 7537 + 7538 + fi 7539 + 7540 + func_generate_dlsyms "$libname" "$libname" "yes" 7541 + func_append libobjs " $symfileobj" 7542 + test "X$libobjs" = "X " && libobjs= 7543 + 7544 + if test "$opt_mode" != relink; then 7545 + # Remove our outputs, but don't remove object files since they 7546 + # may have been created when compiling PIC objects. 7547 + removelist= 7548 + tempremovelist=`$ECHO "$output_objdir/*"` 7549 + for p in $tempremovelist; do 7550 + case $p in 7551 + *.$objext | *.gcno) 7552 + ;; 7553 + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) 7554 + if test "X$precious_files_regex" != "X"; then 7555 + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 7556 + then 7557 + continue 7558 + fi 7559 + fi 7560 + func_append removelist " $p" 7561 + ;; 7562 + *) ;; 7563 + esac 7564 + done 7565 + test -n "$removelist" && \ 7566 + func_show_eval "${RM}r \$removelist" 7567 + fi 7568 + 7569 + # Now set the variables for building old libraries. 7570 + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then 7571 + func_append oldlibs " $output_objdir/$libname.$libext" 7572 + 7573 + # Transform .lo files to .o files. 7574 + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` 7575 + fi 7576 + 7577 + # Eliminate all temporary directories. 7578 + #for path in $notinst_path; do 7579 + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` 7580 + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` 7581 + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` 7582 + #done 7583 + 7584 + if test -n "$xrpath"; then 7585 + # If the user specified any rpath flags, then add them. 7586 + temp_xrpath= 7587 + for libdir in $xrpath; do 7588 + func_replace_sysroot "$libdir" 7589 + func_append temp_xrpath " -R$func_replace_sysroot_result" 7590 + case "$finalize_rpath " in 7591 + *" $libdir "*) ;; 7592 + *) func_append finalize_rpath " $libdir" ;; 7593 + esac 7594 + done 7595 + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then 7596 + dependency_libs="$temp_xrpath $dependency_libs" 7597 + fi 7598 + fi 7599 + 7600 + # Make sure dlfiles contains only unique files that won't be dlpreopened 7601 + old_dlfiles="$dlfiles" 7602 + dlfiles= 7603 + for lib in $old_dlfiles; do 7604 + case " $dlprefiles $dlfiles " in 7605 + *" $lib "*) ;; 7606 + *) func_append dlfiles " $lib" ;; 7607 + esac 7608 + done 7609 + 7610 + # Make sure dlprefiles contains only unique files 7611 + old_dlprefiles="$dlprefiles" 7612 + dlprefiles= 7613 + for lib in $old_dlprefiles; do 7614 + case "$dlprefiles " in 7615 + *" $lib "*) ;; 7616 + *) func_append dlprefiles " $lib" ;; 7617 + esac 7618 + done 7619 + 7620 + if test "$build_libtool_libs" = yes; then 7621 + if test -n "$rpath"; then 7622 + case $host in 7623 + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) 7624 + # these systems don't actually have a c library (as such)! 7625 + ;; 7626 + *-*-rhapsody* | *-*-darwin1.[012]) 7627 + # Rhapsody C library is in the System framework 7628 + func_append deplibs " System.ltframework" 7629 + ;; 7630 + *-*-netbsd*) 7631 + # Don't link with libc until the a.out ld.so is fixed. 7632 + ;; 7633 + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) 7634 + # Do not include libc due to us having libc/libc_r. 7635 + ;; 7636 + *-*-sco3.2v5* | *-*-sco5v6*) 7637 + # Causes problems with __ctype 7638 + ;; 7639 + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) 7640 + # Compiler inserts libc in the correct place for threads to work 7641 + ;; 7642 + *) 7643 + # Add libc to deplibs on all other systems if necessary. 7644 + if test "$build_libtool_need_lc" = "yes"; then 7645 + func_append deplibs " -lc" 7646 + fi 7647 + ;; 7648 + esac 7649 + fi 7650 + 7651 + # Transform deplibs into only deplibs that can be linked in shared. 7652 + name_save=$name 7653 + libname_save=$libname 7654 + release_save=$release 7655 + versuffix_save=$versuffix 7656 + major_save=$major 7657 + # I'm not sure if I'm treating the release correctly. I think 7658 + # release should show up in the -l (ie -lgmp5) so we don't want to 7659 + # add it in twice. Is that correct? 7660 + release="" 7661 + versuffix="" 7662 + major="" 7663 + newdeplibs= 7664 + droppeddeps=no 7665 + case $deplibs_check_method in 7666 + pass_all) 7667 + # Don't check for shared/static. Everything works. 7668 + # This might be a little naive. We might want to check 7669 + # whether the library exists or not. But this is on 7670 + # osf3 & osf4 and I'm not really sure... Just 7671 + # implementing what was already the behavior. 7672 + newdeplibs=$deplibs 7673 + ;; 7674 + test_compile) 7675 + # This code stresses the "libraries are programs" paradigm to its 7676 + # limits. Maybe even breaks it. We compile a program, linking it 7677 + # against the deplibs as a proxy for the library. Then we can check 7678 + # whether they linked in statically or dynamically with ldd. 7679 + $opt_dry_run || $RM conftest.c 7680 + cat > conftest.c <<EOF 7681 + int main() { return 0; } 7682 +EOF 7683 + $opt_dry_run || $RM conftest 7684 + if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then 7685 + ldd_output=`ldd conftest` 7686 + for i in $deplibs; do 7687 + case $i in 7688 + -l*) 7689 + func_stripname -l '' "$i" 7690 + name=$func_stripname_result 7691 + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then 7692 + case " $predeps $postdeps " in 7693 + *" $i "*) 7694 + func_append newdeplibs " $i" 7695 + i="" 7696 + ;; 7697 + esac 7698 + fi 7699 + if test -n "$i" ; then 7700 + libname=`eval "\\$ECHO \"$libname_spec\""` 7701 + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` 7702 + set dummy $deplib_matches; shift 7703 + deplib_match=$1 7704 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then 7705 + func_append newdeplibs " $i" 7706 + else 7707 + droppeddeps=yes 7708 + echo 7709 + $ECHO "*** Warning: dynamic linker does not accept needed library $i." 7710 + echo "*** I have the capability to make that library automatically link in when" 7711 + echo "*** you link to this library. But I can only do this if you have a" 7712 + echo "*** shared version of the library, which I believe you do not have" 7713 + echo "*** because a test_compile did reveal that the linker did not use it for" 7714 + echo "*** its dynamic dependency list that programs get resolved with at runtime." 7715 + fi 7716 + fi 7717 + ;; 7718 + *) 7719 + func_append newdeplibs " $i" 7720 + ;; 7721 + esac 7722 + done 7723 + else 7724 + # Error occurred in the first compile. Let's try to salvage 7725 + # the situation: Compile a separate program for each library. 7726 + for i in $deplibs; do 7727 + case $i in 7728 + -l*) 7729 + func_stripname -l '' "$i" 7730 + name=$func_stripname_result 7731 + $opt_dry_run || $RM conftest 7732 + if $LTCC $LTCFLAGS -o conftest conftest.c $i; then 7733 + ldd_output=`ldd conftest` 7734 + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then 7735 + case " $predeps $postdeps " in 7736 + *" $i "*) 7737 + func_append newdeplibs " $i" 7738 + i="" 7739 + ;; 7740 + esac 7741 + fi 7742 + if test -n "$i" ; then 7743 + libname=`eval "\\$ECHO \"$libname_spec\""` 7744 + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` 7745 + set dummy $deplib_matches; shift 7746 + deplib_match=$1 7747 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then 7748 + func_append newdeplibs " $i" 7749 + else 7750 + droppeddeps=yes 7751 + echo 7752 + $ECHO "*** Warning: dynamic linker does not accept needed library $i." 7753 + echo "*** I have the capability to make that library automatically link in when" 7754 + echo "*** you link to this library. But I can only do this if you have a" 7755 + echo "*** shared version of the library, which you do not appear to have" 7756 + echo "*** because a test_compile did reveal that the linker did not use this one" 7757 + echo "*** as a dynamic dependency that programs can get resolved with at runtime." 7758 + fi 7759 + fi 7760 + else 7761 + droppeddeps=yes 7762 + echo 7763 + $ECHO "*** Warning! Library $i is needed by this library but I was not able to" 7764 + echo "*** make it link in! You will probably need to install it or some" 7765 + echo "*** library that it depends on before this library will be fully" 7766 + echo "*** functional. Installing it before continuing would be even better." 7767 + fi 7768 + ;; 7769 + *) 7770 + func_append newdeplibs " $i" 7771 + ;; 7772 + esac 7773 + done 7774 + fi 7775 + ;; 7776 + file_magic*) 7777 + set dummy $deplibs_check_method; shift 7778 + file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` 7779 + for a_deplib in $deplibs; do 7780 + case $a_deplib in 7781 + -l*) 7782 + func_stripname -l '' "$a_deplib" 7783 + name=$func_stripname_result 7784 + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then 7785 + case " $predeps $postdeps " in 7786 + *" $a_deplib "*) 7787 + func_append newdeplibs " $a_deplib" 7788 + a_deplib="" 7789 + ;; 7790 + esac 7791 + fi 7792 + if test -n "$a_deplib" ; then 7793 + libname=`eval "\\$ECHO \"$libname_spec\""` 7794 + if test -n "$file_magic_glob"; then 7795 + libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` 7796 + else 7797 + libnameglob=$libname 7798 + fi 7799 + test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob` 7800 + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do 7801 + if test "$want_nocaseglob" = yes; then 7802 + shopt -s nocaseglob 7803 + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` 7804 + $nocaseglob 7805 + else 7806 + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` 7807 + fi 7808 + for potent_lib in $potential_libs; do 7809 + # Follow soft links. 7810 + if ls -lLd "$potent_lib" 2>/dev/null | 7811 + $GREP " -> " >/dev/null; then 7812 + continue 7813 + fi 7814 + # The statement above tries to avoid entering an 7815 + # endless loop below, in case of cyclic links. 7816 + # We might still enter an endless loop, since a link 7817 + # loop can be closed while we follow links, 7818 + # but so what? 7819 + potlib="$potent_lib" 7820 + while test -h "$potlib" 2>/dev/null; do 7821 + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` 7822 + case $potliblink in 7823 + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; 7824 + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; 7825 + esac 7826 + done 7827 + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | 7828 + $SED -e 10q | 7829 + $EGREP "$file_magic_regex" > /dev/null; then 7830 + func_append newdeplibs " $a_deplib" 7831 + a_deplib="" 7832 + break 2 7833 + fi 7834 + done 7835 + done 7836 + fi 7837 + if test -n "$a_deplib" ; then 7838 + droppeddeps=yes 7839 + echo 7840 + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." 7841 + echo "*** I have the capability to make that library automatically link in when" 7842 + echo "*** you link to this library. But I can only do this if you have a" 7843 + echo "*** shared version of the library, which you do not appear to have" 7844 + echo "*** because I did check the linker path looking for a file starting" 7845 + if test -z "$potlib" ; then 7846 + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" 7847 + else 7848 + $ECHO "*** with $libname and none of the candidates passed a file format test" 7849 + $ECHO "*** using a file magic. Last file checked: $potlib" 7850 + fi 7851 + fi 7852 + ;; 7853 + *) 7854 + # Add a -L argument. 7855 + func_append newdeplibs " $a_deplib" 7856 + ;; 7857 + esac 7858 + done # Gone through all deplibs. 7859 + ;; 7860 + match_pattern*) 7861 + set dummy $deplibs_check_method; shift 7862 + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` 7863 + for a_deplib in $deplibs; do 7864 + case $a_deplib in 7865 + -l*) 7866 + func_stripname -l '' "$a_deplib" 7867 + name=$func_stripname_result 7868 + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then 7869 + case " $predeps $postdeps " in 7870 + *" $a_deplib "*) 7871 + func_append newdeplibs " $a_deplib" 7872 + a_deplib="" 7873 + ;; 7874 + esac 7875 + fi 7876 + if test -n "$a_deplib" ; then 7877 + libname=`eval "\\$ECHO \"$libname_spec\""` 7878 + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do 7879 + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` 7880 + for potent_lib in $potential_libs; do 7881 + potlib="$potent_lib" # see symlink-check above in file_magic test 7882 + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ 7883 + $EGREP "$match_pattern_regex" > /dev/null; then 7884 + func_append newdeplibs " $a_deplib" 7885 + a_deplib="" 7886 + break 2 7887 + fi 7888 + done 7889 + done 7890 + fi 7891 + if test -n "$a_deplib" ; then 7892 + droppeddeps=yes 7893 + echo 7894 + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." 7895 + echo "*** I have the capability to make that library automatically link in when" 7896 + echo "*** you link to this library. But I can only do this if you have a" 7897 + echo "*** shared version of the library, which you do not appear to have" 7898 + echo "*** because I did check the linker path looking for a file starting" 7899 + if test -z "$potlib" ; then 7900 + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" 7901 + else 7902 + $ECHO "*** with $libname and none of the candidates passed a file format test" 7903 + $ECHO "*** using a regex pattern. Last file checked: $potlib" 7904 + fi 7905 + fi 7906 + ;; 7907 + *) 7908 + # Add a -L argument. 7909 + func_append newdeplibs " $a_deplib" 7910 + ;; 7911 + esac 7912 + done # Gone through all deplibs. 7913 + ;; 7914 + none | unknown | *) 7915 + newdeplibs="" 7916 + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` 7917 + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then 7918 + for i in $predeps $postdeps ; do 7919 + # can't use Xsed below, because $i might contain '/' 7920 + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` 7921 + done 7922 + fi 7923 + case $tmp_deplibs in 7924 + *[!\ \ ]*) 7925 + echo 7926 + if test "X$deplibs_check_method" = "Xnone"; then 7927 + echo "*** Warning: inter-library dependencies are not supported in this platform." 7928 + else 7929 + echo "*** Warning: inter-library dependencies are not known to be supported." 7930 + fi 7931 + echo "*** All declared inter-library dependencies are being dropped." 7932 + droppeddeps=yes 7933 + ;; 7934 + esac 7935 + ;; 7936 + esac 7937 + versuffix=$versuffix_save 7938 + major=$major_save 7939 + release=$release_save 7940 + libname=$libname_save 7941 + name=$name_save 7942 + 7943 + case $host in 7944 + *-*-rhapsody* | *-*-darwin1.[012]) 7945 + # On Rhapsody replace the C library with the System framework 7946 + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` 7947 + ;; 7948 + esac 7949 + 7950 + if test "$droppeddeps" = yes; then 7951 + if test "$module" = yes; then 7952 + echo 7953 + echo "*** Warning: libtool could not satisfy all declared inter-library" 7954 + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" 7955 + echo "*** a static module, that should work as long as the dlopening" 7956 + echo "*** application is linked with the -dlopen flag." 7957 + if test -z "$global_symbol_pipe"; then 7958 + echo 7959 + echo "*** However, this would only work if libtool was able to extract symbol" 7960 + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" 7961 + echo "*** not find such a program. So, this module is probably useless." 7962 + echo "*** \`nm' from GNU binutils and a full rebuild may help." 7963 + fi 7964 + if test "$build_old_libs" = no; then 7965 + oldlibs="$output_objdir/$libname.$libext" 7966 + build_libtool_libs=module 7967 + build_old_libs=yes 7968 + else 7969 + build_libtool_libs=no 7970 + fi 7971 + else 7972 + echo "*** The inter-library dependencies that have been dropped here will be" 7973 + echo "*** automatically added whenever a program is linked with this library" 7974 + echo "*** or is declared to -dlopen it." 7975 + 7976 + if test "$allow_undefined" = no; then 7977 + echo 7978 + echo "*** Since this library must not contain undefined symbols," 7979 + echo "*** because either the platform does not support them or" 7980 + echo "*** it was explicitly requested with -no-undefined," 7981 + echo "*** libtool will only create a static version of it." 7982 + if test "$build_old_libs" = no; then 7983 + oldlibs="$output_objdir/$libname.$libext" 7984 + build_libtool_libs=module 7985 + build_old_libs=yes 7986 + else 7987 + build_libtool_libs=no 7988 + fi 7989 + fi 7990 + fi 7991 + fi 7992 + # Done checking deplibs! 7993 + deplibs=$newdeplibs 7994 + fi 7995 + # Time to change all our "foo.ltframework" stuff back to "-framework foo" 7996 + case $host in 7997 + *-*-darwin*) 7998 + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 7999 + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 8000 + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 8001 + ;; 8002 + esac 8003 + 8004 + # move library search paths that coincide with paths to not yet 8005 + # installed libraries to the beginning of the library search list 8006 + new_libs= 8007 + for path in $notinst_path; do 8008 + case " $new_libs " in 8009 + *" -L$path/$objdir "*) ;; 8010 + *) 8011 + case " $deplibs " in 8012 + *" -L$path/$objdir "*) 8013 + func_append new_libs " -L$path/$objdir" ;; 8014 + esac 8015 + ;; 8016 + esac 8017 + done 8018 + for deplib in $deplibs; do 8019 + case $deplib in 8020 + -L*) 8021 + case " $new_libs " in 8022 + *" $deplib "*) ;; 8023 + *) func_append new_libs " $deplib" ;; 8024 + esac 8025 + ;; 8026 + *) func_append new_libs " $deplib" ;; 8027 + esac 8028 + done 8029 + deplibs="$new_libs" 8030 + 8031 + # All the library-specific variables (install_libdir is set above). 8032 + library_names= 8033 + old_library= 8034 + dlname= 8035 + 8036 + # Test again, we may have decided not to build it any more 8037 + if test "$build_libtool_libs" = yes; then 8038 + # Remove ${wl} instances when linking with ld. 8039 + # FIXME: should test the right _cmds variable. 8040 + case $archive_cmds in 8041 + *\$LD\ *) wl= ;; 8042 + esac 8043 + if test "$hardcode_into_libs" = yes; then 8044 + # Hardcode the library paths 8045 + hardcode_libdirs= 8046 + dep_rpath= 8047 + rpath="$finalize_rpath" 8048 + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" 8049 + for libdir in $rpath; do 8050 + if test -n "$hardcode_libdir_flag_spec"; then 8051 + if test -n "$hardcode_libdir_separator"; then 8052 + func_replace_sysroot "$libdir" 8053 + libdir=$func_replace_sysroot_result 8054 + if test -z "$hardcode_libdirs"; then 8055 + hardcode_libdirs="$libdir" 8056 + else 8057 + # Just accumulate the unique libdirs. 8058 + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in 8059 + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) 8060 + ;; 8061 + *) 8062 + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" 8063 + ;; 8064 + esac 8065 + fi 8066 + else 8067 + eval flag=\"$hardcode_libdir_flag_spec\" 8068 + func_append dep_rpath " $flag" 8069 + fi 8070 + elif test -n "$runpath_var"; then 8071 + case "$perm_rpath " in 8072 + *" $libdir "*) ;; 8073 + *) func_append perm_rpath " $libdir" ;; 8074 + esac 8075 + fi 8076 + done 8077 + # Substitute the hardcoded libdirs into the rpath. 8078 + if test -n "$hardcode_libdir_separator" && 8079 + test -n "$hardcode_libdirs"; then 8080 + libdir="$hardcode_libdirs" 8081 + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" 8082 + fi 8083 + if test -n "$runpath_var" && test -n "$perm_rpath"; then 8084 + # We should set the runpath_var. 8085 + rpath= 8086 + for dir in $perm_rpath; do 8087 + func_append rpath "$dir:" 8088 + done 8089 + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" 8090 + fi 8091 + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" 8092 + fi 8093 + 8094 + shlibpath="$finalize_shlibpath" 8095 + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" 8096 + if test -n "$shlibpath"; then 8097 + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" 8098 + fi 8099 + 8100 + # Get the real and link names of the library. 8101 + eval shared_ext=\"$shrext_cmds\" 8102 + eval library_names=\"$library_names_spec\" 8103 + set dummy $library_names 8104 + shift 8105 + realname="$1" 8106 + shift 8107 + 8108 + if test -n "$soname_spec"; then 8109 + eval soname=\"$soname_spec\" 8110 + else 8111 + soname="$realname" 8112 + fi 8113 + if test -z "$dlname"; then 8114 + dlname=$soname 8115 + fi 8116 + 8117 + lib="$output_objdir/$realname" 8118 + linknames= 8119 + for link 8120 + do 8121 + func_append linknames " $link" 8122 + done 8123 + 8124 + # Use standard objects if they are pic 8125 + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` 8126 + test "X$libobjs" = "X " && libobjs= 8127 + 8128 + delfiles= 8129 + if test -n "$export_symbols" && test -n "$include_expsyms"; then 8130 + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" 8131 + export_symbols="$output_objdir/$libname.uexp" 8132 + func_append delfiles " $export_symbols" 8133 + fi 8134 + 8135 + orig_export_symbols= 8136 + case $host_os in 8137 + cygwin* | mingw* | cegcc*) 8138 + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then 8139 + # exporting using user supplied symfile 8140 + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then 8141 + # and it's NOT already a .def file. Must figure out 8142 + # which of the given symbols are data symbols and tag 8143 + # them as such. So, trigger use of export_symbols_cmds. 8144 + # export_symbols gets reassigned inside the "prepare 8145 + # the list of exported symbols" if statement, so the 8146 + # include_expsyms logic still works. 8147 + orig_export_symbols="$export_symbols" 8148 + export_symbols= 8149 + always_export_symbols=yes 8150 + fi 8151 + fi 8152 + ;; 8153 + esac 8154 + 8155 + # Prepare the list of exported symbols 8156 + if test -z "$export_symbols"; then 8157 + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then 8158 + func_verbose "generating symbol list for \`$libname.la'" 8159 + export_symbols="$output_objdir/$libname.exp" 8160 + $opt_dry_run || $RM $export_symbols 8161 + cmds=$export_symbols_cmds 8162 + save_ifs="$IFS"; IFS='~' 8163 + for cmd1 in $cmds; do 8164 + IFS="$save_ifs" 8165 + # Take the normal branch if the nm_file_list_spec branch 8166 + # doesn't work or if tool conversion is not needed. 8167 + case $nm_file_list_spec~$to_tool_file_cmd in 8168 + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) 8169 + try_normal_branch=yes 8170 + eval cmd=\"$cmd1\" 8171 + func_len " $cmd" 8172 + len=$func_len_result 8173 + ;; 8174 + *) 8175 + try_normal_branch=no 8176 + ;; 8177 + esac 8178 + if test "$try_normal_branch" = yes \ 8179 + && { test "$len" -lt "$max_cmd_len" \ 8180 + || test "$max_cmd_len" -le -1; } 8181 + then 8182 + func_show_eval "$cmd" 'exit $?' 8183 + skipped_export=false 8184 + elif test -n "$nm_file_list_spec"; then 8185 + func_basename "$output" 8186 + output_la=$func_basename_result 8187 + save_libobjs=$libobjs 8188 + save_output=$output 8189 + output=${output_objdir}/${output_la}.nm 8190 + func_to_tool_file "$output" 8191 + libobjs=$nm_file_list_spec$func_to_tool_file_result 8192 + func_append delfiles " $output" 8193 + func_verbose "creating $NM input file list: $output" 8194 + for obj in $save_libobjs; do 8195 + func_to_tool_file "$obj" 8196 + $ECHO "$func_to_tool_file_result" 8197 + done > "$output" 8198 + eval cmd=\"$cmd1\" 8199 + func_show_eval "$cmd" 'exit $?' 8200 + output=$save_output 8201 + libobjs=$save_libobjs 8202 + skipped_export=false 8203 + else 8204 + # The command line is too long to execute in one step. 8205 + func_verbose "using reloadable object file for export list..." 8206 + skipped_export=: 8207 + # Break out early, otherwise skipped_export may be 8208 + # set to false by a later but shorter cmd. 8209 + break 8210 + fi 8211 + done 8212 + IFS="$save_ifs" 8213 + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then 8214 + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' 8215 + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' 8216 + fi 8217 + fi 8218 + fi 8219 + 8220 + if test -n "$export_symbols" && test -n "$include_expsyms"; then 8221 + tmp_export_symbols="$export_symbols" 8222 + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" 8223 + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' 8224 + fi 8225 + 8226 + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then 8227 + # The given exports_symbols file has to be filtered, so filter it. 8228 + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" 8229 + # FIXME: $output_objdir/$libname.filter potentially contains lots of 8230 + # 's' commands which not all seds can handle. GNU sed should be fine 8231 + # though. Also, the filter scales superlinearly with the number of 8232 + # global variables. join(1) would be nice here, but unfortunately 8233 + # isn't a blessed tool. 8234 + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter 8235 + func_append delfiles " $export_symbols $output_objdir/$libname.filter" 8236 + export_symbols=$output_objdir/$libname.def 8237 + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols 8238 + fi 8239 + 8240 + tmp_deplibs= 8241 + for test_deplib in $deplibs; do 8242 + case " $convenience " in 8243 + *" $test_deplib "*) ;; 8244 + *) 8245 + func_append tmp_deplibs " $test_deplib" 8246 + ;; 8247 + esac 8248 + done 8249 + deplibs="$tmp_deplibs" 8250 + 8251 + if test -n "$convenience"; then 8252 + if test -n "$whole_archive_flag_spec" && 8253 + test "$compiler_needs_object" = yes && 8254 + test -z "$libobjs"; then 8255 + # extract the archives, so we have objects to list. 8256 + # TODO: could optimize this to just extract one archive. 8257 + whole_archive_flag_spec= 8258 + fi 8259 + if test -n "$whole_archive_flag_spec"; then 8260 + save_libobjs=$libobjs 8261 + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" 8262 + test "X$libobjs" = "X " && libobjs= 8263 + else 8264 + gentop="$output_objdir/${outputname}x" 8265 + func_append generated " $gentop" 8266 + 8267 + func_extract_archives $gentop $convenience 8268 + func_append libobjs " $func_extract_archives_result" 8269 + test "X$libobjs" = "X " && libobjs= 8270 + fi 8271 + fi 8272 + 8273 + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then 8274 + eval flag=\"$thread_safe_flag_spec\" 8275 + func_append linker_flags " $flag" 8276 + fi 8277 + 8278 + # Make a backup of the uninstalled library when relinking 8279 + if test "$opt_mode" = relink; then 8280 + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? 8281 + fi 8282 + 8283 + # Do each of the archive commands. 8284 + if test "$module" = yes && test -n "$module_cmds" ; then 8285 + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then 8286 + eval test_cmds=\"$module_expsym_cmds\" 8287 + cmds=$module_expsym_cmds 8288 + else 8289 + eval test_cmds=\"$module_cmds\" 8290 + cmds=$module_cmds 8291 + fi 8292 + else 8293 + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then 8294 + eval test_cmds=\"$archive_expsym_cmds\" 8295 + cmds=$archive_expsym_cmds 8296 + else 8297 + eval test_cmds=\"$archive_cmds\" 8298 + cmds=$archive_cmds 8299 + fi 8300 + fi 8301 + 8302 + if test "X$skipped_export" != "X:" && 8303 + func_len " $test_cmds" && 8304 + len=$func_len_result && 8305 + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then 8306 + : 8307 + else 8308 + # The command line is too long to link in one step, link piecewise 8309 + # or, if using GNU ld and skipped_export is not :, use a linker 8310 + # script. 8311 + 8312 + # Save the value of $output and $libobjs because we want to 8313 + # use them later. If we have whole_archive_flag_spec, we 8314 + # want to use save_libobjs as it was before 8315 + # whole_archive_flag_spec was expanded, because we can't 8316 + # assume the linker understands whole_archive_flag_spec. 8317 + # This may have to be revisited, in case too many 8318 + # convenience libraries get linked in and end up exceeding 8319 + # the spec. 8320 + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then 8321 + save_libobjs=$libobjs 8322 + fi 8323 + save_output=$output 8324 + func_basename "$output" 8325 + output_la=$func_basename_result 8326 + 8327 + # Clear the reloadable object creation command queue and 8328 + # initialize k to one. 8329 + test_cmds= 8330 + concat_cmds= 8331 + objlist= 8332 + last_robj= 8333 + k=1 8334 + 8335 + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then 8336 + output=${output_objdir}/${output_la}.lnkscript 8337 + func_verbose "creating GNU ld script: $output" 8338 + echo 'INPUT (' > $output 8339 + for obj in $save_libobjs 8340 + do 8341 + func_to_tool_file "$obj" 8342 + $ECHO "$func_to_tool_file_result" >> $output 8343 + done 8344 + echo ')' >> $output 8345 + func_append delfiles " $output" 8346 + func_to_tool_file "$output" 8347 + output=$func_to_tool_file_result 8348 + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then 8349 + output=${output_objdir}/${output_la}.lnk 8350 + func_verbose "creating linker input file list: $output" 8351 + : > $output 8352 + set x $save_libobjs 8353 + shift 8354 + firstobj= 8355 + if test "$compiler_needs_object" = yes; then 8356 + firstobj="$1 " 8357 + shift 8358 + fi 8359 + for obj 8360 + do 8361 + func_to_tool_file "$obj" 8362 + $ECHO "$func_to_tool_file_result" >> $output 8363 + done 8364 + func_append delfiles " $output" 8365 + func_to_tool_file "$output" 8366 + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" 8367 + else 8368 + if test -n "$save_libobjs"; then 8369 + func_verbose "creating reloadable object files..." 8370 + output=$output_objdir/$output_la-${k}.$objext 8371 + eval test_cmds=\"$reload_cmds\" 8372 + func_len " $test_cmds" 8373 + len0=$func_len_result 8374 + len=$len0 8375 + 8376 + # Loop over the list of objects to be linked. 8377 + for obj in $save_libobjs 8378 + do 8379 + func_len " $obj" 8380 + func_arith $len + $func_len_result 8381 + len=$func_arith_result 8382 + if test "X$objlist" = X || 8383 + test "$len" -lt "$max_cmd_len"; then 8384 + func_append objlist " $obj" 8385 + else 8386 + # The command $test_cmds is almost too long, add a 8387 + # command to the queue. 8388 + if test "$k" -eq 1 ; then 8389 + # The first file doesn't have a previous command to add. 8390 + reload_objs=$objlist 8391 + eval concat_cmds=\"$reload_cmds\" 8392 + else 8393 + # All subsequent reloadable object files will link in 8394 + # the last one created. 8395 + reload_objs="$objlist $last_robj" 8396 + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" 8397 + fi 8398 + last_robj=$output_objdir/$output_la-${k}.$objext 8399 + func_arith $k + 1 8400 + k=$func_arith_result 8401 + output=$output_objdir/$output_la-${k}.$objext 8402 + objlist=" $obj" 8403 + func_len " $last_robj" 8404 + func_arith $len0 + $func_len_result 8405 + len=$func_arith_result 8406 + fi 8407 + done 8408 + # Handle the remaining objects by creating one last 8409 + # reloadable object file. All subsequent reloadable object 8410 + # files will link in the last one created. 8411 + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ 8412 + reload_objs="$objlist $last_robj" 8413 + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" 8414 + if test -n "$last_robj"; then 8415 + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" 8416 + fi 8417 + func_append delfiles " $output" 8418 + 8419 + else 8420 + output= 8421 + fi 8422 + 8423 + if ${skipped_export-false}; then 8424 + func_verbose "generating symbol list for \`$libname.la'" 8425 + export_symbols="$output_objdir/$libname.exp" 8426 + $opt_dry_run || $RM $export_symbols 8427 + libobjs=$output 8428 + # Append the command to create the export file. 8429 + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ 8430 + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" 8431 + if test -n "$last_robj"; then 8432 + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" 8433 + fi 8434 + fi 8435 + 8436 + test -n "$save_libobjs" && 8437 + func_verbose "creating a temporary reloadable object file: $output" 8438 + 8439 + # Loop through the commands generated above and execute them. 8440 + save_ifs="$IFS"; IFS='~' 8441 + for cmd in $concat_cmds; do 8442 + IFS="$save_ifs" 8443 + $opt_silent || { 8444 + func_quote_for_expand "$cmd" 8445 + eval "func_echo $func_quote_for_expand_result" 8446 + } 8447 + $opt_dry_run || eval "$cmd" || { 8448 + lt_exit=$? 8449 + 8450 + # Restore the uninstalled library and exit 8451 + if test "$opt_mode" = relink; then 8452 + ( cd "$output_objdir" && \ 8453 + $RM "${realname}T" && \ 8454 + $MV "${realname}U" "$realname" ) 8455 + fi 8456 + 8457 + exit $lt_exit 8458 + } 8459 + done 8460 + IFS="$save_ifs" 8461 + 8462 + if test -n "$export_symbols_regex" && ${skipped_export-false}; then 8463 + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' 8464 + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' 8465 + fi 8466 + fi 8467 + 8468 + if ${skipped_export-false}; then 8469 + if test -n "$export_symbols" && test -n "$include_expsyms"; then 8470 + tmp_export_symbols="$export_symbols" 8471 + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" 8472 + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' 8473 + fi 8474 + 8475 + if test -n "$orig_export_symbols"; then 8476 + # The given exports_symbols file has to be filtered, so filter it. 8477 + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" 8478 + # FIXME: $output_objdir/$libname.filter potentially contains lots of 8479 + # 's' commands which not all seds can handle. GNU sed should be fine 8480 + # though. Also, the filter scales superlinearly with the number of 8481 + # global variables. join(1) would be nice here, but unfortunately 8482 + # isn't a blessed tool. 8483 + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter 8484 + func_append delfiles " $export_symbols $output_objdir/$libname.filter" 8485 + export_symbols=$output_objdir/$libname.def 8486 + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols 8487 + fi 8488 + fi 8489 + 8490 + libobjs=$output 8491 + # Restore the value of output. 8492 + output=$save_output 8493 + 8494 + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then 8495 + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" 8496 + test "X$libobjs" = "X " && libobjs= 8497 + fi 8498 + # Expand the library linking commands again to reset the 8499 + # value of $libobjs for piecewise linking. 8500 + 8501 + # Do each of the archive commands. 8502 + if test "$module" = yes && test -n "$module_cmds" ; then 8503 + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then 8504 + cmds=$module_expsym_cmds 8505 + else 8506 + cmds=$module_cmds 8507 + fi 8508 + else 8509 + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then 8510 + cmds=$archive_expsym_cmds 8511 + else 8512 + cmds=$archive_cmds 8513 + fi 8514 + fi 8515 + fi 8516 + 8517 + if test -n "$delfiles"; then 8518 + # Append the command to remove temporary files to $cmds. 8519 + eval cmds=\"\$cmds~\$RM $delfiles\" 8520 + fi 8521 + 8522 + # Add any objects from preloaded convenience libraries 8523 + if test -n "$dlprefiles"; then 8524 + gentop="$output_objdir/${outputname}x" 8525 + func_append generated " $gentop" 8526 + 8527 + func_extract_archives $gentop $dlprefiles 8528 + func_append libobjs " $func_extract_archives_result" 8529 + test "X$libobjs" = "X " && libobjs= 8530 + fi 8531 + 8532 + save_ifs="$IFS"; IFS='~' 8533 + for cmd in $cmds; do 8534 + IFS="$save_ifs" 8535 + eval cmd=\"$cmd\" 8536 + $opt_silent || { 8537 + func_quote_for_expand "$cmd" 8538 + eval "func_echo $func_quote_for_expand_result" 8539 + } 8540 + $opt_dry_run || eval "$cmd" || { 8541 + lt_exit=$? 8542 + 8543 + # Restore the uninstalled library and exit 8544 + if test "$opt_mode" = relink; then 8545 + ( cd "$output_objdir" && \ 8546 + $RM "${realname}T" && \ 8547 + $MV "${realname}U" "$realname" ) 8548 + fi 8549 + 8550 + exit $lt_exit 8551 + } 8552 + done 8553 + IFS="$save_ifs" 8554 + 8555 + # Restore the uninstalled library and exit 8556 + if test "$opt_mode" = relink; then 8557 + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? 8558 + 8559 + if test -n "$convenience"; then 8560 + if test -z "$whole_archive_flag_spec"; then 8561 + func_show_eval '${RM}r "$gentop"' 8562 + fi 8563 + fi 8564 + 8565 + exit $EXIT_SUCCESS 8566 + fi 8567 + 8568 + # Create links to the real library. 8569 + for linkname in $linknames; do 8570 + if test "$realname" != "$linkname"; then 8571 + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' 8572 + fi 8573 + done 8574 + 8575 + # If -module or -export-dynamic was specified, set the dlname. 8576 + if test "$module" = yes || test "$export_dynamic" = yes; then 8577 + # On all known operating systems, these are identical. 8578 + dlname="$soname" 8579 + fi 8580 + fi 8581 + ;; 8582 + 8583 + obj) 8584 + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then 8585 + func_warning "\`-dlopen' is ignored for objects" 8586 + fi 8587 + 8588 + case " $deplibs" in 8589 + *\ -l* | *\ -L*) 8590 + func_warning "\`-l' and \`-L' are ignored for objects" ;; 8591 + esac 8592 + 8593 + test -n "$rpath" && \ 8594 + func_warning "\`-rpath' is ignored for objects" 8595 + 8596 + test -n "$xrpath" && \ 8597 + func_warning "\`-R' is ignored for objects" 8598 + 8599 + test -n "$vinfo" && \ 8600 + func_warning "\`-version-info' is ignored for objects" 8601 + 8602 + test -n "$release" && \ 8603 + func_warning "\`-release' is ignored for objects" 8604 + 8605 + case $output in 8606 + *.lo) 8607 + test -n "$objs$old_deplibs" && \ 8608 + func_fatal_error "cannot build library object \`$output' from non-libtool objects" 8609 + 8610 + libobj=$output 8611 + func_lo2o "$libobj" 8612 + obj=$func_lo2o_result 8613 + ;; 8614 + *) 8615 + libobj= 8616 + obj="$output" 8617 + ;; 8618 + esac 8619 + 8620 + # Delete the old objects. 8621 + $opt_dry_run || $RM $obj $libobj 8622 + 8623 + # Objects from convenience libraries. This assumes 8624 + # single-version convenience libraries. Whenever we create 8625 + # different ones for PIC/non-PIC, this we'll have to duplicate 8626 + # the extraction. 8627 + reload_conv_objs= 8628 + gentop= 8629 + # reload_cmds runs $LD directly, so let us get rid of 8630 + # -Wl from whole_archive_flag_spec and hope we can get by with 8631 + # turning comma into space.. 8632 + wl= 8633 + 8634 + if test -n "$convenience"; then 8635 + if test -n "$whole_archive_flag_spec"; then 8636 + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" 8637 + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` 8638 + else 8639 + gentop="$output_objdir/${obj}x" 8640 + func_append generated " $gentop" 8641 + 8642 + func_extract_archives $gentop $convenience 8643 + reload_conv_objs="$reload_objs $func_extract_archives_result" 8644 + fi 8645 + fi 8646 + 8647 + # If we're not building shared, we need to use non_pic_objs 8648 + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" 8649 + 8650 + # Create the old-style object. 8651 + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test 8652 + 8653 + output="$obj" 8654 + func_execute_cmds "$reload_cmds" 'exit $?' 8655 + 8656 + # Exit if we aren't doing a library object file. 8657 + if test -z "$libobj"; then 8658 + if test -n "$gentop"; then 8659 + func_show_eval '${RM}r "$gentop"' 8660 + fi 8661 + 8662 + exit $EXIT_SUCCESS 8663 + fi 8664 + 8665 + if test "$build_libtool_libs" != yes; then 8666 + if test -n "$gentop"; then 8667 + func_show_eval '${RM}r "$gentop"' 8668 + fi 8669 + 8670 + # Create an invalid libtool object if no PIC, so that we don't 8671 + # accidentally link it into a program. 8672 + # $show "echo timestamp > $libobj" 8673 + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? 8674 + exit $EXIT_SUCCESS 8675 + fi 8676 + 8677 + if test -n "$pic_flag" || test "$pic_mode" != default; then 8678 + # Only do commands if we really have different PIC objects. 8679 + reload_objs="$libobjs $reload_conv_objs" 8680 + output="$libobj" 8681 + func_execute_cmds "$reload_cmds" 'exit $?' 8682 + fi 8683 + 8684 + if test -n "$gentop"; then 8685 + func_show_eval '${RM}r "$gentop"' 8686 + fi 8687 + 8688 + exit $EXIT_SUCCESS 8689 + ;; 8690 + 8691 + prog) 8692 + case $host in 8693 + *cygwin*) func_stripname '' '.exe' "$output" 8694 + output=$func_stripname_result.exe;; 8695 + esac 8696 + test -n "$vinfo" && \ 8697 + func_warning "\`-version-info' is ignored for programs" 8698 + 8699 + test -n "$release" && \ 8700 + func_warning "\`-release' is ignored for programs" 8701 + 8702 + test "$preload" = yes \ 8703 + && test "$dlopen_support" = unknown \ 8704 + && test "$dlopen_self" = unknown \ 8705 + && test "$dlopen_self_static" = unknown && \ 8706 + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." 8707 + 8708 + case $host in 8709 + *-*-rhapsody* | *-*-darwin1.[012]) 8710 + # On Rhapsody replace the C library is the System framework 8711 + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` 8712 + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` 8713 + ;; 8714 + esac 8715 + 8716 + case $host in 8717 + *-*-darwin*) 8718 + # Don't allow lazy linking, it breaks C++ global constructors 8719 + # But is supposedly fixed on 10.4 or later (yay!). 8720 + if test "$tagname" = CXX ; then 8721 + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 8722 + 10.[0123]) 8723 + func_append compile_command " ${wl}-bind_at_load" 8724 + func_append finalize_command " ${wl}-bind_at_load" 8725 + ;; 8726 + esac 8727 + fi 8728 + # Time to change all our "foo.ltframework" stuff back to "-framework foo" 8729 + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 8730 + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` 8731 + ;; 8732 + esac 8733 + 8734 + 8735 + # move library search paths that coincide with paths to not yet 8736 + # installed libraries to the beginning of the library search list 8737 + new_libs= 8738 + for path in $notinst_path; do 8739 + case " $new_libs " in 8740 + *" -L$path/$objdir "*) ;; 8741 + *) 8742 + case " $compile_deplibs " in 8743 + *" -L$path/$objdir "*) 8744 + func_append new_libs " -L$path/$objdir" ;; 8745 + esac 8746 + ;; 8747 + esac 8748 + done 8749 + for deplib in $compile_deplibs; do 8750 + case $deplib in 8751 + -L*) 8752 + case " $new_libs " in 8753 + *" $deplib "*) ;; 8754 + *) func_append new_libs " $deplib" ;; 8755 + esac 8756 + ;; 8757 + *) func_append new_libs " $deplib" ;; 8758 + esac 8759 + done 8760 + compile_deplibs="$new_libs" 8761 + 8762 + 8763 + func_append compile_command " $compile_deplibs" 8764 + func_append finalize_command " $finalize_deplibs" 8765 + 8766 + if test -n "$rpath$xrpath"; then 8767 + # If the user specified any rpath flags, then add them. 8768 + for libdir in $rpath $xrpath; do 8769 + # This is the magic to use -rpath. 8770 + case "$finalize_rpath " in 8771 + *" $libdir "*) ;; 8772 + *) func_append finalize_rpath " $libdir" ;; 8773 + esac 8774 + done 8775 + fi 8776 + 8777 + # Now hardcode the library paths 8778 + rpath= 8779 + hardcode_libdirs= 8780 + for libdir in $compile_rpath $finalize_rpath; do 8781 + if test -n "$hardcode_libdir_flag_spec"; then 8782 + if test -n "$hardcode_libdir_separator"; then 8783 + if test -z "$hardcode_libdirs"; then 8784 + hardcode_libdirs="$libdir" 8785 + else 8786 + # Just accumulate the unique libdirs. 8787 + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in 8788 + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) 8789 + ;; 8790 + *) 8791 + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" 8792 + ;; 8793 + esac 8794 + fi 8795 + else 8796 + eval flag=\"$hardcode_libdir_flag_spec\" 8797 + func_append rpath " $flag" 8798 + fi 8799 + elif test -n "$runpath_var"; then 8800 + case "$perm_rpath " in 8801 + *" $libdir "*) ;; 8802 + *) func_append perm_rpath " $libdir" ;; 8803 + esac 8804 + fi 8805 + case $host in 8806 + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) 8807 + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` 8808 + case :$dllsearchpath: in 8809 + *":$libdir:"*) ;; 8810 + ::) dllsearchpath=$libdir;; 8811 + *) func_append dllsearchpath ":$libdir";; 8812 + esac 8813 + case :$dllsearchpath: in 8814 + *":$testbindir:"*) ;; 8815 + ::) dllsearchpath=$testbindir;; 8816 + *) func_append dllsearchpath ":$testbindir";; 8817 + esac 8818 + ;; 8819 + esac 8820 + done 8821 + # Substitute the hardcoded libdirs into the rpath. 8822 + if test -n "$hardcode_libdir_separator" && 8823 + test -n "$hardcode_libdirs"; then 8824 + libdir="$hardcode_libdirs" 8825 + eval rpath=\" $hardcode_libdir_flag_spec\" 8826 + fi 8827 + compile_rpath="$rpath" 8828 + 8829 + rpath= 8830 + hardcode_libdirs= 8831 + for libdir in $finalize_rpath; do 8832 + if test -n "$hardcode_libdir_flag_spec"; then 8833 + if test -n "$hardcode_libdir_separator"; then 8834 + if test -z "$hardcode_libdirs"; then 8835 + hardcode_libdirs="$libdir" 8836 + else 8837 + # Just accumulate the unique libdirs. 8838 + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in 8839 + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) 8840 + ;; 8841 + *) 8842 + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" 8843 + ;; 8844 + esac 8845 + fi 8846 + else 8847 + eval flag=\"$hardcode_libdir_flag_spec\" 8848 + func_append rpath " $flag" 8849 + fi 8850 + elif test -n "$runpath_var"; then 8851 + case "$finalize_perm_rpath " in 8852 + *" $libdir "*) ;; 8853 + *) func_append finalize_perm_rpath " $libdir" ;; 8854 + esac 8855 + fi 8856 + done 8857 + # Substitute the hardcoded libdirs into the rpath. 8858 + if test -n "$hardcode_libdir_separator" && 8859 + test -n "$hardcode_libdirs"; then 8860 + libdir="$hardcode_libdirs" 8861 + eval rpath=\" $hardcode_libdir_flag_spec\" 8862 + fi 8863 + finalize_rpath="$rpath" 8864 + 8865 + if test -n "$libobjs" && test "$build_old_libs" = yes; then 8866 + # Transform all the library objects into standard objects. 8867 + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` 8868 + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` 8869 + fi 8870 + 8871 + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" 8872 + 8873 + # template prelinking step 8874 + if test -n "$prelink_cmds"; then 8875 + func_execute_cmds "$prelink_cmds" 'exit $?' 8876 + fi 8877 + 8878 + wrappers_required=yes 8879 + case $host in 8880 + *cegcc* | *mingw32ce*) 8881 + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. 8882 + wrappers_required=no 8883 + ;; 8884 + *cygwin* | *mingw* ) 8885 + if test "$build_libtool_libs" != yes; then 8886 + wrappers_required=no 8887 + fi 8888 + ;; 8889 + *) 8890 + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then 8891 + wrappers_required=no 8892 + fi 8893 + ;; 8894 + esac 8895 + if test "$wrappers_required" = no; then 8896 + # Replace the output file specification. 8897 + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` 8898 + link_command="$compile_command$compile_rpath" 8899 + 8900 + # We have no uninstalled library dependencies, so finalize right now. 8901 + exit_status=0 8902 + func_show_eval "$link_command" 'exit_status=$?' 8903 + 8904 + if test -n "$postlink_cmds"; then 8905 + func_to_tool_file "$output" 8906 + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` 8907 + func_execute_cmds "$postlink_cmds" 'exit $?' 8908 + fi 8909 + 8910 + # Delete the generated files. 8911 + if test -f "$output_objdir/${outputname}S.${objext}"; then 8912 + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' 8913 + fi 8914 + 8915 + exit $exit_status 8916 + fi 8917 + 8918 + if test -n "$compile_shlibpath$finalize_shlibpath"; then 8919 + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" 8920 + fi 8921 + if test -n "$finalize_shlibpath"; then 8922 + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" 8923 + fi 8924 + 8925 + compile_var= 8926 + finalize_var= 8927 + if test -n "$runpath_var"; then 8928 + if test -n "$perm_rpath"; then 8929 + # We should set the runpath_var. 8930 + rpath= 8931 + for dir in $perm_rpath; do 8932 + func_append rpath "$dir:" 8933 + done 8934 + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " 8935 + fi 8936 + if test -n "$finalize_perm_rpath"; then 8937 + # We should set the runpath_var. 8938 + rpath= 8939 + for dir in $finalize_perm_rpath; do 8940 + func_append rpath "$dir:" 8941 + done 8942 + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " 8943 + fi 8944 + fi 8945 + 8946 + if test "$no_install" = yes; then 8947 + # We don't need to create a wrapper script. 8948 + link_command="$compile_var$compile_command$compile_rpath" 8949 + # Replace the output file specification. 8950 + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` 8951 + # Delete the old output file. 8952 + $opt_dry_run || $RM $output 8953 + # Link the executable and exit 8954 + func_show_eval "$link_command" 'exit $?' 8955 + 8956 + if test -n "$postlink_cmds"; then 8957 + func_to_tool_file "$output" 8958 + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` 8959 + func_execute_cmds "$postlink_cmds" 'exit $?' 8960 + fi 8961 + 8962 + exit $EXIT_SUCCESS 8963 + fi 8964 + 8965 + if test "$hardcode_action" = relink; then 8966 + # Fast installation is not supported 8967 + link_command="$compile_var$compile_command$compile_rpath" 8968 + relink_command="$finalize_var$finalize_command$finalize_rpath" 8969 + 8970 + func_warning "this platform does not like uninstalled shared libraries" 8971 + func_warning "\`$output' will be relinked during installation" 8972 + else 8973 + if test "$fast_install" != no; then 8974 + link_command="$finalize_var$compile_command$finalize_rpath" 8975 + if test "$fast_install" = yes; then 8976 + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` 8977 + else 8978 + # fast_install is set to needless 8979 + relink_command= 8980 + fi 8981 + else 8982 + link_command="$compile_var$compile_command$compile_rpath" 8983 + relink_command="$finalize_var$finalize_command$finalize_rpath" 8984 + fi 8985 + fi 8986 + 8987 + # Replace the output file specification. 8988 + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` 8989 + 8990 + # Delete the old output files. 8991 + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname 8992 + 8993 + func_show_eval "$link_command" 'exit $?' 8994 + 8995 + if test -n "$postlink_cmds"; then 8996 + func_to_tool_file "$output_objdir/$outputname" 8997 + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` 8998 + func_execute_cmds "$postlink_cmds" 'exit $?' 8999 + fi 9000 + 9001 + # Now create the wrapper script. 9002 + func_verbose "creating $output" 9003 + 9004 + # Quote the relink command for shipping. 9005 + if test -n "$relink_command"; then 9006 + # Preserve any variables that may affect compiler behavior 9007 + for var in $variables_saved_for_relink; do 9008 + if eval test -z \"\${$var+set}\"; then 9009 + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" 9010 + elif eval var_value=\$$var; test -z "$var_value"; then 9011 + relink_command="$var=; export $var; $relink_command" 9012 + else 9013 + func_quote_for_eval "$var_value" 9014 + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" 9015 + fi 9016 + done 9017 + relink_command="(cd `pwd`; $relink_command)" 9018 + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` 9019 + fi 9020 + 9021 + # Only actually do things if not in dry run mode. 9022 + $opt_dry_run || { 9023 + # win32 will think the script is a binary if it has 9024 + # a .exe suffix, so we strip it off here. 9025 + case $output in 9026 + *.exe) func_stripname '' '.exe' "$output" 9027 + output=$func_stripname_result ;; 9028 + esac 9029 + # test for cygwin because mv fails w/o .exe extensions 9030 + case $host in 9031 + *cygwin*) 9032 + exeext=.exe 9033 + func_stripname '' '.exe' "$outputname" 9034 + outputname=$func_stripname_result ;; 9035 + *) exeext= ;; 9036 + esac 9037 + case $host in 9038 + *cygwin* | *mingw* ) 9039 + func_dirname_and_basename "$output" "" "." 9040 + output_name=$func_basename_result 9041 + output_path=$func_dirname_result 9042 + cwrappersource="$output_path/$objdir/lt-$output_name.c" 9043 + cwrapper="$output_path/$output_name.exe" 9044 + $RM $cwrappersource $cwrapper 9045 + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 9046 + 9047 + func_emit_cwrapperexe_src > $cwrappersource 9048 + 9049 + # The wrapper executable is built using the $host compiler, 9050 + # because it contains $host paths and files. If cross- 9051 + # compiling, it, like the target executable, must be 9052 + # executed on the $host or under an emulation environment. 9053 + $opt_dry_run || { 9054 + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource 9055 + $STRIP $cwrapper 9056 + } 9057 + 9058 + # Now, create the wrapper script for func_source use: 9059 + func_ltwrapper_scriptname $cwrapper 9060 + $RM $func_ltwrapper_scriptname_result 9061 + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 9062 + $opt_dry_run || { 9063 + # note: this script will not be executed, so do not chmod. 9064 + if test "x$build" = "x$host" ; then 9065 + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result 9066 + else 9067 + func_emit_wrapper no > $func_ltwrapper_scriptname_result 9068 + fi 9069 + } 9070 + ;; 9071 + * ) 9072 + $RM $output 9073 + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 9074 + 9075 + func_emit_wrapper no > $output 9076 + chmod +x $output 9077 + ;; 9078 + esac 9079 + } 9080 + exit $EXIT_SUCCESS 9081 + ;; 9082 + esac 9083 + 9084 + # See if we need to build an old-fashioned archive. 9085 + for oldlib in $oldlibs; do 9086 + 9087 + if test "$build_libtool_libs" = convenience; then 9088 + oldobjs="$libobjs_save $symfileobj" 9089 + addlibs="$convenience" 9090 + build_libtool_libs=no 9091 + else 9092 + if test "$build_libtool_libs" = module; then 9093 + oldobjs="$libobjs_save" 9094 + build_libtool_libs=no 9095 + else 9096 + oldobjs="$old_deplibs $non_pic_objects" 9097 + if test "$preload" = yes && test -f "$symfileobj"; then 9098 + func_append oldobjs " $symfileobj" 9099 + fi 9100 + fi 9101 + addlibs="$old_convenience" 9102 + fi 9103 + 9104 + if test -n "$addlibs"; then 9105 + gentop="$output_objdir/${outputname}x" 9106 + func_append generated " $gentop" 9107 + 9108 + func_extract_archives $gentop $addlibs 9109 + func_append oldobjs " $func_extract_archives_result" 9110 + fi 9111 + 9112 + # Do each command in the archive commands. 9113 + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then 9114 + cmds=$old_archive_from_new_cmds 9115 + else 9116 + 9117 + # Add any objects from preloaded convenience libraries 9118 + if test -n "$dlprefiles"; then 9119 + gentop="$output_objdir/${outputname}x" 9120 + func_append generated " $gentop" 9121 + 9122 + func_extract_archives $gentop $dlprefiles 9123 + func_append oldobjs " $func_extract_archives_result" 9124 + fi 9125 + 9126 + # POSIX demands no paths to be encoded in archives. We have 9127 + # to avoid creating archives with duplicate basenames if we 9128 + # might have to extract them afterwards, e.g., when creating a 9129 + # static archive out of a convenience library, or when linking 9130 + # the entirety of a libtool archive into another (currently 9131 + # not supported by libtool). 9132 + if (for obj in $oldobjs 9133 + do 9134 + func_basename "$obj" 9135 + $ECHO "$func_basename_result" 9136 + done | sort | sort -uc >/dev/null 2>&1); then 9137 + : 9138 + else 9139 + echo "copying selected object files to avoid basename conflicts..." 9140 + gentop="$output_objdir/${outputname}x" 9141 + func_append generated " $gentop" 9142 + func_mkdir_p "$gentop" 9143 + save_oldobjs=$oldobjs 9144 + oldobjs= 9145 + counter=1 9146 + for obj in $save_oldobjs 9147 + do 9148 + func_basename "$obj" 9149 + objbase="$func_basename_result" 9150 + case " $oldobjs " in 9151 + " ") oldobjs=$obj ;; 9152 + *[\ /]"$objbase "*) 9153 + while :; do 9154 + # Make sure we don't pick an alternate name that also 9155 + # overlaps. 9156 + newobj=lt$counter-$objbase 9157 + func_arith $counter + 1 9158 + counter=$func_arith_result 9159 + case " $oldobjs " in 9160 + *[\ /]"$newobj "*) ;; 9161 + *) if test ! -f "$gentop/$newobj"; then break; fi ;; 9162 + esac 9163 + done 9164 + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" 9165 + func_append oldobjs " $gentop/$newobj" 9166 + ;; 9167 + *) func_append oldobjs " $obj" ;; 9168 + esac 9169 + done 9170 + fi 9171 + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 9172 + tool_oldlib=$func_to_tool_file_result 9173 + eval cmds=\"$old_archive_cmds\" 9174 + 9175 + func_len " $cmds" 9176 + len=$func_len_result 9177 + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then 9178 + cmds=$old_archive_cmds 9179 + elif test -n "$archiver_list_spec"; then 9180 + func_verbose "using command file archive linking..." 9181 + for obj in $oldobjs 9182 + do 9183 + func_to_tool_file "$obj" 9184 + $ECHO "$func_to_tool_file_result" 9185 + done > $output_objdir/$libname.libcmd 9186 + func_to_tool_file "$output_objdir/$libname.libcmd" 9187 + oldobjs=" $archiver_list_spec$func_to_tool_file_result" 9188 + cmds=$old_archive_cmds 9189 + else 9190 + # the command line is too long to link in one step, link in parts 9191 + func_verbose "using piecewise archive linking..." 9192 + save_RANLIB=$RANLIB 9193 + RANLIB=: 9194 + objlist= 9195 + concat_cmds= 9196 + save_oldobjs=$oldobjs 9197 + oldobjs= 9198 + # Is there a better way of finding the last object in the list? 9199 + for obj in $save_oldobjs 9200 + do 9201 + last_oldobj=$obj 9202 + done 9203 + eval test_cmds=\"$old_archive_cmds\" 9204 + func_len " $test_cmds" 9205 + len0=$func_len_result 9206 + len=$len0 9207 + for obj in $save_oldobjs 9208 + do 9209 + func_len " $obj" 9210 + func_arith $len + $func_len_result 9211 + len=$func_arith_result 9212 + func_append objlist " $obj" 9213 + if test "$len" -lt "$max_cmd_len"; then 9214 + : 9215 + else 9216 + # the above command should be used before it gets too long 9217 + oldobjs=$objlist 9218 + if test "$obj" = "$last_oldobj" ; then 9219 + RANLIB=$save_RANLIB 9220 + fi 9221 + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ 9222 + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" 9223 + objlist= 9224 + len=$len0 9225 + fi 9226 + done 9227 + RANLIB=$save_RANLIB 9228 + oldobjs=$objlist 9229 + if test "X$oldobjs" = "X" ; then 9230 + eval cmds=\"\$concat_cmds\" 9231 + else 9232 + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" 9233 + fi 9234 + fi 9235 + fi 9236 + func_execute_cmds "$cmds" 'exit $?' 9237 + done 9238 + 9239 + test -n "$generated" && \ 9240 + func_show_eval "${RM}r$generated" 9241 + 9242 + # Now create the libtool archive. 9243 + case $output in 9244 + *.la) 9245 + old_library= 9246 + test "$build_old_libs" = yes && old_library="$libname.$libext" 9247 + func_verbose "creating $output" 9248 + 9249 + # Preserve any variables that may affect compiler behavior 9250 + for var in $variables_saved_for_relink; do 9251 + if eval test -z \"\${$var+set}\"; then 9252 + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" 9253 + elif eval var_value=\$$var; test -z "$var_value"; then 9254 + relink_command="$var=; export $var; $relink_command" 9255 + else 9256 + func_quote_for_eval "$var_value" 9257 + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" 9258 + fi 9259 + done 9260 + # Quote the link command for shipping. 9261 + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" 9262 + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` 9263 + if test "$hardcode_automatic" = yes ; then 9264 + relink_command= 9265 + fi 9266 + 9267 + # Only create the output if not a dry run. 9268 + $opt_dry_run || { 9269 + for installed in no yes; do 9270 + if test "$installed" = yes; then 9271 + if test -z "$install_libdir"; then 9272 + break 9273 + fi 9274 + output="$output_objdir/$outputname"i 9275 + # Replace all uninstalled libtool libraries with the installed ones 9276 + newdependency_libs= 9277 + for deplib in $dependency_libs; do 9278 + case $deplib in 9279 + *.la) 9280 + func_basename "$deplib" 9281 + name="$func_basename_result" 9282 + func_resolve_sysroot "$deplib" 9283 + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` 9284 + test -z "$libdir" && \ 9285 + func_fatal_error "\`$deplib' is not a valid libtool archive" 9286 + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" 9287 + ;; 9288 + -L*) 9289 + func_stripname -L '' "$deplib" 9290 + func_replace_sysroot "$func_stripname_result" 9291 + func_append newdependency_libs " -L$func_replace_sysroot_result" 9292 + ;; 9293 + -R*) 9294 + func_stripname -R '' "$deplib" 9295 + func_replace_sysroot "$func_stripname_result" 9296 + func_append newdependency_libs " -R$func_replace_sysroot_result" 9297 + ;; 9298 + *) func_append newdependency_libs " $deplib" ;; 9299 + esac 9300 + done 9301 + dependency_libs="$newdependency_libs" 9302 + newdlfiles= 9303 + 9304 + for lib in $dlfiles; do 9305 + case $lib in 9306 + *.la) 9307 + func_basename "$lib" 9308 + name="$func_basename_result" 9309 + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` 9310 + test -z "$libdir" && \ 9311 + func_fatal_error "\`$lib' is not a valid libtool archive" 9312 + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" 9313 + ;; 9314 + *) func_append newdlfiles " $lib" ;; 9315 + esac 9316 + done 9317 + dlfiles="$newdlfiles" 9318 + newdlprefiles= 9319 + for lib in $dlprefiles; do 9320 + case $lib in 9321 + *.la) 9322 + # Only pass preopened files to the pseudo-archive (for 9323 + # eventual linking with the app. that links it) if we 9324 + # didn't already link the preopened objects directly into 9325 + # the library: 9326 + func_basename "$lib" 9327 + name="$func_basename_result" 9328 + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` 9329 + test -z "$libdir" && \ 9330 + func_fatal_error "\`$lib' is not a valid libtool archive" 9331 + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" 9332 + ;; 9333 + esac 9334 + done 9335 + dlprefiles="$newdlprefiles" 9336 + else 9337 + newdlfiles= 9338 + for lib in $dlfiles; do 9339 + case $lib in 9340 + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; 9341 + *) abs=`pwd`"/$lib" ;; 9342 + esac 9343 + func_append newdlfiles " $abs" 9344 + done 9345 + dlfiles="$newdlfiles" 9346 + newdlprefiles= 9347 + for lib in $dlprefiles; do 9348 + case $lib in 9349 + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; 9350 + *) abs=`pwd`"/$lib" ;; 9351 + esac 9352 + func_append newdlprefiles " $abs" 9353 + done 9354 + dlprefiles="$newdlprefiles" 9355 + fi 9356 + $RM $output 9357 + # place dlname in correct position for cygwin 9358 + # In fact, it would be nice if we could use this code for all target 9359 + # systems that can't hard-code library paths into their executables 9360 + # and that have no shared library path variable independent of PATH, 9361 + # but it turns out we can't easily determine that from inspecting 9362 + # libtool variables, so we have to hard-code the OSs to which it 9363 + # applies here; at the moment, that means platforms that use the PE 9364 + # object format with DLL files. See the long comment at the top of 9365 + # tests/bindir.at for full details. 9366 + tdlname=$dlname 9367 + case $host,$output,$installed,$module,$dlname in 9368 + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) 9369 + # If a -bindir argument was supplied, place the dll there. 9370 + if test "x$bindir" != x ; 9371 + then 9372 + func_relative_path "$install_libdir" "$bindir" 9373 + tdlname=$func_relative_path_result$dlname 9374 + else 9375 + # Otherwise fall back on heuristic. 9376 + tdlname=../bin/$dlname 9377 + fi 9378 + ;; 9379 + esac 9380 + $ECHO > $output "\ 9381 +# $outputname - a libtool library file 9382 +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION 9383 +# 9384 +# Please DO NOT delete this file! 9385 +# It is necessary for linking the library. 9386 + 9387 +# The name that we can dlopen(3). 9388 +dlname='$tdlname' 9389 + 9390 +# Names of this library. 9391 +library_names='$library_names' 9392 + 9393 +# The name of the static archive. 9394 +old_library='$old_library' 9395 + 9396 +# Linker flags that can not go in dependency_libs. 9397 +inherited_linker_flags='$new_inherited_linker_flags' 9398 + 9399 +# Libraries that this one depends upon. 9400 +dependency_libs='$dependency_libs' 9401 + 9402 +# Names of additional weak libraries provided by this library 9403 +weak_library_names='$weak_libs' 9404 + 9405 +# Version information for $libname. 9406 +current=$current 9407 +age=$age 9408 +revision=$revision 9409 + 9410 +# Is this an already installed library? 9411 +installed=$installed 9412 + 9413 +# Should we warn about portability when linking against -modules? 9414 +shouldnotlink=$module 9415 + 9416 +# Files to dlopen/dlpreopen 9417 +dlopen='$dlfiles' 9418 +dlpreopen='$dlprefiles' 9419 + 9420 +# Directory that this library needs to be installed in: 9421 +libdir='$install_libdir'" 9422 + if test "$installed" = no && test "$need_relink" = yes; then 9423 + $ECHO >> $output "\ 9424 +relink_command=\"$relink_command\"" 9425 + fi 9426 + done 9427 + } 9428 + 9429 + # Do a symbolic link so that the libtool archive can be found in 9430 + # LD_LIBRARY_PATH before the program is installed. 9431 + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' 9432 + ;; 9433 + esac 9434 + exit $EXIT_SUCCESS 9435 +} 9436 + 9437 +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && 9438 + func_mode_link ${1+"$@"} 9439 + 9440 + 9441 +# func_mode_uninstall arg... 9442 +func_mode_uninstall () 9443 +{ 9444 + $opt_debug 9445 + RM="$nonopt" 9446 + files= 9447 + rmforce= 9448 + exit_status=0 9449 + 9450 + # This variable tells wrapper scripts just to set variables rather 9451 + # than running their programs. 9452 + libtool_install_magic="$magic" 9453 + 9454 + for arg 9455 + do 9456 + case $arg in 9457 + -f) func_append RM " $arg"; rmforce=yes ;; 9458 + -*) func_append RM " $arg" ;; 9459 + *) func_append files " $arg" ;; 9460 + esac 9461 + done 9462 + 9463 + test -z "$RM" && \ 9464 + func_fatal_help "you must specify an RM program" 9465 + 9466 + rmdirs= 9467 + 9468 + for file in $files; do 9469 + func_dirname "$file" "" "." 9470 + dir="$func_dirname_result" 9471 + if test "X$dir" = X.; then 9472 + odir="$objdir" 9473 + else 9474 + odir="$dir/$objdir" 9475 + fi 9476 + func_basename "$file" 9477 + name="$func_basename_result" 9478 + test "$opt_mode" = uninstall && odir="$dir" 9479 + 9480 + # Remember odir for removal later, being careful to avoid duplicates 9481 + if test "$opt_mode" = clean; then 9482 + case " $rmdirs " in 9483 + *" $odir "*) ;; 9484 + *) func_append rmdirs " $odir" ;; 9485 + esac 9486 + fi 9487 + 9488 + # Don't error if the file doesn't exist and rm -f was used. 9489 + if { test -L "$file"; } >/dev/null 2>&1 || 9490 + { test -h "$file"; } >/dev/null 2>&1 || 9491 + test -f "$file"; then 9492 + : 9493 + elif test -d "$file"; then 9494 + exit_status=1 9495 + continue 9496 + elif test "$rmforce" = yes; then 9497 + continue 9498 + fi 9499 + 9500 + rmfiles="$file" 9501 + 9502 + case $name in 9503 + *.la) 9504 + # Possibly a libtool archive, so verify it. 9505 + if func_lalib_p "$file"; then 9506 + func_source $dir/$name 9507 + 9508 + # Delete the libtool libraries and symlinks. 9509 + for n in $library_names; do 9510 + func_append rmfiles " $odir/$n" 9511 + done 9512 + test -n "$old_library" && func_append rmfiles " $odir/$old_library" 9513 + 9514 + case "$opt_mode" in 9515 + clean) 9516 + case " $library_names " in 9517 + *" $dlname "*) ;; 9518 + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; 9519 + esac 9520 + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" 9521 + ;; 9522 + uninstall) 9523 + if test -n "$library_names"; then 9524 + # Do each command in the postuninstall commands. 9525 + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' 9526 + fi 9527 + 9528 + if test -n "$old_library"; then 9529 + # Do each command in the old_postuninstall commands. 9530 + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' 9531 + fi 9532 + # FIXME: should reinstall the best remaining shared library. 9533 + ;; 9534 + esac 9535 + fi 9536 + ;; 9537 + 9538 + *.lo) 9539 + # Possibly a libtool object, so verify it. 9540 + if func_lalib_p "$file"; then 9541 + 9542 + # Read the .lo file 9543 + func_source $dir/$name 9544 + 9545 + # Add PIC object to the list of files to remove. 9546 + if test -n "$pic_object" && 9547 + test "$pic_object" != none; then 9548 + func_append rmfiles " $dir/$pic_object" 9549 + fi 9550 + 9551 + # Add non-PIC object to the list of files to remove. 9552 + if test -n "$non_pic_object" && 9553 + test "$non_pic_object" != none; then 9554 + func_append rmfiles " $dir/$non_pic_object" 9555 + fi 9556 + fi 9557 + ;; 9558 + 9559 + *) 9560 + if test "$opt_mode" = clean ; then 9561 + noexename=$name 9562 + case $file in 9563 + *.exe) 9564 + func_stripname '' '.exe' "$file" 9565 + file=$func_stripname_result 9566 + func_stripname '' '.exe' "$name" 9567 + noexename=$func_stripname_result 9568 + # $file with .exe has already been added to rmfiles, 9569 + # add $file without .exe 9570 + func_append rmfiles " $file" 9571 + ;; 9572 + esac 9573 + # Do a test to see if this is a libtool program. 9574 + if func_ltwrapper_p "$file"; then 9575 + if func_ltwrapper_executable_p "$file"; then 9576 + func_ltwrapper_scriptname "$file" 9577 + relink_command= 9578 + func_source $func_ltwrapper_scriptname_result 9579 + func_append rmfiles " $func_ltwrapper_scriptname_result" 9580 + else 9581 + relink_command= 9582 + func_source $dir/$noexename 9583 + fi 9584 + 9585 + # note $name still contains .exe if it was in $file originally 9586 + # as does the version of $file that was added into $rmfiles 9587 + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" 9588 + if test "$fast_install" = yes && test -n "$relink_command"; then 9589 + func_append rmfiles " $odir/lt-$name" 9590 + fi 9591 + if test "X$noexename" != "X$name" ; then 9592 + func_append rmfiles " $odir/lt-${noexename}.c" 9593 + fi 9594 + fi 9595 + fi 9596 + ;; 9597 + esac 9598 + func_show_eval "$RM $rmfiles" 'exit_status=1' 9599 + done 9600 + 9601 + # Try to remove the ${objdir}s in the directories where we deleted files 9602 + for dir in $rmdirs; do 9603 + if test -d "$dir"; then 9604 + func_show_eval "rmdir $dir >/dev/null 2>&1" 9605 + fi 9606 + done 9607 + 9608 + exit $exit_status 9609 +} 9610 + 9611 +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && 9612 + func_mode_uninstall ${1+"$@"} 9613 + 9614 +test -z "$opt_mode" && { 9615 + help="$generic_help" 9616 + func_fatal_help "you must specify a MODE" 9617 +} 9618 + 9619 +test -z "$exec_cmd" && \ 9620 + func_fatal_help "invalid operation mode \`$opt_mode'" 9621 + 9622 +if test -n "$exec_cmd"; then 9623 + eval exec "$exec_cmd" 9624 + exit $EXIT_FAILURE 9625 +fi 9626 + 9627 +exit $exit_status 9628 + 9629 + 9630 +# The TAGs below are defined such that we never get into a situation 9631 +# in which we disable both kinds of libraries. Given conflicting 9632 +# choices, we go for a static library, that is the most portable, 9633 +# since we can't tell whether shared libraries were disabled because 9634 +# the user asked for that or because the platform doesn't support 9635 +# them. This is particularly important on AIX, because we don't 9636 +# support having both static and shared libraries enabled at the same 9637 +# time on that platform, so we default to a shared-only configuration. 9638 +# If a disable-shared tag is given, we'll fallback to a static-only 9639 +# configuration. But we'll never go from static-only to shared-only. 9640 + 9641 +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared 9642 +build_libtool_libs=no 9643 +build_old_libs=yes 9644 +# ### END LIBTOOL TAG CONFIG: disable-shared 9645 + 9646 +# ### BEGIN LIBTOOL TAG CONFIG: disable-static 9647 +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` 9648 +# ### END LIBTOOL TAG CONFIG: disable-static 9649 + 9650 +# Local Variables: 9651 +# mode:shell-script 9652 +# sh-indentation:2 9653 +# End: 9654 +# vi:sw=2 9655 +
Added m4/libtool.m4.
1 +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- 2 +# 3 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 4 +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software 5 +# Foundation, Inc. 6 +# Written by Gordon Matzigkeit, 1996 7 +# 8 +# This file is free software; the Free Software Foundation gives 9 +# unlimited permission to copy and/or distribute it, with or without 10 +# modifications, as long as this notice is preserved. 11 + 12 +m4_define([_LT_COPYING], [dnl 13 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 14 +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software 15 +# Foundation, Inc. 16 +# Written by Gordon Matzigkeit, 1996 17 +# 18 +# This file is part of GNU Libtool. 19 +# 20 +# GNU Libtool is free software; you can redistribute it and/or 21 +# modify it under the terms of the GNU General Public License as 22 +# published by the Free Software Foundation; either version 2 of 23 +# the License, or (at your option) any later version. 24 +# 25 +# As a special exception to the GNU General Public License, 26 +# if you distribute this file as part of a program or library that 27 +# is built using GNU Libtool, you may include this file under the 28 +# same distribution terms that you use for the rest of that program. 29 +# 30 +# GNU Libtool is distributed in the hope that it will be useful, 31 +# but WITHOUT ANY WARRANTY; without even the implied warranty of 32 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 33 +# GNU General Public License for more details. 34 +# 35 +# You should have received a copy of the GNU General Public License 36 +# along with GNU Libtool; see the file COPYING. If not, a copy 37 +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or 38 +# obtained by writing to the Free Software Foundation, Inc., 39 +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 40 +]) 41 + 42 +# serial 57 LT_INIT 43 + 44 + 45 +# LT_PREREQ(VERSION) 46 +# ------------------ 47 +# Complain and exit if this libtool version is less that VERSION. 48 +m4_defun([LT_PREREQ], 49 +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, 50 + [m4_default([$3], 51 + [m4_fatal([Libtool version $1 or higher is required], 52 + 63)])], 53 + [$2])]) 54 + 55 + 56 +# _LT_CHECK_BUILDDIR 57 +# ------------------ 58 +# Complain if the absolute build directory name contains unusual characters 59 +m4_defun([_LT_CHECK_BUILDDIR], 60 +[case `pwd` in 61 + *\ * | *\ *) 62 + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; 63 +esac 64 +]) 65 + 66 + 67 +# LT_INIT([OPTIONS]) 68 +# ------------------ 69 +AC_DEFUN([LT_INIT], 70 +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT 71 +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl 72 +AC_BEFORE([$0], [LT_LANG])dnl 73 +AC_BEFORE([$0], [LT_OUTPUT])dnl 74 +AC_BEFORE([$0], [LTDL_INIT])dnl 75 +m4_require([_LT_CHECK_BUILDDIR])dnl 76 + 77 +dnl Autoconf doesn't catch unexpanded LT_ macros by default: 78 +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl 79 +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl 80 +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 81 +dnl unless we require an AC_DEFUNed macro: 82 +AC_REQUIRE([LTOPTIONS_VERSION])dnl 83 +AC_REQUIRE([LTSUGAR_VERSION])dnl 84 +AC_REQUIRE([LTVERSION_VERSION])dnl 85 +AC_REQUIRE([LTOBSOLETE_VERSION])dnl 86 +m4_require([_LT_PROG_LTMAIN])dnl 87 + 88 +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) 89 + 90 +dnl Parse OPTIONS 91 +_LT_SET_OPTIONS([$0], [$1]) 92 + 93 +# This can be used to rebuild libtool when needed 94 +LIBTOOL_DEPS="$ltmain" 95 + 96 +# Always use our own libtool. 97 +LIBTOOL='$(SHELL) $(top_builddir)/libtool' 98 +AC_SUBST(LIBTOOL)dnl 99 + 100 +_LT_SETUP 101 + 102 +# Only expand once: 103 +m4_define([LT_INIT]) 104 +])# LT_INIT 105 + 106 +# Old names: 107 +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) 108 +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) 109 +dnl aclocal-1.4 backwards compatibility: 110 +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) 111 +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) 112 + 113 + 114 +# _LT_CC_BASENAME(CC) 115 +# ------------------- 116 +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. 117 +m4_defun([_LT_CC_BASENAME], 118 +[for cc_temp in $1""; do 119 + case $cc_temp in 120 + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; 121 + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; 122 + \-*) ;; 123 + *) break;; 124 + esac 125 +done 126 +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` 127 +]) 128 + 129 + 130 +# _LT_FILEUTILS_DEFAULTS 131 +# ---------------------- 132 +# It is okay to use these file commands and assume they have been set 133 +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. 134 +m4_defun([_LT_FILEUTILS_DEFAULTS], 135 +[: ${CP="cp -f"} 136 +: ${MV="mv -f"} 137 +: ${RM="rm -f"} 138 +])# _LT_FILEUTILS_DEFAULTS 139 + 140 + 141 +# _LT_SETUP 142 +# --------- 143 +m4_defun([_LT_SETUP], 144 +[AC_REQUIRE([AC_CANONICAL_HOST])dnl 145 +AC_REQUIRE([AC_CANONICAL_BUILD])dnl 146 +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl 147 +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl 148 + 149 +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl 150 +dnl 151 +_LT_DECL([], [host_alias], [0], [The host system])dnl 152 +_LT_DECL([], [host], [0])dnl 153 +_LT_DECL([], [host_os], [0])dnl 154 +dnl 155 +_LT_DECL([], [build_alias], [0], [The build system])dnl 156 +_LT_DECL([], [build], [0])dnl 157 +_LT_DECL([], [build_os], [0])dnl 158 +dnl 159 +AC_REQUIRE([AC_PROG_CC])dnl 160 +AC_REQUIRE([LT_PATH_LD])dnl 161 +AC_REQUIRE([LT_PATH_NM])dnl 162 +dnl 163 +AC_REQUIRE([AC_PROG_LN_S])dnl 164 +test -z "$LN_S" && LN_S="ln -s" 165 +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl 166 +dnl 167 +AC_REQUIRE([LT_CMD_MAX_LEN])dnl 168 +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl 169 +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl 170 +dnl 171 +m4_require([_LT_FILEUTILS_DEFAULTS])dnl 172 +m4_require([_LT_CHECK_SHELL_FEATURES])dnl 173 +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl 174 +m4_require([_LT_CMD_RELOAD])dnl 175 +m4_require([_LT_CHECK_MAGIC_METHOD])dnl 176 +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl 177 +m4_require([_LT_CMD_OLD_ARCHIVE])dnl 178 +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl 179 +m4_require([_LT_WITH_SYSROOT])dnl 180 + 181 +_LT_CONFIG_LIBTOOL_INIT([ 182 +# See if we are running on zsh, and set the options which allow our 183 +# commands through without removal of \ escapes INIT. 184 +if test -n "\${ZSH_VERSION+set}" ; then 185 + setopt NO_GLOB_SUBST 186 +fi 187 +]) 188 +if test -n "${ZSH_VERSION+set}" ; then 189 + setopt NO_GLOB_SUBST 190 +fi 191 + 192 +_LT_CHECK_OBJDIR 193 + 194 +m4_require([_LT_TAG_COMPILER])dnl 195 + 196 +case $host_os in 197 +aix3*) 198 + # AIX sometimes has problems with the GCC collect2 program. For some 199 + # reason, if we set the COLLECT_NAMES environment variable, the problems 200 + # vanish in a puff of smoke. 201 + if test "X${COLLECT_NAMES+set}" != Xset; then 202 + COLLECT_NAMES= 203 + export COLLECT_NAMES 204 + fi 205 + ;; 206 +esac 207 + 208 +# Global variables: 209 +ofile=libtool 210 +can_build_shared=yes 211 + 212 +# All known linkers require a `.a' archive for static linking (except MSVC, 213 +# which needs '.lib'). 214 +libext=a 215 + 216 +with_gnu_ld="$lt_cv_prog_gnu_ld" 217 + 218 +old_CC="$CC" 219 +old_CFLAGS="$CFLAGS" 220 + 221 +# Set sane defaults for various variables 222 +test -z "$CC" && CC=cc 223 +test -z "$LTCC" && LTCC=$CC 224 +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS 225 +test -z "$LD" && LD=ld 226 +test -z "$ac_objext" && ac_objext=o 227 + 228 +_LT_CC_BASENAME([$compiler]) 229 + 230 +# Only perform the check for file, if the check method requires it 231 +test -z "$MAGIC_CMD" && MAGIC_CMD=file 232 +case $deplibs_check_method in 233 +file_magic*) 234 + if test "$file_magic_cmd" = '$MAGIC_CMD'; then 235 + _LT_PATH_MAGIC 236 + fi 237 + ;; 238 +esac 239 + 240 +# Use C for the default configuration in the libtool script 241 +LT_SUPPORTED_TAG([CC]) 242 +_LT_LANG_C_CONFIG 243 +_LT_LANG_DEFAULT_CONFIG 244 +_LT_CONFIG_COMMANDS 245 +])# _LT_SETUP 246 + 247 + 248 +# _LT_PREPARE_SED_QUOTE_VARS 249 +# -------------------------- 250 +# Define a few sed substitution that help us do robust quoting. 251 +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], 252 +[# Backslashify metacharacters that are still active within 253 +# double-quoted strings. 254 +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' 255 + 256 +# Same as above, but do not quote variable references. 257 +double_quote_subst='s/\([["`\\]]\)/\\\1/g' 258 + 259 +# Sed substitution to delay expansion of an escaped shell variable in a 260 +# double_quote_subst'ed string. 261 +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' 262 + 263 +# Sed substitution to delay expansion of an escaped single quote. 264 +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' 265 + 266 +# Sed substitution to avoid accidental globbing in evaled expressions 267 +no_glob_subst='s/\*/\\\*/g' 268 +]) 269 + 270 +# _LT_PROG_LTMAIN 271 +# --------------- 272 +# Note that this code is called both from `configure', and `config.status' 273 +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, 274 +# `config.status' has no value for ac_aux_dir unless we are using Automake, 275 +# so we pass a copy along to make sure it has a sensible value anyway. 276 +m4_defun([_LT_PROG_LTMAIN], 277 +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl 278 +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) 279 +ltmain="$ac_aux_dir/ltmain.sh" 280 +])# _LT_PROG_LTMAIN 281 + 282 + 283 +## ------------------------------------- ## 284 +## Accumulate code for creating libtool. ## 285 +## ------------------------------------- ## 286 + 287 +# So that we can recreate a full libtool script including additional 288 +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS 289 +# in macros and then make a single call at the end using the `libtool' 290 +# label. 291 + 292 + 293 +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) 294 +# ---------------------------------------- 295 +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. 296 +m4_define([_LT_CONFIG_LIBTOOL_INIT], 297 +[m4_ifval([$1], 298 + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], 299 + [$1 300 +])])]) 301 + 302 +# Initialize. 303 +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) 304 + 305 + 306 +# _LT_CONFIG_LIBTOOL([COMMANDS]) 307 +# ------------------------------ 308 +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. 309 +m4_define([_LT_CONFIG_LIBTOOL], 310 +[m4_ifval([$1], 311 + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], 312 + [$1 313 +])])]) 314 + 315 +# Initialize. 316 +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) 317 + 318 + 319 +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) 320 +# ----------------------------------------------------- 321 +m4_defun([_LT_CONFIG_SAVE_COMMANDS], 322 +[_LT_CONFIG_LIBTOOL([$1]) 323 +_LT_CONFIG_LIBTOOL_INIT([$2]) 324 +]) 325 + 326 + 327 +# _LT_FORMAT_COMMENT([COMMENT]) 328 +# ----------------------------- 329 +# Add leading comment marks to the start of each line, and a trailing 330 +# full-stop to the whole comment if one is not present already. 331 +m4_define([_LT_FORMAT_COMMENT], 332 +[m4_ifval([$1], [ 333 +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], 334 + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) 335 +)]) 336 + 337 + 338 + 339 +## ------------------------ ## 340 +## FIXME: Eliminate VARNAME ## 341 +## ------------------------ ## 342 + 343 + 344 +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) 345 +# ------------------------------------------------------------------- 346 +# CONFIGNAME is the name given to the value in the libtool script. 347 +# VARNAME is the (base) name used in the configure script. 348 +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on 349 +# VARNAME. Any other value will be used directly. 350 +m4_define([_LT_DECL], 351 +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], 352 + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], 353 + [m4_ifval([$1], [$1], [$2])]) 354 + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) 355 + m4_ifval([$4], 356 + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) 357 + lt_dict_add_subkey([lt_decl_dict], [$2], 358 + [tagged?], [m4_ifval([$5], [yes], [no])])]) 359 +]) 360 + 361 + 362 +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) 363 +# -------------------------------------------------------- 364 +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) 365 + 366 + 367 +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) 368 +# ------------------------------------------------ 369 +m4_define([lt_decl_tag_varnames], 370 +[_lt_decl_filter([tagged?], [yes], $@)]) 371 + 372 + 373 +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) 374 +# --------------------------------------------------------- 375 +m4_define([_lt_decl_filter], 376 +[m4_case([$#], 377 + [0], [m4_fatal([$0: too few arguments: $#])], 378 + [1], [m4_fatal([$0: too few arguments: $#: $1])], 379 + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], 380 + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], 381 + [lt_dict_filter([lt_decl_dict], $@)])[]dnl 382 +]) 383 + 384 + 385 +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) 386 +# -------------------------------------------------- 387 +m4_define([lt_decl_quote_varnames], 388 +[_lt_decl_filter([value], [1], $@)]) 389 + 390 + 391 +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) 392 +# --------------------------------------------------- 393 +m4_define([lt_decl_dquote_varnames], 394 +[_lt_decl_filter([value], [2], $@)]) 395 + 396 + 397 +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) 398 +# --------------------------------------------------- 399 +m4_define([lt_decl_varnames_tagged], 400 +[m4_assert([$# <= 2])dnl 401 +_$0(m4_quote(m4_default([$1], [[, ]])), 402 + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), 403 + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) 404 +m4_define([_lt_decl_varnames_tagged], 405 +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) 406 + 407 + 408 +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) 409 +# ------------------------------------------------ 410 +m4_define([lt_decl_all_varnames], 411 +[_$0(m4_quote(m4_default([$1], [[, ]])), 412 + m4_if([$2], [], 413 + m4_quote(lt_decl_varnames), 414 + m4_quote(m4_shift($@))))[]dnl 415 +]) 416 +m4_define([_lt_decl_all_varnames], 417 +[lt_join($@, lt_decl_varnames_tagged([$1], 418 + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl 419 +]) 420 + 421 + 422 +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) 423 +# ------------------------------------ 424 +# Quote a variable value, and forward it to `config.status' so that its 425 +# declaration there will have the same value as in `configure'. VARNAME 426 +# must have a single quote delimited value for this to work. 427 +m4_define([_LT_CONFIG_STATUS_DECLARE], 428 +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) 429 + 430 + 431 +# _LT_CONFIG_STATUS_DECLARATIONS 432 +# ------------------------------ 433 +# We delimit libtool config variables with single quotes, so when 434 +# we write them to config.status, we have to be sure to quote all 435 +# embedded single quotes properly. In configure, this macro expands 436 +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: 437 +# 438 +# <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`' 439 +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], 440 +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), 441 + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) 442 + 443 + 444 +# _LT_LIBTOOL_TAGS 445 +# ---------------- 446 +# Output comment and list of tags supported by the script 447 +m4_defun([_LT_LIBTOOL_TAGS], 448 +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl 449 +available_tags="_LT_TAGS"dnl 450 +]) 451 + 452 + 453 +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) 454 +# ----------------------------------- 455 +# Extract the dictionary values for VARNAME (optionally with TAG) and 456 +# expand to a commented shell variable setting: 457 +# 458 +# # Some comment about what VAR is for. 459 +# visible_name=$lt_internal_name 460 +m4_define([_LT_LIBTOOL_DECLARE], 461 +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], 462 + [description])))[]dnl 463 +m4_pushdef([_libtool_name], 464 + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl 465 +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), 466 + [0], [_libtool_name=[$]$1], 467 + [1], [_libtool_name=$lt_[]$1], 468 + [2], [_libtool_name=$lt_[]$1], 469 + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl 470 +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl 471 +]) 472 + 473 + 474 +# _LT_LIBTOOL_CONFIG_VARS 475 +# ----------------------- 476 +# Produce commented declarations of non-tagged libtool config variables 477 +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' 478 +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG 479 +# section) are produced by _LT_LIBTOOL_TAG_VARS. 480 +m4_defun([_LT_LIBTOOL_CONFIG_VARS], 481 +[m4_foreach([_lt_var], 482 + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), 483 + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) 484 + 485 + 486 +# _LT_LIBTOOL_TAG_VARS(TAG) 487 +# ------------------------- 488 +m4_define([_LT_LIBTOOL_TAG_VARS], 489 +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), 490 + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) 491 + 492 + 493 +# _LT_TAGVAR(VARNAME, [TAGNAME]) 494 +# ------------------------------ 495 +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) 496 + 497 + 498 +# _LT_CONFIG_COMMANDS 499 +# ------------------- 500 +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of 501 +# variables for single and double quote escaping we saved from calls 502 +# to _LT_DECL, we can put quote escaped variables declarations 503 +# into `config.status', and then the shell code to quote escape them in 504 +# for loops in `config.status'. Finally, any additional code accumulated 505 +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. 506 +m4_defun([_LT_CONFIG_COMMANDS], 507 +[AC_PROVIDE_IFELSE([LT_OUTPUT], 508 + dnl If the libtool generation code has been placed in $CONFIG_LT, 509 + dnl instead of duplicating it all over again into config.status, 510 + dnl then we will have config.status run $CONFIG_LT later, so it 511 + dnl needs to know what name is stored there: 512 + [AC_CONFIG_COMMANDS([libtool], 513 + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], 514 + dnl If the libtool generation code is destined for config.status, 515 + dnl expand the accumulated commands and init code now: 516 + [AC_CONFIG_COMMANDS([libtool], 517 + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) 518 +])#_LT_CONFIG_COMMANDS 519 + 520 + 521 +# Initialize. 522 +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], 523 +[ 524 + 525 +# The HP-UX ksh and POSIX shell print the target directory to stdout 526 +# if CDPATH is set. 527 +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH 528 + 529 +sed_quote_subst='$sed_quote_subst' 530 +double_quote_subst='$double_quote_subst' 531 +delay_variable_subst='$delay_variable_subst' 532 +_LT_CONFIG_STATUS_DECLARATIONS 533 +LTCC='$LTCC' 534 +LTCFLAGS='$LTCFLAGS' 535 +compiler='$compiler_DEFAULT' 536 + 537 +# A function that is used when there is no print builtin or printf. 538 +func_fallback_echo () 539 +{ 540 + eval 'cat <<_LTECHO_EOF 541 +\$[]1 542 +_LTECHO_EOF' 543 +} 544 + 545 +# Quote evaled strings. 546 +for var in lt_decl_all_varnames([[ \ 547 +]], lt_decl_quote_varnames); do 548 + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in 549 + *[[\\\\\\\`\\"\\\$]]*) 550 + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" 551 + ;; 552 + *) 553 + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" 554 + ;; 555 + esac 556 +done 557 + 558 +# Double-quote double-evaled strings. 559 +for var in lt_decl_all_varnames([[ \ 560 +]], lt_decl_dquote_varnames); do 561 + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in 562 + *[[\\\\\\\`\\"\\\$]]*) 563 + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" 564 + ;; 565 + *) 566 + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" 567 + ;; 568 + esac 569 +done 570 + 571 +_LT_OUTPUT_LIBTOOL_INIT 572 +]) 573 + 574 +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) 575 +# ------------------------------------ 576 +# Generate a child script FILE with all initialization necessary to 577 +# reuse the environment learned by the parent script, and make the 578 +# file executable. If COMMENT is supplied, it is inserted after the 579 +# `#!' sequence but before initialization text begins. After this 580 +# macro, additional text can be appended to FILE to form the body of 581 +# the child script. The macro ends with non-zero status if the 582 +# file could not be fully written (such as if the disk is full). 583 +m4_ifdef([AS_INIT_GENERATED], 584 +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], 585 +[m4_defun([_LT_GENERATED_FILE_INIT], 586 +[m4_require([AS_PREPARE])]dnl 587 +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl 588 +[lt_write_fail=0 589 +cat >$1 <<_ASEOF || lt_write_fail=1 590 +#! $SHELL 591 +# Generated by $as_me. 592 +$2 593 +SHELL=\${CONFIG_SHELL-$SHELL} 594 +export SHELL 595 +_ASEOF 596 +cat >>$1 <<\_ASEOF || lt_write_fail=1 597 +AS_SHELL_SANITIZE 598 +_AS_PREPARE 599 +exec AS_MESSAGE_FD>&1 600 +_ASEOF 601 +test $lt_write_fail = 0 && chmod +x $1[]dnl 602 +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT 603 + 604 +# LT_OUTPUT 605 +# --------- 606 +# This macro allows early generation of the libtool script (before 607 +# AC_OUTPUT is called), incase it is used in configure for compilation 608 +# tests. 609 +AC_DEFUN([LT_OUTPUT], 610 +[: ${CONFIG_LT=./config.lt} 611 +AC_MSG_NOTICE([creating $CONFIG_LT]) 612 +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], 613 +[# Run this file to recreate a libtool stub with the current configuration.]) 614 + 615 +cat >>"$CONFIG_LT" <<\_LTEOF 616 +lt_cl_silent=false 617 +exec AS_MESSAGE_LOG_FD>>config.log 618 +{ 619 + echo 620 + AS_BOX([Running $as_me.]) 621 +} >&AS_MESSAGE_LOG_FD 622 + 623 +lt_cl_help="\ 624 +\`$as_me' creates a local libtool stub from the current configuration, 625 +for use in further configure time tests before the real libtool is 626 +generated. 627 + 628 +Usage: $[0] [[OPTIONS]] 629 + 630 + -h, --help print this help, then exit 631 + -V, --version print version number, then exit 632 + -q, --quiet do not print progress messages 633 + -d, --debug don't remove temporary files 634 + 635 +Report bugs to <bug-libtool@gnu.org>." 636 + 637 +lt_cl_version="\ 638 +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl 639 +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) 640 +configured by $[0], generated by m4_PACKAGE_STRING. 641 + 642 +Copyright (C) 2011 Free Software Foundation, Inc. 643 +This config.lt script is free software; the Free Software Foundation 644 +gives unlimited permision to copy, distribute and modify it." 645 + 646 +while test $[#] != 0 647 +do 648 + case $[1] in 649 + --version | --v* | -V ) 650 + echo "$lt_cl_version"; exit 0 ;; 651 + --help | --h* | -h ) 652 + echo "$lt_cl_help"; exit 0 ;; 653 + --debug | --d* | -d ) 654 + debug=: ;; 655 + --quiet | --q* | --silent | --s* | -q ) 656 + lt_cl_silent=: ;; 657 + 658 + -*) AC_MSG_ERROR([unrecognized option: $[1] 659 +Try \`$[0] --help' for more information.]) ;; 660 + 661 + *) AC_MSG_ERROR([unrecognized argument: $[1] 662 +Try \`$[0] --help' for more information.]) ;; 663 + esac 664 + shift 665 +done 666 + 667 +if $lt_cl_silent; then 668 + exec AS_MESSAGE_FD>/dev/null 669 +fi 670 +_LTEOF 671 + 672 +cat >>"$CONFIG_LT" <<_LTEOF 673 +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT 674 +_LTEOF 675 + 676 +cat >>"$CONFIG_LT" <<\_LTEOF 677 +AC_MSG_NOTICE([creating $ofile]) 678 +_LT_OUTPUT_LIBTOOL_COMMANDS 679 +AS_EXIT(0) 680 +_LTEOF 681 +chmod +x "$CONFIG_LT" 682 + 683 +# configure is writing to config.log, but config.lt does its own redirection, 684 +# appending to config.log, which fails on DOS, as config.log is still kept 685 +# open by configure. Here we exec the FD to /dev/null, effectively closing 686 +# config.log, so it can be properly (re)opened and appended to by config.lt. 687 +lt_cl_success=: 688 +test "$silent" = yes && 689 + lt_config_lt_args="$lt_config_lt_args --quiet" 690 +exec AS_MESSAGE_LOG_FD>/dev/null 691 +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false 692 +exec AS_MESSAGE_LOG_FD>>config.log 693 +$lt_cl_success || AS_EXIT(1) 694 +])# LT_OUTPUT 695 + 696 + 697 +# _LT_CONFIG(TAG) 698 +# --------------- 699 +# If TAG is the built-in tag, create an initial libtool script with a 700 +# default configuration from the untagged config vars. Otherwise add code 701 +# to config.status for appending the configuration named by TAG from the 702 +# matching tagged config vars. 703 +m4_defun([_LT_CONFIG], 704 +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl 705 +_LT_CONFIG_SAVE_COMMANDS([ 706 + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl 707 + m4_if(_LT_TAG, [C], [ 708 + # See if we are running on zsh, and set the options which allow our 709 + # commands through without removal of \ escapes. 710 + if test -n "${ZSH_VERSION+set}" ; then 711 + setopt NO_GLOB_SUBST 712 + fi 713 + 714 + cfgfile="${ofile}T" 715 + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 716 + $RM "$cfgfile" 717 + 718 + cat <<_LT_EOF >> "$cfgfile" 719 +#! $SHELL 720 + 721 +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. 722 +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION 723 +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: 724 +# NOTE: Changes made to this file will be lost: look at ltmain.sh. 725 +# 726 +_LT_COPYING 727 +_LT_LIBTOOL_TAGS 728 + 729 +# ### BEGIN LIBTOOL CONFIG 730 +_LT_LIBTOOL_CONFIG_VARS 731 +_LT_LIBTOOL_TAG_VARS 732 +# ### END LIBTOOL CONFIG 733 + 734 +_LT_EOF 735 + 736 + case $host_os in 737 + aix3*) 738 + cat <<\_LT_EOF >> "$cfgfile" 739 +# AIX sometimes has problems with the GCC collect2 program. For some 740 +# reason, if we set the COLLECT_NAMES environment variable, the problems 741 +# vanish in a puff of smoke. 742 +if test "X${COLLECT_NAMES+set}" != Xset; then 743 + COLLECT_NAMES= 744 + export COLLECT_NAMES 745 +fi 746 +_LT_EOF 747 + ;; 748 + esac 749 + 750 + _LT_PROG_LTMAIN 751 + 752 + # We use sed instead of cat because bash on DJGPP gets confused if 753 + # if finds mixed CR/LF and LF-only lines. Since sed operates in 754 + # text mode, it properly converts lines to CR/LF. This bash problem 755 + # is reportedly fixed, but why not run on old versions too? 756 + sed '$q' "$ltmain" >> "$cfgfile" \ 757 + || (rm -f "$cfgfile"; exit 1) 758 + 759 + _LT_PROG_REPLACE_SHELLFNS 760 + 761 + mv -f "$cfgfile" "$ofile" || 762 + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") 763 + chmod +x "$ofile" 764 +], 765 +[cat <<_LT_EOF >> "$ofile" 766 + 767 +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded 768 +dnl in a comment (ie after a #). 769 +# ### BEGIN LIBTOOL TAG CONFIG: $1 770 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) 771 +# ### END LIBTOOL TAG CONFIG: $1 772 +_LT_EOF 773 +])dnl /m4_if 774 +], 775 +[m4_if([$1], [], [ 776 + PACKAGE='$PACKAGE' 777 + VERSION='$VERSION' 778 + TIMESTAMP='$TIMESTAMP' 779 + RM='$RM' 780 + ofile='$ofile'], []) 781 +])dnl /_LT_CONFIG_SAVE_COMMANDS 782 +])# _LT_CONFIG 783 + 784 + 785 +# LT_SUPPORTED_TAG(TAG) 786 +# --------------------- 787 +# Trace this macro to discover what tags are supported by the libtool 788 +# --tag option, using: 789 +# autoconf --trace 'LT_SUPPORTED_TAG:$1' 790 +AC_DEFUN([LT_SUPPORTED_TAG], []) 791 + 792 + 793 +# C support is built-in for now 794 +m4_define([_LT_LANG_C_enabled], []) 795 +m4_define([_LT_TAGS], []) 796 + 797 + 798 +# LT_LANG(LANG) 799 +# ------------- 800 +# Enable libtool support for the given language if not already enabled. 801 +AC_DEFUN([LT_LANG], 802 +[AC_BEFORE([$0], [LT_OUTPUT])dnl 803 +m4_case([$1], 804 + [C], [_LT_LANG(C)], 805 + [C++], [_LT_LANG(CXX)], 806 + [Go], [_LT_LANG(GO)], 807 + [Java], [_LT_LANG(GCJ)], 808 + [Fortran 77], [_LT_LANG(F77)], 809 + [Fortran], [_LT_LANG(FC)], 810 + [Windows Resource], [_LT_LANG(RC)], 811 + [m4_ifdef([_LT_LANG_]$1[_CONFIG], 812 + [_LT_LANG($1)], 813 + [m4_fatal([$0: unsupported language: "$1"])])])dnl 814 +])# LT_LANG 815 + 816 + 817 +# _LT_LANG(LANGNAME) 818 +# ------------------ 819 +m4_defun([_LT_LANG], 820 +[m4_ifdef([_LT_LANG_]$1[_enabled], [], 821 + [LT_SUPPORTED_TAG([$1])dnl 822 + m4_append([_LT_TAGS], [$1 ])dnl 823 + m4_define([_LT_LANG_]$1[_enabled], [])dnl 824 + _LT_LANG_$1_CONFIG($1)])dnl 825 +])# _LT_LANG 826 + 827 + 828 +m4_ifndef([AC_PROG_GO], [ 829 +############################################################ 830 +# NOTE: This macro has been submitted for inclusion into # 831 +# GNU Autoconf as AC_PROG_GO. When it is available in # 832 +# a released version of Autoconf we should remove this # 833 +# macro and use it instead. # 834 +############################################################ 835 +m4_defun([AC_PROG_GO], 836 +[AC_LANG_PUSH(Go)dnl 837 +AC_ARG_VAR([GOC], [Go compiler command])dnl 838 +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl 839 +_AC_ARG_VAR_LDFLAGS()dnl 840 +AC_CHECK_TOOL(GOC, gccgo) 841 +if test -z "$GOC"; then 842 + if test -n "$ac_tool_prefix"; then 843 + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) 844 + fi 845 +fi 846 +if test -z "$GOC"; then 847 + AC_CHECK_PROG(GOC, gccgo, gccgo, false) 848 +fi 849 +])#m4_defun 850 +])#m4_ifndef 851 + 852 + 853 +# _LT_LANG_DEFAULT_CONFIG 854 +# ----------------------- 855 +m4_defun([_LT_LANG_DEFAULT_CONFIG], 856 +[AC_PROVIDE_IFELSE([AC_PROG_CXX], 857 + [LT_LANG(CXX)], 858 + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) 859 + 860 +AC_PROVIDE_IFELSE([AC_PROG_F77], 861 + [LT_LANG(F77)], 862 + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) 863 + 864 +AC_PROVIDE_IFELSE([AC_PROG_FC], 865 + [LT_LANG(FC)], 866 + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) 867 + 868 +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal 869 +dnl pulling things in needlessly. 870 +AC_PROVIDE_IFELSE([AC_PROG_GCJ], 871 + [LT_LANG(GCJ)], 872 + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], 873 + [LT_LANG(GCJ)], 874 + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], 875 + [LT_LANG(GCJ)], 876 + [m4_ifdef([AC_PROG_GCJ], 877 + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) 878 + m4_ifdef([A][M_PROG_GCJ], 879 + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) 880 + m4_ifdef([LT_PROG_GCJ], 881 + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) 882 + 883 +AC_PROVIDE_IFELSE([AC_PROG_GO], 884 + [LT_LANG(GO)], 885 + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) 886 + 887 +AC_PROVIDE_IFELSE([LT_PROG_RC], 888 + [LT_LANG(RC)], 889 + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) 890 +])# _LT_LANG_DEFAULT_CONFIG 891 + 892 +# Obsolete macros: 893 +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) 894 +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) 895 +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) 896 +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) 897 +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) 898 +dnl aclocal-1.4 backwards compatibility: 899 +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) 900 +dnl AC_DEFUN([AC_LIBTOOL_F77], []) 901 +dnl AC_DEFUN([AC_LIBTOOL_FC], []) 902 +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) 903 +dnl AC_DEFUN([AC_LIBTOOL_RC], []) 904 + 905 + 906 +# _LT_TAG_COMPILER 907 +# ---------------- 908 +m4_defun([_LT_TAG_COMPILER], 909 +[AC_REQUIRE([AC_PROG_CC])dnl 910 + 911 +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl 912 +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl 913 +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl 914 +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl 915 + 916 +# If no C compiler was specified, use CC. 917 +LTCC=${LTCC-"$CC"} 918 + 919 +# If no C compiler flags were specified, use CFLAGS. 920 +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} 921 + 922 +# Allow CC to be a program name with arguments. 923 +compiler=$CC 924 +])# _LT_TAG_COMPILER 925 + 926 + 927 +# _LT_COMPILER_BOILERPLATE 928 +# ------------------------ 929 +# Check for compiler boilerplate output or warnings with 930 +# the simple compiler test code. 931 +m4_defun([_LT_COMPILER_BOILERPLATE], 932 +[m4_require([_LT_DECL_SED])dnl 933 +ac_outfile=conftest.$ac_objext 934 +echo "$lt_simple_compile_test_code" >conftest.$ac_ext 935 +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err 936 +_lt_compiler_boilerplate=`cat conftest.err` 937 +$RM conftest* 938 +])# _LT_COMPILER_BOILERPLATE 939 + 940 + 941 +# _LT_LINKER_BOILERPLATE 942 +# ---------------------- 943 +# Check for linker boilerplate output or warnings with 944 +# the simple link test code. 945 +m4_defun([_LT_LINKER_BOILERPLATE], 946 +[m4_require([_LT_DECL_SED])dnl 947 +ac_outfile=conftest.$ac_objext 948 +echo "$lt_simple_link_test_code" >conftest.$ac_ext 949 +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err 950 +_lt_linker_boilerplate=`cat conftest.err` 951 +$RM -r conftest* 952 +])# _LT_LINKER_BOILERPLATE 953 + 954 +# _LT_REQUIRED_DARWIN_CHECKS 955 +# ------------------------- 956 +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ 957 + case $host_os in 958 + rhapsody* | darwin*) 959 + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) 960 + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) 961 + AC_CHECK_TOOL([LIPO], [lipo], [:]) 962 + AC_CHECK_TOOL([OTOOL], [otool], [:]) 963 + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) 964 + _LT_DECL([], [DSYMUTIL], [1], 965 + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) 966 + _LT_DECL([], [NMEDIT], [1], 967 + [Tool to change global to local symbols on Mac OS X]) 968 + _LT_DECL([], [LIPO], [1], 969 + [Tool to manipulate fat objects and archives on Mac OS X]) 970 + _LT_DECL([], [OTOOL], [1], 971 + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) 972 + _LT_DECL([], [OTOOL64], [1], 973 + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) 974 + 975 + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], 976 + [lt_cv_apple_cc_single_mod=no 977 + if test -z "${LT_MULTI_MODULE}"; then 978 + # By default we will add the -single_module flag. You can override 979 + # by either setting the environment variable LT_MULTI_MODULE 980 + # non-empty at configure time, or by adding -multi_module to the 981 + # link flags. 982 + rm -rf libconftest.dylib* 983 + echo "int foo(void){return 1;}" > conftest.c 984 + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ 985 +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD 986 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ 987 + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err 988 + _lt_result=$? 989 + # If there is a non-empty error log, and "single_module" 990 + # appears in it, assume the flag caused a linker warning 991 + if test -s conftest.err && $GREP single_module conftest.err; then 992 + cat conftest.err >&AS_MESSAGE_LOG_FD 993 + # Otherwise, if the output was created with a 0 exit code from 994 + # the compiler, it worked. 995 + elif test -f libconftest.dylib && test $_lt_result -eq 0; then 996 + lt_cv_apple_cc_single_mod=yes 997 + else 998 + cat conftest.err >&AS_MESSAGE_LOG_FD 999 + fi 1000 + rm -rf libconftest.dylib* 1001 + rm -f conftest.* 1002 + fi]) 1003 + 1004 + AC_CACHE_CHECK([for -exported_symbols_list linker flag], 1005 + [lt_cv_ld_exported_symbols_list], 1006 + [lt_cv_ld_exported_symbols_list=no 1007 + save_LDFLAGS=$LDFLAGS 1008 + echo "_main" > conftest.sym 1009 + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" 1010 + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], 1011 + [lt_cv_ld_exported_symbols_list=yes], 1012 + [lt_cv_ld_exported_symbols_list=no]) 1013 + LDFLAGS="$save_LDFLAGS" 1014 + ]) 1015 + 1016 + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], 1017 + [lt_cv_ld_force_load=no 1018 + cat > conftest.c << _LT_EOF 1019 +int forced_loaded() { return 2;} 1020 +_LT_EOF 1021 + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD 1022 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD 1023 + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD 1024 + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD 1025 + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD 1026 + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD 1027 + cat > conftest.c << _LT_EOF 1028 +int main() { return 0;} 1029 +_LT_EOF 1030 + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD 1031 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err 1032 + _lt_result=$? 1033 + if test -s conftest.err && $GREP force_load conftest.err; then 1034 + cat conftest.err >&AS_MESSAGE_LOG_FD 1035 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then 1036 + lt_cv_ld_force_load=yes 1037 + else 1038 + cat conftest.err >&AS_MESSAGE_LOG_FD 1039 + fi 1040 + rm -f conftest.err libconftest.a conftest conftest.c 1041 + rm -rf conftest.dSYM 1042 + ]) 1043 + case $host_os in 1044 + rhapsody* | darwin1.[[012]]) 1045 + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; 1046 + darwin1.*) 1047 + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 1048 + darwin*) # darwin 5.x on 1049 + # if running on 10.5 or later, the deployment target defaults 1050 + # to the OS version, if on x86, and 10.4, the deployment 1051 + # target defaults to 10.4. Don't you love it? 1052 + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 1053 + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) 1054 + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 1055 + 10.[[012]]*) 1056 + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 1057 + 10.*) 1058 + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 1059 + esac 1060 + ;; 1061 + esac 1062 + if test "$lt_cv_apple_cc_single_mod" = "yes"; then 1063 + _lt_dar_single_mod='$single_module' 1064 + fi 1065 + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then 1066 + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' 1067 + else 1068 + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' 1069 + fi 1070 + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then 1071 + _lt_dsymutil='~$DSYMUTIL $lib || :' 1072 + else 1073 + _lt_dsymutil= 1074 + fi 1075 + ;; 1076 + esac 1077 +]) 1078 + 1079 + 1080 +# _LT_DARWIN_LINKER_FEATURES([TAG]) 1081 +# --------------------------------- 1082 +# Checks for linker and compiler features on darwin 1083 +m4_defun([_LT_DARWIN_LINKER_FEATURES], 1084 +[ 1085 + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) 1086 + _LT_TAGVAR(archive_cmds_need_lc, $1)=no 1087 + _LT_TAGVAR(hardcode_direct, $1)=no 1088 + _LT_TAGVAR(hardcode_automatic, $1)=yes 1089 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported 1090 + if test "$lt_cv_ld_force_load" = "yes"; then 1091 + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' 1092 + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], 1093 + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) 1094 + else 1095 + _LT_TAGVAR(whole_archive_flag_spec, $1)='' 1096 + fi 1097 + _LT_TAGVAR(link_all_deplibs, $1)=yes 1098 + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" 1099 + case $cc_basename in 1100 + ifort*) _lt_dar_can_shared=yes ;; 1101 + *) _lt_dar_can_shared=$GCC ;; 1102 + esac 1103 + if test "$_lt_dar_can_shared" = "yes"; then 1104 + output_verbose_link_cmd=func_echo_all 1105 + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" 1106 + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" 1107 + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" 1108 + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" 1109 + m4_if([$1], [CXX], 1110 +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then 1111 + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" 1112 + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" 1113 + fi 1114 +],[]) 1115 + else 1116 + _LT_TAGVAR(ld_shlibs, $1)=no 1117 + fi 1118 +]) 1119 + 1120 +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) 1121 +# ---------------------------------- 1122 +# Links a minimal program and checks the executable 1123 +# for the system default hardcoded library path. In most cases, 1124 +# this is /usr/lib:/lib, but when the MPI compilers are used 1125 +# the location of the communication and MPI libs are included too. 1126 +# If we don't find anything, use the default library path according 1127 +# to the aix ld manual. 1128 +# Store the results from the different compilers for each TAGNAME. 1129 +# Allow to override them for all tags through lt_cv_aix_libpath. 1130 +m4_defun([_LT_SYS_MODULE_PATH_AIX], 1131 +[m4_require([_LT_DECL_SED])dnl 1132 +if test "${lt_cv_aix_libpath+set}" = set; then 1133 + aix_libpath=$lt_cv_aix_libpath 1134 +else 1135 + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], 1136 + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ 1137 + lt_aix_libpath_sed='[ 1138 + /Import File Strings/,/^$/ { 1139 + /^0/ { 1140 + s/^0 *\([^ ]*\) *$/\1/ 1141 + p 1142 + } 1143 + }]' 1144 + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` 1145 + # Check for a 64-bit object if we didn't find anything. 1146 + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then 1147 + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` 1148 + fi],[]) 1149 + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then 1150 + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" 1151 + fi 1152 + ]) 1153 + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) 1154 +fi 1155 +])# _LT_SYS_MODULE_PATH_AIX 1156 + 1157 + 1158 +# _LT_SHELL_INIT(ARG) 1159 +# ------------------- 1160 +m4_define([_LT_SHELL_INIT], 1161 +[m4_divert_text([M4SH-INIT], [$1 1162 +])])# _LT_SHELL_INIT 1163 + 1164 + 1165 + 1166 +# _LT_PROG_ECHO_BACKSLASH 1167 +# ----------------------- 1168 +# Find how we can fake an echo command that does not interpret backslash. 1169 +# In particular, with Autoconf 2.60 or later we add some code to the start 1170 +# of the generated configure script which will find a shell with a builtin 1171 +# printf (which we can use as an echo command). 1172 +m4_defun([_LT_PROG_ECHO_BACKSLASH], 1173 +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' 1174 +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO 1175 +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO 1176 + 1177 +AC_MSG_CHECKING([how to print strings]) 1178 +# Test print first, because it will be a builtin if present. 1179 +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ 1180 + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then 1181 + ECHO='print -r --' 1182 +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then 1183 + ECHO='printf %s\n' 1184 +else 1185 + # Use this function as a fallback that always works. 1186 + func_fallback_echo () 1187 + { 1188 + eval 'cat <<_LTECHO_EOF 1189 +$[]1 1190 +_LTECHO_EOF' 1191 + } 1192 + ECHO='func_fallback_echo' 1193 +fi 1194 + 1195 +# func_echo_all arg... 1196 +# Invoke $ECHO with all args, space-separated. 1197 +func_echo_all () 1198 +{ 1199 + $ECHO "$*" 1200 +} 1201 + 1202 +case "$ECHO" in 1203 + printf*) AC_MSG_RESULT([printf]) ;; 1204 + print*) AC_MSG_RESULT([print -r]) ;; 1205 + *) AC_MSG_RESULT([cat]) ;; 1206 +esac 1207 + 1208 +m4_ifdef([_AS_DETECT_SUGGESTED], 1209 +[_AS_DETECT_SUGGESTED([ 1210 + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( 1211 + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' 1212 + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO 1213 + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO 1214 + PATH=/empty FPATH=/empty; export PATH FPATH 1215 + test "X`printf %s $ECHO`" = "X$ECHO" \ 1216 + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) 1217 + 1218 +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) 1219 +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) 1220 +])# _LT_PROG_ECHO_BACKSLASH 1221 + 1222 + 1223 +# _LT_WITH_SYSROOT 1224 +# ---------------- 1225 +AC_DEFUN([_LT_WITH_SYSROOT], 1226 +[AC_MSG_CHECKING([for sysroot]) 1227 +AC_ARG_WITH([sysroot], 1228 +[ --with-sysroot[=DIR] Search for dependent libraries within DIR 1229 + (or the compiler's sysroot if not specified).], 1230 +[], [with_sysroot=no]) 1231 + 1232 +dnl lt_sysroot will always be passed unquoted. We quote it here 1233 +dnl in case the user passed a directory name. 1234 +lt_sysroot= 1235 +case ${with_sysroot} in #( 1236 + yes) 1237 + if test "$GCC" = yes; then 1238 + lt_sysroot=`$CC --print-sysroot 2>/dev/null` 1239 + fi 1240 + ;; #( 1241 + /*) 1242 + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` 1243 + ;; #( 1244 + no|'') 1245 + ;; #( 1246 + *) 1247 + AC_MSG_RESULT([${with_sysroot}]) 1248 + AC_MSG_ERROR([The sysroot must be an absolute path.]) 1249 + ;; 1250 +esac 1251 + 1252 + AC_MSG_RESULT([${lt_sysroot:-no}]) 1253 +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl 1254 +[dependent libraries, and in which our libraries should be installed.])]) 1255 + 1256 +# _LT_ENABLE_LOCK 1257 +# --------------- 1258 +m4_defun([_LT_ENABLE_LOCK], 1259 +[AC_ARG_ENABLE([libtool-lock], 1260 + [AS_HELP_STRING([--disable-libtool-lock], 1261 + [avoid locking (might break parallel builds)])]) 1262 +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes 1263 + 1264 +# Some flags need to be propagated to the compiler or linker for good 1265 +# libtool support. 1266 +case $host in 1267 +ia64-*-hpux*) 1268 + # Find out which ABI we are using. 1269 + echo 'int i;' > conftest.$ac_ext 1270 + if AC_TRY_EVAL(ac_compile); then 1271 + case `/usr/bin/file conftest.$ac_objext` in 1272 + *ELF-32*) 1273 + HPUX_IA64_MODE="32" 1274 + ;; 1275 + *ELF-64*) 1276 + HPUX_IA64_MODE="64" 1277 + ;; 1278 + esac 1279 + fi 1280 + rm -rf conftest* 1281 + ;; 1282 +*-*-irix6*) 1283 + # Find out which ABI we are using. 1284 + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext 1285 + if AC_TRY_EVAL(ac_compile); then 1286 + if test "$lt_cv_prog_gnu_ld" = yes; then 1287 + case `/usr/bin/file conftest.$ac_objext` in 1288 + *32-bit*) 1289 + LD="${LD-ld} -melf32bsmip" 1290 + ;; 1291 + *N32*) 1292 + LD="${LD-ld} -melf32bmipn32" 1293 + ;; 1294 + *64-bit*) 1295 + LD="${LD-ld} -melf64bmip" 1296 + ;; 1297 + esac 1298 + else 1299 + case `/usr/bin/file conftest.$ac_objext` in 1300 + *32-bit*) 1301 + LD="${LD-ld} -32" 1302 + ;; 1303 + *N32*) 1304 + LD="${LD-ld} -n32" 1305 + ;; 1306 + *64-bit*) 1307 + LD="${LD-ld} -64" 1308 + ;; 1309 + esac 1310 + fi 1311 + fi 1312 + rm -rf conftest* 1313 + ;; 1314 + 1315 +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ 1316 +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) 1317 + # Find out which ABI we are using. 1318 + echo 'int i;' > conftest.$ac_ext 1319 + if AC_TRY_EVAL(ac_compile); then 1320 + case `/usr/bin/file conftest.o` in 1321 + *32-bit*) 1322 + case $host in 1323 + x86_64-*kfreebsd*-gnu) 1324 + LD="${LD-ld} -m elf_i386_fbsd" 1325 + ;; 1326 + x86_64-*linux*) 1327 + LD="${LD-ld} -m elf_i386" 1328 + ;; 1329 + ppc64-*linux*|powerpc64-*linux*) 1330 + LD="${LD-ld} -m elf32ppclinux" 1331 + ;; 1332 + s390x-*linux*) 1333 + LD="${LD-ld} -m elf_s390" 1334 + ;; 1335 + sparc64-*linux*) 1336 + LD="${LD-ld} -m elf32_sparc" 1337 + ;; 1338 + esac 1339 + ;; 1340 + *64-bit*) 1341 + case $host in 1342 + x86_64-*kfreebsd*-gnu) 1343 + LD="${LD-ld} -m elf_x86_64_fbsd" 1344 + ;; 1345 + x86_64-*linux*) 1346 + LD="${LD-ld} -m elf_x86_64" 1347 + ;; 1348 + ppc*-*linux*|powerpc*-*linux*) 1349 + LD="${LD-ld} -m elf64ppc" 1350 + ;; 1351 + s390*-*linux*|s390*-*tpf*) 1352 + LD="${LD-ld} -m elf64_s390" 1353 + ;; 1354 + sparc*-*linux*) 1355 + LD="${LD-ld} -m elf64_sparc" 1356 + ;; 1357 + esac 1358 + ;; 1359 + esac 1360 + fi 1361 + rm -rf conftest* 1362 + ;; 1363 + 1364 +*-*-sco3.2v5*) 1365 + # On SCO OpenServer 5, we need -belf to get full-featured binaries. 1366 + SAVE_CFLAGS="$CFLAGS" 1367 + CFLAGS="$CFLAGS -belf" 1368 + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, 1369 + [AC_LANG_PUSH(C) 1370 + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) 1371 + AC_LANG_POP]) 1372 + if test x"$lt_cv_cc_needs_belf" != x"yes"; then 1373 + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf 1374 + CFLAGS="$SAVE_CFLAGS" 1375 + fi 1376 + ;; 1377 +*-*solaris*) 1378 + # Find out which ABI we are using. 1379 + echo 'int i;' > conftest.$ac_ext 1380 + if AC_TRY_EVAL(ac_compile); then 1381 + case `/usr/bin/file conftest.o` in 1382 + *64-bit*) 1383 + case $lt_cv_prog_gnu_ld in 1384 + yes*) 1385 + case $host in 1386 + i?86-*-solaris*) 1387 + LD="${LD-ld} -m elf_x86_64" 1388 + ;; 1389 + sparc*-*-solaris*) 1390 + LD="${LD-ld} -m elf64_sparc" 1391 + ;; 1392 + esac 1393 + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. 1394 + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then 1395 + LD="${LD-ld}_sol2" 1396 + fi 1397 + ;; 1398 + *) 1399 + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then 1400 + LD="${LD-ld} -64" 1401 + fi 1402 + ;; 1403 + esac 1404 + ;; 1405 + esac 1406 + fi 1407 + rm -rf conftest* 1408 + ;; 1409 +esac 1410 + 1411 +need_locks="$enable_libtool_lock" 1412 +])# _LT_ENABLE_LOCK 1413 + 1414 + 1415 +# _LT_PROG_AR 1416 +# ----------- 1417 +m4_defun([_LT_PROG_AR], 1418 +[AC_CHECK_TOOLS(AR, [ar], false) 1419 +: ${AR=ar} 1420 +: ${AR_FLAGS=cru} 1421 +_LT_DECL([], [AR], [1], [The archiver]) 1422 +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) 1423 + 1424 +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], 1425 + [lt_cv_ar_at_file=no 1426 + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], 1427 + [echo conftest.$ac_objext > conftest.lst 1428 + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' 1429 + AC_TRY_EVAL([lt_ar_try]) 1430 + if test "$ac_status" -eq 0; then 1431 + # Ensure the archiver fails upon bogus file names. 1432 + rm -f conftest.$ac_objext libconftest.a 1433 + AC_TRY_EVAL([lt_ar_try]) 1434 + if test "$ac_status" -ne 0; then 1435 + lt_cv_ar_at_file=@ 1436 + fi 1437 + fi 1438 + rm -f conftest.* libconftest.a 1439 + ]) 1440 + ]) 1441 + 1442 +if test "x$lt_cv_ar_at_file" = xno; then 1443 + archiver_list_spec= 1444 +else 1445 + archiver_list_spec=$lt_cv_ar_at_file 1446 +fi 1447 +_LT_DECL([], [archiver_list_spec], [1], 1448 + [How to feed a file listing to the archiver]) 1449 +])# _LT_PROG_AR 1450 + 1451 + 1452 +# _LT_CMD_OLD_ARCHIVE 1453 +# ------------------- 1454 +m4_defun([_LT_CMD_OLD_ARCHIVE], 1455 +[_LT_PROG_AR 1456 + 1457 +AC_CHECK_TOOL(STRIP, strip, :) 1458 +test -z "$STRIP" && STRIP=: 1459 +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) 1460 + 1461 +AC_CHECK_TOOL(RANLIB, ranlib, :) 1462 +test -z "$RANLIB" && RANLIB=: 1463 +_LT_DECL([], [RANLIB], [1], 1464 + [Commands used to install an old-style archive]) 1465 + 1466 +# Determine commands to create old-style static archives. 1467 +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' 1468 +old_postinstall_cmds='chmod 644 $oldlib' 1469 +old_postuninstall_cmds= 1470 + 1471 +if test -n "$RANLIB"; then 1472 + case $host_os in 1473 + openbsd*) 1474 + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" 1475 + ;; 1476 + *) 1477 + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" 1478 + ;; 1479 + esac 1480 + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" 1481 +fi 1482 + 1483 +case $host_os in 1484 + darwin*) 1485 + lock_old_archive_extraction=yes ;; 1486 + *) 1487 + lock_old_archive_extraction=no ;; 1488 +esac 1489 +_LT_DECL([], [old_postinstall_cmds], [2]) 1490 +_LT_DECL([], [old_postuninstall_cmds], [2]) 1491 +_LT_TAGDECL([], [old_archive_cmds], [2], 1492 + [Commands used to build an old-style archive]) 1493 +_LT_DECL([], [lock_old_archive_extraction], [0], 1494 + [Whether to use a lock for old archive extraction]) 1495 +])# _LT_CMD_OLD_ARCHIVE 1496 + 1497 + 1498 +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, 1499 +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) 1500 +# ---------------------------------------------------------------- 1501 +# Check whether the given compiler option works 1502 +AC_DEFUN([_LT_COMPILER_OPTION], 1503 +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl 1504 +m4_require([_LT_DECL_SED])dnl 1505 +AC_CACHE_CHECK([$1], [$2], 1506 + [$2=no 1507 + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) 1508 + echo "$lt_simple_compile_test_code" > conftest.$ac_ext 1509 + lt_compiler_flag="$3" 1510 + # Insert the option either (1) after the last *FLAGS variable, or 1511 + # (2) before a word containing "conftest.", or (3) at the end. 1512 + # Note that $ac_compile itself does not contain backslashes and begins 1513 + # with a dollar sign (not a hyphen), so the echo should work correctly. 1514 + # The option is referenced via a variable to avoid confusing sed. 1515 + lt_compile=`echo "$ac_compile" | $SED \ 1516 + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ 1517 + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ 1518 + -e 's:$: $lt_compiler_flag:'` 1519 + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) 1520 + (eval "$lt_compile" 2>conftest.err) 1521 + ac_status=$? 1522 + cat conftest.err >&AS_MESSAGE_LOG_FD 1523 + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD 1524 + if (exit $ac_status) && test -s "$ac_outfile"; then 1525 + # The compiler can only warn and ignore the option if not recognized 1526 + # So say no if there are warnings other than the usual output. 1527 + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp 1528 + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 1529 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then 1530 + $2=yes 1531 + fi 1532 + fi 1533 + $RM conftest* 1534 +]) 1535 + 1536 +if test x"[$]$2" = xyes; then 1537 + m4_if([$5], , :, [$5]) 1538 +else 1539 + m4_if([$6], , :, [$6]) 1540 +fi 1541 +])# _LT_COMPILER_OPTION 1542 + 1543 +# Old name: 1544 +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) 1545 +dnl aclocal-1.4 backwards compatibility: 1546 +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) 1547 + 1548 + 1549 +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, 1550 +# [ACTION-SUCCESS], [ACTION-FAILURE]) 1551 +# ---------------------------------------------------- 1552 +# Check whether the given linker option works 1553 +AC_DEFUN([_LT_LINKER_OPTION], 1554 +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl 1555 +m4_require([_LT_DECL_SED])dnl 1556 +AC_CACHE_CHECK([$1], [$2], 1557 + [$2=no 1558 + save_LDFLAGS="$LDFLAGS" 1559 + LDFLAGS="$LDFLAGS $3" 1560 + echo "$lt_simple_link_test_code" > conftest.$ac_ext 1561 + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then 1562 + # The linker can only warn and ignore the option if not recognized 1563 + # So say no if there are warnings 1564 + if test -s conftest.err; then 1565 + # Append any errors to the config.log. 1566 + cat conftest.err 1>&AS_MESSAGE_LOG_FD 1567 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp 1568 + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 1569 + if diff conftest.exp conftest.er2 >/dev/null; then 1570 + $2=yes 1571 + fi 1572 + else 1573 + $2=yes 1574 + fi 1575 + fi 1576 + $RM -r conftest* 1577 + LDFLAGS="$save_LDFLAGS" 1578 +]) 1579 + 1580 +if test x"[$]$2" = xyes; then 1581 + m4_if([$4], , :, [$4]) 1582 +else 1583 + m4_if([$5], , :, [$5]) 1584 +fi 1585 +])# _LT_LINKER_OPTION 1586 + 1587 +# Old name: 1588 +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) 1589 +dnl aclocal-1.4 backwards compatibility: 1590 +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) 1591 + 1592 + 1593 +# LT_CMD_MAX_LEN 1594 +#--------------- 1595 +AC_DEFUN([LT_CMD_MAX_LEN], 1596 +[AC_REQUIRE([AC_CANONICAL_HOST])dnl 1597 +# find the maximum length of command line arguments 1598 +AC_MSG_CHECKING([the maximum length of command line arguments]) 1599 +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl 1600 + i=0 1601 + teststring="ABCD" 1602 + 1603 + case $build_os in 1604 + msdosdjgpp*) 1605 + # On DJGPP, this test can blow up pretty badly due to problems in libc 1606 + # (any single argument exceeding 2000 bytes causes a buffer overrun 1607 + # during glob expansion). Even if it were fixed, the result of this 1608 + # check would be larger than it should be. 1609 + lt_cv_sys_max_cmd_len=12288; # 12K is about right 1610 + ;; 1611 + 1612 + gnu*) 1613 + # Under GNU Hurd, this test is not required because there is 1614 + # no limit to the length of command line arguments. 1615 + # Libtool will interpret -1 as no limit whatsoever 1616 + lt_cv_sys_max_cmd_len=-1; 1617 + ;; 1618 + 1619 + cygwin* | mingw* | cegcc*) 1620 + # On Win9x/ME, this test blows up -- it succeeds, but takes 1621 + # about 5 minutes as the teststring grows exponentially. 1622 + # Worse, since 9x/ME are not pre-emptively multitasking, 1623 + # you end up with a "frozen" computer, even though with patience 1624 + # the test eventually succeeds (with a max line length of 256k). 1625 + # Instead, let's just punt: use the minimum linelength reported by 1626 + # all of the supported platforms: 8192 (on NT/2K/XP). 1627 + lt_cv_sys_max_cmd_len=8192; 1628 + ;; 1629 + 1630 + mint*) 1631 + # On MiNT this can take a long time and run out of memory. 1632 + lt_cv_sys_max_cmd_len=8192; 1633 + ;; 1634 + 1635 + amigaos*) 1636 + # On AmigaOS with pdksh, this test takes hours, literally. 1637 + # So we just punt and use a minimum line length of 8192. 1638 + lt_cv_sys_max_cmd_len=8192; 1639 + ;; 1640 + 1641 + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) 1642 + # This has been around since 386BSD, at least. Likely further. 1643 + if test -x /sbin/sysctl; then 1644 + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` 1645 + elif test -x /usr/sbin/sysctl; then 1646 + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` 1647 + else 1648 + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs 1649 + fi 1650 + # And add a safety zone 1651 + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` 1652 + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` 1653 + ;; 1654 + 1655 + interix*) 1656 + # We know the value 262144 and hardcode it with a safety zone (like BSD) 1657 + lt_cv_sys_max_cmd_len=196608 1658 + ;; 1659 + 1660 + os2*) 1661 + # The test takes a long time on OS/2. 1662 + lt_cv_sys_max_cmd_len=8192 1663 + ;; 1664 + 1665 + osf*) 1666 + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure 1667 + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not 1668 + # nice to cause kernel panics so lets avoid the loop below. 1669 + # First set a reasonable default. 1670 + lt_cv_sys_max_cmd_len=16384 1671 + # 1672 + if test -x /sbin/sysconfig; then 1673 + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in 1674 + *1*) lt_cv_sys_max_cmd_len=-1 ;; 1675 + esac 1676 + fi 1677 + ;; 1678 + sco3.2v5*) 1679 + lt_cv_sys_max_cmd_len=102400 1680 + ;; 1681 + sysv5* | sco5v6* | sysv4.2uw2*) 1682 + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` 1683 + if test -n "$kargmax"; then 1684 + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` 1685 + else 1686 + lt_cv_sys_max_cmd_len=32768 1687 + fi 1688 + ;; 1689 + *) 1690 + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` 1691 + if test -n "$lt_cv_sys_max_cmd_len"; then 1692 + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` 1693 + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` 1694 + else 1695 + # Make teststring a little bigger before we do anything with it. 1696 + # a 1K string should be a reasonable start. 1697 + for i in 1 2 3 4 5 6 7 8 ; do 1698 + teststring=$teststring$teststring 1699 + done 1700 + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} 1701 + # If test is not a shell built-in, we'll probably end up computing a 1702 + # maximum length that is only half of the actual maximum length, but 1703 + # we can't tell. 1704 + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ 1705 + = "X$teststring$teststring"; } >/dev/null 2>&1 && 1706 + test $i != 17 # 1/2 MB should be enough 1707 + do 1708 + i=`expr $i + 1` 1709 + teststring=$teststring$teststring 1710 + done 1711 + # Only check the string length outside the loop. 1712 + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` 1713 + teststring= 1714 + # Add a significant safety factor because C++ compilers can tack on 1715 + # massive amounts of additional arguments before passing them to the 1716 + # linker. It appears as though 1/2 is a usable value. 1717 + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` 1718 + fi 1719 + ;; 1720 + esac 1721 +]) 1722 +if test -n $lt_cv_sys_max_cmd_len ; then 1723 + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) 1724 +else 1725 + AC_MSG_RESULT(none) 1726 +fi 1727 +max_cmd_len=$lt_cv_sys_max_cmd_len 1728 +_LT_DECL([], [max_cmd_len], [0], 1729 + [What is the maximum length of a command?]) 1730 +])# LT_CMD_MAX_LEN 1731 + 1732 +# Old name: 1733 +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) 1734 +dnl aclocal-1.4 backwards compatibility: 1735 +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) 1736 + 1737 + 1738 +# _LT_HEADER_DLFCN 1739 +# ---------------- 1740 +m4_defun([_LT_HEADER_DLFCN], 1741 +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl 1742 +])# _LT_HEADER_DLFCN 1743 + 1744 + 1745 +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, 1746 +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) 1747 +# ---------------------------------------------------------------- 1748 +m4_defun([_LT_TRY_DLOPEN_SELF], 1749 +[m4_require([_LT_HEADER_DLFCN])dnl 1750 +if test "$cross_compiling" = yes; then : 1751 + [$4] 1752 +else 1753 + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 1754 + lt_status=$lt_dlunknown 1755 + cat > conftest.$ac_ext <<_LT_EOF 1756 +[#line $LINENO "configure" 1757 +#include "confdefs.h" 1758 + 1759 +#if HAVE_DLFCN_H 1760 +#include <dlfcn.h> 1761 +#endif 1762 + 1763 +#include <stdio.h> 1764 + 1765 +#ifdef RTLD_GLOBAL 1766 +# define LT_DLGLOBAL RTLD_GLOBAL 1767 +#else 1768 +# ifdef DL_GLOBAL 1769 +# define LT_DLGLOBAL DL_GLOBAL 1770 +# else 1771 +# define LT_DLGLOBAL 0 1772 +# endif 1773 +#endif 1774 + 1775 +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we 1776 + find out it does not work in some platform. */ 1777 +#ifndef LT_DLLAZY_OR_NOW 1778 +# ifdef RTLD_LAZY 1779 +# define LT_DLLAZY_OR_NOW RTLD_LAZY 1780 +# else 1781 +# ifdef DL_LAZY 1782 +# define LT_DLLAZY_OR_NOW DL_LAZY 1783 +# else 1784 +# ifdef RTLD_NOW 1785 +# define LT_DLLAZY_OR_NOW RTLD_NOW 1786 +# else 1787 +# ifdef DL_NOW 1788 +# define LT_DLLAZY_OR_NOW DL_NOW 1789 +# else 1790 +# define LT_DLLAZY_OR_NOW 0 1791 +# endif 1792 +# endif 1793 +# endif 1794 +# endif 1795 +#endif 1796 + 1797 +/* When -fvisbility=hidden is used, assume the code has been annotated 1798 + correspondingly for the symbols needed. */ 1799 +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) 1800 +int fnord () __attribute__((visibility("default"))); 1801 +#endif 1802 + 1803 +int fnord () { return 42; } 1804 +int main () 1805 +{ 1806 + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); 1807 + int status = $lt_dlunknown; 1808 + 1809 + if (self) 1810 + { 1811 + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; 1812 + else 1813 + { 1814 + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; 1815 + else puts (dlerror ()); 1816 + } 1817 + /* dlclose (self); */ 1818 + } 1819 + else 1820 + puts (dlerror ()); 1821 + 1822 + return status; 1823 +}] 1824 +_LT_EOF 1825 + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then 1826 + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null 1827 + lt_status=$? 1828 + case x$lt_status in 1829 + x$lt_dlno_uscore) $1 ;; 1830 + x$lt_dlneed_uscore) $2 ;; 1831 + x$lt_dlunknown|x*) $3 ;; 1832 + esac 1833 + else : 1834 + # compilation failed 1835 + $3 1836 + fi 1837 +fi 1838 +rm -fr conftest* 1839 +])# _LT_TRY_DLOPEN_SELF 1840 + 1841 + 1842 +# LT_SYS_DLOPEN_SELF 1843 +# ------------------ 1844 +AC_DEFUN([LT_SYS_DLOPEN_SELF], 1845 +[m4_require([_LT_HEADER_DLFCN])dnl 1846 +if test "x$enable_dlopen" != xyes; then 1847 + enable_dlopen=unknown 1848 + enable_dlopen_self=unknown 1849 + enable_dlopen_self_static=unknown 1850 +else 1851 + lt_cv_dlopen=no 1852 + lt_cv_dlopen_libs= 1853 + 1854 + case $host_os in 1855 + beos*) 1856 + lt_cv_dlopen="load_add_on" 1857 + lt_cv_dlopen_libs= 1858 + lt_cv_dlopen_self=yes 1859 + ;; 1860 + 1861 + mingw* | pw32* | cegcc*) 1862 + lt_cv_dlopen="LoadLibrary" 1863 + lt_cv_dlopen_libs= 1864 + ;; 1865 + 1866 + cygwin*) 1867 + lt_cv_dlopen="dlopen" 1868 + lt_cv_dlopen_libs= 1869 + ;; 1870 + 1871 + darwin*) 1872 + # if libdl is installed we need to link against it 1873 + AC_CHECK_LIB([dl], [dlopen], 1874 + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ 1875 + lt_cv_dlopen="dyld" 1876 + lt_cv_dlopen_libs= 1877 + lt_cv_dlopen_self=yes 1878 + ]) 1879 + ;; 1880 + 1881 + *) 1882 + AC_CHECK_FUNC([shl_load], 1883 + [lt_cv_dlopen="shl_load"], 1884 + [AC_CHECK_LIB([dld], [shl_load], 1885 + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], 1886 + [AC_CHECK_FUNC([dlopen], 1887 + [lt_cv_dlopen="dlopen"], 1888 + [AC_CHECK_LIB([dl], [dlopen], 1889 + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], 1890 + [AC_CHECK_LIB([svld], [dlopen], 1891 + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], 1892 + [AC_CHECK_LIB([dld], [dld_link], 1893 + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) 1894 + ]) 1895 + ]) 1896 + ]) 1897 + ]) 1898 + ]) 1899 + ;; 1900 + esac 1901 + 1902 + if test "x$lt_cv_dlopen" != xno; then 1903 + enable_dlopen=yes 1904 + else 1905 + enable_dlopen=no 1906 + fi 1907 + 1908 + case $lt_cv_dlopen in 1909 + dlopen) 1910 + save_CPPFLAGS="$CPPFLAGS" 1911 + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" 1912 + 1913 + save_LDFLAGS="$LDFLAGS" 1914 + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" 1915 + 1916 + save_LIBS="$LIBS" 1917 + LIBS="$lt_cv_dlopen_libs $LIBS" 1918 + 1919 + AC_CACHE_CHECK([whether a program can dlopen itself], 1920 + lt_cv_dlopen_self, [dnl 1921 + _LT_TRY_DLOPEN_SELF( 1922 + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, 1923 + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) 1924 + ]) 1925 + 1926 + if test "x$lt_cv_dlopen_self" = xyes; then 1927 + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" 1928 + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], 1929 + lt_cv_dlopen_self_static, [dnl 1930 + _LT_TRY_DLOPEN_SELF( 1931 + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, 1932 + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) 1933 + ]) 1934 + fi 1935 + 1936 + CPPFLAGS="$save_CPPFLAGS" 1937 + LDFLAGS="$save_LDFLAGS" 1938 + LIBS="$save_LIBS" 1939 + ;; 1940 + esac 1941 + 1942 + case $lt_cv_dlopen_self in 1943 + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; 1944 + *) enable_dlopen_self=unknown ;; 1945 + esac 1946 + 1947 + case $lt_cv_dlopen_self_static in 1948 + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; 1949 + *) enable_dlopen_self_static=unknown ;; 1950 + esac 1951 +fi 1952 +_LT_DECL([dlopen_support], [enable_dlopen], [0], 1953 + [Whether dlopen is supported]) 1954 +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], 1955 + [Whether dlopen of programs is supported]) 1956 +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], 1957 + [Whether dlopen of statically linked programs is supported]) 1958 +])# LT_SYS_DLOPEN_SELF 1959 + 1960 +# Old name: 1961 +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) 1962 +dnl aclocal-1.4 backwards compatibility: 1963 +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) 1964 + 1965 + 1966 +# _LT_COMPILER_C_O([TAGNAME]) 1967 +# --------------------------- 1968 +# Check to see if options -c and -o are simultaneously supported by compiler. 1969 +# This macro does not hard code the compiler like AC_PROG_CC_C_O. 1970 +m4_defun([_LT_COMPILER_C_O], 1971 +[m4_require([_LT_DECL_SED])dnl 1972 +m4_require([_LT_FILEUTILS_DEFAULTS])dnl 1973 +m4_require([_LT_TAG_COMPILER])dnl 1974 +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], 1975 + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], 1976 + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no 1977 + $RM -r conftest 2>/dev/null 1978 + mkdir conftest 1979 + cd conftest 1980 + mkdir out 1981 + echo "$lt_simple_compile_test_code" > conftest.$ac_ext 1982 + 1983 + lt_compiler_flag="-o out/conftest2.$ac_objext" 1984 + # Insert the option either (1) after the last *FLAGS variable, or 1985 + # (2) before a word containing "conftest.", or (3) at the end. 1986 + # Note that $ac_compile itself does not contain backslashes and begins 1987 + # with a dollar sign (not a hyphen), so the echo should work correctly. 1988 + lt_compile=`echo "$ac_compile" | $SED \ 1989 + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ 1990 + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ 1991 + -e 's:$: $lt_compiler_flag:'` 1992 + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) 1993 + (eval "$lt_compile" 2>out/conftest.err) 1994 + ac_status=$? 1995 + cat out/conftest.err >&AS_MESSAGE_LOG_FD 1996 + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD 1997 + if (exit $ac_status) && test -s out/conftest2.$ac_objext 1998 + then 1999 + # The compiler can only warn and ignore the option if not recognized 2000 + # So say no if there are warnings 2001 + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp 2002 + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 2003 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then 2004 + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes 2005 + fi 2006 + fi 2007 + chmod u+w . 2>&AS_MESSAGE_LOG_FD 2008 + $RM conftest* 2009 + # SGI C++ compiler will create directory out/ii_files/ for 2010 + # template instantiation 2011 + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files 2012 + $RM out/* && rmdir out 2013 + cd .. 2014 + $RM -r conftest 2015 + $RM conftest* 2016 +]) 2017 +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], 2018 + [Does compiler simultaneously support -c and -o options?]) 2019 +])# _LT_COMPILER_C_O 2020 + 2021 + 2022 +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) 2023 +# ---------------------------------- 2024 +# Check to see if we can do hard links to lock some files if needed 2025 +m4_defun([_LT_COMPILER_FILE_LOCKS], 2026 +[m4_require([_LT_ENABLE_LOCK])dnl 2027 +m4_require([_LT_FILEUTILS_DEFAULTS])dnl 2028 +_LT_COMPILER_C_O([$1]) 2029 + 2030 +hard_links="nottested" 2031 +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then 2032 + # do not overwrite the value of need_locks provided by the user 2033 + AC_MSG_CHECKING([if we can lock with hard links]) 2034 + hard_links=yes 2035 + $RM conftest* 2036 + ln conftest.a conftest.b 2>/dev/null && hard_links=no 2037 + touch conftest.a 2038 + ln conftest.a conftest.b 2>&5 || hard_links=no 2039 + ln conftest.a conftest.b 2>/dev/null && hard_links=no 2040 + AC_MSG_RESULT([$hard_links]) 2041 + if test "$hard_links" = no; then 2042 + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) 2043 + need_locks=warn 2044 + fi 2045 +else 2046 + need_locks=no 2047 +fi 2048 +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) 2049 +])# _LT_COMPILER_FILE_LOCKS 2050 + 2051 + 2052 +# _LT_CHECK_OBJDIR 2053 +# ---------------- 2054 +m4_defun([_LT_CHECK_OBJDIR], 2055 +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], 2056 +[rm -f .libs 2>/dev/null 2057 +mkdir .libs 2>/dev/null 2058 +if test -d .libs; then 2059 + lt_cv_objdir=.libs 2060 +else 2061 + # MS-DOS does not allow filenames that begin with a dot. 2062 + lt_cv_objdir=_libs 2063 +fi 2064 +rmdir .libs 2>/dev/null]) 2065 +objdir=$lt_cv_objdir 2066 +_LT_DECL([], [objdir], [0], 2067 + [The name of the directory that contains temporary libtool files])dnl 2068 +m4_pattern_allow([LT_OBJDIR])dnl 2069 +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", 2070 + [Define to the sub-directory in which libtool stores uninstalled libraries.]) 2071 +])# _LT_CHECK_OBJDIR 2072 + 2073 + 2074 +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) 2075 +# -------------------------------------- 2076 +# Check hardcoding attributes. 2077 +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], 2078 +[AC_MSG_CHECKING([how to hardcode library paths into programs]) 2079 +_LT_TAGVAR(hardcode_action, $1)= 2080 +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || 2081 + test -n "$_LT_TAGVAR(runpath_var, $1)" || 2082 + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then 2083 + 2084 + # We can hardcode non-existent directories. 2085 + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && 2086 + # If the only mechanism to avoid hardcoding is shlibpath_var, we 2087 + # have to relink, otherwise we might link with an installed library 2088 + # when we should be linking with a yet-to-be-installed one 2089 + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && 2090 + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then 2091 + # Linking always hardcodes the temporary library directory. 2092 + _LT_TAGVAR(hardcode_action, $1)=relink 2093 + else 2094 + # We can link without hardcoding, and we can hardcode nonexisting dirs. 2095 + _LT_TAGVAR(hardcode_action, $1)=immediate 2096 + fi 2097 +else 2098 + # We cannot hardcode anything, or else we can only hardcode existing 2099 + # directories. 2100 + _LT_TAGVAR(hardcode_action, $1)=unsupported 2101 +fi 2102 +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) 2103 + 2104 +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || 2105 + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then 2106 + # Fast installation is not supported 2107 + enable_fast_install=no 2108 +elif test "$shlibpath_overrides_runpath" = yes || 2109 + test "$enable_shared" = no; then 2110 + # Fast installation is not necessary 2111 + enable_fast_install=needless 2112 +fi 2113 +_LT_TAGDECL([], [hardcode_action], [0], 2114 + [How to hardcode a shared library path into an executable]) 2115 +])# _LT_LINKER_HARDCODE_LIBPATH 2116 + 2117 + 2118 +# _LT_CMD_STRIPLIB 2119 +# ---------------- 2120 +m4_defun([_LT_CMD_STRIPLIB], 2121 +[m4_require([_LT_DECL_EGREP]) 2122 +striplib= 2123 +old_striplib= 2124 +AC_MSG_CHECKING([whether stripping libraries is possible]) 2125 +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then 2126 + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" 2127 + test -z "$striplib" && striplib="$STRIP --strip-unneeded" 2128 + AC_MSG_RESULT([yes]) 2129 +else 2130 +# FIXME - insert some real tests, host_os isn't really good enough 2131 + case $host_os in 2132 + darwin*) 2133 + if test -n "$STRIP" ; then 2134 + striplib="$STRIP -x" 2135 + old_striplib="$STRIP -S" 2136 + AC_MSG_RESULT([yes]) 2137 + else 2138 + AC_MSG_RESULT([no]) 2139 + fi 2140 + ;; 2141 + *) 2142 + AC_MSG_RESULT([no]) 2143 + ;; 2144 + esac 2145 +fi 2146 +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) 2147 +_LT_DECL([], [striplib], [1]) 2148 +])# _LT_CMD_STRIPLIB 2149 + 2150 + 2151 +# _LT_SYS_DYNAMIC_LINKER([TAG]) 2152 +# ----------------------------- 2153 +# PORTME Fill in your ld.so characteristics 2154 +m4_defun([_LT_SYS_DYNAMIC_LINKER], 2155 +[AC_REQUIRE([AC_CANONICAL_HOST])dnl 2156 +m4_require([_LT_DECL_EGREP])dnl 2157 +m4_require([_LT_FILEUTILS_DEFAULTS])dnl 2158 +m4_require([_LT_DECL_OBJDUMP])dnl 2159 +m4_require([_LT_DECL_SED])dnl 2160 +m4_require([_LT_CHECK_SHELL_FEATURES])dnl 2161 +AC_MSG_CHECKING([dynamic linker characteristics]) 2162 +m4_if([$1], 2163 + [], [ 2164 +if test "$GCC" = yes; then 2165 + case $host_os in 2166 + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; 2167 + *) lt_awk_arg="/^libraries:/" ;; 2168 + esac 2169 + case $host_os in 2170 + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; 2171 + *) lt_sed_strip_eq="s,=/,/,g" ;; 2172 + esac 2173 + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` 2174 + case $lt_search_path_spec in 2175 + *\;*) 2176 + # if the path contains ";" then we assume it to be the separator 2177 + # otherwise default to the standard path separator (i.e. ":") - it is 2178 + # assumed that no part of a normal pathname contains ";" but that should 2179 + # okay in the real world where ";" in dirpaths is itself problematic. 2180 + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` 2181 + ;; 2182 + *) 2183 + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` 2184 + ;; 2185 + esac 2186 + # Ok, now we have the path, separated by spaces, we can step through it 2187 + # and add multilib dir if necessary. 2188 + lt_tmp_lt_search_path_spec= 2189 + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` 2190 + for lt_sys_path in $lt_search_path_spec; do 2191 + if test -d "$lt_sys_path/$lt_multi_os_dir"; then 2192 + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" 2193 + else 2194 + test -d "$lt_sys_path" && \ 2195 + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" 2196 + fi 2197 + done 2198 + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' 2199 +BEGIN {RS=" "; FS="/|\n";} { 2200 + lt_foo=""; 2201 + lt_count=0; 2202 + for (lt_i = NF; lt_i > 0; lt_i--) { 2203 + if ($lt_i != "" && $lt_i != ".") { 2204 + if ($lt_i == "..") { 2205 + lt_count++; 2206 + } else { 2207 + if (lt_count == 0) { 2208 + lt_foo="/" $lt_i lt_foo; 2209 + } else { 2210 + lt_count--; 2211 + } 2212 + } 2213 + } 2214 + } 2215 + if (lt_foo != "") { lt_freq[[lt_foo]]++; } 2216 + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } 2217 +}'` 2218 + # AWK program above erroneously prepends '/' to C:/dos/paths 2219 + # for these hosts. 2220 + case $host_os in 2221 + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ 2222 + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; 2223 + esac 2224 + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` 2225 +else 2226 + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" 2227 +fi]) 2228 +library_names_spec= 2229 +libname_spec='lib$name' 2230 +soname_spec= 2231 +shrext_cmds=".so" 2232 +postinstall_cmds= 2233 +postuninstall_cmds= 2234 +finish_cmds= 2235 +finish_eval= 2236 +shlibpath_var= 2237 +shlibpath_overrides_runpath=unknown 2238 +version_type=none 2239 +dynamic_linker="$host_os ld.so" 2240 +sys_lib_dlsearch_path_spec="/lib /usr/lib" 2241 +need_lib_prefix=unknown 2242 +hardcode_into_libs=no 2243 + 2244 +# when you set need_version to no, make sure it does not cause -set_version 2245 +# flags to be left without arguments 2246 +need_version=unknown 2247 + 2248 +case $host_os in 2249 +aix3*) 2250 + version_type=linux # correct to gnu/linux during the next big refactor 2251 + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' 2252 + shlibpath_var=LIBPATH 2253 + 2254 + # AIX 3 has no versioning support, so we append a major version to the name. 2255 + soname_spec='${libname}${release}${shared_ext}$major' 2256 + ;; 2257 + 2258 +aix[[4-9]]*) 2259 + version_type=linux # correct to gnu/linux during the next big refactor 2260 + need_lib_prefix=no 2261 + need_version=no 2262 + hardcode_into_libs=yes 2263 + if test "$host_cpu" = ia64; then 2264 + # AIX 5 supports IA64 2265 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' 2266 + shlibpath_var=LD_LIBRARY_PATH 2267 + else 2268 + # With GCC up to 2.95.x, collect2 would create an import file 2269 + # for dependence libraries. The import file would start with 2270 + # the line `#! .'. This would cause the generated library to 2271 + # depend on `.', always an invalid library. This was fixed in 2272 + # development snapshots of GCC prior to 3.0. 2273 + case $host_os in 2274 + aix4 | aix4.[[01]] | aix4.[[01]].*) 2275 + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' 2276 + echo ' yes ' 2277 + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then 2278 + : 2279 + else 2280 + can_build_shared=no 2281 + fi 2282 + ;; 2283 + esac 2284 + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct 2285 + # soname into executable. Probably we can add versioning support to 2286 + # collect2, so additional links can be useful in future. 2287 + if test "$aix_use_runtimelinking" = yes; then 2288 + # If using run time linking (on AIX 4.2 or later) use lib<name>.so 2289 + # instead of lib<name>.a to let people know that these are not 2290 + # typical AIX shared libraries. 2291 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2292 + else 2293 + # We preserve .a as extension for shared libraries through AIX4.2 2294 + # and later when we are not doing run time linking. 2295 + library_names_spec='${libname}${release}.a $libname.a' 2296 + soname_spec='${libname}${release}${shared_ext}$major' 2297 + fi 2298 + shlibpath_var=LIBPATH 2299 + fi 2300 + ;; 2301 + 2302 +amigaos*) 2303 + case $host_cpu in 2304 + powerpc) 2305 + # Since July 2007 AmigaOS4 officially supports .so libraries. 2306 + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. 2307 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2308 + ;; 2309 + m68k) 2310 + library_names_spec='$libname.ixlibrary $libname.a' 2311 + # Create ${libname}_ixlibrary.a entries in /sys/libs. 2312 + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' 2313 + ;; 2314 + esac 2315 + ;; 2316 + 2317 +beos*) 2318 + library_names_spec='${libname}${shared_ext}' 2319 + dynamic_linker="$host_os ld.so" 2320 + shlibpath_var=LIBRARY_PATH 2321 + ;; 2322 + 2323 +bsdi[[45]]*) 2324 + version_type=linux # correct to gnu/linux during the next big refactor 2325 + need_version=no 2326 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2327 + soname_spec='${libname}${release}${shared_ext}$major' 2328 + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' 2329 + shlibpath_var=LD_LIBRARY_PATH 2330 + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" 2331 + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" 2332 + # the default ld.so.conf also contains /usr/contrib/lib and 2333 + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow 2334 + # libtool to hard-code these into programs 2335 + ;; 2336 + 2337 +cygwin* | mingw* | pw32* | cegcc*) 2338 + version_type=windows 2339 + shrext_cmds=".dll" 2340 + need_version=no 2341 + need_lib_prefix=no 2342 + 2343 + case $GCC,$cc_basename in 2344 + yes,*) 2345 + # gcc 2346 + library_names_spec='$libname.dll.a' 2347 + # DLL is installed to $(libdir)/../bin by postinstall_cmds 2348 + postinstall_cmds='base_file=`basename \${file}`~ 2349 + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ 2350 + dldir=$destdir/`dirname \$dlpath`~ 2351 + test -d \$dldir || mkdir -p \$dldir~ 2352 + $install_prog $dir/$dlname \$dldir/$dlname~ 2353 + chmod a+x \$dldir/$dlname~ 2354 + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then 2355 + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; 2356 + fi' 2357 + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ 2358 + dlpath=$dir/\$dldll~ 2359 + $RM \$dlpath' 2360 + shlibpath_overrides_runpath=yes 2361 + 2362 + case $host_os in 2363 + cygwin*) 2364 + # Cygwin DLLs use 'cyg' prefix rather than 'lib' 2365 + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' 2366 +m4_if([$1], [],[ 2367 + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) 2368 + ;; 2369 + mingw* | cegcc*) 2370 + # MinGW DLLs use traditional 'lib' prefix 2371 + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' 2372 + ;; 2373 + pw32*) 2374 + # pw32 DLLs use 'pw' prefix rather than 'lib' 2375 + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' 2376 + ;; 2377 + esac 2378 + dynamic_linker='Win32 ld.exe' 2379 + ;; 2380 + 2381 + *,cl*) 2382 + # Native MSVC 2383 + libname_spec='$name' 2384 + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' 2385 + library_names_spec='${libname}.dll.lib' 2386 + 2387 + case $build_os in 2388 + mingw*) 2389 + sys_lib_search_path_spec= 2390 + lt_save_ifs=$IFS 2391 + IFS=';' 2392 + for lt_path in $LIB 2393 + do 2394 + IFS=$lt_save_ifs 2395 + # Let DOS variable expansion print the short 8.3 style file name. 2396 + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` 2397 + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" 2398 + done 2399 + IFS=$lt_save_ifs 2400 + # Convert to MSYS style. 2401 + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` 2402 + ;; 2403 + cygwin*) 2404 + # Convert to unix form, then to dos form, then back to unix form 2405 + # but this time dos style (no spaces!) so that the unix form looks 2406 + # like /cygdrive/c/PROGRA~1:/cygdr... 2407 + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` 2408 + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` 2409 + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` 2410 + ;; 2411 + *) 2412 + sys_lib_search_path_spec="$LIB" 2413 + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then 2414 + # It is most probably a Windows format PATH. 2415 + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` 2416 + else 2417 + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` 2418 + fi 2419 + # FIXME: find the short name or the path components, as spaces are 2420 + # common. (e.g. "Program Files" -> "PROGRA~1") 2421 + ;; 2422 + esac 2423 + 2424 + # DLL is installed to $(libdir)/../bin by postinstall_cmds 2425 + postinstall_cmds='base_file=`basename \${file}`~ 2426 + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ 2427 + dldir=$destdir/`dirname \$dlpath`~ 2428 + test -d \$dldir || mkdir -p \$dldir~ 2429 + $install_prog $dir/$dlname \$dldir/$dlname' 2430 + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ 2431 + dlpath=$dir/\$dldll~ 2432 + $RM \$dlpath' 2433 + shlibpath_overrides_runpath=yes 2434 + dynamic_linker='Win32 link.exe' 2435 + ;; 2436 + 2437 + *) 2438 + # Assume MSVC wrapper 2439 + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' 2440 + dynamic_linker='Win32 ld.exe' 2441 + ;; 2442 + esac 2443 + # FIXME: first we should search . and the directory the executable is in 2444 + shlibpath_var=PATH 2445 + ;; 2446 + 2447 +darwin* | rhapsody*) 2448 + dynamic_linker="$host_os dyld" 2449 + version_type=darwin 2450 + need_lib_prefix=no 2451 + need_version=no 2452 + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' 2453 + soname_spec='${libname}${release}${major}$shared_ext' 2454 + shlibpath_overrides_runpath=yes 2455 + shlibpath_var=DYLD_LIBRARY_PATH 2456 + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' 2457 +m4_if([$1], [],[ 2458 + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) 2459 + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' 2460 + ;; 2461 + 2462 +dgux*) 2463 + version_type=linux # correct to gnu/linux during the next big refactor 2464 + need_lib_prefix=no 2465 + need_version=no 2466 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' 2467 + soname_spec='${libname}${release}${shared_ext}$major' 2468 + shlibpath_var=LD_LIBRARY_PATH 2469 + ;; 2470 + 2471 +freebsd* | dragonfly*) 2472 + # DragonFly does not have aout. When/if they implement a new 2473 + # versioning mechanism, adjust this. 2474 + if test -x /usr/bin/objformat; then 2475 + objformat=`/usr/bin/objformat` 2476 + else 2477 + case $host_os in 2478 + freebsd[[23]].*) objformat=aout ;; 2479 + *) objformat=elf ;; 2480 + esac 2481 + fi 2482 + version_type=freebsd-$objformat 2483 + case $version_type in 2484 + freebsd-elf*) 2485 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' 2486 + need_version=no 2487 + need_lib_prefix=no 2488 + ;; 2489 + freebsd-*) 2490 + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' 2491 + need_version=yes 2492 + ;; 2493 + esac 2494 + shlibpath_var=LD_LIBRARY_PATH 2495 + case $host_os in 2496 + freebsd2.*) 2497 + shlibpath_overrides_runpath=yes 2498 + ;; 2499 + freebsd3.[[01]]* | freebsdelf3.[[01]]*) 2500 + shlibpath_overrides_runpath=yes 2501 + hardcode_into_libs=yes 2502 + ;; 2503 + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ 2504 + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) 2505 + shlibpath_overrides_runpath=no 2506 + hardcode_into_libs=yes 2507 + ;; 2508 + *) # from 4.6 on, and DragonFly 2509 + shlibpath_overrides_runpath=yes 2510 + hardcode_into_libs=yes 2511 + ;; 2512 + esac 2513 + ;; 2514 + 2515 +gnu*) 2516 + version_type=linux # correct to gnu/linux during the next big refactor 2517 + need_lib_prefix=no 2518 + need_version=no 2519 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' 2520 + soname_spec='${libname}${release}${shared_ext}$major' 2521 + shlibpath_var=LD_LIBRARY_PATH 2522 + shlibpath_overrides_runpath=no 2523 + hardcode_into_libs=yes 2524 + ;; 2525 + 2526 +haiku*) 2527 + version_type=linux # correct to gnu/linux during the next big refactor 2528 + need_lib_prefix=no 2529 + need_version=no 2530 + dynamic_linker="$host_os runtime_loader" 2531 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' 2532 + soname_spec='${libname}${release}${shared_ext}$major' 2533 + shlibpath_var=LIBRARY_PATH 2534 + shlibpath_overrides_runpath=yes 2535 + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' 2536 + hardcode_into_libs=yes 2537 + ;; 2538 + 2539 +hpux9* | hpux10* | hpux11*) 2540 + # Give a soname corresponding to the major version so that dld.sl refuses to 2541 + # link against other versions. 2542 + version_type=sunos 2543 + need_lib_prefix=no 2544 + need_version=no 2545 + case $host_cpu in 2546 + ia64*) 2547 + shrext_cmds='.so' 2548 + hardcode_into_libs=yes 2549 + dynamic_linker="$host_os dld.so" 2550 + shlibpath_var=LD_LIBRARY_PATH 2551 + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. 2552 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2553 + soname_spec='${libname}${release}${shared_ext}$major' 2554 + if test "X$HPUX_IA64_MODE" = X32; then 2555 + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" 2556 + else 2557 + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" 2558 + fi 2559 + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec 2560 + ;; 2561 + hppa*64*) 2562 + shrext_cmds='.sl' 2563 + hardcode_into_libs=yes 2564 + dynamic_linker="$host_os dld.sl" 2565 + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH 2566 + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. 2567 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2568 + soname_spec='${libname}${release}${shared_ext}$major' 2569 + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" 2570 + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec 2571 + ;; 2572 + *) 2573 + shrext_cmds='.sl' 2574 + dynamic_linker="$host_os dld.sl" 2575 + shlibpath_var=SHLIB_PATH 2576 + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH 2577 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2578 + soname_spec='${libname}${release}${shared_ext}$major' 2579 + ;; 2580 + esac 2581 + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... 2582 + postinstall_cmds='chmod 555 $lib' 2583 + # or fails outright, so override atomically: 2584 + install_override_mode=555 2585 + ;; 2586 + 2587 +interix[[3-9]]*) 2588 + version_type=linux # correct to gnu/linux during the next big refactor 2589 + need_lib_prefix=no 2590 + need_version=no 2591 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' 2592 + soname_spec='${libname}${release}${shared_ext}$major' 2593 + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' 2594 + shlibpath_var=LD_LIBRARY_PATH 2595 + shlibpath_overrides_runpath=no 2596 + hardcode_into_libs=yes 2597 + ;; 2598 + 2599 +irix5* | irix6* | nonstopux*) 2600 + case $host_os in 2601 + nonstopux*) version_type=nonstopux ;; 2602 + *) 2603 + if test "$lt_cv_prog_gnu_ld" = yes; then 2604 + version_type=linux # correct to gnu/linux during the next big refactor 2605 + else 2606 + version_type=irix 2607 + fi ;; 2608 + esac 2609 + need_lib_prefix=no 2610 + need_version=no 2611 + soname_spec='${libname}${release}${shared_ext}$major' 2612 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' 2613 + case $host_os in 2614 + irix5* | nonstopux*) 2615 + libsuff= shlibsuff= 2616 + ;; 2617 + *) 2618 + case $LD in # libtool.m4 will add one of these switches to LD 2619 + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") 2620 + libsuff= shlibsuff= libmagic=32-bit;; 2621 + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") 2622 + libsuff=32 shlibsuff=N32 libmagic=N32;; 2623 + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") 2624 + libsuff=64 shlibsuff=64 libmagic=64-bit;; 2625 + *) libsuff= shlibsuff= libmagic=never-match;; 2626 + esac 2627 + ;; 2628 + esac 2629 + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH 2630 + shlibpath_overrides_runpath=no 2631 + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" 2632 + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" 2633 + hardcode_into_libs=yes 2634 + ;; 2635 + 2636 +# No shared lib support for Linux oldld, aout, or coff. 2637 +linux*oldld* | linux*aout* | linux*coff*) 2638 + dynamic_linker=no 2639 + ;; 2640 + 2641 +# This must be glibc/ELF. 2642 +linux* | k*bsd*-gnu | kopensolaris*-gnu) 2643 + version_type=linux # correct to gnu/linux during the next big refactor 2644 + need_lib_prefix=no 2645 + need_version=no 2646 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2647 + soname_spec='${libname}${release}${shared_ext}$major' 2648 + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' 2649 + shlibpath_var=LD_LIBRARY_PATH 2650 + shlibpath_overrides_runpath=no 2651 + 2652 + # Some binutils ld are patched to set DT_RUNPATH 2653 + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], 2654 + [lt_cv_shlibpath_overrides_runpath=no 2655 + save_LDFLAGS=$LDFLAGS 2656 + save_libdir=$libdir 2657 + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ 2658 + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" 2659 + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], 2660 + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], 2661 + [lt_cv_shlibpath_overrides_runpath=yes])]) 2662 + LDFLAGS=$save_LDFLAGS 2663 + libdir=$save_libdir 2664 + ]) 2665 + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath 2666 + 2667 + # This implies no fast_install, which is unacceptable. 2668 + # Some rework will be needed to allow for fast_install 2669 + # before this can be enabled. 2670 + hardcode_into_libs=yes 2671 + 2672 + # Add ABI-specific directories to the system library path. 2673 + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" 2674 + 2675 + # Append ld.so.conf contents to the search path 2676 + if test -f /etc/ld.so.conf; then 2677 + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` 2678 + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" 2679 + 2680 + fi 2681 + 2682 + # We used to test for /lib/ld.so.1 and disable shared libraries on 2683 + # powerpc, because MkLinux only supported shared libraries with the 2684 + # GNU dynamic linker. Since this was broken with cross compilers, 2685 + # most powerpc-linux boxes support dynamic linking these days and 2686 + # people can always --disable-shared, the test was removed, and we 2687 + # assume the GNU/Linux dynamic linker is in use. 2688 + dynamic_linker='GNU/Linux ld.so' 2689 + ;; 2690 + 2691 +netbsd*) 2692 + version_type=sunos 2693 + need_lib_prefix=no 2694 + need_version=no 2695 + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then 2696 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' 2697 + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' 2698 + dynamic_linker='NetBSD (a.out) ld.so' 2699 + else 2700 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' 2701 + soname_spec='${libname}${release}${shared_ext}$major' 2702 + dynamic_linker='NetBSD ld.elf_so' 2703 + fi 2704 + shlibpath_var=LD_LIBRARY_PATH 2705 + shlibpath_overrides_runpath=yes 2706 + hardcode_into_libs=yes 2707 + ;; 2708 + 2709 +newsos6) 2710 + version_type=linux # correct to gnu/linux during the next big refactor 2711 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2712 + shlibpath_var=LD_LIBRARY_PATH 2713 + shlibpath_overrides_runpath=yes 2714 + ;; 2715 + 2716 +*nto* | *qnx*) 2717 + version_type=qnx 2718 + need_lib_prefix=no 2719 + need_version=no 2720 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2721 + soname_spec='${libname}${release}${shared_ext}$major' 2722 + shlibpath_var=LD_LIBRARY_PATH 2723 + shlibpath_overrides_runpath=no 2724 + hardcode_into_libs=yes 2725 + dynamic_linker='ldqnx.so' 2726 + ;; 2727 + 2728 +openbsd*) 2729 + version_type=sunos 2730 + sys_lib_dlsearch_path_spec="/usr/lib" 2731 + need_lib_prefix=no 2732 + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. 2733 + case $host_os in 2734 + openbsd3.3 | openbsd3.3.*) need_version=yes ;; 2735 + *) need_version=no ;; 2736 + esac 2737 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' 2738 + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' 2739 + shlibpath_var=LD_LIBRARY_PATH 2740 + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then 2741 + case $host_os in 2742 + openbsd2.[[89]] | openbsd2.[[89]].*) 2743 + shlibpath_overrides_runpath=no 2744 + ;; 2745 + *) 2746 + shlibpath_overrides_runpath=yes 2747 + ;; 2748 + esac 2749 + else 2750 + shlibpath_overrides_runpath=yes 2751 + fi 2752 + ;; 2753 + 2754 +os2*) 2755 + libname_spec='$name' 2756 + shrext_cmds=".dll" 2757 + need_lib_prefix=no 2758 + library_names_spec='$libname${shared_ext} $libname.a' 2759 + dynamic_linker='OS/2 ld.exe' 2760 + shlibpath_var=LIBPATH 2761 + ;; 2762 + 2763 +osf3* | osf4* | osf5*) 2764 + version_type=osf 2765 + need_lib_prefix=no 2766 + need_version=no 2767 + soname_spec='${libname}${release}${shared_ext}$major' 2768 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2769 + shlibpath_var=LD_LIBRARY_PATH 2770 + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" 2771 + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" 2772 + ;; 2773 + 2774 +rdos*) 2775 + dynamic_linker=no 2776 + ;; 2777 + 2778 +solaris*) 2779 + version_type=linux # correct to gnu/linux during the next big refactor 2780 + need_lib_prefix=no 2781 + need_version=no 2782 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2783 + soname_spec='${libname}${release}${shared_ext}$major' 2784 + shlibpath_var=LD_LIBRARY_PATH 2785 + shlibpath_overrides_runpath=yes 2786 + hardcode_into_libs=yes 2787 + # ldd complains unless libraries are executable 2788 + postinstall_cmds='chmod +x $lib' 2789 + ;; 2790 + 2791 +sunos4*) 2792 + version_type=sunos 2793 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' 2794 + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' 2795 + shlibpath_var=LD_LIBRARY_PATH 2796 + shlibpath_overrides_runpath=yes 2797 + if test "$with_gnu_ld" = yes; then 2798 + need_lib_prefix=no 2799 + fi 2800 + need_version=yes 2801 + ;; 2802 + 2803 +sysv4 | sysv4.3*) 2804 + version_type=linux # correct to gnu/linux during the next big refactor 2805 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2806 + soname_spec='${libname}${release}${shared_ext}$major' 2807 + shlibpath_var=LD_LIBRARY_PATH 2808 + case $host_vendor in 2809 + sni) 2810 + shlibpath_overrides_runpath=no 2811 + need_lib_prefix=no 2812 + runpath_var=LD_RUN_PATH 2813 + ;; 2814 + siemens) 2815 + need_lib_prefix=no 2816 + ;; 2817 + motorola) 2818 + need_lib_prefix=no 2819 + need_version=no 2820 + shlibpath_overrides_runpath=no 2821 + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' 2822 + ;; 2823 + esac 2824 + ;; 2825 + 2826 +sysv4*MP*) 2827 + if test -d /usr/nec ;then 2828 + version_type=linux # correct to gnu/linux during the next big refactor 2829 + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' 2830 + soname_spec='$libname${shared_ext}.$major' 2831 + shlibpath_var=LD_LIBRARY_PATH 2832 + fi 2833 + ;; 2834 + 2835 +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) 2836 + version_type=freebsd-elf 2837 + need_lib_prefix=no 2838 + need_version=no 2839 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' 2840 + soname_spec='${libname}${release}${shared_ext}$major' 2841 + shlibpath_var=LD_LIBRARY_PATH 2842 + shlibpath_overrides_runpath=yes 2843 + hardcode_into_libs=yes 2844 + if test "$with_gnu_ld" = yes; then 2845 + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' 2846 + else 2847 + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' 2848 + case $host_os in 2849 + sco3.2v5*) 2850 + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" 2851 + ;; 2852 + esac 2853 + fi 2854 + sys_lib_dlsearch_path_spec='/usr/lib' 2855 + ;; 2856 + 2857 +tpf*) 2858 + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. 2859 + version_type=linux # correct to gnu/linux during the next big refactor 2860 + need_lib_prefix=no 2861 + need_version=no 2862 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2863 + shlibpath_var=LD_LIBRARY_PATH 2864 + shlibpath_overrides_runpath=no 2865 + hardcode_into_libs=yes 2866 + ;; 2867 + 2868 +uts4*) 2869 + version_type=linux # correct to gnu/linux during the next big refactor 2870 + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' 2871 + soname_spec='${libname}${release}${shared_ext}$major' 2872 + shlibpath_var=LD_LIBRARY_PATH 2873 + ;; 2874 + 2875 +*) 2876 + dynamic_linker=no 2877 + ;; 2878 +esac 2879 +AC_MSG_RESULT([$dynamic_linker]) 2880 +test "$dynamic_linker" = no && can_build_shared=no 2881 + 2882 +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" 2883 +if test "$GCC" = yes; then 2884 + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" 2885 +fi 2886 + 2887 +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then 2888 + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" 2889 +fi 2890 +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then 2891 + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" 2892 +fi 2893 + 2894 +_LT_DECL([], [variables_saved_for_relink], [1], 2895 + [Variables whose values should be saved in libtool wrapper scripts and 2896 + restored at link time]) 2897 +_LT_DECL([], [need_lib_prefix], [0], 2898 + [Do we need the "lib" prefix for modules?]) 2899 +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) 2900 +_LT_DECL([], [version_type], [0], [Library versioning type]) 2901 +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) 2902 +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) 2903 +_LT_DECL([], [shlibpath_overrides_runpath], [0], 2904 + [Is shlibpath searched before the hard-coded library search path?]) 2905 +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) 2906 +_LT_DECL([], [library_names_spec], [1], 2907 + [[List of archive names. First name is the real one, the rest are links. 2908 + The last name is the one that the linker finds with -lNAME]]) 2909 +_LT_DECL([], [soname_spec], [1], 2910 + [[The coded name of the library, if different from the real name]]) 2911 +_LT_DECL([], [install_override_mode], [1], 2912 + [Permission mode override for installation of shared libraries]) 2913 +_LT_DECL([], [postinstall_cmds], [2], 2914 + [Command to use after installation of a shared archive]) 2915 +_LT_DECL([], [postuninstall_cmds], [2], 2916 + [Command to use after uninstallation of a shared archive]) 2917 +_LT_DECL([], [finish_cmds], [2], 2918 + [Commands used to finish a libtool library installation in a directory]) 2919 +_LT_DECL([], [finish_eval], [1], 2920 + [[As "finish_cmds", except a single script fragment to be evaled but 2921 + not shown]]) 2922 +_LT_DECL([], [hardcode_into_libs], [0], 2923 + [Whether we should hardcode library paths into libraries]) 2924 +_LT_DECL([], [sys_lib_search_path_spec], [2], 2925 + [Compile-time system search path for libraries]) 2926 +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], 2927 + [Run-time system search path for libraries]) 2928 +])# _LT_SYS_DYNAMIC_LINKER 2929 + 2930 + 2931 +# _LT_PATH_TOOL_PREFIX(TOOL) 2932 +# -------------------------- 2933 +# find a file program which can recognize shared library 2934 +AC_DEFUN([_LT_PATH_TOOL_PREFIX], 2935 +[m4_require([_LT_DECL_EGREP])dnl 2936 +AC_MSG_CHECKING([for $1]) 2937 +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, 2938 +[case $MAGIC_CMD in 2939 +[[\\/*] | ?:[\\/]*]) 2940 + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. 2941 + ;; 2942 +*) 2943 + lt_save_MAGIC_CMD="$MAGIC_CMD" 2944 + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR 2945 +dnl $ac_dummy forces splitting on constant user-supplied paths. 2946 +dnl POSIX.2 word splitting is done only on the output of word expansions, 2947 +dnl not every word. This closes a longstanding sh security hole. 2948 + ac_dummy="m4_if([$2], , $PATH, [$2])" 2949 + for ac_dir in $ac_dummy; do 2950 + IFS="$lt_save_ifs" 2951 + test -z "$ac_dir" && ac_dir=. 2952 + if test -f $ac_dir/$1; then 2953 + lt_cv_path_MAGIC_CMD="$ac_dir/$1" 2954 + if test -n "$file_magic_test_file"; then 2955 + case $deplibs_check_method in 2956 + "file_magic "*) 2957 + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` 2958 + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" 2959 + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | 2960 + $EGREP "$file_magic_regex" > /dev/null; then 2961 + : 2962 + else 2963 + cat <<_LT_EOF 1>&2 2964 + 2965 +*** Warning: the command libtool uses to detect shared libraries, 2966 +*** $file_magic_cmd, produces output that libtool cannot recognize. 2967 +*** The result is that libtool may fail to recognize shared libraries 2968 +*** as such. This will affect the creation of libtool libraries that 2969 +*** depend on shared libraries, but programs linked with such libtool 2970 +*** libraries will work regardless of this problem. Nevertheless, you 2971 +*** may want to report the problem to your system manager and/or to 2972 +*** bug-libtool@gnu.org 2973 + 2974 +_LT_EOF 2975 + fi ;; 2976 + esac 2977 + fi 2978 + break 2979 + fi 2980 + done 2981 + IFS="$lt_save_ifs" 2982 + MAGIC_CMD="$lt_save_MAGIC_CMD" 2983 + ;; 2984 +esac]) 2985 +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" 2986 +if test -n "$MAGIC_CMD"; then 2987 + AC_MSG_RESULT($MAGIC_CMD) 2988 +else 2989 + AC_MSG_RESULT(no) 2990 +fi 2991 +_LT_DECL([], [MAGIC_CMD], [0], 2992 + [Used to examine libraries when file_magic_cmd begins with "file"])dnl 2993 +])# _LT_PATH_TOOL_PREFIX 2994 + 2995 +# Old name: 2996 +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) 2997 +dnl aclocal-1.4 backwards compatibility: 2998 +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) 2999 + 3000 + 3001 +# _LT_PATH_MAGIC 3002 +# -------------- 3003 +# find a file program which can recognize a shared library 3004 +m4_defun([_LT_PATH_MAGIC], 3005 +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) 3006 +if test -z "$lt_cv_path_MAGIC_CMD"; then 3007 + if test -n "$ac_tool_prefix"; then 3008 + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) 3009 + else 3010 + MAGIC_CMD=: 3011 + fi 3012 +fi 3013 +])# _LT_PATH_MAGIC 3014 + 3015 + 3016 +# LT_PATH_LD 3017 +# ---------- 3018 +# find the pathname to the GNU or non-GNU linker 3019 +AC_DEFUN([LT_PATH_LD], 3020 +[AC_REQUIRE([AC_PROG_CC])dnl 3021 +AC_REQUIRE([AC_CANONICAL_HOST])dnl 3022 +AC_REQUIRE([AC_CANONICAL_BUILD])dnl 3023 +m4_require([_LT_DECL_SED])dnl 3024 +m4_require([_LT_DECL_EGREP])dnl 3025 +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl 3026 + 3027 +AC_ARG_WITH([gnu-ld], 3028 + [AS_HELP_STRING([--with-gnu-ld], 3029 + [assume the C compiler uses GNU ld @<:@default=no@:>@])], 3030 + [test "$withval" = no || with_gnu_ld=yes], 3031 + [with_gnu_ld=no])dnl 3032 + 3033 +ac_prog=ld 3034 +if test "$GCC" = yes; then 3035 + # Check if gcc -print-prog-name=ld gives a path. 3036 + AC_MSG_CHECKING([for ld used by $CC]) 3037 + case $host in 3038 + *-*-mingw*) 3039 + # gcc leaves a trailing carriage return which upsets mingw 3040 + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; 3041 + *) 3042 + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; 3043 + esac 3044 + case $ac_prog in 3045 + # Accept absolute paths. 3046 + [[\\/]]* | ?:[[\\/]]*) 3047 + re_direlt='/[[^/]][[^/]]*/\.\./' 3048 + # Canonicalize the pathname of ld 3049 + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` 3050 + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do 3051 + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` 3052 + done 3053 + test -z "$LD" && LD="$ac_prog" 3054 + ;; 3055 + "") 3056 + # If it fails, then pretend we aren't using GCC. 3057 + ac_prog=ld 3058 + ;; 3059 + *) 3060 + # If it is relative, then search for the first ld in PATH. 3061 + with_gnu_ld=unknown 3062 + ;; 3063 + esac 3064 +elif test "$with_gnu_ld" = yes; then 3065 + AC_MSG_CHECKING([for GNU ld]) 3066 +else 3067 + AC_MSG_CHECKING([for non-GNU ld]) 3068 +fi 3069 +AC_CACHE_VAL(lt_cv_path_LD, 3070 +[if test -z "$LD"; then 3071 + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR 3072 + for ac_dir in $PATH; do 3073 + IFS="$lt_save_ifs" 3074 + test -z "$ac_dir" && ac_dir=. 3075 + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then 3076 + lt_cv_path_LD="$ac_dir/$ac_prog" 3077 + # Check to see if the program is GNU ld. I'd rather use --version, 3078 + # but apparently some variants of GNU ld only accept -v. 3079 + # Break only if it was the GNU/non-GNU ld that we prefer. 3080 + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in 3081 + *GNU* | *'with BFD'*) 3082 + test "$with_gnu_ld" != no && break 3083 + ;; 3084 + *) 3085 + test "$with_gnu_ld" != yes && break 3086 + ;; 3087 + esac 3088 + fi 3089 + done 3090 + IFS="$lt_save_ifs" 3091 +else 3092 + lt_cv_path_LD="$LD" # Let the user override the test with a path. 3093 +fi]) 3094 +LD="$lt_cv_path_LD" 3095 +if test -n "$LD"; then 3096 + AC_MSG_RESULT($LD) 3097 +else 3098 + AC_MSG_RESULT(no) 3099 +fi 3100 +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) 3101 +_LT_PATH_LD_GNU 3102 +AC_SUBST([LD]) 3103 + 3104 +_LT_TAGDECL([], [LD], [1], [The linker used to build libraries]) 3105 +])# LT_PATH_LD 3106 + 3107 +# Old names: 3108 +AU_ALIAS([AM_PROG_LD], [LT_PATH_LD]) 3109 +AU_ALIAS([AC_PROG_LD], [LT_PATH_LD]) 3110 +dnl aclocal-1.4 backwards compatibility: 3111 +dnl AC_DEFUN([AM_PROG_LD], []) 3112 +dnl AC_DEFUN([AC_PROG_LD], []) 3113 + 3114 + 3115 +# _LT_PATH_LD_GNU 3116 +#- -------------- 3117 +m4_defun([_LT_PATH_LD_GNU], 3118 +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, 3119 +[# I'd rather use --version here, but apparently some GNU lds only accept -v. 3120 +case `$LD -v 2>&1 </dev/null` in 3121 +*GNU* | *'with BFD'*) 3122 + lt_cv_prog_gnu_ld=yes 3123 + ;; 3124 +*) 3125 + lt_cv_prog_gnu_ld=no 3126 + ;; 3127 +esac]) 3128 +with_gnu_ld=$lt_cv_prog_gnu_ld 3129 +])# _LT_PATH_LD_GNU 3130 + 3131 + 3132 +# _LT_CMD_RELOAD 3133 +# -------------- 3134 +# find reload flag for linker 3135 +# -- PORTME Some linkers may need a different reload flag. 3136 +m4_defun([_LT_CMD_RELOAD], 3137 +[AC_CACHE_CHECK([for $LD option to reload object files], 3138 + lt_cv_ld_reload_flag, 3139 + [lt_cv_ld_reload_flag='-r']) 3140 +reload_flag=$lt_cv_ld_reload_flag 3141 +case $reload_flag in 3142 +"" | " "*) ;; 3143 +*) reload_flag=" $reload_flag" ;; 3144 +esac 3145 +reload_cmds='$LD$reload_flag -o $output$reload_objs' 3146 +case $host_os in 3147 + cygwin* | mingw* | pw32* | cegcc*) 3148 + if test "$GCC" != yes; then 3149 + reload_cmds=false 3150 + fi 3151 + ;; 3152 + darwin*) 3153 + if test "$GCC" = yes; then 3154 + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' 3155 + else 3156 + reload_cmds='$LD$reload_flag -o $output$reload_objs' 3157 + fi 3158 + ;; 3159 +esac 3160 +_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl 3161 +_LT_TAGDECL([], [reload_cmds], [2])dnl 3162 +])# _LT_CMD_RELOAD 3163 + 3164 + 3165 +# _LT_CHECK_MAGIC_METHOD 3166 +# ---------------------- 3167 +# how to check for library dependencies 3168 +# -- PORTME fill in with the dynamic library characteristics 3169 +m4_defun([_LT_CHECK_MAGIC_METHOD], 3170 +[m4_require([_LT_DECL_EGREP]) 3171 +m4_require([_LT_DECL_OBJDUMP]) 3172 +AC_CACHE_CHECK([how to recognize dependent libraries], 3173 +lt_cv_deplibs_check_method, 3174 +[lt_cv_file_magic_cmd='$MAGIC_CMD' 3175 +lt_cv_file_magic_test_file= 3176 +lt_cv_deplibs_check_method='unknown' 3177 +# Need to set the preceding variable on all platforms that support 3178 +# interlibrary dependencies. 3179 +# 'none' -- dependencies not supported. 3180 +# `unknown' -- same as none, but documents that we really don't know. 3181 +# 'pass_all' -- all dependencies passed with no checks. 3182 +# 'test_compile' -- check by making test program. 3183 +# 'file_magic [[regex]]' -- check by looking for files in library path 3184 +# which responds to the $file_magic_cmd with a given extended regex. 3185 +# If you have `file' or equivalent on your system and you're not sure 3186 +# whether `pass_all' will *always* work, you probably want this one. 3187 + 3188 +case $host_os in 3189 +aix[[4-9]]*) 3190 + lt_cv_deplibs_check_method=pass_all 3191 + ;; 3192 + 3193 +beos*) 3194 + lt_cv_deplibs_check_method=pass_all 3195 + ;; 3196 + 3197 +bsdi[[45]]*) 3198 + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' 3199 + lt_cv_file_magic_cmd='/usr/bin/file -L' 3200 + lt_cv_file_magic_test_file=/shlib/libc.so 3201 + ;; 3202 + 3203 +cygwin*) 3204 + # func_win32_libid is a shell function defined in ltmain.sh 3205 + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' 3206 + lt_cv_file_magic_cmd='func_win32_libid' 3207 + ;; 3208 + 3209 +mingw* | pw32*) 3210 + # Base MSYS/MinGW do not provide the 'file' command needed by 3211 + # func_win32_libid shell function, so use a weaker test based on 'objdump', 3212 + # unless we find 'file', for example because we are cross-compiling. 3213 + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. 3214 + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then 3215 + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' 3216 + lt_cv_file_magic_cmd='func_win32_libid' 3217 + else 3218 + # Keep this pattern in sync with the one in func_win32_libid. 3219 + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' 3220 + lt_cv_file_magic_cmd='$OBJDUMP -f' 3221 + fi 3222 + ;; 3223 + 3224 +cegcc*) 3225 + # use the weaker test based on 'objdump'. See mingw*. 3226 + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' 3227 + lt_cv_file_magic_cmd='$OBJDUMP -f' 3228 + ;; 3229 + 3230 +darwin* | rhapsody*) 3231 + lt_cv_deplibs_check_method=pass_all 3232 + ;; 3233 + 3234 +freebsd* | dragonfly*) 3235 + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then 3236 + case $host_cpu in 3237 + i*86 ) 3238 + # Not sure whether the presence of OpenBSD here was a mistake. 3239 + # Let's accept both of them until this is cleared up. 3240 + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' 3241 + lt_cv_file_magic_cmd=/usr/bin/file 3242 + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` 3243 + ;; 3244 + esac 3245 + else 3246 + lt_cv_deplibs_check_method=pass_all 3247 + fi 3248 + ;; 3249 + 3250 +gnu*) 3251 + lt_cv_deplibs_check_method=pass_all 3252 + ;; 3253 + 3254 +haiku*) 3255 + lt_cv_deplibs_check_method=pass_all 3256 + ;; 3257 + 3258 +hpux10.20* | hpux11*) 3259 + lt_cv_file_magic_cmd=/usr/bin/file 3260 + case $host_cpu in 3261 + ia64*) 3262 + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' 3263 + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so 3264 + ;; 3265 + hppa*64*) 3266 + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] 3267 + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl 3268 + ;; 3269 + *) 3270 + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' 3271 + lt_cv_file_magic_test_file=/usr/lib/libc.sl 3272 + ;; 3273 + esac 3274 + ;; 3275 + 3276 +interix[[3-9]]*) 3277 + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here 3278 + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' 3279 + ;; 3280 + 3281 +irix5* | irix6* | nonstopux*) 3282 + case $LD in 3283 + *-32|*"-32 ") libmagic=32-bit;; 3284 + *-n32|*"-n32 ") libmagic=N32;; 3285 + *-64|*"-64 ") libmagic=64-bit;; 3286 + *) libmagic=never-match;; 3287 + esac 3288 + lt_cv_deplibs_check_method=pass_all 3289 + ;; 3290 + 3291 +# This must be glibc/ELF. 3292 +linux* | k*bsd*-gnu | kopensolaris*-gnu) 3293 + lt_cv_deplibs_check_method=pass_all 3294 + ;; 3295 + 3296 +netbsd*) 3297 + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then 3298 + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' 3299 + else 3300 + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' 3301 + fi 3302 + ;; 3303 + 3304 +newos6*) 3305 + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' 3306 + lt_cv_file_magic_cmd=/usr/bin/file 3307 + lt_cv_file_magic_test_file=/usr/lib/libnls.so 3308 + ;; 3309 + 3310 +*nto* | *qnx*) 3311 + lt_cv_deplibs_check_method=pass_all 3312 + ;; 3313 + 3314 +openbsd*) 3315 + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then 3316 + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' 3317 + else 3318 + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' 3319 + fi 3320 + ;; 3321 + 3322 +osf3* | osf4* | osf5*) 3323 + lt_cv_deplibs_check_method=pass_all 3324 + ;; 3325 + 3326 +rdos*) 3327 + lt_cv_deplibs_check_method=pass_all 3328 + ;; 3329 + 3330 +solaris*) 3331 + lt_cv_deplibs_check_method=pass_all 3332 + ;; 3333 + 3334 +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) 3335 + lt_cv_deplibs_check_method=pass_all 3336 + ;; 3337 + 3338 +sysv4 | sysv4.3*) 3339 + case $host_vendor in 3340 + motorola) 3341 + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' 3342 + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` 3343 + ;; 3344 + ncr) 3345 + lt_cv_deplibs_check_method=pass_all 3346 + ;; 3347 + sequent) 3348 + lt_cv_file_magic_cmd='/bin/file' 3349 + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' 3350 + ;; 3351 + sni) 3352 + lt_cv_file_magic_cmd='/bin/file' 3353 + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" 3354 + lt_cv_file_magic_test_file=/lib/libc.so 3355 + ;; 3356 + siemens) 3357 + lt_cv_deplibs_check_method=pass_all 3358 + ;; 3359 + pc) 3360 + lt_cv_deplibs_check_method=pass_all 3361 + ;; 3362 + esac 3363 + ;; 3364 + 3365 +tpf*) 3366 + lt_cv_deplibs_check_method=pass_all 3367 + ;; 3368 +esac 3369 +]) 3370 + 3371 +file_magic_glob= 3372 +want_nocaseglob=no 3373 +if test "$build" = "$host"; then 3374 + case $host_os in 3375 + mingw* | pw32*) 3376 + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then 3377 + want_nocaseglob=yes 3378 + else 3379 + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` 3380 + fi 3381 + ;; 3382 + esac 3383 +fi 3384 + 3385 +file_magic_cmd=$lt_cv_file_magic_cmd 3386 +deplibs_check_method=$lt_cv_deplibs_check_method 3387 +test -z "$deplibs_check_method" && deplibs_check_method=unknown 3388 + 3389 +_LT_DECL([], [deplibs_check_method], [1], 3390 + [Method to check whether dependent libraries are shared objects]) 3391 +_LT_DECL([], [file_magic_cmd], [1], 3392 + [Command to use when deplibs_check_method = "file_magic"]) 3393 +_LT_DECL([], [file_magic_glob], [1], 3394 + [How to find potential files when deplibs_check_method = "file_magic"]) 3395 +_LT_DECL([], [want_nocaseglob], [1], 3396 + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) 3397 +])# _LT_CHECK_MAGIC_METHOD 3398 + 3399 + 3400 +# LT_PATH_NM 3401 +# ---------- 3402 +# find the pathname to a BSD- or MS-compatible name lister 3403 +AC_DEFUN([LT_PATH_NM], 3404 +[AC_REQUIRE([AC_PROG_CC])dnl 3405 +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, 3406 +[if test -n "$NM"; then 3407 + # Let the user override the test. 3408 + lt_cv_path_NM="$NM" 3409 +else 3410 + lt_nm_to_check="${ac_tool_prefix}nm" 3411 + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then 3412 + lt_nm_to_check="$lt_nm_to_check nm" 3413 + fi 3414 + for lt_tmp_nm in $lt_nm_to_check; do 3415 + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR 3416 + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do 3417 + IFS="$lt_save_ifs" 3418 + test -z "$ac_dir" && ac_dir=. 3419 + tmp_nm="$ac_dir/$lt_tmp_nm" 3420 + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then 3421 + # Check to see if the nm accepts a BSD-compat flag. 3422 + # Adding the `sed 1q' prevents false positives on HP-UX, which says: 3423 + # nm: unknown option "B" ignored 3424 + # Tru64's nm complains that /dev/null is an invalid object file 3425 + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in 3426 + */dev/null* | *'Invalid file or object type'*) 3427 + lt_cv_path_NM="$tmp_nm -B" 3428 + break 3429 + ;; 3430 + *) 3431 + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in 3432 + */dev/null*) 3433 + lt_cv_path_NM="$tmp_nm -p" 3434 + break 3435 + ;; 3436 + *) 3437 + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but 3438 + continue # so that we can try to find one that supports BSD flags 3439 + ;; 3440 + esac 3441 + ;; 3442 + esac 3443 + fi 3444 + done 3445 + IFS="$lt_save_ifs" 3446 + done 3447 + : ${lt_cv_path_NM=no} 3448 +fi]) 3449 +if test "$lt_cv_path_NM" != "no"; then 3450 + NM="$lt_cv_path_NM" 3451 +else 3452 + # Didn't find any BSD compatible name lister, look for dumpbin. 3453 + if test -n "$DUMPBIN"; then : 3454 + # Let the user override the test. 3455 + else 3456 + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) 3457 + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in 3458 + *COFF*) 3459 + DUMPBIN="$DUMPBIN -symbols" 3460 + ;; 3461 + *) 3462 + DUMPBIN=: 3463 + ;; 3464 + esac 3465 + fi 3466 + AC_SUBST([DUMPBIN]) 3467 + if test "$DUMPBIN" != ":"; then 3468 + NM="$DUMPBIN" 3469 + fi 3470 +fi 3471 +test -z "$NM" && NM=nm 3472 +AC_SUBST([NM]) 3473 +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl 3474 + 3475 +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], 3476 + [lt_cv_nm_interface="BSD nm" 3477 + echo "int some_variable = 0;" > conftest.$ac_ext 3478 + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) 3479 + (eval "$ac_compile" 2>conftest.err) 3480 + cat conftest.err >&AS_MESSAGE_LOG_FD 3481 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) 3482 + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) 3483 + cat conftest.err >&AS_MESSAGE_LOG_FD 3484 + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) 3485 + cat conftest.out >&AS_MESSAGE_LOG_FD 3486 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then 3487 + lt_cv_nm_interface="MS dumpbin" 3488 + fi 3489 + rm -f conftest*]) 3490 +])# LT_PATH_NM 3491 + 3492 +# Old names: 3493 +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) 3494 +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) 3495 +dnl aclocal-1.4 backwards compatibility: 3496 +dnl AC_DEFUN([AM_PROG_NM], []) 3497 +dnl AC_DEFUN([AC_PROG_NM], []) 3498 + 3499 +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB 3500 +# -------------------------------- 3501 +# how to determine the name of the shared library 3502 +# associated with a specific link library. 3503 +# -- PORTME fill in with the dynamic library characteristics 3504 +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], 3505 +[m4_require([_LT_DECL_EGREP]) 3506 +m4_require([_LT_DECL_OBJDUMP]) 3507 +m4_require([_LT_DECL_DLLTOOL]) 3508 +AC_CACHE_CHECK([how to associate runtime and link libraries], 3509 +lt_cv_sharedlib_from_linklib_cmd, 3510 +[lt_cv_sharedlib_from_linklib_cmd='unknown' 3511 + 3512 +case $host_os in 3513 +cygwin* | mingw* | pw32* | cegcc*) 3514 + # two different shell functions defined in ltmain.sh 3515 + # decide which to use based on capabilities of $DLLTOOL 3516 + case `$DLLTOOL --help 2>&1` in 3517 + *--identify-strict*) 3518 + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib 3519 + ;; 3520 + *) 3521 + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback 3522 + ;; 3523 + esac 3524 + ;; 3525 +*) 3526 + # fallback: assume linklib IS sharedlib 3527 + lt_cv_sharedlib_from_linklib_cmd="$ECHO" 3528 + ;; 3529 +esac 3530 +]) 3531 +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd 3532 +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO 3533 + 3534 +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], 3535 + [Command to associate shared and link libraries]) 3536 +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB 3537 + 3538 + 3539 +# _LT_PATH_MANIFEST_TOOL 3540 +# ---------------------- 3541 +# locate the manifest tool 3542 +m4_defun([_LT_PATH_MANIFEST_TOOL], 3543 +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) 3544 +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt 3545 +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], 3546 + [lt_cv_path_mainfest_tool=no 3547 + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD 3548 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out 3549 + cat conftest.err >&AS_MESSAGE_LOG_FD 3550 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then 3551 + lt_cv_path_mainfest_tool=yes 3552 + fi 3553 + rm -f conftest*]) 3554 +if test "x$lt_cv_path_mainfest_tool" != xyes; then 3555 + MANIFEST_TOOL=: 3556 +fi 3557 +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl 3558 +])# _LT_PATH_MANIFEST_TOOL 3559 + 3560 + 3561 +# LT_LIB_M 3562 +# -------- 3563 +# check for math library 3564 +AC_DEFUN([LT_LIB_M], 3565 +[AC_REQUIRE([AC_CANONICAL_HOST])dnl 3566 +LIBM= 3567 +case $host in 3568 +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) 3569 + # These system don't have libm, or don't need it 3570 + ;; 3571 +*-ncr-sysv4.3*) 3572 + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") 3573 + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") 3574 + ;; 3575 +*) 3576 + AC_CHECK_LIB(m, cos, LIBM="-lm") 3577 + ;; 3578 +esac 3579 +AC_SUBST([LIBM]) 3580 +])# LT_LIB_M 3581 + 3582 +# Old name: 3583 +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) 3584 +dnl aclocal-1.4 backwards compatibility: 3585 +dnl AC_DEFUN([AC_CHECK_LIBM], []) 3586 + 3587 + 3588 +# _LT_COMPILER_NO_RTTI([TAGNAME]) 3589 +# ------------------------------- 3590 +m4_defun([_LT_COMPILER_NO_RTTI], 3591 +[m4_require([_LT_TAG_COMPILER])dnl 3592 + 3593 +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= 3594 + 3595 +if test "$GCC" = yes; then 3596 + case $cc_basename in 3597 + nvcc*) 3598 + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; 3599 + *) 3600 + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; 3601 + esac 3602 + 3603 + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], 3604 + lt_cv_prog_compiler_rtti_exceptions, 3605 + [-fno-rtti -fno-exceptions], [], 3606 + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) 3607 +fi 3608 +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], 3609 + [Compiler flag to turn off builtin functions]) 3610 +])# _LT_COMPILER_NO_RTTI 3611 + 3612 + 3613 +# _LT_CMD_GLOBAL_SYMBOLS 3614 +# ---------------------- 3615 +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], 3616 +[AC_REQUIRE([AC_CANONICAL_HOST])dnl 3617 +AC_REQUIRE([AC_PROG_CC])dnl 3618 +AC_REQUIRE([AC_PROG_AWK])dnl 3619 +AC_REQUIRE([LT_PATH_NM])dnl 3620 +AC_REQUIRE([LT_PATH_LD])dnl 3621 +m4_require([_LT_DECL_SED])dnl 3622 +m4_require([_LT_DECL_EGREP])dnl 3623 +m4_require([_LT_TAG_COMPILER])dnl 3624 + 3625 +# Check for command to grab the raw symbol name followed by C symbol from nm. 3626 +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) 3627 +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], 3628 +[ 3629 +# These are sane defaults that work on at least a few old systems. 3630 +# [They come from Ultrix. What could be older than Ultrix?!! ;)] 3631 + 3632 +# Character class describing NM global symbol codes. 3633 +symcode='[[BCDEGRST]]' 3634 + 3635 +# Regexp to match symbols that can be accessed directly from C. 3636 +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' 3637 + 3638 +# Define system-specific variables. 3639 +case $host_os in 3640 +aix*) 3641 + symcode='[[BCDT]]' 3642 + ;; 3643 +cygwin* | mingw* | pw32* | cegcc*) 3644 + symcode='[[ABCDGISTW]]' 3645 + ;; 3646 +hpux*) 3647 + if test "$host_cpu" = ia64; then 3648 + symcode='[[ABCDEGRST]]' 3649 + fi 3650 + ;; 3651 +irix* | nonstopux*) 3652 + symcode='[[BCDEGRST]]' 3653 + ;; 3654 +osf*) 3655 + symcode='[[BCDEGQRST]]' 3656 + ;; 3657 +solaris*) 3658 + symcode='[[BDRT]]' 3659 + ;; 3660 +sco3.2v5*) 3661 + symcode='[[DT]]' 3662 + ;; 3663 +sysv4.2uw2*) 3664 + symcode='[[DT]]' 3665 + ;; 3666 +sysv5* | sco5v6* | unixware* | OpenUNIX*) 3667 + symcode='[[ABDT]]' 3668 + ;; 3669 +sysv4) 3670 + symcode='[[DFNSTU]]' 3671 + ;; 3672 +esac 3673 + 3674 +# If we're using GNU nm, then use its standard symbol codes. 3675 +case `$NM -V 2>&1` in 3676 +*GNU* | *'with BFD'*) 3677 + symcode='[[ABCDGIRSTW]]' ;; 3678 +esac 3679 + 3680 +# Transform an extracted symbol line into a proper C declaration. 3681 +# Some systems (esp. on ia64) link data and code symbols differently, 3682 +# so use this general approach. 3683 +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" 3684 + 3685 +# Transform an extracted symbol line into symbol name and symbol address 3686 +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" 3687 +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" 3688 + 3689 +# Handle CRLF in mingw tool chain 3690 +opt_cr= 3691 +case $build_os in 3692 +mingw*) 3693 + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp 3694 + ;; 3695 +esac 3696 + 3697 +# Try without a prefix underscore, then with it. 3698 +for ac_symprfx in "" "_"; do 3699 + 3700 + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. 3701 + symxfrm="\\1 $ac_symprfx\\2 \\2" 3702 + 3703 + # Write the raw and C identifiers. 3704 + if test "$lt_cv_nm_interface" = "MS dumpbin"; then 3705 + # Fake it for dumpbin and say T for any non-static function 3706 + # and D for any global variable. 3707 + # Also find C++ and __fastcall symbols from MSVC++, 3708 + # which start with @ or ?. 3709 + lt_cv_sys_global_symbol_pipe="$AWK ['"\ 3710 +" {last_section=section; section=\$ 3};"\ 3711 +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ 3712 +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ 3713 +" \$ 0!~/External *\|/{next};"\ 3714 +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ 3715 +" {if(hide[section]) next};"\ 3716 +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ 3717 +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ 3718 +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ 3719 +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ 3720 +" ' prfx=^$ac_symprfx]" 3721 + else 3722 + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" 3723 + fi 3724 + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" 3725 + 3726 + # Check to see that the pipe works correctly. 3727 + pipe_works=no 3728 + 3729 + rm -f conftest* 3730 + cat > conftest.$ac_ext <<_LT_EOF 3731 +#ifdef __cplusplus 3732 +extern "C" { 3733 +#endif 3734 +char nm_test_var; 3735 +void nm_test_func(void); 3736 +void nm_test_func(void){} 3737 +#ifdef __cplusplus 3738 +} 3739 +#endif 3740 +int main(){nm_test_var='a';nm_test_func();return(0);} 3741 +_LT_EOF 3742 + 3743 + if AC_TRY_EVAL(ac_compile); then 3744 + # Now try to grab the symbols. 3745 + nlist=conftest.nm 3746 + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then 3747 + # Try sorting and uniquifying the output. 3748 + if sort "$nlist" | uniq > "$nlist"T; then 3749 + mv -f "$nlist"T "$nlist" 3750 + else 3751 + rm -f "$nlist"T 3752 + fi 3753 + 3754 + # Make sure that we snagged all the symbols we need. 3755 + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then 3756 + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then 3757 + cat <<_LT_EOF > conftest.$ac_ext 3758 +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ 3759 +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) 3760 +/* DATA imports from DLLs on WIN32 con't be const, because runtime 3761 + relocations are performed -- see ld's documentation on pseudo-relocs. */ 3762 +# define LT@&t@_DLSYM_CONST 3763 +#elif defined(__osf__) 3764 +/* This system does not cope well with relocations in const data. */ 3765 +# define LT@&t@_DLSYM_CONST 3766 +#else 3767 +# define LT@&t@_DLSYM_CONST const 3768 +#endif 3769 + 3770 +#ifdef __cplusplus 3771 +extern "C" { 3772 +#endif 3773 + 3774 +_LT_EOF 3775 + # Now generate the symbol file. 3776 + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' 3777 + 3778 + cat <<_LT_EOF >> conftest.$ac_ext 3779 + 3780 +/* The mapping between symbol names and symbols. */ 3781 +LT@&t@_DLSYM_CONST struct { 3782 + const char *name; 3783 + void *address; 3784 +} 3785 +lt__PROGRAM__LTX_preloaded_symbols[[]] = 3786 +{ 3787 + { "@PROGRAM@", (void *) 0 }, 3788 +_LT_EOF 3789 + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext 3790 + cat <<\_LT_EOF >> conftest.$ac_ext 3791 + {0, (void *) 0} 3792 +}; 3793 + 3794 +/* This works around a problem in FreeBSD linker */ 3795 +#ifdef FREEBSD_WORKAROUND 3796 +static const void *lt_preloaded_setup() { 3797 + return lt__PROGRAM__LTX_preloaded_symbols; 3798 +} 3799 +#endif 3800 + 3801 +#ifdef __cplusplus 3802 +} 3803 +#endif 3804 +_LT_EOF 3805 + # Now try linking the two files. 3806 + mv conftest.$ac_objext conftstm.$ac_objext 3807 + lt_globsym_save_LIBS=$LIBS 3808 + lt_globsym_save_CFLAGS=$CFLAGS 3809 + LIBS="conftstm.$ac_objext" 3810 + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" 3811 + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then 3812 + pipe_works=yes 3813 + fi 3814 + LIBS=$lt_globsym_save_LIBS 3815 + CFLAGS=$lt_globsym_save_CFLAGS 3816 + else 3817 + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD 3818 + fi 3819 + else 3820 + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD 3821 + fi 3822 + else 3823 + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD 3824 + fi 3825 + else 3826 + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD 3827 + cat conftest.$ac_ext >&5 3828 + fi 3829 + rm -rf conftest* conftst* 3830 + 3831 + # Do not use the global_symbol_pipe unless it works. 3832 + if test "$pipe_works" = yes; then 3833 + break 3834 + else 3835 + lt_cv_sys_global_symbol_pipe= 3836 + fi 3837 +done 3838 +]) 3839 +if test -z "$lt_cv_sys_global_symbol_pipe"; then 3840 + lt_cv_sys_global_symbol_to_cdecl= 3841 +fi 3842 +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then 3843 + AC_MSG_RESULT(failed) 3844 +else 3845 + AC_MSG_RESULT(ok) 3846 +fi 3847 + 3848 +# Response file support. 3849 +if test "$lt_cv_nm_interface" = "MS dumpbin"; then 3850 + nm_file_list_spec='@' 3851 +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then 3852 + nm_file_list_spec='@' 3853 +fi 3854 + 3855 +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], 3856 + [Take the output of nm and produce a listing of raw symbols and C names]) 3857 +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], 3858 + [Transform the output of nm in a proper C declaration]) 3859 +_LT_DECL([global_symbol_to_c_name_address], 3860 + [lt_cv_sys_global_symbol_to_c_name_address], [1], 3861 + [Transform the output of nm in a C name address pair]) 3862 +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], 3863 + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], 3864 + [Transform the output of nm in a C name address pair when lib prefix is needed]) 3865 +_LT_DECL([], [nm_file_list_spec], [1], 3866 + [Specify filename containing input files for $NM]) 3867 +]) # _LT_CMD_GLOBAL_SYMBOLS 3868 + 3869 + 3870 +# _LT_COMPILER_PIC([TAGNAME]) 3871 +# --------------------------- 3872 +m4_defun([_LT_COMPILER_PIC], 3873 +[m4_require([_LT_TAG_COMPILER])dnl 3874 +_LT_TAGVAR(lt_prog_compiler_wl, $1)= 3875 +_LT_TAGVAR(lt_prog_compiler_pic, $1)= 3876 +_LT_TAGVAR(lt_prog_compiler_static, $1)= 3877 + 3878 +m4_if([$1], [CXX], [ 3879 + # C++ specific cases for pic, static, wl, etc. 3880 + if test "$GXX" = yes; then 3881 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 3882 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' 3883 + 3884 + case $host_os in 3885 + aix*) 3886 + # All AIX code is PIC. 3887 + if test "$host_cpu" = ia64; then 3888 + # AIX 5 now supports IA64 processor 3889 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 3890 + fi 3891 + ;; 3892 + 3893 + amigaos*) 3894 + case $host_cpu in 3895 + powerpc) 3896 + # see comment about AmigaOS4 .so support 3897 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' 3898 + ;; 3899 + m68k) 3900 + # FIXME: we need at least 68020 code to build shared libraries, but 3901 + # adding the `-m68020' flag to GCC prevents building anything better, 3902 + # like `-m68040'. 3903 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' 3904 + ;; 3905 + esac 3906 + ;; 3907 + 3908 + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) 3909 + # PIC is the default for these OSes. 3910 + ;; 3911 + mingw* | cygwin* | os2* | pw32* | cegcc*) 3912 + # This hack is so that the source file can tell whether it is being 3913 + # built for inclusion in a dll (and should export symbols for example). 3914 + # Although the cygwin gcc ignores -fPIC, still need this for old-style 3915 + # (--disable-auto-import) libraries 3916 + m4_if([$1], [GCJ], [], 3917 + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) 3918 + ;; 3919 + darwin* | rhapsody*) 3920 + # PIC is the default on this platform 3921 + # Common symbols not allowed in MH_DYLIB files 3922 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' 3923 + ;; 3924 + *djgpp*) 3925 + # DJGPP does not support shared libraries at all 3926 + _LT_TAGVAR(lt_prog_compiler_pic, $1)= 3927 + ;; 3928 + haiku*) 3929 + # PIC is the default for Haiku. 3930 + # The "-static" flag exists, but is broken. 3931 + _LT_TAGVAR(lt_prog_compiler_static, $1)= 3932 + ;; 3933 + interix[[3-9]]*) 3934 + # Interix 3.x gcc -fpic/-fPIC options generate broken code. 3935 + # Instead, we relocate shared libraries at runtime. 3936 + ;; 3937 + sysv4*MP*) 3938 + if test -d /usr/nec; then 3939 + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic 3940 + fi 3941 + ;; 3942 + hpux*) 3943 + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit 3944 + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag 3945 + # sets the default TLS model and affects inlining. 3946 + case $host_cpu in 3947 + hppa*64*) 3948 + ;; 3949 + *) 3950 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' 3951 + ;; 3952 + esac 3953 + ;; 3954 + *qnx* | *nto*) 3955 + # QNX uses GNU C++, but need to define -shared option too, otherwise 3956 + # it will coredump. 3957 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' 3958 + ;; 3959 + *) 3960 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' 3961 + ;; 3962 + esac 3963 + else 3964 + case $host_os in 3965 + aix[[4-9]]*) 3966 + # All AIX code is PIC. 3967 + if test "$host_cpu" = ia64; then 3968 + # AIX 5 now supports IA64 processor 3969 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 3970 + else 3971 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' 3972 + fi 3973 + ;; 3974 + chorus*) 3975 + case $cc_basename in 3976 + cxch68*) 3977 + # Green Hills C++ Compiler 3978 + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" 3979 + ;; 3980 + esac 3981 + ;; 3982 + mingw* | cygwin* | os2* | pw32* | cegcc*) 3983 + # This hack is so that the source file can tell whether it is being 3984 + # built for inclusion in a dll (and should export symbols for example). 3985 + m4_if([$1], [GCJ], [], 3986 + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) 3987 + ;; 3988 + dgux*) 3989 + case $cc_basename in 3990 + ec++*) 3991 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 3992 + ;; 3993 + ghcx*) 3994 + # Green Hills C++ Compiler 3995 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' 3996 + ;; 3997 + *) 3998 + ;; 3999 + esac 4000 + ;; 4001 + freebsd* | dragonfly*) 4002 + # FreeBSD uses GNU C++ 4003 + ;; 4004 + hpux9* | hpux10* | hpux11*) 4005 + case $cc_basename in 4006 + CC*) 4007 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4008 + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' 4009 + if test "$host_cpu" != ia64; then 4010 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' 4011 + fi 4012 + ;; 4013 + aCC*) 4014 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4015 + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' 4016 + case $host_cpu in 4017 + hppa*64*|ia64*) 4018 + # +Z the default 4019 + ;; 4020 + *) 4021 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' 4022 + ;; 4023 + esac 4024 + ;; 4025 + *) 4026 + ;; 4027 + esac 4028 + ;; 4029 + interix*) 4030 + # This is c89, which is MS Visual C++ (no shared libs) 4031 + # Anyone wants to do a port? 4032 + ;; 4033 + irix5* | irix6* | nonstopux*) 4034 + case $cc_basename in 4035 + CC*) 4036 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4037 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' 4038 + # CC pic flag -KPIC is the default. 4039 + ;; 4040 + *) 4041 + ;; 4042 + esac 4043 + ;; 4044 + linux* | k*bsd*-gnu | kopensolaris*-gnu) 4045 + case $cc_basename in 4046 + KCC*) 4047 + # KAI C++ Compiler 4048 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' 4049 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' 4050 + ;; 4051 + ecpc* ) 4052 + # old Intel C++ for x86_64 which still supported -KPIC. 4053 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4054 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4055 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' 4056 + ;; 4057 + icpc* ) 4058 + # Intel C++, used to be incompatible with GCC. 4059 + # ICC 10 doesn't accept -KPIC any more. 4060 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4061 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' 4062 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' 4063 + ;; 4064 + pgCC* | pgcpp*) 4065 + # Portland Group C++ compiler 4066 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4067 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' 4068 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4069 + ;; 4070 + cxx*) 4071 + # Compaq C++ 4072 + # Make sure the PIC flag is empty. It appears that all Alpha 4073 + # Linux and Compaq Tru64 Unix objects are PIC. 4074 + _LT_TAGVAR(lt_prog_compiler_pic, $1)= 4075 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' 4076 + ;; 4077 + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) 4078 + # IBM XL 8.0, 9.0 on PPC and BlueGene 4079 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4080 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' 4081 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' 4082 + ;; 4083 + *) 4084 + case `$CC -V 2>&1 | sed 5q` in 4085 + *Sun\ C*) 4086 + # Sun C++ 5.9 4087 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4088 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4089 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' 4090 + ;; 4091 + esac 4092 + ;; 4093 + esac 4094 + ;; 4095 + lynxos*) 4096 + ;; 4097 + m88k*) 4098 + ;; 4099 + mvs*) 4100 + case $cc_basename in 4101 + cxx*) 4102 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' 4103 + ;; 4104 + *) 4105 + ;; 4106 + esac 4107 + ;; 4108 + netbsd*) 4109 + ;; 4110 + *qnx* | *nto*) 4111 + # QNX uses GNU C++, but need to define -shared option too, otherwise 4112 + # it will coredump. 4113 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' 4114 + ;; 4115 + osf3* | osf4* | osf5*) 4116 + case $cc_basename in 4117 + KCC*) 4118 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' 4119 + ;; 4120 + RCC*) 4121 + # Rational C++ 2.4.1 4122 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' 4123 + ;; 4124 + cxx*) 4125 + # Digital/Compaq C++ 4126 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4127 + # Make sure the PIC flag is empty. It appears that all Alpha 4128 + # Linux and Compaq Tru64 Unix objects are PIC. 4129 + _LT_TAGVAR(lt_prog_compiler_pic, $1)= 4130 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' 4131 + ;; 4132 + *) 4133 + ;; 4134 + esac 4135 + ;; 4136 + psos*) 4137 + ;; 4138 + solaris*) 4139 + case $cc_basename in 4140 + CC* | sunCC*) 4141 + # Sun C++ 4.2, 5.x and Centerline C++ 4142 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4143 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4144 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' 4145 + ;; 4146 + gcx*) 4147 + # Green Hills C++ Compiler 4148 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' 4149 + ;; 4150 + *) 4151 + ;; 4152 + esac 4153 + ;; 4154 + sunos4*) 4155 + case $cc_basename in 4156 + CC*) 4157 + # Sun C++ 4.x 4158 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' 4159 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4160 + ;; 4161 + lcc*) 4162 + # Lucid 4163 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' 4164 + ;; 4165 + *) 4166 + ;; 4167 + esac 4168 + ;; 4169 + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) 4170 + case $cc_basename in 4171 + CC*) 4172 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4173 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4174 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4175 + ;; 4176 + esac 4177 + ;; 4178 + tandem*) 4179 + case $cc_basename in 4180 + NCC*) 4181 + # NonStop-UX NCC 3.20 4182 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4183 + ;; 4184 + *) 4185 + ;; 4186 + esac 4187 + ;; 4188 + vxworks*) 4189 + ;; 4190 + *) 4191 + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no 4192 + ;; 4193 + esac 4194 + fi 4195 +], 4196 +[ 4197 + if test "$GCC" = yes; then 4198 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4199 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' 4200 + 4201 + case $host_os in 4202 + aix*) 4203 + # All AIX code is PIC. 4204 + if test "$host_cpu" = ia64; then 4205 + # AIX 5 now supports IA64 processor 4206 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4207 + fi 4208 + ;; 4209 + 4210 + amigaos*) 4211 + case $host_cpu in 4212 + powerpc) 4213 + # see comment about AmigaOS4 .so support 4214 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' 4215 + ;; 4216 + m68k) 4217 + # FIXME: we need at least 68020 code to build shared libraries, but 4218 + # adding the `-m68020' flag to GCC prevents building anything better, 4219 + # like `-m68040'. 4220 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' 4221 + ;; 4222 + esac 4223 + ;; 4224 + 4225 + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) 4226 + # PIC is the default for these OSes. 4227 + ;; 4228 + 4229 + mingw* | cygwin* | pw32* | os2* | cegcc*) 4230 + # This hack is so that the source file can tell whether it is being 4231 + # built for inclusion in a dll (and should export symbols for example). 4232 + # Although the cygwin gcc ignores -fPIC, still need this for old-style 4233 + # (--disable-auto-import) libraries 4234 + m4_if([$1], [GCJ], [], 4235 + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) 4236 + ;; 4237 + 4238 + darwin* | rhapsody*) 4239 + # PIC is the default on this platform 4240 + # Common symbols not allowed in MH_DYLIB files 4241 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' 4242 + ;; 4243 + 4244 + haiku*) 4245 + # PIC is the default for Haiku. 4246 + # The "-static" flag exists, but is broken. 4247 + _LT_TAGVAR(lt_prog_compiler_static, $1)= 4248 + ;; 4249 + 4250 + hpux*) 4251 + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit 4252 + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag 4253 + # sets the default TLS model and affects inlining. 4254 + case $host_cpu in 4255 + hppa*64*) 4256 + # +Z the default 4257 + ;; 4258 + *) 4259 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' 4260 + ;; 4261 + esac 4262 + ;; 4263 + 4264 + interix[[3-9]]*) 4265 + # Interix 3.x gcc -fpic/-fPIC options generate broken code. 4266 + # Instead, we relocate shared libraries at runtime. 4267 + ;; 4268 + 4269 + msdosdjgpp*) 4270 + # Just because we use GCC doesn't mean we suddenly get shared libraries 4271 + # on systems that don't support them. 4272 + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no 4273 + enable_shared=no 4274 + ;; 4275 + 4276 + *nto* | *qnx*) 4277 + # QNX uses GNU C++, but need to define -shared option too, otherwise 4278 + # it will coredump. 4279 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' 4280 + ;; 4281 + 4282 + sysv4*MP*) 4283 + if test -d /usr/nec; then 4284 + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic 4285 + fi 4286 + ;; 4287 + 4288 + *) 4289 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' 4290 + ;; 4291 + esac 4292 + 4293 + case $cc_basename in 4294 + nvcc*) # Cuda Compiler Driver 2.2 4295 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' 4296 + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then 4297 + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" 4298 + fi 4299 + ;; 4300 + esac 4301 + else 4302 + # PORTME Check for flag to pass linker flags through the system compiler. 4303 + case $host_os in 4304 + aix*) 4305 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4306 + if test "$host_cpu" = ia64; then 4307 + # AIX 5 now supports IA64 processor 4308 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4309 + else 4310 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' 4311 + fi 4312 + ;; 4313 + 4314 + mingw* | cygwin* | pw32* | os2* | cegcc*) 4315 + # This hack is so that the source file can tell whether it is being 4316 + # built for inclusion in a dll (and should export symbols for example). 4317 + m4_if([$1], [GCJ], [], 4318 + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) 4319 + ;; 4320 + 4321 + hpux9* | hpux10* | hpux11*) 4322 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4323 + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but 4324 + # not for PA HP-UX. 4325 + case $host_cpu in 4326 + hppa*64*|ia64*) 4327 + # +Z the default 4328 + ;; 4329 + *) 4330 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' 4331 + ;; 4332 + esac 4333 + # Is there a better lt_prog_compiler_static that works with the bundled CC? 4334 + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' 4335 + ;; 4336 + 4337 + irix5* | irix6* | nonstopux*) 4338 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4339 + # PIC (with -KPIC) is the default. 4340 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' 4341 + ;; 4342 + 4343 + linux* | k*bsd*-gnu | kopensolaris*-gnu) 4344 + case $cc_basename in 4345 + # old Intel for x86_64 which still supported -KPIC. 4346 + ecc*) 4347 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4348 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4349 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' 4350 + ;; 4351 + # icc used to be incompatible with GCC. 4352 + # ICC 10 doesn't accept -KPIC any more. 4353 + icc* | ifort*) 4354 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4355 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' 4356 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' 4357 + ;; 4358 + # Lahey Fortran 8.1. 4359 + lf95*) 4360 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4361 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' 4362 + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' 4363 + ;; 4364 + nagfor*) 4365 + # NAG Fortran compiler 4366 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' 4367 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' 4368 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4369 + ;; 4370 + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) 4371 + # Portland Group compilers (*not* the Pentium gcc compiler, 4372 + # which looks to be a dead project) 4373 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4374 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' 4375 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4376 + ;; 4377 + ccc*) 4378 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4379 + # All Alpha code is PIC. 4380 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' 4381 + ;; 4382 + xl* | bgxl* | bgf* | mpixl*) 4383 + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene 4384 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4385 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' 4386 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' 4387 + ;; 4388 + *) 4389 + case `$CC -V 2>&1 | sed 5q` in 4390 + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) 4391 + # Sun Fortran 8.3 passes all unrecognized flags to the linker 4392 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4393 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4394 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' 4395 + ;; 4396 + *Sun\ F* | *Sun*Fortran*) 4397 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4398 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4399 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' 4400 + ;; 4401 + *Sun\ C*) 4402 + # Sun C 5.9 4403 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4404 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4405 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4406 + ;; 4407 + *Intel*\ [[CF]]*Compiler*) 4408 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4409 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' 4410 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' 4411 + ;; 4412 + *Portland\ Group*) 4413 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4414 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' 4415 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4416 + ;; 4417 + esac 4418 + ;; 4419 + esac 4420 + ;; 4421 + 4422 + newsos6) 4423 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4424 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4425 + ;; 4426 + 4427 + *nto* | *qnx*) 4428 + # QNX uses GNU C++, but need to define -shared option too, otherwise 4429 + # it will coredump. 4430 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' 4431 + ;; 4432 + 4433 + osf3* | osf4* | osf5*) 4434 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4435 + # All OSF/1 code is PIC. 4436 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' 4437 + ;; 4438 + 4439 + rdos*) 4440 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' 4441 + ;; 4442 + 4443 + solaris*) 4444 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4445 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4446 + case $cc_basename in 4447 + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) 4448 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; 4449 + *) 4450 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; 4451 + esac 4452 + ;; 4453 + 4454 + sunos4*) 4455 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' 4456 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' 4457 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4458 + ;; 4459 + 4460 + sysv4 | sysv4.2uw2* | sysv4.3*) 4461 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4462 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4463 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4464 + ;; 4465 + 4466 + sysv4*MP*) 4467 + if test -d /usr/nec ;then 4468 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' 4469 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4470 + fi 4471 + ;; 4472 + 4473 + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) 4474 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4475 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' 4476 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4477 + ;; 4478 + 4479 + unicos*) 4480 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' 4481 + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no 4482 + ;; 4483 + 4484 + uts4*) 4485 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' 4486 + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' 4487 + ;; 4488 + 4489 + *) 4490 + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no 4491 + ;; 4492 + esac 4493 + fi 4494 +]) 4495 +case $host_os in 4496 + # For platforms which do not support PIC, -DPIC is meaningless: 4497 + *djgpp*) 4498 + _LT_TAGVAR(lt_prog_compiler_pic, $1)= 4499 + ;; 4500 + *) 4501 + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" 4502 + ;; 4503 +esac 4504 + 4505 +AC_CACHE_CHECK([for $compiler option to produce PIC], 4506 + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], 4507 + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) 4508 +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) 4509 + 4510 +# 4511 +# Check to make sure the PIC flag actually works. 4512 +# 4513 +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then 4514 + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], 4515 + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], 4516 + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], 4517 + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in 4518 + "" | " "*) ;; 4519 + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; 4520 + esac], 4521 + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= 4522 + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) 4523 +fi 4524 +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], 4525 + [Additional compiler flags for building library objects]) 4526 + 4527 +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], 4528 + [How to pass a linker flag through the compiler]) 4529 +# 4530 +# Check to make sure the static flag actually works. 4531 +# 4532 +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" 4533 +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], 4534 + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), 4535 + $lt_tmp_static_flag, 4536 + [], 4537 + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) 4538 +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], 4539 + [Compiler flag to prevent dynamic linking]) 4540 +])# _LT_COMPILER_PIC 4541 + 4542 + 4543 +# _LT_LINKER_SHLIBS([TAGNAME]) 4544 +# ---------------------------- 4545 +# See if the linker supports building shared libraries. 4546 +m4_defun([_LT_LINKER_SHLIBS], 4547 +[AC_REQUIRE([LT_PATH_LD])dnl 4548 +AC_REQUIRE([LT_PATH_NM])dnl 4549 +m4_require([_LT_PATH_MANIFEST_TOOL])dnl 4550 +m4_require([_LT_FILEUTILS_DEFAULTS])dnl 4551 +m4_require([_LT_DECL_EGREP])dnl 4552 +m4_require([_LT_DECL_SED])dnl 4553 +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl 4554 +m4_require([_LT_TAG_COMPILER])dnl 4555 +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) 4556 +m4_if([$1], [CXX], [ 4557 + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' 4558 + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] 4559 + case $host_os in 4560 + aix[[4-9]]*) 4561 + # If we're using GNU nm, then we don't want the "-C" option. 4562 + # -C means demangle to AIX nm, but means don't demangle with GNU nm 4563 + # Also, AIX nm treats weak defined symbols like other global defined 4564 + # symbols, whereas GNU nm marks them as "W". 4565 + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then 4566 + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' 4567 + else 4568 + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' 4569 + fi 4570 + ;; 4571 + pw32*) 4572 + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" 4573 + ;; 4574 + cygwin* | mingw* | cegcc*) 4575 + case $cc_basename in 4576 + cl*) 4577 + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' 4578 + ;; 4579 + *) 4580 + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' 4581 + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] 4582 + ;; 4583 + esac 4584 + ;; 4585 + *) 4586 + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' 4587 + ;; 4588 + esac 4589 +], [ 4590 + runpath_var= 4591 + _LT_TAGVAR(allow_undefined_flag, $1)= 4592 + _LT_TAGVAR(always_export_symbols, $1)=no 4593 + _LT_TAGVAR(archive_cmds, $1)= 4594 + _LT_TAGVAR(archive_expsym_cmds, $1)= 4595 + _LT_TAGVAR(compiler_needs_object, $1)=no 4596 + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no 4597 + _LT_TAGVAR(export_dynamic_flag_spec, $1)= 4598 + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' 4599 + _LT_TAGVAR(hardcode_automatic, $1)=no 4600 + _LT_TAGVAR(hardcode_direct, $1)=no 4601 + _LT_TAGVAR(hardcode_direct_absolute, $1)=no 4602 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= 4603 + _LT_TAGVAR(hardcode_libdir_separator, $1)= 4604 + _LT_TAGVAR(hardcode_minus_L, $1)=no 4605 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported 4606 + _LT_TAGVAR(inherit_rpath, $1)=no 4607 + _LT_TAGVAR(link_all_deplibs, $1)=unknown 4608 + _LT_TAGVAR(module_cmds, $1)= 4609 + _LT_TAGVAR(module_expsym_cmds, $1)= 4610 + _LT_TAGVAR(old_archive_from_new_cmds, $1)= 4611 + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= 4612 + _LT_TAGVAR(thread_safe_flag_spec, $1)= 4613 + _LT_TAGVAR(whole_archive_flag_spec, $1)= 4614 + # include_expsyms should be a list of space-separated symbols to be *always* 4615 + # included in the symbol list 4616 + _LT_TAGVAR(include_expsyms, $1)= 4617 + # exclude_expsyms can be an extended regexp of symbols to exclude 4618 + # it will be wrapped by ` (' and `)$', so one must not match beginning or 4619 + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', 4620 + # as well as any symbol that contains `d'. 4621 + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] 4622 + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out 4623 + # platforms (ab)use it in PIC code, but their linkers get confused if 4624 + # the symbol is explicitly referenced. Since portable code cannot 4625 + # rely on this symbol name, it's probably fine to never include it in 4626 + # preloaded symbol tables. 4627 + # Exclude shared library initialization/finalization symbols. 4628 +dnl Note also adjust exclude_expsyms for C++ above. 4629 + extract_expsyms_cmds= 4630 + 4631 + case $host_os in 4632 + cygwin* | mingw* | pw32* | cegcc*) 4633 + # FIXME: the MSVC++ port hasn't been tested in a loooong time 4634 + # When not using gcc, we currently assume that we are using 4635 + # Microsoft Visual C++. 4636 + if test "$GCC" != yes; then 4637 + with_gnu_ld=no 4638 + fi 4639 + ;; 4640 + interix*) 4641 + # we just hope/assume this is gcc and not c89 (= MSVC++) 4642 + with_gnu_ld=yes 4643 + ;; 4644 + openbsd*) 4645 + with_gnu_ld=no 4646 + ;; 4647 + esac 4648 + 4649 + _LT_TAGVAR(ld_shlibs, $1)=yes 4650 + 4651 + # On some targets, GNU ld is compatible enough with the native linker 4652 + # that we're better off using the native interface for both. 4653 + lt_use_gnu_ld_interface=no 4654 + if test "$with_gnu_ld" = yes; then 4655 + case $host_os in 4656 + aix*) 4657 + # The AIX port of GNU ld has always aspired to compatibility 4658 + # with the native linker. However, as the warning in the GNU ld 4659 + # block says, versions before 2.19.5* couldn't really create working 4660 + # shared libraries, regardless of the interface used. 4661 + case `$LD -v 2>&1` in 4662 + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; 4663 + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; 4664 + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; 4665 + *) 4666 + lt_use_gnu_ld_interface=yes 4667 + ;; 4668 + esac 4669 + ;; 4670 + *) 4671 + lt_use_gnu_ld_interface=yes 4672 + ;; 4673 + esac 4674 + fi 4675 + 4676 + if test "$lt_use_gnu_ld_interface" = yes; then 4677 + # If archive_cmds runs LD, not CC, wlarc should be empty 4678 + wlarc='${wl}' 4679 + 4680 + # Set some defaults for GNU ld with shared library support. These 4681 + # are reset later if shared libraries are not supported. Putting them 4682 + # here allows them to be overridden if necessary. 4683 + runpath_var=LD_RUN_PATH 4684 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 4685 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' 4686 + # ancient GNU ld didn't support --whole-archive et. al. 4687 + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then 4688 + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' 4689 + else 4690 + _LT_TAGVAR(whole_archive_flag_spec, $1)= 4691 + fi 4692 + supports_anon_versioning=no 4693 + case `$LD -v 2>&1` in 4694 + *GNU\ gold*) supports_anon_versioning=yes ;; 4695 + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 4696 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... 4697 + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... 4698 + *\ 2.11.*) ;; # other 2.11 versions 4699 + *) supports_anon_versioning=yes ;; 4700 + esac 4701 + 4702 + # See if GNU ld supports shared libraries. 4703 + case $host_os in 4704 + aix[[3-9]]*) 4705 + # On AIX/PPC, the GNU linker is very broken 4706 + if test "$host_cpu" != ia64; then 4707 + _LT_TAGVAR(ld_shlibs, $1)=no 4708 + cat <<_LT_EOF 1>&2 4709 + 4710 +*** Warning: the GNU linker, at least up to release 2.19, is reported 4711 +*** to be unable to reliably create shared libraries on AIX. 4712 +*** Therefore, libtool is disabling shared libraries support. If you 4713 +*** really care for shared libraries, you may want to install binutils 4714 +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. 4715 +*** You will then need to restart the configuration process. 4716 + 4717 +_LT_EOF 4718 + fi 4719 + ;; 4720 + 4721 + amigaos*) 4722 + case $host_cpu in 4723 + powerpc) 4724 + # see comment about AmigaOS4 .so support 4725 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 4726 + _LT_TAGVAR(archive_expsym_cmds, $1)='' 4727 + ;; 4728 + m68k) 4729 + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' 4730 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' 4731 + _LT_TAGVAR(hardcode_minus_L, $1)=yes 4732 + ;; 4733 + esac 4734 + ;; 4735 + 4736 + beos*) 4737 + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then 4738 + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported 4739 + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc 4740 + # support --undefined. This deserves some investigation. FIXME 4741 + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 4742 + else 4743 + _LT_TAGVAR(ld_shlibs, $1)=no 4744 + fi 4745 + ;; 4746 + 4747 + cygwin* | mingw* | pw32* | cegcc*) 4748 + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, 4749 + # as there is no search path for DLLs. 4750 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' 4751 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' 4752 + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported 4753 + _LT_TAGVAR(always_export_symbols, $1)=no 4754 + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes 4755 + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' 4756 + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] 4757 + 4758 + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then 4759 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' 4760 + # If the export-symbols file already is a .def file (1st line 4761 + # is EXPORTS), use it as is; otherwise, prepend... 4762 + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then 4763 + cp $export_symbols $output_objdir/$soname.def; 4764 + else 4765 + echo EXPORTS > $output_objdir/$soname.def; 4766 + cat $export_symbols >> $output_objdir/$soname.def; 4767 + fi~ 4768 + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' 4769 + else 4770 + _LT_TAGVAR(ld_shlibs, $1)=no 4771 + fi 4772 + ;; 4773 + 4774 + haiku*) 4775 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 4776 + _LT_TAGVAR(link_all_deplibs, $1)=yes 4777 + ;; 4778 + 4779 + interix[[3-9]]*) 4780 + _LT_TAGVAR(hardcode_direct, $1)=no 4781 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 4782 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' 4783 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' 4784 + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. 4785 + # Instead, shared libraries are loaded at an image base (0x10000000 by 4786 + # default) and relocated if they conflict, which is a slow very memory 4787 + # consuming and fragmenting process. To avoid this, we pick a random, 4788 + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link 4789 + # time. Moving up from 0x10000000 also allows more sbrk(2) space. 4790 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' 4791 + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' 4792 + ;; 4793 + 4794 + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) 4795 + tmp_diet=no 4796 + if test "$host_os" = linux-dietlibc; then 4797 + case $cc_basename in 4798 + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) 4799 + esac 4800 + fi 4801 + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ 4802 + && test "$tmp_diet" = no 4803 + then 4804 + tmp_addflag=' $pic_flag' 4805 + tmp_sharedflag='-shared' 4806 + case $cc_basename,$host_cpu in 4807 + pgcc*) # Portland Group C compiler 4808 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' 4809 + tmp_addflag=' $pic_flag' 4810 + ;; 4811 + pgf77* | pgf90* | pgf95* | pgfortran*) 4812 + # Portland Group f77 and f90 compilers 4813 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' 4814 + tmp_addflag=' $pic_flag -Mnomain' ;; 4815 + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 4816 + tmp_addflag=' -i_dynamic' ;; 4817 + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 4818 + tmp_addflag=' -i_dynamic -nofor_main' ;; 4819 + ifc* | ifort*) # Intel Fortran compiler 4820 + tmp_addflag=' -nofor_main' ;; 4821 + lf95*) # Lahey Fortran 8.1 4822 + _LT_TAGVAR(whole_archive_flag_spec, $1)= 4823 + tmp_sharedflag='--shared' ;; 4824 + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) 4825 + tmp_sharedflag='-qmkshrobj' 4826 + tmp_addflag= ;; 4827 + nvcc*) # Cuda Compiler Driver 2.2 4828 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' 4829 + _LT_TAGVAR(compiler_needs_object, $1)=yes 4830 + ;; 4831 + esac 4832 + case `$CC -V 2>&1 | sed 5q` in 4833 + *Sun\ C*) # Sun C 5.9 4834 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' 4835 + _LT_TAGVAR(compiler_needs_object, $1)=yes 4836 + tmp_sharedflag='-G' ;; 4837 + *Sun\ F*) # Sun Fortran 8.3 4838 + tmp_sharedflag='-G' ;; 4839 + esac 4840 + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 4841 + 4842 + if test "x$supports_anon_versioning" = xyes; then 4843 + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ 4844 + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ 4845 + echo "local: *; };" >> $output_objdir/$libname.ver~ 4846 + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' 4847 + fi 4848 + 4849 + case $cc_basename in 4850 + xlf* | bgf* | bgxlf* | mpixlf*) 4851 + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself 4852 + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' 4853 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 4854 + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' 4855 + if test "x$supports_anon_versioning" = xyes; then 4856 + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ 4857 + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ 4858 + echo "local: *; };" >> $output_objdir/$libname.ver~ 4859 + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' 4860 + fi 4861 + ;; 4862 + esac 4863 + else 4864 + _LT_TAGVAR(ld_shlibs, $1)=no 4865 + fi 4866 + ;; 4867 + 4868 + netbsd*) 4869 + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then 4870 + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' 4871 + wlarc= 4872 + else 4873 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 4874 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' 4875 + fi 4876 + ;; 4877 + 4878 + solaris*) 4879 + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then 4880 + _LT_TAGVAR(ld_shlibs, $1)=no 4881 + cat <<_LT_EOF 1>&2 4882 + 4883 +*** Warning: The releases 2.8.* of the GNU linker cannot reliably 4884 +*** create shared libraries on Solaris systems. Therefore, libtool 4885 +*** is disabling shared libraries support. We urge you to upgrade GNU 4886 +*** binutils to release 2.9.1 or newer. Another option is to modify 4887 +*** your PATH or compiler configuration so that the native linker is 4888 +*** used, and then restart. 4889 + 4890 +_LT_EOF 4891 + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then 4892 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 4893 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' 4894 + else 4895 + _LT_TAGVAR(ld_shlibs, $1)=no 4896 + fi 4897 + ;; 4898 + 4899 + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) 4900 + case `$LD -v 2>&1` in 4901 + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) 4902 + _LT_TAGVAR(ld_shlibs, $1)=no 4903 + cat <<_LT_EOF 1>&2 4904 + 4905 +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not 4906 +*** reliably create shared libraries on SCO systems. Therefore, libtool 4907 +*** is disabling shared libraries support. We urge you to upgrade GNU 4908 +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify 4909 +*** your PATH or compiler configuration so that the native linker is 4910 +*** used, and then restart. 4911 + 4912 +_LT_EOF 4913 + ;; 4914 + *) 4915 + # For security reasons, it is highly recommended that you always 4916 + # use absolute paths for naming shared libraries, and exclude the 4917 + # DT_RUNPATH tag from executables and libraries. But doing so 4918 + # requires that you compile everything twice, which is a pain. 4919 + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then 4920 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 4921 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 4922 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' 4923 + else 4924 + _LT_TAGVAR(ld_shlibs, $1)=no 4925 + fi 4926 + ;; 4927 + esac 4928 + ;; 4929 + 4930 + sunos4*) 4931 + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' 4932 + wlarc= 4933 + _LT_TAGVAR(hardcode_direct, $1)=yes 4934 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 4935 + ;; 4936 + 4937 + *) 4938 + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then 4939 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 4940 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' 4941 + else 4942 + _LT_TAGVAR(ld_shlibs, $1)=no 4943 + fi 4944 + ;; 4945 + esac 4946 + 4947 + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then 4948 + runpath_var= 4949 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= 4950 + _LT_TAGVAR(export_dynamic_flag_spec, $1)= 4951 + _LT_TAGVAR(whole_archive_flag_spec, $1)= 4952 + fi 4953 + else 4954 + # PORTME fill in a description of your system's linker (not GNU ld) 4955 + case $host_os in 4956 + aix3*) 4957 + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported 4958 + _LT_TAGVAR(always_export_symbols, $1)=yes 4959 + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' 4960 + # Note: this linker hardcodes the directories in LIBPATH if there 4961 + # are no directories specified by -L. 4962 + _LT_TAGVAR(hardcode_minus_L, $1)=yes 4963 + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then 4964 + # Neither direct hardcoding nor static linking is supported with a 4965 + # broken collect2. 4966 + _LT_TAGVAR(hardcode_direct, $1)=unsupported 4967 + fi 4968 + ;; 4969 + 4970 + aix[[4-9]]*) 4971 + if test "$host_cpu" = ia64; then 4972 + # On IA64, the linker does run time linking by default, so we don't 4973 + # have to do anything special. 4974 + aix_use_runtimelinking=no 4975 + exp_sym_flag='-Bexport' 4976 + no_entry_flag="" 4977 + else 4978 + # If we're using GNU nm, then we don't want the "-C" option. 4979 + # -C means demangle to AIX nm, but means don't demangle with GNU nm 4980 + # Also, AIX nm treats weak defined symbols like other global 4981 + # defined symbols, whereas GNU nm marks them as "W". 4982 + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then 4983 + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' 4984 + else 4985 + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' 4986 + fi 4987 + aix_use_runtimelinking=no 4988 + 4989 + # Test if we are trying to use run time linking or normal 4990 + # AIX style linking. If -brtl is somewhere in LDFLAGS, we 4991 + # need to do runtime linking. 4992 + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) 4993 + for ld_flag in $LDFLAGS; do 4994 + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then 4995 + aix_use_runtimelinking=yes 4996 + break 4997 + fi 4998 + done 4999 + ;; 5000 + esac 5001 + 5002 + exp_sym_flag='-bexport' 5003 + no_entry_flag='-bnoentry' 5004 + fi 5005 + 5006 + # When large executables or shared objects are built, AIX ld can 5007 + # have problems creating the table of contents. If linking a library 5008 + # or program results in "error TOC overflow" add -mminimal-toc to 5009 + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not 5010 + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. 5011 + 5012 + _LT_TAGVAR(archive_cmds, $1)='' 5013 + _LT_TAGVAR(hardcode_direct, $1)=yes 5014 + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes 5015 + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' 5016 + _LT_TAGVAR(link_all_deplibs, $1)=yes 5017 + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' 5018 + 5019 + if test "$GCC" = yes; then 5020 + case $host_os in aix4.[[012]]|aix4.[[012]].*) 5021 + # We only want to do this on AIX 4.2 and lower, the check 5022 + # below for broken collect2 doesn't work under 4.3+ 5023 + collect2name=`${CC} -print-prog-name=collect2` 5024 + if test -f "$collect2name" && 5025 + strings "$collect2name" | $GREP resolve_lib_name >/dev/null 5026 + then 5027 + # We have reworked collect2 5028 + : 5029 + else 5030 + # We have old collect2 5031 + _LT_TAGVAR(hardcode_direct, $1)=unsupported 5032 + # It fails to find uninstalled libraries when the uninstalled 5033 + # path is not listed in the libpath. Setting hardcode_minus_L 5034 + # to unsupported forces relinking 5035 + _LT_TAGVAR(hardcode_minus_L, $1)=yes 5036 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' 5037 + _LT_TAGVAR(hardcode_libdir_separator, $1)= 5038 + fi 5039 + ;; 5040 + esac 5041 + shared_flag='-shared' 5042 + if test "$aix_use_runtimelinking" = yes; then 5043 + shared_flag="$shared_flag "'${wl}-G' 5044 + fi 5045 + else 5046 + # not using gcc 5047 + if test "$host_cpu" = ia64; then 5048 + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release 5049 + # chokes on -Wl,-G. The following line is correct: 5050 + shared_flag='-G' 5051 + else 5052 + if test "$aix_use_runtimelinking" = yes; then 5053 + shared_flag='${wl}-G' 5054 + else 5055 + shared_flag='${wl}-bM:SRE' 5056 + fi 5057 + fi 5058 + fi 5059 + 5060 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' 5061 + # It seems that -bexpall does not export symbols beginning with 5062 + # underscore (_), so it is better to generate a list of symbols to export. 5063 + _LT_TAGVAR(always_export_symbols, $1)=yes 5064 + if test "$aix_use_runtimelinking" = yes; then 5065 + # Warning - without using the other runtime loading flags (-brtl), 5066 + # -berok will link without error, but may produce a broken library. 5067 + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' 5068 + # Determine the default libpath from the value encoded in an 5069 + # empty executable. 5070 + _LT_SYS_MODULE_PATH_AIX([$1]) 5071 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" 5072 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" 5073 + else 5074 + if test "$host_cpu" = ia64; then 5075 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' 5076 + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" 5077 + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" 5078 + else 5079 + # Determine the default libpath from the value encoded in an 5080 + # empty executable. 5081 + _LT_SYS_MODULE_PATH_AIX([$1]) 5082 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" 5083 + # Warning - without using the other run time loading flags, 5084 + # -berok will link without error, but may produce a broken library. 5085 + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' 5086 + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' 5087 + if test "$with_gnu_ld" = yes; then 5088 + # We only use this code for GNU lds that support --whole-archive. 5089 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' 5090 + else 5091 + # Exported symbols can be pulled into shared objects from archives 5092 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' 5093 + fi 5094 + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes 5095 + # This is similar to how AIX traditionally builds its shared libraries. 5096 + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' 5097 + fi 5098 + fi 5099 + ;; 5100 + 5101 + amigaos*) 5102 + case $host_cpu in 5103 + powerpc) 5104 + # see comment about AmigaOS4 .so support 5105 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 5106 + _LT_TAGVAR(archive_expsym_cmds, $1)='' 5107 + ;; 5108 + m68k) 5109 + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' 5110 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' 5111 + _LT_TAGVAR(hardcode_minus_L, $1)=yes 5112 + ;; 5113 + esac 5114 + ;; 5115 + 5116 + bsdi[[45]]*) 5117 + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic 5118 + ;; 5119 + 5120 + cygwin* | mingw* | pw32* | cegcc*) 5121 + # When not using gcc, we currently assume that we are using 5122 + # Microsoft Visual C++. 5123 + # hardcode_libdir_flag_spec is actually meaningless, as there is 5124 + # no search path for DLLs. 5125 + case $cc_basename in 5126 + cl*) 5127 + # Native MSVC 5128 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' 5129 + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported 5130 + _LT_TAGVAR(always_export_symbols, $1)=yes 5131 + _LT_TAGVAR(file_list_spec, $1)='@' 5132 + # Tell ltmain to make .lib files, not .a files. 5133 + libext=lib 5134 + # Tell ltmain to make .dll files, not .so files. 5135 + shrext_cmds=".dll" 5136 + # FIXME: Setting linknames here is a bad hack. 5137 + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' 5138 + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then 5139 + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; 5140 + else 5141 + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; 5142 + fi~ 5143 + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ 5144 + linknames=' 5145 + # The linker will not automatically build a static lib if we build a DLL. 5146 + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' 5147 + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes 5148 + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' 5149 + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' 5150 + # Don't use ranlib 5151 + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' 5152 + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ 5153 + lt_tool_outputfile="@TOOL_OUTPUT@"~ 5154 + case $lt_outputfile in 5155 + *.exe|*.EXE) ;; 5156 + *) 5157 + lt_outputfile="$lt_outputfile.exe" 5158 + lt_tool_outputfile="$lt_tool_outputfile.exe" 5159 + ;; 5160 + esac~ 5161 + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then 5162 + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; 5163 + $RM "$lt_outputfile.manifest"; 5164 + fi' 5165 + ;; 5166 + *) 5167 + # Assume MSVC wrapper 5168 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' 5169 + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported 5170 + # Tell ltmain to make .lib files, not .a files. 5171 + libext=lib 5172 + # Tell ltmain to make .dll files, not .so files. 5173 + shrext_cmds=".dll" 5174 + # FIXME: Setting linknames here is a bad hack. 5175 + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' 5176 + # The linker will automatically build a .lib file if we build a DLL. 5177 + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' 5178 + # FIXME: Should let the user specify the lib program. 5179 + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' 5180 + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes 5181 + ;; 5182 + esac 5183 + ;; 5184 + 5185 + darwin* | rhapsody*) 5186 + _LT_DARWIN_LINKER_FEATURES($1) 5187 + ;; 5188 + 5189 + dgux*) 5190 + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' 5191 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' 5192 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5193 + ;; 5194 + 5195 + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor 5196 + # support. Future versions do this automatically, but an explicit c++rt0.o 5197 + # does not break anything, and helps significantly (at the cost of a little 5198 + # extra space). 5199 + freebsd2.2*) 5200 + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' 5201 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' 5202 + _LT_TAGVAR(hardcode_direct, $1)=yes 5203 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5204 + ;; 5205 + 5206 + # Unfortunately, older versions of FreeBSD 2 do not have this feature. 5207 + freebsd2.*) 5208 + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' 5209 + _LT_TAGVAR(hardcode_direct, $1)=yes 5210 + _LT_TAGVAR(hardcode_minus_L, $1)=yes 5211 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5212 + ;; 5213 + 5214 + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. 5215 + freebsd* | dragonfly*) 5216 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' 5217 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' 5218 + _LT_TAGVAR(hardcode_direct, $1)=yes 5219 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5220 + ;; 5221 + 5222 + hpux9*) 5223 + if test "$GCC" = yes; then 5224 + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' 5225 + else 5226 + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' 5227 + fi 5228 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' 5229 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 5230 + _LT_TAGVAR(hardcode_direct, $1)=yes 5231 + 5232 + # hardcode_minus_L: Not really in the search PATH, 5233 + # but as the default location of the library. 5234 + _LT_TAGVAR(hardcode_minus_L, $1)=yes 5235 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' 5236 + ;; 5237 + 5238 + hpux10*) 5239 + if test "$GCC" = yes && test "$with_gnu_ld" = no; then 5240 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' 5241 + else 5242 + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' 5243 + fi 5244 + if test "$with_gnu_ld" = no; then 5245 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' 5246 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 5247 + _LT_TAGVAR(hardcode_direct, $1)=yes 5248 + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes 5249 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' 5250 + # hardcode_minus_L: Not really in the search PATH, 5251 + # but as the default location of the library. 5252 + _LT_TAGVAR(hardcode_minus_L, $1)=yes 5253 + fi 5254 + ;; 5255 + 5256 + hpux11*) 5257 + if test "$GCC" = yes && test "$with_gnu_ld" = no; then 5258 + case $host_cpu in 5259 + hppa*64*) 5260 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' 5261 + ;; 5262 + ia64*) 5263 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' 5264 + ;; 5265 + *) 5266 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' 5267 + ;; 5268 + esac 5269 + else 5270 + case $host_cpu in 5271 + hppa*64*) 5272 + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' 5273 + ;; 5274 + ia64*) 5275 + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' 5276 + ;; 5277 + *) 5278 + m4_if($1, [], [ 5279 + # Older versions of the 11.00 compiler do not understand -b yet 5280 + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) 5281 + _LT_LINKER_OPTION([if $CC understands -b], 5282 + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], 5283 + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], 5284 + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], 5285 + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) 5286 + ;; 5287 + esac 5288 + fi 5289 + if test "$with_gnu_ld" = no; then 5290 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' 5291 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 5292 + 5293 + case $host_cpu in 5294 + hppa*64*|ia64*) 5295 + _LT_TAGVAR(hardcode_direct, $1)=no 5296 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5297 + ;; 5298 + *) 5299 + _LT_TAGVAR(hardcode_direct, $1)=yes 5300 + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes 5301 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' 5302 + 5303 + # hardcode_minus_L: Not really in the search PATH, 5304 + # but as the default location of the library. 5305 + _LT_TAGVAR(hardcode_minus_L, $1)=yes 5306 + ;; 5307 + esac 5308 + fi 5309 + ;; 5310 + 5311 + irix5* | irix6* | nonstopux*) 5312 + if test "$GCC" = yes; then 5313 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' 5314 + # Try to use the -exported_symbol ld option, if it does not 5315 + # work, assume that -exports_file does not work either and 5316 + # implicitly export all symbols. 5317 + # This should be the same for all languages, so no per-tag cache variable. 5318 + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], 5319 + [lt_cv_irix_exported_symbol], 5320 + [save_LDFLAGS="$LDFLAGS" 5321 + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" 5322 + AC_LINK_IFELSE( 5323 + [AC_LANG_SOURCE( 5324 + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], 5325 + [C++], [[int foo (void) { return 0; }]], 5326 + [Fortran 77], [[ 5327 + subroutine foo 5328 + end]], 5329 + [Fortran], [[ 5330 + subroutine foo 5331 + end]])])], 5332 + [lt_cv_irix_exported_symbol=yes], 5333 + [lt_cv_irix_exported_symbol=no]) 5334 + LDFLAGS="$save_LDFLAGS"]) 5335 + if test "$lt_cv_irix_exported_symbol" = yes; then 5336 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' 5337 + fi 5338 + else 5339 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' 5340 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' 5341 + fi 5342 + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' 5343 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 5344 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 5345 + _LT_TAGVAR(inherit_rpath, $1)=yes 5346 + _LT_TAGVAR(link_all_deplibs, $1)=yes 5347 + ;; 5348 + 5349 + netbsd*) 5350 + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then 5351 + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out 5352 + else 5353 + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF 5354 + fi 5355 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' 5356 + _LT_TAGVAR(hardcode_direct, $1)=yes 5357 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5358 + ;; 5359 + 5360 + newsos6) 5361 + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' 5362 + _LT_TAGVAR(hardcode_direct, $1)=yes 5363 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 5364 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 5365 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5366 + ;; 5367 + 5368 + *nto* | *qnx*) 5369 + ;; 5370 + 5371 + openbsd*) 5372 + if test -f /usr/libexec/ld.so; then 5373 + _LT_TAGVAR(hardcode_direct, $1)=yes 5374 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5375 + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes 5376 + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then 5377 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' 5378 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' 5379 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' 5380 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' 5381 + else 5382 + case $host_os in 5383 + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) 5384 + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' 5385 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' 5386 + ;; 5387 + *) 5388 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' 5389 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' 5390 + ;; 5391 + esac 5392 + fi 5393 + else 5394 + _LT_TAGVAR(ld_shlibs, $1)=no 5395 + fi 5396 + ;; 5397 + 5398 + os2*) 5399 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' 5400 + _LT_TAGVAR(hardcode_minus_L, $1)=yes 5401 + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported 5402 + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' 5403 + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' 5404 + ;; 5405 + 5406 + osf3*) 5407 + if test "$GCC" = yes; then 5408 + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' 5409 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' 5410 + else 5411 + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' 5412 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' 5413 + fi 5414 + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' 5415 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 5416 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 5417 + ;; 5418 + 5419 + osf4* | osf5*) # as osf3* with the addition of -msym flag 5420 + if test "$GCC" = yes; then 5421 + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' 5422 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' 5423 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 5424 + else 5425 + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' 5426 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' 5427 + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ 5428 + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' 5429 + 5430 + # Both c and cxx compiler support -rpath directly 5431 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' 5432 + fi 5433 + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' 5434 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 5435 + ;; 5436 + 5437 + solaris*) 5438 + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' 5439 + if test "$GCC" = yes; then 5440 + wlarc='${wl}' 5441 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' 5442 + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ 5443 + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' 5444 + else 5445 + case `$CC -V 2>&1` in 5446 + *"Compilers 5.0"*) 5447 + wlarc='' 5448 + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' 5449 + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ 5450 + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' 5451 + ;; 5452 + *) 5453 + wlarc='${wl}' 5454 + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' 5455 + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ 5456 + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' 5457 + ;; 5458 + esac 5459 + fi 5460 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' 5461 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5462 + case $host_os in 5463 + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; 5464 + *) 5465 + # The compiler driver will combine and reorder linker options, 5466 + # but understands `-z linker_flag'. GCC discards it without `$wl', 5467 + # but is careful enough not to reorder. 5468 + # Supported since Solaris 2.6 (maybe 2.5.1?) 5469 + if test "$GCC" = yes; then 5470 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' 5471 + else 5472 + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' 5473 + fi 5474 + ;; 5475 + esac 5476 + _LT_TAGVAR(link_all_deplibs, $1)=yes 5477 + ;; 5478 + 5479 + sunos4*) 5480 + if test "x$host_vendor" = xsequent; then 5481 + # Use $CC to link under sequent, because it throws in some extra .o 5482 + # files that make .init and .fini sections work. 5483 + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' 5484 + else 5485 + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' 5486 + fi 5487 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' 5488 + _LT_TAGVAR(hardcode_direct, $1)=yes 5489 + _LT_TAGVAR(hardcode_minus_L, $1)=yes 5490 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5491 + ;; 5492 + 5493 + sysv4) 5494 + case $host_vendor in 5495 + sni) 5496 + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' 5497 + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? 5498 + ;; 5499 + siemens) 5500 + ## LD is ld it makes a PLAMLIB 5501 + ## CC just makes a GrossModule. 5502 + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' 5503 + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' 5504 + _LT_TAGVAR(hardcode_direct, $1)=no 5505 + ;; 5506 + motorola) 5507 + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' 5508 + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie 5509 + ;; 5510 + esac 5511 + runpath_var='LD_RUN_PATH' 5512 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5513 + ;; 5514 + 5515 + sysv4.3*) 5516 + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' 5517 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5518 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' 5519 + ;; 5520 + 5521 + sysv4*MP*) 5522 + if test -d /usr/nec; then 5523 + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' 5524 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5525 + runpath_var=LD_RUN_PATH 5526 + hardcode_runpath_var=yes 5527 + _LT_TAGVAR(ld_shlibs, $1)=yes 5528 + fi 5529 + ;; 5530 + 5531 + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) 5532 + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' 5533 + _LT_TAGVAR(archive_cmds_need_lc, $1)=no 5534 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5535 + runpath_var='LD_RUN_PATH' 5536 + 5537 + if test "$GCC" = yes; then 5538 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 5539 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 5540 + else 5541 + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 5542 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 5543 + fi 5544 + ;; 5545 + 5546 + sysv5* | sco3.2v5* | sco5v6*) 5547 + # Note: We can NOT use -z defs as we might desire, because we do not 5548 + # link with -lc, and that would cause any symbols used from libc to 5549 + # always be unresolved, which means just about no library would 5550 + # ever link correctly. If we're not using GNU ld we use -z text 5551 + # though, which does catch some bad symbols but isn't as heavy-handed 5552 + # as -z defs. 5553 + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' 5554 + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' 5555 + _LT_TAGVAR(archive_cmds_need_lc, $1)=no 5556 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5557 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' 5558 + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' 5559 + _LT_TAGVAR(link_all_deplibs, $1)=yes 5560 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' 5561 + runpath_var='LD_RUN_PATH' 5562 + 5563 + if test "$GCC" = yes; then 5564 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 5565 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 5566 + else 5567 + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 5568 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 5569 + fi 5570 + ;; 5571 + 5572 + uts4*) 5573 + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' 5574 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' 5575 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 5576 + ;; 5577 + 5578 + *) 5579 + _LT_TAGVAR(ld_shlibs, $1)=no 5580 + ;; 5581 + esac 5582 + 5583 + if test x$host_vendor = xsni; then 5584 + case $host in 5585 + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) 5586 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' 5587 + ;; 5588 + esac 5589 + fi 5590 + fi 5591 +]) 5592 +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) 5593 +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no 5594 + 5595 +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld 5596 + 5597 +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl 5598 +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl 5599 +_LT_DECL([], [extract_expsyms_cmds], [2], 5600 + [The commands to extract the exported symbol list from a shared archive]) 5601 + 5602 +# 5603 +# Do we need to explicitly link libc? 5604 +# 5605 +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in 5606 +x|xyes) 5607 + # Assume -lc should be added 5608 + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes 5609 + 5610 + if test "$enable_shared" = yes && test "$GCC" = yes; then 5611 + case $_LT_TAGVAR(archive_cmds, $1) in 5612 + *'~'*) 5613 + # FIXME: we may have to deal with multi-command sequences. 5614 + ;; 5615 + '$CC '*) 5616 + # Test whether the compiler implicitly links with -lc since on some 5617 + # systems, -lgcc has to come before -lc. If gcc already passes -lc 5618 + # to ld, don't add -lc before -lgcc. 5619 + AC_CACHE_CHECK([whether -lc should be explicitly linked in], 5620 + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), 5621 + [$RM conftest* 5622 + echo "$lt_simple_compile_test_code" > conftest.$ac_ext 5623 + 5624 + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then 5625 + soname=conftest 5626 + lib=conftest 5627 + libobjs=conftest.$ac_objext 5628 + deplibs= 5629 + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) 5630 + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) 5631 + compiler_flags=-v 5632 + linker_flags=-v 5633 + verstring= 5634 + output_objdir=. 5635 + libname=conftest 5636 + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) 5637 + _LT_TAGVAR(allow_undefined_flag, $1)= 5638 + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 5639 + then 5640 + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no 5641 + else 5642 + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes 5643 + fi 5644 + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag 5645 + else 5646 + cat conftest.err 1>&5 5647 + fi 5648 + $RM conftest* 5649 + ]) 5650 + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) 5651 + ;; 5652 + esac 5653 + fi 5654 + ;; 5655 +esac 5656 + 5657 +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], 5658 + [Whether or not to add -lc for building shared libraries]) 5659 +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], 5660 + [enable_shared_with_static_runtimes], [0], 5661 + [Whether or not to disallow shared libs when runtime libs are static]) 5662 +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], 5663 + [Compiler flag to allow reflexive dlopens]) 5664 +_LT_TAGDECL([], [whole_archive_flag_spec], [1], 5665 + [Compiler flag to generate shared objects directly from archives]) 5666 +_LT_TAGDECL([], [compiler_needs_object], [1], 5667 + [Whether the compiler copes with passing no objects directly]) 5668 +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], 5669 + [Create an old-style archive from a shared archive]) 5670 +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], 5671 + [Create a temporary old-style archive to link instead of a shared archive]) 5672 +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) 5673 +_LT_TAGDECL([], [archive_expsym_cmds], [2]) 5674 +_LT_TAGDECL([], [module_cmds], [2], 5675 + [Commands used to build a loadable module if different from building 5676 + a shared archive.]) 5677 +_LT_TAGDECL([], [module_expsym_cmds], [2]) 5678 +_LT_TAGDECL([], [with_gnu_ld], [1], 5679 + [Whether we are building with GNU ld or not]) 5680 +_LT_TAGDECL([], [allow_undefined_flag], [1], 5681 + [Flag that allows shared libraries with undefined symbols to be built]) 5682 +_LT_TAGDECL([], [no_undefined_flag], [1], 5683 + [Flag that enforces no undefined symbols]) 5684 +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], 5685 + [Flag to hardcode $libdir into a binary during linking. 5686 + This must work even if $libdir does not exist]) 5687 +_LT_TAGDECL([], [hardcode_libdir_separator], [1], 5688 + [Whether we need a single "-rpath" flag with a separated argument]) 5689 +_LT_TAGDECL([], [hardcode_direct], [0], 5690 + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes 5691 + DIR into the resulting binary]) 5692 +_LT_TAGDECL([], [hardcode_direct_absolute], [0], 5693 + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes 5694 + DIR into the resulting binary and the resulting library dependency is 5695 + "absolute", i.e impossible to change by setting ${shlibpath_var} if the 5696 + library is relocated]) 5697 +_LT_TAGDECL([], [hardcode_minus_L], [0], 5698 + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR 5699 + into the resulting binary]) 5700 +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], 5701 + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR 5702 + into the resulting binary]) 5703 +_LT_TAGDECL([], [hardcode_automatic], [0], 5704 + [Set to "yes" if building a shared library automatically hardcodes DIR 5705 + into the library and all subsequent libraries and executables linked 5706 + against it]) 5707 +_LT_TAGDECL([], [inherit_rpath], [0], 5708 + [Set to yes if linker adds runtime paths of dependent libraries 5709 + to runtime path list]) 5710 +_LT_TAGDECL([], [link_all_deplibs], [0], 5711 + [Whether libtool must link a program against all its dependency libraries]) 5712 +_LT_TAGDECL([], [always_export_symbols], [0], 5713 + [Set to "yes" if exported symbols are required]) 5714 +_LT_TAGDECL([], [export_symbols_cmds], [2], 5715 + [The commands to list exported symbols]) 5716 +_LT_TAGDECL([], [exclude_expsyms], [1], 5717 + [Symbols that should not be listed in the preloaded symbols]) 5718 +_LT_TAGDECL([], [include_expsyms], [1], 5719 + [Symbols that must always be exported]) 5720 +_LT_TAGDECL([], [prelink_cmds], [2], 5721 + [Commands necessary for linking programs (against libraries) with templates]) 5722 +_LT_TAGDECL([], [postlink_cmds], [2], 5723 + [Commands necessary for finishing linking programs]) 5724 +_LT_TAGDECL([], [file_list_spec], [1], 5725 + [Specify filename containing input files]) 5726 +dnl FIXME: Not yet implemented 5727 +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], 5728 +dnl [Compiler flag to generate thread safe objects]) 5729 +])# _LT_LINKER_SHLIBS 5730 + 5731 + 5732 +# _LT_LANG_C_CONFIG([TAG]) 5733 +# ------------------------ 5734 +# Ensure that the configuration variables for a C compiler are suitably 5735 +# defined. These variables are subsequently used by _LT_CONFIG to write 5736 +# the compiler configuration to `libtool'. 5737 +m4_defun([_LT_LANG_C_CONFIG], 5738 +[m4_require([_LT_DECL_EGREP])dnl 5739 +lt_save_CC="$CC" 5740 +AC_LANG_PUSH(C) 5741 + 5742 +# Source file extension for C test sources. 5743 +ac_ext=c 5744 + 5745 +# Object file extension for compiled C test sources. 5746 +objext=o 5747 +_LT_TAGVAR(objext, $1)=$objext 5748 + 5749 +# Code to be used in simple compile tests 5750 +lt_simple_compile_test_code="int some_variable = 0;" 5751 + 5752 +# Code to be used in simple link tests 5753 +lt_simple_link_test_code='int main(){return(0);}' 5754 + 5755 +_LT_TAG_COMPILER 5756 +# Save the default compiler, since it gets overwritten when the other 5757 +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. 5758 +compiler_DEFAULT=$CC 5759 + 5760 +# save warnings/boilerplate of simple test code 5761 +_LT_COMPILER_BOILERPLATE 5762 +_LT_LINKER_BOILERPLATE 5763 + 5764 +## CAVEAT EMPTOR: 5765 +## There is no encapsulation within the following macros, do not change 5766 +## the running order or otherwise move them around unless you know exactly 5767 +## what you are doing... 5768 +if test -n "$compiler"; then 5769 + _LT_COMPILER_NO_RTTI($1) 5770 + _LT_COMPILER_PIC($1) 5771 + _LT_COMPILER_C_O($1) 5772 + _LT_COMPILER_FILE_LOCKS($1) 5773 + _LT_LINKER_SHLIBS($1) 5774 + _LT_SYS_DYNAMIC_LINKER($1) 5775 + _LT_LINKER_HARDCODE_LIBPATH($1) 5776 + LT_SYS_DLOPEN_SELF 5777 + _LT_CMD_STRIPLIB 5778 + 5779 + # Report which library types will actually be built 5780 + AC_MSG_CHECKING([if libtool supports shared libraries]) 5781 + AC_MSG_RESULT([$can_build_shared]) 5782 + 5783 + AC_MSG_CHECKING([whether to build shared libraries]) 5784 + test "$can_build_shared" = "no" && enable_shared=no 5785 + 5786 + # On AIX, shared libraries and static libraries use the same namespace, and 5787 + # are all built from PIC. 5788 + case $host_os in 5789 + aix3*) 5790 + test "$enable_shared" = yes && enable_static=no 5791 + if test -n "$RANLIB"; then 5792 + archive_cmds="$archive_cmds~\$RANLIB \$lib" 5793 + postinstall_cmds='$RANLIB $lib' 5794 + fi 5795 + ;; 5796 + 5797 + aix[[4-9]]*) 5798 + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then 5799 + test "$enable_shared" = yes && enable_static=no 5800 + fi 5801 + ;; 5802 + esac 5803 + AC_MSG_RESULT([$enable_shared]) 5804 + 5805 + AC_MSG_CHECKING([whether to build static libraries]) 5806 + # Make sure either enable_shared or enable_static is yes. 5807 + test "$enable_shared" = yes || enable_static=yes 5808 + AC_MSG_RESULT([$enable_static]) 5809 + 5810 + _LT_CONFIG($1) 5811 +fi 5812 +AC_LANG_POP 5813 +CC="$lt_save_CC" 5814 +])# _LT_LANG_C_CONFIG 5815 + 5816 + 5817 +# _LT_LANG_CXX_CONFIG([TAG]) 5818 +# -------------------------- 5819 +# Ensure that the configuration variables for a C++ compiler are suitably 5820 +# defined. These variables are subsequently used by _LT_CONFIG to write 5821 +# the compiler configuration to `libtool'. 5822 +m4_defun([_LT_LANG_CXX_CONFIG], 5823 +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl 5824 +m4_require([_LT_DECL_EGREP])dnl 5825 +m4_require([_LT_PATH_MANIFEST_TOOL])dnl 5826 +if test -n "$CXX" && ( test "X$CXX" != "Xno" && 5827 + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || 5828 + (test "X$CXX" != "Xg++"))) ; then 5829 + AC_PROG_CXXCPP 5830 +else 5831 + _lt_caught_CXX_error=yes 5832 +fi 5833 + 5834 +AC_LANG_PUSH(C++) 5835 +_LT_TAGVAR(archive_cmds_need_lc, $1)=no 5836 +_LT_TAGVAR(allow_undefined_flag, $1)= 5837 +_LT_TAGVAR(always_export_symbols, $1)=no 5838 +_LT_TAGVAR(archive_expsym_cmds, $1)= 5839 +_LT_TAGVAR(compiler_needs_object, $1)=no 5840 +_LT_TAGVAR(export_dynamic_flag_spec, $1)= 5841 +_LT_TAGVAR(hardcode_direct, $1)=no 5842 +_LT_TAGVAR(hardcode_direct_absolute, $1)=no 5843 +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= 5844 +_LT_TAGVAR(hardcode_libdir_separator, $1)= 5845 +_LT_TAGVAR(hardcode_minus_L, $1)=no 5846 +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported 5847 +_LT_TAGVAR(hardcode_automatic, $1)=no 5848 +_LT_TAGVAR(inherit_rpath, $1)=no 5849 +_LT_TAGVAR(module_cmds, $1)= 5850 +_LT_TAGVAR(module_expsym_cmds, $1)= 5851 +_LT_TAGVAR(link_all_deplibs, $1)=unknown 5852 +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds 5853 +_LT_TAGVAR(reload_flag, $1)=$reload_flag 5854 +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds 5855 +_LT_TAGVAR(no_undefined_flag, $1)= 5856 +_LT_TAGVAR(whole_archive_flag_spec, $1)= 5857 +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no 5858 + 5859 +# Source file extension for C++ test sources. 5860 +ac_ext=cpp 5861 + 5862 +# Object file extension for compiled C++ test sources. 5863 +objext=o 5864 +_LT_TAGVAR(objext, $1)=$objext 5865 + 5866 +# No sense in running all these tests if we already determined that 5867 +# the CXX compiler isn't working. Some variables (like enable_shared) 5868 +# are currently assumed to apply to all compilers on this platform, 5869 +# and will be corrupted by setting them based on a non-working compiler. 5870 +if test "$_lt_caught_CXX_error" != yes; then 5871 + # Code to be used in simple compile tests 5872 + lt_simple_compile_test_code="int some_variable = 0;" 5873 + 5874 + # Code to be used in simple link tests 5875 + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' 5876 + 5877 + # ltmain only uses $CC for tagged configurations so make sure $CC is set. 5878 + _LT_TAG_COMPILER 5879 + 5880 + # save warnings/boilerplate of simple test code 5881 + _LT_COMPILER_BOILERPLATE 5882 + _LT_LINKER_BOILERPLATE 5883 + 5884 + # Allow CC to be a program name with arguments. 5885 + lt_save_CC=$CC 5886 + lt_save_CFLAGS=$CFLAGS 5887 + lt_save_LD=$LD 5888 + lt_save_GCC=$GCC 5889 + GCC=$GXX 5890 + lt_save_with_gnu_ld=$with_gnu_ld 5891 + lt_save_path_LD=$lt_cv_path_LD 5892 + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then 5893 + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx 5894 + else 5895 + $as_unset lt_cv_prog_gnu_ld 5896 + fi 5897 + if test -n "${lt_cv_path_LDCXX+set}"; then 5898 + lt_cv_path_LD=$lt_cv_path_LDCXX 5899 + else 5900 + $as_unset lt_cv_path_LD 5901 + fi 5902 + test -z "${LDCXX+set}" || LD=$LDCXX 5903 + CC=${CXX-"c++"} 5904 + CFLAGS=$CXXFLAGS 5905 + compiler=$CC 5906 + _LT_TAGVAR(compiler, $1)=$CC 5907 + _LT_CC_BASENAME([$compiler]) 5908 + 5909 + if test -n "$compiler"; then 5910 + # We don't want -fno-exception when compiling C++ code, so set the 5911 + # no_builtin_flag separately 5912 + if test "$GXX" = yes; then 5913 + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' 5914 + else 5915 + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= 5916 + fi 5917 + 5918 + if test "$GXX" = yes; then 5919 + # Set up default GNU C++ configuration 5920 + 5921 + LT_PATH_LD 5922 + 5923 + # Check if GNU C++ uses GNU ld as the underlying linker, since the 5924 + # archiving commands below assume that GNU ld is being used. 5925 + if test "$with_gnu_ld" = yes; then 5926 + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' 5927 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' 5928 + 5929 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 5930 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' 5931 + 5932 + # If archive_cmds runs LD, not CC, wlarc should be empty 5933 + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to 5934 + # investigate it a little bit more. (MM) 5935 + wlarc='${wl}' 5936 + 5937 + # ancient GNU ld didn't support --whole-archive et. al. 5938 + if eval "`$CC -print-prog-name=ld` --help 2>&1" | 5939 + $GREP 'no-whole-archive' > /dev/null; then 5940 + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' 5941 + else 5942 + _LT_TAGVAR(whole_archive_flag_spec, $1)= 5943 + fi 5944 + else 5945 + with_gnu_ld=no 5946 + wlarc= 5947 + 5948 + # A generic and very simple default shared library creation 5949 + # command for GNU C++ for the case where it uses the native 5950 + # linker, instead of GNU ld. If possible, this setting should 5951 + # overridden to take advantage of the native linker features on 5952 + # the platform it is being used on. 5953 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' 5954 + fi 5955 + 5956 + # Commands to make compiler produce verbose output that lists 5957 + # what "hidden" libraries, object files and flags are used when 5958 + # linking a shared library. 5959 + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' 5960 + 5961 + else 5962 + GXX=no 5963 + with_gnu_ld=no 5964 + wlarc= 5965 + fi 5966 + 5967 + # PORTME: fill in a description of your system's C++ link characteristics 5968 + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) 5969 + _LT_TAGVAR(ld_shlibs, $1)=yes 5970 + case $host_os in 5971 + aix3*) 5972 + # FIXME: insert proper C++ library support 5973 + _LT_TAGVAR(ld_shlibs, $1)=no 5974 + ;; 5975 + aix[[4-9]]*) 5976 + if test "$host_cpu" = ia64; then 5977 + # On IA64, the linker does run time linking by default, so we don't 5978 + # have to do anything special. 5979 + aix_use_runtimelinking=no 5980 + exp_sym_flag='-Bexport' 5981 + no_entry_flag="" 5982 + else 5983 + aix_use_runtimelinking=no 5984 + 5985 + # Test if we are trying to use run time linking or normal 5986 + # AIX style linking. If -brtl is somewhere in LDFLAGS, we 5987 + # need to do runtime linking. 5988 + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) 5989 + for ld_flag in $LDFLAGS; do 5990 + case $ld_flag in 5991 + *-brtl*) 5992 + aix_use_runtimelinking=yes 5993 + break 5994 + ;; 5995 + esac 5996 + done 5997 + ;; 5998 + esac 5999 + 6000 + exp_sym_flag='-bexport' 6001 + no_entry_flag='-bnoentry' 6002 + fi 6003 + 6004 + # When large executables or shared objects are built, AIX ld can 6005 + # have problems creating the table of contents. If linking a library 6006 + # or program results in "error TOC overflow" add -mminimal-toc to 6007 + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not 6008 + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. 6009 + 6010 + _LT_TAGVAR(archive_cmds, $1)='' 6011 + _LT_TAGVAR(hardcode_direct, $1)=yes 6012 + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes 6013 + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' 6014 + _LT_TAGVAR(link_all_deplibs, $1)=yes 6015 + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' 6016 + 6017 + if test "$GXX" = yes; then 6018 + case $host_os in aix4.[[012]]|aix4.[[012]].*) 6019 + # We only want to do this on AIX 4.2 and lower, the check 6020 + # below for broken collect2 doesn't work under 4.3+ 6021 + collect2name=`${CC} -print-prog-name=collect2` 6022 + if test -f "$collect2name" && 6023 + strings "$collect2name" | $GREP resolve_lib_name >/dev/null 6024 + then 6025 + # We have reworked collect2 6026 + : 6027 + else 6028 + # We have old collect2 6029 + _LT_TAGVAR(hardcode_direct, $1)=unsupported 6030 + # It fails to find uninstalled libraries when the uninstalled 6031 + # path is not listed in the libpath. Setting hardcode_minus_L 6032 + # to unsupported forces relinking 6033 + _LT_TAGVAR(hardcode_minus_L, $1)=yes 6034 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' 6035 + _LT_TAGVAR(hardcode_libdir_separator, $1)= 6036 + fi 6037 + esac 6038 + shared_flag='-shared' 6039 + if test "$aix_use_runtimelinking" = yes; then 6040 + shared_flag="$shared_flag "'${wl}-G' 6041 + fi 6042 + else 6043 + # not using gcc 6044 + if test "$host_cpu" = ia64; then 6045 + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release 6046 + # chokes on -Wl,-G. The following line is correct: 6047 + shared_flag='-G' 6048 + else 6049 + if test "$aix_use_runtimelinking" = yes; then 6050 + shared_flag='${wl}-G' 6051 + else 6052 + shared_flag='${wl}-bM:SRE' 6053 + fi 6054 + fi 6055 + fi 6056 + 6057 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' 6058 + # It seems that -bexpall does not export symbols beginning with 6059 + # underscore (_), so it is better to generate a list of symbols to 6060 + # export. 6061 + _LT_TAGVAR(always_export_symbols, $1)=yes 6062 + if test "$aix_use_runtimelinking" = yes; then 6063 + # Warning - without using the other runtime loading flags (-brtl), 6064 + # -berok will link without error, but may produce a broken library. 6065 + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' 6066 + # Determine the default libpath from the value encoded in an empty 6067 + # executable. 6068 + _LT_SYS_MODULE_PATH_AIX([$1]) 6069 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" 6070 + 6071 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" 6072 + else 6073 + if test "$host_cpu" = ia64; then 6074 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' 6075 + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" 6076 + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" 6077 + else 6078 + # Determine the default libpath from the value encoded in an 6079 + # empty executable. 6080 + _LT_SYS_MODULE_PATH_AIX([$1]) 6081 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" 6082 + # Warning - without using the other run time loading flags, 6083 + # -berok will link without error, but may produce a broken library. 6084 + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' 6085 + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' 6086 + if test "$with_gnu_ld" = yes; then 6087 + # We only use this code for GNU lds that support --whole-archive. 6088 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' 6089 + else 6090 + # Exported symbols can be pulled into shared objects from archives 6091 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' 6092 + fi 6093 + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes 6094 + # This is similar to how AIX traditionally builds its shared 6095 + # libraries. 6096 + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' 6097 + fi 6098 + fi 6099 + ;; 6100 + 6101 + beos*) 6102 + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then 6103 + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported 6104 + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc 6105 + # support --undefined. This deserves some investigation. FIXME 6106 + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 6107 + else 6108 + _LT_TAGVAR(ld_shlibs, $1)=no 6109 + fi 6110 + ;; 6111 + 6112 + chorus*) 6113 + case $cc_basename in 6114 + *) 6115 + # FIXME: insert proper C++ library support 6116 + _LT_TAGVAR(ld_shlibs, $1)=no 6117 + ;; 6118 + esac 6119 + ;; 6120 + 6121 + cygwin* | mingw* | pw32* | cegcc*) 6122 + case $GXX,$cc_basename in 6123 + ,cl* | no,cl*) 6124 + # Native MSVC 6125 + # hardcode_libdir_flag_spec is actually meaningless, as there is 6126 + # no search path for DLLs. 6127 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' 6128 + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported 6129 + _LT_TAGVAR(always_export_symbols, $1)=yes 6130 + _LT_TAGVAR(file_list_spec, $1)='@' 6131 + # Tell ltmain to make .lib files, not .a files. 6132 + libext=lib 6133 + # Tell ltmain to make .dll files, not .so files. 6134 + shrext_cmds=".dll" 6135 + # FIXME: Setting linknames here is a bad hack. 6136 + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' 6137 + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then 6138 + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; 6139 + else 6140 + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; 6141 + fi~ 6142 + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ 6143 + linknames=' 6144 + # The linker will not automatically build a static lib if we build a DLL. 6145 + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' 6146 + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes 6147 + # Don't use ranlib 6148 + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' 6149 + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ 6150 + lt_tool_outputfile="@TOOL_OUTPUT@"~ 6151 + case $lt_outputfile in 6152 + *.exe|*.EXE) ;; 6153 + *) 6154 + lt_outputfile="$lt_outputfile.exe" 6155 + lt_tool_outputfile="$lt_tool_outputfile.exe" 6156 + ;; 6157 + esac~ 6158 + func_to_tool_file "$lt_outputfile"~ 6159 + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then 6160 + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; 6161 + $RM "$lt_outputfile.manifest"; 6162 + fi' 6163 + ;; 6164 + *) 6165 + # g++ 6166 + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, 6167 + # as there is no search path for DLLs. 6168 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' 6169 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' 6170 + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported 6171 + _LT_TAGVAR(always_export_symbols, $1)=no 6172 + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes 6173 + 6174 + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then 6175 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' 6176 + # If the export-symbols file already is a .def file (1st line 6177 + # is EXPORTS), use it as is; otherwise, prepend... 6178 + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then 6179 + cp $export_symbols $output_objdir/$soname.def; 6180 + else 6181 + echo EXPORTS > $output_objdir/$soname.def; 6182 + cat $export_symbols >> $output_objdir/$soname.def; 6183 + fi~ 6184 + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' 6185 + else 6186 + _LT_TAGVAR(ld_shlibs, $1)=no 6187 + fi 6188 + ;; 6189 + esac 6190 + ;; 6191 + darwin* | rhapsody*) 6192 + _LT_DARWIN_LINKER_FEATURES($1) 6193 + ;; 6194 + 6195 + dgux*) 6196 + case $cc_basename in 6197 + ec++*) 6198 + # FIXME: insert proper C++ library support 6199 + _LT_TAGVAR(ld_shlibs, $1)=no 6200 + ;; 6201 + ghcx*) 6202 + # Green Hills C++ Compiler 6203 + # FIXME: insert proper C++ library support 6204 + _LT_TAGVAR(ld_shlibs, $1)=no 6205 + ;; 6206 + *) 6207 + # FIXME: insert proper C++ library support 6208 + _LT_TAGVAR(ld_shlibs, $1)=no 6209 + ;; 6210 + esac 6211 + ;; 6212 + 6213 + freebsd2.*) 6214 + # C++ shared libraries reported to be fairly broken before 6215 + # switch to ELF 6216 + _LT_TAGVAR(ld_shlibs, $1)=no 6217 + ;; 6218 + 6219 + freebsd-elf*) 6220 + _LT_TAGVAR(archive_cmds_need_lc, $1)=no 6221 + ;; 6222 + 6223 + freebsd* | dragonfly*) 6224 + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF 6225 + # conventions 6226 + _LT_TAGVAR(ld_shlibs, $1)=yes 6227 + ;; 6228 + 6229 + gnu*) 6230 + ;; 6231 + 6232 + haiku*) 6233 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 6234 + _LT_TAGVAR(link_all_deplibs, $1)=yes 6235 + ;; 6236 + 6237 + hpux9*) 6238 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' 6239 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 6240 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' 6241 + _LT_TAGVAR(hardcode_direct, $1)=yes 6242 + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, 6243 + # but as the default 6244 + # location of the library. 6245 + 6246 + case $cc_basename in 6247 + CC*) 6248 + # FIXME: insert proper C++ library support 6249 + _LT_TAGVAR(ld_shlibs, $1)=no 6250 + ;; 6251 + aCC*) 6252 + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' 6253 + # Commands to make compiler produce verbose output that lists 6254 + # what "hidden" libraries, object files and flags are used when 6255 + # linking a shared library. 6256 + # 6257 + # There doesn't appear to be a way to prevent this compiler from 6258 + # explicitly linking system object files so we need to strip them 6259 + # from the output so that they don't get included in the library 6260 + # dependencies. 6261 + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' 6262 + ;; 6263 + *) 6264 + if test "$GXX" = yes; then 6265 + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' 6266 + else 6267 + # FIXME: insert proper C++ library support 6268 + _LT_TAGVAR(ld_shlibs, $1)=no 6269 + fi 6270 + ;; 6271 + esac 6272 + ;; 6273 + 6274 + hpux10*|hpux11*) 6275 + if test $with_gnu_ld = no; then 6276 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' 6277 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 6278 + 6279 + case $host_cpu in 6280 + hppa*64*|ia64*) 6281 + ;; 6282 + *) 6283 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' 6284 + ;; 6285 + esac 6286 + fi 6287 + case $host_cpu in 6288 + hppa*64*|ia64*) 6289 + _LT_TAGVAR(hardcode_direct, $1)=no 6290 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 6291 + ;; 6292 + *) 6293 + _LT_TAGVAR(hardcode_direct, $1)=yes 6294 + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes 6295 + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, 6296 + # but as the default 6297 + # location of the library. 6298 + ;; 6299 + esac 6300 + 6301 + case $cc_basename in 6302 + CC*) 6303 + # FIXME: insert proper C++ library support 6304 + _LT_TAGVAR(ld_shlibs, $1)=no 6305 + ;; 6306 + aCC*) 6307 + case $host_cpu in 6308 + hppa*64*) 6309 + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' 6310 + ;; 6311 + ia64*) 6312 + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' 6313 + ;; 6314 + *) 6315 + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' 6316 + ;; 6317 + esac 6318 + # Commands to make compiler produce verbose output that lists 6319 + # what "hidden" libraries, object files and flags are used when 6320 + # linking a shared library. 6321 + # 6322 + # There doesn't appear to be a way to prevent this compiler from 6323 + # explicitly linking system object files so we need to strip them 6324 + # from the output so that they don't get included in the library 6325 + # dependencies. 6326 + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' 6327 + ;; 6328 + *) 6329 + if test "$GXX" = yes; then 6330 + if test $with_gnu_ld = no; then 6331 + case $host_cpu in 6332 + hppa*64*) 6333 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' 6334 + ;; 6335 + ia64*) 6336 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' 6337 + ;; 6338 + *) 6339 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' 6340 + ;; 6341 + esac 6342 + fi 6343 + else 6344 + # FIXME: insert proper C++ library support 6345 + _LT_TAGVAR(ld_shlibs, $1)=no 6346 + fi 6347 + ;; 6348 + esac 6349 + ;; 6350 + 6351 + interix[[3-9]]*) 6352 + _LT_TAGVAR(hardcode_direct, $1)=no 6353 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 6354 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' 6355 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' 6356 + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. 6357 + # Instead, shared libraries are loaded at an image base (0x10000000 by 6358 + # default) and relocated if they conflict, which is a slow very memory 6359 + # consuming and fragmenting process. To avoid this, we pick a random, 6360 + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link 6361 + # time. Moving up from 0x10000000 also allows more sbrk(2) space. 6362 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' 6363 + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' 6364 + ;; 6365 + irix5* | irix6*) 6366 + case $cc_basename in 6367 + CC*) 6368 + # SGI C++ 6369 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' 6370 + 6371 + # Archives containing C++ object files must be created using 6372 + # "CC -ar", where "CC" is the IRIX C++ compiler. This is 6373 + # necessary to make sure instantiated templates are included 6374 + # in the archive. 6375 + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' 6376 + ;; 6377 + *) 6378 + if test "$GXX" = yes; then 6379 + if test "$with_gnu_ld" = no; then 6380 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' 6381 + else 6382 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' 6383 + fi 6384 + fi 6385 + _LT_TAGVAR(link_all_deplibs, $1)=yes 6386 + ;; 6387 + esac 6388 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 6389 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 6390 + _LT_TAGVAR(inherit_rpath, $1)=yes 6391 + ;; 6392 + 6393 + linux* | k*bsd*-gnu | kopensolaris*-gnu) 6394 + case $cc_basename in 6395 + KCC*) 6396 + # Kuck and Associates, Inc. (KAI) C++ Compiler 6397 + 6398 + # KCC will only create a shared library if the output file 6399 + # ends with ".so" (or ".sl" for HP-UX), so rename the library 6400 + # to its proper name (with version) after linking. 6401 + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' 6402 + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' 6403 + # Commands to make compiler produce verbose output that lists 6404 + # what "hidden" libraries, object files and flags are used when 6405 + # linking a shared library. 6406 + # 6407 + # There doesn't appear to be a way to prevent this compiler from 6408 + # explicitly linking system object files so we need to strip them 6409 + # from the output so that they don't get included in the library 6410 + # dependencies. 6411 + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' 6412 + 6413 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' 6414 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' 6415 + 6416 + # Archives containing C++ object files must be created using 6417 + # "CC -Bstatic", where "CC" is the KAI C++ compiler. 6418 + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' 6419 + ;; 6420 + icpc* | ecpc* ) 6421 + # Intel C++ 6422 + with_gnu_ld=yes 6423 + # version 8.0 and above of icpc choke on multiply defined symbols 6424 + # if we add $predep_objects and $postdep_objects, however 7.1 and 6425 + # earlier do not add the objects themselves. 6426 + case `$CC -V 2>&1` in 6427 + *"Version 7."*) 6428 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' 6429 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' 6430 + ;; 6431 + *) # Version 8.0 or newer 6432 + tmp_idyn= 6433 + case $host_cpu in 6434 + ia64*) tmp_idyn=' -i_dynamic';; 6435 + esac 6436 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 6437 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' 6438 + ;; 6439 + esac 6440 + _LT_TAGVAR(archive_cmds_need_lc, $1)=no 6441 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' 6442 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' 6443 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' 6444 + ;; 6445 + pgCC* | pgcpp*) 6446 + # Portland Group C++ compiler 6447 + case `$CC -V` in 6448 + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) 6449 + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ 6450 + rm -rf $tpldir~ 6451 + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ 6452 + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' 6453 + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ 6454 + rm -rf $tpldir~ 6455 + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ 6456 + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ 6457 + $RANLIB $oldlib' 6458 + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ 6459 + rm -rf $tpldir~ 6460 + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ 6461 + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' 6462 + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ 6463 + rm -rf $tpldir~ 6464 + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ 6465 + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' 6466 + ;; 6467 + *) # Version 6 and above use weak symbols 6468 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' 6469 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' 6470 + ;; 6471 + esac 6472 + 6473 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' 6474 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' 6475 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' 6476 + ;; 6477 + cxx*) 6478 + # Compaq C++ 6479 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' 6480 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' 6481 + 6482 + runpath_var=LD_RUN_PATH 6483 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' 6484 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 6485 + 6486 + # Commands to make compiler produce verbose output that lists 6487 + # what "hidden" libraries, object files and flags are used when 6488 + # linking a shared library. 6489 + # 6490 + # There doesn't appear to be a way to prevent this compiler from 6491 + # explicitly linking system object files so we need to strip them 6492 + # from the output so that they don't get included in the library 6493 + # dependencies. 6494 + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' 6495 + ;; 6496 + xl* | mpixl* | bgxl*) 6497 + # IBM XL 8.0 on PPC, with GNU ld 6498 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 6499 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' 6500 + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' 6501 + if test "x$supports_anon_versioning" = xyes; then 6502 + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ 6503 + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ 6504 + echo "local: *; };" >> $output_objdir/$libname.ver~ 6505 + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' 6506 + fi 6507 + ;; 6508 + *) 6509 + case `$CC -V 2>&1 | sed 5q` in 6510 + *Sun\ C*) 6511 + # Sun C++ 5.9 6512 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' 6513 + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' 6514 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' 6515 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' 6516 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' 6517 + _LT_TAGVAR(compiler_needs_object, $1)=yes 6518 + 6519 + # Not sure whether something based on 6520 + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 6521 + # would be better. 6522 + output_verbose_link_cmd='func_echo_all' 6523 + 6524 + # Archives containing C++ object files must be created using 6525 + # "CC -xar", where "CC" is the Sun C++ compiler. This is 6526 + # necessary to make sure instantiated templates are included 6527 + # in the archive. 6528 + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' 6529 + ;; 6530 + esac 6531 + ;; 6532 + esac 6533 + ;; 6534 + 6535 + lynxos*) 6536 + # FIXME: insert proper C++ library support 6537 + _LT_TAGVAR(ld_shlibs, $1)=no 6538 + ;; 6539 + 6540 + m88k*) 6541 + # FIXME: insert proper C++ library support 6542 + _LT_TAGVAR(ld_shlibs, $1)=no 6543 + ;; 6544 + 6545 + mvs*) 6546 + case $cc_basename in 6547 + cxx*) 6548 + # FIXME: insert proper C++ library support 6549 + _LT_TAGVAR(ld_shlibs, $1)=no 6550 + ;; 6551 + *) 6552 + # FIXME: insert proper C++ library support 6553 + _LT_TAGVAR(ld_shlibs, $1)=no 6554 + ;; 6555 + esac 6556 + ;; 6557 + 6558 + netbsd*) 6559 + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then 6560 + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' 6561 + wlarc= 6562 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' 6563 + _LT_TAGVAR(hardcode_direct, $1)=yes 6564 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 6565 + fi 6566 + # Workaround some broken pre-1.5 toolchains 6567 + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' 6568 + ;; 6569 + 6570 + *nto* | *qnx*) 6571 + _LT_TAGVAR(ld_shlibs, $1)=yes 6572 + ;; 6573 + 6574 + openbsd2*) 6575 + # C++ shared libraries are fairly broken 6576 + _LT_TAGVAR(ld_shlibs, $1)=no 6577 + ;; 6578 + 6579 + openbsd*) 6580 + if test -f /usr/libexec/ld.so; then 6581 + _LT_TAGVAR(hardcode_direct, $1)=yes 6582 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 6583 + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes 6584 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' 6585 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' 6586 + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then 6587 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' 6588 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' 6589 + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' 6590 + fi 6591 + output_verbose_link_cmd=func_echo_all 6592 + else 6593 + _LT_TAGVAR(ld_shlibs, $1)=no 6594 + fi 6595 + ;; 6596 + 6597 + osf3* | osf4* | osf5*) 6598 + case $cc_basename in 6599 + KCC*) 6600 + # Kuck and Associates, Inc. (KAI) C++ Compiler 6601 + 6602 + # KCC will only create a shared library if the output file 6603 + # ends with ".so" (or ".sl" for HP-UX), so rename the library 6604 + # to its proper name (with version) after linking. 6605 + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' 6606 + 6607 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' 6608 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 6609 + 6610 + # Archives containing C++ object files must be created using 6611 + # the KAI C++ compiler. 6612 + case $host in 6613 + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; 6614 + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; 6615 + esac 6616 + ;; 6617 + RCC*) 6618 + # Rational C++ 2.4.1 6619 + # FIXME: insert proper C++ library support 6620 + _LT_TAGVAR(ld_shlibs, $1)=no 6621 + ;; 6622 + cxx*) 6623 + case $host in 6624 + osf3*) 6625 + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' 6626 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' 6627 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 6628 + ;; 6629 + *) 6630 + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' 6631 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' 6632 + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ 6633 + echo "-hidden">> $lib.exp~ 6634 + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ 6635 + $RM $lib.exp' 6636 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' 6637 + ;; 6638 + esac 6639 + 6640 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 6641 + 6642 + # Commands to make compiler produce verbose output that lists 6643 + # what "hidden" libraries, object files and flags are used when 6644 + # linking a shared library. 6645 + # 6646 + # There doesn't appear to be a way to prevent this compiler from 6647 + # explicitly linking system object files so we need to strip them 6648 + # from the output so that they don't get included in the library 6649 + # dependencies. 6650 + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' 6651 + ;; 6652 + *) 6653 + if test "$GXX" = yes && test "$with_gnu_ld" = no; then 6654 + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' 6655 + case $host in 6656 + osf3*) 6657 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' 6658 + ;; 6659 + *) 6660 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' 6661 + ;; 6662 + esac 6663 + 6664 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' 6665 + _LT_TAGVAR(hardcode_libdir_separator, $1)=: 6666 + 6667 + # Commands to make compiler produce verbose output that lists 6668 + # what "hidden" libraries, object files and flags are used when 6669 + # linking a shared library. 6670 + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' 6671 + 6672 + else 6673 + # FIXME: insert proper C++ library support 6674 + _LT_TAGVAR(ld_shlibs, $1)=no 6675 + fi 6676 + ;; 6677 + esac 6678 + ;; 6679 + 6680 + psos*) 6681 + # FIXME: insert proper C++ library support 6682 + _LT_TAGVAR(ld_shlibs, $1)=no 6683 + ;; 6684 + 6685 + sunos4*) 6686 + case $cc_basename in 6687 + CC*) 6688 + # Sun C++ 4.x 6689 + # FIXME: insert proper C++ library support 6690 + _LT_TAGVAR(ld_shlibs, $1)=no 6691 + ;; 6692 + lcc*) 6693 + # Lucid 6694 + # FIXME: insert proper C++ library support 6695 + _LT_TAGVAR(ld_shlibs, $1)=no 6696 + ;; 6697 + *) 6698 + # FIXME: insert proper C++ library support 6699 + _LT_TAGVAR(ld_shlibs, $1)=no 6700 + ;; 6701 + esac 6702 + ;; 6703 + 6704 + solaris*) 6705 + case $cc_basename in 6706 + CC* | sunCC*) 6707 + # Sun C++ 4.2, 5.x and Centerline C++ 6708 + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes 6709 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' 6710 + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' 6711 + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ 6712 + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' 6713 + 6714 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' 6715 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 6716 + case $host_os in 6717 + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; 6718 + *) 6719 + # The compiler driver will combine and reorder linker options, 6720 + # but understands `-z linker_flag'. 6721 + # Supported since Solaris 2.6 (maybe 2.5.1?) 6722 + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' 6723 + ;; 6724 + esac 6725 + _LT_TAGVAR(link_all_deplibs, $1)=yes 6726 + 6727 + output_verbose_link_cmd='func_echo_all' 6728 + 6729 + # Archives containing C++ object files must be created using 6730 + # "CC -xar", where "CC" is the Sun C++ compiler. This is 6731 + # necessary to make sure instantiated templates are included 6732 + # in the archive. 6733 + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' 6734 + ;; 6735 + gcx*) 6736 + # Green Hills C++ Compiler 6737 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' 6738 + 6739 + # The C++ compiler must be used to create the archive. 6740 + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' 6741 + ;; 6742 + *) 6743 + # GNU C++ compiler with Solaris linker 6744 + if test "$GXX" = yes && test "$with_gnu_ld" = no; then 6745 + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' 6746 + if $CC --version | $GREP -v '^2\.7' > /dev/null; then 6747 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' 6748 + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ 6749 + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' 6750 + 6751 + # Commands to make compiler produce verbose output that lists 6752 + # what "hidden" libraries, object files and flags are used when 6753 + # linking a shared library. 6754 + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' 6755 + else 6756 + # g++ 2.7 appears to require `-G' NOT `-shared' on this 6757 + # platform. 6758 + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' 6759 + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ 6760 + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' 6761 + 6762 + # Commands to make compiler produce verbose output that lists 6763 + # what "hidden" libraries, object files and flags are used when 6764 + # linking a shared library. 6765 + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' 6766 + fi 6767 + 6768 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' 6769 + case $host_os in 6770 + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; 6771 + *) 6772 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' 6773 + ;; 6774 + esac 6775 + fi 6776 + ;; 6777 + esac 6778 + ;; 6779 + 6780 + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) 6781 + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' 6782 + _LT_TAGVAR(archive_cmds_need_lc, $1)=no 6783 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 6784 + runpath_var='LD_RUN_PATH' 6785 + 6786 + case $cc_basename in 6787 + CC*) 6788 + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 6789 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 6790 + ;; 6791 + *) 6792 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 6793 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 6794 + ;; 6795 + esac 6796 + ;; 6797 + 6798 + sysv5* | sco3.2v5* | sco5v6*) 6799 + # Note: We can NOT use -z defs as we might desire, because we do not 6800 + # link with -lc, and that would cause any symbols used from libc to 6801 + # always be unresolved, which means just about no library would 6802 + # ever link correctly. If we're not using GNU ld we use -z text 6803 + # though, which does catch some bad symbols but isn't as heavy-handed 6804 + # as -z defs. 6805 + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' 6806 + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' 6807 + _LT_TAGVAR(archive_cmds_need_lc, $1)=no 6808 + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no 6809 + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' 6810 + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' 6811 + _LT_TAGVAR(link_all_deplibs, $1)=yes 6812 + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' 6813 + runpath_var='LD_RUN_PATH' 6814 + 6815 + case $cc_basename in 6816 + CC*) 6817 + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 6818 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 6819 + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ 6820 + '"$_LT_TAGVAR(old_archive_cmds, $1)" 6821 + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ 6822 + '"$_LT_TAGVAR(reload_cmds, $1)" 6823 + ;; 6824 + *) 6825 + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 6826 + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' 6827 + ;; 6828 + esac 6829 + ;; 6830 + 6831 + tandem*) 6832 + case $cc_basename in 6833 + NCC*) 6834 + # NonStop-UX NCC 3.20 6835 + # FIXME: insert proper C++ library support 6836 + _LT_TAGVAR(ld_shlibs, $1)=no 6837 + ;; 6838 + *) 6839 + # FIXME: insert proper C++ library support 6840 + _LT_TAGVAR(ld_shlibs, $1)=no 6841 + ;; 6842 + esac 6843 + ;; 6844 + 6845 + vxworks*) 6846 + # FIXME: insert proper C++ library support 6847 + _LT_TAGVAR(ld_shlibs, $1)=no 6848 + ;; 6849 + 6850 + *) 6851 + # FIXME: insert proper C++ library support 6852 + _LT_TAGVAR(ld_shlibs, $1)=no 6853 + ;; 6854 + esac 6855 + 6856 + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) 6857 + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no 6858 + 6859 + _LT_TAGVAR(GCC, $1)="$GXX" 6860 + _LT_TAGVAR(LD, $1)="$LD" 6861 + 6862 + ## CAVEAT EMPTOR: 6863 + ## There is no encapsulation within the following macros, do not change 6864 + ## the running order or otherwise move them around unless you know exactly 6865 + ## what you are doing... 6866 + _LT_SYS_HIDDEN_LIBDEPS($1) 6867 + _LT_COMPILER_PIC($1) 6868 + _LT_COMPILER_C_O($1) 6869 + _LT_COMPILER_FILE_LOCKS($1) 6870 + _LT_LINKER_SHLIBS($1) 6871 + _LT_SYS_DYNAMIC_LINKER($1) 6872 + _LT_LINKER_HARDCODE_LIBPATH($1) 6873 + 6874 + _LT_CONFIG($1) 6875 + fi # test -n "$compiler" 6876 + 6877 + CC=$lt_save_CC 6878 + CFLAGS=$lt_save_CFLAGS 6879 + LDCXX=$LD 6880 + LD=$lt_save_LD 6881 + GCC=$lt_save_GCC 6882 + with_gnu_ld=$lt_save_with_gnu_ld 6883 + lt_cv_path_LDCXX=$lt_cv_path_LD 6884 + lt_cv_path_LD=$lt_save_path_LD 6885 + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld 6886 + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld 6887 +fi # test "$_lt_caught_CXX_error" != yes 6888 + 6889 +AC_LANG_POP 6890 +])# _LT_LANG_CXX_CONFIG 6891 + 6892 + 6893 +# _LT_FUNC_STRIPNAME_CNF 6894 +# ---------------------- 6895 +# func_stripname_cnf prefix suffix name 6896 +# strip PREFIX and SUFFIX off of NAME. 6897 +# PREFIX and SUFFIX must not contain globbing or regex special 6898 +# characters, hashes, percent signs, but SUFFIX may contain a leading 6899 +# dot (in which case that matches only a dot). 6900 +# 6901 +# This function is identical to the (non-XSI) version of func_stripname, 6902 +# except this one can be used by m4 code that may be executed by configure, 6903 +# rather than the libtool script. 6904 +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl 6905 +AC_REQUIRE([_LT_DECL_SED]) 6906 +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) 6907 +func_stripname_cnf () 6908 +{ 6909 + case ${2} in 6910 + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; 6911 + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; 6912 + esac 6913 +} # func_stripname_cnf 6914 +])# _LT_FUNC_STRIPNAME_CNF 6915 + 6916 +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) 6917 +# --------------------------------- 6918 +# Figure out "hidden" library dependencies from verbose 6919 +# compiler output when linking a shared library. 6920 +# Parse the compiler output and extract the necessary 6921 +# objects, libraries and library flags. 6922 +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], 6923 +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl 6924 +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl 6925 +# Dependencies to place before and after the object being linked: 6926 +_LT_TAGVAR(predep_objects, $1)= 6927 +_LT_TAGVAR(postdep_objects, $1)= 6928 +_LT_TAGVAR(predeps, $1)= 6929 +_LT_TAGVAR(postdeps, $1)= 6930 +_LT_TAGVAR(compiler_lib_search_path, $1)= 6931 + 6932 +dnl we can't use the lt_simple_compile_test_code here, 6933 +dnl because it contains code intended for an executable, 6934 +dnl not a library. It's possible we should let each 6935 +dnl tag define a new lt_????_link_test_code variable, 6936 +dnl but it's only used here... 6937 +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF 6938 +int a; 6939 +void foo (void) { a = 0; } 6940 +_LT_EOF 6941 +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF 6942 +class Foo 6943 +{ 6944 +public: 6945 + Foo (void) { a = 0; } 6946 +private: 6947 + int a; 6948 +}; 6949 +_LT_EOF 6950 +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF 6951 + subroutine foo 6952 + implicit none 6953 + integer*4 a 6954 + a=0 6955 + return 6956 + end 6957 +_LT_EOF 6958 +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF 6959 + subroutine foo 6960 + implicit none 6961 + integer a 6962 + a=0 6963 + return 6964 + end 6965 +_LT_EOF 6966 +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF 6967 +public class foo { 6968 + private int a; 6969 + public void bar (void) { 6970 + a = 0; 6971 + } 6972 +}; 6973 +_LT_EOF 6974 +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF 6975 +package foo 6976 +func foo() { 6977 +} 6978 +_LT_EOF 6979 +]) 6980 + 6981 +_lt_libdeps_save_CFLAGS=$CFLAGS 6982 +case "$CC $CFLAGS " in #( 6983 +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; 6984 +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; 6985 +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; 6986 +esac 6987 + 6988 +dnl Parse the compiler output and extract the necessary 6989 +dnl objects, libraries and library flags. 6990 +if AC_TRY_EVAL(ac_compile); then 6991 + # Parse the compiler output and extract the necessary 6992 + # objects, libraries and library flags. 6993 + 6994 + # Sentinel used to keep track of whether or not we are before 6995 + # the conftest object file. 6996 + pre_test_object_deps_done=no 6997 + 6998 + for p in `eval "$output_verbose_link_cmd"`; do 6999 + case ${prev}${p} in 7000 + 7001 + -L* | -R* | -l*) 7002 + # Some compilers place space between "-{L,R}" and the path. 7003 + # Remove the space. 7004 + if test $p = "-L" || 7005 + test $p = "-R"; then 7006 + prev=$p 7007 + continue 7008 + fi 7009 + 7010 + # Expand the sysroot to ease extracting the directories later. 7011 + if test -z "$prev"; then 7012 + case $p in 7013 + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; 7014 + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; 7015 + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; 7016 + esac 7017 + fi 7018 + case $p in 7019 + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; 7020 + esac 7021 + if test "$pre_test_object_deps_done" = no; then 7022 + case ${prev} in 7023 + -L | -R) 7024 + # Internal compiler library paths should come after those 7025 + # provided the user. The postdeps already come after the 7026 + # user supplied libs so there is no need to process them. 7027 + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then 7028 + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" 7029 + else 7030 + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" 7031 + fi 7032 + ;; 7033 + # The "-l" case would never come before the object being 7034 + # linked, so don't bother handling this case. 7035 + esac 7036 + else 7037 + if test -z "$_LT_TAGVAR(postdeps, $1)"; then 7038 + _LT_TAGVAR(postdeps, $1)="${prev}${p}" 7039 + else 7040 + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" 7041 + fi 7042 + fi 7043 + prev= 7044 + ;; 7045 + 7046 + *.lto.$objext) ;; # Ignore GCC LTO objects 7047 + *.$objext) 7048 + # This assumes that the test object file only shows up 7049 + # once in the compiler output. 7050 + if test "$p" = "conftest.$objext"; then 7051 + pre_test_object_deps_done=yes 7052 + continue 7053 + fi 7054 + 7055 + if test "$pre_test_object_deps_done" = no; then 7056 + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then 7057 + _LT_TAGVAR(predep_objects, $1)="$p" 7058 + else 7059 + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" 7060 + fi 7061 + else 7062 + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then 7063 + _LT_TAGVAR(postdep_objects, $1)="$p" 7064 + else 7065 + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" 7066 + fi 7067 + fi 7068 + ;; 7069 + 7070 + *) ;; # Ignore the rest. 7071 + 7072 + esac 7073 + done 7074 + 7075 + # Clean up. 7076 + rm -f a.out a.exe 7077 +else 7078 + echo "libtool.m4: error: problem compiling $1 test program" 7079 +fi 7080 + 7081 +$RM -f confest.$objext 7082 +CFLAGS=$_lt_libdeps_save_CFLAGS 7083 + 7084 +# PORTME: override above test on systems where it is broken 7085 +m4_if([$1], [CXX], 7086 +[case $host_os in 7087 +interix[[3-9]]*) 7088 + # Interix 3.5 installs completely hosed .la files for C++, so rather than 7089 + # hack all around it, let's just trust "g++" to DTRT. 7090 + _LT_TAGVAR(predep_objects,$1)= 7091 + _LT_TAGVAR(postdep_objects,$1)= 7092 + _LT_TAGVAR(postdeps,$1)= 7093 + ;; 7094 + 7095 +linux*) 7096 + case `$CC -V 2>&1 | sed 5q` in 7097 + *Sun\ C*) 7098 + # Sun C++ 5.9 7099 + 7100 + # The more standards-conforming stlport4 library is 7101 + # incompatible with the Cstd library. Avoid specifying 7102 + # it if it's in CXXFLAGS. Ignore libCrun as 7103 + # -library=stlport4 depends on it. 7104 + case " $CXX $CXXFLAGS " in 7105 + *" -library=stlport4 "*) 7106 + solaris_use_stlport4=yes 7107 + ;; 7108 + esac 7109 + 7110 + if test "$solaris_use_stlport4" != yes; then 7111 + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' 7112 + fi 7113 + ;; 7114 + esac 7115 + ;; 7116 + 7117 +solaris*) 7118 + case $cc_basename in 7119 + CC* | sunCC*) 7120 + # The more standards-conforming stlport4 library is 7121 + # incompatible with the Cstd library. Avoid specifying 7122 + # it if it's in CXXFLAGS. Ignore libCrun as 7123 + # -library=stlport4 depends on it. 7124 + case " $CXX $CXXFLAGS " in 7125 + *" -library=stlport4 "*) 7126 + solaris_use_stlport4=yes 7127 + ;; 7128 + esac 7129 + 7130 + # Adding this requires a known-good setup of shared libraries for 7131 + # Sun compiler versions before 5.6, else PIC objects from an old 7132 + # archive will be linked into the output, leading to subtle bugs. 7133 + if test "$solaris_use_stlport4" != yes; then 7134 + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' 7135 + fi 7136 + ;; 7137 + esac 7138 + ;; 7139 +esac 7140 +]) 7141 + 7142 +case " $_LT_TAGVAR(postdeps, $1) " in 7143 +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; 7144 +esac 7145 + _LT_TAGVAR(compiler_lib_search_dirs, $1)= 7146 +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then 7147 + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` 7148 +fi 7149 +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], 7150 + [The directories searched by this compiler when creating a shared library]) 7151 +_LT_TAGDECL([], [predep_objects], [1], 7152 + [Dependencies to place before and after the objects being linked to 7153 + create a shared library]) 7154 +_LT_TAGDECL([], [postdep_objects], [1]) 7155 +_LT_TAGDECL([], [predeps], [1]) 7156 +_LT_TAGDECL([], [postdeps], [1]) 7157 +_LT_TAGDECL([], [compiler_lib_search_path], [1], 7158 + [The library search path used internally by the compiler when linking 7159 + a shared library]) 7160 +])# _LT_SYS_HIDDEN_LIBDEPS 7161 + 7162 + 7163 +# _LT_LANG_F77_CONFIG([TAG]) 7164 +# -------------------------- 7165 +# Ensure that the configuration variables for a Fortran 77 compiler are 7166 +# suitably defined. These variables are subsequently used by _LT_CONFIG 7167 +# to write the compiler configuration to `libtool'. 7168 +m4_defun([_LT_LANG_F77_CONFIG], 7169 +[AC_LANG_PUSH(Fortran 77) 7170 +if test -z "$F77" || test "X$F77" = "Xno"; then 7171 + _lt_disable_F77=yes 7172 +fi 7173 + 7174 +_LT_TAGVAR(archive_cmds_need_lc, $1)=no 7175 +_LT_TAGVAR(allow_undefined_flag, $1)= 7176 +_LT_TAGVAR(always_export_symbols, $1)=no 7177 +_LT_TAGVAR(archive_expsym_cmds, $1)= 7178 +_LT_TAGVAR(export_dynamic_flag_spec, $1)= 7179 +_LT_TAGVAR(hardcode_direct, $1)=no 7180 +_LT_TAGVAR(hardcode_direct_absolute, $1)=no 7181 +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= 7182 +_LT_TAGVAR(hardcode_libdir_separator, $1)= 7183 +_LT_TAGVAR(hardcode_minus_L, $1)=no 7184 +_LT_TAGVAR(hardcode_automatic, $1)=no 7185 +_LT_TAGVAR(inherit_rpath, $1)=no 7186 +_LT_TAGVAR(module_cmds, $1)= 7187 +_LT_TAGVAR(module_expsym_cmds, $1)= 7188 +_LT_TAGVAR(link_all_deplibs, $1)=unknown 7189 +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds 7190 +_LT_TAGVAR(reload_flag, $1)=$reload_flag 7191 +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds 7192 +_LT_TAGVAR(no_undefined_flag, $1)= 7193 +_LT_TAGVAR(whole_archive_flag_spec, $1)= 7194 +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no 7195 + 7196 +# Source file extension for f77 test sources. 7197 +ac_ext=f 7198 + 7199 +# Object file extension for compiled f77 test sources. 7200 +objext=o 7201 +_LT_TAGVAR(objext, $1)=$objext 7202 + 7203 +# No sense in running all these tests if we already determined that 7204 +# the F77 compiler isn't working. Some variables (like enable_shared) 7205 +# are currently assumed to apply to all compilers on this platform, 7206 +# and will be corrupted by setting them based on a non-working compiler. 7207 +if test "$_lt_disable_F77" != yes; then 7208 + # Code to be used in simple compile tests 7209 + lt_simple_compile_test_code="\ 7210 + subroutine t 7211 + return 7212 + end 7213 +" 7214 + 7215 + # Code to be used in simple link tests 7216 + lt_simple_link_test_code="\ 7217 + program t 7218 + end 7219 +" 7220 + 7221 + # ltmain only uses $CC for tagged configurations so make sure $CC is set. 7222 + _LT_TAG_COMPILER 7223 + 7224 + # save warnings/boilerplate of simple test code 7225 + _LT_COMPILER_BOILERPLATE 7226 + _LT_LINKER_BOILERPLATE 7227 + 7228 + # Allow CC to be a program name with arguments. 7229 + lt_save_CC="$CC" 7230 + lt_save_GCC=$GCC 7231 + lt_save_CFLAGS=$CFLAGS 7232 + CC=${F77-"f77"} 7233 + CFLAGS=$FFLAGS 7234 + compiler=$CC 7235 + _LT_TAGVAR(compiler, $1)=$CC 7236 + _LT_CC_BASENAME([$compiler]) 7237 + GCC=$G77 7238 + if test -n "$compiler"; then 7239 + AC_MSG_CHECKING([if libtool supports shared libraries]) 7240 + AC_MSG_RESULT([$can_build_shared]) 7241 + 7242 + AC_MSG_CHECKING([whether to build shared libraries]) 7243 + test "$can_build_shared" = "no" && enable_shared=no 7244 + 7245 + # On AIX, shared libraries and static libraries use the same namespace, and 7246 + # are all built from PIC. 7247 + case $host_os in 7248 + aix3*) 7249 + test "$enable_shared" = yes && enable_static=no 7250 + if test -n "$RANLIB"; then 7251 + archive_cmds="$archive_cmds~\$RANLIB \$lib" 7252 + postinstall_cmds='$RANLIB $lib' 7253 + fi 7254 + ;; 7255 + aix[[4-9]]*) 7256 + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then 7257 + test "$enable_shared" = yes && enable_static=no 7258 + fi 7259 + ;; 7260 + esac 7261 + AC_MSG_RESULT([$enable_shared]) 7262 + 7263 + AC_MSG_CHECKING([whether to build static libraries]) 7264 + # Make sure either enable_shared or enable_static is yes. 7265 + test "$enable_shared" = yes || enable_static=yes 7266 + AC_MSG_RESULT([$enable_static]) 7267 + 7268 + _LT_TAGVAR(GCC, $1)="$G77" 7269 + _LT_TAGVAR(LD, $1)="$LD" 7270 + 7271 + ## CAVEAT EMPTOR: 7272 + ## There is no encapsulation within the following macros, do not change 7273 + ## the running order or otherwise move them around unless you know exactly 7274 + ## what you are doing... 7275 + _LT_COMPILER_PIC($1) 7276 + _LT_COMPILER_C_O($1) 7277 + _LT_COMPILER_FILE_LOCKS($1) 7278 + _LT_LINKER_SHLIBS($1) 7279 + _LT_SYS_DYNAMIC_LINKER($1) 7280 + _LT_LINKER_HARDCODE_LIBPATH($1) 7281 + 7282 + _LT_CONFIG($1) 7283 + fi # test -n "$compiler" 7284 + 7285 + GCC=$lt_save_GCC 7286 + CC="$lt_save_CC" 7287 + CFLAGS="$lt_save_CFLAGS" 7288 +fi # test "$_lt_disable_F77" != yes 7289 + 7290 +AC_LANG_POP 7291 +])# _LT_LANG_F77_CONFIG 7292 + 7293 + 7294 +# _LT_LANG_FC_CONFIG([TAG]) 7295 +# ------------------------- 7296 +# Ensure that the configuration variables for a Fortran compiler are 7297 +# suitably defined. These variables are subsequently used by _LT_CONFIG 7298 +# to write the compiler configuration to `libtool'. 7299 +m4_defun([_LT_LANG_FC_CONFIG], 7300 +[AC_LANG_PUSH(Fortran) 7301 + 7302 +if test -z "$FC" || test "X$FC" = "Xno"; then 7303 + _lt_disable_FC=yes 7304 +fi 7305 + 7306 +_LT_TAGVAR(archive_cmds_need_lc, $1)=no 7307 +_LT_TAGVAR(allow_undefined_flag, $1)= 7308 +_LT_TAGVAR(always_export_symbols, $1)=no 7309 +_LT_TAGVAR(archive_expsym_cmds, $1)= 7310 +_LT_TAGVAR(export_dynamic_flag_spec, $1)= 7311 +_LT_TAGVAR(hardcode_direct, $1)=no 7312 +_LT_TAGVAR(hardcode_direct_absolute, $1)=no 7313 +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= 7314 +_LT_TAGVAR(hardcode_libdir_separator, $1)= 7315 +_LT_TAGVAR(hardcode_minus_L, $1)=no 7316 +_LT_TAGVAR(hardcode_automatic, $1)=no 7317 +_LT_TAGVAR(inherit_rpath, $1)=no 7318 +_LT_TAGVAR(module_cmds, $1)= 7319 +_LT_TAGVAR(module_expsym_cmds, $1)= 7320 +_LT_TAGVAR(link_all_deplibs, $1)=unknown 7321 +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds 7322 +_LT_TAGVAR(reload_flag, $1)=$reload_flag 7323 +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds 7324 +_LT_TAGVAR(no_undefined_flag, $1)= 7325 +_LT_TAGVAR(whole_archive_flag_spec, $1)= 7326 +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no 7327 + 7328 +# Source file extension for fc test sources. 7329 +ac_ext=${ac_fc_srcext-f} 7330 + 7331 +# Object file extension for compiled fc test sources. 7332 +objext=o 7333 +_LT_TAGVAR(objext, $1)=$objext 7334 + 7335 +# No sense in running all these tests if we already determined that 7336 +# the FC compiler isn't working. Some variables (like enable_shared) 7337 +# are currently assumed to apply to all compilers on this platform, 7338 +# and will be corrupted by setting them based on a non-working compiler. 7339 +if test "$_lt_disable_FC" != yes; then 7340 + # Code to be used in simple compile tests 7341 + lt_simple_compile_test_code="\ 7342 + subroutine t 7343 + return 7344 + end 7345 +" 7346 + 7347 + # Code to be used in simple link tests 7348 + lt_simple_link_test_code="\ 7349 + program t 7350 + end 7351 +" 7352 + 7353 + # ltmain only uses $CC for tagged configurations so make sure $CC is set. 7354 + _LT_TAG_COMPILER 7355 + 7356 + # save warnings/boilerplate of simple test code 7357 + _LT_COMPILER_BOILERPLATE 7358 + _LT_LINKER_BOILERPLATE 7359 + 7360 + # Allow CC to be a program name with arguments. 7361 + lt_save_CC="$CC" 7362 + lt_save_GCC=$GCC 7363 + lt_save_CFLAGS=$CFLAGS 7364 + CC=${FC-"f95"} 7365 + CFLAGS=$FCFLAGS 7366 + compiler=$CC 7367 + GCC=$ac_cv_fc_compiler_gnu 7368 + 7369 + _LT_TAGVAR(compiler, $1)=$CC 7370 + _LT_CC_BASENAME([$compiler]) 7371 + 7372 + if test -n "$compiler"; then 7373 + AC_MSG_CHECKING([if libtool supports shared libraries]) 7374 + AC_MSG_RESULT([$can_build_shared]) 7375 + 7376 + AC_MSG_CHECKING([whether to build shared libraries]) 7377 + test "$can_build_shared" = "no" && enable_shared=no 7378 + 7379 + # On AIX, shared libraries and static libraries use the same namespace, and 7380 + # are all built from PIC. 7381 + case $host_os in 7382 + aix3*) 7383 + test "$enable_shared" = yes && enable_static=no 7384 + if test -n "$RANLIB"; then 7385 + archive_cmds="$archive_cmds~\$RANLIB \$lib" 7386 + postinstall_cmds='$RANLIB $lib' 7387 + fi 7388 + ;; 7389 + aix[[4-9]]*) 7390 + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then 7391 + test "$enable_shared" = yes && enable_static=no 7392 + fi 7393 + ;; 7394 + esac 7395 + AC_MSG_RESULT([$enable_shared]) 7396 + 7397 + AC_MSG_CHECKING([whether to build static libraries]) 7398 + # Make sure either enable_shared or enable_static is yes. 7399 + test "$enable_shared" = yes || enable_static=yes 7400 + AC_MSG_RESULT([$enable_static]) 7401 + 7402 + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" 7403 + _LT_TAGVAR(LD, $1)="$LD" 7404 + 7405 + ## CAVEAT EMPTOR: 7406 + ## There is no encapsulation within the following macros, do not change 7407 + ## the running order or otherwise move them around unless you know exactly 7408 + ## what you are doing... 7409 + _LT_SYS_HIDDEN_LIBDEPS($1) 7410 + _LT_COMPILER_PIC($1) 7411 + _LT_COMPILER_C_O($1) 7412 + _LT_COMPILER_FILE_LOCKS($1) 7413 + _LT_LINKER_SHLIBS($1) 7414 + _LT_SYS_DYNAMIC_LINKER($1) 7415 + _LT_LINKER_HARDCODE_LIBPATH($1) 7416 + 7417 + _LT_CONFIG($1) 7418 + fi # test -n "$compiler" 7419 + 7420 + GCC=$lt_save_GCC 7421 + CC=$lt_save_CC 7422 + CFLAGS=$lt_save_CFLAGS 7423 +fi # test "$_lt_disable_FC" != yes 7424 + 7425 +AC_LANG_POP 7426 +])# _LT_LANG_FC_CONFIG 7427 + 7428 + 7429 +# _LT_LANG_GCJ_CONFIG([TAG]) 7430 +# -------------------------- 7431 +# Ensure that the configuration variables for the GNU Java Compiler compiler 7432 +# are suitably defined. These variables are subsequently used by _LT_CONFIG 7433 +# to write the compiler configuration to `libtool'. 7434 +m4_defun([_LT_LANG_GCJ_CONFIG], 7435 +[AC_REQUIRE([LT_PROG_GCJ])dnl 7436 +AC_LANG_SAVE 7437 + 7438 +# Source file extension for Java test sources. 7439 +ac_ext=java 7440 + 7441 +# Object file extension for compiled Java test sources. 7442 +objext=o 7443 +_LT_TAGVAR(objext, $1)=$objext 7444 + 7445 +# Code to be used in simple compile tests 7446 +lt_simple_compile_test_code="class foo {}" 7447 + 7448 +# Code to be used in simple link tests 7449 +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' 7450 + 7451 +# ltmain only uses $CC for tagged configurations so make sure $CC is set. 7452 +_LT_TAG_COMPILER 7453 + 7454 +# save warnings/boilerplate of simple test code 7455 +_LT_COMPILER_BOILERPLATE 7456 +_LT_LINKER_BOILERPLATE 7457 + 7458 +# Allow CC to be a program name with arguments. 7459 +lt_save_CC=$CC 7460 +lt_save_CFLAGS=$CFLAGS 7461 +lt_save_GCC=$GCC 7462 +GCC=yes 7463 +CC=${GCJ-"gcj"} 7464 +CFLAGS=$GCJFLAGS 7465 +compiler=$CC 7466 +_LT_TAGVAR(compiler, $1)=$CC 7467 +_LT_TAGVAR(LD, $1)="$LD" 7468 +_LT_CC_BASENAME([$compiler]) 7469 + 7470 +# GCJ did not exist at the time GCC didn't implicitly link libc in. 7471 +_LT_TAGVAR(archive_cmds_need_lc, $1)=no 7472 + 7473 +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds 7474 +_LT_TAGVAR(reload_flag, $1)=$reload_flag 7475 +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds 7476 + 7477 +## CAVEAT EMPTOR: 7478 +## There is no encapsulation within the following macros, do not change 7479 +## the running order or otherwise move them around unless you know exactly 7480 +## what you are doing... 7481 +if test -n "$compiler"; then 7482 + _LT_COMPILER_NO_RTTI($1) 7483 + _LT_COMPILER_PIC($1) 7484 + _LT_COMPILER_C_O($1) 7485 + _LT_COMPILER_FILE_LOCKS($1) 7486 + _LT_LINKER_SHLIBS($1) 7487 + _LT_LINKER_HARDCODE_LIBPATH($1) 7488 + 7489 + _LT_CONFIG($1) 7490 +fi 7491 + 7492 +AC_LANG_RESTORE 7493 + 7494 +GCC=$lt_save_GCC 7495 +CC=$lt_save_CC 7496 +CFLAGS=$lt_save_CFLAGS 7497 +])# _LT_LANG_GCJ_CONFIG 7498 + 7499 + 7500 +# _LT_LANG_GO_CONFIG([TAG]) 7501 +# -------------------------- 7502 +# Ensure that the configuration variables for the GNU Go compiler 7503 +# are suitably defined. These variables are subsequently used by _LT_CONFIG 7504 +# to write the compiler configuration to `libtool'. 7505 +m4_defun([_LT_LANG_GO_CONFIG], 7506 +[AC_REQUIRE([LT_PROG_GO])dnl 7507 +AC_LANG_SAVE 7508 + 7509 +# Source file extension for Go test sources. 7510 +ac_ext=go 7511 + 7512 +# Object file extension for compiled Go test sources. 7513 +objext=o 7514 +_LT_TAGVAR(objext, $1)=$objext 7515 + 7516 +# Code to be used in simple compile tests 7517 +lt_simple_compile_test_code="package main; func main() { }" 7518 + 7519 +# Code to be used in simple link tests 7520 +lt_simple_link_test_code='package main; func main() { }' 7521 + 7522 +# ltmain only uses $CC for tagged configurations so make sure $CC is set. 7523 +_LT_TAG_COMPILER 7524 + 7525 +# save warnings/boilerplate of simple test code 7526 +_LT_COMPILER_BOILERPLATE 7527 +_LT_LINKER_BOILERPLATE 7528 + 7529 +# Allow CC to be a program name with arguments. 7530 +lt_save_CC=$CC 7531 +lt_save_CFLAGS=$CFLAGS 7532 +lt_save_GCC=$GCC 7533 +GCC=yes 7534 +CC=${GOC-"gccgo"} 7535 +CFLAGS=$GOFLAGS 7536 +compiler=$CC 7537 +_LT_TAGVAR(compiler, $1)=$CC 7538 +_LT_TAGVAR(LD, $1)="$LD" 7539 +_LT_CC_BASENAME([$compiler]) 7540 + 7541 +# Go did not exist at the time GCC didn't implicitly link libc in. 7542 +_LT_TAGVAR(archive_cmds_need_lc, $1)=no 7543 + 7544 +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds 7545 +_LT_TAGVAR(reload_flag, $1)=$reload_flag 7546 +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds 7547 + 7548 +## CAVEAT EMPTOR: 7549 +## There is no encapsulation within the following macros, do not change 7550 +## the running order or otherwise move them around unless you know exactly 7551 +## what you are doing... 7552 +if test -n "$compiler"; then 7553 + _LT_COMPILER_NO_RTTI($1) 7554 + _LT_COMPILER_PIC($1) 7555 + _LT_COMPILER_C_O($1) 7556 + _LT_COMPILER_FILE_LOCKS($1) 7557 + _LT_LINKER_SHLIBS($1) 7558 + _LT_LINKER_HARDCODE_LIBPATH($1) 7559 + 7560 + _LT_CONFIG($1) 7561 +fi 7562 + 7563 +AC_LANG_RESTORE 7564 + 7565 +GCC=$lt_save_GCC 7566 +CC=$lt_save_CC 7567 +CFLAGS=$lt_save_CFLAGS 7568 +])# _LT_LANG_GO_CONFIG 7569 + 7570 + 7571 +# _LT_LANG_RC_CONFIG([TAG]) 7572 +# ------------------------- 7573 +# Ensure that the configuration variables for the Windows resource compiler 7574 +# are suitably defined. These variables are subsequently used by _LT_CONFIG 7575 +# to write the compiler configuration to `libtool'. 7576 +m4_defun([_LT_LANG_RC_CONFIG], 7577 +[AC_REQUIRE([LT_PROG_RC])dnl 7578 +AC_LANG_SAVE 7579 + 7580 +# Source file extension for RC test sources. 7581 +ac_ext=rc 7582 + 7583 +# Object file extension for compiled RC test sources. 7584 +objext=o 7585 +_LT_TAGVAR(objext, $1)=$objext 7586 + 7587 +# Code to be used in simple compile tests 7588 +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' 7589 + 7590 +# Code to be used in simple link tests 7591 +lt_simple_link_test_code="$lt_simple_compile_test_code" 7592 + 7593 +# ltmain only uses $CC for tagged configurations so make sure $CC is set. 7594 +_LT_TAG_COMPILER 7595 + 7596 +# save warnings/boilerplate of simple test code 7597 +_LT_COMPILER_BOILERPLATE 7598 +_LT_LINKER_BOILERPLATE 7599 + 7600 +# Allow CC to be a program name with arguments. 7601 +lt_save_CC="$CC" 7602 +lt_save_CFLAGS=$CFLAGS 7603 +lt_save_GCC=$GCC 7604 +GCC= 7605 +CC=${RC-"windres"} 7606 +CFLAGS= 7607 +compiler=$CC 7608 +_LT_TAGVAR(compiler, $1)=$CC 7609 +_LT_CC_BASENAME([$compiler]) 7610 +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes 7611 + 7612 +if test -n "$compiler"; then 7613 + : 7614 + _LT_CONFIG($1) 7615 +fi 7616 + 7617 +GCC=$lt_save_GCC 7618 +AC_LANG_RESTORE 7619 +CC=$lt_save_CC 7620 +CFLAGS=$lt_save_CFLAGS 7621 +])# _LT_LANG_RC_CONFIG 7622 + 7623 + 7624 +# LT_PROG_GCJ 7625 +# ----------- 7626 +AC_DEFUN([LT_PROG_GCJ], 7627 +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], 7628 + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], 7629 + [AC_CHECK_TOOL(GCJ, gcj,) 7630 + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" 7631 + AC_SUBST(GCJFLAGS)])])[]dnl 7632 +]) 7633 + 7634 +# Old name: 7635 +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) 7636 +dnl aclocal-1.4 backwards compatibility: 7637 +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) 7638 + 7639 + 7640 +# LT_PROG_GO 7641 +# ---------- 7642 +AC_DEFUN([LT_PROG_GO], 7643 +[AC_CHECK_TOOL(GOC, gccgo,) 7644 +]) 7645 + 7646 + 7647 +# LT_PROG_RC 7648 +# ---------- 7649 +AC_DEFUN([LT_PROG_RC], 7650 +[AC_CHECK_TOOL(RC, windres,) 7651 +]) 7652 + 7653 +# Old name: 7654 +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) 7655 +dnl aclocal-1.4 backwards compatibility: 7656 +dnl AC_DEFUN([LT_AC_PROG_RC], []) 7657 + 7658 + 7659 +# _LT_DECL_EGREP 7660 +# -------------- 7661 +# If we don't have a new enough Autoconf to choose the best grep 7662 +# available, choose the one first in the user's PATH. 7663 +m4_defun([_LT_DECL_EGREP], 7664 +[AC_REQUIRE([AC_PROG_EGREP])dnl 7665 +AC_REQUIRE([AC_PROG_FGREP])dnl 7666 +test -z "$GREP" && GREP=grep 7667 +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) 7668 +_LT_DECL([], [EGREP], [1], [An ERE matcher]) 7669 +_LT_DECL([], [FGREP], [1], [A literal string matcher]) 7670 +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too 7671 +AC_SUBST([GREP]) 7672 +]) 7673 + 7674 + 7675 +# _LT_DECL_OBJDUMP 7676 +# -------------- 7677 +# If we don't have a new enough Autoconf to choose the best objdump 7678 +# available, choose the one first in the user's PATH. 7679 +m4_defun([_LT_DECL_OBJDUMP], 7680 +[AC_CHECK_TOOL(OBJDUMP, objdump, false) 7681 +test -z "$OBJDUMP" && OBJDUMP=objdump 7682 +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) 7683 +AC_SUBST([OBJDUMP]) 7684 +]) 7685 + 7686 +# _LT_DECL_DLLTOOL 7687 +# ---------------- 7688 +# Ensure DLLTOOL variable is set. 7689 +m4_defun([_LT_DECL_DLLTOOL], 7690 +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) 7691 +test -z "$DLLTOOL" && DLLTOOL=dlltool 7692 +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) 7693 +AC_SUBST([DLLTOOL]) 7694 +]) 7695 + 7696 +# _LT_DECL_SED 7697 +# ------------ 7698 +# Check for a fully-functional sed program, that truncates 7699 +# as few characters as possible. Prefer GNU sed if found. 7700 +m4_defun([_LT_DECL_SED], 7701 +[AC_PROG_SED 7702 +test -z "$SED" && SED=sed 7703 +Xsed="$SED -e 1s/^X//" 7704 +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) 7705 +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], 7706 + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) 7707 +])# _LT_DECL_SED 7708 + 7709 +m4_ifndef([AC_PROG_SED], [ 7710 +############################################################ 7711 +# NOTE: This macro has been submitted for inclusion into # 7712 +# GNU Autoconf as AC_PROG_SED. When it is available in # 7713 +# a released version of Autoconf we should remove this # 7714 +# macro and use it instead. # 7715 +############################################################ 7716 + 7717 +m4_defun([AC_PROG_SED], 7718 +[AC_MSG_CHECKING([for a sed that does not truncate output]) 7719 +AC_CACHE_VAL(lt_cv_path_SED, 7720 +[# Loop through the user's path and test for sed and gsed. 7721 +# Then use that list of sed's as ones to test for truncation. 7722 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR 7723 +for as_dir in $PATH 7724 +do 7725 + IFS=$as_save_IFS 7726 + test -z "$as_dir" && as_dir=. 7727 + for lt_ac_prog in sed gsed; do 7728 + for ac_exec_ext in '' $ac_executable_extensions; do 7729 + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then 7730 + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" 7731 + fi 7732 + done 7733 + done 7734 +done 7735 +IFS=$as_save_IFS 7736 +lt_ac_max=0 7737 +lt_ac_count=0 7738 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris 7739 +# along with /bin/sed that truncates output. 7740 +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do 7741 + test ! -f $lt_ac_sed && continue 7742 + cat /dev/null > conftest.in 7743 + lt_ac_count=0 7744 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in 7745 + # Check for GNU sed and select it if it is found. 7746 + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then 7747 + lt_cv_path_SED=$lt_ac_sed 7748 + break 7749 + fi 7750 + while true; do 7751 + cat conftest.in conftest.in >conftest.tmp 7752 + mv conftest.tmp conftest.in 7753 + cp conftest.in conftest.nl 7754 + echo >>conftest.nl 7755 + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break 7756 + cmp -s conftest.out conftest.nl || break 7757 + # 10000 chars as input seems more than enough 7758 + test $lt_ac_count -gt 10 && break 7759 + lt_ac_count=`expr $lt_ac_count + 1` 7760 + if test $lt_ac_count -gt $lt_ac_max; then 7761 + lt_ac_max=$lt_ac_count 7762 + lt_cv_path_SED=$lt_ac_sed 7763 + fi 7764 + done 7765 +done 7766 +]) 7767 +SED=$lt_cv_path_SED 7768 +AC_SUBST([SED]) 7769 +AC_MSG_RESULT([$SED]) 7770 +])#AC_PROG_SED 7771 +])#m4_ifndef 7772 + 7773 +# Old name: 7774 +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) 7775 +dnl aclocal-1.4 backwards compatibility: 7776 +dnl AC_DEFUN([LT_AC_PROG_SED], []) 7777 + 7778 + 7779 +# _LT_CHECK_SHELL_FEATURES 7780 +# ------------------------ 7781 +# Find out whether the shell is Bourne or XSI compatible, 7782 +# or has some other useful features. 7783 +m4_defun([_LT_CHECK_SHELL_FEATURES], 7784 +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) 7785 +# Try some XSI features 7786 +xsi_shell=no 7787 +( _lt_dummy="a/b/c" 7788 + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ 7789 + = c,a/b,b/c, \ 7790 + && eval 'test $(( 1 + 1 )) -eq 2 \ 7791 + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ 7792 + && xsi_shell=yes 7793 +AC_MSG_RESULT([$xsi_shell]) 7794 +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) 7795 + 7796 +AC_MSG_CHECKING([whether the shell understands "+="]) 7797 +lt_shell_append=no 7798 +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ 7799 + >/dev/null 2>&1 \ 7800 + && lt_shell_append=yes 7801 +AC_MSG_RESULT([$lt_shell_append]) 7802 +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) 7803 + 7804 +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then 7805 + lt_unset=unset 7806 +else 7807 + lt_unset=false 7808 +fi 7809 +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl 7810 + 7811 +# test EBCDIC or ASCII 7812 +case `echo X|tr X '\101'` in 7813 + A) # ASCII based system 7814 + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr 7815 + lt_SP2NL='tr \040 \012' 7816 + lt_NL2SP='tr \015\012 \040\040' 7817 + ;; 7818 + *) # EBCDIC based system 7819 + lt_SP2NL='tr \100 \n' 7820 + lt_NL2SP='tr \r\n \100\100' 7821 + ;; 7822 +esac 7823 +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl 7824 +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl 7825 +])# _LT_CHECK_SHELL_FEATURES 7826 + 7827 + 7828 +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) 7829 +# ------------------------------------------------------ 7830 +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and 7831 +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. 7832 +m4_defun([_LT_PROG_FUNCTION_REPLACE], 7833 +[dnl { 7834 +sed -e '/^$1 ()$/,/^} # $1 /c\ 7835 +$1 ()\ 7836 +{\ 7837 +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) 7838 +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ 7839 + && mv -f "$cfgfile.tmp" "$cfgfile" \ 7840 + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") 7841 +test 0 -eq $? || _lt_function_replace_fail=: 7842 +]) 7843 + 7844 + 7845 +# _LT_PROG_REPLACE_SHELLFNS 7846 +# ------------------------- 7847 +# Replace existing portable implementations of several shell functions with 7848 +# equivalent extended shell implementations where those features are available.. 7849 +m4_defun([_LT_PROG_REPLACE_SHELLFNS], 7850 +[if test x"$xsi_shell" = xyes; then 7851 + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl 7852 + case ${1} in 7853 + */*) func_dirname_result="${1%/*}${2}" ;; 7854 + * ) func_dirname_result="${3}" ;; 7855 + esac]) 7856 + 7857 + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl 7858 + func_basename_result="${1##*/}"]) 7859 + 7860 + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl 7861 + case ${1} in 7862 + */*) func_dirname_result="${1%/*}${2}" ;; 7863 + * ) func_dirname_result="${3}" ;; 7864 + esac 7865 + func_basename_result="${1##*/}"]) 7866 + 7867 + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl 7868 + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are 7869 + # positional parameters, so assign one to ordinary parameter first. 7870 + func_stripname_result=${3} 7871 + func_stripname_result=${func_stripname_result#"${1}"} 7872 + func_stripname_result=${func_stripname_result%"${2}"}]) 7873 + 7874 + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl 7875 + func_split_long_opt_name=${1%%=*} 7876 + func_split_long_opt_arg=${1#*=}]) 7877 + 7878 + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl 7879 + func_split_short_opt_arg=${1#??} 7880 + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) 7881 + 7882 + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl 7883 + case ${1} in 7884 + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; 7885 + *) func_lo2o_result=${1} ;; 7886 + esac]) 7887 + 7888 + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) 7889 + 7890 + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) 7891 + 7892 + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) 7893 +fi 7894 + 7895 +if test x"$lt_shell_append" = xyes; then 7896 + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) 7897 + 7898 + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl 7899 + func_quote_for_eval "${2}" 7900 +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ 7901 + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) 7902 + 7903 + # Save a `func_append' function call where possible by direct use of '+=' 7904 + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ 7905 + && mv -f "$cfgfile.tmp" "$cfgfile" \ 7906 + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") 7907 + test 0 -eq $? || _lt_function_replace_fail=: 7908 +else 7909 + # Save a `func_append' function call even when '+=' is not available 7910 + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ 7911 + && mv -f "$cfgfile.tmp" "$cfgfile" \ 7912 + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") 7913 + test 0 -eq $? || _lt_function_replace_fail=: 7914 +fi 7915 + 7916 +if test x"$_lt_function_replace_fail" = x":"; then 7917 + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) 7918 +fi 7919 +]) 7920 + 7921 +# _LT_PATH_CONVERSION_FUNCTIONS 7922 +# ----------------------------- 7923 +# Determine which file name conversion functions should be used by 7924 +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed 7925 +# for certain cross-compile configurations and native mingw. 7926 +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], 7927 +[AC_REQUIRE([AC_CANONICAL_HOST])dnl 7928 +AC_REQUIRE([AC_CANONICAL_BUILD])dnl 7929 +AC_MSG_CHECKING([how to convert $build file names to $host format]) 7930 +AC_CACHE_VAL(lt_cv_to_host_file_cmd, 7931 +[case $host in 7932 + *-*-mingw* ) 7933 + case $build in 7934 + *-*-mingw* ) # actually msys 7935 + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 7936 + ;; 7937 + *-*-cygwin* ) 7938 + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 7939 + ;; 7940 + * ) # otherwise, assume *nix 7941 + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 7942 + ;; 7943 + esac 7944 + ;; 7945 + *-*-cygwin* ) 7946 + case $build in 7947 + *-*-mingw* ) # actually msys 7948 + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin 7949 + ;; 7950 + *-*-cygwin* ) 7951 + lt_cv_to_host_file_cmd=func_convert_file_noop 7952 + ;; 7953 + * ) # otherwise, assume *nix 7954 + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin 7955 + ;; 7956 + esac 7957 + ;; 7958 + * ) # unhandled hosts (and "normal" native builds) 7959 + lt_cv_to_host_file_cmd=func_convert_file_noop 7960 + ;; 7961 +esac 7962 +]) 7963 +to_host_file_cmd=$lt_cv_to_host_file_cmd 7964 +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) 7965 +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], 7966 + [0], [convert $build file names to $host format])dnl 7967 + 7968 +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) 7969 +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, 7970 +[#assume ordinary cross tools, or native build. 7971 +lt_cv_to_tool_file_cmd=func_convert_file_noop 7972 +case $host in 7973 + *-*-mingw* ) 7974 + case $build in 7975 + *-*-mingw* ) # actually msys 7976 + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 7977 + ;; 7978 + esac 7979 + ;; 7980 +esac 7981 +]) 7982 +to_tool_file_cmd=$lt_cv_to_tool_file_cmd 7983 +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) 7984 +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], 7985 + [0], [convert $build files to toolchain format])dnl 7986 +])# _LT_PATH_CONVERSION_FUNCTIONS
Added m4/ltoptions.m4.
1 +# Helper functions for option handling. -*- Autoconf -*- 2 +# 3 +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, 4 +# Inc. 5 +# Written by Gary V. Vaughan, 2004 6 +# 7 +# This file is free software; the Free Software Foundation gives 8 +# unlimited permission to copy and/or distribute it, with or without 9 +# modifications, as long as this notice is preserved. 10 + 11 +# serial 7 ltoptions.m4 12 + 13 +# This is to help aclocal find these macros, as it can't see m4_define. 14 +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) 15 + 16 + 17 +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) 18 +# ------------------------------------------ 19 +m4_define([_LT_MANGLE_OPTION], 20 +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) 21 + 22 + 23 +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) 24 +# --------------------------------------- 25 +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a 26 +# matching handler defined, dispatch to it. Other OPTION-NAMEs are 27 +# saved as a flag. 28 +m4_define([_LT_SET_OPTION], 29 +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl 30 +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), 31 + _LT_MANGLE_DEFUN([$1], [$2]), 32 + [m4_warning([Unknown $1 option `$2'])])[]dnl 33 +]) 34 + 35 + 36 +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) 37 +# ------------------------------------------------------------ 38 +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. 39 +m4_define([_LT_IF_OPTION], 40 +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) 41 + 42 + 43 +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) 44 +# ------------------------------------------------------- 45 +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME 46 +# are set. 47 +m4_define([_LT_UNLESS_OPTIONS], 48 +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), 49 + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), 50 + [m4_define([$0_found])])])[]dnl 51 +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 52 +])[]dnl 53 +]) 54 + 55 + 56 +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) 57 +# ---------------------------------------- 58 +# OPTION-LIST is a space-separated list of Libtool options associated 59 +# with MACRO-NAME. If any OPTION has a matching handler declared with 60 +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about 61 +# the unknown option and exit. 62 +m4_defun([_LT_SET_OPTIONS], 63 +[# Set options 64 +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), 65 + [_LT_SET_OPTION([$1], _LT_Option)]) 66 + 67 +m4_if([$1],[LT_INIT],[ 68 + dnl 69 + dnl Simply set some default values (i.e off) if boolean options were not 70 + dnl specified: 71 + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no 72 + ]) 73 + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no 74 + ]) 75 + dnl 76 + dnl If no reference was made to various pairs of opposing options, then 77 + dnl we run the default mode handler for the pair. For example, if neither 78 + dnl `shared' nor `disable-shared' was passed, we enable building of shared 79 + dnl archives by default: 80 + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) 81 + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) 82 + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) 83 + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], 84 + [_LT_ENABLE_FAST_INSTALL]) 85 + ]) 86 +])# _LT_SET_OPTIONS 87 + 88 + 89 +## --------------------------------- ## 90 +## Macros to handle LT_INIT options. ## 91 +## --------------------------------- ## 92 + 93 +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) 94 +# ----------------------------------------- 95 +m4_define([_LT_MANGLE_DEFUN], 96 +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) 97 + 98 + 99 +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) 100 +# ----------------------------------------------- 101 +m4_define([LT_OPTION_DEFINE], 102 +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl 103 +])# LT_OPTION_DEFINE 104 + 105 + 106 +# dlopen 107 +# ------ 108 +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes 109 +]) 110 + 111 +AU_DEFUN([AC_LIBTOOL_DLOPEN], 112 +[_LT_SET_OPTION([LT_INIT], [dlopen]) 113 +AC_DIAGNOSE([obsolete], 114 +[$0: Remove this warning and the call to _LT_SET_OPTION when you 115 +put the `dlopen' option into LT_INIT's first parameter.]) 116 +]) 117 + 118 +dnl aclocal-1.4 backwards compatibility: 119 +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) 120 + 121 + 122 +# win32-dll 123 +# --------- 124 +# Declare package support for building win32 dll's. 125 +LT_OPTION_DEFINE([LT_INIT], [win32-dll], 126 +[enable_win32_dll=yes 127 + 128 +case $host in 129 +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) 130 + AC_CHECK_TOOL(AS, as, false) 131 + AC_CHECK_TOOL(DLLTOOL, dlltool, false) 132 + AC_CHECK_TOOL(OBJDUMP, objdump, false) 133 + ;; 134 +esac 135 + 136 +test -z "$AS" && AS=as 137 +_LT_DECL([], [AS], [1], [Assembler program])dnl 138 + 139 +test -z "$DLLTOOL" && DLLTOOL=dlltool 140 +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl 141 + 142 +test -z "$OBJDUMP" && OBJDUMP=objdump 143 +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl 144 +])# win32-dll 145 + 146 +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], 147 +[AC_REQUIRE([AC_CANONICAL_HOST])dnl 148 +_LT_SET_OPTION([LT_INIT], [win32-dll]) 149 +AC_DIAGNOSE([obsolete], 150 +[$0: Remove this warning and the call to _LT_SET_OPTION when you 151 +put the `win32-dll' option into LT_INIT's first parameter.]) 152 +]) 153 + 154 +dnl aclocal-1.4 backwards compatibility: 155 +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) 156 + 157 + 158 +# _LT_ENABLE_SHARED([DEFAULT]) 159 +# ---------------------------- 160 +# implement the --enable-shared flag, and supports the `shared' and 161 +# `disable-shared' LT_INIT options. 162 +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. 163 +m4_define([_LT_ENABLE_SHARED], 164 +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl 165 +AC_ARG_ENABLE([shared], 166 + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], 167 + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], 168 + [p=${PACKAGE-default} 169 + case $enableval in 170 + yes) enable_shared=yes ;; 171 + no) enable_shared=no ;; 172 + *) 173 + enable_shared=no 174 + # Look at the argument we got. We use all the common list separators. 175 + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," 176 + for pkg in $enableval; do 177 + IFS="$lt_save_ifs" 178 + if test "X$pkg" = "X$p"; then 179 + enable_shared=yes 180 + fi 181 + done 182 + IFS="$lt_save_ifs" 183 + ;; 184 + esac], 185 + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) 186 + 187 + _LT_DECL([build_libtool_libs], [enable_shared], [0], 188 + [Whether or not to build shared libraries]) 189 +])# _LT_ENABLE_SHARED 190 + 191 +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) 192 +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) 193 + 194 +# Old names: 195 +AC_DEFUN([AC_ENABLE_SHARED], 196 +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) 197 +]) 198 + 199 +AC_DEFUN([AC_DISABLE_SHARED], 200 +[_LT_SET_OPTION([LT_INIT], [disable-shared]) 201 +]) 202 + 203 +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) 204 +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) 205 + 206 +dnl aclocal-1.4 backwards compatibility: 207 +dnl AC_DEFUN([AM_ENABLE_SHARED], []) 208 +dnl AC_DEFUN([AM_DISABLE_SHARED], []) 209 + 210 + 211 + 212 +# _LT_ENABLE_STATIC([DEFAULT]) 213 +# ---------------------------- 214 +# implement the --enable-static flag, and support the `static' and 215 +# `disable-static' LT_INIT options. 216 +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. 217 +m4_define([_LT_ENABLE_STATIC], 218 +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl 219 +AC_ARG_ENABLE([static], 220 + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], 221 + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], 222 + [p=${PACKAGE-default} 223 + case $enableval in 224 + yes) enable_static=yes ;; 225 + no) enable_static=no ;; 226 + *) 227 + enable_static=no 228 + # Look at the argument we got. We use all the common list separators. 229 + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," 230 + for pkg in $enableval; do 231 + IFS="$lt_save_ifs" 232 + if test "X$pkg" = "X$p"; then 233 + enable_static=yes 234 + fi 235 + done 236 + IFS="$lt_save_ifs" 237 + ;; 238 + esac], 239 + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) 240 + 241 + _LT_DECL([build_old_libs], [enable_static], [0], 242 + [Whether or not to build static libraries]) 243 +])# _LT_ENABLE_STATIC 244 + 245 +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) 246 +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) 247 + 248 +# Old names: 249 +AC_DEFUN([AC_ENABLE_STATIC], 250 +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) 251 +]) 252 + 253 +AC_DEFUN([AC_DISABLE_STATIC], 254 +[_LT_SET_OPTION([LT_INIT], [disable-static]) 255 +]) 256 + 257 +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) 258 +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) 259 + 260 +dnl aclocal-1.4 backwards compatibility: 261 +dnl AC_DEFUN([AM_ENABLE_STATIC], []) 262 +dnl AC_DEFUN([AM_DISABLE_STATIC], []) 263 + 264 + 265 + 266 +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) 267 +# ---------------------------------- 268 +# implement the --enable-fast-install flag, and support the `fast-install' 269 +# and `disable-fast-install' LT_INIT options. 270 +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. 271 +m4_define([_LT_ENABLE_FAST_INSTALL], 272 +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl 273 +AC_ARG_ENABLE([fast-install], 274 + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], 275 + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], 276 + [p=${PACKAGE-default} 277 + case $enableval in 278 + yes) enable_fast_install=yes ;; 279 + no) enable_fast_install=no ;; 280 + *) 281 + enable_fast_install=no 282 + # Look at the argument we got. We use all the common list separators. 283 + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," 284 + for pkg in $enableval; do 285 + IFS="$lt_save_ifs" 286 + if test "X$pkg" = "X$p"; then 287 + enable_fast_install=yes 288 + fi 289 + done 290 + IFS="$lt_save_ifs" 291 + ;; 292 + esac], 293 + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) 294 + 295 +_LT_DECL([fast_install], [enable_fast_install], [0], 296 + [Whether or not to optimize for fast installation])dnl 297 +])# _LT_ENABLE_FAST_INSTALL 298 + 299 +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) 300 +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) 301 + 302 +# Old names: 303 +AU_DEFUN([AC_ENABLE_FAST_INSTALL], 304 +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) 305 +AC_DIAGNOSE([obsolete], 306 +[$0: Remove this warning and the call to _LT_SET_OPTION when you put 307 +the `fast-install' option into LT_INIT's first parameter.]) 308 +]) 309 + 310 +AU_DEFUN([AC_DISABLE_FAST_INSTALL], 311 +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) 312 +AC_DIAGNOSE([obsolete], 313 +[$0: Remove this warning and the call to _LT_SET_OPTION when you put 314 +the `disable-fast-install' option into LT_INIT's first parameter.]) 315 +]) 316 + 317 +dnl aclocal-1.4 backwards compatibility: 318 +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) 319 +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) 320 + 321 + 322 +# _LT_WITH_PIC([MODE]) 323 +# -------------------- 324 +# implement the --with-pic flag, and support the `pic-only' and `no-pic' 325 +# LT_INIT options. 326 +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. 327 +m4_define([_LT_WITH_PIC], 328 +[AC_ARG_WITH([pic], 329 + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], 330 + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], 331 + [lt_p=${PACKAGE-default} 332 + case $withval in 333 + yes|no) pic_mode=$withval ;; 334 + *) 335 + pic_mode=default 336 + # Look at the argument we got. We use all the common list separators. 337 + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," 338 + for lt_pkg in $withval; do 339 + IFS="$lt_save_ifs" 340 + if test "X$lt_pkg" = "X$lt_p"; then 341 + pic_mode=yes 342 + fi 343 + done 344 + IFS="$lt_save_ifs" 345 + ;; 346 + esac], 347 + [pic_mode=default]) 348 + 349 +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) 350 + 351 +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl 352 +])# _LT_WITH_PIC 353 + 354 +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) 355 +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) 356 + 357 +# Old name: 358 +AU_DEFUN([AC_LIBTOOL_PICMODE], 359 +[_LT_SET_OPTION([LT_INIT], [pic-only]) 360 +AC_DIAGNOSE([obsolete], 361 +[$0: Remove this warning and the call to _LT_SET_OPTION when you 362 +put the `pic-only' option into LT_INIT's first parameter.]) 363 +]) 364 + 365 +dnl aclocal-1.4 backwards compatibility: 366 +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) 367 + 368 +## ----------------- ## 369 +## LTDL_INIT Options ## 370 +## ----------------- ## 371 + 372 +m4_define([_LTDL_MODE], []) 373 +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], 374 + [m4_define([_LTDL_MODE], [nonrecursive])]) 375 +LT_OPTION_DEFINE([LTDL_INIT], [recursive], 376 + [m4_define([_LTDL_MODE], [recursive])]) 377 +LT_OPTION_DEFINE([LTDL_INIT], [subproject], 378 + [m4_define([_LTDL_MODE], [subproject])]) 379 + 380 +m4_define([_LTDL_TYPE], []) 381 +LT_OPTION_DEFINE([LTDL_INIT], [installable], 382 + [m4_define([_LTDL_TYPE], [installable])]) 383 +LT_OPTION_DEFINE([LTDL_INIT], [convenience], 384 + [m4_define([_LTDL_TYPE], [convenience])])
Added m4/ltsugar.m4.
1 +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- 2 +# 3 +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. 4 +# Written by Gary V. Vaughan, 2004 5 +# 6 +# This file is free software; the Free Software Foundation gives 7 +# unlimited permission to copy and/or distribute it, with or without 8 +# modifications, as long as this notice is preserved. 9 + 10 +# serial 6 ltsugar.m4 11 + 12 +# This is to help aclocal find these macros, as it can't see m4_define. 13 +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) 14 + 15 + 16 +# lt_join(SEP, ARG1, [ARG2...]) 17 +# ----------------------------- 18 +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their 19 +# associated separator. 20 +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier 21 +# versions in m4sugar had bugs. 22 +m4_define([lt_join], 23 +[m4_if([$#], [1], [], 24 + [$#], [2], [[$2]], 25 + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) 26 +m4_define([_lt_join], 27 +[m4_if([$#$2], [2], [], 28 + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) 29 + 30 + 31 +# lt_car(LIST) 32 +# lt_cdr(LIST) 33 +# ------------ 34 +# Manipulate m4 lists. 35 +# These macros are necessary as long as will still need to support 36 +# Autoconf-2.59 which quotes differently. 37 +m4_define([lt_car], [[$1]]) 38 +m4_define([lt_cdr], 39 +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], 40 + [$#], 1, [], 41 + [m4_dquote(m4_shift($@))])]) 42 +m4_define([lt_unquote], $1) 43 + 44 + 45 +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) 46 +# ------------------------------------------ 47 +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. 48 +# Note that neither SEPARATOR nor STRING are expanded; they are appended 49 +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). 50 +# No SEPARATOR is output if MACRO-NAME was previously undefined (different 51 +# than defined and empty). 52 +# 53 +# This macro is needed until we can rely on Autoconf 2.62, since earlier 54 +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. 55 +m4_define([lt_append], 56 +[m4_define([$1], 57 + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) 58 + 59 + 60 + 61 +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) 62 +# ---------------------------------------------------------- 63 +# Produce a SEP delimited list of all paired combinations of elements of 64 +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list 65 +# has the form PREFIXmINFIXSUFFIXn. 66 +# Needed until we can rely on m4_combine added in Autoconf 2.62. 67 +m4_define([lt_combine], 68 +[m4_if(m4_eval([$# > 3]), [1], 69 + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl 70 +[[m4_foreach([_Lt_prefix], [$2], 71 + [m4_foreach([_Lt_suffix], 72 + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, 73 + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) 74 + 75 + 76 +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) 77 +# ----------------------------------------------------------------------- 78 +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited 79 +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. 80 +m4_define([lt_if_append_uniq], 81 +[m4_ifdef([$1], 82 + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], 83 + [lt_append([$1], [$2], [$3])$4], 84 + [$5])], 85 + [lt_append([$1], [$2], [$3])$4])]) 86 + 87 + 88 +# lt_dict_add(DICT, KEY, VALUE) 89 +# ----------------------------- 90 +m4_define([lt_dict_add], 91 +[m4_define([$1($2)], [$3])]) 92 + 93 + 94 +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) 95 +# -------------------------------------------- 96 +m4_define([lt_dict_add_subkey], 97 +[m4_define([$1($2:$3)], [$4])]) 98 + 99 + 100 +# lt_dict_fetch(DICT, KEY, [SUBKEY]) 101 +# ---------------------------------- 102 +m4_define([lt_dict_fetch], 103 +[m4_ifval([$3], 104 + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), 105 + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) 106 + 107 + 108 +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) 109 +# ----------------------------------------------------------------- 110 +m4_define([lt_if_dict_fetch], 111 +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], 112 + [$5], 113 + [$6])]) 114 + 115 + 116 +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) 117 +# -------------------------------------------------------------- 118 +m4_define([lt_dict_filter], 119 +[m4_if([$5], [], [], 120 + [lt_join(m4_quote(m4_default([$4], [[, ]])), 121 + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), 122 + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl 123 +])
Added m4/ltversion.m4.
1 +# ltversion.m4 -- version numbers -*- Autoconf -*- 2 +# 3 +# Copyright (C) 2004 Free Software Foundation, Inc. 4 +# Written by Scott James Remnant, 2004 5 +# 6 +# This file is free software; the Free Software Foundation gives 7 +# unlimited permission to copy and/or distribute it, with or without 8 +# modifications, as long as this notice is preserved. 9 + 10 +# @configure_input@ 11 + 12 +# serial 3337 ltversion.m4 13 +# This file is part of GNU Libtool 14 + 15 +m4_define([LT_PACKAGE_VERSION], [2.4.2]) 16 +m4_define([LT_PACKAGE_REVISION], [1.3337]) 17 + 18 +AC_DEFUN([LTVERSION_VERSION], 19 +[macro_version='2.4.2' 20 +macro_revision='1.3337' 21 +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) 22 +_LT_DECL(, macro_revision, 0) 23 +])
Added m4/lt~obsolete.m4.
1 +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- 2 +# 3 +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. 4 +# Written by Scott James Remnant, 2004. 5 +# 6 +# This file is free software; the Free Software Foundation gives 7 +# unlimited permission to copy and/or distribute it, with or without 8 +# modifications, as long as this notice is preserved. 9 + 10 +# serial 5 lt~obsolete.m4 11 + 12 +# These exist entirely to fool aclocal when bootstrapping libtool. 13 +# 14 +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) 15 +# which have later been changed to m4_define as they aren't part of the 16 +# exported API, or moved to Autoconf or Automake where they belong. 17 +# 18 +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN 19 +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us 20 +# using a macro with the same name in our local m4/libtool.m4 it'll 21 +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define 22 +# and doesn't know about Autoconf macros at all.) 23 +# 24 +# So we provide this file, which has a silly filename so it's always 25 +# included after everything else. This provides aclocal with the 26 +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything 27 +# because those macros already exist, or will be overwritten later. 28 +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 29 +# 30 +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. 31 +# Yes, that means every name once taken will need to remain here until 32 +# we give up compatibility with versions before 1.7, at which point 33 +# we need to keep only those names which we still refer to. 34 + 35 +# This is to help aclocal find these macros, as it can't see m4_define. 36 +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) 37 + 38 +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) 39 +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) 40 +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) 41 +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) 42 +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) 43 +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) 44 +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) 45 +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) 46 +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) 47 +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) 48 +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) 49 +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) 50 +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) 51 +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) 52 +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) 53 +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) 54 +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) 55 +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) 56 +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) 57 +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) 58 +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) 59 +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) 60 +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) 61 +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) 62 +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) 63 +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) 64 +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) 65 +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) 66 +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) 67 +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) 68 +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) 69 +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) 70 +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) 71 +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) 72 +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) 73 +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) 74 +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) 75 +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) 76 +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) 77 +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) 78 +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) 79 +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) 80 +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) 81 +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) 82 +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) 83 +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) 84 +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) 85 +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) 86 +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) 87 +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) 88 +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) 89 +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) 90 +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) 91 +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) 92 +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) 93 +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) 94 +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) 95 +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) 96 +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) 97 +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) 98 +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
Added missing.
1 +#! /bin/sh 2 +# Common stub for a few missing GNU programs while installing. 3 + 4 +scriptversion=2012-01-06.13; # UTC 5 + 6 +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 7 +# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. 8 +# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. 9 + 10 +# This program is free software; you can redistribute it and/or modify 11 +# it under the terms of the GNU General Public License as published by 12 +# the Free Software Foundation; either version 2, or (at your option) 13 +# any later version. 14 + 15 +# This program is distributed in the hope that it will be useful, 16 +# but WITHOUT ANY WARRANTY; without even the implied warranty of 17 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 +# GNU General Public License for more details. 19 + 20 +# You should have received a copy of the GNU General Public License 21 +# along with this program. If not, see <http://www.gnu.org/licenses/>. 22 + 23 +# As a special exception to the GNU General Public License, if you 24 +# distribute this file as part of a program that contains a 25 +# configuration script generated by Autoconf, you may include it under 26 +# the same distribution terms that you use for the rest of that program. 27 + 28 +if test $# -eq 0; then 29 + echo 1>&2 "Try \`$0 --help' for more information" 30 + exit 1 31 +fi 32 + 33 +run=: 34 +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' 35 +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' 36 + 37 +# In the cases where this matters, `missing' is being run in the 38 +# srcdir already. 39 +if test -f configure.ac; then 40 + configure_ac=configure.ac 41 +else 42 + configure_ac=configure.in 43 +fi 44 + 45 +msg="missing on your system" 46 + 47 +case $1 in 48 +--run) 49 + # Try to run requested program, and just exit if it succeeds. 50 + run= 51 + shift 52 + "$@" && exit 0 53 + # Exit code 63 means version mismatch. This often happens 54 + # when the user try to use an ancient version of a tool on 55 + # a file that requires a minimum version. In this case we 56 + # we should proceed has if the program had been absent, or 57 + # if --run hadn't been passed. 58 + if test $? = 63; then 59 + run=: 60 + msg="probably too old" 61 + fi 62 + ;; 63 + 64 + -h|--h|--he|--hel|--help) 65 + echo "\ 66 +$0 [OPTION]... PROGRAM [ARGUMENT]... 67 + 68 +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an 69 +error status if there is no known handling for PROGRAM. 70 + 71 +Options: 72 + -h, --help display this help and exit 73 + -v, --version output version information and exit 74 + --run try to run the given command, and emulate it if it fails 75 + 76 +Supported PROGRAM values: 77 + aclocal touch file \`aclocal.m4' 78 + autoconf touch file \`configure' 79 + autoheader touch file \`config.h.in' 80 + autom4te touch the output file, or create a stub one 81 + automake touch all \`Makefile.in' files 82 + bison create \`y.tab.[ch]', if possible, from existing .[ch] 83 + flex create \`lex.yy.c', if possible, from existing .c 84 + help2man touch the output file 85 + lex create \`lex.yy.c', if possible, from existing .c 86 + makeinfo touch the output file 87 + yacc create \`y.tab.[ch]', if possible, from existing .[ch] 88 + 89 +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and 90 +\`g' are ignored when checking the name. 91 + 92 +Send bug reports to <bug-automake@gnu.org>." 93 + exit $? 94 + ;; 95 + 96 + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) 97 + echo "missing $scriptversion (GNU Automake)" 98 + exit $? 99 + ;; 100 + 101 + -*) 102 + echo 1>&2 "$0: Unknown \`$1' option" 103 + echo 1>&2 "Try \`$0 --help' for more information" 104 + exit 1 105 + ;; 106 + 107 +esac 108 + 109 +# normalize program name to check for. 110 +program=`echo "$1" | sed ' 111 + s/^gnu-//; t 112 + s/^gnu//; t 113 + s/^g//; t'` 114 + 115 +# Now exit if we have it, but it failed. Also exit now if we 116 +# don't have it and --version was passed (most likely to detect 117 +# the program). This is about non-GNU programs, so use $1 not 118 +# $program. 119 +case $1 in 120 + lex*|yacc*) 121 + # Not GNU programs, they don't have --version. 122 + ;; 123 + 124 + *) 125 + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then 126 + # We have it, but it failed. 127 + exit 1 128 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then 129 + # Could not run --version or --help. This is probably someone 130 + # running `$TOOL --version' or `$TOOL --help' to check whether 131 + # $TOOL exists and not knowing $TOOL uses missing. 132 + exit 1 133 + fi 134 + ;; 135 +esac 136 + 137 +# If it does not exist, or fails to run (possibly an outdated version), 138 +# try to emulate it. 139 +case $program in 140 + aclocal*) 141 + echo 1>&2 "\ 142 +WARNING: \`$1' is $msg. You should only need it if 143 + you modified \`acinclude.m4' or \`${configure_ac}'. You might want 144 + to install the \`Automake' and \`Perl' packages. Grab them from 145 + any GNU archive site." 146 + touch aclocal.m4 147 + ;; 148 + 149 + autoconf*) 150 + echo 1>&2 "\ 151 +WARNING: \`$1' is $msg. You should only need it if 152 + you modified \`${configure_ac}'. You might want to install the 153 + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU 154 + archive site." 155 + touch configure 156 + ;; 157 + 158 + autoheader*) 159 + echo 1>&2 "\ 160 +WARNING: \`$1' is $msg. You should only need it if 161 + you modified \`acconfig.h' or \`${configure_ac}'. You might want 162 + to install the \`Autoconf' and \`GNU m4' packages. Grab them 163 + from any GNU archive site." 164 + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` 165 + test -z "$files" && files="config.h" 166 + touch_files= 167 + for f in $files; do 168 + case $f in 169 + *:*) touch_files="$touch_files "`echo "$f" | 170 + sed -e 's/^[^:]*://' -e 's/:.*//'`;; 171 + *) touch_files="$touch_files $f.in";; 172 + esac 173 + done 174 + touch $touch_files 175 + ;; 176 + 177 + automake*) 178 + echo 1>&2 "\ 179 +WARNING: \`$1' is $msg. You should only need it if 180 + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. 181 + You might want to install the \`Automake' and \`Perl' packages. 182 + Grab them from any GNU archive site." 183 + find . -type f -name Makefile.am -print | 184 + sed 's/\.am$/.in/' | 185 + while read f; do touch "$f"; done 186 + ;; 187 + 188 + autom4te*) 189 + echo 1>&2 "\ 190 +WARNING: \`$1' is needed, but is $msg. 191 + You might have modified some files without having the 192 + proper tools for further handling them. 193 + You can get \`$1' as part of \`Autoconf' from any GNU 194 + archive site." 195 + 196 + file=`echo "$*" | sed -n "$sed_output"` 197 + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` 198 + if test -f "$file"; then 199 + touch $file 200 + else 201 + test -z "$file" || exec >$file 202 + echo "#! /bin/sh" 203 + echo "# Created by GNU Automake missing as a replacement of" 204 + echo "# $ $@" 205 + echo "exit 0" 206 + chmod +x $file 207 + exit 1 208 + fi 209 + ;; 210 + 211 + bison*|yacc*) 212 + echo 1>&2 "\ 213 +WARNING: \`$1' $msg. You should only need it if 214 + you modified a \`.y' file. You may need the \`Bison' package 215 + in order for those modifications to take effect. You can get 216 + \`Bison' from any GNU archive site." 217 + rm -f y.tab.c y.tab.h 218 + if test $# -ne 1; then 219 + eval LASTARG=\${$#} 220 + case $LASTARG in 221 + *.y) 222 + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` 223 + if test -f "$SRCFILE"; then 224 + cp "$SRCFILE" y.tab.c 225 + fi 226 + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` 227 + if test -f "$SRCFILE"; then 228 + cp "$SRCFILE" y.tab.h 229 + fi 230 + ;; 231 + esac 232 + fi 233 + if test ! -f y.tab.h; then 234 + echo >y.tab.h 235 + fi 236 + if test ! -f y.tab.c; then 237 + echo 'main() { return 0; }' >y.tab.c 238 + fi 239 + ;; 240 + 241 + lex*|flex*) 242 + echo 1>&2 "\ 243 +WARNING: \`$1' is $msg. You should only need it if 244 + you modified a \`.l' file. You may need the \`Flex' package 245 + in order for those modifications to take effect. You can get 246 + \`Flex' from any GNU archive site." 247 + rm -f lex.yy.c 248 + if test $# -ne 1; then 249 + eval LASTARG=\${$#} 250 + case $LASTARG in 251 + *.l) 252 + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` 253 + if test -f "$SRCFILE"; then 254 + cp "$SRCFILE" lex.yy.c 255 + fi 256 + ;; 257 + esac 258 + fi 259 + if test ! -f lex.yy.c; then 260 + echo 'main() { return 0; }' >lex.yy.c 261 + fi 262 + ;; 263 + 264 + help2man*) 265 + echo 1>&2 "\ 266 +WARNING: \`$1' is $msg. You should only need it if 267 + you modified a dependency of a manual page. You may need the 268 + \`Help2man' package in order for those modifications to take 269 + effect. You can get \`Help2man' from any GNU archive site." 270 + 271 + file=`echo "$*" | sed -n "$sed_output"` 272 + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` 273 + if test -f "$file"; then 274 + touch $file 275 + else 276 + test -z "$file" || exec >$file 277 + echo ".ab help2man is required to generate this page" 278 + exit $? 279 + fi 280 + ;; 281 + 282 + makeinfo*) 283 + echo 1>&2 "\ 284 +WARNING: \`$1' is $msg. You should only need it if 285 + you modified a \`.texi' or \`.texinfo' file, or any other file 286 + indirectly affecting the aspect of the manual. The spurious 287 + call might also be the consequence of using a buggy \`make' (AIX, 288 + DU, IRIX). You might want to install the \`Texinfo' package or 289 + the \`GNU make' package. Grab either from any GNU archive site." 290 + # The file to touch is that specified with -o ... 291 + file=`echo "$*" | sed -n "$sed_output"` 292 + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` 293 + if test -z "$file"; then 294 + # ... or it is the one specified with @setfilename ... 295 + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` 296 + file=`sed -n ' 297 + /^@setfilename/{ 298 + s/.* \([^ ]*\) *$/\1/ 299 + p 300 + q 301 + }' $infile` 302 + # ... or it is derived from the source name (dir/f.texi becomes f.info) 303 + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info 304 + fi 305 + # If the file does not exist, the user really needs makeinfo; 306 + # let's fail without touching anything. 307 + test -f $file || exit 1 308 + touch $file 309 + ;; 310 + 311 + *) 312 + echo 1>&2 "\ 313 +WARNING: \`$1' is needed, and is $msg. 314 + You might have modified some files without having the 315 + proper tools for further handling them. Check the \`README' file, 316 + it often tells you about the needed prerequisites for installing 317 + this package. You may also peek at any GNU archive site, in case 318 + some other package would contain this missing \`$1' program." 319 + exit 1 320 + ;; 321 +esac 322 + 323 +exit 0 324 + 325 +# Local variables: 326 +# eval: (add-hook 'write-file-hooks 'time-stamp) 327 +# time-stamp-start: "scriptversion=" 328 +# time-stamp-format: "%:y-%02m-%02d.%02H" 329 +# time-stamp-time-zone: "UTC" 330 +# time-stamp-end: "; # UTC" 331 +# End:
Added src/Makefile.am.
1 + 2 +AM_CFLAGS = -D_LARGE_FILE=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 \ 3 + @LIBPNG_CFLAGS@ @LIBCAIRO_CFLAGS@ @LIBXML2_CFLAGS@ 4 + 5 +AM_CPPFLAGS = @CFLAGS@ 6 +AM_CPPFLAGS += -I$(top_srcdir)/headers 7 + 8 +lib_LTLIBRARIES = libgaiagraphics.la 9 + 10 +libgaiagraphics_la_SOURCES = \ 11 + gaiagraphics_paint.c \ 12 + gaiagraphics_io.c \ 13 + gaiagraphics_image.c \ 14 + gaiagraphics_aux.c \ 15 + gaiagraphics_quantize.c \ 16 + gaiagraphics_gif.c \ 17 + gaiagraphics_png.c \ 18 + gaiagraphics_jpeg.c \ 19 + gaiagraphics_tiff.c \ 20 + gaiagraphics_grids.c \ 21 + gaiagraphics_adam7.c \ 22 + gaiagraphics_color_rules.c \ 23 + gaiagraphics_svg.c \ 24 + gaiagraphics_svg_aux.c \ 25 + gaiagraphics_svg_xml.c 26 + 27 +libgaiagraphics_la_LDFLAGS = -version-info 1:0:0 -no-undefined 28 + 29 +if MINGW 30 +libgaiagraphics_la_LIBADD = \ 31 + @LIBXML2_LIBS@ @LIBCAIRO_LIBS@ -lgeotiff -ltiff -ljpeg -lproj @LIBPNG_LIBS@ 32 +else 33 +libgaiagraphics_la_LIBADD = \ 34 + @LIBXML2_LIBS@ @LIBCAIRO_LIBS@ -lgeotiff -ltiff -ljpeg -lproj @LIBPNG_LIBS@ -lpthread 35 +endif 36 +
Added src/Makefile.in.
1 +# Makefile.in generated by automake 1.13.4 from Makefile.am. 2 +# @configure_input@ 3 + 4 +# Copyright (C) 1994-2013 Free Software Foundation, Inc. 5 + 6 +# This Makefile.in is free software; the Free Software Foundation 7 +# gives unlimited permission to copy and/or distribute it, 8 +# with or without modifications, as long as this notice is preserved. 9 + 10 +# This program is distributed in the hope that it will be useful, 11 +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without 12 +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A 13 +# PARTICULAR PURPOSE. 14 + 15 +@SET_MAKE@ 16 + 17 +VPATH = @srcdir@ 18 +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 19 +am__make_running_with_option = \ 20 + case $${target_option-} in \ 21 + ?) ;; \ 22 + *) echo "am__make_running_with_option: internal error: invalid" \ 23 + "target option '$${target_option-}' specified" >&2; \ 24 + exit 1;; \ 25 + esac; \ 26 + has_opt=no; \ 27 + sane_makeflags=$$MAKEFLAGS; \ 28 + if $(am__is_gnu_make); then \ 29 + sane_makeflags=$$MFLAGS; \ 30 + else \ 31 + case $$MAKEFLAGS in \ 32 + *\\[\ \ ]*) \ 33 + bs=\\; \ 34 + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ 35 + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ 36 + esac; \ 37 + fi; \ 38 + skip_next=no; \ 39 + strip_trailopt () \ 40 + { \ 41 + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ 42 + }; \ 43 + for flg in $$sane_makeflags; do \ 44 + test $$skip_next = yes && { skip_next=no; continue; }; \ 45 + case $$flg in \ 46 + *=*|--*) continue;; \ 47 + -*I) strip_trailopt 'I'; skip_next=yes;; \ 48 + -*I?*) strip_trailopt 'I';; \ 49 + -*O) strip_trailopt 'O'; skip_next=yes;; \ 50 + -*O?*) strip_trailopt 'O';; \ 51 + -*l) strip_trailopt 'l'; skip_next=yes;; \ 52 + -*l?*) strip_trailopt 'l';; \ 53 + -[dEDm]) skip_next=yes;; \ 54 + -[JT]) skip_next=yes;; \ 55 + esac; \ 56 + case $$flg in \ 57 + *$$target_option*) has_opt=yes; break;; \ 58 + esac; \ 59 + done; \ 60 + test $$has_opt = yes 61 +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 62 +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 63 +pkgdatadir = $(datadir)/@PACKAGE@ 64 +pkgincludedir = $(includedir)/@PACKAGE@ 65 +pkglibdir = $(libdir)/@PACKAGE@ 66 +pkglibexecdir = $(libexecdir)/@PACKAGE@ 67 +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 68 +install_sh_DATA = $(install_sh) -c -m 644 69 +install_sh_PROGRAM = $(install_sh) -c 70 +install_sh_SCRIPT = $(install_sh) -c 71 +INSTALL_HEADER = $(INSTALL_DATA) 72 +transform = $(program_transform_name) 73 +NORMAL_INSTALL = : 74 +PRE_INSTALL = : 75 +POST_INSTALL = : 76 +NORMAL_UNINSTALL = : 77 +PRE_UNINSTALL = : 78 +POST_UNINSTALL = : 79 +build_triplet = @build@ 80 +host_triplet = @host@ 81 +subdir = src 82 +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ 83 + $(top_srcdir)/depcomp 84 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 85 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ 86 + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ 87 + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ 88 + $(top_srcdir)/configure.ac 89 +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 90 + $(ACLOCAL_M4) 91 +mkinstalldirs = $(install_sh) -d 92 +CONFIG_CLEAN_FILES = 93 +CONFIG_CLEAN_VPATH_FILES = 94 +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; 95 +am__vpath_adj = case $$p in \ 96 + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ 97 + *) f=$$p;; \ 98 + esac; 99 +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; 100 +am__install_max = 40 101 +am__nobase_strip_setup = \ 102 + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` 103 +am__nobase_strip = \ 104 + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" 105 +am__nobase_list = $(am__nobase_strip_setup); \ 106 + for p in $$list; do echo "$$p $$p"; done | \ 107 + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ 108 + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ 109 + if (++n[$$2] == $(am__install_max)) \ 110 + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ 111 + END { for (dir in files) print dir, files[dir] }' 112 +am__base_list = \ 113 + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ 114 + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' 115 +am__uninstall_files_from_dir = { \ 116 + test -z "$$files" \ 117 + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ 118 + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ 119 + $(am__cd) "$$dir" && rm -f $$files; }; \ 120 + } 121 +am__installdirs = "$(DESTDIR)$(libdir)" 122 +LTLIBRARIES = $(lib_LTLIBRARIES) 123 +libgaiagraphics_la_DEPENDENCIES = 124 +am_libgaiagraphics_la_OBJECTS = gaiagraphics_paint.lo \ 125 + gaiagraphics_io.lo gaiagraphics_image.lo gaiagraphics_aux.lo \ 126 + gaiagraphics_quantize.lo gaiagraphics_gif.lo \ 127 + gaiagraphics_png.lo gaiagraphics_jpeg.lo gaiagraphics_tiff.lo \ 128 + gaiagraphics_grids.lo gaiagraphics_adam7.lo \ 129 + gaiagraphics_color_rules.lo gaiagraphics_svg.lo \ 130 + gaiagraphics_svg_aux.lo gaiagraphics_svg_xml.lo 131 +libgaiagraphics_la_OBJECTS = $(am_libgaiagraphics_la_OBJECTS) 132 +AM_V_lt = $(am__v_lt_@AM_V@) 133 +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) 134 +am__v_lt_0 = --silent 135 +am__v_lt_1 = 136 +libgaiagraphics_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ 137 + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ 138 + $(AM_CFLAGS) $(CFLAGS) $(libgaiagraphics_la_LDFLAGS) \ 139 + $(LDFLAGS) -o $@ 140 +AM_V_P = $(am__v_P_@AM_V@) 141 +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 142 +am__v_P_0 = false 143 +am__v_P_1 = : 144 +AM_V_GEN = $(am__v_GEN_@AM_V@) 145 +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 146 +am__v_GEN_0 = @echo " GEN " $@; 147 +am__v_GEN_1 = 148 +AM_V_at = $(am__v_at_@AM_V@) 149 +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 150 +am__v_at_0 = @ 151 +am__v_at_1 = 152 +DEFAULT_INCLUDES = -I.@am__isrc@ 153 +depcomp = $(SHELL) $(top_srcdir)/depcomp 154 +am__depfiles_maybe = depfiles 155 +am__mv = mv -f 156 +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ 157 + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) 158 +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ 159 + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ 160 + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ 161 + $(AM_CFLAGS) $(CFLAGS) 162 +AM_V_CC = $(am__v_CC_@AM_V@) 163 +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) 164 +am__v_CC_0 = @echo " CC " $@; 165 +am__v_CC_1 = 166 +CCLD = $(CC) 167 +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ 168 + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ 169 + $(AM_LDFLAGS) $(LDFLAGS) -o $@ 170 +AM_V_CCLD = $(am__v_CCLD_@AM_V@) 171 +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) 172 +am__v_CCLD_0 = @echo " CCLD " $@; 173 +am__v_CCLD_1 = 174 +SOURCES = $(libgaiagraphics_la_SOURCES) 175 +DIST_SOURCES = $(libgaiagraphics_la_SOURCES) 176 +am__can_run_installinfo = \ 177 + case $$AM_UPDATE_INFO_DIR in \ 178 + n|no|NO) false;; \ 179 + *) (install-info --version) >/dev/null 2>&1;; \ 180 + esac 181 +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) 182 +# Read a list of newline-separated strings from the standard input, 183 +# and print each of them once, without duplicates. Input order is 184 +# *not* preserved. 185 +am__uniquify_input = $(AWK) '\ 186 + BEGIN { nonempty = 0; } \ 187 + { items[$$0] = 1; nonempty = 1; } \ 188 + END { if (nonempty) { for (i in items) print i; }; } \ 189 +' 190 +# Make sure the list of sources is unique. This is necessary because, 191 +# e.g., the same source file might be shared among _SOURCES variables 192 +# for different programs/libraries. 193 +am__define_uniq_tagged_files = \ 194 + list='$(am__tagged_files)'; \ 195 + unique=`for i in $$list; do \ 196 + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ 197 + done | $(am__uniquify_input)` 198 +ETAGS = etags 199 +CTAGS = ctags 200 +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 201 +ACLOCAL = @ACLOCAL@ 202 +AMTAR = @AMTAR@ 203 +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ 204 +AR = @AR@ 205 +AS = @AS@ 206 +AUTOCONF = @AUTOCONF@ 207 +AUTOHEADER = @AUTOHEADER@ 208 +AUTOMAKE = @AUTOMAKE@ 209 +AWK = @AWK@ 210 +CC = @CC@ 211 +CCDEPMODE = @CCDEPMODE@ 212 +CFLAGS = @CFLAGS@ 213 +CPP = @CPP@ 214 +CPPFLAGS = @CPPFLAGS@ 215 +CXX = @CXX@ 216 +CXXCPP = @CXXCPP@ 217 +CXXDEPMODE = @CXXDEPMODE@ 218 +CXXFLAGS = @CXXFLAGS@ 219 +CYGPATH_W = @CYGPATH_W@ 220 +DEFS = @DEFS@ 221 +DEPDIR = @DEPDIR@ 222 +DLLTOOL = @DLLTOOL@ 223 +DSYMUTIL = @DSYMUTIL@ 224 +DUMPBIN = @DUMPBIN@ 225 +ECHO_C = @ECHO_C@ 226 +ECHO_N = @ECHO_N@ 227 +ECHO_T = @ECHO_T@ 228 +EGREP = @EGREP@ 229 +EXEEXT = @EXEEXT@ 230 +FGREP = @FGREP@ 231 +GREP = @GREP@ 232 +INSTALL = @INSTALL@ 233 +INSTALL_DATA = @INSTALL_DATA@ 234 +INSTALL_PROGRAM = @INSTALL_PROGRAM@ 235 +INSTALL_SCRIPT = @INSTALL_SCRIPT@ 236 +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ 237 +LD = @LD@ 238 +LDFLAGS = @LDFLAGS@ 239 +LIBCAIRO_CFLAGS = @LIBCAIRO_CFLAGS@ 240 +LIBCAIRO_LIBS = @LIBCAIRO_LIBS@ 241 +LIBOBJS = @LIBOBJS@ 242 +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ 243 +LIBPNG_LIBS = @LIBPNG_LIBS@ 244 +LIBS = @LIBS@ 245 +LIBTOOL = @LIBTOOL@ 246 +LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ 247 +LIBXML2_LIBS = @LIBXML2_LIBS@ 248 +LIPO = @LIPO@ 249 +LN_S = @LN_S@ 250 +LTLIBOBJS = @LTLIBOBJS@ 251 +MAINT = @MAINT@ 252 +MAKEINFO = @MAKEINFO@ 253 +MANIFEST_TOOL = @MANIFEST_TOOL@ 254 +MKDIR_P = @MKDIR_P@ 255 +NM = @NM@ 256 +NMEDIT = @NMEDIT@ 257 +OBJDUMP = @OBJDUMP@ 258 +OBJEXT = @OBJEXT@ 259 +OTOOL = @OTOOL@ 260 +OTOOL64 = @OTOOL64@ 261 +PACKAGE = @PACKAGE@ 262 +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ 263 +PACKAGE_NAME = @PACKAGE_NAME@ 264 +PACKAGE_STRING = @PACKAGE_STRING@ 265 +PACKAGE_TARNAME = @PACKAGE_TARNAME@ 266 +PACKAGE_URL = @PACKAGE_URL@ 267 +PACKAGE_VERSION = @PACKAGE_VERSION@ 268 +PATH_SEPARATOR = @PATH_SEPARATOR@ 269 +PKG_CONFIG = @PKG_CONFIG@ 270 +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ 271 +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ 272 +RANLIB = @RANLIB@ 273 +SED = @SED@ 274 +SET_MAKE = @SET_MAKE@ 275 +SHELL = @SHELL@ 276 +STRIP = @STRIP@ 277 +VERSION = @VERSION@ 278 +abs_builddir = @abs_builddir@ 279 +abs_srcdir = @abs_srcdir@ 280 +abs_top_builddir = @abs_top_builddir@ 281 +abs_top_srcdir = @abs_top_srcdir@ 282 +ac_ct_AR = @ac_ct_AR@ 283 +ac_ct_CC = @ac_ct_CC@ 284 +ac_ct_CXX = @ac_ct_CXX@ 285 +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ 286 +am__include = @am__include@ 287 +am__leading_dot = @am__leading_dot@ 288 +am__quote = @am__quote@ 289 +am__tar = @am__tar@ 290 +am__untar = @am__untar@ 291 +bindir = @bindir@ 292 +build = @build@ 293 +build_alias = @build_alias@ 294 +build_cpu = @build_cpu@ 295 +build_os = @build_os@ 296 +build_vendor = @build_vendor@ 297 +builddir = @builddir@ 298 +datadir = @datadir@ 299 +datarootdir = @datarootdir@ 300 +docdir = @docdir@ 301 +dvidir = @dvidir@ 302 +exec_prefix = @exec_prefix@ 303 +host = @host@ 304 +host_alias = @host_alias@ 305 +host_cpu = @host_cpu@ 306 +host_os = @host_os@ 307 +host_vendor = @host_vendor@ 308 +htmldir = @htmldir@ 309 +includedir = @includedir@ 310 +infodir = @infodir@ 311 +install_sh = @install_sh@ 312 +libdir = @libdir@ 313 +libexecdir = @libexecdir@ 314 +localedir = @localedir@ 315 +localstatedir = @localstatedir@ 316 +mandir = @mandir@ 317 +mkdir_p = @mkdir_p@ 318 +oldincludedir = @oldincludedir@ 319 +pdfdir = @pdfdir@ 320 +prefix = @prefix@ 321 +program_transform_name = @program_transform_name@ 322 +psdir = @psdir@ 323 +sbindir = @sbindir@ 324 +sharedstatedir = @sharedstatedir@ 325 +srcdir = @srcdir@ 326 +sysconfdir = @sysconfdir@ 327 +target_alias = @target_alias@ 328 +top_build_prefix = @top_build_prefix@ 329 +top_builddir = @top_builddir@ 330 +top_srcdir = @top_srcdir@ 331 +AM_CFLAGS = -D_LARGE_FILE=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 \ 332 + @LIBPNG_CFLAGS@ @LIBCAIRO_CFLAGS@ @LIBXML2_CFLAGS@ 333 + 334 +AM_CPPFLAGS = @CFLAGS@ -I$(top_srcdir)/headers 335 +lib_LTLIBRARIES = libgaiagraphics.la 336 +libgaiagraphics_la_SOURCES = \ 337 + gaiagraphics_paint.c \ 338 + gaiagraphics_io.c \ 339 + gaiagraphics_image.c \ 340 + gaiagraphics_aux.c \ 341 + gaiagraphics_quantize.c \ 342 + gaiagraphics_gif.c \ 343 + gaiagraphics_png.c \ 344 + gaiagraphics_jpeg.c \ 345 + gaiagraphics_tiff.c \ 346 + gaiagraphics_grids.c \ 347 + gaiagraphics_adam7.c \ 348 + gaiagraphics_color_rules.c \ 349 + gaiagraphics_svg.c \ 350 + gaiagraphics_svg_aux.c \ 351 + gaiagraphics_svg_xml.c 352 + 353 +libgaiagraphics_la_LDFLAGS = -version-info 1:0:0 -no-undefined 354 +@MINGW_FALSE@libgaiagraphics_la_LIBADD = \ 355 +@MINGW_FALSE@ @LIBXML2_LIBS@ @LIBCAIRO_LIBS@ -lgeotiff -ltiff -ljpeg -lproj @LIBPNG_LIBS@ -lpthread 356 + 357 +@MINGW_TRUE@libgaiagraphics_la_LIBADD = \ 358 +@MINGW_TRUE@ @LIBXML2_LIBS@ @LIBCAIRO_LIBS@ -lgeotiff -ltiff -ljpeg -lproj @LIBPNG_LIBS@ 359 + 360 +all: all-am 361 + 362 +.SUFFIXES: 363 +.SUFFIXES: .c .lo .o .obj 364 +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) 365 + @for dep in $?; do \ 366 + case '$(am__configure_deps)' in \ 367 + *$$dep*) \ 368 + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ 369 + && { if test -f $@; then exit 0; else break; fi; }; \ 370 + exit 1;; \ 371 + esac; \ 372 + done; \ 373 + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ 374 + $(am__cd) $(top_srcdir) && \ 375 + $(AUTOMAKE) --gnu src/Makefile 376 +.PRECIOUS: Makefile 377 +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 378 + @case '$?' in \ 379 + *config.status*) \ 380 + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ 381 + *) \ 382 + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ 383 + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 384 + esac; 385 + 386 +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) 387 + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh 388 + 389 +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 390 + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh 391 +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) 392 + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh 393 +$(am__aclocal_m4_deps): 394 + 395 +install-libLTLIBRARIES: $(lib_LTLIBRARIES) 396 + @$(NORMAL_INSTALL) 397 + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ 398 + list2=; for p in $$list; do \ 399 + if test -f $$p; then \ 400 + list2="$$list2 $$p"; \ 401 + else :; fi; \ 402 + done; \ 403 + test -z "$$list2" || { \ 404 + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ 405 + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ 406 + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ 407 + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ 408 + } 409 + 410 +uninstall-libLTLIBRARIES: 411 + @$(NORMAL_UNINSTALL) 412 + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ 413 + for p in $$list; do \ 414 + $(am__strip_dir) \ 415 + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ 416 + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ 417 + done 418 + 419 +clean-libLTLIBRARIES: 420 + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) 421 + @list='$(lib_LTLIBRARIES)'; \ 422 + locs=`for p in $$list; do echo $$p; done | \ 423 + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ 424 + sort -u`; \ 425 + test -z "$$locs" || { \ 426 + echo rm -f $${locs}; \ 427 + rm -f $${locs}; \ 428 + } 429 + 430 +libgaiagraphics.la: $(libgaiagraphics_la_OBJECTS) $(libgaiagraphics_la_DEPENDENCIES) $(EXTRA_libgaiagraphics_la_DEPENDENCIES) 431 + $(AM_V_CCLD)$(libgaiagraphics_la_LINK) -rpath $(libdir) $(libgaiagraphics_la_OBJECTS) $(libgaiagraphics_la_LIBADD) $(LIBS) 432 + 433 +mostlyclean-compile: 434 + -rm -f *.$(OBJEXT) 435 + 436 +distclean-compile: 437 + -rm -f *.tab.c 438 + 439 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_adam7.Plo@am__quote@ 440 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_aux.Plo@am__quote@ 441 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_color_rules.Plo@am__quote@ 442 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_gif.Plo@am__quote@ 443 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_grids.Plo@am__quote@ 444 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_image.Plo@am__quote@ 445 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_io.Plo@am__quote@ 446 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_jpeg.Plo@am__quote@ 447 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_paint.Plo@am__quote@ 448 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_png.Plo@am__quote@ 449 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_quantize.Plo@am__quote@ 450 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_svg.Plo@am__quote@ 451 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_svg_aux.Plo@am__quote@ 452 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_svg_xml.Plo@am__quote@ 453 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaiagraphics_tiff.Plo@am__quote@ 454 + 455 +.c.o: 456 +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< 457 +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po 458 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ 459 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 460 +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< 461 + 462 +.c.obj: 463 +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` 464 +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po 465 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ 466 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 467 +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` 468 + 469 +.c.lo: 470 +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< 471 +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo 472 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ 473 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 474 +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< 475 + 476 +mostlyclean-libtool: 477 + -rm -f *.lo 478 + 479 +clean-libtool: 480 + -rm -rf .libs _libs 481 + 482 +ID: $(am__tagged_files) 483 + $(am__define_uniq_tagged_files); mkid -fID $$unique 484 +tags: tags-am 485 +TAGS: tags 486 + 487 +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 488 + set x; \ 489 + here=`pwd`; \ 490 + $(am__define_uniq_tagged_files); \ 491 + shift; \ 492 + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ 493 + test -n "$$unique" || unique=$$empty_fix; \ 494 + if test $$# -gt 0; then \ 495 + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ 496 + "$$@" $$unique; \ 497 + else \ 498 + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ 499 + $$unique; \ 500 + fi; \ 501 + fi 502 +ctags: ctags-am 503 + 504 +CTAGS: ctags 505 +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 506 + $(am__define_uniq_tagged_files); \ 507 + test -z "$(CTAGS_ARGS)$$unique" \ 508 + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ 509 + $$unique 510 + 511 +GTAGS: 512 + here=`$(am__cd) $(top_builddir) && pwd` \ 513 + && $(am__cd) $(top_srcdir) \ 514 + && gtags -i $(GTAGS_ARGS) "$$here" 515 +cscopelist: cscopelist-am 516 + 517 +cscopelist-am: $(am__tagged_files) 518 + list='$(am__tagged_files)'; \ 519 + case "$(srcdir)" in \ 520 + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ 521 + *) sdir=$(subdir)/$(srcdir) ;; \ 522 + esac; \ 523 + for i in $$list; do \ 524 + if test -f "$$i"; then \ 525 + echo "$(subdir)/$$i"; \ 526 + else \ 527 + echo "$$sdir/$$i"; \ 528 + fi; \ 529 + done >> $(top_builddir)/cscope.files 530 + 531 +distclean-tags: 532 + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags 533 + 534 +distdir: $(DISTFILES) 535 + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ 536 + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ 537 + list='$(DISTFILES)'; \ 538 + dist_files=`for file in $$list; do echo $$file; done | \ 539 + sed -e "s|^$$srcdirstrip/||;t" \ 540 + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ 541 + case $$dist_files in \ 542 + */*) $(MKDIR_P) `echo "$$dist_files" | \ 543 + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ 544 + sort -u` ;; \ 545 + esac; \ 546 + for file in $$dist_files; do \ 547 + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ 548 + if test -d $$d/$$file; then \ 549 + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ 550 + if test -d "$(distdir)/$$file"; then \ 551 + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ 552 + fi; \ 553 + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ 554 + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ 555 + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ 556 + fi; \ 557 + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ 558 + else \ 559 + test -f "$(distdir)/$$file" \ 560 + || cp -p $$d/$$file "$(distdir)/$$file" \ 561 + || exit 1; \ 562 + fi; \ 563 + done 564 +check-am: all-am 565 +check: check-am 566 +all-am: Makefile $(LTLIBRARIES) 567 +installdirs: 568 + for dir in "$(DESTDIR)$(libdir)"; do \ 569 + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ 570 + done 571 +install: install-am 572 +install-exec: install-exec-am 573 +install-data: install-data-am 574 +uninstall: uninstall-am 575 + 576 +install-am: all-am 577 + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am 578 + 579 +installcheck: installcheck-am 580 +install-strip: 581 + if test -z '$(STRIP)'; then \ 582 + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ 583 + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ 584 + install; \ 585 + else \ 586 + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ 587 + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ 588 + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ 589 + fi 590 +mostlyclean-generic: 591 + 592 +clean-generic: 593 + 594 +distclean-generic: 595 + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) 596 + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) 597 + 598 +maintainer-clean-generic: 599 + @echo "This command is intended for maintainers to use" 600 + @echo "it deletes files that may require special tools to rebuild." 601 +clean: clean-am 602 + 603 +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ 604 + mostlyclean-am 605 + 606 +distclean: distclean-am 607 + -rm -rf ./$(DEPDIR) 608 + -rm -f Makefile 609 +distclean-am: clean-am distclean-compile distclean-generic \ 610 + distclean-tags 611 + 612 +dvi: dvi-am 613 + 614 +dvi-am: 615 + 616 +html: html-am 617 + 618 +html-am: 619 + 620 +info: info-am 621 + 622 +info-am: 623 + 624 +install-data-am: 625 + 626 +install-dvi: install-dvi-am 627 + 628 +install-dvi-am: 629 + 630 +install-exec-am: install-libLTLIBRARIES 631 + 632 +install-html: install-html-am 633 + 634 +install-html-am: 635 + 636 +install-info: install-info-am 637 + 638 +install-info-am: 639 + 640 +install-man: 641 + 642 +install-pdf: install-pdf-am 643 + 644 +install-pdf-am: 645 + 646 +install-ps: install-ps-am 647 + 648 +install-ps-am: 649 + 650 +installcheck-am: 651 + 652 +maintainer-clean: maintainer-clean-am 653 + -rm -rf ./$(DEPDIR) 654 + -rm -f Makefile 655 +maintainer-clean-am: distclean-am maintainer-clean-generic 656 + 657 +mostlyclean: mostlyclean-am 658 + 659 +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ 660 + mostlyclean-libtool 661 + 662 +pdf: pdf-am 663 + 664 +pdf-am: 665 + 666 +ps: ps-am 667 + 668 +ps-am: 669 + 670 +uninstall-am: uninstall-libLTLIBRARIES 671 + 672 +.MAKE: install-am install-strip 673 + 674 +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ 675 + clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ 676 + ctags-am distclean distclean-compile distclean-generic \ 677 + distclean-libtool distclean-tags distdir dvi dvi-am html \ 678 + html-am info info-am install install-am install-data \ 679 + install-data-am install-dvi install-dvi-am install-exec \ 680 + install-exec-am install-html install-html-am install-info \ 681 + install-info-am install-libLTLIBRARIES install-man install-pdf \ 682 + install-pdf-am install-ps install-ps-am install-strip \ 683 + installcheck installcheck-am installdirs maintainer-clean \ 684 + maintainer-clean-generic mostlyclean mostlyclean-compile \ 685 + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ 686 + tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES 687 + 688 + 689 +# Tell versions [3.59,3.63) of GNU make to not export all variables. 690 +# Otherwise a system limit (for SysV at least) may be exceeded. 691 +.NOEXPORT:
Added src/gaiagraphics_adam7.c.
1 +/* 2 +/ gaiagraphics_adam7.c 3 +/ 4 +/ Adam7 encoding and deconding 5 +/ 6 +/ version 1.0, 2010 September 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2009 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdlib.h> 28 +#include <stdio.h> 29 +#include <string.h> 30 +#include <float.h> 31 + 32 +#include "gaiagraphics.h" 33 +#include "gaiagraphics_internals.h" 34 + 35 +GGRAPH_DECLARE int 36 +gGraphImageToAdam7 (const void *ptr_img, void *mem_bufs[7], 37 + int mem_buf_sizes[7], void **palette, int *palette_size) 38 +{ 39 +/* encoding an image as Adam7 */ 40 + unsigned char *p_in; 41 + unsigned char *p_out; 42 + void *out; 43 + int size; 44 + int scanline_width; 45 + int pixel_size; 46 + int i; 47 + int x; 48 + int y; 49 + short out_width; 50 + short out_height; 51 + int x_base; 52 + int y_base; 53 + int x_step; 54 + int y_step; 55 + int endian_arch = gg_endian_arch (); 56 + int endian; 57 + int is_palette = 0; 58 + short start_marker[7]; 59 + short end_marker[7]; 60 + gGraphImagePtr img = (gGraphImagePtr) ptr_img; 61 + 62 + for (i = 0; i < 7; i++) 63 + { 64 + mem_bufs[i] = NULL; 65 + mem_buf_sizes[i] = 0; 66 + } 67 + *palette = NULL; 68 + *palette_size = 0; 69 + 70 + if (img == NULL) 71 + return GGRAPH_INVALID_IMAGE; 72 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 73 + return GGRAPH_INVALID_IMAGE; 74 + 75 + pixel_size = img->pixel_size; 76 + switch (img->pixel_format) 77 + { 78 + case GG_PIXEL_RGB: 79 + start_marker[0] = GG_ADAM7_0_RGB_START; 80 + end_marker[0] = GG_ADAM7_0_RGB_END; 81 + start_marker[1] = GG_ADAM7_1_RGB_START; 82 + end_marker[1] = GG_ADAM7_1_RGB_END; 83 + start_marker[2] = GG_ADAM7_2_RGB_START; 84 + end_marker[2] = GG_ADAM7_2_RGB_END; 85 + start_marker[3] = GG_ADAM7_3_RGB_START; 86 + end_marker[3] = GG_ADAM7_3_RGB_END; 87 + start_marker[4] = GG_ADAM7_4_RGB_START; 88 + end_marker[4] = GG_ADAM7_4_RGB_END; 89 + start_marker[5] = GG_ADAM7_5_RGB_START; 90 + end_marker[5] = GG_ADAM7_5_RGB_END; 91 + start_marker[6] = GG_ADAM7_6_RGB_START; 92 + end_marker[6] = GG_ADAM7_6_RGB_END; 93 + break; 94 + case GG_PIXEL_GRAYSCALE: 95 + start_marker[0] = GG_ADAM7_0_GRAYSCALE_START; 96 + end_marker[0] = GG_ADAM7_0_GRAYSCALE_END; 97 + start_marker[1] = GG_ADAM7_1_GRAYSCALE_START; 98 + end_marker[1] = GG_ADAM7_1_GRAYSCALE_END; 99 + start_marker[2] = GG_ADAM7_2_GRAYSCALE_START; 100 + end_marker[2] = GG_ADAM7_2_GRAYSCALE_END; 101 + start_marker[3] = GG_ADAM7_3_GRAYSCALE_START; 102 + end_marker[3] = GG_ADAM7_3_GRAYSCALE_END; 103 + start_marker[4] = GG_ADAM7_4_GRAYSCALE_START; 104 + end_marker[4] = GG_ADAM7_4_GRAYSCALE_END; 105 + start_marker[5] = GG_ADAM7_5_GRAYSCALE_START; 106 + end_marker[5] = GG_ADAM7_5_GRAYSCALE_END; 107 + start_marker[6] = GG_ADAM7_6_GRAYSCALE_START; 108 + end_marker[6] = GG_ADAM7_6_GRAYSCALE_END; 109 + break; 110 + case GG_PIXEL_PALETTE: 111 + start_marker[0] = GG_ADAM7_0_PALETTE_START; 112 + end_marker[0] = GG_ADAM7_0_PALETTE_END; 113 + start_marker[1] = GG_ADAM7_1_PALETTE_START; 114 + end_marker[1] = GG_ADAM7_1_PALETTE_END; 115 + start_marker[2] = GG_ADAM7_2_PALETTE_START; 116 + end_marker[2] = GG_ADAM7_2_PALETTE_END; 117 + start_marker[3] = GG_ADAM7_3_PALETTE_START; 118 + end_marker[3] = GG_ADAM7_3_PALETTE_END; 119 + start_marker[4] = GG_ADAM7_4_PALETTE_START; 120 + end_marker[4] = GG_ADAM7_4_PALETTE_END; 121 + start_marker[5] = GG_ADAM7_5_PALETTE_START; 122 + end_marker[5] = GG_ADAM7_5_PALETTE_END; 123 + start_marker[6] = GG_ADAM7_6_PALETTE_START; 124 + end_marker[6] = GG_ADAM7_6_PALETTE_END; 125 + is_palette = 1; 126 + break; 127 + case GG_PIXEL_GRID: 128 + switch (img->sample_format) 129 + { 130 + case GGRAPH_SAMPLE_INT: 131 + if (img->bits_per_sample == 16) 132 + { 133 + start_marker[0] = GG_ADAM7_0_INT16_START; 134 + end_marker[0] = GG_ADAM7_0_INT16_END; 135 + start_marker[1] = GG_ADAM7_1_INT16_START; 136 + end_marker[1] = GG_ADAM7_1_INT16_END; 137 + start_marker[2] = GG_ADAM7_2_INT16_START; 138 + end_marker[2] = GG_ADAM7_2_INT16_END; 139 + start_marker[3] = GG_ADAM7_3_INT16_START; 140 + end_marker[3] = GG_ADAM7_3_INT16_END; 141 + start_marker[4] = GG_ADAM7_4_INT16_START; 142 + end_marker[4] = GG_ADAM7_4_INT16_END; 143 + start_marker[5] = GG_ADAM7_5_INT16_START; 144 + end_marker[5] = GG_ADAM7_5_INT16_END; 145 + start_marker[6] = GG_ADAM7_6_INT16_START; 146 + end_marker[6] = GG_ADAM7_6_INT16_END; 147 + } 148 + else 149 + { 150 + start_marker[0] = GG_ADAM7_0_INT32_START; 151 + end_marker[0] = GG_ADAM7_0_INT32_END; 152 + start_marker[1] = GG_ADAM7_1_INT32_START; 153 + end_marker[1] = GG_ADAM7_1_INT32_END; 154 + start_marker[2] = GG_ADAM7_2_INT32_START; 155 + end_marker[2] = GG_ADAM7_2_INT32_END; 156 + start_marker[3] = GG_ADAM7_3_INT32_START; 157 + end_marker[3] = GG_ADAM7_3_INT32_END; 158 + start_marker[4] = GG_ADAM7_4_INT32_START; 159 + end_marker[4] = GG_ADAM7_4_INT32_END; 160 + start_marker[5] = GG_ADAM7_5_INT32_START; 161 + end_marker[5] = GG_ADAM7_5_INT32_END; 162 + start_marker[6] = GG_ADAM7_6_INT32_START; 163 + end_marker[6] = GG_ADAM7_6_INT32_END; 164 + } 165 + break; 166 + case GGRAPH_SAMPLE_UINT: 167 + if (img->bits_per_sample == 16) 168 + { 169 + start_marker[0] = GG_ADAM7_0_UINT16_START; 170 + end_marker[0] = GG_ADAM7_0_UINT16_END; 171 + start_marker[1] = GG_ADAM7_1_UINT16_START; 172 + end_marker[1] = GG_ADAM7_1_UINT16_END; 173 + start_marker[2] = GG_ADAM7_2_UINT16_START; 174 + end_marker[2] = GG_ADAM7_2_UINT16_END; 175 + start_marker[3] = GG_ADAM7_3_UINT16_START; 176 + end_marker[3] = GG_ADAM7_3_UINT16_END; 177 + start_marker[4] = GG_ADAM7_4_UINT16_START; 178 + end_marker[4] = GG_ADAM7_4_UINT16_END; 179 + start_marker[5] = GG_ADAM7_5_UINT16_START; 180 + end_marker[5] = GG_ADAM7_5_UINT16_END; 181 + start_marker[6] = GG_ADAM7_6_UINT16_START; 182 + end_marker[6] = GG_ADAM7_6_UINT16_END; 183 + } 184 + else 185 + { 186 + start_marker[0] = GG_ADAM7_0_UINT32_START; 187 + end_marker[0] = GG_ADAM7_0_UINT32_END; 188 + start_marker[1] = GG_ADAM7_1_UINT32_START; 189 + end_marker[1] = GG_ADAM7_1_UINT32_END; 190 + start_marker[2] = GG_ADAM7_2_UINT32_START; 191 + end_marker[2] = GG_ADAM7_2_UINT32_END; 192 + start_marker[3] = GG_ADAM7_3_UINT32_START; 193 + end_marker[3] = GG_ADAM7_3_UINT32_END; 194 + start_marker[4] = GG_ADAM7_4_UINT32_START; 195 + end_marker[4] = GG_ADAM7_4_UINT32_END; 196 + start_marker[5] = GG_ADAM7_5_UINT32_START; 197 + end_marker[5] = GG_ADAM7_5_UINT32_END; 198 + start_marker[6] = GG_ADAM7_6_UINT32_START; 199 + end_marker[6] = GG_ADAM7_6_UINT32_END; 200 + } 201 + break; 202 + case GGRAPH_SAMPLE_FLOAT: 203 + if (img->bits_per_sample == 32) 204 + { 205 + start_marker[0] = GG_ADAM7_0_FLOAT_START; 206 + end_marker[0] = GG_ADAM7_0_FLOAT_END; 207 + start_marker[1] = GG_ADAM7_1_FLOAT_START; 208 + end_marker[1] = GG_ADAM7_1_FLOAT_END; 209 + start_marker[2] = GG_ADAM7_2_FLOAT_START; 210 + end_marker[2] = GG_ADAM7_2_FLOAT_END; 211 + start_marker[3] = GG_ADAM7_3_FLOAT_START; 212 + end_marker[3] = GG_ADAM7_3_FLOAT_END; 213 + start_marker[4] = GG_ADAM7_4_FLOAT_START; 214 + end_marker[4] = GG_ADAM7_4_FLOAT_END; 215 + start_marker[5] = GG_ADAM7_5_FLOAT_START; 216 + end_marker[5] = GG_ADAM7_5_FLOAT_END; 217 + start_marker[6] = GG_ADAM7_6_FLOAT_START; 218 + end_marker[6] = GG_ADAM7_6_FLOAT_END; 219 + } 220 + else 221 + { 222 + start_marker[0] = GG_ADAM7_0_DOUBLE_START; 223 + end_marker[0] = GG_ADAM7_0_DOUBLE_END; 224 + start_marker[1] = GG_ADAM7_1_DOUBLE_START; 225 + end_marker[1] = GG_ADAM7_1_DOUBLE_END; 226 + start_marker[2] = GG_ADAM7_2_DOUBLE_START; 227 + end_marker[2] = GG_ADAM7_2_DOUBLE_END; 228 + start_marker[3] = GG_ADAM7_3_DOUBLE_START; 229 + end_marker[3] = GG_ADAM7_3_DOUBLE_END; 230 + start_marker[4] = GG_ADAM7_4_DOUBLE_START; 231 + end_marker[4] = GG_ADAM7_4_DOUBLE_END; 232 + start_marker[5] = GG_ADAM7_5_DOUBLE_START; 233 + end_marker[5] = GG_ADAM7_5_DOUBLE_END; 234 + start_marker[6] = GG_ADAM7_6_DOUBLE_START; 235 + end_marker[6] = GG_ADAM7_6_DOUBLE_END; 236 + } 237 + break; 238 + }; 239 + break; 240 + }; 241 + 242 + for (i = 0; i < 7; i++) 243 + { 244 + /* Adam7 steps */ 245 + switch (i) 246 + { 247 + case 0: 248 + x_base = 0; 249 + y_base = 0; 250 + x_step = 8; 251 + y_step = 8; 252 + break; 253 + case 1: 254 + x_base = 4; 255 + y_base = 0; 256 + x_step = 8; 257 + y_step = 8; 258 + break; 259 + case 2: 260 + x_base = 0; 261 + y_base = 4; 262 + x_step = 4; 263 + y_step = 8; 264 + break; 265 + case 3: 266 + x_base = 2; 267 + y_base = 0; 268 + x_step = 4; 269 + y_step = 4; 270 + break; 271 + case 4: 272 + x_base = 0; 273 + y_base = 2; 274 + x_step = 2; 275 + y_step = 4; 276 + break; 277 + case 5: 278 + x_base = 1; 279 + y_base = 0; 280 + x_step = 2; 281 + y_step = 2; 282 + break; 283 + case 6: 284 + x_base = 0; 285 + y_base = 1; 286 + x_step = 1; 287 + y_step = 2; 288 + break; 289 + }; 290 + out_width = (img->width - x_base) / x_step; 291 + if ((out_width * x_step) < (img->width - x_base)) 292 + out_width++; 293 + out_height = (img->height - y_base) / y_step; 294 + if ((out_height * y_step) < (img->height - y_base)) 295 + out_height++; 296 + scanline_width = out_width * pixel_size; 297 + size = out_height * scanline_width; 298 + size += 4 * sizeof (short); 299 + out = malloc (size); 300 + if (!out) 301 + goto stop; 302 + mem_bufs[i] = out; 303 + mem_buf_sizes[i] = size; 304 + p_out = out; 305 + /* 306 + * tiles are alternatively encoded as LITTLE or BIG-ENDIAN 307 + * in order to ensure an arch-neutral approach 308 + */ 309 + if (i == 0 || i == 2 || i == 4 || i == 6) 310 + endian = 0; 311 + else 312 + endian = 1; 313 + gg_export_int16 (start_marker[i], p_out, endian, endian_arch); 314 + p_out += sizeof (short); 315 + gg_export_int16 (out_width, p_out, endian, endian_arch); 316 + p_out += sizeof (short); 317 + gg_export_int16 (out_height, p_out, endian, endian_arch); 318 + p_out += sizeof (short); 319 + for (y = y_base; y < img->height; y += y_step) 320 + { 321 + p_in = 322 + (unsigned char *) (img->pixels) + 323 + (y * img->scanline_width) + (x_base * pixel_size); 324 + for (x = x_base; x < img->width; x += x_step) 325 + { 326 + if (img->pixel_format == GG_PIXEL_GRID) 327 + { 328 + switch (img->sample_format) 329 + { 330 + case GGRAPH_SAMPLE_INT: 331 + if (img->bits_per_sample == 16) 332 + { 333 + short value = *((short *) p_in); 334 + gg_export_int16 (value, p_out, endian, 335 + endian_arch); 336 + p_in += x_step * sizeof (short); 337 + p_out += sizeof (short); 338 + } 339 + else 340 + { 341 + int value = *((int *) p_in); 342 + gg_export_int32 (value, p_out, endian, 343 + endian_arch); 344 + p_in += x_step * sizeof (int); 345 + p_out += sizeof (int); 346 + } 347 + break; 348 + case GGRAPH_SAMPLE_UINT: 349 + if (img->bits_per_sample == 16) 350 + { 351 + unsigned short value = 352 + *((unsigned short *) p_in); 353 + gg_export_uint16 (value, p_out, endian, 354 + endian_arch); 355 + p_in += 356 + x_step * sizeof (unsigned short); 357 + p_out += sizeof (unsigned short); 358 + } 359 + else 360 + { 361 + unsigned int value = 362 + *((unsigned int *) p_in); 363 + gg_export_uint32 (value, p_out, endian, 364 + endian_arch); 365 + p_in += x_step * sizeof (unsigned int); 366 + p_out += sizeof (unsigned int); 367 + } 368 + break; 369 + case GGRAPH_SAMPLE_FLOAT: 370 + if (img->bits_per_sample == 32) 371 + { 372 + float value = *((float *) p_in); 373 + gg_export_float (value, p_out, endian, 374 + endian_arch); 375 + p_in += x_step * sizeof (float); 376 + p_out += sizeof (float); 377 + } 378 + else 379 + { 380 + double value = *((double *) p_in); 381 + gg_export_double (value, p_out, endian, 382 + endian_arch); 383 + p_in += x_step * sizeof (double); 384 + p_out += sizeof (double); 385 + } 386 + break; 387 + }; 388 + } 389 + else 390 + { 391 + memcpy (p_out, p_in, pixel_size); 392 + p_in += x_step * pixel_size; 393 + p_out += pixel_size; 394 + } 395 + } 396 + } 397 + p_out = (unsigned char *) out + size - sizeof (short); 398 + gg_export_int16 (end_marker[i], p_out, endian, endian_arch); 399 + } 400 + 401 + if (is_palette) 402 + { 403 + /* a palette is required */ 404 + size = (3 * img->max_palette) + (2 * sizeof (short)) + 1; 405 + out = malloc (size); 406 + if (out == NULL) 407 + goto stop; 408 + p_out = out; 409 + /* palette markers always are LITTLE-ENDIAN */ 410 + gg_export_int16 (GG_ADAM7_PALETTE_START, p_out, 1, endian_arch); 411 + p_out += sizeof (short); 412 + *p_out++ = (unsigned char) (img->max_palette); 413 + for (i = 0; i < img->max_palette; i++) 414 + { 415 + *p_out++ = img->palette_red[i]; 416 + *p_out++ = img->palette_green[i]; 417 + *p_out++ = img->palette_blue[i]; 418 + } 419 + gg_export_int16 (GG_ADAM7_PALETTE_END, p_out, 1, endian_arch); 420 + *palette = out; 421 + *palette_size = size; 422 + } 423 + 424 + return GGRAPH_OK; 425 + 426 + stop: 427 + for (i = 0; i < 7; i++) 428 + { 429 + if (mem_bufs[i]) 430 + free (mem_bufs[i]); 431 + mem_bufs[i] = NULL; 432 + mem_buf_sizes[i] = 0; 433 + } 434 + return GGRAPH_INSUFFICIENT_MEMORY; 435 +} 436 + 437 +static gGraphImagePtr 438 +adam7_decode (int img_no, void *mem_buf, int mem_buf_size) 439 +{ 440 +/* decoding an Adam7 sub-image */ 441 + unsigned char *p_in; 442 + int endian_arch = gg_endian_arch (); 443 + int endian; 444 + short start_signature; 445 + short end_signature; 446 + short width; 447 + short height; 448 + int x; 449 + int y; 450 + int pixel_format = GG_PIXEL_UNKNOWN; 451 + int sample_format; 452 + int bits_per_sample; 453 + int samples_per_pixel = 1; 454 + int size; 455 + gGraphImagePtr img = NULL; 456 + 457 + if (mem_buf_size < (int) (sizeof (short) * 4)) 458 + return NULL; 459 +/* 460 +* tiles are alternatively encoded as LITTLE or BIG-ENDIAN 461 +* in order to ensure an arch-neutral approach 462 +*/ 463 + if (img_no == 0 || img_no == 2 || img_no == 4 || img_no == 6) 464 + endian = 0; 465 + else 466 + endian = 1; 467 + 468 +/* checking signatures */ 469 + p_in = mem_buf; 470 + start_signature = gg_import_int16 (p_in, endian, endian_arch); 471 + p_in = (unsigned char *) mem_buf + mem_buf_size - sizeof (short); 472 + end_signature = gg_import_int16 (p_in, endian, endian_arch); 473 + 474 + switch (img_no) 475 + { 476 + case 0: 477 + if (start_signature == GG_ADAM7_0_RGB_START 478 + && end_signature == GG_ADAM7_0_RGB_END) 479 + { 480 + pixel_format = GG_PIXEL_RGB; 481 + sample_format = GGRAPH_SAMPLE_UINT; 482 + bits_per_sample = 8; 483 + samples_per_pixel = 3; 484 + } 485 + if (start_signature == GG_ADAM7_0_GRAYSCALE_START 486 + && end_signature == GG_ADAM7_0_GRAYSCALE_END) 487 + { 488 + pixel_format = GG_PIXEL_GRAYSCALE; 489 + sample_format = GGRAPH_SAMPLE_UINT; 490 + bits_per_sample = 8; 491 + } 492 + if (start_signature == GG_ADAM7_0_PALETTE_START 493 + && end_signature == GG_ADAM7_0_PALETTE_END) 494 + { 495 + pixel_format = GG_PIXEL_PALETTE; 496 + sample_format = GGRAPH_SAMPLE_UINT; 497 + bits_per_sample = 8; 498 + } 499 + if (start_signature == GG_ADAM7_0_INT16_START 500 + && end_signature == GG_ADAM7_0_INT16_END) 501 + { 502 + pixel_format = GG_PIXEL_GRID; 503 + sample_format = GGRAPH_SAMPLE_INT; 504 + bits_per_sample = 16; 505 + } 506 + if (start_signature == GG_ADAM7_0_INT32_START 507 + && end_signature == GG_ADAM7_0_INT32_END) 508 + { 509 + pixel_format = GG_PIXEL_GRID; 510 + sample_format = GGRAPH_SAMPLE_INT; 511 + bits_per_sample = 32; 512 + } 513 + if (start_signature == GG_ADAM7_0_UINT16_START 514 + && end_signature == GG_ADAM7_0_UINT16_END) 515 + { 516 + pixel_format = GG_PIXEL_GRID; 517 + sample_format = GGRAPH_SAMPLE_UINT; 518 + bits_per_sample = 16; 519 + } 520 + if (start_signature == GG_ADAM7_0_UINT32_START 521 + && end_signature == GG_ADAM7_0_UINT32_END) 522 + { 523 + pixel_format = GG_PIXEL_GRID; 524 + sample_format = GGRAPH_SAMPLE_UINT; 525 + bits_per_sample = 32; 526 + } 527 + if (start_signature == GG_ADAM7_0_FLOAT_START 528 + && end_signature == GG_ADAM7_0_FLOAT_END) 529 + { 530 + pixel_format = GG_PIXEL_GRID; 531 + sample_format = GGRAPH_SAMPLE_FLOAT; 532 + bits_per_sample = 32; 533 + } 534 + if (start_signature == GG_ADAM7_0_DOUBLE_START 535 + && end_signature == GG_ADAM7_0_DOUBLE_END) 536 + { 537 + pixel_format = GG_PIXEL_GRID; 538 + sample_format = GGRAPH_SAMPLE_FLOAT; 539 + bits_per_sample = 64; 540 + } 541 + break; 542 + case 1: 543 + if (start_signature == GG_ADAM7_1_RGB_START 544 + && end_signature == GG_ADAM7_1_RGB_END) 545 + { 546 + pixel_format = GG_PIXEL_RGB; 547 + sample_format = GGRAPH_SAMPLE_UINT; 548 + bits_per_sample = 8; 549 + samples_per_pixel = 3; 550 + } 551 + if (start_signature == GG_ADAM7_1_GRAYSCALE_START 552 + && end_signature == GG_ADAM7_1_GRAYSCALE_END) 553 + { 554 + pixel_format = GG_PIXEL_GRAYSCALE; 555 + sample_format = GGRAPH_SAMPLE_UINT; 556 + bits_per_sample = 8; 557 + } 558 + if (start_signature == GG_ADAM7_1_PALETTE_START 559 + && end_signature == GG_ADAM7_1_PALETTE_END) 560 + { 561 + pixel_format = GG_PIXEL_PALETTE; 562 + sample_format = GGRAPH_SAMPLE_UINT; 563 + bits_per_sample = 8; 564 + } 565 + if (start_signature == GG_ADAM7_1_INT16_START 566 + && end_signature == GG_ADAM7_1_INT16_END) 567 + { 568 + pixel_format = GG_PIXEL_GRID; 569 + sample_format = GGRAPH_SAMPLE_INT; 570 + bits_per_sample = 16; 571 + } 572 + if (start_signature == GG_ADAM7_1_INT32_START 573 + && end_signature == GG_ADAM7_1_INT32_END) 574 + { 575 + pixel_format = GG_PIXEL_GRID; 576 + sample_format = GGRAPH_SAMPLE_INT; 577 + bits_per_sample = 32; 578 + } 579 + if (start_signature == GG_ADAM7_1_UINT16_START 580 + && end_signature == GG_ADAM7_1_UINT16_END) 581 + { 582 + pixel_format = GG_PIXEL_GRID; 583 + sample_format = GGRAPH_SAMPLE_UINT; 584 + bits_per_sample = 16; 585 + } 586 + if (start_signature == GG_ADAM7_1_UINT32_START 587 + && end_signature == GG_ADAM7_1_UINT32_END) 588 + { 589 + pixel_format = GG_PIXEL_GRID; 590 + sample_format = GGRAPH_SAMPLE_UINT; 591 + bits_per_sample = 32; 592 + } 593 + if (start_signature == GG_ADAM7_1_FLOAT_START 594 + && end_signature == GG_ADAM7_1_FLOAT_END) 595 + { 596 + pixel_format = GG_PIXEL_GRID; 597 + sample_format = GGRAPH_SAMPLE_FLOAT; 598 + bits_per_sample = 32; 599 + } 600 + if (start_signature == GG_ADAM7_1_DOUBLE_START 601 + && end_signature == GG_ADAM7_1_DOUBLE_END) 602 + { 603 + pixel_format = GG_PIXEL_GRID; 604 + sample_format = GGRAPH_SAMPLE_FLOAT; 605 + bits_per_sample = 64; 606 + } 607 + break; 608 + case 2: 609 + if (start_signature == GG_ADAM7_2_RGB_START 610 + && end_signature == GG_ADAM7_2_RGB_END) 611 + { 612 + pixel_format = GG_PIXEL_RGB; 613 + sample_format = GGRAPH_SAMPLE_UINT; 614 + bits_per_sample = 8; 615 + samples_per_pixel = 3; 616 + } 617 + if (start_signature == GG_ADAM7_2_GRAYSCALE_START 618 + && end_signature == GG_ADAM7_2_GRAYSCALE_END) 619 + { 620 + pixel_format = GG_PIXEL_GRAYSCALE; 621 + sample_format = GGRAPH_SAMPLE_UINT; 622 + bits_per_sample = 8; 623 + } 624 + if (start_signature == GG_ADAM7_2_PALETTE_START 625 + && end_signature == GG_ADAM7_2_PALETTE_END) 626 + { 627 + pixel_format = GG_PIXEL_PALETTE; 628 + sample_format = GGRAPH_SAMPLE_UINT; 629 + bits_per_sample = 8; 630 + } 631 + if (start_signature == GG_ADAM7_2_INT16_START 632 + && end_signature == GG_ADAM7_2_INT16_END) 633 + { 634 + pixel_format = GG_PIXEL_GRID; 635 + sample_format = GGRAPH_SAMPLE_INT; 636 + bits_per_sample = 16; 637 + } 638 + if (start_signature == GG_ADAM7_2_INT32_START 639 + && end_signature == GG_ADAM7_2_INT32_END) 640 + { 641 + pixel_format = GG_PIXEL_GRID; 642 + sample_format = GGRAPH_SAMPLE_INT; 643 + bits_per_sample = 32; 644 + } 645 + if (start_signature == GG_ADAM7_2_UINT16_START 646 + && end_signature == GG_ADAM7_2_UINT16_END) 647 + { 648 + pixel_format = GG_PIXEL_GRID; 649 + sample_format = GGRAPH_SAMPLE_UINT; 650 + bits_per_sample = 16; 651 + } 652 + if (start_signature == GG_ADAM7_2_UINT32_START 653 + && end_signature == GG_ADAM7_2_UINT32_END) 654 + { 655 + pixel_format = GG_PIXEL_GRID; 656 + sample_format = GGRAPH_SAMPLE_UINT; 657 + bits_per_sample = 32; 658 + } 659 + if (start_signature == GG_ADAM7_2_FLOAT_START 660 + && end_signature == GG_ADAM7_2_FLOAT_END) 661 + { 662 + pixel_format = GG_PIXEL_GRID; 663 + sample_format = GGRAPH_SAMPLE_FLOAT; 664 + bits_per_sample = 32; 665 + } 666 + if (start_signature == GG_ADAM7_2_DOUBLE_START 667 + && end_signature == GG_ADAM7_2_DOUBLE_END) 668 + { 669 + pixel_format = GG_PIXEL_GRID; 670 + sample_format = GGRAPH_SAMPLE_FLOAT; 671 + bits_per_sample = 64; 672 + } 673 + break; 674 + case 3: 675 + if (start_signature == GG_ADAM7_3_RGB_START 676 + && end_signature == GG_ADAM7_3_RGB_END) 677 + { 678 + pixel_format = GG_PIXEL_RGB; 679 + sample_format = GGRAPH_SAMPLE_UINT; 680 + bits_per_sample = 8; 681 + samples_per_pixel = 3; 682 + } 683 + if (start_signature == GG_ADAM7_3_GRAYSCALE_START 684 + && end_signature == GG_ADAM7_3_GRAYSCALE_END) 685 + { 686 + pixel_format = GG_PIXEL_GRAYSCALE; 687 + sample_format = GGRAPH_SAMPLE_UINT; 688 + bits_per_sample = 8; 689 + } 690 + if (start_signature == GG_ADAM7_3_PALETTE_START 691 + && end_signature == GG_ADAM7_3_PALETTE_END) 692 + { 693 + pixel_format = GG_PIXEL_PALETTE; 694 + sample_format = GGRAPH_SAMPLE_UINT; 695 + bits_per_sample = 8; 696 + } 697 + if (start_signature == GG_ADAM7_3_INT16_START 698 + && end_signature == GG_ADAM7_3_INT16_END) 699 + { 700 + pixel_format = GG_PIXEL_GRID; 701 + sample_format = GGRAPH_SAMPLE_INT; 702 + bits_per_sample = 16; 703 + } 704 + if (start_signature == GG_ADAM7_3_INT32_START 705 + && end_signature == GG_ADAM7_3_INT32_END) 706 + { 707 + pixel_format = GG_PIXEL_GRID; 708 + sample_format = GGRAPH_SAMPLE_INT; 709 + bits_per_sample = 32; 710 + } 711 + if (start_signature == GG_ADAM7_3_UINT16_START 712 + && end_signature == GG_ADAM7_3_UINT16_END) 713 + { 714 + pixel_format = GG_PIXEL_GRID; 715 + sample_format = GGRAPH_SAMPLE_UINT; 716 + bits_per_sample = 16; 717 + } 718 + if (start_signature == GG_ADAM7_3_UINT32_START 719 + && end_signature == GG_ADAM7_3_UINT32_END) 720 + { 721 + pixel_format = GG_PIXEL_GRID; 722 + sample_format = GGRAPH_SAMPLE_UINT; 723 + bits_per_sample = 32; 724 + } 725 + if (start_signature == GG_ADAM7_3_FLOAT_START 726 + && end_signature == GG_ADAM7_3_FLOAT_END) 727 + { 728 + pixel_format = GG_PIXEL_GRID; 729 + sample_format = GGRAPH_SAMPLE_FLOAT; 730 + bits_per_sample = 32; 731 + } 732 + if (start_signature == GG_ADAM7_3_DOUBLE_START 733 + && end_signature == GG_ADAM7_3_DOUBLE_END) 734 + { 735 + pixel_format = GG_PIXEL_GRID; 736 + sample_format = GGRAPH_SAMPLE_FLOAT; 737 + bits_per_sample = 64; 738 + } 739 + break; 740 + case 4: 741 + if (start_signature == GG_ADAM7_4_RGB_START 742 + && end_signature == GG_ADAM7_4_RGB_END) 743 + { 744 + pixel_format = GG_PIXEL_RGB; 745 + sample_format = GGRAPH_SAMPLE_UINT; 746 + bits_per_sample = 8; 747 + samples_per_pixel = 3; 748 + } 749 + if (start_signature == GG_ADAM7_4_GRAYSCALE_START 750 + && end_signature == GG_ADAM7_4_GRAYSCALE_END) 751 + { 752 + pixel_format = GG_PIXEL_GRAYSCALE; 753 + sample_format = GGRAPH_SAMPLE_UINT; 754 + bits_per_sample = 8; 755 + } 756 + if (start_signature == GG_ADAM7_4_PALETTE_START 757 + && end_signature == GG_ADAM7_4_PALETTE_END) 758 + { 759 + pixel_format = GG_PIXEL_PALETTE; 760 + sample_format = GGRAPH_SAMPLE_UINT; 761 + bits_per_sample = 8; 762 + } 763 + if (start_signature == GG_ADAM7_4_INT16_START 764 + && end_signature == GG_ADAM7_4_INT16_END) 765 + { 766 + pixel_format = GG_PIXEL_GRID; 767 + sample_format = GGRAPH_SAMPLE_INT; 768 + bits_per_sample = 16; 769 + } 770 + if (start_signature == GG_ADAM7_4_INT32_START 771 + && end_signature == GG_ADAM7_4_INT32_END) 772 + { 773 + pixel_format = GG_PIXEL_GRID; 774 + sample_format = GGRAPH_SAMPLE_INT; 775 + bits_per_sample = 32; 776 + } 777 + if (start_signature == GG_ADAM7_4_UINT16_START 778 + && end_signature == GG_ADAM7_4_UINT16_END) 779 + { 780 + pixel_format = GG_PIXEL_GRID; 781 + sample_format = GGRAPH_SAMPLE_UINT; 782 + bits_per_sample = 16; 783 + } 784 + if (start_signature == GG_ADAM7_4_UINT32_START 785 + && end_signature == GG_ADAM7_4_UINT32_END) 786 + { 787 + pixel_format = GG_PIXEL_GRID; 788 + sample_format = GGRAPH_SAMPLE_UINT; 789 + bits_per_sample = 32; 790 + } 791 + if (start_signature == GG_ADAM7_4_FLOAT_START 792 + && end_signature == GG_ADAM7_4_FLOAT_END) 793 + { 794 + pixel_format = GG_PIXEL_GRID; 795 + sample_format = GGRAPH_SAMPLE_FLOAT; 796 + bits_per_sample = 32; 797 + } 798 + if (start_signature == GG_ADAM7_4_DOUBLE_START 799 + && end_signature == GG_ADAM7_4_DOUBLE_END) 800 + { 801 + pixel_format = GG_PIXEL_GRID; 802 + sample_format = GGRAPH_SAMPLE_FLOAT; 803 + bits_per_sample = 64; 804 + } 805 + break; 806 + case 5: 807 + if (start_signature == GG_ADAM7_5_RGB_START 808 + && end_signature == GG_ADAM7_5_RGB_END) 809 + { 810 + pixel_format = GG_PIXEL_RGB; 811 + sample_format = GGRAPH_SAMPLE_UINT; 812 + bits_per_sample = 8; 813 + samples_per_pixel = 3; 814 + } 815 + if (start_signature == GG_ADAM7_5_GRAYSCALE_START 816 + && end_signature == GG_ADAM7_5_GRAYSCALE_END) 817 + { 818 + pixel_format = GG_PIXEL_GRAYSCALE; 819 + sample_format = GGRAPH_SAMPLE_UINT; 820 + bits_per_sample = 8; 821 + } 822 + if (start_signature == GG_ADAM7_5_PALETTE_START 823 + && end_signature == GG_ADAM7_5_PALETTE_END) 824 + { 825 + pixel_format = GG_PIXEL_PALETTE; 826 + sample_format = GGRAPH_SAMPLE_UINT; 827 + bits_per_sample = 8; 828 + } 829 + if (start_signature == GG_ADAM7_5_INT16_START 830 + && end_signature == GG_ADAM7_5_INT16_END) 831 + { 832 + pixel_format = GG_PIXEL_GRID; 833 + sample_format = GGRAPH_SAMPLE_INT; 834 + bits_per_sample = 16; 835 + } 836 + if (start_signature == GG_ADAM7_5_INT32_START 837 + && end_signature == GG_ADAM7_5_INT32_END) 838 + { 839 + pixel_format = GG_PIXEL_GRID; 840 + sample_format = GGRAPH_SAMPLE_INT; 841 + bits_per_sample = 32; 842 + } 843 + if (start_signature == GG_ADAM7_5_UINT16_START 844 + && end_signature == GG_ADAM7_5_UINT16_END) 845 + { 846 + pixel_format = GG_PIXEL_GRID; 847 + sample_format = GGRAPH_SAMPLE_UINT; 848 + bits_per_sample = 16; 849 + } 850 + if (start_signature == GG_ADAM7_5_UINT32_START 851 + && end_signature == GG_ADAM7_5_UINT32_END) 852 + { 853 + pixel_format = GG_PIXEL_GRID; 854 + sample_format = GGRAPH_SAMPLE_UINT; 855 + bits_per_sample = 32; 856 + } 857 + if (start_signature == GG_ADAM7_5_FLOAT_START 858 + && end_signature == GG_ADAM7_5_FLOAT_END) 859 + { 860 + pixel_format = GG_PIXEL_GRID; 861 + sample_format = GGRAPH_SAMPLE_FLOAT; 862 + bits_per_sample = 32; 863 + } 864 + if (start_signature == GG_ADAM7_5_DOUBLE_START 865 + && end_signature == GG_ADAM7_5_DOUBLE_END) 866 + { 867 + pixel_format = GG_PIXEL_GRID; 868 + sample_format = GGRAPH_SAMPLE_FLOAT; 869 + bits_per_sample = 64; 870 + } 871 + break; 872 + case 6: 873 + if (start_signature == GG_ADAM7_6_RGB_START 874 + && end_signature == GG_ADAM7_6_RGB_END) 875 + { 876 + pixel_format = GG_PIXEL_RGB; 877 + sample_format = GGRAPH_SAMPLE_UINT; 878 + bits_per_sample = 8; 879 + samples_per_pixel = 3; 880 + } 881 + if (start_signature == GG_ADAM7_6_GRAYSCALE_START 882 + && end_signature == GG_ADAM7_6_GRAYSCALE_END) 883 + { 884 + pixel_format = GG_PIXEL_GRAYSCALE; 885 + sample_format = GGRAPH_SAMPLE_UINT; 886 + bits_per_sample = 8; 887 + } 888 + if (start_signature == GG_ADAM7_6_PALETTE_START 889 + && end_signature == GG_ADAM7_6_PALETTE_END) 890 + { 891 + pixel_format = GG_PIXEL_PALETTE; 892 + sample_format = GGRAPH_SAMPLE_UINT; 893 + bits_per_sample = 8; 894 + } 895 + if (start_signature == GG_ADAM7_6_INT16_START 896 + && end_signature == GG_ADAM7_6_INT16_END) 897 + { 898 + pixel_format = GG_PIXEL_GRID; 899 + sample_format = GGRAPH_SAMPLE_INT; 900 + bits_per_sample = 16; 901 + } 902 + if (start_signature == GG_ADAM7_6_INT32_START 903 + && end_signature == GG_ADAM7_6_INT32_END) 904 + { 905 + pixel_format = GG_PIXEL_GRID; 906 + sample_format = GGRAPH_SAMPLE_INT; 907 + bits_per_sample = 32; 908 + } 909 + if (start_signature == GG_ADAM7_6_UINT16_START 910 + && end_signature == GG_ADAM7_6_UINT16_END) 911 + { 912 + pixel_format = GG_PIXEL_GRID; 913 + sample_format = GGRAPH_SAMPLE_UINT; 914 + bits_per_sample = 16; 915 + } 916 + if (start_signature == GG_ADAM7_6_UINT32_START 917 + && end_signature == GG_ADAM7_6_UINT32_END) 918 + { 919 + pixel_format = GG_PIXEL_GRID; 920 + sample_format = GGRAPH_SAMPLE_UINT; 921 + bits_per_sample = 32; 922 + } 923 + if (start_signature == GG_ADAM7_6_FLOAT_START 924 + && end_signature == GG_ADAM7_6_FLOAT_END) 925 + { 926 + pixel_format = GG_PIXEL_GRID; 927 + sample_format = GGRAPH_SAMPLE_FLOAT; 928 + bits_per_sample = 32; 929 + } 930 + if (start_signature == GG_ADAM7_6_DOUBLE_START 931 + && end_signature == GG_ADAM7_6_DOUBLE_END) 932 + { 933 + pixel_format = GG_PIXEL_GRID; 934 + sample_format = GGRAPH_SAMPLE_FLOAT; 935 + bits_per_sample = 64; 936 + } 937 + break; 938 + }; 939 + if (pixel_format == GG_PIXEL_UNKNOWN) 940 + return NULL; 941 + 942 +/* retrieving image dimensions */ 943 + p_in = mem_buf; 944 + p_in += sizeof (short); 945 + width = gg_import_int16 (p_in, endian, endian_arch); 946 + p_in += sizeof (short); 947 + height = gg_import_int16 (p_in, endian, endian_arch); 948 + p_in += sizeof (short); 949 + if (width == 0 || height == 0) 950 + return NULL; 951 + 952 +/* checking the pix-buffer size */ 953 + switch (pixel_format) 954 + { 955 + case GG_PIXEL_RGB: 956 + case GG_PIXEL_GRAYSCALE: 957 + size = width * height * samples_per_pixel; 958 + break; 959 + case GG_PIXEL_PALETTE: 960 + size = width * height; 961 + break; 962 + case GG_PIXEL_GRID: 963 + switch (sample_format) 964 + { 965 + case GGRAPH_SAMPLE_INT: 966 + if (bits_per_sample == 16) 967 + size = width * height * sizeof (short); 968 + else 969 + size = width * height * sizeof (int); 970 + break; 971 + case GGRAPH_SAMPLE_UINT: 972 + if (bits_per_sample == 16) 973 + size = width * height * sizeof (unsigned short); 974 + else 975 + size = width * height * sizeof (unsigned int); 976 + break; 977 + case GGRAPH_SAMPLE_FLOAT: 978 + if (bits_per_sample == 32) 979 + size = width * height * sizeof (float); 980 + else 981 + size = width * height * sizeof (double); 982 + break; 983 + }; 984 + break; 985 + }; 986 + if (size != mem_buf_size - (4 * (int) sizeof (short))) 987 + return NULL; 988 + 989 +/* allocating a new image */ 990 + img = 991 + gg_image_create (pixel_format, width, height, bits_per_sample, 992 + samples_per_pixel, sample_format, NULL, NULL); 993 + if (!img) 994 + return NULL; 995 + 996 + if (pixel_format == GG_PIXEL_GRID) 997 + { 998 + /* extracting GRID-values accordingly to endianness */ 999 + short *p_short = (short *) (img->pixels); 1000 + int *p_int = (int *) (img->pixels); 1001 + unsigned short *p_ushort = (unsigned short *) (img->pixels); 1002 + unsigned int *p_uint = (unsigned int *) (img->pixels); 1003 + float *p_float = (float *) (img->pixels); 1004 + double *p_double = (double *) (img->pixels); 1005 + for (y = 0; y < height; y++) 1006 + { 1007 + for (x = 0; x < width; x++) 1008 + { 1009 + switch (sample_format) 1010 + { 1011 + case GGRAPH_SAMPLE_INT: 1012 + if (bits_per_sample == 16) 1013 + { 1014 + short value = gg_import_int16 (p_in, endian, 1015 + endian_arch); 1016 + p_in += sizeof (short); 1017 + *p_short++ = value; 1018 + } 1019 + else 1020 + { 1021 + int value = gg_import_int32 (p_in, endian, 1022 + endian_arch); 1023 + p_in += sizeof (int); 1024 + *p_int++ = value; 1025 + } 1026 + break; 1027 + case GGRAPH_SAMPLE_UINT: 1028 + if (bits_per_sample == 16) 1029 + { 1030 + unsigned short value = 1031 + gg_import_uint16 (p_in, endian, 1032 + endian_arch); 1033 + p_in += sizeof (unsigned short); 1034 + *p_ushort++ = value; 1035 + } 1036 + else 1037 + { 1038 + unsigned int value = 1039 + gg_import_uint32 (p_in, endian, 1040 + endian_arch); 1041 + p_in += sizeof (unsigned int); 1042 + *p_uint++ = value; 1043 + } 1044 + break; 1045 + case GGRAPH_SAMPLE_FLOAT: 1046 + if (bits_per_sample == 32) 1047 + { 1048 + float value = gg_import_float (p_in, endian, 1049 + endian_arch); 1050 + p_in += sizeof (float); 1051 + *p_float++ = value; 1052 + } 1053 + else 1054 + { 1055 + double value = gg_import_double (p_in, endian, 1056 + endian_arch); 1057 + p_in += sizeof (double); 1058 + *p_double++ = value; 1059 + } 1060 + break; 1061 + }; 1062 + } 1063 + } 1064 + } 1065 + else 1066 + memcpy (img->pixels, p_in, size); 1067 + return img; 1068 +} 1069 + 1070 +static int 1071 +check_adam7_subs (gGraphImagePtr im1, gGraphImagePtr im2) 1072 +{ 1073 +/* checks if two Adam7 images are of the same type */ 1074 + if (im1->pixel_format != im2->pixel_format) 1075 + return 0; 1076 + if (im1->sample_format != im2->sample_format) 1077 + return 0; 1078 + if (im1->samples_per_pixel != im2->samples_per_pixel) 1079 + return 0; 1080 + if (im1->bits_per_sample != im2->bits_per_sample) 1081 + return 0; 1082 + return 1; 1083 +} 1084 + 1085 +static int 1086 +get_adam7_dims_4 (gGraphImagePtr img_0, gGraphImagePtr img_1, 1087 + gGraphImagePtr img_2, int *width, int *height) 1088 +{ 1089 +/* checking/computing Adam7 dimensions [1:4 scale] */ 1090 + int w; 1091 + int h; 1092 + int out_width; 1093 + int out_height; 1094 + 1095 + out_width = (img_0->width * 2) - 1; 1096 + out_height = (img_0->height * 2) - 1; 1097 + 1098 + w = img_1->width * 2; 1099 + h = (img_0->height * 2) - 1; 1100 + if (w > out_width) 1101 + out_width = w; 1102 + if (h > out_height) 1103 + out_height = h; 1104 + 1105 + w = img_2->width; 1106 + h = img_2->height * 2; 1107 + if (w > out_width) 1108 + out_width = w; 1109 + if (h > out_height) 1110 + out_height = h; 1111 + 1112 + *width = out_width; 1113 + *height = out_height; 1114 + return 1; 1115 +} 1116 + 1117 +static int 1118 +get_adam7_dims_2 (gGraphImagePtr img_0, gGraphImagePtr img_1, 1119 + gGraphImagePtr img_2, gGraphImagePtr img_3, 1120 + gGraphImagePtr img_4, int *width, int *height) 1121 +{ 1122 +/* checking/computing Adam7 dimensions [1:2 scale] */ 1123 + int w; 1124 + int h; 1125 + int out_width; 1126 + int out_height; 1127 + 1128 + out_width = (img_0->width * 4) - 3; 1129 + out_height = (img_0->height * 4) - 3; 1130 + 1131 + w = (img_1->width * 4) - 1; 1132 + h = (img_0->height * 4) - 3; 1133 + if (w > out_width) 1134 + out_width = w; 1135 + if (h > out_height) 1136 + out_height = h; 1137 + 1138 + w = (img_2->width * 2) - 1; 1139 + h = (img_2->height * 4) - 1; 1140 + if (w > out_width) 1141 + out_width = w; 1142 + if (h > out_height) 1143 + out_height = h; 1144 + 1145 + w = img_3->width * 2; 1146 + h = (img_3->height * 2) - 1; 1147 + if (w > out_width) 1148 + out_width = w; 1149 + if (h > out_height) 1150 + out_height = h; 1151 + 1152 + w = img_4->width; 1153 + h = img_4->height * 2; 1154 + if (w > out_width) 1155 + out_width = w; 1156 + if (h > out_height) 1157 + out_height = h; 1158 + 1159 + *width = out_width; 1160 + *height = out_height; 1161 + return 1; 1162 +} 1163 + 1164 +static int 1165 +get_adam7_dims_1 (gGraphImagePtr img_0, gGraphImagePtr img_1, 1166 + gGraphImagePtr img_2, gGraphImagePtr img_3, 1167 + gGraphImagePtr img_4, gGraphImagePtr img_5, 1168 + gGraphImagePtr img_6, int *width, int *height) 1169 +{ 1170 +/* computing Adam7 dimensions [1:1 scale] */ 1171 + int w; 1172 + int h; 1173 + int out_width; 1174 + int out_height; 1175 + 1176 + out_width = (img_0->width * 8) - 7; 1177 + out_height = (img_0->height * 8) - 7; 1178 + 1179 + w = (img_1->width * 8) - 3; 1180 + h = (img_0->height * 8) - 7; 1181 + if (w > out_width) 1182 + out_width = w; 1183 + if (h > out_height) 1184 + out_height = h; 1185 + 1186 + w = (img_2->width * 4) - 3; 1187 + h = (img_2->height * 8) - 3; 1188 + if (w > out_width) 1189 + out_width = w; 1190 + if (h > out_height) 1191 + out_height = h; 1192 + 1193 + w = (img_3->width * 4) - 1; 1194 + h = (img_3->height * 4) - 3; 1195 + if (w > out_width) 1196 + out_width = w; 1197 + if (h > out_height) 1198 + out_height = h; 1199 + 1200 + w = (img_4->width * 2) - 1; 1201 + h = (img_4->height * 4) - 1; 1202 + if (w > out_width) 1203 + out_width = w; 1204 + if (h > out_height) 1205 + out_height = h; 1206 + 1207 + w = img_5->width * 2; 1208 + h = (img_5->height * 2) - 1; 1209 + if (w > out_width) 1210 + out_width = w; 1211 + if (h > out_height) 1212 + out_height = h; 1213 + 1214 + w = img_6->width; 1215 + h = img_6->height * 2; 1216 + if (w > out_width) 1217 + out_width = w; 1218 + if (h > out_height) 1219 + out_height = h; 1220 + 1221 + *width = out_width; 1222 + *height = out_height; 1223 + return 1; 1224 +} 1225 + 1226 +static gGraphImagePtr 1227 +merge_adam7_scale_1 (gGraphImagePtr img_0, gGraphImagePtr img_1, 1228 + gGraphImagePtr img_2, gGraphImagePtr img_3, 1229 + gGraphImagePtr img_4, gGraphImagePtr img_5, 1230 + gGraphImagePtr img_6, int width, int height) 1231 +{ 1232 +/* decoding an Adam7 image (1:1) */ 1233 + int x; 1234 + int y; 1235 + unsigned char *p_in; 1236 + unsigned char *p_out; 1237 + gGraphImagePtr img = gg_image_create (img_0->pixel_format, width, height, 1238 + img_0->bits_per_sample, 1239 + img_0->samples_per_pixel, 1240 + img_0->sample_format, NULL, 1241 + NULL); 1242 + if (!img) 1243 + return NULL; 1244 + 1245 +/* expanding SubImage-0 */ 1246 + for (y = 0; y < img_0->height; y++) 1247 + { 1248 + p_in = img_0->pixels + (y * img_0->scanline_width); 1249 + p_out = img->pixels + ((y * 8) * img->scanline_width); 1250 + for (x = 0; x < img_0->width; x++) 1251 + { 1252 + switch (img->pixel_format) 1253 + { 1254 + case GG_PIXEL_RGB: 1255 + *p_out++ = *p_in++; 1256 + *p_out++ = *p_in++; 1257 + *p_out++ = *p_in++; 1258 + p_out += (7 * 3); 1259 + break; 1260 + case GG_PIXEL_GRAYSCALE: 1261 + case GG_PIXEL_PALETTE: 1262 + *p_out = *p_in++; 1263 + p_out += 8; 1264 + break; 1265 + case GG_PIXEL_GRID: 1266 + switch (img_0->pixel_format) 1267 + { 1268 + case GGRAPH_SAMPLE_INT: 1269 + if (img_0->bits_per_sample == 16) 1270 + { 1271 + short *p = (short *) p_in; 1272 + short value = *p; 1273 + p_in += sizeof (short); 1274 + p = (short *) p_out; 1275 + *p = value; 1276 + p_out += sizeof (short) * 8; 1277 + } 1278 + else 1279 + { 1280 + int *p = (int *) p_in; 1281 + int value = *p; 1282 + p_in += sizeof (int); 1283 + p = (int *) p_out; 1284 + *p = value; 1285 + p_out += sizeof (int) * 8; 1286 + } 1287 + break; 1288 + case GGRAPH_SAMPLE_UINT: 1289 + if (img_0->bits_per_sample == 16) 1290 + { 1291 + unsigned short *p = (unsigned short *) p_in; 1292 + unsigned short value = *p; 1293 + p_in += sizeof (unsigned short); 1294 + p = (unsigned short *) p_out; 1295 + *p = value; 1296 + p_out += sizeof (unsigned short) * 8; 1297 + } 1298 + else 1299 + { 1300 + unsigned int *p = (unsigned int *) p_in; 1301 + int value = *p; 1302 + p_in += sizeof (unsigned int); 1303 + p = (unsigned int *) p_out; 1304 + *p = value; 1305 + p_out += sizeof (unsigned int) * 8; 1306 + } 1307 + break; 1308 + case GGRAPH_SAMPLE_FLOAT: 1309 + if (img_0->bits_per_sample == 32) 1310 + { 1311 + float *p = (float *) p_in; 1312 + float value = *p; 1313 + p_in += sizeof (float); 1314 + p = (float *) p_out; 1315 + *p = value; 1316 + p_out += sizeof (float) * 8; 1317 + } 1318 + else 1319 + { 1320 + double *p = (double *) p_in; 1321 + double value = *p; 1322 + p_in += sizeof (double); 1323 + p = (double *) p_out; 1324 + *p = value; 1325 + p_out += sizeof (double) * 8; 1326 + } 1327 + break; 1328 + }; 1329 + break; 1330 + }; 1331 + } 1332 + } 1333 + 1334 +/* expanding SubImage-1 */ 1335 + for (y = 0; y < img_1->height; y++) 1336 + { 1337 + p_in = img_1->pixels + (y * img_1->scanline_width); 1338 + p_out = 1339 + img->pixels + ((y * 8) * img->scanline_width) + 1340 + (4 * img->pixel_size); 1341 + for (x = 0; x < img_1->width; x++) 1342 + { 1343 + switch (img->pixel_format) 1344 + { 1345 + case GG_PIXEL_RGB: 1346 + *p_out++ = *p_in++; 1347 + *p_out++ = *p_in++; 1348 + *p_out++ = *p_in++; 1349 + p_out += (7 * 3); 1350 + break; 1351 + case GG_PIXEL_GRAYSCALE: 1352 + case GG_PIXEL_PALETTE: 1353 + *p_out = *p_in++; 1354 + p_out += 8; 1355 + break; 1356 + case GG_PIXEL_GRID: 1357 + switch (img_0->pixel_format) 1358 + { 1359 + case GGRAPH_SAMPLE_INT: 1360 + if (img_0->bits_per_sample == 16) 1361 + { 1362 + short *p = (short *) p_in; 1363 + short value = *p; 1364 + p_in += sizeof (short); 1365 + p = (short *) p_out; 1366 + *p = value; 1367 + p_out += sizeof (short) * 8; 1368 + } 1369 + else 1370 + { 1371 + int *p = (int *) p_in; 1372 + int value = *p; 1373 + p_in += sizeof (int); 1374 + p = (int *) p_out; 1375 + *p = value; 1376 + p_out += sizeof (int) * 8; 1377 + } 1378 + break; 1379 + case GGRAPH_SAMPLE_UINT: 1380 + if (img_0->bits_per_sample == 16) 1381 + { 1382 + unsigned short *p = (unsigned short *) p_in; 1383 + unsigned short value = *p; 1384 + p_in += sizeof (unsigned short); 1385 + p = (unsigned short *) p_out; 1386 + *p = value; 1387 + p_out += sizeof (unsigned short) * 8; 1388 + } 1389 + else 1390 + { 1391 + unsigned int *p = (unsigned int *) p_in; 1392 + int value = *p; 1393 + p_in += sizeof (unsigned int); 1394 + p = (unsigned int *) p_out; 1395 + *p = value; 1396 + p_out += sizeof (unsigned int) * 8; 1397 + } 1398 + break; 1399 + case GGRAPH_SAMPLE_FLOAT: 1400 + if (img_0->bits_per_sample == 32) 1401 + { 1402 + float *p = (float *) p_in; 1403 + float value = *p; 1404 + p_in += sizeof (float); 1405 + p = (float *) p_out; 1406 + *p = value; 1407 + p_out += sizeof (float) * 8; 1408 + } 1409 + else 1410 + { 1411 + double *p = (double *) p_in; 1412 + double value = *p; 1413 + p_in += sizeof (double); 1414 + p = (double *) p_out; 1415 + *p = value; 1416 + p_out += sizeof (double) * 8; 1417 + } 1418 + break; 1419 + }; 1420 + break; 1421 + }; 1422 + } 1423 + } 1424 + 1425 +/* expanding SubImage-2 */ 1426 + for (y = 0; y < img_2->height; y++) 1427 + { 1428 + p_in = img_2->pixels + (y * img_2->scanline_width); 1429 + p_out = img->pixels + (((y * 8) + 4) * img->scanline_width); 1430 + for (x = 0; x < img_2->width; x++) 1431 + { 1432 + switch (img->pixel_format) 1433 + { 1434 + case GG_PIXEL_RGB: 1435 + *p_out++ = *p_in++; 1436 + *p_out++ = *p_in++; 1437 + *p_out++ = *p_in++; 1438 + p_out += (3 * 3); 1439 + break; 1440 + case GG_PIXEL_GRAYSCALE: 1441 + case GG_PIXEL_PALETTE: 1442 + *p_out = *p_in++; 1443 + p_out += 4; 1444 + break; 1445 + case GG_PIXEL_GRID: 1446 + switch (img_0->pixel_format) 1447 + { 1448 + case GGRAPH_SAMPLE_INT: 1449 + if (img_0->bits_per_sample == 16) 1450 + { 1451 + short *p = (short *) p_in; 1452 + short value = *p; 1453 + p_in += sizeof (short); 1454 + p = (short *) p_out; 1455 + *p = value; 1456 + p_out += sizeof (short) * 4; 1457 + } 1458 + else 1459 + { 1460 + int *p = (int *) p_in; 1461 + int value = *p; 1462 + p_in += sizeof (int); 1463 + p = (int *) p_out; 1464 + *p = value; 1465 + p_out += sizeof (int) * 4; 1466 + } 1467 + break; 1468 + case GGRAPH_SAMPLE_UINT: 1469 + if (img_0->bits_per_sample == 16) 1470 + { 1471 + unsigned short *p = (unsigned short *) p_in; 1472 + unsigned short value = *p; 1473 + p_in += sizeof (unsigned short); 1474 + p = (unsigned short *) p_out; 1475 + *p = value; 1476 + p_out += sizeof (unsigned short) * 4; 1477 + } 1478 + else 1479 + { 1480 + unsigned int *p = (unsigned int *) p_in; 1481 + int value = *p; 1482 + p_in += sizeof (unsigned int); 1483 + p = (unsigned int *) p_out; 1484 + *p = value; 1485 + p_out += sizeof (unsigned int) * 4; 1486 + } 1487 + break; 1488 + case GGRAPH_SAMPLE_FLOAT: 1489 + if (img_0->bits_per_sample == 32) 1490 + { 1491 + float *p = (float *) p_in; 1492 + float value = *p; 1493 + p_in += sizeof (float); 1494 + p = (float *) p_out; 1495 + *p = value; 1496 + p_out += sizeof (float) * 4; 1497 + } 1498 + else 1499 + { 1500 + double *p = (double *) p_in; 1501 + double value = *p; 1502 + p_in += sizeof (double); 1503 + p = (double *) p_out; 1504 + *p = value; 1505 + p_out += sizeof (double) * 4; 1506 + } 1507 + break; 1508 + }; 1509 + break; 1510 + }; 1511 + } 1512 + } 1513 + 1514 +/* expanding SubImage-3 */ 1515 + for (y = 0; y < img_3->height; y++) 1516 + { 1517 + p_in = img_3->pixels + (y * img_3->scanline_width); 1518 + p_out = 1519 + img->pixels + ((y * 4) * img->scanline_width) + 1520 + (2 * img->pixel_size); 1521 + for (x = 0; x < img_3->width; x++) 1522 + { 1523 + switch (img->pixel_format) 1524 + { 1525 + case GG_PIXEL_RGB: 1526 + *p_out++ = *p_in++; 1527 + *p_out++ = *p_in++; 1528 + *p_out++ = *p_in++; 1529 + p_out += (3 * 3); 1530 + break; 1531 + case GG_PIXEL_GRAYSCALE: 1532 + case GG_PIXEL_PALETTE: 1533 + *p_out = *p_in++; 1534 + p_out += 4; 1535 + break; 1536 + case GG_PIXEL_GRID: 1537 + switch (img_0->pixel_format) 1538 + { 1539 + case GGRAPH_SAMPLE_INT: 1540 + if (img_0->bits_per_sample == 16) 1541 + { 1542 + short *p = (short *) p_in; 1543 + short value = *p; 1544 + p_in += sizeof (short); 1545 + p = (short *) p_out; 1546 + *p = value; 1547 + p_out += sizeof (short) * 4; 1548 + } 1549 + else 1550 + { 1551 + int *p = (int *) p_in; 1552 + int value = *p; 1553 + p_in += sizeof (int); 1554 + p = (int *) p_out; 1555 + *p = value; 1556 + p_out += sizeof (int) * 4; 1557 + } 1558 + break; 1559 + case GGRAPH_SAMPLE_UINT: 1560 + if (img_0->bits_per_sample == 16) 1561 + { 1562 + unsigned short *p = (unsigned short *) p_in; 1563 + unsigned short value = *p; 1564 + p_in += sizeof (unsigned short); 1565 + p = (unsigned short *) p_out; 1566 + *p = value; 1567 + p_out += sizeof (unsigned short) * 4; 1568 + } 1569 + else 1570 + { 1571 + unsigned int *p = (unsigned int *) p_in; 1572 + int value = *p; 1573 + p_in += sizeof (unsigned int); 1574 + p = (unsigned int *) p_out; 1575 + *p = value; 1576 + p_out += sizeof (unsigned int) * 4; 1577 + } 1578 + break; 1579 + case GGRAPH_SAMPLE_FLOAT: 1580 + if (img_0->bits_per_sample == 32) 1581 + { 1582 + float *p = (float *) p_in; 1583 + float value = *p; 1584 + p_in += sizeof (float); 1585 + p = (float *) p_out; 1586 + *p = value; 1587 + p_out += sizeof (float) * 4; 1588 + } 1589 + else 1590 + { 1591 + double *p = (double *) p_in; 1592 + double value = *p; 1593 + p_in += sizeof (double); 1594 + p = (double *) p_out; 1595 + *p = value; 1596 + p_out += sizeof (double) * 4; 1597 + } 1598 + break; 1599 + }; 1600 + break; 1601 + }; 1602 + } 1603 + } 1604 + 1605 +/* expanding SubImage-4 */ 1606 + for (y = 0; y < img_4->height; y++) 1607 + { 1608 + p_in = img_4->pixels + (y * img_4->scanline_width); 1609 + p_out = img->pixels + (((y * 4) + 2) * img->scanline_width); 1610 + for (x = 0; x < img_4->width; x++) 1611 + { 1612 + switch (img->pixel_format) 1613 + { 1614 + case GG_PIXEL_RGB: 1615 + *p_out++ = *p_in++; 1616 + *p_out++ = *p_in++; 1617 + *p_out++ = *p_in++; 1618 + p_out += 3; 1619 + break; 1620 + case GG_PIXEL_GRAYSCALE: 1621 + case GG_PIXEL_PALETTE: 1622 + *p_out = *p_in++; 1623 + p_out += 2; 1624 + break; 1625 + case GG_PIXEL_GRID: 1626 + switch (img_0->pixel_format) 1627 + { 1628 + case GGRAPH_SAMPLE_INT: 1629 + if (img_0->bits_per_sample == 16) 1630 + { 1631 + short *p = (short *) p_in; 1632 + short value = *p; 1633 + p_in += sizeof (short); 1634 + p = (short *) p_out; 1635 + *p = value; 1636 + p_out += sizeof (short) * 2; 1637 + } 1638 + else 1639 + { 1640 + int *p = (int *) p_in; 1641 + int value = *p; 1642 + p_in += sizeof (int); 1643 + p = (int *) p_out; 1644 + *p = value; 1645 + p_out += sizeof (int) * 2; 1646 + } 1647 + break; 1648 + case GGRAPH_SAMPLE_UINT: 1649 + if (img_0->bits_per_sample == 16) 1650 + { 1651 + unsigned short *p = (unsigned short *) p_in; 1652 + unsigned short value = *p; 1653 + p_in += sizeof (unsigned short); 1654 + p = (unsigned short *) p_out; 1655 + *p = value; 1656 + p_out += sizeof (unsigned short) * 2; 1657 + } 1658 + else 1659 + { 1660 + unsigned int *p = (unsigned int *) p_in; 1661 + int value = *p; 1662 + p_in += sizeof (unsigned int); 1663 + p = (unsigned int *) p_out; 1664 + *p = value; 1665 + p_out += sizeof (unsigned int) * 2; 1666 + } 1667 + break; 1668 + case GGRAPH_SAMPLE_FLOAT: 1669 + if (img_0->bits_per_sample == 32) 1670 + { 1671 + float *p = (float *) p_in; 1672 + float value = *p; 1673 + p_in += sizeof (float); 1674 + p = (float *) p_out; 1675 + *p = value; 1676 + p_out += sizeof (float) * 2; 1677 + } 1678 + else 1679 + { 1680 + double *p = (double *) p_in; 1681 + double value = *p; 1682 + p_in += sizeof (double); 1683 + p = (double *) p_out; 1684 + *p = value; 1685 + p_out += sizeof (double) * 2; 1686 + } 1687 + break; 1688 + }; 1689 + break; 1690 + }; 1691 + } 1692 + } 1693 + 1694 +/* expanding SubImage-5 */ 1695 + for (y = 0; y < img_5->height; y++) 1696 + { 1697 + p_in = img_5->pixels + (y * img_5->scanline_width); 1698 + p_out = 1699 + img->pixels + ((y * 2) * img->scanline_width) + img->pixel_size; 1700 + for (x = 0; x < img_5->width; x++) 1701 + { 1702 + switch (img->pixel_format) 1703 + { 1704 + case GG_PIXEL_RGB: 1705 + *p_out++ = *p_in++; 1706 + *p_out++ = *p_in++; 1707 + *p_out++ = *p_in++; 1708 + p_out += 3; 1709 + break; 1710 + case GG_PIXEL_GRAYSCALE: 1711 + case GG_PIXEL_PALETTE: 1712 + *p_out = *p_in++; 1713 + p_out += 2; 1714 + break; 1715 + case GG_PIXEL_GRID: 1716 + switch (img_0->pixel_format) 1717 + { 1718 + case GGRAPH_SAMPLE_INT: 1719 + if (img_0->bits_per_sample == 16) 1720 + { 1721 + short *p = (short *) p_in; 1722 + short value = *p; 1723 + p_in += sizeof (short); 1724 + p = (short *) p_out; 1725 + *p = value; 1726 + p_out += sizeof (short) * 2; 1727 + } 1728 + else 1729 + { 1730 + int *p = (int *) p_in; 1731 + int value = *p; 1732 + p_in += sizeof (int); 1733 + p = (int *) p_out; 1734 + *p = value; 1735 + p_out += sizeof (int) * 2; 1736 + } 1737 + break; 1738 + case GGRAPH_SAMPLE_UINT: 1739 + if (img_0->bits_per_sample == 16) 1740 + { 1741 + unsigned short *p = (unsigned short *) p_in; 1742 + unsigned short value = *p; 1743 + p_in += sizeof (unsigned short); 1744 + p = (unsigned short *) p_out; 1745 + *p = value; 1746 + p_out += sizeof (unsigned short) * 2; 1747 + } 1748 + else 1749 + { 1750 + unsigned int *p = (unsigned int *) p_in; 1751 + int value = *p; 1752 + p_in += sizeof (unsigned int); 1753 + p = (unsigned int *) p_out; 1754 + *p = value; 1755 + p_out += sizeof (unsigned int) * 2; 1756 + } 1757 + break; 1758 + case GGRAPH_SAMPLE_FLOAT: 1759 + if (img_0->bits_per_sample == 32) 1760 + { 1761 + float *p = (float *) p_in; 1762 + float value = *p; 1763 + p_in += sizeof (float); 1764 + p = (float *) p_out; 1765 + *p = value; 1766 + p_out += sizeof (float) * 2; 1767 + } 1768 + else 1769 + { 1770 + double *p = (double *) p_in; 1771 + double value = *p; 1772 + p_in += sizeof (double); 1773 + p = (double *) p_out; 1774 + *p = value; 1775 + p_out += sizeof (double) * 2; 1776 + } 1777 + break; 1778 + }; 1779 + break; 1780 + }; 1781 + } 1782 + } 1783 + 1784 +/* expanding SubImage-6 */ 1785 + for (y = 0; y < img_6->height; y++) 1786 + { 1787 + p_in = img_6->pixels + (y * img_6->scanline_width); 1788 + p_out = img->pixels + (((y * 2) + 1) * img->scanline_width); 1789 + for (x = 0; x < img_6->width; x++) 1790 + { 1791 + switch (img->pixel_format) 1792 + { 1793 + case GG_PIXEL_RGB: 1794 + *p_out++ = *p_in++; 1795 + *p_out++ = *p_in++; 1796 + *p_out++ = *p_in++; 1797 + break; 1798 + case GG_PIXEL_GRAYSCALE: 1799 + case GG_PIXEL_PALETTE: 1800 + *p_out++ = *p_in++; 1801 + break; 1802 + case GG_PIXEL_GRID: 1803 + switch (img_0->pixel_format) 1804 + { 1805 + case GGRAPH_SAMPLE_INT: 1806 + if (img_0->bits_per_sample == 16) 1807 + { 1808 + short *p = (short *) p_in; 1809 + short value = *p; 1810 + p_in += sizeof (short); 1811 + p = (short *) p_out; 1812 + *p = value; 1813 + p_out += sizeof (short); 1814 + } 1815 + else 1816 + { 1817 + int *p = (int *) p_in; 1818 + int value = *p; 1819 + p_in += sizeof (int); 1820 + p = (int *) p_out; 1821 + *p = value; 1822 + p_out += sizeof (int); 1823 + } 1824 + break; 1825 + case GGRAPH_SAMPLE_UINT: 1826 + if (img_0->bits_per_sample == 16) 1827 + { 1828 + unsigned short *p = (unsigned short *) p_in; 1829 + unsigned short value = *p; 1830 + p_in += sizeof (unsigned short); 1831 + p = (unsigned short *) p_out; 1832 + *p = value; 1833 + p_out += sizeof (unsigned short); 1834 + } 1835 + else 1836 + { 1837 + unsigned int *p = (unsigned int *) p_in; 1838 + int value = *p; 1839 + p_in += sizeof (unsigned int); 1840 + p = (unsigned int *) p_out; 1841 + *p = value; 1842 + p_out += sizeof (unsigned int); 1843 + } 1844 + break; 1845 + case GGRAPH_SAMPLE_FLOAT: 1846 + if (img_0->bits_per_sample == 32) 1847 + { 1848 + float *p = (float *) p_in; 1849 + float value = *p; 1850 + p_in += sizeof (float); 1851 + p = (float *) p_out; 1852 + *p = value; 1853 + p_out += sizeof (float); 1854 + } 1855 + else 1856 + { 1857 + double *p = (double *) p_in; 1858 + double value = *p; 1859 + p_in += sizeof (double); 1860 + p = (double *) p_out; 1861 + *p = value; 1862 + p_out += sizeof (double); 1863 + } 1864 + break; 1865 + }; 1866 + break; 1867 + }; 1868 + } 1869 + } 1870 + 1871 + return img; 1872 +} 1873 + 1874 +static gGraphImagePtr 1875 +merge_adam7_scale_2 (gGraphImagePtr img_0, gGraphImagePtr img_1, 1876 + gGraphImagePtr img_2, gGraphImagePtr img_3, 1877 + gGraphImagePtr img_4, int width, int height) 1878 +{ 1879 +/* decoding an Adam7 image (1:2) */ 1880 + int x; 1881 + int y; 1882 + unsigned char *p_in; 1883 + unsigned char *p_out; 1884 + gGraphImagePtr img = gg_image_create (img_0->pixel_format, width, height, 1885 + img_0->bits_per_sample, 1886 + img_0->samples_per_pixel, 1887 + img_0->sample_format, NULL, 1888 + NULL); 1889 + if (!img) 1890 + return NULL; 1891 + 1892 +/* expanding SubImage-0 */ 1893 + for (y = 0; y < img_0->height; y++) 1894 + { 1895 + p_in = img_0->pixels + (y * img_0->scanline_width); 1896 + p_out = img->pixels + ((y * 4) * img->scanline_width); 1897 + for (x = 0; x < img_0->width; x++) 1898 + { 1899 + switch (img->pixel_format) 1900 + { 1901 + case GG_PIXEL_RGB: 1902 + *p_out++ = *p_in++; 1903 + *p_out++ = *p_in++; 1904 + *p_out++ = *p_in++; 1905 + p_out += (3 * 3); 1906 + break; 1907 + case GG_PIXEL_GRAYSCALE: 1908 + case GG_PIXEL_PALETTE: 1909 + *p_out = *p_in++; 1910 + p_out += 4; 1911 + break; 1912 + case GG_PIXEL_GRID: 1913 + switch (img_0->pixel_format) 1914 + { 1915 + case GGRAPH_SAMPLE_INT: 1916 + if (img_0->bits_per_sample == 16) 1917 + { 1918 + short *p = (short *) p_in; 1919 + short value = *p; 1920 + p_in += sizeof (short); 1921 + p = (short *) p_out; 1922 + *p = value; 1923 + p_out += sizeof (short) * 4; 1924 + } 1925 + else 1926 + { 1927 + int *p = (int *) p_in; 1928 + int value = *p; 1929 + p_in += sizeof (int); 1930 + p = (int *) p_out; 1931 + *p = value; 1932 + p_out += sizeof (int) * 4; 1933 + } 1934 + break; 1935 + case GGRAPH_SAMPLE_UINT: 1936 + if (img_0->bits_per_sample == 16) 1937 + { 1938 + unsigned short *p = (unsigned short *) p_in; 1939 + unsigned short value = *p; 1940 + p_in += sizeof (unsigned short); 1941 + p = (unsigned short *) p_out; 1942 + *p = value; 1943 + p_out += sizeof (unsigned short) * 4; 1944 + } 1945 + else 1946 + { 1947 + unsigned int *p = (unsigned int *) p_in; 1948 + int value = *p; 1949 + p_in += sizeof (unsigned int); 1950 + p = (unsigned int *) p_out; 1951 + *p = value; 1952 + p_out += sizeof (unsigned int) * 4; 1953 + } 1954 + break; 1955 + case GGRAPH_SAMPLE_FLOAT: 1956 + if (img_0->bits_per_sample == 32) 1957 + { 1958 + float *p = (float *) p_in; 1959 + float value = *p; 1960 + p_in += sizeof (float); 1961 + p = (float *) p_out; 1962 + *p = value; 1963 + p_out += sizeof (float) * 4; 1964 + } 1965 + else 1966 + { 1967 + double *p = (double *) p_in; 1968 + double value = *p; 1969 + p_in += sizeof (double); 1970 + p = (double *) p_out; 1971 + *p = value; 1972 + p_out += sizeof (double) * 4; 1973 + } 1974 + break; 1975 + }; 1976 + break; 1977 + }; 1978 + } 1979 + } 1980 + 1981 +/* expanding SubImage-1 */ 1982 + for (y = 0; y < img_1->height; y++) 1983 + { 1984 + p_in = img_1->pixels + (y * img_1->scanline_width); 1985 + p_out = 1986 + img->pixels + ((y * 4) * img->scanline_width) + 1987 + (2 * img->pixel_size); 1988 + for (x = 0; x < img_1->width; x++) 1989 + { 1990 + switch (img->pixel_format) 1991 + { 1992 + case GG_PIXEL_RGB: 1993 + *p_out++ = *p_in++; 1994 + *p_out++ = *p_in++; 1995 + *p_out++ = *p_in++; 1996 + p_out += (3 * 3); 1997 + break; 1998 + case GG_PIXEL_GRAYSCALE: 1999 + case GG_PIXEL_PALETTE: 2000 + *p_out = *p_in++; 2001 + p_out += 4; 2002 + break; 2003 + case GG_PIXEL_GRID: 2004 + switch (img_0->pixel_format) 2005 + { 2006 + case GGRAPH_SAMPLE_INT: 2007 + if (img_0->bits_per_sample == 16) 2008 + { 2009 + short *p = (short *) p_in; 2010 + short value = *p; 2011 + p_in += sizeof (short); 2012 + p = (short *) p_out; 2013 + *p = value; 2014 + p_out += sizeof (short) * 4; 2015 + } 2016 + else 2017 + { 2018 + int *p = (int *) p_in; 2019 + int value = *p; 2020 + p_in += sizeof (int); 2021 + p = (int *) p_out; 2022 + *p = value; 2023 + p_out += sizeof (int) * 4; 2024 + } 2025 + break; 2026 + case GGRAPH_SAMPLE_UINT: 2027 + if (img_0->bits_per_sample == 16) 2028 + { 2029 + unsigned short *p = (unsigned short *) p_in; 2030 + unsigned short value = *p; 2031 + p_in += sizeof (unsigned short); 2032 + p = (unsigned short *) p_out; 2033 + *p = value; 2034 + p_out += sizeof (unsigned short) * 4; 2035 + } 2036 + else 2037 + { 2038 + unsigned int *p = (unsigned int *) p_in; 2039 + int value = *p; 2040 + p_in += sizeof (unsigned int); 2041 + p = (unsigned int *) p_out; 2042 + *p = value; 2043 + p_out += sizeof (unsigned int) * 4; 2044 + } 2045 + break; 2046 + case GGRAPH_SAMPLE_FLOAT: 2047 + if (img_0->bits_per_sample == 32) 2048 + { 2049 + float *p = (float *) p_in; 2050 + float value = *p; 2051 + p_in += sizeof (float); 2052 + p = (float *) p_out; 2053 + *p = value; 2054 + p_out += sizeof (float) * 4; 2055 + } 2056 + else 2057 + { 2058 + double *p = (double *) p_in; 2059 + double value = *p; 2060 + p_in += sizeof (double); 2061 + p = (double *) p_out; 2062 + *p = value; 2063 + p_out += sizeof (double) * 4; 2064 + } 2065 + break; 2066 + }; 2067 + break; 2068 + }; 2069 + } 2070 + } 2071 + 2072 +/* expanding SubImage-2 */ 2073 + for (y = 0; y < img_2->height; y++) 2074 + { 2075 + p_in = img_2->pixels + (y * img_2->scanline_width); 2076 + p_out = img->pixels + (((y * 4) + 2) * img->scanline_width); 2077 + for (x = 0; x < img_2->width; x++) 2078 + { 2079 + switch (img->pixel_format) 2080 + { 2081 + case GG_PIXEL_RGB: 2082 + *p_out++ = *p_in++; 2083 + *p_out++ = *p_in++; 2084 + *p_out++ = *p_in++; 2085 + p_out += 3; 2086 + break; 2087 + case GG_PIXEL_GRAYSCALE: 2088 + case GG_PIXEL_PALETTE: 2089 + *p_out = *p_in++; 2090 + p_out += 2; 2091 + break; 2092 + case GG_PIXEL_GRID: 2093 + switch (img_0->pixel_format) 2094 + { 2095 + case GGRAPH_SAMPLE_INT: 2096 + if (img_0->bits_per_sample == 16) 2097 + { 2098 + short *p = (short *) p_in; 2099 + short value = *p; 2100 + p_in += sizeof (short); 2101 + p = (short *) p_out; 2102 + *p = value; 2103 + p_out += sizeof (short) * 2; 2104 + } 2105 + else 2106 + { 2107 + int *p = (int *) p_in; 2108 + int value = *p; 2109 + p_in += sizeof (int); 2110 + p = (int *) p_out; 2111 + *p = value; 2112 + p_out += sizeof (int) * 2; 2113 + } 2114 + break; 2115 + case GGRAPH_SAMPLE_UINT: 2116 + if (img_0->bits_per_sample == 16) 2117 + { 2118 + unsigned short *p = (unsigned short *) p_in; 2119 + unsigned short value = *p; 2120 + p_in += sizeof (unsigned short); 2121 + p = (unsigned short *) p_out; 2122 + *p = value; 2123 + p_out += sizeof (unsigned short) * 2; 2124 + } 2125 + else 2126 + { 2127 + unsigned int *p = (unsigned int *) p_in; 2128 + int value = *p; 2129 + p_in += sizeof (unsigned int); 2130 + p = (unsigned int *) p_out; 2131 + *p = value; 2132 + p_out += sizeof (unsigned int) * 2; 2133 + } 2134 + break; 2135 + case GGRAPH_SAMPLE_FLOAT: 2136 + if (img_0->bits_per_sample == 32) 2137 + { 2138 + float *p = (float *) p_in; 2139 + float value = *p; 2140 + p_in += sizeof (float); 2141 + p = (float *) p_out; 2142 + *p = value; 2143 + p_out += sizeof (float) * 2; 2144 + } 2145 + else 2146 + { 2147 + double *p = (double *) p_in; 2148 + double value = *p; 2149 + p_in += sizeof (double); 2150 + p = (double *) p_out; 2151 + *p = value; 2152 + p_out += sizeof (double) * 2; 2153 + } 2154 + break; 2155 + }; 2156 + break; 2157 + }; 2158 + } 2159 + } 2160 + 2161 +/* expanding SubImage-3 */ 2162 + for (y = 0; y < img_3->height; y++) 2163 + { 2164 + p_in = img_3->pixels + (y * img_3->scanline_width); 2165 + p_out = 2166 + img->pixels + ((y * 2) * img->scanline_width) + img->pixel_size; 2167 + for (x = 0; x < img_3->width; x++) 2168 + { 2169 + switch (img->pixel_format) 2170 + { 2171 + case GG_PIXEL_RGB: 2172 + *p_out++ = *p_in++; 2173 + *p_out++ = *p_in++; 2174 + *p_out++ = *p_in++; 2175 + p_out += 3; 2176 + break; 2177 + case GG_PIXEL_GRAYSCALE: 2178 + case GG_PIXEL_PALETTE: 2179 + *p_out = *p_in++; 2180 + p_out += 2; 2181 + break; 2182 + case GG_PIXEL_GRID: 2183 + switch (img_0->pixel_format) 2184 + { 2185 + case GGRAPH_SAMPLE_INT: 2186 + if (img_0->bits_per_sample == 16) 2187 + { 2188 + short *p = (short *) p_in; 2189 + short value = *p; 2190 + p_in += sizeof (short); 2191 + p = (short *) p_out; 2192 + *p = value; 2193 + p_out += sizeof (short) * 2; 2194 + } 2195 + else 2196 + { 2197 + int *p = (int *) p_in; 2198 + int value = *p; 2199 + p_in += sizeof (int); 2200 + p = (int *) p_out; 2201 + *p = value; 2202 + p_out += sizeof (int) * 2; 2203 + } 2204 + break; 2205 + case GGRAPH_SAMPLE_UINT: 2206 + if (img_0->bits_per_sample == 16) 2207 + { 2208 + unsigned short *p = (unsigned short *) p_in; 2209 + unsigned short value = *p; 2210 + p_in += sizeof (unsigned short); 2211 + p = (unsigned short *) p_out; 2212 + *p = value; 2213 + p_out += sizeof (unsigned short) * 2; 2214 + } 2215 + else 2216 + { 2217 + unsigned int *p = (unsigned int *) p_in; 2218 + int value = *p; 2219 + p_in += sizeof (unsigned int); 2220 + p = (unsigned int *) p_out; 2221 + *p = value; 2222 + p_out += sizeof (unsigned int) * 2; 2223 + } 2224 + break; 2225 + case GGRAPH_SAMPLE_FLOAT: 2226 + if (img_0->bits_per_sample == 32) 2227 + { 2228 + float *p = (float *) p_in; 2229 + float value = *p; 2230 + p_in += sizeof (float); 2231 + p = (float *) p_out; 2232 + *p = value; 2233 + p_out += sizeof (float) * 2; 2234 + } 2235 + else 2236 + { 2237 + double *p = (double *) p_in; 2238 + double value = *p; 2239 + p_in += sizeof (double); 2240 + p = (double *) p_out; 2241 + *p = value; 2242 + p_out += sizeof (double) * 2; 2243 + } 2244 + break; 2245 + }; 2246 + break; 2247 + }; 2248 + } 2249 + } 2250 + 2251 +/* expanding SubImage-4 */ 2252 + for (y = 0; y < img_4->height; y++) 2253 + { 2254 + p_in = img_4->pixels + (y * img_4->scanline_width); 2255 + p_out = img->pixels + (((y * 2) + 1) * img->scanline_width); 2256 + for (x = 0; x < img_4->width; x++) 2257 + { 2258 + switch (img->pixel_format) 2259 + { 2260 + case GG_PIXEL_RGB: 2261 + *p_out++ = *p_in++; 2262 + *p_out++ = *p_in++; 2263 + *p_out++ = *p_in++; 2264 + break; 2265 + case GG_PIXEL_GRAYSCALE: 2266 + case GG_PIXEL_PALETTE: 2267 + *p_out++ = *p_in++; 2268 + break; 2269 + case GG_PIXEL_GRID: 2270 + switch (img_0->pixel_format) 2271 + { 2272 + case GGRAPH_SAMPLE_INT: 2273 + if (img_0->bits_per_sample == 16) 2274 + { 2275 + short *p = (short *) p_in; 2276 + short value = *p; 2277 + p_in += sizeof (short); 2278 + p = (short *) p_out; 2279 + *p = value; 2280 + p_out += sizeof (short); 2281 + } 2282 + else 2283 + { 2284 + int *p = (int *) p_in; 2285 + int value = *p; 2286 + p_in += sizeof (int); 2287 + p = (int *) p_out; 2288 + *p = value; 2289 + p_out += sizeof (int); 2290 + } 2291 + break; 2292 + case GGRAPH_SAMPLE_UINT: 2293 + if (img_0->bits_per_sample == 16) 2294 + { 2295 + unsigned short *p = (unsigned short *) p_in; 2296 + unsigned short value = *p; 2297 + p_in += sizeof (unsigned short); 2298 + p = (unsigned short *) p_out; 2299 + *p = value; 2300 + p_out += sizeof (unsigned short); 2301 + } 2302 + else 2303 + { 2304 + unsigned int *p = (unsigned int *) p_in; 2305 + int value = *p; 2306 + p_in += sizeof (unsigned int); 2307 + p = (unsigned int *) p_out; 2308 + *p = value; 2309 + p_out += sizeof (unsigned int); 2310 + } 2311 + break; 2312 + case GGRAPH_SAMPLE_FLOAT: 2313 + if (img_0->bits_per_sample == 32) 2314 + { 2315 + float *p = (float *) p_in; 2316 + float value = *p; 2317 + p_in += sizeof (float); 2318 + p = (float *) p_out; 2319 + *p = value; 2320 + p_out += sizeof (float); 2321 + } 2322 + else 2323 + { 2324 + double *p = (double *) p_in; 2325 + double value = *p; 2326 + p_in += sizeof (double); 2327 + p = (double *) p_out; 2328 + *p = value; 2329 + p_out += sizeof (double); 2330 + } 2331 + break; 2332 + }; 2333 + break; 2334 + }; 2335 + } 2336 + } 2337 + 2338 + return img; 2339 +} 2340 + 2341 +static gGraphImagePtr 2342 +merge_adam7_scale_4 (gGraphImagePtr img_0, gGraphImagePtr img_1, 2343 + gGraphImagePtr img_2, int width, int height) 2344 +{ 2345 +/* decoding an Adam7 image (1:4) */ 2346 + int x; 2347 + int y; 2348 + unsigned char *p_in; 2349 + unsigned char *p_out; 2350 + gGraphImagePtr img = gg_image_create (img_0->pixel_format, width, height, 2351 + img_0->bits_per_sample, 2352 + img_0->samples_per_pixel, 2353 + img_0->sample_format, NULL, 2354 + NULL); 2355 + if (!img) 2356 + return NULL; 2357 + 2358 +/* expanding SubImage-0 */ 2359 + for (y = 0; y < img_0->height; y++) 2360 + { 2361 + p_in = img_0->pixels + (y * img_0->scanline_width); 2362 + p_out = img->pixels + ((y * 2) * img->scanline_width); 2363 + for (x = 0; x < img_0->width; x++) 2364 + { 2365 + switch (img->pixel_format) 2366 + { 2367 + case GG_PIXEL_RGB: 2368 + *p_out++ = *p_in++; 2369 + *p_out++ = *p_in++; 2370 + *p_out++ = *p_in++; 2371 + p_out += 3; 2372 + break; 2373 + case GG_PIXEL_GRAYSCALE: 2374 + case GG_PIXEL_PALETTE: 2375 + *p_out = *p_in++; 2376 + p_out += 2; 2377 + break; 2378 + case GG_PIXEL_GRID: 2379 + switch (img_0->pixel_format) 2380 + { 2381 + case GGRAPH_SAMPLE_INT: 2382 + if (img_0->bits_per_sample == 16) 2383 + { 2384 + short *p = (short *) p_in; 2385 + short value = *p; 2386 + p_in += sizeof (short); 2387 + p = (short *) p_out; 2388 + *p = value; 2389 + p_out += sizeof (short) * 2; 2390 + } 2391 + else 2392 + { 2393 + int *p = (int *) p_in; 2394 + int value = *p; 2395 + p_in += sizeof (int); 2396 + p = (int *) p_out; 2397 + *p = value; 2398 + p_out += sizeof (int) * 2; 2399 + } 2400 + break; 2401 + case GGRAPH_SAMPLE_UINT: 2402 + if (img_0->bits_per_sample == 16) 2403 + { 2404 + unsigned short *p = (unsigned short *) p_in; 2405 + unsigned short value = *p; 2406 + p_in += sizeof (unsigned short); 2407 + p = (unsigned short *) p_out; 2408 + *p = value; 2409 + p_out += sizeof (unsigned short) * 2; 2410 + } 2411 + else 2412 + { 2413 + unsigned int *p = (unsigned int *) p_in; 2414 + int value = *p; 2415 + p_in += sizeof (unsigned int); 2416 + p = (unsigned int *) p_out; 2417 + *p = value; 2418 + p_out += sizeof (unsigned int) * 2; 2419 + } 2420 + break; 2421 + case GGRAPH_SAMPLE_FLOAT: 2422 + if (img_0->bits_per_sample == 32) 2423 + { 2424 + float *p = (float *) p_in; 2425 + float value = *p; 2426 + p_in += sizeof (float); 2427 + p = (float *) p_out; 2428 + *p = value; 2429 + p_out += sizeof (float) * 2; 2430 + } 2431 + else 2432 + { 2433 + double *p = (double *) p_in; 2434 + double value = *p; 2435 + p_in += sizeof (double); 2436 + p = (double *) p_out; 2437 + *p = value; 2438 + p_out += sizeof (double) * 2; 2439 + } 2440 + break; 2441 + }; 2442 + break; 2443 + }; 2444 + } 2445 + } 2446 + 2447 +/* expanding SubImage-1 */ 2448 + for (y = 0; y < img_1->height; y++) 2449 + { 2450 + p_in = img_1->pixels + (y * img_1->scanline_width); 2451 + p_out = 2452 + img->pixels + ((y * 2) * img->scanline_width) + img->pixel_size; 2453 + for (x = 0; x < img_1->width; x++) 2454 + { 2455 + switch (img->pixel_format) 2456 + { 2457 + case GG_PIXEL_RGB: 2458 + *p_out++ = *p_in++; 2459 + *p_out++ = *p_in++; 2460 + *p_out++ = *p_in++; 2461 + p_out += 3; 2462 + break; 2463 + case GG_PIXEL_GRAYSCALE: 2464 + case GG_PIXEL_PALETTE: 2465 + *p_out = *p_in++; 2466 + p_out += 2; 2467 + break; 2468 + case GG_PIXEL_GRID: 2469 + switch (img_0->pixel_format) 2470 + { 2471 + case GGRAPH_SAMPLE_INT: 2472 + if (img_0->bits_per_sample == 16) 2473 + { 2474 + short *p = (short *) p_in; 2475 + short value = *p; 2476 + p_in += sizeof (short); 2477 + p = (short *) p_out; 2478 + *p = value; 2479 + p_out += sizeof (short) * 2; 2480 + } 2481 + else 2482 + { 2483 + int *p = (int *) p_in; 2484 + int value = *p; 2485 + p_in += sizeof (int); 2486 + p = (int *) p_out; 2487 + *p = value; 2488 + p_out += sizeof (int) * 2; 2489 + } 2490 + break; 2491 + case GGRAPH_SAMPLE_UINT: 2492 + if (img_0->bits_per_sample == 16) 2493 + { 2494 + unsigned short *p = (unsigned short *) p_in; 2495 + unsigned short value = *p; 2496 + p_in += sizeof (unsigned short); 2497 + p = (unsigned short *) p_out; 2498 + *p = value; 2499 + p_out += sizeof (unsigned short) * 2; 2500 + } 2501 + else 2502 + { 2503 + unsigned int *p = (unsigned int *) p_in; 2504 + int value = *p; 2505 + p_in += sizeof (unsigned int); 2506 + p = (unsigned int *) p_out; 2507 + *p = value; 2508 + p_out += sizeof (unsigned int) * 2; 2509 + } 2510 + break; 2511 + case GGRAPH_SAMPLE_FLOAT: 2512 + if (img_0->bits_per_sample == 32) 2513 + { 2514 + float *p = (float *) p_in; 2515 + float value = *p; 2516 + p_in += sizeof (float); 2517 + p = (float *) p_out; 2518 + *p = value; 2519 + p_out += sizeof (float) * 2; 2520 + } 2521 + else 2522 + { 2523 + double *p = (double *) p_in; 2524 + double value = *p; 2525 + p_in += sizeof (double); 2526 + p = (double *) p_out; 2527 + *p = value; 2528 + p_out += sizeof (double) * 2; 2529 + } 2530 + break; 2531 + }; 2532 + break; 2533 + }; 2534 + } 2535 + } 2536 + 2537 +/* expanding SubImage-2 */ 2538 + for (y = 0; y < img_2->height; y++) 2539 + { 2540 + p_in = img_2->pixels + (y * img_2->scanline_width); 2541 + p_out = img->pixels + (((y * 2) + 1) * img->scanline_width); 2542 + for (x = 0; x < img_2->width; x++) 2543 + { 2544 + switch (img->pixel_format) 2545 + { 2546 + case GG_PIXEL_RGB: 2547 + *p_out++ = *p_in++; 2548 + *p_out++ = *p_in++; 2549 + *p_out++ = *p_in++; 2550 + break; 2551 + case GG_PIXEL_GRAYSCALE: 2552 + case GG_PIXEL_PALETTE: 2553 + *p_out++ = *p_in++; 2554 + break; 2555 + case GG_PIXEL_GRID: 2556 + switch (img_0->pixel_format) 2557 + { 2558 + case GGRAPH_SAMPLE_INT: 2559 + if (img_0->bits_per_sample == 16) 2560 + { 2561 + short *p = (short *) p_in; 2562 + short value = *p; 2563 + p_in += sizeof (short); 2564 + p = (short *) p_out; 2565 + *p = value; 2566 + p_out += sizeof (short); 2567 + } 2568 + else 2569 + { 2570 + int *p = (int *) p_in; 2571 + int value = *p; 2572 + p_in += sizeof (int); 2573 + p = (int *) p_out; 2574 + *p = value; 2575 + p_out += sizeof (int); 2576 + } 2577 + break; 2578 + case GGRAPH_SAMPLE_UINT: 2579 + if (img_0->bits_per_sample == 16) 2580 + { 2581 + unsigned short *p = (unsigned short *) p_in; 2582 + unsigned short value = *p; 2583 + p_in += sizeof (unsigned short); 2584 + p = (unsigned short *) p_out; 2585 + *p = value; 2586 + p_out += sizeof (unsigned short); 2587 + } 2588 + else 2589 + { 2590 + unsigned int *p = (unsigned int *) p_in; 2591 + int value = *p; 2592 + p_in += sizeof (unsigned int); 2593 + p = (unsigned int *) p_out; 2594 + *p = value; 2595 + p_out += sizeof (unsigned int); 2596 + } 2597 + break; 2598 + case GGRAPH_SAMPLE_FLOAT: 2599 + if (img_0->bits_per_sample == 32) 2600 + { 2601 + float *p = (float *) p_in; 2602 + float value = *p; 2603 + p_in += sizeof (float); 2604 + p = (float *) p_out; 2605 + *p = value; 2606 + p_out += sizeof (float); 2607 + } 2608 + else 2609 + { 2610 + double *p = (double *) p_in; 2611 + double value = *p; 2612 + p_in += sizeof (double); 2613 + p = (double *) p_out; 2614 + *p = value; 2615 + p_out += sizeof (double); 2616 + } 2617 + break; 2618 + }; 2619 + break; 2620 + }; 2621 + } 2622 + } 2623 + 2624 + return img; 2625 +} 2626 + 2627 +static int 2628 +adam7_set_palette (gGraphImagePtr img, void *palette, int palette_size) 2629 +{ 2630 +/* setting up a palette */ 2631 + unsigned char *p_in; 2632 + int endian_arch = gg_endian_arch (); 2633 + short palette_start; 2634 + short palette_end; 2635 + int i; 2636 + 2637 + if (img->pixel_format != GG_PIXEL_PALETTE) 2638 + return 0; 2639 + 2640 +/* checking signatures */ 2641 + if (palette_size < (int) ((sizeof (short) * 2) + 1)) 2642 + return 0; 2643 + p_in = palette; 2644 + palette_start = gg_import_int16 (p_in, 1, endian_arch); 2645 + p_in = (unsigned char *) palette + palette_size - sizeof (short); 2646 + palette_end = gg_import_int16 (p_in, 1, endian_arch); 2647 + if (palette_start == GG_ADAM7_PALETTE_START 2648 + && palette_end == GG_ADAM7_PALETTE_END) 2649 + ; 2650 + else 2651 + return 0; 2652 + 2653 + p_in = (unsigned char *) palette + sizeof (short); 2654 + img->max_palette = *p_in++; 2655 + for (i = 0; i < img->max_palette; i++) 2656 + { 2657 + img->palette_red[i] = *p_in++; 2658 + img->palette_green[i] = *p_in++; 2659 + img->palette_blue[i] = *p_in++; 2660 + } 2661 + return 1; 2662 +} 2663 + 2664 +GGRAPH_DECLARE int 2665 +gGraphImageFromAdam7 (void *mem_bufs[7], int mem_buf_sizes[7], void *palette, 2666 + int palette_size, const void **image_handle, int scale) 2667 +{ 2668 +/* decoding an image from Adam7 */ 2669 + gGraphImagePtr img_0 = NULL; 2670 + gGraphImagePtr img_1 = NULL; 2671 + gGraphImagePtr img_2 = NULL; 2672 + gGraphImagePtr img_3 = NULL; 2673 + gGraphImagePtr img_4 = NULL; 2674 + gGraphImagePtr img_5 = NULL; 2675 + gGraphImagePtr img_6 = NULL; 2676 + gGraphImagePtr img; 2677 + int width; 2678 + int height; 2679 + 2680 + *image_handle = NULL; 2681 + 2682 +/* checking sub-images */ 2683 + if (scale == 8) 2684 + { 2685 + if (mem_bufs[0] == NULL || mem_buf_sizes[0] <= 0) 2686 + goto stop; 2687 + img_0 = adam7_decode (0, mem_bufs[0], mem_buf_sizes[0]); 2688 + if (!img_0) 2689 + goto stop; 2690 + if (img_0->pixel_format == GG_PIXEL_PALETTE) 2691 + { 2692 + if (!adam7_set_palette (img_0, palette, palette_size)) 2693 + goto stop; 2694 + } 2695 + *image_handle = img_0; 2696 + return GGRAPH_OK; 2697 + } 2698 + else if (scale == 4) 2699 + { 2700 + if (mem_bufs[0] == NULL || mem_buf_sizes[0] <= 0) 2701 + goto stop; 2702 + if (mem_bufs[1] == NULL || mem_buf_sizes[1] <= 0) 2703 + goto stop; 2704 + if (mem_bufs[2] == NULL || mem_buf_sizes[2] <= 0) 2705 + goto stop; 2706 + img_0 = adam7_decode (0, mem_bufs[0], mem_buf_sizes[0]); 2707 + if (!img_0) 2708 + goto stop; 2709 + img_1 = adam7_decode (1, mem_bufs[1], mem_buf_sizes[1]); 2710 + if (!img_1) 2711 + goto stop; 2712 + img_2 = adam7_decode (2, mem_bufs[2], mem_buf_sizes[2]); 2713 + if (!img_2) 2714 + goto stop; 2715 + if (!check_adam7_subs (img_0, img_1)) 2716 + goto stop; 2717 + if (!check_adam7_subs (img_0, img_2)) 2718 + goto stop; 2719 + if (!get_adam7_dims_4 (img_0, img_1, img_2, &width, &height)) 2720 + goto stop; 2721 + img = merge_adam7_scale_4 (img_0, img_1, img_2, width, height); 2722 + if (!img) 2723 + goto stop; 2724 + gGraphDestroyImage (img_0); 2725 + gGraphDestroyImage (img_1); 2726 + gGraphDestroyImage (img_2); 2727 + if (img->pixel_format == GG_PIXEL_PALETTE) 2728 + { 2729 + if (!adam7_set_palette (img, palette, palette_size)) 2730 + goto stop; 2731 + } 2732 + *image_handle = img; 2733 + return GGRAPH_OK; 2734 + } 2735 + else if (scale == 2) 2736 + { 2737 + if (mem_bufs[0] == NULL || mem_buf_sizes[0] <= 0) 2738 + goto stop; 2739 + if (mem_bufs[1] == NULL || mem_buf_sizes[1] <= 0) 2740 + goto stop; 2741 + if (mem_bufs[2] == NULL || mem_buf_sizes[2] <= 0) 2742 + goto stop; 2743 + if (mem_bufs[3] == NULL || mem_buf_sizes[3] <= 0) 2744 + goto stop; 2745 + if (mem_bufs[4] == NULL || mem_buf_sizes[4] <= 0) 2746 + goto stop; 2747 + img_0 = adam7_decode (0, mem_bufs[0], mem_buf_sizes[0]); 2748 + if (!img_0) 2749 + goto stop; 2750 + img_1 = adam7_decode (1, mem_bufs[1], mem_buf_sizes[1]); 2751 + if (!img_1) 2752 + goto stop; 2753 + img_2 = adam7_decode (2, mem_bufs[2], mem_buf_sizes[2]); 2754 + if (!img_2) 2755 + goto stop; 2756 + img_3 = adam7_decode (3, mem_bufs[3], mem_buf_sizes[3]); 2757 + if (!img_3) 2758 + goto stop; 2759 + img_4 = adam7_decode (4, mem_bufs[4], mem_buf_sizes[4]); 2760 + if (!img_4) 2761 + goto stop; 2762 + if (!check_adam7_subs (img_0, img_1)) 2763 + goto stop; 2764 + if (!check_adam7_subs (img_0, img_2)) 2765 + goto stop; 2766 + if (!check_adam7_subs (img_0, img_3)) 2767 + goto stop; 2768 + if (!check_adam7_subs (img_0, img_4)) 2769 + goto stop; 2770 + if (!get_adam7_dims_2 2771 + (img_0, img_1, img_2, img_3, img_4, &width, &height)) 2772 + goto stop; 2773 + img = 2774 + merge_adam7_scale_2 (img_0, img_1, img_2, img_3, img_4, width, 2775 + height); 2776 + if (!img) 2777 + goto stop; 2778 + gGraphDestroyImage (img_0); 2779 + gGraphDestroyImage (img_1); 2780 + gGraphDestroyImage (img_2); 2781 + gGraphDestroyImage (img_3); 2782 + gGraphDestroyImage (img_4); 2783 + if (img->pixel_format == GG_PIXEL_PALETTE) 2784 + { 2785 + if (!adam7_set_palette (img, palette, palette_size)) 2786 + goto stop; 2787 + } 2788 + *image_handle = img; 2789 + return GGRAPH_OK; 2790 + } 2791 + else 2792 + { 2793 + if (mem_bufs[0] == NULL || mem_buf_sizes[0] <= 0) 2794 + goto stop; 2795 + if (mem_bufs[1] == NULL || mem_buf_sizes[1] <= 0) 2796 + goto stop; 2797 + if (mem_bufs[2] == NULL || mem_buf_sizes[2] <= 0) 2798 + goto stop; 2799 + if (mem_bufs[3] == NULL || mem_buf_sizes[3] <= 0) 2800 + goto stop; 2801 + if (mem_bufs[4] == NULL || mem_buf_sizes[4] <= 0) 2802 + goto stop; 2803 + if (mem_bufs[5] == NULL || mem_buf_sizes[5] <= 0) 2804 + goto stop; 2805 + if (mem_bufs[6] == NULL || mem_buf_sizes[6] <= 0) 2806 + goto stop; 2807 + img_0 = adam7_decode (0, mem_bufs[0], mem_buf_sizes[0]); 2808 + if (!img_0) 2809 + goto stop; 2810 + img_1 = adam7_decode (1, mem_bufs[1], mem_buf_sizes[1]); 2811 + if (!img_1) 2812 + goto stop; 2813 + img_2 = adam7_decode (2, mem_bufs[2], mem_buf_sizes[2]); 2814 + if (!img_2) 2815 + goto stop; 2816 + img_3 = adam7_decode (3, mem_bufs[3], mem_buf_sizes[3]); 2817 + if (!img_3) 2818 + goto stop; 2819 + img_4 = adam7_decode (4, mem_bufs[4], mem_buf_sizes[4]); 2820 + if (!img_4) 2821 + goto stop; 2822 + img_5 = adam7_decode (5, mem_bufs[5], mem_buf_sizes[5]); 2823 + if (!img_5) 2824 + goto stop; 2825 + img_6 = adam7_decode (6, mem_bufs[6], mem_buf_sizes[6]); 2826 + if (!img_6) 2827 + goto stop; 2828 + if (!check_adam7_subs (img_0, img_1)) 2829 + goto stop; 2830 + if (!check_adam7_subs (img_0, img_2)) 2831 + goto stop; 2832 + if (!check_adam7_subs (img_0, img_3)) 2833 + goto stop; 2834 + if (!check_adam7_subs (img_0, img_4)) 2835 + goto stop; 2836 + if (!check_adam7_subs (img_0, img_5)) 2837 + goto stop; 2838 + if (!check_adam7_subs (img_0, img_6)) 2839 + goto stop; 2840 + if (!get_adam7_dims_1 2841 + (img_0, img_1, img_2, img_3, img_4, img_5, img_6, &width, 2842 + &height)) 2843 + goto stop; 2844 + img = 2845 + merge_adam7_scale_1 (img_0, img_1, img_2, img_3, img_4, img_5, 2846 + img_6, width, height); 2847 + if (!img) 2848 + goto stop; 2849 + gGraphDestroyImage (img_0); 2850 + gGraphDestroyImage (img_1); 2851 + gGraphDestroyImage (img_2); 2852 + gGraphDestroyImage (img_3); 2853 + gGraphDestroyImage (img_4); 2854 + gGraphDestroyImage (img_5); 2855 + gGraphDestroyImage (img_6); 2856 + if (img->pixel_format == GG_PIXEL_PALETTE) 2857 + { 2858 + if (!adam7_set_palette (img, palette, palette_size)) 2859 + goto stop; 2860 + } 2861 + *image_handle = img; 2862 + return GGRAPH_OK; 2863 + } 2864 + 2865 + stop: 2866 + if (img_0) 2867 + gGraphDestroyImage (img_0); 2868 + if (img_1) 2869 + gGraphDestroyImage (img_1); 2870 + if (img_2) 2871 + gGraphDestroyImage (img_2); 2872 + if (img_3) 2873 + gGraphDestroyImage (img_3); 2874 + if (img_4) 2875 + gGraphDestroyImage (img_4); 2876 + if (img_5) 2877 + gGraphDestroyImage (img_5); 2878 + if (img_6) 2879 + gGraphDestroyImage (img_6); 2880 + return GGRAPH_INVALID_IMAGE; 2881 +} 2882 + 2883 +GGRAPH_DECLARE int 2884 +gGraphImageToMonochrome (const void *ptr_img, void **mem_buf, int *mem_buf_size) 2885 +{ 2886 +/* encoding an image as Monochrome */ 2887 + int line_width; 2888 + int size; 2889 + void *out; 2890 + int endian_arch = gg_endian_arch (); 2891 + unsigned char *p_in; 2892 + unsigned char *p_out; 2893 + int x; 2894 + int y; 2895 + gGraphImagePtr img = (gGraphImagePtr) ptr_img; 2896 + 2897 + *mem_buf = NULL; 2898 + *mem_buf_size = 0; 2899 + 2900 + if (img == NULL) 2901 + return GGRAPH_INVALID_IMAGE; 2902 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 2903 + return GGRAPH_INVALID_IMAGE; 2904 + if (img->pixel_format != GG_PIXEL_PALETTE) 2905 + return GGRAPH_INVALID_IMAGE; 2906 + 2907 + if (img->max_palette != 2) 2908 + return GGRAPH_INVALID_IMAGE; 2909 + if (img->palette_red[0] == 0 && img->palette_green[0] == 0 2910 + && img->palette_blue[0] == 0 && img->palette_red[1] == 255 2911 + && img->palette_green[1] == 255 && img->palette_blue[1] == 255) 2912 + ; 2913 + else if (img->palette_red[0] == 255 && img->palette_green[0] == 255 2914 + && img->palette_blue[0] == 255 && img->palette_red[1] == 0 2915 + && img->palette_green[1] == 0 && img->palette_blue[1] == 0) 2916 + ; 2917 + else 2918 + return GGRAPH_INVALID_IMAGE; 2919 + 2920 + line_width = img->width / 8; 2921 + if ((line_width * 8) < img->width) 2922 + line_width++; 2923 + size = line_width * img->height; 2924 + size += 4 * sizeof (short); 2925 + out = malloc (size); 2926 + if (!out) 2927 + goto stop; 2928 + p_out = out; 2929 + 2930 +/* 2931 +* monochrome tile signatures are encoded as LITTLE-ENDIAN 2932 +* but Width/Height are BID-ENDIAN encoded 2933 +*/ 2934 + gg_export_int16 (GG_MONOCHROME_START, p_out, 1, endian_arch); 2935 + p_out += sizeof (short); 2936 + gg_export_int16 (img->width, p_out, 0, endian_arch); 2937 + p_out += sizeof (short); 2938 + gg_export_int16 (img->height, p_out, 0, endian_arch); 2939 + p_out += sizeof (short); 2940 + 2941 + for (y = 0; y < img->height; y++) 2942 + { 2943 + unsigned char byte = 0x00; 2944 + int pos = 0; 2945 + p_in = img->pixels + (y * img->scanline_width); 2946 + for (x = 0; x < img->width; x++) 2947 + { 2948 + int idx = *p_in++; 2949 + if (img->palette_red[idx] == 0) 2950 + { 2951 + /* handling a black pixel */ 2952 + switch (pos) 2953 + { 2954 + case 0: 2955 + byte |= 0x80; 2956 + break; 2957 + case 1: 2958 + byte |= 0x40; 2959 + break; 2960 + case 2: 2961 + byte |= 0x20; 2962 + break; 2963 + case 3: 2964 + byte |= 0x10; 2965 + break; 2966 + case 4: 2967 + byte |= 0x08; 2968 + break; 2969 + case 5: 2970 + byte |= 0x04; 2971 + break; 2972 + case 6: 2973 + byte |= 0x02; 2974 + break; 2975 + case 7: 2976 + byte |= 0x01; 2977 + break; 2978 + }; 2979 + } 2980 + pos++; 2981 + if (pos > 7) 2982 + { 2983 + /* exporting an octet */ 2984 + *p_out++ = byte; 2985 + byte = 0x00; 2986 + pos = 0; 2987 + } 2988 + } 2989 + if (pos > 0) /* exporting the last octet */ 2990 + *p_out++ = byte; 2991 + } 2992 + gg_export_int16 (GG_MONOCHROME_END, p_out, 1, endian_arch); 2993 + 2994 + *mem_buf = out; 2995 + *mem_buf_size = size; 2996 + return GGRAPH_OK; 2997 + 2998 + stop: 2999 + return GGRAPH_INSUFFICIENT_MEMORY; 3000 +} 3001 + 3002 +GGRAPH_DECLARE int 3003 +gGraphImageFromMonochrome (const void *mem_buf, int mem_buf_size, 3004 + const void **image_handle) 3005 +{ 3006 +/* decoding an image from Monochrome */ 3007 + const unsigned char *p_in; 3008 + int endian_arch = gg_endian_arch (); 3009 + short start_signature; 3010 + short end_signature; 3011 + short width; 3012 + short height; 3013 + int x; 3014 + int y; 3015 + int line_width; 3016 + gGraphImagePtr img; 3017 + 3018 + *image_handle = NULL; 3019 + 3020 + if (mem_buf_size < (int) (sizeof (short) * 4)) 3021 + return GGRAPH_INVALID_IMAGE; 3022 +/* 3023 +* monochrome tile signatures are encoded as LITTLE-ENDIAN 3024 +* but Width/Height are BID-ENDIAN encoded 3025 +*/ 3026 + 3027 +/* checking signatures */ 3028 + p_in = mem_buf; 3029 + start_signature = gg_import_int16 (p_in, 1, endian_arch); 3030 + p_in = (unsigned char *) mem_buf + mem_buf_size - sizeof (short); 3031 + end_signature = gg_import_int16 (p_in, 1, endian_arch); 3032 + if (start_signature == GG_MONOCHROME_START 3033 + && end_signature == GG_MONOCHROME_END) 3034 + ; 3035 + else 3036 + return GGRAPH_INVALID_IMAGE; 3037 + 3038 + p_in = mem_buf; 3039 + p_in += sizeof (short); 3040 + width = gg_import_int16 (p_in, 0, endian_arch); 3041 + p_in += sizeof (short); 3042 + height = gg_import_int16 (p_in, 0, endian_arch); 3043 + p_in += sizeof (short); 3044 + 3045 + line_width = width / 8; 3046 + if ((line_width * 8) < width) 3047 + line_width++; 3048 + if ((line_width * height) != (int) (mem_buf_size - (4 * sizeof (short)))) 3049 + return GGRAPH_INVALID_IMAGE; 3050 + 3051 + img = 3052 + gg_image_create (GG_PIXEL_PALETTE, width, height, 8, 1, 3053 + GGRAPH_SAMPLE_UINT, NULL, NULL); 3054 + if (!img) 3055 + return GGRAPH_INSUFFICIENT_MEMORY; 3056 + 3057 + img->max_palette = 2; 3058 + img->palette_red[0] = 255; 3059 + img->palette_green[0] = 255; 3060 + img->palette_blue[0] = 255; 3061 + img->palette_red[1] = 0; 3062 + img->palette_green[1] = 0; 3063 + img->palette_blue[1] = 0; 3064 + 3065 + for (y = 0; y < height; y++) 3066 + { 3067 + unsigned char byte = 0x00; 3068 + unsigned char px; 3069 + int pixel; 3070 + int pos = 0; 3071 + unsigned char *p_out = img->pixels + (y * img->scanline_width); 3072 + for (x = 0; x < width; x++) 3073 + { 3074 + if (pos == 0) 3075 + byte = *p_in++; 3076 + pixel = 0; 3077 + switch (pos) 3078 + { 3079 + case 0: 3080 + px = byte & 0x80; 3081 + if (px == 0x80) 3082 + pixel = 1; 3083 + break; 3084 + case 1: 3085 + px = byte & 0x40; 3086 + if (px == 0x40) 3087 + pixel = 1; 3088 + break; 3089 + case 2: 3090 + px = byte & 0x20; 3091 + if (px == 0x20) 3092 + pixel = 1; 3093 + break; 3094 + case 3: 3095 + px = byte & 0x10; 3096 + if (px == 0x10) 3097 + pixel = 1; 3098 + break; 3099 + case 4: 3100 + px = byte & 0x08; 3101 + if (px == 0x08) 3102 + pixel = 1; 3103 + break; 3104 + case 5: 3105 + px = byte & 0x04; 3106 + if (px == 0x04) 3107 + pixel = 1; 3108 + break; 3109 + case 6: 3110 + px = byte & 0x02; 3111 + if (px == 0x02) 3112 + pixel = 1; 3113 + break; 3114 + case 7: 3115 + px = byte & 0x01; 3116 + if (px == 0x01) 3117 + pixel = 1; 3118 + break; 3119 + }; 3120 + *p_out++ = pixel; 3121 + pos++; 3122 + if (pos > 7) 3123 + { 3124 + byte = 0x00; 3125 + pos = 0; 3126 + } 3127 + } 3128 + } 3129 + 3130 + *image_handle = img; 3131 + return GGRAPH_OK; 3132 + 3133 +}
Added src/gaiagraphics_aux.c.
1 +/* 2 +/ gaiagraphics_aux.c 3 +/ 4 +/ RAW image helpers 5 +/ 6 +/ version 1.0, 2010 July 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2009 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdlib.h> 28 +#include <stdio.h> 29 +#include <string.h> 30 +#include <float.h> 31 +#include <math.h> 32 + 33 +#include <tiffio.h> 34 + 35 +/* 36 +/ the following patch supporting GeoTiff headers 37 +/ was kindly contributed by Brad Hards: 2011-09-02 38 +*/ 39 +#ifdef HAVE_GEOTIFF_GEOTIFF_H 40 +#include <geotiff/geotiff.h> 41 +#include <geotiff/xtiffio.h> 42 +#include <geotiff/geo_normalize.h> 43 +#include <geotiff/geovalues.h> 44 +#elif HAVE_LIBGEOTIFF_GEOTIFF_H 45 +#include <libgeotiff/geotiff.h> 46 +#include <libgeotiff/xtiffio.h> 47 +#include <libgeotiff/geo_normalize.h> 48 +#include <libgeotiff/geovalues.h> 49 +#else 50 +#include <geotiff.h> 51 +#include <xtiffio.h> 52 +#include <geo_normalize.h> 53 +#include <geovalues.h> 54 +#endif 55 + 56 +#ifdef _WIN32 57 +#include <io.h> 58 +#else 59 +#include <unistd.h> 60 +#endif 61 + 62 +#include "gaiagraphics.h" 63 +#include "gaiagraphics_internals.h" 64 + 65 +GGRAPH_DECLARE const void * 66 +gGraphCreateRgbImage (int width, int height) 67 +{ 68 +/* creating a new RGB image */ 69 + return gg_image_create (GG_PIXEL_RGB, width, height, 8, 3, 70 + GGRAPH_SAMPLE_UINT, NULL, NULL); 71 +} 72 + 73 +GGRAPH_DECLARE const void * 74 +gGraphCreateRgbImageFromBitmap (unsigned char *bitmap, int width, int height) 75 +{ 76 +/* creating a new RGB image */ 77 + return gg_image_create_from_bitmap (bitmap, GG_PIXEL_RGB, width, height, 8, 78 + 3, GGRAPH_SAMPLE_UINT, NULL, NULL); 79 +} 80 + 81 +GGRAPH_DECLARE const void * 82 +gGraphCreateRgbaImage (int width, int height) 83 +{ 84 +/* creating a new RGBA image */ 85 + return gg_image_create (GG_PIXEL_RGBA, width, height, 8, 3, 86 + GGRAPH_SAMPLE_UINT, NULL, NULL); 87 +} 88 + 89 +GGRAPH_DECLARE const void * 90 +gGraphCreateGrayscaleImage (int width, int height) 91 +{ 92 +/* creating a new Grayscale image */ 93 + return gg_image_create (GG_PIXEL_GRAYSCALE, width, height, 8, 1, 94 + GGRAPH_SAMPLE_UINT, NULL, NULL); 95 +} 96 + 97 +GGRAPH_DECLARE const void * 98 +gGraphCreatePaletteImage (int width, int height) 99 +{ 100 +/* creating a new Palette image */ 101 + return gg_image_create (GG_PIXEL_PALETTE, width, height, 8, 1, 102 + GGRAPH_SAMPLE_UINT, NULL, NULL); 103 +} 104 + 105 +GGRAPH_DECLARE const void * 106 +gGraphCreateMonochromeImage (int width, int height) 107 +{ 108 +/* creating a new Monochrome image */ 109 + gGraphImagePtr img = gg_image_create (GG_PIXEL_PALETTE, width, height, 8, 1, 110 + GGRAPH_SAMPLE_UINT, NULL, NULL); 111 + if (!img) 112 + return NULL; 113 + img->palette_red[0] = 255; 114 + img->palette_green[0] = 255; 115 + img->palette_blue[0] = 255; 116 + img->palette_red[1] = 0; 117 + img->palette_green[1] = 0; 118 + img->palette_blue[1] = 0; 119 + img->max_palette = 2; 120 + return img; 121 +} 122 + 123 +GGRAPH_DECLARE const void * 124 +gGraphCreateGridInt16Image (int width, int height) 125 +{ 126 +/* creating a new GRID-INT16 image */ 127 + return gg_image_create (GG_PIXEL_GRID, width, height, 16, 1, 128 + GGRAPH_SAMPLE_INT, NULL, NULL); 129 +} 130 + 131 +GGRAPH_DECLARE const void * 132 +gGraphCreateGridUInt16Image (int width, int height) 133 +{ 134 +/* creating a new GRID-UINT16 image */ 135 + return gg_image_create (GG_PIXEL_GRID, width, height, 16, 1, 136 + GGRAPH_SAMPLE_UINT, NULL, NULL); 137 +} 138 + 139 +GGRAPH_DECLARE const void * 140 +gGraphCreateGridInt32Image (int width, int height) 141 +{ 142 +/* creating a new GRID-INT32 image */ 143 + return gg_image_create (GG_PIXEL_GRID, width, height, 32, 1, 144 + GGRAPH_SAMPLE_INT, NULL, NULL); 145 +} 146 + 147 +GGRAPH_DECLARE const void * 148 +gGraphCreateGridUInt32Image (int width, int height) 149 +{ 150 +/* creating a new GRID-UINT32 image */ 151 + return gg_image_create (GG_PIXEL_GRID, width, height, 32, 1, 152 + GGRAPH_SAMPLE_UINT, NULL, NULL); 153 +} 154 + 155 +GGRAPH_DECLARE const void * 156 +gGraphCreateGridFloatImage (int width, int height) 157 +{ 158 +/* creating a new GRID-FLOAT image */ 159 + return gg_image_create (GG_PIXEL_GRID, width, height, 32, 1, 160 + GGRAPH_SAMPLE_FLOAT, NULL, NULL); 161 +} 162 + 163 +GGRAPH_DECLARE const void * 164 +gGraphCreateGridDoubleImage (int width, int height) 165 +{ 166 +/* creating a new GRID-DOUBLE image */ 167 + return gg_image_create (GG_PIXEL_GRID, width, height, 64, 1, 168 + GGRAPH_SAMPLE_FLOAT, NULL, NULL); 169 +} 170 + 171 +static unsigned char 172 +to_grayscale2 (unsigned char r, unsigned char g, unsigned char b) 173 +{ 174 +/* computing a grayscale value */ 175 + double dval = 176 + (0.3 * (double) r) + (0.59 * (double) g) + (0.11 * (double) b); 177 + int ival = (int) dval; 178 + if (ival < 0) 179 + ival = 0; 180 + if (ival > 255) 181 + ival = 255; 182 + return (unsigned char) ival; 183 +} 184 + 185 +GGRAPH_DECLARE int 186 +gGraphImageBackgroundFill (const void *ptr, unsigned char red, 187 + unsigned char green, unsigned char blue, 188 + unsigned char alpha) 189 +{ 190 +/* filling the image background */ 191 + int x; 192 + int y; 193 + unsigned char *p_out; 194 + gGraphImagePtr img = (gGraphImagePtr) ptr; 195 + 196 + if (img == NULL) 197 + return GGRAPH_INVALID_IMAGE; 198 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 199 + return GGRAPH_INVALID_IMAGE; 200 + 201 + for (y = 0; y < img->height; y++) 202 + { 203 + p_out = img->pixels + (y * img->scanline_width); 204 + for (x = 0; x < img->width; x++) 205 + { 206 + if (img->pixel_format == GG_PIXEL_RGB) 207 + { 208 + *p_out++ = red; 209 + *p_out++ = green; 210 + *p_out++ = blue; 211 + } 212 + if (img->pixel_format == GG_PIXEL_RGBA) 213 + { 214 + *p_out++ = red; 215 + *p_out++ = green; 216 + *p_out++ = blue; 217 + *p_out++ = alpha; 218 + } 219 + if (img->pixel_format == GG_PIXEL_ARGB) 220 + { 221 + *p_out++ = alpha; 222 + *p_out++ = red; 223 + *p_out++ = green; 224 + *p_out++ = blue; 225 + } 226 + if (img->pixel_format == GG_PIXEL_BGR) 227 + { 228 + *p_out++ = blue; 229 + *p_out++ = green; 230 + *p_out++ = red; 231 + } 232 + if (img->pixel_format == GG_PIXEL_BGRA) 233 + { 234 + *p_out++ = blue; 235 + *p_out++ = green; 236 + *p_out++ = red; 237 + *p_out++ = alpha; 238 + } 239 + if (img->pixel_format == GG_PIXEL_GRAYSCALE) 240 + { 241 + int gray; 242 + if (red == green && green == blue) 243 + gray = red; 244 + else 245 + gray = to_grayscale2 (red, green, blue); 246 + *p_out++ = gray; 247 + } 248 + if (img->pixel_format == GG_PIXEL_PALETTE) 249 + *p_out++ = 0; 250 + } 251 + } 252 + if (img->pixel_format == GG_PIXEL_PALETTE) 253 + { 254 + /* resetting an empty palette */ 255 + img->max_palette = 1; 256 + img->palette_red[0] = red; 257 + img->palette_green[0] = green; 258 + img->palette_blue[0] = blue; 259 + } 260 + return GGRAPH_OK; 261 +} 262 + 263 +GGRAPH_DECLARE int 264 +gGraphImageSetTransparentColor (const void *ptr, unsigned char red, 265 + unsigned char green, unsigned char blue) 266 +{ 267 +/* setting the image's transparent color */ 268 + gGraphImagePtr img = (gGraphImagePtr) ptr; 269 + 270 + if (img == NULL) 271 + return GGRAPH_INVALID_IMAGE; 272 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 273 + return GGRAPH_INVALID_IMAGE; 274 + 275 + img->transparent_red = red; 276 + img->transparent_green = green; 277 + img->transparent_blue = blue; 278 + return GGRAPH_OK; 279 +} 280 + 281 +GGRAPH_DECLARE int 282 +gGraphImageGetTransparentColor (const void *ptr, unsigned char *red, 283 + unsigned char *green, unsigned char *blue) 284 +{ 285 +/* querying the image's transparent color */ 286 + gGraphImagePtr img = (gGraphImagePtr) ptr; 287 + 288 + if (img == NULL) 289 + return GGRAPH_INVALID_IMAGE; 290 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 291 + return GGRAPH_INVALID_IMAGE; 292 + 293 + *red = img->transparent_red; 294 + *green = img->transparent_green; 295 + *blue = img->transparent_blue; 296 + return GGRAPH_OK; 297 +} 298 + 299 +GGRAPH_DECLARE int 300 +gGraphGridBackgroundFill (const void *ptr, double no_data_value) 301 +{ 302 +/* filling the image (GRID) background */ 303 + int x; 304 + int y; 305 + unsigned char *p_out; 306 + gGraphImagePtr img = (gGraphImagePtr) ptr; 307 + 308 + if (img == NULL) 309 + return GGRAPH_INVALID_IMAGE; 310 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 311 + return GGRAPH_INVALID_IMAGE; 312 + 313 + for (y = 0; y < img->height; y++) 314 + { 315 + p_out = img->pixels + (y * img->scanline_width); 316 + for (x = 0; x < img->width; x++) 317 + { 318 + if (img->pixel_format == GG_PIXEL_GRID) 319 + { 320 + switch (img->sample_format) 321 + { 322 + case GGRAPH_SAMPLE_INT: 323 + if (img->bits_per_sample == 16) 324 + { 325 + short *p = (short *) p_out; 326 + *p = (short) no_data_value; 327 + p_out += sizeof (short); 328 + } 329 + else 330 + { 331 + int *p = (int *) p_out; 332 + *p = (int) no_data_value; 333 + p_out += sizeof (int); 334 + } 335 + break; 336 + case GGRAPH_SAMPLE_UINT: 337 + if (img->bits_per_sample == 16) 338 + { 339 + unsigned short *p = (unsigned short *) p_out; 340 + *p = (unsigned short) no_data_value; 341 + p_out += sizeof (unsigned short); 342 + } 343 + else 344 + { 345 + unsigned int *p = (unsigned int *) p_out; 346 + *p = (unsigned int) no_data_value; 347 + p_out += sizeof (unsigned int); 348 + } 349 + break; 350 + case GGRAPH_SAMPLE_FLOAT: 351 + if (img->bits_per_sample == 32) 352 + { 353 + float *p = (float *) p_out; 354 + *p = (float) no_data_value; 355 + p_out += sizeof (float); 356 + } 357 + else 358 + { 359 + double *p = (double *) p_out; 360 + *p = no_data_value; 361 + p_out += sizeof (double); 362 + } 363 + break; 364 + }; 365 + } 366 + } 367 + } 368 + return GGRAPH_OK; 369 +} 370 + 371 +GGRAPH_DECLARE int 372 +gGraphImageSetNoDataValue (const void *ptr, double no_data_value) 373 +{ 374 +/* setting the image's NoDataValue */ 375 + gGraphImagePtr img = (gGraphImagePtr) ptr; 376 + 377 + if (img == NULL) 378 + return GGRAPH_INVALID_IMAGE; 379 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 380 + return GGRAPH_INVALID_IMAGE; 381 + 382 + img->no_data_value = no_data_value; 383 + return GGRAPH_OK; 384 +} 385 + 386 +GGRAPH_DECLARE int 387 +gGraphImageGetNoDataValue (const void *ptr, double *no_data_value) 388 +{ 389 +/* querying the image's NoDataValue */ 390 + gGraphImagePtr img = (gGraphImagePtr) ptr; 391 + 392 + if (img == NULL) 393 + return GGRAPH_INVALID_IMAGE; 394 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 395 + return GGRAPH_INVALID_IMAGE; 396 + 397 + *no_data_value = img->no_data_value; 398 + return GGRAPH_OK; 399 +} 400 + 401 +GGRAPH_DECLARE int 402 +gGraphImageInfosFromMemBuf (const void *mem_buf, int mem_buf_size, 403 + int image_type, const void **infos_handle) 404 +{ 405 +/* retrieving Image infos from a memory block containing an encoded image */ 406 + gGraphImageInfosPtr infos = NULL; 407 + int ret; 408 + 409 + *infos_handle = NULL; 410 + switch (image_type) 411 + { 412 + case GGRAPH_IMAGE_GIF: 413 + ret = 414 + gg_image_infos_from_gif (mem_buf_size, mem_buf, 415 + GG_TARGET_IS_MEMORY, &infos); 416 + break; 417 + case GGRAPH_IMAGE_PNG: 418 + ret = 419 + gg_image_infos_from_png (mem_buf_size, mem_buf, 420 + GG_TARGET_IS_MEMORY, &infos); 421 + break; 422 + case GGRAPH_IMAGE_JPEG: 423 + ret = 424 + gg_image_infos_from_jpeg (mem_buf_size, mem_buf, 425 + GG_TARGET_IS_MEMORY, &infos); 426 + break; 427 + case GGRAPH_IMAGE_TIFF: 428 + case GGRAPH_IMAGE_GEOTIFF: 429 + ret = gg_image_infos_from_mem_tiff (mem_buf_size, mem_buf, &infos); 430 + break; 431 + } 432 + if (ret != GGRAPH_OK) 433 + return ret; 434 + 435 + *infos_handle = infos; 436 + return GGRAPH_OK; 437 +} 438 + 439 +GGRAPH_DECLARE int 440 +gGraphImageInfosFromFile (const char *path, int image_type, 441 + const void **infos_handle) 442 +{ 443 +/* retrieving Image infos from file */ 444 + FILE *in = NULL; 445 + gGraphImageInfosPtr infos = NULL; 446 + int ret; 447 + 448 + *infos_handle = NULL; 449 + 450 +/* attempting to open the image file */ 451 + if (image_type == GGRAPH_IMAGE_TIFF || image_type == GGRAPH_IMAGE_GEOTIFF) 452 + ; 453 + else 454 + { 455 + in = fopen (path, "rb"); 456 + if (in == NULL) 457 + return GGRAPH_FILE_OPEN_ERROR; 458 + } 459 + switch (image_type) 460 + { 461 + case GGRAPH_IMAGE_GIF: 462 + ret = gg_image_infos_from_gif (0, in, GG_TARGET_IS_FILE, &infos); 463 + break; 464 + case GGRAPH_IMAGE_PNG: 465 + ret = gg_image_infos_from_png (0, in, GG_TARGET_IS_FILE, &infos); 466 + break; 467 + case GGRAPH_IMAGE_JPEG: 468 + ret = gg_image_infos_from_jpeg (0, in, GG_TARGET_IS_FILE, &infos); 469 + break; 470 + case GGRAPH_IMAGE_TIFF: 471 + ret = gg_image_infos_from_tiff (path, &infos); 472 + break; 473 + case GGRAPH_IMAGE_GEOTIFF: 474 + ret = gg_image_infos_from_geo_tiff (path, &infos); 475 + break; 476 + }; 477 + if (in) 478 + fclose (in); 479 + if (ret != GGRAPH_OK) 480 + return ret; 481 + 482 + *infos_handle = infos; 483 + return GGRAPH_OK; 484 +} 485 + 486 +GGRAPH_DECLARE int 487 +gGraphImageFromMemBuf (const void *mem_buf, int mem_buf_size, int image_type, 488 + const void **image_handle, int scale) 489 +{ 490 +/* decompressing a memory block containing an encoded image */ 491 + gGraphImagePtr img = NULL; 492 + int ret; 493 + 494 + *image_handle = NULL; 495 + switch (image_type) 496 + { 497 + case GGRAPH_IMAGE_GIF: 498 + ret = 499 + gg_image_from_gif (mem_buf_size, mem_buf, GG_TARGET_IS_MEMORY, 500 + &img); 501 + break; 502 + case GGRAPH_IMAGE_PNG: 503 + ret = 504 + gg_image_from_png (mem_buf_size, mem_buf, GG_TARGET_IS_MEMORY, 505 + &img, scale); 506 + break; 507 + case GGRAPH_IMAGE_JPEG: 508 + ret = 509 + gg_image_from_jpeg (mem_buf_size, mem_buf, GG_TARGET_IS_MEMORY, 510 + &img, scale); 511 + break; 512 + case GGRAPH_IMAGE_TIFF: 513 + case GGRAPH_IMAGE_GEOTIFF: 514 + ret = gg_image_from_mem_tiff (mem_buf_size, mem_buf, &img); 515 + break; 516 + } 517 + if (ret != GGRAPH_OK) 518 + return ret; 519 + 520 + *image_handle = img; 521 + return GGRAPH_OK; 522 +} 523 + 524 +GGRAPH_DECLARE int 525 +gGraphImageFromFile (const char *path, int image_type, 526 + const void **image_handle, int scale) 527 +{ 528 +/* reading an image from file */ 529 + FILE *in = NULL; 530 + gGraphImagePtr img = NULL; 531 + int ret; 532 + 533 + *image_handle = NULL; 534 + 535 +/* attempting to open the image file */ 536 + in = fopen (path, "rb"); 537 + if (in == NULL) 538 + return GGRAPH_FILE_OPEN_ERROR; 539 + switch (image_type) 540 + { 541 + case GGRAPH_IMAGE_GIF: 542 + ret = gg_image_from_gif (0, in, GG_TARGET_IS_FILE, &img); 543 + break; 544 + case GGRAPH_IMAGE_PNG: 545 + ret = gg_image_from_png (0, in, GG_TARGET_IS_FILE, &img, scale); 546 + break; 547 + case GGRAPH_IMAGE_JPEG: 548 + ret = gg_image_from_jpeg (0, in, GG_TARGET_IS_FILE, &img, scale); 549 + break; 550 + }; 551 + fclose (in); 552 + if (ret != GGRAPH_OK) 553 + return ret; 554 + 555 + *image_handle = img; 556 + return GGRAPH_OK; 557 +} 558 + 559 +GGRAPH_DECLARE int 560 +gGraphImageFromFileByStrips (const char *path, int image_type, 561 + const void **image_handle) 562 +{ 563 +/* reading an image from file [by strips] */ 564 + FILE *in = NULL; 565 + gGraphStripImagePtr img = NULL; 566 + int ret; 567 + 568 + *image_handle = NULL; 569 + 570 +/* attempting to open the image file */ 571 + if (image_type == GGRAPH_IMAGE_TIFF || image_type == GGRAPH_IMAGE_GEOTIFF) 572 + ; 573 + else 574 + { 575 + in = fopen (path, "rb"); 576 + if (in == NULL) 577 + return GGRAPH_FILE_OPEN_ERROR; 578 + } 579 + switch (image_type) 580 + { 581 + case GGRAPH_IMAGE_PNG: 582 + ret = gg_image_strip_prepare_from_png (in, &img); 583 + break; 584 + case GGRAPH_IMAGE_JPEG: 585 + ret = gg_image_strip_prepare_from_jpeg (in, &img); 586 + break; 587 + case GGRAPH_IMAGE_TIFF: 588 + ret = gg_image_strip_prepare_from_tiff (path, &img); 589 + break; 590 + case GGRAPH_IMAGE_GEOTIFF: 591 + ret = gg_image_strip_prepare_from_geotiff (path, &img); 592 + break; 593 + }; 594 + if (ret != GGRAPH_OK) 595 + { 596 + if (in) 597 + fclose (in); 598 + return ret; 599 + } 600 + 601 + *image_handle = img; 602 + return GGRAPH_OK; 603 +} 604 + 605 +GGRAPH_DECLARE int 606 +gGraphImageFromHgtFileByStrips (const char *path, int lat, int lon, 607 + const void **image_handle) 608 +{ 609 +/* reading an HGT GRID from file [by strips] */ 610 + FILE *in = NULL; 611 + gGraphStripImagePtr img = NULL; 612 + int ret; 613 + 614 + *image_handle = NULL; 615 + 616 +/* attempting to open the image file */ 617 + in = fopen (path, "rb"); 618 + if (in == NULL) 619 + return GGRAPH_FILE_OPEN_ERROR; 620 + ret = gg_image_strip_prepare_from_hgt (in, lat, lon, &img); 621 + if (ret != GGRAPH_OK) 622 + { 623 + if (in) 624 + fclose (in); 625 + return ret; 626 + } 627 + 628 + *image_handle = img; 629 + return GGRAPH_OK; 630 +} 631 + 632 +GGRAPH_DECLARE int 633 +gGraphImageFromBinFileByStrips (const char *path, const char *hdr_path, 634 + const void **image_handle) 635 +{ 636 +/* reading a BIN GRID from file [by strips] */ 637 + FILE *in = NULL; 638 + gGraphStripImagePtr img = NULL; 639 + int ret; 640 + 641 + *image_handle = NULL; 642 + 643 +/* attempting to open the image file */ 644 + in = fopen (path, "rb"); 645 + if (in == NULL) 646 + return GGRAPH_FILE_OPEN_ERROR; 647 + ret = gg_image_strip_prepare_from_bin_hdr (in, hdr_path, &img); 648 + if (ret != GGRAPH_OK) 649 + { 650 + if (in) 651 + fclose (in); 652 + return ret; 653 + } 654 + 655 + *image_handle = img; 656 + return GGRAPH_OK; 657 +} 658 + 659 +GGRAPH_DECLARE int 660 +gGraphImageFromFltFileByStrips (const char *path, const char *hdr_path, 661 + const void **image_handle) 662 +{ 663 +/* reading a FLT GRID from file [by strips] */ 664 + FILE *in = NULL; 665 + gGraphStripImagePtr img = NULL; 666 + int ret; 667 + 668 + *image_handle = NULL; 669 + 670 +/* attempting to open the image file */ 671 + in = fopen (path, "rb"); 672 + if (in == NULL) 673 + return GGRAPH_FILE_OPEN_ERROR; 674 + ret = gg_image_strip_prepare_from_flt_hdr (in, hdr_path, &img); 675 + if (ret != GGRAPH_OK) 676 + { 677 + if (in) 678 + fclose (in); 679 + return ret; 680 + } 681 + 682 + *image_handle = img; 683 + return GGRAPH_OK; 684 +} 685 + 686 +GGRAPH_DECLARE int 687 +gGraphImageFromDemFileByStrips (const char *path, const char *hdr_path, 688 + const void **image_handle) 689 +{ 690 +/* reading a DEM GRID from file [by strips] */ 691 + FILE *in = NULL; 692 + gGraphStripImagePtr img = NULL; 693 + int ret; 694 + 695 + *image_handle = NULL; 696 + 697 +/* attempting to open the image file */ 698 + in = fopen (path, "rb"); 699 + if (in == NULL) 700 + return GGRAPH_FILE_OPEN_ERROR; 701 + ret = gg_image_strip_prepare_from_dem_hdr (in, hdr_path, &img); 702 + if (ret != GGRAPH_OK) 703 + { 704 + if (in) 705 + fclose (in); 706 + return ret; 707 + } 708 + 709 + *image_handle = img; 710 + return GGRAPH_OK; 711 +} 712 + 713 +GGRAPH_DECLARE int 714 +gGraphImageFromAscFileByStrips (const char *path, const void **image_handle) 715 +{ 716 +/* reading a ASCII GRID from file [by strips] */ 717 + FILE *in = NULL; 718 + gGraphStripImagePtr img = NULL; 719 + int ret; 720 + 721 + *image_handle = NULL; 722 + 723 +/* attempting to open the image file */ 724 + in = fopen (path, "rb"); 725 + if (in == NULL) 726 + return GGRAPH_FILE_OPEN_ERROR; 727 + ret = gg_image_strip_prepare_from_ascii_grid (in, &img); 728 + if (ret != GGRAPH_OK) 729 + { 730 + if (in) 731 + fclose (in); 732 + return ret; 733 + } 734 + 735 + *image_handle = img; 736 + return GGRAPH_OK; 737 +} 738 + 739 +GGRAPH_DECLARE int 740 +gGraphCountColors (const char *path, int image_type, int rows_per_block) 741 +{ 742 +/* attempting to count how many different colors are into the given image file */ 743 + FILE *in = NULL; 744 + gGraphStripImagePtr img = NULL; 745 + int num_colors = 0; 746 + int ret; 747 + int x; 748 + int y; 749 + unsigned char *count_array = NULL; 750 + int index; 751 + 752 +/* attempting to open the image file */ 753 + if (image_type == GGRAPH_IMAGE_TIFF || image_type == GGRAPH_IMAGE_GEOTIFF) 754 + ; 755 + else 756 + { 757 + in = fopen (path, "rb"); 758 + if (in == NULL) 759 + return GGRAPH_FILE_OPEN_ERROR; 760 + } 761 + switch (image_type) 762 + { 763 + case GGRAPH_IMAGE_PNG: 764 + ret = gg_image_strip_prepare_from_png (in, &img); 765 + break; 766 + case GGRAPH_IMAGE_JPEG: 767 + ret = gg_image_strip_prepare_from_jpeg (in, &img); 768 + break; 769 + case GGRAPH_IMAGE_TIFF: 770 + ret = gg_image_strip_prepare_from_tiff (path, &img); 771 + break; 772 + case GGRAPH_IMAGE_GEOTIFF: 773 + ret = gg_image_strip_prepare_from_geotiff (path, &img); 774 + break; 775 + }; 776 + if (ret != GGRAPH_OK) 777 + { 778 + if (in) 779 + fclose (in); 780 + return 0; 781 + } 782 + 783 +/* creating the input buffer */ 784 + if (gGraphStripImageAllocPixels (img, rows_per_block) != GGRAPH_OK) 785 + { 786 + gGraphDestroyImage (img); 787 + return 0; 788 + } 789 + 790 +/* creating the count array */ 791 + count_array = malloc (256 * 256 * 256); 792 + if (!count_array) 793 + { 794 + gGraphDestroyImage (img); 795 + return 0; 796 + } 797 + for (index = 0; index < (256 * 256 * 256); index++) 798 + count_array[index] = 0; 799 + 800 + while (1) 801 + { 802 + /* inspecting the image pixels */ 803 + if (gGraphStripImageEOF (img) == GGRAPH_OK) 804 + goto done; 805 + if (gGraphReadNextStrip (img, NULL) != GGRAPH_OK) 806 + goto error; 807 + for (y = 0; y < img->current_available_rows; y++) 808 + { 809 + unsigned char *p_in = img->pixels + (y * img->scanline_width); 810 + for (x = 0; x < img->width; x++) 811 + { 812 + unsigned char red; 813 + unsigned char green; 814 + unsigned char blue; 815 + if (img->pixel_format == GG_PIXEL_RGB) 816 + { 817 + red = *p_in++; 818 + green = *p_in++; 819 + blue = *p_in++; 820 + } 821 + else if (img->pixel_format == GG_PIXEL_RGBA) 822 + { 823 + red = *p_in++; 824 + green = *p_in++; 825 + blue = *p_in++; 826 + p_in++; /* skipping Alpha */ 827 + } 828 + else if (img->pixel_format == GG_PIXEL_RGB) 829 + { 830 + p_in++; /* skipping Alpha */ 831 + red = *p_in++; 832 + green = *p_in++; 833 + blue = *p_in++; 834 + } 835 + else if (img->pixel_format == GG_PIXEL_BGR) 836 + { 837 + blue = *p_in++; 838 + green = *p_in++; 839 + red = *p_in++; 840 + } 841 + else if (img->pixel_format == GG_PIXEL_BGRA) 842 + { 843 + blue = *p_in++; 844 + green = *p_in++; 845 + red = *p_in++; 846 + p_in++; /* skipping Alpha */ 847 + } 848 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 849 + { 850 + red = *p_in++; 851 + green = red; 852 + blue = red; 853 + } 854 + else if (img->pixel_format == GG_PIXEL_PALETTE) 855 + { 856 + index = *p_in++; 857 + red = img->palette_red[index]; 858 + green = img->palette_green[index]; 859 + blue = img->palette_blue[index]; 860 + } 861 + index = (red * 256 * 256) + (green * 256) + blue; 862 + count_array[index] = 1; 863 + } 864 + } 865 + } 866 + 867 + error: 868 + gGraphDestroyImage (img); 869 + if (!count_array) 870 + free (count_array); 871 + return 0; 872 + 873 + done: 874 + for (index = 0; index < (256 * 256 * 256); index++) 875 + { 876 + if (count_array[index]) 877 + num_colors++; 878 + } 879 + gGraphDestroyImage (img); 880 + if (!count_array) 881 + free (count_array); 882 + return num_colors; 883 +} 884 + 885 +GGRAPH_DECLARE int 886 +gGraphImageToJpegFile (const void *ptr, const char *path, int quality) 887 +{ 888 +/* exporting an image into a JPEG compressed file */ 889 + gGraphImagePtr img = (gGraphImagePtr) ptr; 890 + int ret; 891 + FILE *out = NULL; 892 + 893 + if (!img) 894 + return GGRAPH_INVALID_IMAGE; 895 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 896 + return GGRAPH_INVALID_IMAGE; 897 + 898 +/* opening the output image file */ 899 + out = fopen (path, "wb"); 900 + if (out == NULL) 901 + return GGRAPH_FILE_OPEN_ERROR; 902 +/* compressing as JPEG */ 903 + ret = gg_image_to_jpeg (img, NULL, NULL, out, GG_TARGET_IS_FILE, quality); 904 + fclose (out); 905 + if (ret != GGRAPH_OK) 906 + { 907 + /* some unexpected error occurred */ 908 + unlink (path); 909 + return ret; 910 + } 911 + 912 + return GGRAPH_OK; 913 +} 914 + 915 +GGRAPH_DECLARE int 916 +gGraphImageToJpegFileByStrips (const void **ptr, const char *path, int width, 917 + int height, int color_model, int quality) 918 +{ 919 +/* exporting an image into a JPEG compressed file [by strips] */ 920 + gGraphStripImagePtr img; 921 + int ret; 922 + FILE *out = NULL; 923 + 924 + *ptr = NULL; 925 + if (color_model == GGRAPH_COLORSPACE_GRAYSCALE 926 + || color_model == GGRAPH_COLORSPACE_TRUECOLOR) 927 + ; 928 + else 929 + return GGRAPH_INVALID_IMAGE; 930 + 931 +/* opening the output image file */ 932 + out = fopen (path, "wb"); 933 + if (out == NULL) 934 + return GGRAPH_FILE_OPEN_ERROR; 935 + 936 +/* creating a Strip Image */ 937 + if (color_model == GGRAPH_COLORSPACE_GRAYSCALE) 938 + { 939 + img = 940 + gg_strip_image_create (out, GGRAPH_IMAGE_JPEG, GG_PIXEL_GRAYSCALE, 941 + width, height, 8, 1, GGRAPH_SAMPLE_UINT, 942 + NULL, NULL); 943 + if (!img) 944 + { 945 + fclose (out); 946 + unlink (path); 947 + return GGRAPH_INSUFFICIENT_MEMORY; 948 + } 949 + } 950 + if (color_model == GGRAPH_COLORSPACE_TRUECOLOR) 951 + { 952 + img = 953 + gg_strip_image_create (out, GGRAPH_IMAGE_JPEG, GG_PIXEL_RGB, 954 + width, height, 8, 3, GGRAPH_SAMPLE_UINT, 955 + NULL, NULL); 956 + if (!img) 957 + { 958 + fclose (out); 959 + unlink (path); 960 + return GGRAPH_INSUFFICIENT_MEMORY; 961 + } 962 + } 963 + 964 + ret = gg_image_prepare_to_jpeg_by_strip (img, out, quality); 965 + if (ret != GGRAPH_OK) 966 + { 967 + gg_strip_image_destroy (img); 968 + return ret; 969 + } 970 + 971 + *ptr = img; 972 + return GGRAPH_OK; 973 +} 974 + 975 +GGRAPH_DECLARE int 976 +gGraphImageToJpegMemBuf (const void *ptr, void **mem_buf, int *mem_buf_size, 977 + int quality) 978 +{ 979 +/* exporting an image into a JPEG compressed memory buffer */ 980 + gGraphImagePtr img = (gGraphImagePtr) ptr; 981 + void *buf = NULL; 982 + int size; 983 + int ret; 984 + 985 + *mem_buf = NULL; 986 + *mem_buf_size = 0; 987 + if (img == NULL) 988 + return GGRAPH_INVALID_IMAGE; 989 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 990 + return GGRAPH_INVALID_IMAGE; 991 + 992 +/* compressing as JPEG */ 993 + ret = 994 + gg_image_to_jpeg (img, &buf, &size, NULL, GG_TARGET_IS_MEMORY, quality); 995 + if (ret != GGRAPH_OK) 996 + return ret; 997 + 998 +/* exporting the memory buffer */ 999 + *mem_buf = buf; 1000 + *mem_buf_size = size; 1001 + return GGRAPH_OK; 1002 +} 1003 + 1004 +GGRAPH_DECLARE int 1005 +gGraphImageToPngFile (const void *ptr, const char *path, int compression_level, 1006 + int quantization_factor, int interlaced) 1007 +{ 1008 +/* exporting an image into a PNG compressed file */ 1009 + gGraphImagePtr img = (gGraphImagePtr) ptr; 1010 + int ret; 1011 + FILE *out = NULL; 1012 + 1013 + if (!img) 1014 + return GGRAPH_INVALID_IMAGE; 1015 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 1016 + return GGRAPH_INVALID_IMAGE; 1017 + 1018 +/* opening the output image file */ 1019 + out = fopen (path, "wb"); 1020 + if (out == NULL) 1021 + return GGRAPH_FILE_OPEN_ERROR; 1022 +/* compressing as PNG */ 1023 + ret = 1024 + gg_image_to_png (img, NULL, NULL, out, GG_TARGET_IS_FILE, 1025 + compression_level, quantization_factor, interlaced, 0); 1026 + fclose (out); 1027 + if (ret != GGRAPH_OK) 1028 + { 1029 + /* some unexpected error occurred */ 1030 + unlink (path); 1031 + return ret; 1032 + } 1033 + 1034 + return GGRAPH_OK; 1035 +} 1036 + 1037 +GGRAPH_DECLARE int 1038 +gGraphImageToPngFileByStrips (const void **ptr, const char *path, int width, 1039 + int height, int color_model, int bits_per_sample, 1040 + int num_palette, unsigned char *red, 1041 + unsigned char *green, unsigned char *blue, 1042 + int compression_level, int quantization_factor) 1043 +{ 1044 +/* exporting an image into a PNG compressed file [by strips] */ 1045 + gGraphStripImagePtr img; 1046 + int ret; 1047 + int i; 1048 + FILE *out = NULL; 1049 + 1050 + *ptr = NULL; 1051 + if (color_model == GGRAPH_COLORSPACE_PALETTE 1052 + || color_model == GGRAPH_COLORSPACE_GRAYSCALE 1053 + || color_model == GGRAPH_COLORSPACE_TRUECOLOR 1054 + || color_model == GGRAPH_COLORSPACE_TRUECOLOR_ALPHA) 1055 + ; 1056 + else 1057 + return GGRAPH_INVALID_IMAGE; 1058 + 1059 + if (color_model == GGRAPH_COLORSPACE_PALETTE) 1060 + { 1061 + if (num_palette < 1) 1062 + return GGRAPH_INVALID_IMAGE; 1063 + if (bits_per_sample == 1 || bits_per_sample == 2 1064 + || bits_per_sample == 4 || bits_per_sample == 8) 1065 + ; 1066 + else 1067 + return GGRAPH_INVALID_IMAGE; 1068 + if (bits_per_sample == 1 && num_palette > 2) 1069 + return GGRAPH_INVALID_IMAGE; 1070 + if (bits_per_sample == 2 && num_palette > 4) 1071 + return GGRAPH_INVALID_IMAGE; 1072 + if (bits_per_sample == 4 && num_palette > 16) 1073 + return GGRAPH_INVALID_IMAGE; 1074 + if (bits_per_sample == 8 && num_palette > 256) 1075 + return GGRAPH_INVALID_IMAGE; 1076 + } 1077 + if (color_model == GGRAPH_COLORSPACE_GRAYSCALE) 1078 + { 1079 + if (bits_per_sample == 1 || bits_per_sample == 2 1080 + || bits_per_sample == 4 || bits_per_sample == 8) 1081 + ; 1082 + else 1083 + return GGRAPH_INVALID_IMAGE; 1084 + } 1085 + 1086 +/* opening the output image file */ 1087 + out = fopen (path, "wb"); 1088 + if (out == NULL) 1089 + return GGRAPH_FILE_OPEN_ERROR; 1090 + 1091 +/* creating a Strip Image */ 1092 + if (color_model == GGRAPH_COLORSPACE_PALETTE) 1093 + { 1094 + img = 1095 + gg_strip_image_create (out, GGRAPH_IMAGE_PNG, GG_PIXEL_PALETTE, 1096 + width, height, bits_per_sample, 1, 1097 + GGRAPH_SAMPLE_UINT, NULL, NULL); 1098 + if (!img) 1099 + { 1100 + fclose (out); 1101 + unlink (path); 1102 + return GGRAPH_INSUFFICIENT_MEMORY; 1103 + } 1104 + for (i = 0; i < num_palette; i++) 1105 + { 1106 + img->palette_red[i] = red[i]; 1107 + img->palette_green[i] = green[i]; 1108 + img->palette_blue[i] = blue[i]; 1109 + img->max_palette = i + 1; 1110 + } 1111 + } 1112 + if (color_model == GGRAPH_COLORSPACE_GRAYSCALE) 1113 + { 1114 + img = 1115 + gg_strip_image_create (out, GGRAPH_IMAGE_PNG, GG_PIXEL_GRAYSCALE, 1116 + width, height, bits_per_sample, 1, 1117 + GGRAPH_SAMPLE_UINT, NULL, NULL); 1118 + if (!img) 1119 + { 1120 + fclose (out); 1121 + unlink (path); 1122 + return GGRAPH_INSUFFICIENT_MEMORY; 1123 + } 1124 + } 1125 + if (color_model == GGRAPH_COLORSPACE_TRUECOLOR) 1126 + { 1127 + img = 1128 + gg_strip_image_create (out, GGRAPH_IMAGE_PNG, GG_PIXEL_RGB, width, 1129 + height, 8, 3, GGRAPH_SAMPLE_UINT, NULL, 1130 + NULL); 1131 + if (!img) 1132 + { 1133 + fclose (out); 1134 + unlink (path); 1135 + return GGRAPH_INSUFFICIENT_MEMORY; 1136 + } 1137 + } 1138 + if (color_model == GGRAPH_COLORSPACE_TRUECOLOR_ALPHA) 1139 + { 1140 + img = 1141 + gg_strip_image_create (out, GGRAPH_IMAGE_PNG, GG_PIXEL_RGBA, 1142 + width, height, 8, 4, GGRAPH_SAMPLE_UINT, 1143 + NULL, NULL); 1144 + if (!img) 1145 + { 1146 + fclose (out); 1147 + unlink (path); 1148 + return GGRAPH_INSUFFICIENT_MEMORY; 1149 + } 1150 + } 1151 + 1152 + ret = 1153 + gg_image_prepare_to_png_by_strip (img, out, compression_level, 1154 + quantization_factor); 1155 + if (ret != GGRAPH_OK) 1156 + { 1157 + gg_strip_image_destroy (img); 1158 + return ret; 1159 + } 1160 + 1161 + *ptr = img; 1162 + return GGRAPH_OK; 1163 +} 1164 + 1165 +GGRAPH_DECLARE int 1166 +gGraphImageToTiffFileByStrips (const void **ptr, const char *path, 1167 + int width, int height, int color_model, 1168 + int tiff_layout, 1169 + int tile_width, 1170 + int tile_height, 1171 + int rows_per_strip, 1172 + int bits_per_sample, int sample_format, 1173 + int num_palette, 1174 + unsigned char *red, unsigned char *green, 1175 + unsigned char *blue, int compression) 1176 +{ 1177 +/* exporting an image into a TIFF compressed file [by strips] */ 1178 + gGraphStripImagePtr img; 1179 + int ret; 1180 + int i; 1181 + 1182 + *ptr = NULL; 1183 + if (color_model == GGRAPH_COLORSPACE_PALETTE 1184 + || color_model == GGRAPH_COLORSPACE_GRAYSCALE 1185 + || color_model == GGRAPH_COLORSPACE_TRUECOLOR 1186 + || color_model == GGRAPH_COLORSPACE_TRUECOLOR_ALPHA 1187 + || color_model == GGRAPH_COLORSPACE_GRID) 1188 + ; 1189 + else 1190 + return GGRAPH_INVALID_IMAGE; 1191 + 1192 + if (color_model == GGRAPH_COLORSPACE_PALETTE) 1193 + { 1194 + if (num_palette < 1) 1195 + return GGRAPH_INVALID_IMAGE; 1196 + if (bits_per_sample == 1 || bits_per_sample == 2 1197 + || bits_per_sample == 4 || bits_per_sample == 8) 1198 + ; 1199 + else 1200 + return GGRAPH_INVALID_IMAGE; 1201 + if (bits_per_sample == 1 && num_palette > 2) 1202 + return GGRAPH_INVALID_IMAGE; 1203 + if (bits_per_sample == 2 && num_palette > 4) 1204 + return GGRAPH_INVALID_IMAGE; 1205 + if (bits_per_sample == 4 && num_palette > 16) 1206 + return GGRAPH_INVALID_IMAGE; 1207 + if (bits_per_sample == 8 && num_palette > 256) 1208 + return GGRAPH_INVALID_IMAGE; 1209 + } 1210 + if (color_model == GGRAPH_COLORSPACE_GRID) 1211 + { 1212 + if (sample_format == GGRAPH_SAMPLE_UINT 1213 + || sample_format == GGRAPH_SAMPLE_INT) 1214 + { 1215 + if (bits_per_sample == 8 || bits_per_sample == 16 1216 + || bits_per_sample == 32) 1217 + ; 1218 + else 1219 + return GGRAPH_INVALID_IMAGE; 1220 + } 1221 + else if (GGRAPH_SAMPLE_FLOAT) 1222 + { 1223 + if (bits_per_sample == 32 || bits_per_sample == 64) 1224 + ; 1225 + else 1226 + return GGRAPH_INVALID_IMAGE; 1227 + } 1228 + else 1229 + return GGRAPH_INVALID_IMAGE; 1230 + } 1231 + 1232 +/* creating a Strip Image */ 1233 + if (color_model == GGRAPH_COLORSPACE_PALETTE) 1234 + { 1235 + img = 1236 + gg_strip_image_create (NULL, GGRAPH_IMAGE_TIFF, GG_PIXEL_PALETTE, 1237 + width, height, bits_per_sample, 1, 1238 + GGRAPH_SAMPLE_UINT, NULL, NULL); 1239 + if (!img) 1240 + return GGRAPH_INSUFFICIENT_MEMORY; 1241 + for (i = 0; i < num_palette; i++) 1242 + { 1243 + img->palette_red[i] = red[i]; 1244 + img->palette_green[i] = green[i]; 1245 + img->palette_blue[i] = blue[i]; 1246 + img->max_palette = i + 1; 1247 + } 1248 + } 1249 + if (color_model == GGRAPH_COLORSPACE_GRAYSCALE) 1250 + { 1251 + img = 1252 + gg_strip_image_create (NULL, GGRAPH_IMAGE_TIFF, 1253 + GG_PIXEL_GRAYSCALE, width, height, 1254 + bits_per_sample, 1, GGRAPH_SAMPLE_UINT, 1255 + NULL, NULL); 1256 + if (!img) 1257 + return GGRAPH_INSUFFICIENT_MEMORY; 1258 + } 1259 + if (color_model == GGRAPH_COLORSPACE_TRUECOLOR 1260 + || color_model == GGRAPH_COLORSPACE_TRUECOLOR_ALPHA) 1261 + { 1262 + img = 1263 + gg_strip_image_create (NULL, GGRAPH_IMAGE_TIFF, GG_PIXEL_RGB, 1264 + width, height, 8, 3, GGRAPH_SAMPLE_UINT, 1265 + NULL, NULL); 1266 + if (!img) 1267 + return GGRAPH_INSUFFICIENT_MEMORY; 1268 + } 1269 + if (color_model == GGRAPH_COLORSPACE_GRID) 1270 + { 1271 + img = 1272 + gg_strip_image_create (NULL, GGRAPH_IMAGE_TIFF, GG_PIXEL_GRID, 1273 + width, height, bits_per_sample, 1, 1274 + sample_format, NULL, NULL); 1275 + if (!img) 1276 + return GGRAPH_INSUFFICIENT_MEMORY; 1277 + } 1278 + 1279 + img->tile_width = tile_width; 1280 + img->tile_height = tile_height; 1281 + img->rows_per_strip = rows_per_strip; 1282 + 1283 + ret = 1284 + gg_image_prepare_to_tiff_by_strip (img, path, tiff_layout, tile_width, 1285 + tile_height, rows_per_strip, 1286 + color_model, bits_per_sample, 1287 + sample_format, num_palette, red, 1288 + green, blue, compression); 1289 + if (ret != GGRAPH_OK) 1290 + { 1291 + gg_strip_image_destroy (img); 1292 + return ret; 1293 + } 1294 + 1295 + *ptr = img; 1296 + return GGRAPH_OK; 1297 +} 1298 + 1299 +GGRAPH_DECLARE int 1300 +gGraphImageToGeoTiffFileByStrips (const void **ptr, const char *path, 1301 + int width, int height, int color_model, 1302 + int tiff_layout, 1303 + int tile_width, 1304 + int tile_height, 1305 + int rows_per_strip, 1306 + int bits_per_sample, int sample_format, 1307 + int num_palette, 1308 + unsigned char *red, unsigned char *green, 1309 + unsigned char *blue, int compression, 1310 + int srid, const char *srs_name, 1311 + const char *proj4text, double upper_left_x, 1312 + double upper_left_y, double pixel_x_size, 1313 + double pixel_y_size) 1314 +{ 1315 +/* exporting an image into a GeoTIFF compressed file [by strips] */ 1316 + gGraphStripImagePtr img; 1317 + int ret; 1318 + int i; 1319 + 1320 + *ptr = NULL; 1321 + if (color_model == GGRAPH_COLORSPACE_PALETTE 1322 + || color_model == GGRAPH_COLORSPACE_GRAYSCALE 1323 + || color_model == GGRAPH_COLORSPACE_TRUECOLOR 1324 + || color_model == GGRAPH_COLORSPACE_TRUECOLOR_ALPHA 1325 + || color_model == GGRAPH_COLORSPACE_GRID) 1326 + ; 1327 + else 1328 + return GGRAPH_INVALID_IMAGE; 1329 + 1330 + if (color_model == GGRAPH_COLORSPACE_PALETTE) 1331 + { 1332 + if (num_palette < 1) 1333 + return GGRAPH_INVALID_IMAGE; 1334 + if (bits_per_sample == 1 || bits_per_sample == 2 1335 + || bits_per_sample == 4 || bits_per_sample == 8) 1336 + ; 1337 + else 1338 + return GGRAPH_INVALID_IMAGE; 1339 + if (bits_per_sample == 1 && num_palette > 2) 1340 + return GGRAPH_INVALID_IMAGE; 1341 + if (bits_per_sample == 2 && num_palette > 4) 1342 + return GGRAPH_INVALID_IMAGE; 1343 + if (bits_per_sample == 4 && num_palette > 16) 1344 + return GGRAPH_INVALID_IMAGE; 1345 + if (bits_per_sample == 8 && num_palette > 256) 1346 + return GGRAPH_INVALID_IMAGE; 1347 + } 1348 + if (color_model == GGRAPH_COLORSPACE_GRID) 1349 + { 1350 + if (sample_format == GGRAPH_SAMPLE_UINT 1351 + || sample_format == GGRAPH_SAMPLE_INT) 1352 + { 1353 + if (bits_per_sample == 8 || bits_per_sample == 16 1354 + || bits_per_sample == 32) 1355 + ; 1356 + else 1357 + return GGRAPH_INVALID_IMAGE; 1358 + } 1359 + else if (GGRAPH_SAMPLE_FLOAT) 1360 + { 1361 + if (bits_per_sample == 32 || bits_per_sample == 64) 1362 + ; 1363 + else 1364 + return GGRAPH_INVALID_IMAGE; 1365 + } 1366 + else 1367 + return GGRAPH_INVALID_IMAGE; 1368 + } 1369 + 1370 +/* creating a Strip Image */ 1371 + if (color_model == GGRAPH_COLORSPACE_PALETTE) 1372 + { 1373 + img = 1374 + gg_strip_image_create (NULL, GGRAPH_IMAGE_GEOTIFF, 1375 + GG_PIXEL_PALETTE, width, height, 1376 + bits_per_sample, 1, GGRAPH_SAMPLE_UINT, 1377 + NULL, NULL); 1378 + if (!img) 1379 + return GGRAPH_INSUFFICIENT_MEMORY; 1380 + for (i = 0; i < num_palette; i++) 1381 + { 1382 + img->palette_red[i] = red[i]; 1383 + img->palette_green[i] = green[i]; 1384 + img->palette_blue[i] = blue[i]; 1385 + img->max_palette = i + 1; 1386 + } 1387 + } 1388 + if (color_model == GGRAPH_COLORSPACE_GRAYSCALE) 1389 + { 1390 + img = 1391 + gg_strip_image_create (NULL, GGRAPH_IMAGE_GEOTIFF, 1392 + GG_PIXEL_GRAYSCALE, width, height, 1393 + bits_per_sample, 1, GGRAPH_SAMPLE_UINT, 1394 + NULL, NULL); 1395 + if (!img) 1396 + return GGRAPH_INSUFFICIENT_MEMORY; 1397 + } 1398 + if (color_model == GGRAPH_COLORSPACE_TRUECOLOR 1399 + || color_model == GGRAPH_COLORSPACE_TRUECOLOR_ALPHA) 1400 + { 1401 + img = 1402 + gg_strip_image_create (NULL, GGRAPH_IMAGE_GEOTIFF, GG_PIXEL_RGB, 1403 + width, height, 8, 3, GGRAPH_SAMPLE_UINT, 1404 + NULL, NULL); 1405 + if (!img) 1406 + return GGRAPH_INSUFFICIENT_MEMORY; 1407 + } 1408 + if (color_model == GGRAPH_COLORSPACE_GRID) 1409 + { 1410 + img = 1411 + gg_strip_image_create (NULL, GGRAPH_IMAGE_GEOTIFF, GG_PIXEL_GRID, 1412 + width, height, bits_per_sample, 1, 1413 + sample_format, NULL, NULL); 1414 + if (!img) 1415 + return GGRAPH_INSUFFICIENT_MEMORY; 1416 + } 1417 + gGraphImageSetGeoRef (img, srid, srs_name, proj4text, upper_left_x, 1418 + upper_left_y, pixel_x_size, pixel_y_size); 1419 + 1420 + img->tile_width = tile_width; 1421 + img->tile_height = tile_height; 1422 + img->rows_per_strip = rows_per_strip; 1423 + 1424 + ret = 1425 + gg_image_prepare_to_geotiff_by_strip (img, path, tiff_layout, 1426 + tile_width, tile_height, 1427 + rows_per_strip, color_model, 1428 + bits_per_sample, sample_format, 1429 + num_palette, red, green, blue, 1430 + compression); 1431 + if (ret != GGRAPH_OK) 1432 + { 1433 + gg_strip_image_destroy (img); 1434 + return ret; 1435 + } 1436 + 1437 + *ptr = img; 1438 + return GGRAPH_OK; 1439 +} 1440 + 1441 +GGRAPH_DECLARE int 1442 +gGraphImageToBinHdrFileByStrips (const void **ptr, const char *path, int width, 1443 + int height, int bits_per_sample, 1444 + double upper_left_x, double upper_left_y, 1445 + double pixel_x_size, double pixel_y_size, 1446 + double no_data_value) 1447 +{ 1448 +/* exporting an image into a BIN+HDR GRID file [by strips] */ 1449 + gGraphStripImagePtr img = NULL; 1450 + int ret; 1451 + FILE *out = NULL; 1452 + 1453 + *ptr = NULL; 1454 + 1455 +/* opening the output image file */ 1456 + out = fopen (path, "wb"); 1457 + if (out == NULL) 1458 + return GGRAPH_FILE_OPEN_ERROR; 1459 + 1460 +/* creating a Strip Image */ 1461 + if (bits_per_sample == 16) 1462 + { 1463 + img = gg_strip_image_create (out, GGRAPH_IMAGE_BIN_HDR, GG_PIXEL_GRID, 1464 + width, height, 16, 1, GGRAPH_SAMPLE_INT, 1465 + NULL, NULL); 1466 + } 1467 + if (bits_per_sample == 32) 1468 + { 1469 + img = gg_strip_image_create (out, GGRAPH_IMAGE_BIN_HDR, GG_PIXEL_GRID, 1470 + width, height, 32, 1, GGRAPH_SAMPLE_INT, 1471 + NULL, NULL); 1472 + } 1473 + if (!img) 1474 + { 1475 + fclose (out); 1476 + unlink (path); 1477 + return GGRAPH_INSUFFICIENT_MEMORY; 1478 + } 1479 + 1480 + img->upper_left_x = upper_left_x; 1481 + img->upper_left_y = upper_left_y; 1482 + img->pixel_x_size = pixel_x_size; 1483 + img->pixel_y_size = pixel_y_size; 1484 + img->no_data_value = no_data_value; 1485 + ret = gg_image_prepare_to_bin_hdr_by_strip (img); 1486 + if (ret != GGRAPH_OK) 1487 + if (ret != GGRAPH_OK) 1488 + { 1489 + gg_strip_image_destroy (img); 1490 + return ret; 1491 + } 1492 + 1493 + *ptr = img; 1494 + return GGRAPH_OK; 1495 +} 1496 + 1497 +GGRAPH_DECLARE int 1498 +gGraphImageToFltHdrFileByStrips (const void **ptr, const char *path, int width, 1499 + int height, int bits_per_sample, 1500 + double upper_left_x, double upper_left_y, 1501 + double pixel_x_size, double pixel_y_size, 1502 + double no_data_value) 1503 +{ 1504 +/* exporting an image into a FLT+HDR GRID file [by strips] */ 1505 + gGraphStripImagePtr img = NULL; 1506 + int ret; 1507 + FILE *out = NULL; 1508 + 1509 + *ptr = NULL; 1510 + 1511 +/* opening the output image file */ 1512 + out = fopen (path, "wb"); 1513 + if (out == NULL) 1514 + return GGRAPH_FILE_OPEN_ERROR; 1515 + 1516 +/* creating a Strip Image */ 1517 + if (bits_per_sample == 32) 1518 + { 1519 + img = gg_strip_image_create (out, GGRAPH_IMAGE_FLT_HDR, GG_PIXEL_GRID, 1520 + width, height, 32, 1, 1521 + GGRAPH_SAMPLE_FLOAT, NULL, NULL); 1522 + } 1523 + if (bits_per_sample == 64) 1524 + { 1525 + img = gg_strip_image_create (out, GGRAPH_IMAGE_FLT_HDR, GG_PIXEL_GRID, 1526 + width, height, 64, 1, 1527 + GGRAPH_SAMPLE_FLOAT, NULL, NULL); 1528 + } 1529 + if (!img) 1530 + { 1531 + fclose (out); 1532 + unlink (path); 1533 + return GGRAPH_INSUFFICIENT_MEMORY; 1534 + } 1535 + 1536 + img->upper_left_x = upper_left_x; 1537 + img->upper_left_y = upper_left_y; 1538 + img->pixel_x_size = pixel_x_size; 1539 + img->pixel_y_size = pixel_y_size; 1540 + img->no_data_value = no_data_value; 1541 + ret = gg_image_prepare_to_flt_hdr_by_strip (img); 1542 + if (ret != GGRAPH_OK) 1543 + { 1544 + gg_strip_image_destroy (img); 1545 + return ret; 1546 + } 1547 + 1548 + *ptr = img; 1549 + return GGRAPH_OK; 1550 +} 1551 + 1552 +GGRAPH_DECLARE int 1553 +gGraphImageToAscFileByStrips (const void **ptr, const char *path, int width, 1554 + int height, int sample, int bits_per_sample, 1555 + double upper_left_x, double upper_left_y, 1556 + double pixel_x_size, double pixel_y_size, 1557 + double no_data_value) 1558 +{ 1559 +/* exporting an image into an ASCII GRID file [by strips] */ 1560 + gGraphStripImagePtr img = NULL; 1561 + int ret; 1562 + FILE *out = NULL; 1563 + 1564 + *ptr = NULL; 1565 + 1566 +/* opening the output image file */ 1567 + out = fopen (path, "wb"); 1568 + if (out == NULL) 1569 + return GGRAPH_FILE_OPEN_ERROR; 1570 + 1571 +/* creating a Strip Image */ 1572 + if (sample == GGRAPH_SAMPLE_UINT) 1573 + { 1574 + if (bits_per_sample == 8) 1575 + { 1576 + img = 1577 + gg_strip_image_create (out, GGRAPH_IMAGE_ASCII_GRID, 1578 + GG_PIXEL_GRID, width, height, 8, 1, 1579 + GGRAPH_SAMPLE_UINT, NULL, NULL); 1580 + } 1581 + if (bits_per_sample == 16) 1582 + { 1583 + img = 1584 + gg_strip_image_create (out, GGRAPH_IMAGE_ASCII_GRID, 1585 + GG_PIXEL_GRID, width, height, 16, 1, 1586 + GGRAPH_SAMPLE_UINT, NULL, NULL); 1587 + } 1588 + if (bits_per_sample == 32) 1589 + { 1590 + img = 1591 + gg_strip_image_create (out, GGRAPH_IMAGE_ASCII_GRID, 1592 + GG_PIXEL_GRID, width, height, 32, 1, 1593 + GGRAPH_SAMPLE_UINT, NULL, NULL); 1594 + } 1595 + } 1596 + if (sample == GGRAPH_SAMPLE_INT) 1597 + { 1598 + if (bits_per_sample == 8) 1599 + { 1600 + img = 1601 + gg_strip_image_create (out, GGRAPH_IMAGE_ASCII_GRID, 1602 + GG_PIXEL_GRID, width, height, 8, 1, 1603 + GGRAPH_SAMPLE_INT, NULL, NULL); 1604 + } 1605 + if (bits_per_sample == 16) 1606 + { 1607 + img = 1608 + gg_strip_image_create (out, GGRAPH_IMAGE_ASCII_GRID, 1609 + GG_PIXEL_GRID, width, height, 16, 1, 1610 + GGRAPH_SAMPLE_INT, NULL, NULL); 1611 + } 1612 + if (bits_per_sample == 32) 1613 + { 1614 + img = 1615 + gg_strip_image_create (out, GGRAPH_IMAGE_ASCII_GRID, 1616 + GG_PIXEL_GRID, width, height, 32, 1, 1617 + GGRAPH_SAMPLE_INT, NULL, NULL); 1618 + } 1619 + } 1620 + if (sample == GGRAPH_SAMPLE_FLOAT) 1621 + { 1622 + if (bits_per_sample == 32) 1623 + { 1624 + img = 1625 + gg_strip_image_create (out, GGRAPH_IMAGE_ASCII_GRID, 1626 + GG_PIXEL_GRID, width, height, 32, 1, 1627 + GGRAPH_SAMPLE_FLOAT, NULL, NULL); 1628 + } 1629 + if (bits_per_sample == 64) 1630 + { 1631 + img = 1632 + gg_strip_image_create (out, GGRAPH_IMAGE_ASCII_GRID, 1633 + GG_PIXEL_GRID, width, height, 64, 1, 1634 + GGRAPH_SAMPLE_FLOAT, NULL, NULL); 1635 + } 1636 + } 1637 + if (!img) 1638 + { 1639 + fclose (out); 1640 + unlink (path); 1641 + return GGRAPH_INSUFFICIENT_MEMORY; 1642 + } 1643 + 1644 + img->upper_left_x = upper_left_x; 1645 + img->upper_left_y = upper_left_y; 1646 + img->pixel_x_size = pixel_x_size; 1647 + img->pixel_y_size = pixel_y_size; 1648 + img->no_data_value = no_data_value; 1649 + ret = gg_image_prepare_to_ascii_grid_by_strip (img, out); 1650 + if (ret != GGRAPH_OK) 1651 + { 1652 + gg_strip_image_destroy (img); 1653 + return ret; 1654 + } 1655 + 1656 + *ptr = img; 1657 + return GGRAPH_OK; 1658 +} 1659 + 1660 +GGRAPH_DECLARE int 1661 +gGraphImageToPngMemBuf (const void *ptr, void **mem_buf, int *mem_buf_size, 1662 + int compression_level, int quantization_factor, 1663 + int interlaced, int is_transparent) 1664 +{ 1665 +/* exporting an image into a PNG compressed memory buffer */ 1666 + gGraphImagePtr img = (gGraphImagePtr) ptr; 1667 + void *buf = NULL; 1668 + int size; 1669 + int ret; 1670 + 1671 + *mem_buf = NULL; 1672 + *mem_buf_size = 0; 1673 + if (img == NULL) 1674 + return GGRAPH_INVALID_IMAGE; 1675 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 1676 + return GGRAPH_INVALID_IMAGE; 1677 + 1678 +/* compressing as PNG */ 1679 + ret = 1680 + gg_image_to_png (img, &buf, &size, NULL, GG_TARGET_IS_MEMORY, 1681 + compression_level, quantization_factor, interlaced, 1682 + is_transparent); 1683 + if (ret != GGRAPH_OK) 1684 + return ret; 1685 + 1686 +/* exporting the memory buffer */ 1687 + *mem_buf = buf; 1688 + *mem_buf_size = size; 1689 + return GGRAPH_OK; 1690 +} 1691 + 1692 +GGRAPH_DECLARE int 1693 +gGraphImageToGifFile (const void *ptr, const char *path) 1694 +{ 1695 +/* exporting an image into a GIF compressed file */ 1696 + gGraphImagePtr img = (gGraphImagePtr) ptr; 1697 + int ret; 1698 + FILE *out = NULL; 1699 + 1700 + if (!img) 1701 + return GGRAPH_INVALID_IMAGE; 1702 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 1703 + return GGRAPH_INVALID_IMAGE; 1704 + 1705 +/* opening the output image file */ 1706 + out = fopen (path, "wb"); 1707 + if (out == NULL) 1708 + return GGRAPH_FILE_OPEN_ERROR; 1709 +/* compressing as GIF */ 1710 + ret = gg_image_to_gif (img, NULL, NULL, out, GG_TARGET_IS_FILE, 0); 1711 + fclose (out); 1712 + if (ret != GGRAPH_OK) 1713 + { 1714 + /* some unexpected error occurred */ 1715 + unlink (path); 1716 + return ret; 1717 + } 1718 + 1719 + return GGRAPH_OK; 1720 +} 1721 + 1722 +GGRAPH_DECLARE int 1723 +gGraphImageToGifMemBuf (const void *ptr, void **mem_buf, int *mem_buf_size, 1724 + int is_transparent) 1725 +{ 1726 +/* exporting an image into a GIF compressed memory buffer */ 1727 + gGraphImagePtr img = (gGraphImagePtr) ptr; 1728 + void *buf = NULL; 1729 + int size; 1730 + int ret; 1731 + 1732 + *mem_buf = NULL; 1733 + *mem_buf_size = 0; 1734 + if (img == NULL) 1735 + return GGRAPH_INVALID_IMAGE; 1736 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 1737 + return GGRAPH_INVALID_IMAGE; 1738 + 1739 +/* compressing as GIF */ 1740 + ret = 1741 + gg_image_to_gif (img, &buf, &size, NULL, GG_TARGET_IS_MEMORY, 1742 + is_transparent); 1743 + if (ret != GGRAPH_OK) 1744 + return ret; 1745 + 1746 +/* exporting the memory buffer */ 1747 + *mem_buf = buf; 1748 + *mem_buf_size = size; 1749 + return GGRAPH_OK; 1750 +} 1751 + 1752 +GGRAPH_DECLARE void 1753 +gGraphDestroyImage (const void *ptr) 1754 +{ 1755 +/* destroyng an image object */ 1756 + gGraphImagePtr img = (gGraphImagePtr) ptr; 1757 + gGraphStripImagePtr strip_img = (gGraphStripImagePtr) ptr; 1758 + 1759 + if (img == NULL) 1760 + return; 1761 + if (img->signature == GG_IMAGE_MAGIC_SIGNATURE) 1762 + { 1763 + gg_image_destroy (img); 1764 + return; 1765 + } 1766 + if (strip_img->signature == GG_STRIP_IMAGE_MAGIC_SIGNATURE) 1767 + { 1768 + gg_strip_image_destroy (strip_img); 1769 + return; 1770 + } 1771 +} 1772 + 1773 +GGRAPH_DECLARE int 1774 +gGraphStripImageClonePalette (const void *ptr, int *color_model, 1775 + int *num_palette, unsigned char *red, 1776 + unsigned char *green, unsigned char *blue) 1777 +{ 1778 +/* exporting the palette and color-space infos from a Strip Image */ 1779 + int i; 1780 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 1781 + 1782 + if (img == NULL) 1783 + return GGRAPH_INVALID_IMAGE; 1784 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 1785 + return GGRAPH_INVALID_IMAGE; 1786 + 1787 + switch (img->pixel_format) 1788 + { 1789 + case GG_PIXEL_GRID: 1790 + *color_model = GGRAPH_COLORSPACE_GRID; 1791 + *num_palette = 0; 1792 + break; 1793 + case GG_PIXEL_PALETTE: 1794 + *color_model = GGRAPH_COLORSPACE_PALETTE; 1795 + for (i = 0; i < img->max_palette; i++) 1796 + { 1797 + red[i] = img->palette_red[i]; 1798 + green[i] = img->palette_green[i]; 1799 + blue[i] = img->palette_blue[i]; 1800 + } 1801 + *num_palette = img->max_palette; 1802 + break; 1803 + case GG_PIXEL_GRAYSCALE: 1804 + *color_model = GGRAPH_COLORSPACE_GRAYSCALE; 1805 + *num_palette = 0; 1806 + break; 1807 + case GG_PIXEL_RGBA: 1808 + case GG_PIXEL_ARGB: 1809 + case GG_PIXEL_BGRA: 1810 + *color_model = GGRAPH_COLORSPACE_TRUECOLOR_ALPHA; 1811 + *num_palette = 0; 1812 + break; 1813 + default: 1814 + *color_model = GGRAPH_COLORSPACE_TRUECOLOR; 1815 + *num_palette = 0; 1816 + break; 1817 + }; 1818 + return GGRAPH_OK; 1819 +} 1820 + 1821 +GGRAPH_DECLARE int 1822 +gGraphStripImageAllocPixels (const void *ptr, int rows_per_block) 1823 +{ 1824 +/* allocating the pixels buffer */ 1825 + unsigned char *pixels; 1826 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 1827 + 1828 + if (img == NULL) 1829 + return GGRAPH_INVALID_IMAGE; 1830 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 1831 + return GGRAPH_INVALID_IMAGE; 1832 + 1833 +/* allocating the pixel buffer */ 1834 + pixels = malloc (img->scanline_width * rows_per_block); 1835 + if (!pixels) 1836 + return GGRAPH_INSUFFICIENT_MEMORY; 1837 +/* freeing an already allocated buffer (if any) */ 1838 + if (img->pixels) 1839 + free (img->pixels); 1840 + img->pixels = pixels; 1841 + img->rows_per_block = rows_per_block; 1842 + 1843 + return GGRAPH_OK; 1844 +} 1845 + 1846 +GGRAPH_DECLARE int 1847 +gGraphStripImageEOF (const void *ptr) 1848 +{ 1849 +/* checking if there is a StripImage EOF condition */ 1850 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 1851 + 1852 + if (img == NULL) 1853 + return GGRAPH_INVALID_IMAGE; 1854 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 1855 + return GGRAPH_INVALID_IMAGE; 1856 + 1857 + if (img->next_row >= img->height) 1858 + return GGRAPH_OK; 1859 + return GGRAPH_ERROR; 1860 +} 1861 + 1862 +static int 1863 +copy_pixels_float (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out) 1864 +{ 1865 +/* copying the pixels buffer between two images [FLOAT] */ 1866 + int x; 1867 + int y; 1868 + for (y = 0; y < img_in->current_available_rows; y++) 1869 + { 1870 + float *p_in = (float *) (img_in->pixels); 1871 + float *p_out = (float *) (img_out->pixels); 1872 + p_in += y * img_in->width; 1873 + p_out += y * img_out->width; 1874 + for (x = 0; x < img_in->width; x++) 1875 + *p_out++ = *p_in++; 1876 + } 1877 + img_out->current_available_rows = img_in->current_available_rows; 1878 + return GGRAPH_OK; 1879 +} 1880 + 1881 +static int 1882 +copy_pixels_double (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out) 1883 +{ 1884 +/* copying the pixels buffer between two images [DOUBLE] */ 1885 + int x; 1886 + int y; 1887 + for (y = 0; y < img_in->current_available_rows; y++) 1888 + { 1889 + double *p_in = (double *) (img_in->pixels); 1890 + double *p_out = (double *) (img_out->pixels); 1891 + p_in += y * img_in->width; 1892 + p_out += y * img_out->width; 1893 + for (x = 0; x < img_in->width; x++) 1894 + *p_out++ = *p_in++; 1895 + } 1896 + img_out->current_available_rows = img_in->current_available_rows; 1897 + return GGRAPH_OK; 1898 +} 1899 + 1900 +static int 1901 +copy_pixels_uint8 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out) 1902 +{ 1903 +/* copying the pixels buffer between two images [UINT-8] */ 1904 + int x; 1905 + int y; 1906 + for (y = 0; y < img_in->current_available_rows; y++) 1907 + { 1908 + unsigned char *p_in = (unsigned char *) (img_in->pixels); 1909 + unsigned char *p_out = (unsigned char *) (img_out->pixels); 1910 + p_in += y * img_in->width; 1911 + p_out += y * img_out->width; 1912 + for (x = 0; x < img_in->width; x++) 1913 + *p_out++ = *p_in++; 1914 + } 1915 + img_out->current_available_rows = img_in->current_available_rows; 1916 + return GGRAPH_OK; 1917 +} 1918 + 1919 +static int 1920 +copy_pixels_int8 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out) 1921 +{ 1922 +/* copying the pixels buffer between two images [INT-8] */ 1923 + int x; 1924 + int y; 1925 + for (y = 0; y < img_in->current_available_rows; y++) 1926 + { 1927 + char *p_in = (char *) (img_in->pixels); 1928 + char *p_out = (char *) (img_out->pixels); 1929 + p_in += y * img_in->width; 1930 + p_out += y * img_out->width; 1931 + for (x = 0; x < img_in->width; x++) 1932 + *p_out++ = *p_in++; 1933 + } 1934 + img_out->current_available_rows = img_in->current_available_rows; 1935 + return GGRAPH_OK; 1936 +} 1937 + 1938 +static int 1939 +copy_pixels_uint16 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out) 1940 +{ 1941 +/* copying the pixels buffer between two images [UINT-16] */ 1942 + int x; 1943 + int y; 1944 + for (y = 0; y < img_in->current_available_rows; y++) 1945 + { 1946 + unsigned short *p_in = (unsigned short *) (img_in->pixels); 1947 + unsigned short *p_out = (unsigned short *) (img_out->pixels); 1948 + p_in += y * img_in->width; 1949 + p_out += y * img_out->width; 1950 + for (x = 0; x < img_in->width; x++) 1951 + *p_out++ = *p_in++; 1952 + } 1953 + img_out->current_available_rows = img_in->current_available_rows; 1954 + return GGRAPH_OK; 1955 +} 1956 + 1957 +static int 1958 +copy_pixels_int16 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out) 1959 +{ 1960 +/* copying the pixels buffer between two images [INT-16] */ 1961 + int x; 1962 + int y; 1963 + for (y = 0; y < img_in->current_available_rows; y++) 1964 + { 1965 + short *p_in = (short *) (img_in->pixels); 1966 + short *p_out = (short *) (img_out->pixels); 1967 + p_in += y * img_in->width; 1968 + p_out += y * img_out->width; 1969 + for (x = 0; x < img_in->width; x++) 1970 + *p_out++ = *p_in++; 1971 + } 1972 + img_out->current_available_rows = img_in->current_available_rows; 1973 + return GGRAPH_OK; 1974 +} 1975 + 1976 +static int 1977 +copy_pixels_uint32 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out) 1978 +{ 1979 +/* copying the pixels buffer between two images [UINT-32] */ 1980 + int x; 1981 + int y; 1982 + for (y = 0; y < img_in->current_available_rows; y++) 1983 + { 1984 + unsigned int *p_in = (unsigned int *) (img_in->pixels); 1985 + unsigned int *p_out = (unsigned int *) (img_out->pixels); 1986 + p_in += y * img_in->width; 1987 + p_out += y * img_out->width; 1988 + for (x = 0; x < img_in->width; x++) 1989 + *p_out++ = *p_in++; 1990 + } 1991 + img_out->current_available_rows = img_in->current_available_rows; 1992 + return GGRAPH_OK; 1993 +} 1994 + 1995 +static int 1996 +copy_pixels_int32 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out) 1997 +{ 1998 +/* copying the pixels buffer between two images [INT-32] */ 1999 + int x; 2000 + int y; 2001 + for (y = 0; y < img_in->current_available_rows; y++) 2002 + { 2003 + int *p_in = (int *) (img_in->pixels); 2004 + int *p_out = (int *) (img_out->pixels); 2005 + p_in += y * img_in->width; 2006 + p_out += y * img_out->width; 2007 + for (x = 0; x < img_in->width; x++) 2008 + *p_out++ = *p_in++; 2009 + } 2010 + img_out->current_available_rows = img_in->current_available_rows; 2011 + return GGRAPH_OK; 2012 +} 2013 + 2014 +GGRAPH_DECLARE int 2015 +gGraphStripImageCopyPixels (const void *in_ptr, const void *out_ptr) 2016 +{ 2017 +/* copying the pixels buffer between two images */ 2018 + int x; 2019 + int y; 2020 + gGraphStripImagePtr img_in = (gGraphStripImagePtr) in_ptr; 2021 + gGraphStripImagePtr img_out = (gGraphStripImagePtr) out_ptr; 2022 + 2023 + if (img_in == NULL || img_out == NULL) 2024 + return GGRAPH_INVALID_IMAGE; 2025 + if (img_in->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2026 + return GGRAPH_INVALID_IMAGE; 2027 + if (img_out->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2028 + return GGRAPH_INVALID_IMAGE; 2029 + 2030 +/* checking if the strip buffers does actually have the same size */ 2031 + if (img_in->width == img_out->width 2032 + && img_in->rows_per_block == img_out->rows_per_block) 2033 + ; 2034 + else 2035 + return GGRAPH_ERROR; 2036 + if (img_in->pixel_format == GG_PIXEL_GRID) 2037 + { 2038 + /* handling GRID data */ 2039 + if (img_in->sample_format == GGRAPH_SAMPLE_FLOAT) 2040 + { 2041 + if (img_in->bits_per_sample == 32) 2042 + return copy_pixels_float (img_in, img_out); 2043 + else 2044 + 2045 + return copy_pixels_double (img_in, img_out); 2046 + } 2047 + else 2048 + { 2049 + /* UINT or INT */ 2050 + if (img_in->bits_per_sample == 8) 2051 + { 2052 + if (img_in->sample_format == GGRAPH_SAMPLE_UINT) 2053 + return copy_pixels_uint8 (img_in, img_out); 2054 + else 2055 + return copy_pixels_int8 (img_in, img_out); 2056 + } 2057 + else if (img_in->bits_per_sample == 16) 2058 + { 2059 + if (img_in->sample_format == GGRAPH_SAMPLE_UINT) 2060 + return copy_pixels_uint16 (img_in, img_out); 2061 + else 2062 + return copy_pixels_int16 (img_in, img_out); 2063 + } 2064 + else 2065 + { 2066 + if (img_in->sample_format == GGRAPH_SAMPLE_UINT) 2067 + return copy_pixels_uint32 (img_in, img_out); 2068 + else 2069 + return copy_pixels_int32 (img_in, img_out); 2070 + } 2071 + } 2072 + } 2073 + for (y = 0; y < img_in->current_available_rows; y++) 2074 + { 2075 + unsigned char *p_in = img_in->pixels + (y * img_in->scanline_width); 2076 + unsigned char *p_out = 2077 + img_out->pixels + (y * img_out->scanline_width); 2078 + for (x = 0; x < img_in->width; x++) 2079 + { 2080 + if (img_in->pixel_format == GG_PIXEL_GRAYSCALE 2081 + && img_out->pixel_format == GG_PIXEL_GRAYSCALE) 2082 + { 2083 + *p_out++ = *p_in++; 2084 + } 2085 + else if (img_in->pixel_format == GG_PIXEL_PALETTE 2086 + && img_out->pixel_format == GG_PIXEL_PALETTE) 2087 + { 2088 + *p_out++ = *p_in++; 2089 + } 2090 + else 2091 + { 2092 + unsigned char red; 2093 + unsigned char green; 2094 + unsigned char blue; 2095 + unsigned char alpha; 2096 + if (img_in->pixel_format == GG_PIXEL_RGB) 2097 + { 2098 + red = *p_in++; 2099 + green = *p_in++; 2100 + blue = *p_in++; 2101 + alpha = 255; 2102 + } 2103 + else if (img_in->pixel_format == GG_PIXEL_RGBA) 2104 + { 2105 + red = *p_in++; 2106 + green = *p_in++; 2107 + blue = *p_in++; 2108 + alpha = *p_in++; 2109 + } 2110 + else if (img_in->pixel_format == GG_PIXEL_ARGB) 2111 + { 2112 + alpha = *p_in++; 2113 + red = *p_in++; 2114 + green = *p_in++; 2115 + blue = *p_in++; 2116 + } 2117 + else if (img_in->pixel_format == GG_PIXEL_BGR) 2118 + { 2119 + blue = *p_in++; 2120 + green = *p_in++; 2121 + red = *p_in++; 2122 + alpha = 255; 2123 + } 2124 + else if (img_in->pixel_format == GG_PIXEL_BGRA) 2125 + { 2126 + blue = *p_in++; 2127 + green = *p_in++; 2128 + red = *p_in++; 2129 + alpha = *p_in++; 2130 + } 2131 + else if (img_in->pixel_format == GG_PIXEL_GRAYSCALE) 2132 + { 2133 + red = *p_in++; 2134 + green = red; 2135 + blue = red; 2136 + alpha = 255; 2137 + } 2138 + else if (img_in->pixel_format == GG_PIXEL_PALETTE) 2139 + { 2140 + int index = *p_in++; 2141 + red = img_in->palette_red[index]; 2142 + green = img_in->palette_green[index]; 2143 + blue = img_in->palette_blue[index]; 2144 + alpha = 255; 2145 + } 2146 + if (img_out->pixel_format == GG_PIXEL_RGB) 2147 + { 2148 + *p_out++ = red; 2149 + *p_out++ = green; 2150 + *p_out++ = blue; 2151 + } 2152 + else if (img_out->pixel_format == GG_PIXEL_RGBA) 2153 + { 2154 + *p_out++ = red; 2155 + *p_out++ = green; 2156 + *p_out++ = blue; 2157 + *p_out++ = alpha; 2158 + } 2159 + else if (img_out->pixel_format == GG_PIXEL_ARGB) 2160 + { 2161 + *p_out++ = alpha; 2162 + *p_out++ = red; 2163 + *p_out++ = green; 2164 + *p_out++ = blue; 2165 + } 2166 + else if (img_out->pixel_format == GG_PIXEL_BGR) 2167 + { 2168 + *p_out++ = blue; 2169 + *p_out++ = green; 2170 + *p_out++ = red; 2171 + } 2172 + else if (img_out->pixel_format == GG_PIXEL_BGRA) 2173 + { 2174 + *p_out++ = blue; 2175 + *p_out++ = green; 2176 + *p_out++ = red; 2177 + *p_out++ = alpha; 2178 + } 2179 + } 2180 + } 2181 + img_out->current_available_rows = img_in->current_available_rows; 2182 + } 2183 + return GGRAPH_OK; 2184 +} 2185 + 2186 +static int 2187 +subset_pixels_float (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out, 2188 + int start_from, int row) 2189 +{ 2190 +/* copying the pixels buffer between two images [SubSet, FLOAT] */ 2191 + int x; 2192 + float *p_in = (float *) (img_in->pixels); 2193 + float *p_out = (float *) (img_out->pixels); 2194 + p_in += start_from; 2195 + p_out += row * img_out->width; 2196 + for (x = 0; x < img_out->width; x++) 2197 + *p_out++ = *p_in++; 2198 + img_out->current_available_rows = row + 1; 2199 + return GGRAPH_OK; 2200 +} 2201 + 2202 +static int 2203 +subset_pixels_double (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out, 2204 + int start_from, int row) 2205 +{ 2206 +/* copying the pixels buffer between two images [SubSet, DOUBLE] */ 2207 + int x; 2208 + double *p_in = (double *) (img_in->pixels); 2209 + double *p_out = (double *) (img_out->pixels); 2210 + p_in += start_from; 2211 + p_out += row * img_out->width; 2212 + for (x = 0; x < img_out->width; x++) 2213 + *p_out++ = *p_in++; 2214 + img_out->current_available_rows = row + 1; 2215 + return GGRAPH_OK; 2216 +} 2217 + 2218 +static int 2219 +subset_pixels_uint8 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out, 2220 + int start_from, int row) 2221 +{ 2222 +/* copying the pixels buffer between two images [SubSet, UINT-8] */ 2223 + int x; 2224 + unsigned char *p_in = (unsigned char *) (img_in->pixels); 2225 + unsigned char *p_out = (unsigned char *) (img_out->pixels); 2226 + p_in += start_from; 2227 + p_out += row * img_out->width; 2228 + for (x = 0; x < img_out->width; x++) 2229 + *p_out++ = *p_in++; 2230 + img_out->current_available_rows = row + 1; 2231 + return GGRAPH_OK; 2232 +} 2233 + 2234 +static int 2235 +subset_pixels_int8 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out, 2236 + int start_from, int row) 2237 +{ 2238 +/* copying the pixels buffer between two images [SubSet, INT-8] */ 2239 + int x; 2240 + char *p_in = (char *) (img_in->pixels); 2241 + char *p_out = (char *) (img_out->pixels); 2242 + p_in += start_from; 2243 + p_out += row * img_out->width; 2244 + for (x = 0; x < img_out->width; x++) 2245 + *p_out++ = *p_in++; 2246 + img_out->current_available_rows = row + 1; 2247 + return GGRAPH_OK; 2248 +} 2249 + 2250 +static int 2251 +subset_pixels_uint16 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out, 2252 + int start_from, int row) 2253 +{ 2254 +/* copying the pixels buffer between two images [SubSet, UINT-16] */ 2255 + int x; 2256 + unsigned short *p_in = (unsigned short *) (img_in->pixels); 2257 + unsigned short *p_out = (unsigned short *) (img_out->pixels); 2258 + p_in += start_from; 2259 + p_out += row * img_out->width; 2260 + for (x = 0; x < img_out->width; x++) 2261 + *p_out++ = *p_in++; 2262 + img_out->current_available_rows = row + 1; 2263 + return GGRAPH_OK; 2264 +} 2265 + 2266 +static int 2267 +subset_pixels_int16 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out, 2268 + int start_from, int row) 2269 +{ 2270 +/* copying the pixels buffer between two images [SubSet, INT-16] */ 2271 + int x; 2272 + short *p_in = (short *) (img_in->pixels); 2273 + short *p_out = (short *) (img_out->pixels); 2274 + p_in += start_from; 2275 + p_out += row * img_out->width; 2276 + for (x = 0; x < img_out->width; x++) 2277 + *p_out++ = *p_in++; 2278 + img_out->current_available_rows = row + 1; 2279 + return GGRAPH_OK; 2280 +} 2281 + 2282 +static int 2283 +subset_pixels_uint32 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out, 2284 + int start_from, int row) 2285 +{ 2286 +/* copying the pixels buffer between two images [SubSet, UINT-32] */ 2287 + int x; 2288 + unsigned int *p_in = (unsigned int *) (img_in->pixels); 2289 + unsigned int *p_out = (unsigned int *) (img_out->pixels); 2290 + p_in += start_from; 2291 + p_out += row * img_out->width; 2292 + for (x = 0; x < img_out->width; x++) 2293 + *p_out++ = *p_in++; 2294 + img_out->current_available_rows = row + 1; 2295 + return GGRAPH_OK; 2296 +} 2297 + 2298 +static int 2299 +subset_pixels_int32 (gGraphStripImagePtr img_in, gGraphStripImagePtr img_out, 2300 + int start_from, int row) 2301 +{ 2302 +/* copying the pixels buffer between two images [SubSet, INT-32] */ 2303 + int x; 2304 + int *p_in = (int *) (img_in->pixels); 2305 + int *p_out = (int *) (img_out->pixels); 2306 + p_in += start_from; 2307 + p_out += row * img_out->width; 2308 + for (x = 0; x < img_out->width; x++) 2309 + *p_out++ = *p_in++; 2310 + img_out->current_available_rows = row + 1; 2311 + return GGRAPH_OK; 2312 +} 2313 + 2314 +GGRAPH_DECLARE int 2315 +gGraphStripImageSubSetPixels (const void *in_ptr, const void *out_ptr, 2316 + int start_from, int row) 2317 +{ 2318 +/* copying the pixels buffer between two images [SubSet] */ 2319 + int x; 2320 + unsigned char *p_in; 2321 + unsigned char *p_out; 2322 + gGraphStripImagePtr img_in = (gGraphStripImagePtr) in_ptr; 2323 + gGraphStripImagePtr img_out = (gGraphStripImagePtr) out_ptr; 2324 + 2325 + if (img_in == NULL || img_out == NULL) 2326 + return GGRAPH_INVALID_IMAGE; 2327 + if (img_out->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2328 + return GGRAPH_INVALID_IMAGE; 2329 + if (img_out->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2330 + return GGRAPH_INVALID_IMAGE; 2331 + 2332 + if (img_in->pixel_format == GG_PIXEL_GRID) 2333 + { 2334 + /* handling GRID data */ 2335 + if (img_in->sample_format == GGRAPH_SAMPLE_FLOAT) 2336 + { 2337 + if (img_in->bits_per_sample == 32) 2338 + return subset_pixels_float (img_in, img_out, start_from, 2339 + row); 2340 + else 2341 + 2342 + return subset_pixels_double (img_in, img_out, start_from, 2343 + row); 2344 + } 2345 + else 2346 + { 2347 + /* UINT or INT */ 2348 + if (img_in->bits_per_sample == 8) 2349 + { 2350 + if (img_in->sample_format == GGRAPH_SAMPLE_UINT) 2351 + return subset_pixels_uint8 (img_in, img_out, 2352 + start_from, row); 2353 + else 2354 + return subset_pixels_int8 (img_in, img_out, 2355 + start_from, row); 2356 + } 2357 + else if (img_in->bits_per_sample == 16) 2358 + { 2359 + if (img_in->sample_format == GGRAPH_SAMPLE_UINT) 2360 + return subset_pixels_uint16 (img_in, img_out, 2361 + start_from, row); 2362 + else 2363 + return subset_pixels_int16 (img_in, img_out, 2364 + start_from, row); 2365 + } 2366 + else 2367 + { 2368 + if (img_in->sample_format == GGRAPH_SAMPLE_UINT) 2369 + return subset_pixels_uint32 (img_in, img_out, 2370 + start_from, row); 2371 + else 2372 + return subset_pixels_int32 (img_in, img_out, 2373 + start_from, row); 2374 + } 2375 + } 2376 + } 2377 + 2378 + p_in = img_in->pixels + (start_from * img_in->pixel_size); 2379 + p_out = img_out->pixels + (row * img_out->scanline_width); 2380 + for (x = 0; x < img_out->width; x++) 2381 + { 2382 + if (img_in->pixel_format == GG_PIXEL_GRAYSCALE 2383 + && img_out->pixel_format == GG_PIXEL_GRAYSCALE) 2384 + { 2385 + *p_out++ = *p_in++; 2386 + } 2387 + else if (img_in->pixel_format == GG_PIXEL_PALETTE 2388 + && img_out->pixel_format == GG_PIXEL_PALETTE) 2389 + { 2390 + *p_out++ = *p_in++; 2391 + } 2392 + else 2393 + { 2394 + unsigned char red; 2395 + unsigned char green; 2396 + unsigned char blue; 2397 + unsigned char alpha; 2398 + if (img_in->pixel_format == GG_PIXEL_RGB) 2399 + { 2400 + red = *p_in++; 2401 + green = *p_in++; 2402 + blue = *p_in++; 2403 + alpha = 255; 2404 + } 2405 + else if (img_in->pixel_format == GG_PIXEL_RGBA) 2406 + { 2407 + red = *p_in++; 2408 + green = *p_in++; 2409 + blue = *p_in++; 2410 + alpha = *p_in++; 2411 + } 2412 + else if (img_in->pixel_format == GG_PIXEL_ARGB) 2413 + { 2414 + alpha = *p_in++; 2415 + red = *p_in++; 2416 + green = *p_in++; 2417 + blue = *p_in++; 2418 + } 2419 + else if (img_in->pixel_format == GG_PIXEL_BGR) 2420 + { 2421 + blue = *p_in++; 2422 + green = *p_in++; 2423 + red = *p_in++; 2424 + alpha = 255; 2425 + } 2426 + else if (img_in->pixel_format == GG_PIXEL_BGRA) 2427 + { 2428 + blue = *p_in++; 2429 + green = *p_in++; 2430 + red = *p_in++; 2431 + alpha = *p_in++; 2432 + } 2433 + else if (img_in->pixel_format == GG_PIXEL_GRAYSCALE) 2434 + { 2435 + red = *p_in++; 2436 + green = red; 2437 + blue = red; 2438 + alpha = 255; 2439 + } 2440 + else if (img_in->pixel_format == GG_PIXEL_PALETTE) 2441 + { 2442 + int index = *p_in++; 2443 + red = img_in->palette_red[index]; 2444 + green = img_in->palette_green[index]; 2445 + blue = img_in->palette_blue[index]; 2446 + alpha = 255; 2447 + } 2448 + if (img_out->pixel_format == GG_PIXEL_RGB) 2449 + { 2450 + *p_out++ = red; 2451 + *p_out++ = green; 2452 + *p_out++ = blue; 2453 + } 2454 + else if (img_out->pixel_format == GG_PIXEL_RGBA) 2455 + { 2456 + *p_out++ = red; 2457 + *p_out++ = green; 2458 + *p_out++ = blue; 2459 + *p_out++ = alpha; 2460 + } 2461 + else if (img_out->pixel_format == GG_PIXEL_ARGB) 2462 + { 2463 + *p_out++ = alpha; 2464 + *p_out++ = red; 2465 + *p_out++ = green; 2466 + *p_out++ = blue; 2467 + } 2468 + else if (img_out->pixel_format == GG_PIXEL_BGR) 2469 + { 2470 + *p_out++ = blue; 2471 + *p_out++ = green; 2472 + *p_out++ = red; 2473 + } 2474 + else if (img_out->pixel_format == GG_PIXEL_BGRA) 2475 + { 2476 + *p_out++ = blue; 2477 + *p_out++ = green; 2478 + *p_out++ = red; 2479 + *p_out++ = alpha; 2480 + } 2481 + } 2482 + } 2483 + img_out->current_available_rows = row + 1; 2484 + return GGRAPH_OK; 2485 +} 2486 + 2487 +GGRAPH_DECLARE int 2488 +gGraphReadNextStrip (const void *ptr, int *progress) 2489 +{ 2490 +/* reading the next strip from a strip image */ 2491 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2492 + 2493 + if (img == NULL) 2494 + return GGRAPH_INVALID_IMAGE; 2495 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2496 + return GGRAPH_INVALID_IMAGE; 2497 + 2498 + if (img->next_row < img->height) 2499 + { 2500 + if (img->codec_id == GGRAPH_IMAGE_PNG) 2501 + return gg_image_strip_read_from_png (img, progress); 2502 + if (img->codec_id == GGRAPH_IMAGE_JPEG) 2503 + return gg_image_strip_read_from_jpeg (img, progress); 2504 + if (img->codec_id == GGRAPH_IMAGE_TIFF 2505 + || img->codec_id == GGRAPH_IMAGE_GEOTIFF) 2506 + return gg_image_strip_read_from_tiff (img, progress); 2507 + if (img->codec_id == GGRAPH_IMAGE_HGT) 2508 + return gg_image_strip_read_from_hgt (img, progress); 2509 + if (img->codec_id == GGRAPH_IMAGE_BIN_HDR) 2510 + return gg_image_strip_read_from_bin_grid (img, progress); 2511 + if (img->codec_id == GGRAPH_IMAGE_FLT_HDR) 2512 + return gg_image_strip_read_from_bin_grid (img, progress); 2513 + if (img->codec_id == GGRAPH_IMAGE_DEM_HDR) 2514 + return gg_image_strip_read_from_dem_grid (img, progress); 2515 + if (img->codec_id == GGRAPH_IMAGE_ASCII_GRID) 2516 + return gg_image_strip_read_from_ascii_grid (img, progress); 2517 + } 2518 + 2519 + return GGRAPH_INVALID_IMAGE; 2520 +} 2521 + 2522 +GGRAPH_DECLARE int 2523 +gGraphWriteNextStrip (const void *ptr, int *progress) 2524 +{ 2525 +/* writing the next strip into a strip image */ 2526 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2527 + 2528 + if (img == NULL) 2529 + return GGRAPH_INVALID_IMAGE; 2530 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2531 + return GGRAPH_INVALID_IMAGE; 2532 + 2533 + if (img->next_row < img->height) 2534 + { 2535 + if (img->codec_id == GGRAPH_IMAGE_PNG) 2536 + return gg_image_write_to_png_by_strip (img, progress); 2537 + if (img->codec_id == GGRAPH_IMAGE_JPEG) 2538 + return gg_image_write_to_jpeg_by_strip (img, progress); 2539 + if (img->codec_id == GGRAPH_IMAGE_TIFF 2540 + || img->codec_id == GGRAPH_IMAGE_GEOTIFF) 2541 + return gg_image_write_to_tiff_by_strip (img, progress); 2542 + if (img->codec_id == GGRAPH_IMAGE_BIN_HDR) 2543 + return gg_image_write_to_bin_hdr_by_strip (img, progress); 2544 + if (img->codec_id == GGRAPH_IMAGE_FLT_HDR) 2545 + return gg_image_write_to_flt_hdr_by_strip (img, progress); 2546 + if (img->codec_id == GGRAPH_IMAGE_ASCII_GRID) 2547 + return gg_image_write_to_ascii_grid_by_strip (img, progress); 2548 + } 2549 + 2550 + return GGRAPH_INVALID_IMAGE; 2551 +} 2552 + 2553 +GGRAPH_DECLARE int 2554 +gGraphStripImageGetNextRow (const void *ptr, int *next_row) 2555 +{ 2556 +/* retrieving the current Next Row */ 2557 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2558 + 2559 + *next_row = -1; 2560 + if (img == NULL) 2561 + return GGRAPH_INVALID_IMAGE; 2562 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2563 + return GGRAPH_INVALID_IMAGE; 2564 + 2565 + *next_row = img->next_row; 2566 + return GGRAPH_OK; 2567 +} 2568 + 2569 +GGRAPH_DECLARE int 2570 +gGraphStripIsFull (const void *ptr) 2571 +{ 2572 +/* checks it the strip is full (ready to be written) */ 2573 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2574 + 2575 + if (img == NULL) 2576 + return GGRAPH_INVALID_IMAGE; 2577 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2578 + return GGRAPH_INVALID_IMAGE; 2579 + 2580 + if (img->current_available_rows == img->rows_per_block) 2581 + return GGRAPH_OK; 2582 + if (img->next_row + img->current_available_rows == img->height) 2583 + return GGRAPH_OK; 2584 + return GGRAPH_ERROR; 2585 +} 2586 + 2587 +GGRAPH_DECLARE int 2588 +gGraphStripImageRewind (const void *ptr) 2589 +{ 2590 +/* rewinds the image (to first scanline) */ 2591 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2592 + 2593 + if (img == NULL) 2594 + return GGRAPH_INVALID_IMAGE; 2595 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2596 + return GGRAPH_INVALID_IMAGE; 2597 + 2598 + img->next_row = 0; 2599 + return GGRAPH_OK; 2600 +} 2601 + 2602 +GGRAPH_DECLARE int 2603 +gGraphStripImageGetCurrentRows (const void *ptr, int *rows) 2604 +{ 2605 +/* return how many rows are currently into the buffer */ 2606 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2607 + 2608 + *rows = 0; 2609 + if (img == NULL) 2610 + return GGRAPH_INVALID_IMAGE; 2611 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2612 + return GGRAPH_INVALID_IMAGE; 2613 + 2614 + *rows = img->current_available_rows; 2615 + return GGRAPH_OK; 2616 +} 2617 + 2618 +GGRAPH_DECLARE int 2619 +gGraphStripImageGetPixelRGB (const void *ptr, int col, int row, 2620 + unsigned char *red, unsigned char *green, 2621 + unsigned char *blue) 2622 +{ 2623 +/* retrieving an RGB pixel by col and row */ 2624 + unsigned char *p_in; 2625 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2626 + 2627 + *red = 0; 2628 + *green = 0; 2629 + *blue = 0; 2630 + if (img == NULL) 2631 + return GGRAPH_INVALID_IMAGE; 2632 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2633 + return GGRAPH_INVALID_IMAGE; 2634 + 2635 + if (col < 0 || col >= img->width) 2636 + return GGRAPH_ERROR; 2637 + if (row < 0 || row >= img->current_available_rows) 2638 + return GGRAPH_ERROR; 2639 + 2640 + p_in = img->pixels + (row * img->scanline_width) + (col * img->pixel_size); 2641 + if (img->pixel_format == GG_PIXEL_RGB) 2642 + { 2643 + *red = *p_in++; 2644 + *green = *p_in++; 2645 + *blue = *p_in++; 2646 + } 2647 + else if (img->pixel_format == GG_PIXEL_RGBA) 2648 + { 2649 + *red = *p_in++; 2650 + *green = *p_in++; 2651 + *blue = *p_in++; 2652 + p_in++; /* discarding Alpha */ 2653 + } 2654 + else if (img->pixel_format == GG_PIXEL_ARGB) 2655 + { 2656 + p_in++; /* discarding Alpha */ 2657 + *red = *p_in++; 2658 + *green = *p_in++; 2659 + *blue = *p_in++; 2660 + } 2661 + else if (img->pixel_format == GG_PIXEL_BGR) 2662 + { 2663 + *blue = *p_in++; 2664 + *green = *p_in++; 2665 + *red = *p_in++; 2666 + } 2667 + else if (img->pixel_format == GG_PIXEL_BGRA) 2668 + { 2669 + *blue = *p_in++; 2670 + *green = *p_in++; 2671 + *red = *p_in++; 2672 + p_in++; /* discarding Alpha */ 2673 + } 2674 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 2675 + { 2676 + *red = *p_in++; 2677 + *green = *red; 2678 + *blue = *red; 2679 + } 2680 + else if (img->pixel_format == GG_PIXEL_PALETTE) 2681 + { 2682 + int index = *p_in++; 2683 + *red = img->palette_red[index]; 2684 + *green = img->palette_green[index]; 2685 + *blue = img->palette_blue[index]; 2686 + } 2687 + 2688 + return GGRAPH_OK; 2689 +} 2690 + 2691 +static unsigned char 2692 +match_palette2 (const gGraphStripImagePtr img, unsigned char r, unsigned char g, 2693 + unsigned char b) 2694 +{ 2695 +/* handling palette colors */ 2696 + int index; 2697 + double min_dist = DBL_MAX; 2698 + double dist; 2699 + int min_index; 2700 + for (index = 0; index < img->max_palette; index++) 2701 + { 2702 + /* searching if already defined */ 2703 + if (img->palette_red[index] == r && img->palette_green[index] == g 2704 + && img->palette_blue[index] == b) 2705 + return (unsigned char) index; 2706 + } 2707 + if (img->max_palette < 255) 2708 + { 2709 + /* inserting a new palette entry */ 2710 + unsigned char i = img->max_palette; 2711 + img->max_palette += 1; 2712 + img->palette_red[i] = r; 2713 + img->palette_green[i] = g; 2714 + img->palette_blue[i] = b; 2715 + return i; 2716 + } 2717 +/* all right, the palette is already fully populated */ 2718 + for (index = 0; index < img->max_palette; index++) 2719 + { 2720 + /* computing the minimal euclidean distance */ 2721 + dist = 2722 + sqrt (((img->palette_red[index] - r) * (img->palette_red[index] - 2723 + r)) + 2724 + ((img->palette_green[index] - 2725 + g) * (img->palette_green[index] - g)) + 2726 + ((img->palette_blue[index] - 2727 + b) * (img->palette_blue[index] - b))); 2728 + if (dist < min_dist) 2729 + { 2730 + min_dist = dist; 2731 + min_index = index; 2732 + } 2733 + } 2734 + return (unsigned char) min_index; 2735 +} 2736 + 2737 +GGRAPH_DECLARE int 2738 +gGraphStripImageSetPixelRGB (const void *ptr, int col, int row, 2739 + unsigned char red, unsigned char green, 2740 + unsigned char blue) 2741 +{ 2742 +/* setting an RGB pixel by col and row */ 2743 + unsigned char *p_out; 2744 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2745 + 2746 + if (img == NULL) 2747 + return GGRAPH_INVALID_IMAGE; 2748 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2749 + return GGRAPH_INVALID_IMAGE; 2750 + 2751 + if (col < 0 || col >= img->width) 2752 + return GGRAPH_ERROR; 2753 + if (row < 0 || row >= img->current_available_rows) 2754 + return GGRAPH_ERROR; 2755 + 2756 + p_out = img->pixels + (row * img->scanline_width) + (col * img->pixel_size); 2757 + if (img->pixel_format == GG_PIXEL_RGB) 2758 + { 2759 + *p_out++ = red; 2760 + *p_out++ = green; 2761 + *p_out++ = blue; 2762 + } 2763 + else if (img->pixel_format == GG_PIXEL_RGBA) 2764 + { 2765 + *p_out++ = red; 2766 + *p_out++ = green; 2767 + *p_out++ = blue; 2768 + *p_out++ = 255; /* defaulting Alpha [opaque] */ 2769 + } 2770 + else if (img->pixel_format == GG_PIXEL_ARGB) 2771 + { 2772 + 2773 + *p_out++ = 255; /* defaulting Alpha [opaque] */ 2774 + *p_out++ = red; 2775 + *p_out++ = green; 2776 + *p_out++ = blue; 2777 + } 2778 + else if (img->pixel_format == GG_PIXEL_BGR) 2779 + { 2780 + *p_out++ = blue; 2781 + *p_out++ = green; 2782 + *p_out++ = red; 2783 + } 2784 + else if (img->pixel_format == GG_PIXEL_BGRA) 2785 + { 2786 + *p_out++ = blue; 2787 + *p_out++ = green; 2788 + *p_out++ = red; 2789 + 2790 + *p_out++ = 255; /* defaulting Alpha [opaque] */ 2791 + } 2792 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 2793 + { 2794 + int gray; 2795 + if (red == green && green == blue) 2796 + gray = red; 2797 + else 2798 + gray = to_grayscale2 (red, green, blue); 2799 + *p_out++ = gray; 2800 + } 2801 + else if (img->pixel_format == GG_PIXEL_PALETTE) 2802 + { 2803 + int index = match_palette2 (img, red, green, blue); 2804 + *p_out++ = index; 2805 + } 2806 + 2807 + return GGRAPH_OK; 2808 +} 2809 + 2810 +GGRAPH_DECLARE int 2811 +gGraphStripImageSetCurrentRows (const void *ptr, int rows) 2812 +{ 2813 +/* sets the number of rows currently into the buffer */ 2814 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2815 + 2816 + if (img == NULL) 2817 + return GGRAPH_INVALID_IMAGE; 2818 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2819 + return GGRAPH_INVALID_IMAGE; 2820 + 2821 + img->current_available_rows = rows; 2822 + return GGRAPH_OK; 2823 +} 2824 + 2825 +GGRAPH_DECLARE void 2826 +gGraphDestroyImageInfos (const void *ptr) 2827 +{ 2828 +/* destroyng an image INFOS object */ 2829 + gGraphImageInfosPtr img = (gGraphImageInfosPtr) ptr; 2830 + 2831 + if (img == NULL) 2832 + return; 2833 + if (img->signature != GG_IMAGE_INFOS_MAGIC_SIGNATURE) 2834 + return; 2835 + gg_image_infos_destroy (img); 2836 +} 2837 + 2838 +GGRAPH_DECLARE int 2839 +gGraphGetImageInfos (const void *ptr, int *width, int *height, int *colorspace, 2840 + int *max_palette, int *bits_per_sample, 2841 + int *samples_per_pixel, int *sample_format, 2842 + int *tile_width, int *tile_height, int *rows_per_strip, 2843 + int *compression, double *no_data_value, double *min_value, 2844 + double *max_value, int *scale_1_2, int *scale_1_4, 2845 + int *scale_1_8) 2846 +{ 2847 +/* querying image INFOSt */ 2848 + gGraphImageInfosPtr infos = (gGraphImageInfosPtr) ptr; 2849 + gGraphImagePtr img = (gGraphImagePtr) ptr; 2850 + gGraphStripImagePtr strip_img = (gGraphStripImagePtr) ptr; 2851 + 2852 + if (ptr == NULL) 2853 + return GGRAPH_ERROR; 2854 + if (infos->signature == GG_IMAGE_INFOS_MAGIC_SIGNATURE) 2855 + { 2856 + /* form the INFO struct */ 2857 + *width = infos->width; 2858 + *height = infos->height; 2859 + switch (infos->pixel_format) 2860 + { 2861 + case GG_PIXEL_RGB: 2862 + case GG_PIXEL_BGR: 2863 + *colorspace = GGRAPH_COLORSPACE_TRUECOLOR; 2864 + break; 2865 + case GG_PIXEL_RGBA: 2866 + case GG_PIXEL_ARGB: 2867 + case GG_PIXEL_BGRA: 2868 + *colorspace = GGRAPH_COLORSPACE_TRUECOLOR; 2869 + break; 2870 + case GG_PIXEL_GRAYSCALE: 2871 + *colorspace = GGRAPH_COLORSPACE_GRAYSCALE; 2872 + break; 2873 + case GG_PIXEL_PALETTE: 2874 + if (infos->max_palette == 2) 2875 + { 2876 + if ((infos->palette_red[0] == 255 2877 + && infos->palette_green[0] == 255 2878 + && infos->palette_blue[0] == 255 2879 + && infos->palette_red[1] == 0 2880 + && infos->palette_green[1] == 0 2881 + && infos->palette_blue[1] == 0) 2882 + || (infos->palette_red[0] == 0 2883 + && infos->palette_green[0] == 0 2884 + && infos->palette_blue[0] == 0 2885 + && infos->palette_red[1] == 255 2886 + && infos->palette_green[1] == 255 2887 + && infos->palette_blue[1] == 255)) 2888 + *colorspace = GGRAPH_COLORSPACE_MONOCHROME; 2889 + else 2890 + *colorspace = GGRAPH_COLORSPACE_PALETTE; 2891 + } 2892 + else 2893 + *colorspace = GGRAPH_COLORSPACE_PALETTE; 2894 + break; 2895 + case GG_PIXEL_GRID: 2896 + *colorspace = GGRAPH_COLORSPACE_GRID; 2897 + break; 2898 + default: 2899 + *colorspace = GGRAPH_COLORSPACE_UNKNOWN; 2900 + break; 2901 + }; 2902 + *bits_per_sample = infos->bits_per_sample; 2903 + *samples_per_pixel = infos->samples_per_pixel; 2904 + *sample_format = infos->sample_format; 2905 + *tile_width = infos->tile_width; 2906 + *tile_height = infos->tile_height; 2907 + *rows_per_strip = infos->rows_per_strip; 2908 + *compression = infos->compression; 2909 + *no_data_value = infos->no_data_value; 2910 + *min_value = infos->min_value; 2911 + *max_value = infos->max_value; 2912 + *scale_1_2 = infos->scale_1_2; 2913 + *scale_1_4 = infos->scale_1_4; 2914 + *scale_1_8 = infos->scale_1_8; 2915 + return GGRAPH_OK; 2916 + } 2917 + else if (img->signature == GG_IMAGE_MAGIC_SIGNATURE) 2918 + { 2919 + /* from the IMAGE struct */ 2920 + *width = img->width; 2921 + *height = img->height; 2922 + switch (img->pixel_format) 2923 + { 2924 + case GG_PIXEL_RGB: 2925 + case GG_PIXEL_BGR: 2926 + *colorspace = GGRAPH_COLORSPACE_TRUECOLOR; 2927 + break; 2928 + case GG_PIXEL_RGBA: 2929 + case GG_PIXEL_ARGB: 2930 + case GG_PIXEL_BGRA: 2931 + *colorspace = GGRAPH_COLORSPACE_TRUECOLOR; 2932 + break; 2933 + case GG_PIXEL_GRAYSCALE: 2934 + *colorspace = GGRAPH_COLORSPACE_GRAYSCALE; 2935 + break; 2936 + case GG_PIXEL_PALETTE: 2937 + if (img->max_palette == 2) 2938 + { 2939 + if ((img->palette_red[0] == 255 2940 + && img->palette_green[0] == 255 2941 + && img->palette_blue[0] == 255 2942 + && img->palette_red[1] == 0 2943 + && img->palette_green[1] == 0 2944 + && img->palette_blue[1] == 0) 2945 + || (img->palette_red[0] == 0 2946 + && img->palette_green[0] == 0 2947 + && img->palette_blue[0] == 0 2948 + && img->palette_red[1] == 255 2949 + && img->palette_green[1] == 255 2950 + && img->palette_blue[1] == 255)) 2951 + *colorspace = GGRAPH_COLORSPACE_MONOCHROME; 2952 + else 2953 + *colorspace = GGRAPH_COLORSPACE_PALETTE; 2954 + } 2955 + else 2956 + *colorspace = GGRAPH_COLORSPACE_PALETTE; 2957 + break; 2958 + case GG_PIXEL_GRID: 2959 + *colorspace = GGRAPH_COLORSPACE_GRID; 2960 + break; 2961 + default: 2962 + *colorspace = GGRAPH_COLORSPACE_UNKNOWN; 2963 + break; 2964 + }; 2965 + *max_palette = img->max_palette; 2966 + *bits_per_sample = img->bits_per_sample; 2967 + *samples_per_pixel = img->samples_per_pixel; 2968 + *sample_format = img->sample_format; 2969 + *tile_width = img->tile_width; 2970 + *tile_height = img->tile_height; 2971 + *rows_per_strip = img->rows_per_strip; 2972 + *compression = img->compression; 2973 + *no_data_value = img->no_data_value; 2974 + *min_value = img->min_value; 2975 + *max_value = img->max_value; 2976 + return GGRAPH_OK; 2977 + } 2978 + else if (strip_img->signature == GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2979 + { 2980 + /* from the IMAGE struct */ 2981 + *width = strip_img->width; 2982 + *height = strip_img->height; 2983 + switch (strip_img->pixel_format) 2984 + { 2985 + case GG_PIXEL_RGB: 2986 + case GG_PIXEL_BGR: 2987 + *colorspace = GGRAPH_COLORSPACE_TRUECOLOR; 2988 + break; 2989 + case GG_PIXEL_RGBA: 2990 + case GG_PIXEL_ARGB: 2991 + case GG_PIXEL_BGRA: 2992 + *colorspace = GGRAPH_COLORSPACE_TRUECOLOR; 2993 + break; 2994 + case GG_PIXEL_GRAYSCALE: 2995 + *colorspace = GGRAPH_COLORSPACE_GRAYSCALE; 2996 + break; 2997 + case GG_PIXEL_PALETTE: 2998 + if (strip_img->max_palette == 2) 2999 + { 3000 + if ((strip_img->palette_red[0] == 255 3001 + && strip_img->palette_green[0] == 255 3002 + && strip_img->palette_blue[0] == 255 3003 + && strip_img->palette_red[1] == 0 3004 + && strip_img->palette_green[1] == 0 3005 + && strip_img->palette_blue[1] == 0) 3006 + || (strip_img->palette_red[0] == 0 3007 + && strip_img->palette_green[0] == 0 3008 + && strip_img->palette_blue[0] == 0 3009 + && strip_img->palette_red[1] == 255 3010 + && strip_img->palette_green[1] == 255 3011 + && strip_img->palette_blue[1] == 255)) 3012 + *colorspace = GGRAPH_COLORSPACE_MONOCHROME; 3013 + else 3014 + *colorspace = GGRAPH_COLORSPACE_PALETTE; 3015 + } 3016 + else 3017 + *colorspace = GGRAPH_COLORSPACE_PALETTE; 3018 + break; 3019 + case GG_PIXEL_GRID: 3020 + *colorspace = GGRAPH_COLORSPACE_GRID; 3021 + break; 3022 + default: 3023 + *colorspace = GGRAPH_COLORSPACE_UNKNOWN; 3024 + break; 3025 + }; 3026 + *max_palette = strip_img->max_palette; 3027 + *bits_per_sample = strip_img->bits_per_sample; 3028 + *samples_per_pixel = strip_img->samples_per_pixel; 3029 + *sample_format = strip_img->sample_format; 3030 + *tile_width = strip_img->tile_width; 3031 + *tile_height = strip_img->tile_height; 3032 + *rows_per_strip = strip_img->rows_per_strip; 3033 + *compression = strip_img->compression; 3034 + *no_data_value = strip_img->no_data_value; 3035 + *min_value = strip_img->min_value; 3036 + *max_value = strip_img->max_value; 3037 + return GGRAPH_OK; 3038 + } 3039 + return GGRAPH_ERROR; 3040 +} 3041 + 3042 +GGRAPH_DECLARE int 3043 +gGraphGetImageDims (const void *ptr, int *width, int *height) 3044 +{ 3045 +/* querying image Width / Height */ 3046 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3047 + 3048 + if (img == NULL) 3049 + return GGRAPH_INVALID_IMAGE; 3050 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3051 + return GGRAPH_INVALID_IMAGE; 3052 + *width = img->width; 3053 + *height = img->height; 3054 + return GGRAPH_OK; 3055 +} 3056 + 3057 +GGRAPH_DECLARE int 3058 +gGraphGetImageSize (const void *ptr, int *size) 3059 +{ 3060 +/* querying image size */ 3061 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3062 + 3063 + if (img == NULL) 3064 + return GGRAPH_INVALID_IMAGE; 3065 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3066 + return GGRAPH_INVALID_IMAGE; 3067 + 3068 + *size = img->height * img->scanline_width; 3069 + if (gg_is_image_monochrome_ready (img) == GGRAPH_TRUE) 3070 + *size /= 8; 3071 + 3072 + return GGRAPH_OK; 3073 +} 3074 + 3075 +GGRAPH_DECLARE int 3076 +gGraphImageColorSpaceOptimize (const void *ptr) 3077 +{ 3078 +/* attempting to optimize the actual color space */ 3079 + int current_color_space; 3080 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3081 + 3082 + if (img == NULL) 3083 + return GGRAPH_INVALID_IMAGE; 3084 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3085 + return GGRAPH_INVALID_IMAGE; 3086 + 3087 + if (img->pixel_format == GG_PIXEL_PALETTE) 3088 + { 3089 + if (gg_is_image_monochrome_ready (img) == GGRAPH_TRUE) 3090 + current_color_space = GGRAPH_COLORSPACE_MONOCHROME; 3091 + else 3092 + current_color_space = GGRAPH_COLORSPACE_PALETTE; 3093 + } 3094 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 3095 + current_color_space = GGRAPH_COLORSPACE_GRAYSCALE; 3096 + else 3097 + current_color_space = GGRAPH_COLORSPACE_TRUECOLOR; 3098 + 3099 + if (current_color_space == GGRAPH_COLORSPACE_MONOCHROME) 3100 + { 3101 + /* already optimized */ 3102 + return GGRAPH_OK; 3103 + } 3104 + if (gg_is_image_monochrome (img) == GGRAPH_TRUE) 3105 + { 3106 + /* attempting to optimize into MONOCHROME */ 3107 + return gg_convert_image_to_monochrome (img); 3108 + } 3109 + if (gg_is_image_grayscale (img) == GGRAPH_TRUE) 3110 + { 3111 + /* attempting to optimize into GRAYSCALE */ 3112 + return gg_convert_image_to_grayscale (img); 3113 + } 3114 + if (current_color_space == GGRAPH_COLORSPACE_PALETTE) 3115 + { 3116 + /* already optimized */ 3117 + return GGRAPH_OK; 3118 + } 3119 + if (gg_is_image_palette256 (img) == GGRAPH_TRUE) 3120 + { 3121 + /* attempting to optimize into PALETTE */ 3122 + return gg_convert_image_to_palette (img); 3123 + } 3124 + return GGRAPH_OK; 3125 +} 3126 + 3127 +GGRAPH_DECLARE int 3128 +gGraphImageResampleAsGridInt16 (const void *ptr) 3129 +{ 3130 +/* promoting to GRID-Int16 */ 3131 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3132 + 3133 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3134 + return GGRAPH_INVALID_IMAGE; 3135 + 3136 + return gg_convert_image_to_grid_int16 (img); 3137 +} 3138 + 3139 +GGRAPH_DECLARE int 3140 +gGraphImageResampleAsGridUInt16 (const void *ptr) 3141 +{ 3142 +/* promoting to GRID-UInt16 */ 3143 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3144 + 3145 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3146 + return GGRAPH_INVALID_IMAGE; 3147 + 3148 + return gg_convert_image_to_grid_uint16 (img); 3149 +} 3150 + 3151 +GGRAPH_DECLARE int 3152 +gGraphImageResampleAsGridInt32 (const void *ptr) 3153 +{ 3154 +/* promoting to GRID-Int32 */ 3155 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3156 + 3157 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3158 + return GGRAPH_INVALID_IMAGE; 3159 + 3160 + return gg_convert_image_to_grid_int32 (img); 3161 +} 3162 + 3163 +GGRAPH_DECLARE int 3164 +gGraphImageResampleAsGridUInt32 (const void *ptr) 3165 +{ 3166 +/* promoting to GRID-UInt32 */ 3167 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3168 + 3169 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3170 + return GGRAPH_INVALID_IMAGE; 3171 + 3172 + return gg_convert_image_to_grid_uint32 (img); 3173 +} 3174 + 3175 +GGRAPH_DECLARE int 3176 +gGraphImageResampleAsGridFloat (const void *ptr) 3177 +{ 3178 +/* promoting to GRID-Float */ 3179 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3180 + 3181 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3182 + return GGRAPH_INVALID_IMAGE; 3183 + 3184 + return gg_convert_image_to_grid_float (img); 3185 +} 3186 + 3187 +GGRAPH_DECLARE int 3188 +gGraphImageResampleAsGridDouble (const void *ptr) 3189 +{ 3190 +/* promoting to GRID-Double */ 3191 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3192 + 3193 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3194 + return GGRAPH_INVALID_IMAGE; 3195 + 3196 + return gg_convert_image_to_grid_double (img); 3197 +} 3198 + 3199 +GGRAPH_DECLARE int 3200 +gGraphImageResampleAsRgb (const void *ptr) 3201 +{ 3202 +/* promoting to RGB */ 3203 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3204 + 3205 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3206 + return GGRAPH_INVALID_IMAGE; 3207 + 3208 + return gg_convert_image_to_rgb (img); 3209 +} 3210 + 3211 +GGRAPH_DECLARE int 3212 +gGraphImageTransparentResample (const void *ptr) 3213 +{ 3214 +/* resampling the Transparent Color near-values as Transparent */ 3215 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3216 + 3217 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3218 + return GGRAPH_INVALID_IMAGE; 3219 + 3220 + switch (img->pixel_format) 3221 + { 3222 + case GG_PIXEL_RGB: 3223 + return gg_resample_transparent_rgb (img); 3224 + case GG_PIXEL_RGBA: 3225 + return gg_resample_transparent_rgba (img); 3226 + case GG_PIXEL_GRAYSCALE: 3227 + return gg_resample_transparent_grayscale (img); 3228 + case GG_PIXEL_PALETTE: 3229 + return gg_resample_transparent_palette (img); 3230 + default: 3231 + return GGRAPH_OK; 3232 + }; 3233 +} 3234 + 3235 +GGRAPH_DECLARE int 3236 +gGraphImageResampleAsMonochrome (const void *ptr) 3237 +{ 3238 +/* applying BILEVEL quantization */ 3239 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3240 + 3241 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3242 + return GGRAPH_INVALID_IMAGE; 3243 + 3244 + return gg_convert_image_to_monochrome (img); 3245 +} 3246 + 3247 +GGRAPH_DECLARE int 3248 +gGraphImageResampleAsPalette (const void *ptr, int num_colors) 3249 +{ 3250 +/* applying quantization in order to fit into PALETTE colorspace */ 3251 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3252 + 3253 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3254 + return GGRAPH_INVALID_IMAGE; 3255 + 3256 + return gg_image_resample_as_palette (img, num_colors); 3257 +} 3258 + 3259 +GGRAPH_DECLARE int 3260 +gGraphImageResampleAsGrayscale (const void *ptr) 3261 +{ 3262 +/* converting into GRAYSCALE */ 3263 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3264 + 3265 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3266 + return GGRAPH_INVALID_IMAGE; 3267 + 3268 + return gg_convert_image_to_grayscale (img); 3269 +} 3270 + 3271 +GGRAPH_DECLARE int 3272 +gGraphImageResampleAsPhotographic (const void *ptr) 3273 +{ 3274 +/* converting into GRAYSCALE or RGB colorspace */ 3275 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3276 + 3277 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3278 + return GGRAPH_INVALID_IMAGE; 3279 + 3280 + if (img->pixel_format == GG_PIXEL_GRAYSCALE 3281 + || img->pixel_format == GG_PIXEL_RGB) 3282 + return GGRAPH_OK; 3283 + 3284 + if (gg_is_image_grayscale (img) == GGRAPH_TRUE) 3285 + { 3286 + /* attempting to convert into GRAYSCALE */ 3287 + return gg_convert_image_to_grayscale (img); 3288 + } 3289 + 3290 + return gg_convert_image_to_rgb (img); 3291 +} 3292 + 3293 +GGRAPH_DECLARE int 3294 +gGraphImageGuessFormat (const void *mem_buf, int mem_buf_size) 3295 +{ 3296 +/* attempting to guess the Image type from its Magic Number */ 3297 + const unsigned char *p = mem_buf; 3298 + if (mem_buf_size > 6) 3299 + { 3300 + if (p[0] == 'G' && p[1] == 'I' && p[2] == 'F' && p[3] == '8' 3301 + && (p[4] == '7' || p[4] == '9') && p[5] == 'a') 3302 + return GGRAPH_IMAGE_GIF; 3303 + if (p[0] == 0x89 && p[1] == 'P' && p[2] == 'N' && p[3] == 'G' 3304 + && p[4] == 0x0d && p[5] == 0x0a) 3305 + return GGRAPH_IMAGE_PNG; 3306 + } 3307 + if (mem_buf_size > 4) 3308 + { 3309 + if (p[0] == 'M' && p[1] == 'M' && p[2] == 0x00 && p[3] == '*') 3310 + return GGRAPH_IMAGE_TIFF; 3311 + if (p[0] == 'I' && p[1] == 'I' && p[2] == '*' && p[3] == 0x00) 3312 + return GGRAPH_IMAGE_TIFF; 3313 + } 3314 + if (mem_buf_size > 2) 3315 + { 3316 + if (p[0] == 0xff && p[1] == 0xd8) 3317 + return GGRAPH_IMAGE_JPEG; 3318 + } 3319 + return GGRAPH_IMAGE_UNKNOWN; 3320 +} 3321 + 3322 +GGRAPH_DECLARE int 3323 +gGraphFileImageGuessFormat (const char *path, int *type) 3324 +{ 3325 +/* attempting to guess the FileImage type from its Magic Number */ 3326 + FILE *in = NULL; 3327 + unsigned char mem_buf[10]; 3328 + int mem_buf_size; 3329 + 3330 + *type = GGRAPH_IMAGE_UNKNOWN; 3331 +/* attempting to open the image file */ 3332 + in = fopen (path, "rb"); 3333 + if (in == NULL) 3334 + return GGRAPH_FILE_OPEN_ERROR; 3335 + mem_buf_size = fread (mem_buf, 1, 10, in); 3336 + if (mem_buf_size < 10) 3337 + { 3338 + fclose (in); 3339 + return GGRAPH_FILE_READ_ERROR; 3340 + } 3341 + fclose (in); 3342 + *type = gGraphImageGuessFormat (mem_buf, 10); 3343 + return GGRAPH_OK; 3344 +} 3345 + 3346 +GGRAPH_DECLARE int 3347 +gGraphImageIsGeoRef (const void *ptr) 3348 +{ 3349 +/* checking if an Image is georeferenced or not */ 3350 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3351 + 3352 + if (img == NULL) 3353 + return GGRAPH_ERROR; 3354 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3355 + return GGRAPH_ERROR; 3356 + 3357 + if (img->is_georeferenced) 3358 + return GGRAPH_OK; 3359 + return GGRAPH_ERROR; 3360 +} 3361 + 3362 +GGRAPH_DECLARE int 3363 +gGraphImageSetGeoRef (const void *ptr, int srid, const char *srs_name, 3364 + const char *proj4text, double upper_left_x, 3365 + double upper_left_y, double pixel_x_size, 3366 + double pixel_y_size) 3367 +{ 3368 +/* setting the georeferencing infos for some Image */ 3369 + int len; 3370 + char *SrsName = NULL; 3371 + char *Proj4Text = NULL; 3372 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3373 + gGraphStripImagePtr strip_img = (gGraphStripImagePtr) ptr; 3374 + 3375 + if (img == NULL) 3376 + return GGRAPH_IMAGE_UNKNOWN; 3377 + if (img->signature == GG_IMAGE_MAGIC_SIGNATURE) 3378 + { 3379 + /* setting up an Image struct */ 3380 + if (srs_name) 3381 + { 3382 + len = strlen (srs_name); 3383 + if (len > 0) 3384 + { 3385 + SrsName = malloc (len + 1); 3386 + if (!SrsName) 3387 + return GGRAPH_ERROR; 3388 + strcpy (SrsName, srs_name); 3389 + } 3390 + } 3391 + if (proj4text) 3392 + { 3393 + len = strlen (proj4text); 3394 + if (len > 0) 3395 + { 3396 + Proj4Text = malloc (len + 1); 3397 + if (!Proj4Text) 3398 + { 3399 + free (SrsName); 3400 + return GGRAPH_ERROR; 3401 + } 3402 + strcpy (Proj4Text, proj4text); 3403 + } 3404 + } 3405 + 3406 + if (img->srs_name) 3407 + free (img->srs_name); 3408 + if (img->proj4text) 3409 + free (img->proj4text); 3410 + 3411 + img->is_georeferenced = 1; 3412 + img->srid = srid; 3413 + img->srs_name = SrsName; 3414 + img->proj4text = Proj4Text; 3415 + img->upper_left_x = upper_left_x; 3416 + img->upper_left_y = upper_left_y; 3417 + img->pixel_x_size = pixel_x_size; 3418 + img->pixel_y_size = pixel_y_size; 3419 + return GGRAPH_OK; 3420 + } 3421 + else if (strip_img->signature == GG_STRIP_IMAGE_MAGIC_SIGNATURE) 3422 + { /* setting up a Strip Image struct */ 3423 + if (srs_name) 3424 + { 3425 + len = strlen (srs_name); 3426 + if (len > 0) 3427 + { 3428 + SrsName = malloc (len + 1); 3429 + if (!SrsName) 3430 + return GGRAPH_ERROR; 3431 + strcpy (SrsName, srs_name); 3432 + } 3433 + } 3434 + if (proj4text) 3435 + { 3436 + len = strlen (proj4text); 3437 + if (len > 0) 3438 + { 3439 + Proj4Text = malloc (len + 1); 3440 + if (!Proj4Text) 3441 + { 3442 + free (SrsName); 3443 + return GGRAPH_ERROR; 3444 + } 3445 + strcpy (Proj4Text, proj4text); 3446 + } 3447 + } 3448 + 3449 + if (strip_img->srs_name) 3450 + free (strip_img->srs_name); 3451 + if (strip_img->proj4text) 3452 + free (strip_img->proj4text); 3453 + 3454 + strip_img->is_georeferenced = 1; 3455 + strip_img->srid = srid; 3456 + strip_img->srs_name = SrsName; 3457 + strip_img->proj4text = Proj4Text; 3458 + strip_img->upper_left_x = upper_left_x; 3459 + strip_img->upper_left_y = upper_left_y; 3460 + strip_img->pixel_x_size = pixel_x_size; 3461 + strip_img->pixel_y_size = pixel_y_size; 3462 + return GGRAPH_OK; 3463 + } 3464 + return GGRAPH_IMAGE_UNKNOWN; 3465 +} 3466 + 3467 +GGRAPH_DECLARE int 3468 +gGraphImageGetGeoRef (const void *ptr, int *srid, char *srs_name, 3469 + char *proj4text, double *upper_left_x, 3470 + double *upper_left_y, double *pixel_x_size, 3471 + double *pixel_y_size) 3472 +{ 3473 +/* retrieving the georeferencing infos from some Image */ 3474 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3475 + gGraphStripImagePtr strip_img = (gGraphStripImagePtr) ptr; 3476 + 3477 + if (img == NULL) 3478 + return GGRAPH_IMAGE_UNKNOWN; 3479 + if (img->signature == GG_IMAGE_MAGIC_SIGNATURE) 3480 + { 3481 + /* from normal Image */ 3482 + if (img->is_georeferenced == 0) 3483 + return GGRAPH_ERROR; 3484 + 3485 + *srid = img->srid; 3486 + if (img->srs_name) 3487 + strcpy (srs_name, img->srs_name); 3488 + else 3489 + *srs_name = '\0'; 3490 + if (img->proj4text) 3491 + strcpy (proj4text, img->proj4text); 3492 + else 3493 + *proj4text = '\0'; 3494 + *upper_left_x = img->upper_left_x; 3495 + *upper_left_y = img->upper_left_y; 3496 + *pixel_x_size = img->pixel_x_size; 3497 + *pixel_y_size = img->pixel_y_size; 3498 + return GGRAPH_OK; 3499 + } 3500 + else if (strip_img->signature == GG_STRIP_IMAGE_MAGIC_SIGNATURE) 3501 + { 3502 + /* from strip Image */ 3503 + if (strip_img->is_georeferenced == 0) 3504 + return GGRAPH_ERROR; 3505 + 3506 + *srid = strip_img->srid; 3507 + if (strip_img->srs_name) 3508 + strcpy (srs_name, strip_img->srs_name); 3509 + else 3510 + *srs_name = '\0'; 3511 + if (strip_img->proj4text) 3512 + strcpy (proj4text, strip_img->proj4text); 3513 + else 3514 + *proj4text = '\0'; 3515 + *upper_left_x = strip_img->upper_left_x; 3516 + *upper_left_y = strip_img->upper_left_y; 3517 + *pixel_x_size = strip_img->pixel_x_size; 3518 + *pixel_y_size = strip_img->pixel_y_size; 3519 + return GGRAPH_OK; 3520 + } 3521 + return GGRAPH_IMAGE_UNKNOWN; 3522 +} 3523 + 3524 +GGRAPH_DECLARE int 3525 +gGraphImageInfosGetGeoRef (const void *ptr, int *srid, char *srs_name, 3526 + char *proj4text, double *upper_left_x, 3527 + double *upper_left_y, double *pixel_x_size, 3528 + double *pixel_y_size) 3529 +{ 3530 +/* retrieving the georeferencing infos from some Image */ 3531 + gGraphImageInfosPtr img = (gGraphImageInfosPtr) ptr; 3532 + 3533 + if (img == NULL) 3534 + return GGRAPH_IMAGE_UNKNOWN; 3535 + if (img->signature != GG_IMAGE_INFOS_MAGIC_SIGNATURE) 3536 + return GGRAPH_IMAGE_UNKNOWN; 3537 + if (img->is_georeferenced == 0) 3538 + return GGRAPH_ERROR; 3539 + 3540 + *srid = img->srid; 3541 + if (img->srs_name) 3542 + strcpy (srs_name, img->srs_name); 3543 + else 3544 + *srs_name = '\0'; 3545 + if (img->proj4text) 3546 + strcpy (proj4text, img->proj4text); 3547 + else 3548 + *proj4text = '\0'; 3549 + *upper_left_x = img->upper_left_x; 3550 + *upper_left_y = img->upper_left_y; 3551 + *pixel_x_size = img->pixel_x_size; 3552 + *pixel_y_size = img->pixel_y_size; 3553 + return GGRAPH_OK; 3554 +} 3555 + 3556 +static int 3557 +token_to_double (const char *str, double *value) 3558 +{ 3559 +/* attempting to convert from string to double */ 3560 + const char *p = str; 3561 + int error = 0; 3562 + int digits = 0; 3563 + int comma = 0; 3564 + int sign = 0; 3565 + while (*p != '\0') 3566 + { 3567 + if (*p >= '0' && *p <= '9') 3568 + digits++; 3569 + else if (*p == '.') 3570 + comma++; 3571 + else if (*p == '-' || *p == '+') 3572 + { 3573 + if (digits == 0) 3574 + sign++; 3575 + else 3576 + error = 1; 3577 + } 3578 + else 3579 + error = 1; 3580 + p++; 3581 + } 3582 + if (digits > 0 && sign < 2 && comma < 2 && error == 0) 3583 + { 3584 + *value = atof (str); 3585 + return 1; 3586 + } 3587 + return 0; 3588 +} 3589 + 3590 +GGRAPH_DECLARE int 3591 +gGraphGetWorldFilePath (const char *main_path, char *world_file_path) 3592 +{ 3593 +/* generating a World File path corresponding to the Image path */ 3594 + char suffix[1024]; 3595 + char string[1024]; 3596 + int i; 3597 + int len; 3598 + 3599 + strcpy (string, main_path); 3600 + len = strlen (string) - 1; 3601 + for (i = len - 1; i >= 0; i--) 3602 + { 3603 + if (string[i] == '.') 3604 + { 3605 + strcpy (suffix, string + i); 3606 + string[i] = '\0'; 3607 + if (strcasecmp (suffix, ".jpg") == 0) 3608 + { 3609 + strcpy (world_file_path, string); 3610 + strcat (world_file_path, ".jgw"); 3611 + return GGRAPH_OK; 3612 + } 3613 + if (strcasecmp (suffix, ".png") == 0) 3614 + { 3615 + strcpy (world_file_path, string); 3616 + strcat (world_file_path, ".pgw"); 3617 + return GGRAPH_OK; 3618 + } 3619 + if (strcasecmp (suffix, ".gif") == 0) 3620 + { 3621 + strcpy (world_file_path, string); 3622 + strcat (world_file_path, ".gfw"); 3623 + return GGRAPH_OK; 3624 + } 3625 + if (strcasecmp (suffix, ".tif") == 0) 3626 + { 3627 + strcpy (world_file_path, string); 3628 + strcat (world_file_path, ".tfw"); 3629 + return GGRAPH_OK; 3630 + } 3631 + } 3632 + } 3633 + *world_file_path = '\0'; 3634 + return GGRAPH_ERROR; 3635 +} 3636 + 3637 +GGRAPH_DECLARE int 3638 +gGraphReadWorldFile (const char *path, double *ul_x, double *ul_y, 3639 + double *x_size, double *y_size) 3640 +{ 3641 +/* attempting to read georeferencing infos from some World File */ 3642 + FILE *in = NULL; 3643 + double upper_left_x = DBL_MAX; 3644 + double upper_left_y = DBL_MAX; 3645 + double pixel_x = DBL_MAX; 3646 + double pixel_y = DBL_MAX; 3647 + double value; 3648 + int c; 3649 + int i; 3650 + char wf_buf[1024]; 3651 + char *p_wf; 3652 + int wf_row; 3653 + 3654 + in = fopen (path, "rb"); 3655 + if (in == NULL) 3656 + return GGRAPH_FILE_OPEN_ERROR; 3657 + 3658 + wf_row = 0; 3659 + p_wf = wf_buf; 3660 + while ((c = getc (in)) != EOF) 3661 + { 3662 + /* parsing the Worldfile */ 3663 + if (c == '\r') 3664 + continue; 3665 + if (c == '\n') 3666 + { 3667 + *p_wf = '\0'; 3668 + for (i = 0; i < (int) strlen (wf_buf); i++) 3669 + { 3670 + /* replacing any COMMA (badly formatted decimal separator) */ 3671 + if (wf_buf[i] == ',') 3672 + wf_buf[i] = '.'; 3673 + } 3674 + switch (wf_row) 3675 + { 3676 + case 0: 3677 + if (!token_to_double (wf_buf, &value)) 3678 + goto stop; 3679 + else 3680 + pixel_x = value; 3681 + break; 3682 + case 3: 3683 + if (!token_to_double (wf_buf, &value)) 3684 + goto stop; 3685 + else 3686 + pixel_y = value * -1.0; 3687 + break; 3688 + case 4: 3689 + if (!token_to_double (wf_buf, &value)) 3690 + goto stop; 3691 + else 3692 + upper_left_x = value; 3693 + break; 3694 + case 5: 3695 + if (!token_to_double (wf_buf, &value)) 3696 + goto stop; 3697 + else 3698 + upper_left_y = value; 3699 + break; 3700 + }; 3701 + p_wf = wf_buf; 3702 + wf_row++; 3703 + continue; 3704 + } 3705 + *p_wf++ = c; 3706 + if (p_wf - wf_buf > 1024) 3707 + goto stop; 3708 + } 3709 + fclose (in); 3710 + 3711 + if (pixel_x == DBL_MAX || pixel_y == DBL_MAX || upper_left_x == DBL_MAX 3712 + || upper_left_y == DBL_MAX) 3713 + return GGRAPH_ERROR; 3714 + 3715 + *ul_x = upper_left_x; 3716 + *ul_y = upper_left_y; 3717 + *x_size = pixel_x; 3718 + *y_size = pixel_y; 3719 + return GGRAPH_OK; 3720 + 3721 + stop: 3722 + fclose (in); 3723 + return GGRAPH_ERROR; 3724 +} 3725 + 3726 +GGRAPH_DECLARE int 3727 +gGraphImageResizeNormal (const void *orig, const void **dest, int width, 3728 + int height) 3729 +{ 3730 +/* generating a resized image [Normal Quality] */ 3731 + gGraphImagePtr img2 = NULL; 3732 + gGraphImagePtr img = (gGraphImagePtr) orig; 3733 + 3734 + *dest = NULL; 3735 + if (img == NULL) 3736 + return GGRAPH_ERROR; 3737 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3738 + return GGRAPH_ERROR; 3739 + 3740 + img2 = 3741 + gg_image_create (img->pixel_format, width, height, img->bits_per_sample, 3742 + img->samples_per_pixel, img->sample_format, 3743 + img->srs_name, img->proj4text); 3744 + if (!img2) 3745 + return GGRAPH_INSUFFICIENT_MEMORY; 3746 + if (img->pixel_format == GG_PIXEL_GRID) 3747 + gg_grid_resize (img2, img); 3748 + else 3749 + gg_image_resize (img2, img); 3750 + gg_image_clone_georeferencing (img2, img); 3751 + *dest = img2; 3752 + 3753 + return GGRAPH_OK; 3754 +} 3755 + 3756 +GGRAPH_DECLARE int 3757 +gGraphImageResizeHighQuality (const void *orig, const void **dest, int width, 3758 + int height) 3759 +{ 3760 +/* generating a resized image [High Quality] */ 3761 + gGraphImagePtr img2 = NULL; 3762 + gGraphImagePtr img = (gGraphImagePtr) orig; 3763 + 3764 + *dest = NULL; 3765 + if (img == NULL) 3766 + return GGRAPH_ERROR; 3767 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3768 + return GGRAPH_ERROR; 3769 + 3770 + img2 = 3771 + gg_image_create (img->pixel_format, width, height, img->bits_per_sample, 3772 + img->samples_per_pixel, img->sample_format, 3773 + img->srs_name, img->proj4text); 3774 + if (!img2) 3775 + return GGRAPH_INSUFFICIENT_MEMORY; 3776 + if (img->pixel_format == GG_PIXEL_GRID) 3777 + gg_make_grid_thumbnail (img2, img); 3778 + else 3779 + gg_make_thumbnail (img2, img); 3780 + gg_image_clone_georeferencing (img2, img); 3781 + *dest = img2; 3782 + 3783 + return GGRAPH_OK; 3784 +} 3785 + 3786 +GGRAPH_DECLARE int 3787 +gGraphImageResizeToResolution (const void *orig, const void **dest, 3788 + double pixel_x_size, double pixel_y_size, 3789 + int *x_width, int *x_height) 3790 +{ 3791 +/* generating a resized image [High Quality] */ 3792 + int width; 3793 + int height; 3794 + double ww; 3795 + double wh; 3796 + gGraphImagePtr img2 = NULL; 3797 + gGraphImagePtr img = (gGraphImagePtr) orig; 3798 + 3799 + *dest = NULL; 3800 + *x_width = 0; 3801 + *x_height = 0; 3802 + if (img == NULL) 3803 + return GGRAPH_ERROR; 3804 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3805 + return GGRAPH_ERROR; 3806 + 3807 + ww = (double) (img->width) * img->pixel_x_size; 3808 + wh = (double) (img->height) * img->pixel_y_size; 3809 + width = (int) (ww / pixel_x_size); 3810 + height = (int) (wh / pixel_y_size); 3811 + 3812 + img2 = 3813 + gg_image_create (img->pixel_format, width, height, img->bits_per_sample, 3814 + img->samples_per_pixel, img->sample_format, 3815 + img->srs_name, img->proj4text); 3816 + if (!img2) 3817 + return GGRAPH_INSUFFICIENT_MEMORY; 3818 + if (img->pixel_format == GG_PIXEL_GRID) 3819 + gg_make_grid_thumbnail (img2, img); 3820 + else 3821 + gg_make_thumbnail (img2, img); 3822 + gg_image_clone_georeferencing (img2, img); 3823 + *dest = img2; 3824 + *x_width = width; 3825 + *x_height = height; 3826 + 3827 + return GGRAPH_OK; 3828 +} 3829 + 3830 +GGRAPH_DECLARE int 3831 +gGraphImageSubSet (const void *orig, const void **dest, int upper_left_x, 3832 + int upper_left_y, int width, int height) 3833 +{ 3834 +/* generating an Image SubSet */ 3835 + gGraphImagePtr img2 = NULL; 3836 + gGraphImagePtr img = (gGraphImagePtr) orig; 3837 + 3838 + *dest = NULL; 3839 + if (img == NULL) 3840 + return GGRAPH_ERROR; 3841 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3842 + return GGRAPH_ERROR; 3843 + 3844 + img2 = 3845 + gg_image_create (img->pixel_format, width, height, img->bits_per_sample, 3846 + img->samples_per_pixel, img->sample_format, 3847 + img->srs_name, img->proj4text); 3848 + if (!img2) 3849 + return GGRAPH_INSUFFICIENT_MEMORY; 3850 + gg_image_sub_set (img2, img, upper_left_x, upper_left_y); 3851 + *dest = img2; 3852 + 3853 + return GGRAPH_OK; 3854 +} 3855 + 3856 +GGRAPH_DECLARE int 3857 +gGraphImageBufferReferenceRGB (const void *ptr, unsigned char **buffer) 3858 +{ 3859 +/* 3860 +/ this function create a separate copy of the internal image buffer 3861 +/ if required color-space conversion will be applied 3862 +/ and the original image will be unaffected 3863 +*/ 3864 + unsigned char *buf; 3865 + unsigned char *p_in; 3866 + unsigned char *p_out; 3867 + int scanline_width; 3868 + int x; 3869 + int y; 3870 + unsigned char red; 3871 + unsigned char green; 3872 + unsigned char blue; 3873 + unsigned char gray; 3874 + unsigned char index; 3875 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3876 + *buffer = NULL; 3877 + if (img == NULL) 3878 + return GGRAPH_ERROR; 3879 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3880 + return GGRAPH_ERROR; 3881 + 3882 + scanline_width = img->width * 3; 3883 + buf = malloc (scanline_width * img->height); 3884 + if (!buf) 3885 + return GGRAPH_INSUFFICIENT_MEMORY; 3886 + for (y = 0; y < img->height; y++) 3887 + { 3888 + p_in = img->pixels + (y * img->scanline_width); 3889 + p_out = buf + (y * scanline_width); 3890 + for (x = 0; x < img->width; x++) 3891 + { 3892 + if (img->pixel_format == GG_PIXEL_RGB) 3893 + { 3894 + *p_out++ = *p_in++; /* red */ 3895 + *p_out++ = *p_in++; /* green */ 3896 + *p_out++ = *p_in++; /* blue */ 3897 + } 3898 + else if (img->pixel_format == GG_PIXEL_RGBA) 3899 + { 3900 + *p_out++ = *p_in++; /* red */ 3901 + *p_out++ = *p_in++; /* green */ 3902 + *p_out++ = *p_in++; /* blue */ 3903 + p_in++; /* discarding Alpha */ 3904 + } 3905 + else if (img->pixel_format == GG_PIXEL_ARGB) 3906 + { 3907 + p_in++; 3908 + *p_out++ = *p_in++; /* red */ 3909 + *p_out++ = *p_in++; /* green */ 3910 + *p_out++ = *p_in++; /* blue */ 3911 + } 3912 + else if (img->pixel_format == GG_PIXEL_BGR) 3913 + { 3914 + blue = *p_in++; 3915 + green = *p_in++; 3916 + red = *p_in++; 3917 + *p_out++ = red; 3918 + *p_out++ = green; 3919 + *p_out++ = blue; 3920 + } 3921 + else if (img->pixel_format == GG_PIXEL_BGRA) 3922 + { 3923 + blue = *p_in++; 3924 + green = *p_in++; 3925 + red = *p_in++; 3926 + p_in++; /* discarding Alpha */ 3927 + *p_out++ = red; 3928 + *p_out++ = green; 3929 + *p_out++ = blue; 3930 + } 3931 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 3932 + { 3933 + gray = *p_in++; 3934 + *p_out++ = gray; 3935 + *p_out++ = gray; 3936 + *p_out++ = gray; 3937 + } 3938 + else if (img->pixel_format == GG_PIXEL_PALETTE) 3939 + { 3940 + index = *p_in++; 3941 + *p_out++ = img->palette_red[index]; 3942 + *p_out++ = img->palette_green[index]; 3943 + *p_out++ = img->palette_blue[index]; 3944 + } 3945 + } 3946 + } 3947 + *buffer = buf; 3948 + return GGRAPH_OK; 3949 +} 3950 + 3951 +GGRAPH_DECLARE int 3952 +gGraphImageBufferReferenceRGBA (const void *ptr, unsigned char **buffer) 3953 +{ 3954 +/* 3955 +/ this function create a separate copy of the internal image buffer 3956 +/ if required color-space conversion will be applied 3957 +/ and the original image will be unaffected 3958 +*/ 3959 + unsigned char *buf; 3960 + unsigned char *p_in; 3961 + unsigned char *p_out; 3962 + int scanline_width; 3963 + int x; 3964 + int y; 3965 + unsigned char red; 3966 + unsigned char green; 3967 + unsigned char blue; 3968 + unsigned char alpha; 3969 + unsigned char gray; 3970 + unsigned char index; 3971 + gGraphImagePtr img = (gGraphImagePtr) ptr; 3972 + *buffer = NULL; 3973 + if (img == NULL) 3974 + return GGRAPH_ERROR; 3975 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 3976 + return GGRAPH_ERROR; 3977 + 3978 + scanline_width = img->width * 4; 3979 + buf = malloc (scanline_width * img->height); 3980 + if (!buf) 3981 + return GGRAPH_INSUFFICIENT_MEMORY; 3982 + for (y = 0; y < img->height; y++) 3983 + { 3984 + p_in = img->pixels + (y * img->scanline_width); 3985 + p_out = buf + (y * scanline_width); 3986 + for (x = 0; x < img->width; x++) 3987 + { 3988 + if (img->pixel_format == GG_PIXEL_RGB) 3989 + { 3990 + *p_out++ = *p_in++; /* red */ 3991 + *p_out++ = *p_in++; /* green */ 3992 + *p_out++ = *p_in++; /* blue */ 3993 + *p_out++ = 255; /* opaque Alpha */ 3994 + } 3995 + else if (img->pixel_format == GG_PIXEL_RGBA) 3996 + { 3997 + *p_out++ = *p_in++; /* red */ 3998 + *p_out++ = *p_in++; /* green */ 3999 + *p_out++ = *p_in++; /* blue */ 4000 + *p_out++ = *p_in++; /* Alpha */ 4001 + } 4002 + else if (img->pixel_format == GG_PIXEL_ARGB) 4003 + { 4004 + alpha = *p_in++; 4005 + *p_out++ = *p_in++; /* red */ 4006 + *p_out++ = *p_in++; /* green */ 4007 + *p_out++ = *p_in++; /* blue */ 4008 + *p_out++ = alpha; 4009 + } 4010 + else if (img->pixel_format == GG_PIXEL_BGR) 4011 + { 4012 + blue = *p_in++; 4013 + green = *p_in++; 4014 + red = *p_in++; 4015 + *p_out++ = red; 4016 + *p_out++ = green; 4017 + *p_out++ = blue; 4018 + *p_out++ = 255; /* opaque Alpha */ 4019 + } 4020 + else if (img->pixel_format == GG_PIXEL_BGRA) 4021 + { 4022 + blue = *p_in++; 4023 + green = *p_in++; 4024 + red = *p_in++; 4025 + alpha = *p_in++; 4026 + *p_out++ = red; 4027 + *p_out++ = green; 4028 + *p_out++ = blue; 4029 + *p_out++ = alpha; 4030 + } 4031 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 4032 + { 4033 + gray = *p_in++; 4034 + *p_out++ = gray; 4035 + *p_out++ = gray; 4036 + *p_out++ = gray; 4037 + *p_out++ = 255; /* opaque Alpha */ 4038 + } 4039 + else if (img->pixel_format == GG_PIXEL_PALETTE) 4040 + { 4041 + index = *p_in++; 4042 + *p_out++ = img->palette_red[index]; 4043 + *p_out++ = img->palette_green[index]; 4044 + *p_out++ = img->palette_blue[index]; 4045 + *p_out++ = 255; /* opaque Alpha */ 4046 + } 4047 + } 4048 + } 4049 + *buffer = buf; 4050 + return GGRAPH_OK; 4051 +} 4052 + 4053 +GGRAPH_DECLARE int 4054 +gGraphImageBufferReferenceARGB (const void *ptr, unsigned char **buffer) 4055 +{ 4056 +/* 4057 +/ this function create a separate copy of the internal image buffer 4058 +/ if required color-space conversion will be applied 4059 +/ and the original image will be unaffected 4060 +*/ 4061 + unsigned char *buf; 4062 + unsigned char *p_in; 4063 + unsigned char *p_out; 4064 + int scanline_width; 4065 + int x; 4066 + int y; 4067 + unsigned char red; 4068 + unsigned char green; 4069 + unsigned char blue; 4070 + unsigned char alpha; 4071 + unsigned char gray; 4072 + unsigned char index; 4073 + gGraphImagePtr img = (gGraphImagePtr) ptr; 4074 + *buffer = NULL; 4075 + if (img == NULL) 4076 + return GGRAPH_ERROR; 4077 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 4078 + return GGRAPH_ERROR; 4079 + 4080 + scanline_width = img->width * 4; 4081 + buf = malloc (scanline_width * img->height); 4082 + if (!buf) 4083 + return GGRAPH_INSUFFICIENT_MEMORY; 4084 + for (y = 0; y < img->height; y++) 4085 + { 4086 + p_in = img->pixels + (y * img->scanline_width); 4087 + p_out = buf + (y * scanline_width); 4088 + for (x = 0; x < img->width; x++) 4089 + { 4090 + if (img->pixel_format == GG_PIXEL_RGB) 4091 + { 4092 + *p_out++ = 255; /* opaque Alpha */ 4093 + *p_out++ = *p_in++; /* red */ 4094 + *p_out++ = *p_in++; /* green */ 4095 + *p_out++ = *p_in++; /* blue */ 4096 + } 4097 + else if (img->pixel_format == GG_PIXEL_RGBA) 4098 + { 4099 + alpha = *p_in++; 4100 + *p_out++ = *p_in++; /* red */ 4101 + *p_out++ = *p_in++; /* green */ 4102 + *p_out++ = *p_in++; /* blue */ 4103 + *p_in++ = alpha; 4104 + } 4105 + else if (img->pixel_format == GG_PIXEL_ARGB) 4106 + { 4107 + *p_out++ = *p_in++; /* Alpha */ 4108 + *p_out++ = *p_in++; /* red */ 4109 + *p_out++ = *p_in++; /* green */ 4110 + *p_out++ = *p_in++; /* blue */ 4111 + } 4112 + else if (img->pixel_format == GG_PIXEL_BGR) 4113 + { 4114 + blue = *p_in++; 4115 + green = *p_in++; 4116 + red = *p_in++; 4117 + *p_out++ = 255; /* opaque Alpha */ 4118 + *p_out++ = red; 4119 + *p_out++ = green; 4120 + *p_out++ = blue; 4121 + } 4122 + else if (img->pixel_format == GG_PIXEL_BGRA) 4123 + { 4124 + blue = *p_in++; 4125 + green = *p_in++; 4126 + red = *p_in++; 4127 + *p_out++ = *p_in++; /* Alpha */ 4128 + *p_out++ = red; 4129 + *p_out++ = green; 4130 + *p_out++ = blue; 4131 + } 4132 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 4133 + { 4134 + gray = *p_in++; 4135 + *p_out++ = 255; /* opaque Alpha */ 4136 + *p_out++ = gray; 4137 + *p_out++ = gray; 4138 + *p_out++ = gray; 4139 + } 4140 + else if (img->pixel_format == GG_PIXEL_PALETTE) 4141 + { 4142 + index = *p_in++; 4143 + *p_out++ = 255; /* opaque Alpha */ 4144 + *p_out++ = img->palette_red[index]; 4145 + *p_out++ = img->palette_green[index]; 4146 + *p_out++ = img->palette_blue[index]; 4147 + } 4148 + } 4149 + } 4150 + *buffer = buf; 4151 + return GGRAPH_OK; 4152 +} 4153 + 4154 +GGRAPH_DECLARE int 4155 +gGraphImageBufferReferenceBGR (const void *ptr, unsigned char **buffer) 4156 +{ 4157 +/* 4158 +/ this function create a separate copy of the internal image buffer 4159 +/ if required color-space conversion will be applied 4160 +/ and the original image will be unaffected 4161 +*/ 4162 + unsigned char *buf; 4163 + unsigned char *p_in; 4164 + unsigned char *p_out; 4165 + int scanline_width; 4166 + int x; 4167 + int y; 4168 + unsigned char red; 4169 + unsigned char green; 4170 + unsigned char blue; 4171 + unsigned char gray; 4172 + unsigned char index; 4173 + gGraphImagePtr img = (gGraphImagePtr) ptr; 4174 + *buffer = NULL; 4175 + if (img == NULL) 4176 + return GGRAPH_ERROR; 4177 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 4178 + return GGRAPH_ERROR; 4179 + 4180 + scanline_width = img->width * 3; 4181 + buf = malloc (scanline_width * img->height); 4182 + if (!buf) 4183 + return GGRAPH_INSUFFICIENT_MEMORY; 4184 + for (y = 0; y < img->height; y++) 4185 + { 4186 + p_in = img->pixels + (y * img->scanline_width); 4187 + p_out = buf + (y * scanline_width); 4188 + for (x = 0; x < img->width; x++) 4189 + { 4190 + if (img->pixel_format == GG_PIXEL_RGB) 4191 + { 4192 + red = *p_in++; 4193 + green = *p_in++; 4194 + blue = *p_in++; 4195 + *p_out++ = blue; 4196 + *p_out++ = green; 4197 + *p_out++ = red; 4198 + } 4199 + else if (img->pixel_format == GG_PIXEL_RGBA) 4200 + { 4201 + red = *p_in++; 4202 + green = *p_in++; 4203 + blue = *p_in++; 4204 + p_in++; /* discarding Alpha */ 4205 + *p_out++ = blue; 4206 + *p_out++ = green; 4207 + *p_out++ = red; 4208 + } 4209 + else if (img->pixel_format == GG_PIXEL_ARGB) 4210 + { 4211 + p_in++; 4212 + red = *p_in++; 4213 + green = *p_in++; 4214 + blue = *p_in++; 4215 + *p_out++ = blue; 4216 + *p_out++ = green; 4217 + *p_out++ = red; 4218 + } 4219 + else if (img->pixel_format == GG_PIXEL_BGR) 4220 + { 4221 + *p_out++ = *p_in++; /* blue */ 4222 + *p_out++ = *p_in++; /* green */ 4223 + *p_out++ = *p_in++; /* red */ 4224 + } 4225 + else if (img->pixel_format == GG_PIXEL_BGRA) 4226 + { 4227 + *p_out++ = *p_in++; /* blue */ 4228 + *p_out++ = *p_in++; /* green */ 4229 + *p_out++ = *p_in++; /* red */ 4230 + p_in++; /* discarding Alpha */ 4231 + } 4232 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 4233 + { 4234 + gray = *p_in++; 4235 + *p_out++ = gray; 4236 + *p_out++ = gray; 4237 + *p_out++ = gray; 4238 + } 4239 + else if (img->pixel_format == GG_PIXEL_PALETTE) 4240 + { 4241 + index = *p_in++; 4242 + *p_out++ = img->palette_blue[index]; 4243 + *p_out++ = img->palette_green[index]; 4244 + *p_out++ = img->palette_red[index]; 4245 + } 4246 + } 4247 + } 4248 + *buffer = buf; 4249 + return GGRAPH_OK; 4250 +} 4251 + 4252 +GGRAPH_DECLARE int 4253 +gGraphImageBufferReferenceBGRA (const void *ptr, unsigned char **buffer) 4254 +{ 4255 +/* 4256 +/ this function create a separate copy of the internal image buffer 4257 +/ if required color-space conversion will be applied 4258 +/ and the original image will be unaffected 4259 +*/ 4260 + unsigned char *buf; 4261 + unsigned char *p_in; 4262 + unsigned char *p_out; 4263 + int scanline_width; 4264 + int x; 4265 + int y; 4266 + unsigned char red; 4267 + unsigned char green; 4268 + unsigned char blue; 4269 + unsigned char alpha; 4270 + unsigned char gray; 4271 + unsigned char index; 4272 + gGraphImagePtr img = (gGraphImagePtr) ptr; 4273 + *buffer = NULL; 4274 + if (img == NULL) 4275 + return GGRAPH_ERROR; 4276 + if (img->signature != GG_IMAGE_MAGIC_SIGNATURE) 4277 + return GGRAPH_ERROR; 4278 + 4279 + scanline_width = img->width * 4; 4280 + buf = malloc (scanline_width * img->height); 4281 + if (!buf) 4282 + return GGRAPH_INSUFFICIENT_MEMORY; 4283 + for (y = 0; y < img->height; y++) 4284 + { 4285 + p_in = img->pixels + (y * img->scanline_width); 4286 + p_out = buf + (y * scanline_width); 4287 + for (x = 0; x < img->width; x++) 4288 + { 4289 + if (img->pixel_format == GG_PIXEL_RGB) 4290 + { 4291 + red = *p_in++; 4292 + green = *p_in++; 4293 + blue = *p_in++; 4294 + *p_out++ = blue; 4295 + *p_out++ = green; 4296 + *p_out++ = red; 4297 + *p_out++ = 255; /* opaque Alpha */ 4298 + } 4299 + else if (img->pixel_format == GG_PIXEL_RGBA) 4300 + { 4301 + red = *p_in++; 4302 + green = *p_in++; 4303 + blue = *p_in++; 4304 + *p_out++ = blue; 4305 + *p_out++ = green; 4306 + *p_out++ = red; 4307 + *p_out++ = *p_in++; /* Alpha */ 4308 + } 4309 + else if (img->pixel_format == GG_PIXEL_ARGB) 4310 + { 4311 + alpha = *p_in++; 4312 + red = *p_in++; 4313 + green = *p_in++; 4314 + blue = *p_in++; 4315 + *p_out++ = blue; 4316 + *p_out++ = green; 4317 + *p_out++ = red; 4318 + *p_out++ = alpha; 4319 + } 4320 + else if (img->pixel_format == GG_PIXEL_BGR) 4321 + { 4322 + *p_out++ = *p_in++; /* blue */ 4323 + *p_out++ = *p_in++; /* green */ 4324 + *p_out++ = *p_in++; /* red */ 4325 + *p_out++ = 255; /* opaque Alpha */ 4326 + } 4327 + else if (img->pixel_format == GG_PIXEL_BGRA) 4328 + { 4329 + *p_out++ = *p_in++; /* blue */ 4330 + *p_out++ = *p_in++; /* green */ 4331 + *p_out++ = *p_in++; /* red */ 4332 + *p_out++ = *p_in++; /* Alpha */ 4333 + } 4334 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 4335 + { 4336 + gray = *p_in++; 4337 + *p_out++ = gray; 4338 + *p_out++ = gray; 4339 + *p_out++ = gray; 4340 + *p_out++ = 255; /* opaque Alpha */ 4341 + } 4342 + else if (img->pixel_format == GG_PIXEL_PALETTE) 4343 + { 4344 + index = *p_in++; 4345 + *p_out++ = img->palette_blue[index]; 4346 + *p_out++ = img->palette_green[index]; 4347 + *p_out++ = img->palette_red[index]; 4348 + *p_out++ = 255; /* opaque Alpha */ 4349 + } 4350 + } 4351 + } 4352 + *buffer = buf; 4353 + return GGRAPH_OK; 4354 +} 4355 + 4356 +GGRAPH_DECLARE int 4357 +gGraphImageFromRawMemBuf (const void *mem_buf, int mem_buf_size, 4358 + const void **image_handle) 4359 +{ 4360 +/* importing an image from a RAW un-compressed memory buffer */ 4361 + gGraphImagePtr img = NULL; 4362 + int ret; 4363 + 4364 + *image_handle = NULL; 4365 + ret = gg_image_from_raw (mem_buf_size, mem_buf, &img); 4366 + if (ret != GGRAPH_OK) 4367 + return ret; 4368 + 4369 + *image_handle = img; 4370 + return GGRAPH_OK; 4371 +} 4372 + 4373 +GGRAPH_DECLARE int 4374 +gGraphIsRawImage (const void *mem_buf, int mem_buf_size) 4375 +{ 4376 +/* checks if this one is a RAW un-compressed memory buffer */ 4377 + unsigned char *p = (unsigned char *) mem_buf; 4378 + short start_signature; 4379 + short end_signature; 4380 + int endian_arch = gg_endian_arch (); 4381 + 4382 + if (mem_buf_size < (int) (sizeof (short) * 4)) 4383 + return GGRAPH_ERROR; 4384 + 4385 +/* checking the magic signature */ 4386 + start_signature = gg_import_int16 (p, 1, endian_arch); 4387 + p = (unsigned char *) mem_buf + mem_buf_size - sizeof (short); 4388 + end_signature = gg_import_int16 (p, 1, endian_arch); 4389 + if (start_signature == GG_MONOCHROME_START 4390 + && end_signature == GG_MONOCHROME_END) 4391 + return GGRAPH_OK; 4392 + if (start_signature == GG_ADAM7_1_RGB_START 4393 + && end_signature == GG_ADAM7_1_RGB_END) 4394 + return GGRAPH_OK; 4395 + if (start_signature == GG_ADAM7_3_RGB_START 4396 + && end_signature == GG_ADAM7_3_RGB_END) 4397 + return GGRAPH_OK; 4398 + if (start_signature == GG_ADAM7_5_RGB_START 4399 + && end_signature == GG_ADAM7_5_RGB_END) 4400 + return GGRAPH_OK; 4401 + if (start_signature == GG_ADAM7_1_GRAYSCALE_START 4402 + && end_signature == GG_ADAM7_1_GRAYSCALE_END) 4403 + return GGRAPH_OK; 4404 + if (start_signature == GG_ADAM7_3_GRAYSCALE_START 4405 + && end_signature == GG_ADAM7_3_GRAYSCALE_END) 4406 + return GGRAPH_OK; 4407 + if (start_signature == GG_ADAM7_5_GRAYSCALE_START 4408 + && end_signature == GG_ADAM7_5_GRAYSCALE_END) 4409 + return GGRAPH_OK; 4410 + if (start_signature == GG_ADAM7_1_PALETTE_START 4411 + && end_signature == GG_ADAM7_1_PALETTE_END) 4412 + return GGRAPH_OK; 4413 + if (start_signature == GG_ADAM7_3_PALETTE_START 4414 + && end_signature == GG_ADAM7_3_PALETTE_END) 4415 + return GGRAPH_OK; 4416 + if (start_signature == GG_ADAM7_5_PALETTE_START 4417 + && end_signature == GG_ADAM7_5_PALETTE_END) 4418 + return GGRAPH_OK; 4419 + if (start_signature == GG_ADAM7_1_INT16_START 4420 + && end_signature == GG_ADAM7_1_INT16_END) 4421 + return GGRAPH_OK; 4422 + if (start_signature == GG_ADAM7_3_INT16_START 4423 + && end_signature == GG_ADAM7_3_INT16_END) 4424 + return GGRAPH_OK; 4425 + if (start_signature == GG_ADAM7_5_INT16_START 4426 + && end_signature == GG_ADAM7_5_INT16_END) 4427 + return GGRAPH_OK; 4428 + if (start_signature == GG_ADAM7_1_UINT16_START 4429 + && end_signature == GG_ADAM7_1_UINT16_END) 4430 + return GGRAPH_OK; 4431 + if (start_signature == GG_ADAM7_3_UINT16_START 4432 + && end_signature == GG_ADAM7_3_UINT16_END) 4433 + return GGRAPH_OK; 4434 + if (start_signature == GG_ADAM7_5_UINT16_START 4435 + && end_signature == GG_ADAM7_5_UINT16_END) 4436 + return GGRAPH_OK; 4437 + if (start_signature == GG_ADAM7_1_INT32_START 4438 + && end_signature == GG_ADAM7_1_INT32_END) 4439 + return GGRAPH_OK; 4440 + if (start_signature == GG_ADAM7_3_INT32_START 4441 + && end_signature == GG_ADAM7_3_INT32_END) 4442 + return GGRAPH_OK; 4443 + if (start_signature == GG_ADAM7_5_INT32_START 4444 + && end_signature == GG_ADAM7_5_INT32_END) 4445 + return GGRAPH_OK; 4446 + if (start_signature == GG_ADAM7_1_UINT32_START 4447 + && end_signature == GG_ADAM7_1_UINT32_END) 4448 + return GGRAPH_OK; 4449 + if (start_signature == GG_ADAM7_3_UINT32_START 4450 + && end_signature == GG_ADAM7_3_UINT32_END) 4451 + return GGRAPH_OK; 4452 + if (start_signature == GG_ADAM7_5_UINT32_START 4453 + && end_signature == GG_ADAM7_5_UINT32_END) 4454 + return GGRAPH_OK; 4455 + if (start_signature == GG_ADAM7_1_FLOAT_START 4456 + && end_signature == GG_ADAM7_1_FLOAT_END) 4457 + return GGRAPH_OK; 4458 + if (start_signature == GG_ADAM7_3_FLOAT_START 4459 + && end_signature == GG_ADAM7_3_FLOAT_END) 4460 + return GGRAPH_OK; 4461 + if (start_signature == GG_ADAM7_5_FLOAT_START 4462 + && end_signature == GG_ADAM7_5_FLOAT_END) 4463 + return GGRAPH_OK; 4464 + if (start_signature == GG_ADAM7_1_DOUBLE_START 4465 + && end_signature == GG_ADAM7_1_DOUBLE_END) 4466 + return GGRAPH_OK; 4467 + if (start_signature == GG_ADAM7_3_DOUBLE_START 4468 + && end_signature == GG_ADAM7_3_DOUBLE_END) 4469 + return GGRAPH_OK; 4470 + if (start_signature == GG_ADAM7_5_DOUBLE_START 4471 + && end_signature == GG_ADAM7_5_DOUBLE_END) 4472 + return GGRAPH_OK; 4473 + 4474 + p = (unsigned char *) mem_buf; 4475 + start_signature = gg_import_int16 (p, 0, endian_arch); 4476 + p = (unsigned char *) mem_buf + mem_buf_size - sizeof (short); 4477 + end_signature = gg_import_int16 (p, 0, endian_arch); 4478 + if (start_signature == GG_ADAM7_0_RGB_START 4479 + && end_signature == GG_ADAM7_0_RGB_END) 4480 + return GGRAPH_OK; 4481 + if (start_signature == GG_ADAM7_2_RGB_START 4482 + && end_signature == GG_ADAM7_2_RGB_END) 4483 + return GGRAPH_OK; 4484 + if (start_signature == GG_ADAM7_4_RGB_START 4485 + && end_signature == GG_ADAM7_4_RGB_END) 4486 + return GGRAPH_OK; 4487 + if (start_signature == GG_ADAM7_6_RGB_START 4488 + && end_signature == GG_ADAM7_6_RGB_END) 4489 + return GGRAPH_OK; 4490 + if (start_signature == GG_ADAM7_0_GRAYSCALE_START 4491 + && end_signature == GG_ADAM7_0_GRAYSCALE_END) 4492 + return GGRAPH_OK; 4493 + if (start_signature == GG_ADAM7_2_GRAYSCALE_START 4494 + && end_signature == GG_ADAM7_2_GRAYSCALE_END) 4495 + return GGRAPH_OK; 4496 + if (start_signature == GG_ADAM7_4_GRAYSCALE_START 4497 + && end_signature == GG_ADAM7_4_GRAYSCALE_END) 4498 + return GGRAPH_OK; 4499 + if (start_signature == GG_ADAM7_6_GRAYSCALE_START 4500 + && end_signature == GG_ADAM7_6_GRAYSCALE_END) 4501 + return GGRAPH_OK; 4502 + if (start_signature == GG_ADAM7_0_PALETTE_START 4503 + && end_signature == GG_ADAM7_0_PALETTE_END) 4504 + return GGRAPH_OK; 4505 + if (start_signature == GG_ADAM7_2_PALETTE_START 4506 + && end_signature == GG_ADAM7_2_PALETTE_END) 4507 + return GGRAPH_OK; 4508 + if (start_signature == GG_ADAM7_4_PALETTE_START 4509 + && end_signature == GG_ADAM7_4_PALETTE_END) 4510 + return GGRAPH_OK; 4511 + if (start_signature == GG_ADAM7_6_PALETTE_START 4512 + && end_signature == GG_ADAM7_6_PALETTE_END) 4513 + return GGRAPH_OK; 4514 + if (start_signature == GG_ADAM7_0_INT16_START 4515 + && end_signature == GG_ADAM7_0_INT16_END) 4516 + return GGRAPH_OK; 4517 + if (start_signature == GG_ADAM7_2_INT16_START 4518 + && end_signature == GG_ADAM7_2_INT16_END) 4519 + return GGRAPH_OK; 4520 + if (start_signature == GG_ADAM7_4_INT16_START 4521 + && end_signature == GG_ADAM7_4_INT16_END) 4522 + return GGRAPH_OK; 4523 + if (start_signature == GG_ADAM7_6_INT16_START 4524 + && end_signature == GG_ADAM7_6_INT16_END) 4525 + return GGRAPH_OK; 4526 + if (start_signature == GG_ADAM7_0_UINT16_START 4527 + && end_signature == GG_ADAM7_0_UINT16_END) 4528 + return GGRAPH_OK; 4529 + if (start_signature == GG_ADAM7_2_UINT16_START 4530 + && end_signature == GG_ADAM7_2_UINT16_END) 4531 + return GGRAPH_OK; 4532 + if (start_signature == GG_ADAM7_4_UINT16_START 4533 + && end_signature == GG_ADAM7_4_UINT16_END) 4534 + return GGRAPH_OK; 4535 + if (start_signature == GG_ADAM7_6_UINT16_START 4536 + && end_signature == GG_ADAM7_6_UINT16_END) 4537 + return GGRAPH_OK; 4538 + if (start_signature == GG_ADAM7_0_INT32_START 4539 + && end_signature == GG_ADAM7_0_INT32_END) 4540 + return GGRAPH_OK; 4541 + if (start_signature == GG_ADAM7_2_INT32_START 4542 + && end_signature == GG_ADAM7_2_INT32_END) 4543 + return GGRAPH_OK; 4544 + if (start_signature == GG_ADAM7_4_INT32_START 4545 + && end_signature == GG_ADAM7_4_INT32_END) 4546 + return GGRAPH_OK; 4547 + if (start_signature == GG_ADAM7_6_INT32_START 4548 + && end_signature == GG_ADAM7_6_INT32_END) 4549 + return GGRAPH_OK; 4550 + if (start_signature == GG_ADAM7_0_UINT32_START 4551 + && end_signature == GG_ADAM7_0_UINT32_END) 4552 + return GGRAPH_OK; 4553 + if (start_signature == GG_ADAM7_2_UINT32_START 4554 + && end_signature == GG_ADAM7_2_UINT32_END) 4555 + return GGRAPH_OK; 4556 + if (start_signature == GG_ADAM7_4_UINT32_START 4557 + && end_signature == GG_ADAM7_4_UINT32_END) 4558 + return GGRAPH_OK; 4559 + if (start_signature == GG_ADAM7_6_UINT32_START 4560 + && end_signature == GG_ADAM7_6_UINT32_END) 4561 + return GGRAPH_OK; 4562 + if (start_signature == GG_ADAM7_0_FLOAT_START 4563 + && end_signature == GG_ADAM7_0_FLOAT_END) 4564 + return GGRAPH_OK; 4565 + if (start_signature == GG_ADAM7_2_FLOAT_START 4566 + && end_signature == GG_ADAM7_2_FLOAT_END) 4567 + return GGRAPH_OK; 4568 + if (start_signature == GG_ADAM7_4_FLOAT_START 4569 + && end_signature == GG_ADAM7_4_FLOAT_END) 4570 + return GGRAPH_OK; 4571 + if (start_signature == GG_ADAM7_6_FLOAT_START 4572 + && end_signature == GG_ADAM7_6_FLOAT_END) 4573 + return GGRAPH_OK; 4574 + if (start_signature == GG_ADAM7_0_DOUBLE_START 4575 + && end_signature == GG_ADAM7_0_DOUBLE_END) 4576 + return GGRAPH_OK; 4577 + if (start_signature == GG_ADAM7_2_DOUBLE_START 4578 + && end_signature == GG_ADAM7_2_DOUBLE_END) 4579 + return GGRAPH_OK; 4580 + if (start_signature == GG_ADAM7_4_DOUBLE_START 4581 + && end_signature == GG_ADAM7_4_DOUBLE_END) 4582 + return GGRAPH_OK; 4583 + if (start_signature == GG_ADAM7_6_DOUBLE_START 4584 + && end_signature == GG_ADAM7_6_DOUBLE_END) 4585 + return GGRAPH_OK; 4586 + 4587 + return GGRAPH_ERROR; 4588 +} 4589 + 4590 +GGRAPH_DECLARE int 4591 +gGraphOutputPixelsToStripImage (const void *ptr_in, const void *ptr_out, 4592 + int in_row, int out_row) 4593 +{ 4594 +/* copying pixels from a memory image into a Strip Image */ 4595 + unsigned char *p_in; 4596 + unsigned char *p_out; 4597 + gGraphImagePtr img_in = (gGraphImagePtr) ptr_in; 4598 + gGraphStripImagePtr img_out = (gGraphStripImagePtr) ptr_out; 4599 + 4600 + if (img_in == NULL) 4601 + return GGRAPH_INVALID_IMAGE; 4602 + if (img_out == NULL) 4603 + return GGRAPH_INVALID_IMAGE; 4604 + if (img_in->signature != GG_IMAGE_MAGIC_SIGNATURE) 4605 + return GGRAPH_INVALID_IMAGE; 4606 + if (img_out->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 4607 + return GGRAPH_INVALID_IMAGE; 4608 + if (img_in->pixel_format != img_out->pixel_format) 4609 + return GGRAPH_INVALID_IMAGE; 4610 + if (img_in->width != img_out->width) 4611 + return GGRAPH_INVALID_IMAGE; 4612 + 4613 + if (in_row < 0 || in_row >= img_in->height) 4614 + return GGRAPH_ERROR; 4615 + if (out_row < 0 || out_row >= img_out->rows_per_block) 4616 + return GGRAPH_ERROR; 4617 + 4618 + p_in = img_in->pixels + (in_row * img_in->scanline_width); 4619 + p_out = img_out->pixels + (out_row * img_out->scanline_width); 4620 + memcpy (p_out, p_in, img_in->scanline_width); 4621 + img_out->current_available_rows = out_row + 1; 4622 + 4623 + return GGRAPH_OK; 4624 +} 4625 + 4626 +static unsigned char 4627 +feed_palette (gGraphImagePtr img, unsigned char red, unsigned char green, 4628 + unsigned char blue) 4629 +{ 4630 +/* updating a palette */ 4631 + unsigned char i; 4632 + for (i = 0; i < img->max_palette; i++) 4633 + { 4634 + /* testing if this color is already present */ 4635 + if (img->palette_red[i] == red && img->palette_green[i] == green 4636 + && img->palette_blue[i] == blue) 4637 + return i; 4638 + } 4639 +/* inserting a new color */ 4640 + i = img->max_palette; 4641 + img->palette_red[i] = red; 4642 + img->palette_green[i] = green; 4643 + img->palette_blue[i] = blue; 4644 + img->max_palette += 1; 4645 + return i; 4646 +} 4647 + 4648 +GGRAPH_DECLARE int 4649 +gGraphInputPixelsFromStripImage (const void *ptr_in, const void *ptr_out, 4650 + int in_col) 4651 +{ 4652 +/* copying pixels from a Strip Image into a memory image */ 4653 + unsigned char *p_in; 4654 + unsigned char *p_out; 4655 + int y; 4656 + int x; 4657 + int is_monochrome = 0; 4658 + int is_monochrome_minisblack = 0; 4659 + gGraphStripImagePtr img_in = (gGraphStripImagePtr) ptr_in; 4660 + gGraphImagePtr img_out = (gGraphImagePtr) ptr_out; 4661 + 4662 + if (img_in == NULL) 4663 + return GGRAPH_INVALID_IMAGE; 4664 + if (img_out == NULL) 4665 + return GGRAPH_INVALID_IMAGE; 4666 + if (img_in->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 4667 + return GGRAPH_INVALID_IMAGE; 4668 + if (img_out->signature != GG_IMAGE_MAGIC_SIGNATURE) 4669 + return GGRAPH_INVALID_IMAGE; 4670 + if (img_in->rows_per_block < img_out->height) 4671 + return GGRAPH_INVALID_IMAGE; 4672 + if (img_in->pixel_format != img_out->pixel_format) 4673 + return GGRAPH_INVALID_IMAGE; 4674 + 4675 + if (in_col < 0 || in_col >= img_in->width) 4676 + return GGRAPH_ERROR; 4677 + 4678 + if (img_in->pixel_format == GG_PIXEL_PALETTE) 4679 + { 4680 + is_monochrome = 1; 4681 + if (img_in->max_palette == 2 && img_in->palette_red[0] == 0 4682 + && img_in->palette_green[0] == 0 4683 + && img_in->palette_blue[0] == 0 4684 + && img_in->palette_red[1] == 255 4685 + && img_in->palette_green[1] == 255 4686 + && img_in->palette_blue[1] == 255) 4687 + is_monochrome_minisblack = 1; 4688 + if (img_in->max_palette == 2 && img_in->palette_red[0] == 255 4689 + && img_in->palette_green[0] == 255 4690 + && img_in->palette_blue[0] == 255 4691 + && img_in->palette_red[1] == 0 4692 + && img_in->palette_green[1] == 0 && img_in->palette_blue[1] == 0) 4693 + is_monochrome_minisblack = 0; 4694 + } 4695 + 4696 + if (is_monochrome) 4697 + { 4698 + /* feeding a monochrome image */ 4699 + for (y = 0; y < img_out->height; y++) 4700 + { 4701 + p_in = img_in->pixels + (y * img_in->scanline_width) + in_col; 4702 + p_out = img_out->pixels + (y * img_out->scanline_width); 4703 + for (x = 0; x < img_out->width; x++) 4704 + *p_out++ = *p_in++; 4705 + } 4706 + img_out->max_palette = 2; 4707 + if (is_monochrome_minisblack) 4708 + { 4709 + img_out->palette_red[0] = 0; 4710 + img_out->palette_green[0] = 0; 4711 + img_out->palette_blue[0] = 0; 4712 + img_out->palette_red[1] = 255; 4713 + img_out->palette_green[1] = 255; 4714 + img_out->palette_blue[1] = 255; 4715 + } 4716 + else 4717 + { 4718 + img_out->palette_red[0] = 255; 4719 + img_out->palette_green[0] = 255; 4720 + img_out->palette_blue[0] = 255; 4721 + img_out->palette_red[1] = 0; 4722 + img_out->palette_green[1] = 0; 4723 + img_out->palette_blue[1] = 0; 4724 + } 4725 + } 4726 + else if (img_in->pixel_format == GG_PIXEL_PALETTE) 4727 + { 4728 + /* feeding a palette image */ 4729 + for (y = 0; y < img_out->height; y++) 4730 + { 4731 + p_in = img_in->pixels + (y * img_in->scanline_width) + in_col; 4732 + p_out = img_out->pixels + (y * img_out->scanline_width); 4733 + for (x = 0; x < img_out->width; x++) 4734 + { 4735 + int i_idx = *p_in++; 4736 + *p_out++ = 4737 + feed_palette (img_out, img_in->palette_red[i_idx], 4738 + img_in->palette_green[i_idx], 4739 + img_in->palette_blue[i_idx]); 4740 + } 4741 + } 4742 + } 4743 + else 4744 + { 4745 + for (y = 0; y < img_out->height; y++) 4746 + { 4747 + p_in = 4748 + img_in->pixels + (y * img_in->scanline_width) + 4749 + (in_col * img_in->pixel_size); 4750 + p_out = img_out->pixels + (y * img_out->scanline_width); 4751 + memcpy (p_out, p_in, img_out->scanline_width); 4752 + } 4753 + } 4754 + 4755 + return GGRAPH_OK; 4756 +} 4757 + 4758 +GGRAPH_DECLARE int 4759 +gGraphImageFromStripImage (const void *ptr_in, int color_space, 4760 + int sample_format, int bits_per_sample, 4761 + int samples_per_pixel, int start_line, 4762 + const void **ptr_out) 4763 +{ 4764 +/* creating an Image from a StripImage (may be, converting pixel format) */ 4765 + int width; 4766 + int height; 4767 + int pixel_format; 4768 + int x; 4769 + int y; 4770 + gGraphImagePtr img_out = NULL; 4771 + gGraphStripImagePtr img_in = (gGraphStripImagePtr) ptr_in; 4772 + 4773 + *ptr_out = NULL; 4774 + if (img_in == NULL) 4775 + return GGRAPH_INVALID_IMAGE; 4776 + if (img_in->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 4777 + return GGRAPH_INVALID_IMAGE; 4778 + 4779 + width = img_in->width; 4780 + height = img_in->current_available_rows; 4781 + switch (color_space) 4782 + { 4783 + case GGRAPH_COLORSPACE_MONOCHROME: 4784 + case GGRAPH_COLORSPACE_PALETTE: 4785 + pixel_format = GG_PIXEL_PALETTE; 4786 + break; 4787 + case GGRAPH_COLORSPACE_GRAYSCALE: 4788 + pixel_format = GG_PIXEL_GRAYSCALE; 4789 + break; 4790 + case GGRAPH_COLORSPACE_TRUECOLOR: 4791 + case GGRAPH_COLORSPACE_TRUECOLOR_ALPHA: 4792 + pixel_format = GG_PIXEL_RGB; 4793 + break; 4794 + case GGRAPH_COLORSPACE_GRID: 4795 + pixel_format = GG_PIXEL_GRID; 4796 + break; 4797 + default: 4798 + pixel_format = GG_PIXEL_UNKNOWN; 4799 + break; 4800 + }; 4801 + if (pixel_format == GG_PIXEL_UNKNOWN) 4802 + return GGRAPH_ERROR; 4803 + if (img_in->pixel_format == GG_PIXEL_GRID || pixel_format == GG_PIXEL_GRID) 4804 + { 4805 + if (img_in->pixel_format == GG_PIXEL_GRID 4806 + && pixel_format == GG_PIXEL_GRID) 4807 + ; 4808 + else 4809 + return GGRAPH_ERROR; 4810 + } 4811 + if (pixel_format == GG_PIXEL_RGB) 4812 + { 4813 + if (sample_format == GGRAPH_SAMPLE_UINT && bits_per_sample == 8 4814 + && samples_per_pixel == 3) 4815 + ; 4816 + else 4817 + return GGRAPH_ERROR; 4818 + } 4819 + if (pixel_format == GG_PIXEL_GRAYSCALE) 4820 + { 4821 + if (sample_format == GGRAPH_SAMPLE_UINT && bits_per_sample == 8 4822 + && samples_per_pixel == 1) 4823 + ; 4824 + else 4825 + return GGRAPH_ERROR; 4826 + } 4827 + if (pixel_format == GG_PIXEL_PALETTE) 4828 + { 4829 + if (sample_format == GGRAPH_SAMPLE_UINT && samples_per_pixel == 1) 4830 + { 4831 + if (bits_per_sample == 1 || bits_per_sample == 2 4832 + || bits_per_sample == 4 || bits_per_sample == 8) 4833 + ; 4834 + else 4835 + return GGRAPH_ERROR; 4836 + } 4837 + else 4838 + return GGRAPH_ERROR; 4839 + } 4840 + if (pixel_format == GG_PIXEL_GRID) 4841 + { 4842 + if (sample_format == GGRAPH_SAMPLE_UINT && bits_per_sample == 16 4843 + && samples_per_pixel == 1) 4844 + ; 4845 + else if (sample_format == GGRAPH_SAMPLE_UINT && bits_per_sample == 32 4846 + && samples_per_pixel == 1) 4847 + ; 4848 + else if (sample_format == GGRAPH_SAMPLE_INT && bits_per_sample == 16 4849 + && samples_per_pixel == 1) 4850 + ; 4851 + else if (sample_format == GGRAPH_SAMPLE_INT && bits_per_sample == 32 4852 + && samples_per_pixel == 1) 4853 + ; 4854 + else if (sample_format == GGRAPH_SAMPLE_FLOAT && bits_per_sample == 32 4855 + && samples_per_pixel == 1) 4856 + ; 4857 + else if (sample_format == GGRAPH_SAMPLE_FLOAT && bits_per_sample == 64 4858 + && samples_per_pixel == 1) 4859 + ; 4860 + else 4861 + return GGRAPH_ERROR; 4862 + } 4863 + 4864 + img_out = 4865 + gg_image_create (pixel_format, width, height, bits_per_sample, 4866 + samples_per_pixel, sample_format, NULL, NULL); 4867 + if (!img_out) 4868 + return GGRAPH_INSUFFICIENT_MEMORY; 4869 + if (img_in->is_georeferenced) 4870 + { 4871 + /* setting up georeferencing infos */ 4872 + img_out->srid = img_in->srid; 4873 + img_out->pixel_x_size = img_in->pixel_x_size; 4874 + img_out->pixel_y_size = img_in->pixel_y_size; 4875 + img_out->upper_left_x = img_in->upper_left_x; 4876 + img_out->upper_left_y = 4877 + img_in->upper_left_y - 4878 + ((double) start_line * img_in->pixel_y_size); 4879 + img_out->is_georeferenced = 1; 4880 + } 4881 + 4882 + if (img_out->pixel_format == GG_PIXEL_GRID) 4883 + ; 4884 + else if (img_out->pixel_format == GG_PIXEL_PALETTE) 4885 + { 4886 + if (img_in->bits_per_sample <= img_out->bits_per_sample) 4887 + ; 4888 + else 4889 + return GGRAPH_ERROR; 4890 + } 4891 + 4892 + for (y = 0; y < height; y++) 4893 + { 4894 + unsigned char *p_in = img_in->pixels + (y * img_in->scanline_width); 4895 + unsigned char *p_out = 4896 + img_out->pixels + (y * img_out->scanline_width); 4897 + unsigned char red; 4898 + unsigned char green; 4899 + unsigned char blue; 4900 + unsigned char idx; 4901 + for (x = 0; x < width; x++) 4902 + { 4903 + /* fetching the input pixel */ 4904 + switch (img_in->pixel_format) 4905 + { 4906 + case GG_PIXEL_RGB: 4907 + red = *p_in++; 4908 + green = *p_in++; 4909 + blue = *p_in++; 4910 + break; 4911 + case GG_PIXEL_RGBA: 4912 + red = *p_in++; 4913 + green = *p_in++; 4914 + blue = *p_in++; 4915 + p_in++; /* skipping alpha */ 4916 + break; 4917 + case GG_PIXEL_ARGB: 4918 + p_in++; /* skipping alpha */ 4919 + red = *p_in++; 4920 + green = *p_in++; 4921 + blue = *p_in++; 4922 + break; 4923 + case GG_PIXEL_BGR: 4924 + blue = *p_in++; 4925 + green = *p_in++; 4926 + red = *p_in++; 4927 + break; 4928 + case GG_PIXEL_BGRA: 4929 + blue = *p_in++; 4930 + green = *p_in++; 4931 + red = *p_in++; 4932 + p_in++; /* skipping alpha */ 4933 + break; 4934 + case GG_PIXEL_GRAYSCALE: 4935 + red = *p_in++; 4936 + green = red; 4937 + blue = red; 4938 + break; 4939 + case GG_PIXEL_PALETTE: 4940 + idx = *p_in++; 4941 + red = img_in->palette_red[idx]; 4942 + green = img_in->palette_green[idx]; 4943 + blue = img_in->palette_blue[idx]; 4944 + break; 4945 + }; 4946 + /* storing the output pixel */ 4947 + switch (img_out->pixel_format) 4948 + { 4949 + case GG_PIXEL_RGB: 4950 + *p_out++ = red; 4951 + *p_out++ = green; 4952 + *p_out++ = blue; 4953 + break; 4954 + case GG_PIXEL_GRAYSCALE: 4955 + *p_out++ = to_grayscale2 (red, green, blue); 4956 + break; 4957 + case GG_PIXEL_PALETTE: 4958 + *p_out++ = feed_palette (img_out, red, green, blue); 4959 + break; 4960 + }; 4961 + } 4962 + } 4963 + 4964 + *ptr_out = img_out; 4965 + return GGRAPH_OK; 4966 +}
Added src/gaiagraphics_color_rules.c.
1 +/* 2 +/ gaiagraphics_color_rules.c 3 +/ 4 +/ GRIDS color rules helpers 5 +/ 6 +/ version 1.0, 2010 August 31 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2010 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdio.h> 28 +#include <string.h> 29 +#include <float.h> 30 +#include <math.h> 31 +#include <stdlib.h> 32 + 33 +#ifdef _WIN32 34 +#include <windows.h> 35 +#include <process.h> 36 +#include <io.h> 37 +#else 38 +#include <pthread.h> 39 +#include <unistd.h> 40 +#endif 41 + 42 +#include "gaiagraphics.h" 43 +#include "gaiagraphics_internals.h" 44 + 45 +#define GG_MAX_THREADS 64 46 + 47 +#define LANDSAT_RED 1 48 +#define LANDSAT_GREEN 2 49 +#define LANDSAT_BLUE 3 50 +#define LANDSAT_PANCHRO 4 51 + 52 +struct thread_grid_render 53 +{ 54 +/* a struct used by grid rendering threads */ 55 + gGraphColorMapPtr color_map; 56 + double no_data_value; 57 + int sample_format; 58 + int bits_per_sample; 59 + void *pixels; 60 + int base; 61 + int num_pixels; 62 + unsigned char *p_rgb; 63 +}; 64 + 65 +struct thread_shaded_relief_render 66 +{ 67 +/* a struct used by shader relief rendering threads */ 68 + gGraphShadedReliefTripleRowPtr triple_row; 69 + double altRadians; 70 + double azRadians; 71 + int base; 72 + int num_pixels; 73 + unsigned char *p_rgb; 74 +}; 75 + 76 +struct thread_landsat_recalibrate 77 +{ 78 +/* a struct used by Landsat recalibrate */ 79 + gGraphStripImagePtr img_red; 80 + gGraphStripImagePtr img_green; 81 + gGraphStripImagePtr img_blue; 82 + gGraphStripImagePtr img_out; 83 + int min_row; 84 + int max_row; 85 + int width; 86 + unsigned char value; 87 + double lmin_red; 88 + double lmax_red; 89 + double qcalmin_red; 90 + double qcalmax_red; 91 + int gain_low_red; 92 + double spectral_irradiance_red; 93 + double low_gain_factor_red; 94 + double high_gain_factor_red; 95 + unsigned char recalibration_min_red; 96 + unsigned char recalibration_max_red; 97 + double lmin_green; 98 + double lmax_green; 99 + double qcalmin_green; 100 + double qcalmax_green; 101 + int gain_low_green; 102 + double spectral_irradiance_green; 103 + double low_gain_factor_green; 104 + double high_gain_factor_green; 105 + unsigned char recalibration_min_green; 106 + unsigned char recalibration_max_green; 107 + double lmin_blue; 108 + double lmax_blue; 109 + double qcalmin_blue; 110 + double qcalmax_blue; 111 + int gain_low_blue; 112 + double spectral_irradiance_blue; 113 + double low_gain_factor_blue; 114 + double high_gain_factor_blue; 115 + unsigned char recalibration_min_blue; 116 + unsigned char recalibration_max_blue; 117 + double lmin_panchro; 118 + double lmax_panchro; 119 + double qcalmin_panchro; 120 + double qcalmax_panchro; 121 + int gain_low_panchro; 122 + double spectral_irradiance_panchro; 123 + double low_gain_factor_panchro; 124 + double high_gain_factor_panchro; 125 + unsigned char recalibration_min_panchro; 126 + unsigned char recalibration_max_panchro; 127 + double sun_distance; 128 + double sun_elevation; 129 + int band; 130 +}; 131 + 132 +static int 133 +color_rule_compare1 (double min1, double max1, double min2, double max2) 134 +{ 135 +/* evaluting the range */ 136 + if (min1 == min2 && max1 == max2) 137 + return 0; 138 + if (min1 > min2) 139 + return 1; 140 + if (min1 == min2 && max1 > max2) 141 + return 1; 142 + return -1; 143 +} 144 + 145 +static int 146 +cmp_color_rules1 (const void *p1, const void *p2) 147 +{ 148 +/* compares two Color Entries [for QSORT] */ 149 + gGraphColorMapEntryPtr pR1 = *((gGraphColorMapEntryPtr *) p1); 150 + gGraphColorMapEntryPtr pR2 = *((gGraphColorMapEntryPtr *) p2); 151 + return color_rule_compare1 (pR1->min, pR2->max, pR2->min, pR2->max); 152 +} 153 + 154 +static int 155 +color_rule_compare2 (double value, double min, double max) 156 +{ 157 +/* evaluting the value */ 158 + if (value < min) 159 + return -1; 160 + if (value > max) 161 + return 1; 162 + return 0; 163 +} 164 + 165 +static int 166 +cmp_color_rules2 (const void *p1, const void *p2) 167 +{ 168 +/* compares two Color Entries [for BSEARCH] */ 169 + gGraphColorMapEntryPtr pR1 = (gGraphColorMapEntryPtr) p1; 170 + gGraphColorMapEntryPtr pR2 = *((gGraphColorMapEntryPtr *) p2); 171 + return color_rule_compare2 (pR1->min, pR2->min, pR2->max); 172 +} 173 + 174 +GGRAPH_PRIVATE gGraphColorRulePtr 175 +gg_color_rule_create (void) 176 +{ 177 +/* allocating an empty Color Rule */ 178 + gGraphColorRulePtr ptr = malloc (sizeof (gGraphColorRule)); 179 + if (!ptr) 180 + return NULL; 181 + ptr->signature = GG_COLOR_RULE_MAGIC_SIGNATURE; 182 + ptr->first = NULL; 183 + ptr->last = NULL; 184 + ptr->needs_range = 0; 185 + ptr->no_data_red = 255; 186 + ptr->no_data_green = 255; 187 + ptr->no_data_blue = 255; 188 + return ptr; 189 +} 190 + 191 +GGRAPH_PRIVATE void 192 +gg_color_rule_destroy (gGraphColorRulePtr ptr) 193 +{ 194 +/* destroying a Color Rule */ 195 + gGraphColorRuleItemPtr p; 196 + gGraphColorRuleItemPtr pn; 197 + if (!ptr) 198 + return; 199 + p = ptr->first; 200 + while (p) 201 + { 202 + pn = p->next; 203 + free (p); 204 + p = pn; 205 + } 206 + free (ptr); 207 +} 208 + 209 +GGRAPH_PRIVATE gGraphColorMapPtr 210 +gg_color_map_create (void) 211 +{ 212 +/* allocating an empty Color Map */ 213 + gGraphColorMapPtr ptr = malloc (sizeof (gGraphColorMap)); 214 + if (!ptr) 215 + return NULL; 216 + ptr->signature = GG_COLOR_MAP_MAGIC_SIGNATURE; 217 + ptr->first = NULL; 218 + ptr->last = NULL; 219 + ptr->no_data_red = 255; 220 + ptr->no_data_green = 255; 221 + ptr->no_data_blue = 255; 222 + ptr->not_found_red = 255; 223 + ptr->not_found_green = 255; 224 + ptr->not_found_blue = 255; 225 + ptr->num_entries = 0; 226 + ptr->array = NULL; 227 + return ptr; 228 +} 229 + 230 +GGRAPH_PRIVATE void 231 +gg_color_map_destroy (gGraphColorMapPtr ptr) 232 +{ 233 +/* destroying a Color Map */ 234 + gGraphColorMapEntryPtr p; 235 + gGraphColorMapEntryPtr pn; 236 + if (!ptr) 237 + return; 238 + p = ptr->first; 239 + while (p) 240 + { 241 + pn = p->next; 242 + free (p); 243 + p = pn; 244 + } 245 + if (ptr->array) 246 + free (ptr->array); 247 + free (ptr); 248 +} 249 + 250 +static char * 251 +string_tokenizer (char *string, char *delimiters, char **ptr) 252 +{ 253 +/* breaking a string into distinct tokens */ 254 + char *start = NULL; 255 + char *p; 256 + if (*ptr != NULL) 257 + p = *ptr; 258 + else 259 + p = string; 260 + 261 + if (p == NULL) 262 + return NULL; 263 + 264 + while (1) 265 + { 266 + int sep = 0; 267 + char *pd = delimiters; 268 + 269 + if (*p == '\0') 270 + { 271 + /* last token end */ 272 + *ptr = p; 273 + break; 274 + } 275 + 276 + while (*pd != '\0') 277 + { 278 + if (*p == *pd) 279 + { 280 + /* found a separator char */ 281 + sep = 1; 282 + break; 283 + } 284 + pd++; 285 + } 286 + if (sep) 287 + { 288 + if (start) 289 + { 290 + /* token end */ 291 + *p = '\0'; 292 + *ptr = p + 1; 293 + break; 294 + } 295 + } 296 + else 297 + { 298 + if (!start) 299 + { 300 + /* token start */ 301 + start = p; 302 + } 303 + } 304 + p++; 305 + } 306 + 307 + return start; 308 +} 309 + 310 +static int 311 +is_no_data_token (const char *token) 312 +{ 313 +/* checking if this one is a NoData declaration */ 314 + char buf[8]; 315 + int i; 316 + if (strlen (token) != 2) 317 + return 0; 318 + strcpy (buf, token); 319 + for (i = 0; i < (int) strlen (buf); i++) 320 + { 321 + if (buf[i] >= 'A' && buf[i] <= 'Z') 322 + buf[i] = 'a' + (buf[i] - 'A'); 323 + } 324 + if (strcmp (buf, "nv") == 0) 325 + return 1; 326 + return 0; 327 +} 328 + 329 +static int 330 +token_to_double (const char *str, double *value) 331 +{ 332 +/* attempting to convert from string to double */ 333 + const char *p = str; 334 + int error = 0; 335 + int digits = 0; 336 + int comma = 0; 337 + int sign = 0; 338 + while (*p != '\0') 339 + { 340 + if (*p >= '0' && *p <= '9') 341 + digits++; 342 + else if (*p == '.') 343 + comma++; 344 + else if (*p == '-' || *p == '+') 345 + { 346 + if (digits == 0) 347 + sign++; 348 + else 349 + error = 1; 350 + } 351 + else 352 + error = 1; 353 + p++; 354 + } 355 + if (digits > 0 && sign < 2 && comma < 2 && error == 0) 356 + { 357 + *value = atof (str); 358 + return 1; 359 + } 360 + return 0; 361 +} 362 + 363 +static int 364 +is_percent_token (const char *token, double *perc_value) 365 +{ 366 +/* checking if this one is a percentual value */ 367 + if (token[strlen (token) - 1] == '%') 368 + { 369 + double value; 370 + char buf[128]; 371 + strcpy (buf, token); 372 + buf[strlen (token) - 1] = '\0'; 373 + if (!token_to_double (buf, &value)) 374 + return 0; 375 + *perc_value = value; 376 + return 1; 377 + } 378 + return 0; 379 +} 380 + 381 +static int 382 +is_color_name_token (const char *token, unsigned char *red, 383 + unsigned char *green, unsigned char *blue) 384 +{ 385 +/* checking if this one is a color name */ 386 + char buf[32]; 387 + int i; 388 + if (strlen (token) > 30) 389 + return 0; 390 + strcpy (buf, token); 391 + for (i = 0; i < (int) strlen (buf); i++) 392 + { 393 + if (buf[i] >= 'A' && buf[i] <= 'Z') 394 + buf[i] = 'a' + (buf[i] - 'A'); 395 + } 396 + if (strcmp (buf, "black") == 0) 397 + { 398 + *red = 0; 399 + *green = 0; 400 + *blue = 0; 401 + return 1; 402 + } 403 + if (strcmp (buf, "white") == 0) 404 + { 405 + *red = 255; 406 + *green = 255; 407 + *blue = 255; 408 + return 1; 409 + } 410 + if (strcmp (buf, "red") == 0) 411 + { 412 + *red = 255; 413 + *green = 0; 414 + *blue = 0; 415 + return 1; 416 + } 417 + if (strcmp (buf, "lime") == 0) 418 + { 419 + *red = 0; 420 + *green = 255; 421 + *blue = 0; 422 + return 1; 423 + } 424 + if (strcmp (buf, "blue") == 0) 425 + { 426 + *red = 0; 427 + *green = 0; 428 + *blue = 255; 429 + return 1; 430 + } 431 + if (strcmp (buf, "yellow") == 0) 432 + { 433 + *red = 255; 434 + *green = 255; 435 + *blue = 0; 436 + return 1; 437 + } 438 + if (strcmp (buf, "magenta") == 0 || strcmp (buf, "fuchsia") == 0) 439 + { 440 + *red = 255; 441 + *green = 0; 442 + *blue = 255; 443 + return 1; 444 + } 445 + if (strcmp (buf, "cyan") == 0 || strcmp (buf, "aqua") == 0) 446 + { 447 + *red = 0; 448 + *green = 255; 449 + *blue = 255; 450 + return 1; 451 + } 452 + if (strcmp (buf, "orange") == 0) 453 + { 454 + *red = 255; 455 + *green = 128; 456 + *blue = 0; 457 + return 1; 458 + } 459 + if (strcmp (buf, "violet") == 0) 460 + { 461 + *red = 128; 462 + *green = 0; 463 + *blue = 255; 464 + return 1; 465 + } 466 + if (strcmp (buf, "purple") == 0) 467 + { 468 + *red = 128; 469 + *green = 0; 470 + *blue = 128; 471 + return 1; 472 + } 473 + if (strcmp (buf, "brown") == 0 || strcmp (buf, "maroon") == 0) 474 + { 475 + *red = 128; 476 + *green = 0; 477 + *blue = 0; 478 + return 1; 479 + } 480 + if (strcmp (buf, "indigo") == 0) 481 + { 482 + *red = 0; 483 + *green = 0; 484 + *blue = 128; 485 + return 1; 486 + } 487 + if (strcmp (buf, "green") == 0) 488 + { 489 + *red = 0; 490 + *green = 128; 491 + *blue = 0; 492 + return 1; 493 + } 494 + if (strcmp (buf, "navy") == 0) 495 + { 496 + *red = 0; 497 + *green = 0; 498 + *blue = 128; 499 + return 1; 500 + } 501 + if (strcmp (buf, "olive") == 0) 502 + { 503 + *red = 128; 504 + *green = 128; 505 + *blue = 0; 506 + return 1; 507 + } 508 + if (strcmp (buf, "teal") == 0) 509 + { 510 + *red = 0; 511 + *green = 128; 512 + *blue = 128; 513 + return 1; 514 + } 515 + if (strcmp (buf, "silver") == 0) 516 + { 517 + *red = 192; 518 + *green = 192; 519 + *blue = 192; 520 + return 1; 521 + } 522 + if (strcmp (buf, "gray") == 0) 523 + { 524 + *red = 128; 525 + *green = 128; 526 + *blue = 128; 527 + return 1; 528 + } 529 + return 0; 530 +} 531 + 532 +static gGraphColorRuleItemPtr 533 +alloc_color_rule_item (double value, unsigned char percent, unsigned char red, 534 + unsigned char green, unsigned char blue) 535 +{ 536 +/* allocates and initializes a Color Rule Item */ 537 + gGraphColorRuleItemPtr p = malloc (sizeof (gGraphColorRuleItem)); 538 + if (!p) 539 + return NULL; 540 + if (percent) 541 + { 542 + p->value = DBL_MAX; 543 + p->percent_value = value; 544 + } 545 + else 546 + { 547 + p->value = value; 548 + p->percent_value = DBL_MAX; 549 + } 550 + p->is_percent = percent; 551 + p->red = red; 552 + p->green = green; 553 + p->blue = blue; 554 + p->next = NULL; 555 + return p; 556 +} 557 + 558 +static int 559 +add_interval_to_color_rule (gGraphColorRulePtr ptr, double value, 560 + unsigned char red, unsigned char green, 561 + unsigned char blue) 562 +{ 563 +/* adding an Interval [absolute value] to a Color Rule */ 564 + gGraphColorRuleItemPtr p; 565 + if (!ptr) 566 + return 0; 567 + p = alloc_color_rule_item (value, 0, red, green, blue); 568 + if (!p) 569 + return 0; 570 + if (ptr->first == NULL) 571 + ptr->first = p; 572 + if (ptr->last != NULL) 573 + ptr->last->next = p; 574 + ptr->last = p; 575 + return 1; 576 +} 577 + 578 +static int 579 +add_percent_to_color_rule (gGraphColorRulePtr ptr, double value, 580 + unsigned char red, unsigned char green, 581 + unsigned char blue) 582 +{ 583 +/* adding an Interval [percent] to a Color Rule */ 584 + gGraphColorRuleItemPtr p; 585 + if (!ptr) 586 + return 0; 587 + p = alloc_color_rule_item (value, 1, red, green, blue); 588 + if (!p) 589 + return 0; 590 + ptr->needs_range = 1; 591 + if (ptr->first == NULL) 592 + ptr->first = p; 593 + if (ptr->last != NULL) 594 + ptr->last->next = p; 595 + ptr->last = p; 596 + return 1; 597 +} 598 + 599 +GGRAPH_DECLARE int 600 +gGraphColorRuleFromMemBuf (char *buf, const void **color_rule) 601 +{ 602 +/* trying to load a Color Rule from a GRASS-like memory block [null terminated] */ 603 + const char *p = buf; 604 + char in_buf[1024]; 605 + char *token; 606 + char *p_in; 607 + int error; 608 + double threshold; 609 + unsigned char red; 610 + unsigned char green; 611 + unsigned char blue; 612 + int no_data; 613 + int percent; 614 + double perc_value; 615 + int color_name; 616 + char *saveptr; 617 + int i_tk; 618 + double value; 619 + int ret; 620 + gGraphColorRulePtr rule = NULL; 621 + 622 + *color_rule = NULL; 623 + rule = gg_color_rule_create (); 624 + if (!rule) 625 + return GGRAPH_INSUFFICIENT_MEMORY; 626 + 627 + p_in = in_buf; 628 + while (*p != '\0') 629 + { 630 + /* parsing the Color Map block */ 631 + if (*p == '\r') 632 + { 633 + p++; 634 + continue; 635 + } 636 + if (*p == '\n') 637 + { 638 + *p_in = '\0'; 639 + 640 + red = 0; 641 + green = 0; 642 + blue = 0; 643 + no_data = 0; 644 + percent = 0; 645 + color_name = 0; 646 + error = 0; 647 + 648 + if (*in_buf == '#') 649 + { 650 + /* skipping a comment line */ 651 + p_in = in_buf; 652 + continue; 653 + } 654 + 655 + i_tk = 0; 656 + saveptr = NULL; 657 + while (1) 658 + { 659 + /* breaking the string into separate tokens */ 660 + token = string_tokenizer (in_buf, ": \t", &saveptr); 661 + if (token == NULL) 662 + break; 663 + 664 + if (i_tk == 0) 665 + { 666 + if (is_no_data_token (token)) 667 + { 668 + no_data = 1; 669 + i_tk++; 670 + continue; 671 + } 672 + if (is_percent_token (token, &perc_value)) 673 + { 674 + percent = 1; 675 + i_tk++; 676 + continue; 677 + } 678 + } 679 + else 680 + { 681 + color_name = 682 + is_color_name_token (token, &red, &green, 683 + &blue); 684 + if (color_name) 685 + { 686 + i_tk++; 687 + continue; 688 + } 689 + } 690 + 691 + if (!token_to_double (token, &value)) 692 + error = 1; 693 + else 694 + { 695 + switch (i_tk) 696 + { 697 + case 0: 698 + threshold = value; 699 + break; 700 + case 1: 701 + if (value >= 0.0 && value <= 255.0) 702 + red = (unsigned char) value; 703 + else 704 + error = 1; 705 + break; 706 + case 2: 707 + if (value >= 0.0 && value <= 255.0) 708 + green = (unsigned char) value; 709 + else 710 + error = 1; 711 + break; 712 + case 3: 713 + if (value >= 0.0 && value <= 255.0) 714 + blue = (unsigned char) value; 715 + else 716 + error = 1; 717 + break; 718 + default: 719 + error = 1; 720 + break; 721 + }; 722 + } 723 + 724 + i_tk++; 725 + } 726 + 727 + if (error) 728 + { 729 + ret = GGRAPH_ERROR; 730 + goto stop; 731 + } 732 + else if (no_data) 733 + { 734 + rule->no_data_red = red; 735 + rule->no_data_green = green; 736 + rule->no_data_blue = blue; 737 + } 738 + else if (percent) 739 + { 740 + if (!add_percent_to_color_rule 741 + (rule, perc_value, red, green, blue)) 742 + { 743 + ret = GGRAPH_INSUFFICIENT_MEMORY; 744 + goto stop; 745 + } 746 + } 747 + else 748 + { 749 + if (!add_interval_to_color_rule 750 + (rule, threshold, red, green, blue)) 751 + { 752 + ret = GGRAPH_INSUFFICIENT_MEMORY; 753 + goto stop; 754 + } 755 + } 756 + 757 + p_in = in_buf; 758 + p++; 759 + continue; 760 + } 761 + *p_in++ = *p++; 762 + } 763 + *color_rule = rule; 764 + return GGRAPH_OK; 765 + 766 + stop: 767 + gg_color_rule_destroy (rule); 768 + return ret; 769 +} 770 + 771 +GGRAPH_DECLARE int 772 +gGraphColorRuleFromFile (const char *path, const void **color_rule) 773 +{ 774 +/* trying to load a Color Rule from a GRASS-like file */ 775 + FILE *in = NULL; 776 + int c; 777 + char *buf; 778 + char *p; 779 + int ret; 780 + const void *handle; 781 + 782 + *color_rule = NULL; 783 + buf = malloc (1024 * 1024); 784 + if (!buf) 785 + return GGRAPH_INSUFFICIENT_MEMORY; 786 + 787 + in = fopen (path, "rb"); 788 + if (in == NULL) 789 + return GGRAPH_FILE_OPEN_ERROR; 790 + 791 + p = buf; 792 + while ((c = getc (in)) != EOF) 793 + { 794 + /* loading the Color Rule file */ 795 + *p++ = c; 796 + } 797 + *p = '\0'; 798 + fclose (in); 799 + 800 + ret = gGraphColorRuleFromMemBuf (buf, &handle); 801 + free (buf); 802 + if (ret == GGRAPH_OK) 803 + *color_rule = handle; 804 + return ret; 805 +} 806 + 807 +GGRAPH_DECLARE void 808 +gGraphDestroyColorRule (const void *ptr) 809 +{ 810 +/* destroyng a Color Rule object */ 811 + gGraphColorRulePtr rule = (gGraphColorRulePtr) ptr; 812 + 813 + if (rule == NULL) 814 + return; 815 + if (rule->signature == GG_COLOR_RULE_MAGIC_SIGNATURE) 816 + { 817 + gg_color_rule_destroy (rule); 818 + return; 819 + } 820 +} 821 + 822 +GGRAPH_DECLARE int 823 +gGraphIsColorRuleRelative (const void *ptr, int *relative) 824 +{ 825 +/* checking if this Color Rule is a Relative one */ 826 + gGraphColorRulePtr rule = (gGraphColorRulePtr) ptr; 827 + 828 + if (rule == NULL) 829 + return GGRAPH_INVALID_COLOR_RULE; 830 + if (rule->signature != GG_COLOR_RULE_MAGIC_SIGNATURE) 831 + return GGRAPH_INVALID_COLOR_RULE; 832 + 833 + if (rule->needs_range) 834 + *relative = GGRAPH_TRUE; 835 + else 836 + *relative = GGRAPH_FALSE; 837 + return GGRAPH_OK; 838 +} 839 + 840 +static gGraphColorMapEntryPtr 841 +alloc_color_map_entry (double min, double max, unsigned char red, 842 + unsigned char green, unsigned char blue) 843 +{ 844 +/* allocates and initializes a Color Map Entry object */ 845 + gGraphColorMapEntryPtr p = malloc (sizeof (gGraphColorMapEntry)); 846 + if (!p) 847 + return NULL; 848 + p->min = min; 849 + p->max = max; 850 + p->red = red; 851 + p->green = green; 852 + p->blue = blue; 853 + p->next = NULL; 854 + return p; 855 +} 856 + 857 +static gGraphColorMapEntryPtr 858 +add_entry_to_color_map (gGraphColorMapPtr ptr, double min, 859 + double max, unsigned char red, unsigned char green, 860 + unsigned char blue) 861 +{ 862 +/* adding an Entry to a Color Map object */ 863 + gGraphColorMapEntryPtr entry; 864 + if (!ptr) 865 + return NULL; 866 + 867 + if (ptr->last) 868 + { 869 + entry = ptr->last; 870 + if (entry->red == red && entry->green == green && entry->blue == blue) 871 + { 872 + /* extending the current range */ 873 + if (entry->min > min) 874 + entry->min = min; 875 + if (entry->max < max) 876 + entry->max = max; 877 + return entry; 878 + } 879 + } 880 + 881 + entry = alloc_color_map_entry (min, max, red, green, blue); 882 + if (!entry) 883 + return NULL; 884 + if (ptr->first == NULL) 885 + ptr->first = entry; 886 + if (ptr->last != NULL) 887 + ptr->last->next = entry; 888 + ptr->last = entry; 889 + return entry; 890 +} 891 + 892 +static int 893 +resolve_interval (gGraphColorMapPtr ptr, double min, double max, 894 + unsigned char min_red, unsigned char min_green, 895 + unsigned char min_blue, unsigned char max_red, 896 + unsigned char max_green, unsigned char max_blue) 897 +{ 898 +/* resolving a color gradient */ 899 + double range = max - min; 900 + double red_range; 901 + double green_range; 902 + double blue_range; 903 + double tik = range / 256.0; 904 + double red_tik; 905 + double green_tik; 906 + double blue_tik; 907 + int reverse_red; 908 + int reverse_green; 909 + int reverse_blue; 910 + int i; 911 + 912 + if (max_red >= min_red) 913 + { 914 + red_range = max_red - min_red; 915 + reverse_red = 0; 916 + } 917 + else 918 + { 919 + red_range = min_red - max_red; 920 + reverse_red = 1; 921 + } 922 + if (max_green >= min_green) 923 + { 924 + green_range = max_green - min_green; 925 + reverse_green = 0; 926 + } 927 + else 928 + { 929 + green_range = min_green - max_green; 930 + reverse_green = 1; 931 + } 932 + if (max_blue >= min_blue) 933 + { 934 + blue_range = max_blue - min_blue; 935 + reverse_blue = 0; 936 + } 937 + else 938 + { 939 + blue_range = min_blue - max_blue; 940 + reverse_blue = 1; 941 + } 942 + red_tik = red_range / 256.0; 943 + green_tik = green_range / 256.0; 944 + blue_tik = blue_range / 256.0; 945 + 946 + for (i = 0; i < 256; i++) 947 + { 948 + /* generating range intervals */ 949 + double imin = min + (tik * (double) i); 950 + double imax = imin + tik; 951 + double red; 952 + double green; 953 + double blue; 954 + if (reverse_red) 955 + red = (double) min_red - (red_tik * (double) i); 956 + else 957 + red = (double) min_red + (red_tik * (double) i); 958 + if (reverse_green) 959 + green = (double) min_green - (green_tik * (double) i); 960 + else 961 + green = (double) min_green + (green_tik * (double) i); 962 + if (reverse_blue) 963 + blue = (double) min_blue - (blue_tik * (double) i); 964 + else 965 + blue = (double) min_blue + (blue_tik * (double) i); 966 + if (i == 255) 967 + { 968 + imax = max; 969 + red = max_red; 970 + green = max_green; 971 + blue = max_blue; 972 + } 973 + if (red < 0.0) 974 + red = 0.0; 975 + if (red > 255.0) 976 + red = 255.0; 977 + if (green < 0.0) 978 + green = 0.0; 979 + if (green > 255.0) 980 + green = 255.0; 981 + if (blue < 0.0) 982 + blue = 0.0; 983 + if (blue > 255.0) 984 + blue = 255.0; 985 + if (add_entry_to_color_map (ptr, imin, imax, (unsigned char) red, 986 + (unsigned char) green, 987 + (unsigned char) blue) == NULL) 988 + return GGRAPH_ERROR; 989 + } 990 + return GGRAPH_OK; 991 +} 992 + 993 +static void 994 +color_map_prepare (gGraphColorMapPtr map) 995 +{ 996 +/* preparing the sorted array for Color Entries */ 997 + int ind; 998 + gGraphColorMapEntryPtr entry; 999 + if (map->array) 1000 + free (map->array); 1001 + map->array = NULL; 1002 + 1003 + map->num_entries = 0; 1004 + entry = map->first; 1005 + while (entry) 1006 + { 1007 + /* counting how many Entries are there */ 1008 + map->num_entries += 1; 1009 + entry = entry->next; 1010 + } 1011 + if (map->num_entries <= 0) 1012 + return; 1013 + 1014 + map->array = malloc (sizeof (gGraphColorMapEntryPtr) * map->num_entries); 1015 + ind = 0; 1016 + entry = map->first; 1017 + while (entry) 1018 + { 1019 + /* feeding the pointers array */ 1020 + *(map->array + ind) = entry; 1021 + ind++; 1022 + entry = entry->next; 1023 + } 1024 +/* sorting the array */ 1025 + qsort (map->array, map->num_entries, sizeof (gGraphColorMapEntryPtr), 1026 + cmp_color_rules1); 1027 +} 1028 + 1029 +GGRAPH_DECLARE int 1030 +gGraphCreateColorMapAbsolute (const void *color_rule, 1031 + unsigned char background_red, 1032 + unsigned char background_green, 1033 + unsigned char background_blue, 1034 + const void **color_map) 1035 +{ 1036 +/* attempting to create an ABSOLUTE Color Map */ 1037 + double last_value = DBL_MAX; 1038 + unsigned char last_red; 1039 + unsigned char last_green; 1040 + unsigned char last_blue; 1041 + gGraphColorMapPtr map; 1042 + gGraphColorRuleItemPtr item; 1043 + gGraphColorRulePtr rule = (gGraphColorRulePtr) color_rule; 1044 + 1045 + if (rule == NULL) 1046 + return GGRAPH_INVALID_COLOR_RULE; 1047 + if (rule->signature != GG_COLOR_RULE_MAGIC_SIGNATURE) 1048 + return GGRAPH_INVALID_COLOR_RULE; 1049 + if (rule->needs_range) 1050 + return GGRAPH_INVALID_COLOR_RULE; 1051 + 1052 + *color_map = NULL; 1053 + map = gg_color_map_create (); 1054 + if (!map) 1055 + return GGRAPH_INSUFFICIENT_MEMORY; 1056 + map->no_data_red = background_red; 1057 + map->no_data_green = background_green; 1058 + map->no_data_blue = background_blue; 1059 + map->not_found_red = background_red; 1060 + map->not_found_green = background_green; 1061 + map->not_found_blue = background_blue; 1062 + 1063 + item = rule->first; 1064 + while (item) 1065 + { 1066 + /* expanding intervals by color */ 1067 + if (last_value != DBL_MAX && last_value != item->value) 1068 + { 1069 + if (resolve_interval 1070 + (map, last_value, item->value, last_red, last_green, 1071 + last_blue, item->red, item->green, 1072 + item->blue) != GGRAPH_OK) 1073 + goto error; 1074 + } 1075 + last_value = item->value; 1076 + last_red = item->red; 1077 + last_green = item->green; 1078 + last_blue = item->blue; 1079 + item = item->next; 1080 + } 1081 + color_map_prepare (map); 1082 + if (map->array == NULL) 1083 + goto error; 1084 + *color_map = map; 1085 + return GGRAPH_OK; 1086 + 1087 + error: 1088 + gg_color_map_destroy (map); 1089 + return GGRAPH_ERROR; 1090 +} 1091 + 1092 +GGRAPH_DECLARE int 1093 +gGraphCreateColorMapRelative (const void *color_rule, double min, double max, 1094 + unsigned char background_red, 1095 + unsigned char background_green, 1096 + unsigned char background_blue, 1097 + const void **color_map) 1098 +{ 1099 +/* attempting to create a RELATIVE Color Map */ 1100 + double last_value = DBL_MAX; 1101 + unsigned char last_red; 1102 + unsigned char last_green; 1103 + unsigned char last_blue; 1104 + double percent; 1105 + gGraphColorMapPtr map; 1106 + gGraphColorRuleItemPtr item; 1107 + gGraphColorRulePtr rule = (gGraphColorRulePtr) color_rule; 1108 + 1109 + if (rule == NULL) 1110 + return GGRAPH_INVALID_COLOR_RULE; 1111 + if (rule->signature != GG_COLOR_RULE_MAGIC_SIGNATURE) 1112 + return GGRAPH_INVALID_COLOR_RULE; 1113 + if (rule->needs_range == 0) 1114 + return GGRAPH_INVALID_COLOR_RULE; 1115 + 1116 + *color_map = NULL; 1117 + map = gg_color_map_create (); 1118 + if (!map) 1119 + return GGRAPH_INSUFFICIENT_MEMORY; 1120 + map->no_data_red = background_red; 1121 + map->no_data_green = background_green; 1122 + map->no_data_blue = background_blue; 1123 + map->not_found_red = background_red; 1124 + map->not_found_green = background_green; 1125 + map->not_found_blue = background_blue; 1126 + 1127 + percent = (max - min) / 100.0; 1128 + item = rule->first; 1129 + while (item) 1130 + { 1131 + /* tranforming percent values into absolute ones */ 1132 + if (item->is_percent) 1133 + item->value = min + (percent * item->percent_value); 1134 + item = item->next; 1135 + } 1136 + 1137 + item = rule->first; 1138 + while (item) 1139 + { 1140 + /* expanding intervals by color */ 1141 + if (last_value != DBL_MAX && last_value != item->value) 1142 + { 1143 + if (resolve_interval 1144 + (map, last_value, item->value, last_red, last_green, 1145 + last_blue, item->red, item->green, 1146 + item->blue) != GGRAPH_OK) 1147 + goto error; 1148 + } 1149 + last_value = item->value; 1150 + last_red = item->red; 1151 + last_green = item->green; 1152 + last_blue = item->blue; 1153 + item = item->next; 1154 + } 1155 + color_map_prepare (map); 1156 + if (map->array == NULL) 1157 + goto error; 1158 + *color_map = map; 1159 + return GGRAPH_OK; 1160 + 1161 + error: 1162 + gg_color_map_destroy (map); 1163 + return GGRAPH_ERROR; 1164 +} 1165 + 1166 +GGRAPH_DECLARE void 1167 +gGraphDestroyColorMap (const void *ptr) 1168 +{ 1169 +/* destroyng a Color Map object */ 1170 + gGraphColorMapPtr map = (gGraphColorMapPtr) ptr; 1171 + 1172 + if (map == NULL) 1173 + return; 1174 + if (map->signature == GG_COLOR_MAP_MAGIC_SIGNATURE) 1175 + gg_color_map_destroy (map); 1176 +} 1177 + 1178 +GGRAPH_PRIVATE void 1179 +match_color (gGraphColorMapPtr map, double value, double no_data, 1180 + unsigned char *red, unsigned char *green, unsigned char *blue) 1181 +{ 1182 +/* identifying a color corresponding to a value */ 1183 + gGraphColorMapEntryPtr *ret; 1184 + gGraphColorMapEntryPtr p; 1185 + gGraphColorMapEntry val; 1186 + val.min = value; 1187 + val.max = value; 1188 + if (value == no_data) 1189 + { 1190 + /* NoData */ 1191 + *red = map->no_data_red; 1192 + *green = map->no_data_green; 1193 + *blue = map->no_data_blue; 1194 + return; 1195 + } 1196 +/* dicotomic search */ 1197 + ret = 1198 + (gGraphColorMapEntryPtr *) bsearch (&val, map->array, 1199 + map->num_entries, 1200 + sizeof (gGraphColorMapEntryPtr), 1201 + cmp_color_rules2); 1202 + if (!ret) 1203 + { 1204 + /* not found */ 1205 + *red = map->not_found_red; 1206 + *green = map->not_found_green; 1207 + *blue = map->not_found_blue; 1208 + return; 1209 + } 1210 +/* ok, match found */ 1211 + p = *ret; 1212 + *red = p->red; 1213 + *green = p->green; 1214 + *blue = p->blue; 1215 +} 1216 + 1217 +static void 1218 +do_grid_render (struct thread_grid_render *params) 1219 +{ 1220 +/* actual function: rendering a GRID pixels block */ 1221 + unsigned char red; 1222 + unsigned char green; 1223 + unsigned char blue; 1224 + unsigned char *p_out; 1225 + short *p_int16; 1226 + unsigned short *p_uint16; 1227 + int *p_int32; 1228 + unsigned int *p_uint32; 1229 + float *p_float; 1230 + double *p_double; 1231 + double value; 1232 + int x; 1233 + 1234 + if (params->sample_format == GGRAPH_SAMPLE_FLOAT) 1235 + { 1236 + if (params->bits_per_sample == 32) 1237 + { 1238 + p_float = (float *) (params->pixels); 1239 + p_float += params->base; 1240 + } 1241 + else 1242 + { 1243 + p_double = (double *) (params->pixels); 1244 + p_double += params->base; 1245 + } 1246 + } 1247 + if (params->sample_format == GGRAPH_SAMPLE_INT) 1248 + { 1249 + if (params->bits_per_sample == 32) 1250 + { 1251 + p_int32 = (int *) (params->pixels); 1252 + p_int32 += params->base; 1253 + } 1254 + else 1255 + { 1256 + p_int16 = (short *) (params->pixels); 1257 + p_int16 += params->base; 1258 + } 1259 + } 1260 + if (params->sample_format == GGRAPH_SAMPLE_UINT) 1261 + { 1262 + if (params->bits_per_sample == 32) 1263 + { 1264 + p_uint32 = (unsigned int *) (params->pixels); 1265 + p_uint32 += params->base; 1266 + } 1267 + else 1268 + { 1269 + p_uint16 = (unsigned short *) (params->pixels); 1270 + p_uint16 += params->base; 1271 + } 1272 + } 1273 + p_out = params->p_rgb + (params->base * 3); 1274 + for (x = 0; x < params->num_pixels; x++) 1275 + { 1276 + if (params->sample_format == GGRAPH_SAMPLE_FLOAT) 1277 + { 1278 + if (params->bits_per_sample == 32) 1279 + value = *p_float++; 1280 + else 1281 + value = *p_double++; 1282 + } 1283 + if (params->sample_format == GGRAPH_SAMPLE_INT) 1284 + { 1285 + if (params->bits_per_sample == 32) 1286 + value = *p_int32++; 1287 + else 1288 + value = *p_int16++; 1289 + } 1290 + if (params->sample_format == GGRAPH_SAMPLE_UINT) 1291 + { 1292 + if (params->bits_per_sample == 32) 1293 + value = *p_uint32++; 1294 + else 1295 + value = *p_uint16++; 1296 + } 1297 + match_color (params->color_map, value, params->no_data_value, &red, 1298 + &green, &blue); 1299 + *p_out++ = red; 1300 + *p_out++ = green; 1301 + *p_out++ = blue; 1302 + } 1303 +} 1304 + 1305 +#ifdef _WIN32 1306 +static DWORD WINAPI 1307 +#else 1308 +static void * 1309 +#endif 1310 +grid_render (void *arg) 1311 +{ 1312 +/* threaded function: rendering a GRID pixels block */ 1313 + struct thread_grid_render *params = (struct thread_grid_render *) arg; 1314 + do_grid_render (params); 1315 +#ifdef _WIN32 1316 + return 0; 1317 +#else 1318 + pthread_exit (NULL); 1319 +#endif 1320 +} 1321 + 1322 +GGRAPH_DECLARE int 1323 +gGraphStripImageRenderGridPixels (const void *in_ptr, const void *out_ptr, 1324 + const void *map, int num_threads) 1325 +{ 1326 +/* rendering GRID pixels between two images */ 1327 + int y; 1328 + short *p_int16; 1329 + unsigned short *p_uint16; 1330 + int *p_int32; 1331 + unsigned int *p_uint32; 1332 + float *p_float; 1333 + double *p_double; 1334 + void *p_void; 1335 + unsigned char *p_out; 1336 + int nt; 1337 + struct thread_grid_render threads[GG_MAX_THREADS]; 1338 +#ifdef _WIN32 1339 + HANDLE thread_handles[GG_MAX_THREADS]; 1340 + DWORD dwThreadIdArray[GG_MAX_THREADS]; 1341 +#else 1342 + pthread_t thread_ids[GG_MAX_THREADS]; 1343 +#endif 1344 + gGraphStripImagePtr img_in = (gGraphStripImagePtr) in_ptr; 1345 + gGraphStripImagePtr img_out = (gGraphStripImagePtr) out_ptr; 1346 + gGraphColorMapPtr color_map = (gGraphColorMapPtr) map; 1347 + 1348 + if (img_in == NULL || img_out == NULL) 1349 + return GGRAPH_INVALID_IMAGE; 1350 + if (img_in->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 1351 + return GGRAPH_INVALID_IMAGE; 1352 + if (img_out->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 1353 + return GGRAPH_INVALID_IMAGE; 1354 + if (map == NULL) 1355 + return GGRAPH_INVALID_COLOR_MAP; 1356 + if (color_map->signature != GG_COLOR_MAP_MAGIC_SIGNATURE) 1357 + return GGRAPH_INVALID_COLOR_MAP; 1358 + 1359 + if (num_threads > GG_MAX_THREADS) 1360 + num_threads = GG_MAX_THREADS; 1361 + if (num_threads < 1) 1362 + num_threads = 1; 1363 + 1364 +/* checking if the strip buffers does actually have the same size */ 1365 + if (img_in->width == img_out->width 1366 + && img_in->rows_per_block == img_out->rows_per_block) 1367 + ; 1368 + else 1369 + return GGRAPH_ERROR; 1370 + if (img_in->pixel_format != GG_PIXEL_GRID) 1371 + return GGRAPH_INVALID_IMAGE; 1372 + if (img_out->pixel_format != GG_PIXEL_RGB) 1373 + return GGRAPH_INVALID_IMAGE; 1374 + 1375 + for (y = 0; y < img_in->current_available_rows; y++) 1376 + { 1377 + if (img_in->sample_format == GGRAPH_SAMPLE_FLOAT) 1378 + { 1379 + if (img_in->bits_per_sample == 32) 1380 + { 1381 + p_float = (float *) (img_in->pixels); 1382 + p_float += y * img_in->width; 1383 + p_void = p_float; 1384 + } 1385 + else 1386 + { 1387 + p_double = (double *) (img_in->pixels); 1388 + p_double += y * img_in->width; 1389 + p_void = p_double; 1390 + } 1391 + } 1392 + if (img_in->sample_format == GGRAPH_SAMPLE_INT) 1393 + { 1394 + if (img_in->bits_per_sample == 32) 1395 + { 1396 + p_int32 = (int *) (img_in->pixels); 1397 + p_int32 += y * img_in->width; 1398 + p_void = p_int32; 1399 + } 1400 + else 1401 + { 1402 + p_int16 = (short *) (img_in->pixels); 1403 + p_int16 += y * img_in->width; 1404 + p_void = p_int16; 1405 + } 1406 + } 1407 + if (img_in->sample_format == GGRAPH_SAMPLE_UINT) 1408 + { 1409 + if (img_in->bits_per_sample == 32) 1410 + { 1411 + p_uint32 = (unsigned int *) (img_in->pixels); 1412 + p_uint32 += y * img_in->width; 1413 + p_void = p_uint32; 1414 + } 1415 + else 1416 + { 1417 + p_uint16 = (unsigned short *) (img_in->pixels); 1418 + p_uint16 += y * img_in->width; 1419 + p_void = p_uint16; 1420 + } 1421 + } 1422 + p_out = img_out->pixels + (y * img_out->scanline_width); 1423 + 1424 + if (num_threads < 2) 1425 + { 1426 + /* not using multithreading */ 1427 + threads[0].color_map = color_map; 1428 + threads[0].no_data_value = img_in->no_data_value; 1429 + threads[0].sample_format = img_in->sample_format; 1430 + threads[0].bits_per_sample = img_in->bits_per_sample; 1431 + threads[0].pixels = p_void; 1432 + threads[0].base = 0; 1433 + threads[0].num_pixels = img_in->width; 1434 + threads[0].p_rgb = p_out; 1435 + do_grid_render (&(threads[0])); 1436 + } 1437 + else 1438 + { 1439 + /* using concurrent threads */ 1440 + int base = 0; 1441 + int pixels_per_thread = img_in->width / num_threads; 1442 + if ((pixels_per_thread * num_threads) < img_in->width) 1443 + pixels_per_thread++; 1444 + for (nt = 0; nt < num_threads; nt++) 1445 + { 1446 + int num_pixels; 1447 + threads[nt].color_map = color_map; 1448 + threads[nt].no_data_value = img_in->no_data_value; 1449 + threads[nt].sample_format = img_in->sample_format; 1450 + threads[nt].bits_per_sample = img_in->bits_per_sample; 1451 + threads[nt].pixels = p_void; 1452 + threads[nt].base = base; 1453 + num_pixels = pixels_per_thread; 1454 + if (base + pixels_per_thread > img_in->width) 1455 + num_pixels = img_in->width - base; 1456 + threads[nt].num_pixels = num_pixels; 1457 + threads[nt].p_rgb = p_out; 1458 + base += pixels_per_thread; 1459 + if (num_pixels > 0) 1460 + { 1461 +#ifdef _WIN32 1462 + thread_handles[nt] = 1463 + CreateThread (NULL, 0, grid_render, 1464 + &(threads[nt]), 0, 1465 + &dwThreadIdArray[nt]); 1466 +#else 1467 + pthread_create (&(thread_ids[nt]), NULL, 1468 + grid_render, &(threads[nt])); 1469 +#endif 1470 + } 1471 + } 1472 + /* waiting until any concurrent thread terminates */ 1473 +#ifdef _WIN32 1474 + WaitForMultipleObjects (num_threads, thread_handles, TRUE, 1475 + INFINITE); 1476 +#else 1477 + for (nt = 0; nt < num_threads; nt++) 1478 + pthread_join (thread_ids[nt], NULL); 1479 +#endif 1480 + } 1481 + } 1482 + img_out->current_available_rows = img_in->current_available_rows; 1483 + return GGRAPH_OK; 1484 +} 1485 + 1486 +GGRAPH_DECLARE int 1487 +gGraphGetStripImageMinMaxValue (const void *in_ptr, double *min_value, 1488 + double *max_value, double no_data_value) 1489 +{ 1490 +/* determining MinMax values */ 1491 + int x; 1492 + int y; 1493 + short *p_int16; 1494 + unsigned short *p_uint16; 1495 + int *p_int32; 1496 + unsigned int *p_uint32; 1497 + float *p_float; 1498 + double *p_double; 1499 + double value; 1500 + double min = DBL_MAX; 1501 + double max = 0.0 - DBL_MAX; 1502 + int save_row; 1503 + gGraphStripImagePtr img_in = (gGraphStripImagePtr) in_ptr; 1504 + 1505 + *min_value = DBL_MAX; 1506 + *max_value = 0.0 - DBL_MAX; 1507 + if (img_in == NULL) 1508 + return GGRAPH_INVALID_IMAGE; 1509 + if (img_in->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 1510 + return GGRAPH_INVALID_IMAGE; 1511 + if (img_in->pixel_format != GG_PIXEL_GRID) 1512 + return GGRAPH_INVALID_IMAGE; 1513 + 1514 + save_row = img_in->next_row; 1515 + img_in->next_row = 0; 1516 + while (1) 1517 + { 1518 + /* reading strips from input */ 1519 + if (gGraphStripImageEOF (img_in) == GGRAPH_OK) 1520 + break; 1521 + if (gGraphReadNextStrip (img_in, NULL) != GGRAPH_OK) 1522 + goto error; 1523 + for (y = 0; y < img_in->current_available_rows; y++) 1524 + { 1525 + if (img_in->sample_format == GGRAPH_SAMPLE_FLOAT) 1526 + { 1527 + if (img_in->bits_per_sample == 32) 1528 + { 1529 + p_float = (float *) (img_in->pixels); 1530 + p_float += y * img_in->width; 1531 + } 1532 + else 1533 + { 1534 + p_double = (double *) (img_in->pixels); 1535 + p_double += y * img_in->width; 1536 + } 1537 + } 1538 + if (img_in->sample_format == GGRAPH_SAMPLE_INT) 1539 + { 1540 + if (img_in->bits_per_sample == 32) 1541 + { 1542 + p_int32 = (int *) (img_in->pixels); 1543 + p_int32 += y * img_in->width; 1544 + } 1545 + else 1546 + { 1547 + p_int16 = (short *) (img_in->pixels); 1548 + p_int16 += y * img_in->width; 1549 + } 1550 + } 1551 + if (img_in->sample_format == GGRAPH_SAMPLE_UINT) 1552 + { 1553 + if (img_in->bits_per_sample == 32) 1554 + { 1555 + p_uint32 = (unsigned int *) (img_in->pixels); 1556 + p_uint32 += y * img_in->width; 1557 + } 1558 + else 1559 + { 1560 + p_uint16 = (unsigned short *) (img_in->pixels); 1561 + p_uint16 += y * img_in->width; 1562 + } 1563 + } 1564 + for (x = 0; x < img_in->width; x++) 1565 + { 1566 + if (img_in->sample_format == GGRAPH_SAMPLE_FLOAT) 1567 + { 1568 + if (img_in->bits_per_sample == 32) 1569 + value = *p_float++; 1570 + else 1571 + value = *p_double++; 1572 + } 1573 + if (img_in->sample_format == GGRAPH_SAMPLE_INT) 1574 + { 1575 + if (img_in->bits_per_sample == 32) 1576 + value = *p_int32++; 1577 + else 1578 + value = *p_int16++; 1579 + } 1580 + if (img_in->sample_format == GGRAPH_SAMPLE_UINT) 1581 + { 1582 + if (img_in->bits_per_sample == 32) 1583 + value = *p_uint32++; 1584 + else 1585 + value = *p_uint16++; 1586 + } 1587 + if (value != no_data_value) 1588 + { 1589 + if (value < min) 1590 + min = value; 1591 + if (value > max) 1592 + max = value; 1593 + } 1594 + } 1595 + } 1596 + } 1597 + img_in->next_row = save_row; 1598 + *min_value = min; 1599 + *max_value = max; 1600 + return GGRAPH_OK; 1601 + 1602 + error: 1603 + img_in->next_row = save_row; 1604 + return GGRAPH_ERROR; 1605 +} 1606 + 1607 +GGRAPH_PRIVATE gGraphShadedReliefTripleRowPtr 1608 +gg_shaded_relief_triple_row_create (void) 1609 +{ 1610 +/* allocating an empty Shaded Relief Triple Row object */ 1611 + gGraphShadedReliefTripleRowPtr ptr = 1612 + malloc (sizeof (gGraphShadedReliefTripleRow)); 1613 + if (!ptr) 1614 + return NULL; 1615 + ptr->signature = GG_SHADED_RELIEF_3ROWS_MAGIC_SIGNATURE; 1616 + ptr->width = -1; 1617 + ptr->in_row1 = NULL; 1618 + ptr->in_row2 = NULL; 1619 + ptr->in_row3 = NULL; 1620 + ptr->current_row = NULL; 1621 + ptr->out_rgb = NULL; 1622 + ptr->color_map = NULL; 1623 + ptr->mono_red = 0; 1624 + ptr->mono_green = 0; 1625 + ptr->mono_blue = 0; 1626 + ptr->z_factor = DBL_MAX; 1627 + ptr->scale_factor = DBL_MAX; 1628 + ptr->azimuth = DBL_MAX; 1629 + ptr->altitude = DBL_MAX; 1630 + ptr->no_data_value = DBL_MAX; 1631 + ptr->no_red = 0; 1632 + ptr->no_green = 0; 1633 + ptr->no_blue = 0; 1634 + return ptr; 1635 +} 1636 + 1637 +GGRAPH_PRIVATE void 1638 +gg_shaded_relief_triple_row_destroy (gGraphShadedReliefTripleRowPtr ptr) 1639 +{ 1640 +/* destroying a Shaded Relief Triple Row object */ 1641 + if (!ptr) 1642 + return; 1643 + if (ptr->in_row1) 1644 + free (ptr->in_row1); 1645 + if (ptr->in_row2) 1646 + free (ptr->in_row2); 1647 + if (ptr->in_row3) 1648 + free (ptr->in_row3); 1649 + if (ptr->out_rgb) 1650 + free (ptr->out_rgb); 1651 + free (ptr); 1652 +} 1653 + 1654 +GGRAPH_DECLARE int 1655 +gGraphCreateShadedReliefTripleRow (int width, unsigned char background_red, 1656 + unsigned char background_green, 1657 + unsigned char background_blue, 1658 + double no_data, const void *color_map_handle, 1659 + unsigned char mono_red, 1660 + unsigned char mono_green, 1661 + unsigned char mono_blue, double z_factor, 1662 + double scale_factor, double azimuth, 1663 + double altitude, 1664 + const void **triple_row_handle) 1665 +{ 1666 +/* creating a Shaded Relief Triple Row object */ 1667 + gGraphColorMapPtr map = (gGraphColorMapPtr) color_map_handle; 1668 + gGraphShadedReliefTripleRowPtr triple_row = 1669 + gg_shaded_relief_triple_row_create (); 1670 + *triple_row_handle = NULL; 1671 + if (!triple_row) 1672 + return GGRAPH_INSUFFICIENT_MEMORY; 1673 + 1674 + if (map != NULL) 1675 + { 1676 + if (map->signature != GG_COLOR_MAP_MAGIC_SIGNATURE) 1677 + { 1678 + gg_shaded_relief_triple_row_destroy (triple_row); 1679 + return GGRAPH_INVALID_COLOR_MAP; 1680 + } 1681 + } 1682 + 1683 +/* allocating the INPUT triple row buffer */ 1684 + triple_row->in_row1 = malloc (sizeof (float) * width); 1685 + if (triple_row->in_row1 == NULL) 1686 + goto error; 1687 + triple_row->in_row2 = malloc (sizeof (float) * width); 1688 + if (triple_row->in_row2 == NULL) 1689 + goto error; 1690 + triple_row->in_row3 = malloc (sizeof (float) * width); 1691 + if (triple_row->in_row3 == NULL) 1692 + goto error; 1693 +/* allocating the OUTPUT RGB buffer */ 1694 + triple_row->out_rgb = malloc (3 * (width - 2)); 1695 + if (triple_row->out_rgb == NULL) 1696 + goto error; 1697 + 1698 + triple_row->width = width; 1699 + triple_row->color_map = map; 1700 + triple_row->no_red = background_red; 1701 + triple_row->no_green = background_green; 1702 + triple_row->no_blue = background_blue; 1703 + triple_row->mono_red = mono_red; 1704 + triple_row->mono_green = mono_green; 1705 + triple_row->mono_blue = mono_blue; 1706 + triple_row->z_factor = z_factor; 1707 + triple_row->scale_factor = scale_factor; 1708 + triple_row->azimuth = azimuth; 1709 + triple_row->altitude = altitude; 1710 + triple_row->no_data_value = no_data; 1711 + *triple_row_handle = triple_row; 1712 + return GGRAPH_OK; 1713 + 1714 + error: 1715 + gg_shaded_relief_triple_row_destroy (triple_row); 1716 + return GGRAPH_INSUFFICIENT_MEMORY; 1717 +} 1718 + 1719 +GGRAPH_DECLARE void 1720 +gGraphDestroyShadedReliefTripleRow (const void *ptr) 1721 +{ 1722 +/* destroyng a Shaded Relief Triple Row object */ 1723 + gGraphShadedReliefTripleRowPtr triple_row = 1724 + (gGraphShadedReliefTripleRowPtr) ptr; 1725 + 1726 + if (triple_row == NULL) 1727 + return; 1728 + if (triple_row->signature == GG_SHADED_RELIEF_3ROWS_MAGIC_SIGNATURE) 1729 + gg_shaded_relief_triple_row_destroy (triple_row); 1730 +} 1731 + 1732 +static void 1733 +shaded_relief_triple_rotate (gGraphShadedReliefTripleRowPtr p) 1734 +{ 1735 +/* rotating the Shaded Relief Triple Row scanlines */ 1736 + int x; 1737 + float *p_out; 1738 + if (p->current_row == NULL) 1739 + { 1740 + p->current_row = p->in_row1; 1741 + goto no_data_fill; 1742 + } 1743 + if (p->current_row == p->in_row1) 1744 + { 1745 + p->current_row = p->in_row2; 1746 + goto no_data_fill; 1747 + } 1748 + if (p->current_row == p->in_row2) 1749 + { 1750 + p->current_row = p->in_row3; 1751 + goto no_data_fill; 1752 + } 1753 + p->current_row = p->in_row1; 1754 + p->in_row1 = p->in_row2; 1755 + p->in_row2 = p->in_row3; 1756 + p->in_row3 = p->current_row; 1757 + no_data_fill: 1758 + p_out = p->current_row; 1759 + for (x = 0; x < p->width; x++) 1760 + *p_out++ = p->no_data_value; 1761 +} 1762 + 1763 +GGRAPH_DECLARE int 1764 +gGraphStripImageGetShadedReliefScanline (const void *in_img_handle, 1765 + int row_index, 1766 + const void *triple_row_handle) 1767 +{ 1768 +/* inserting a new scanline into the Shaded Relief Triple Row object */ 1769 + int x; 1770 + short *p_int16; 1771 + unsigned short *p_uint16; 1772 + int *p_int32; 1773 + unsigned int *p_uint32; 1774 + float *p_float; 1775 + double *p_double; 1776 + float pixel; 1777 + float *p_out; 1778 + gGraphShadedReliefTripleRowPtr triple_row = 1779 + (gGraphShadedReliefTripleRowPtr) triple_row_handle; 1780 + gGraphStripImagePtr img = (gGraphStripImagePtr) in_img_handle; 1781 + 1782 + if (triple_row == NULL) 1783 + return GGRAPH_INVALID_SHADED_RELIEF_3ROWS; 1784 + if (triple_row->signature != GG_SHADED_RELIEF_3ROWS_MAGIC_SIGNATURE) 1785 + return GGRAPH_INVALID_SHADED_RELIEF_3ROWS; 1786 + if (img == NULL) 1787 + return GGRAPH_INVALID_IMAGE; 1788 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 1789 + return GGRAPH_INVALID_IMAGE; 1790 + if (img->pixel_format != GG_PIXEL_GRID) 1791 + return GGRAPH_INVALID_IMAGE; 1792 + if (img->width != triple_row->width) 1793 + return GGRAPH_INVALID_IMAGE; 1794 + if (row_index >= 0 && row_index < img->rows_per_block) 1795 + ; 1796 + else 1797 + return GGRAPH_ERROR; 1798 + 1799 + shaded_relief_triple_rotate (triple_row); 1800 + 1801 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT) 1802 + { 1803 + if (img->bits_per_sample == 32) 1804 + { 1805 + p_float = (float *) (img->pixels); 1806 + p_float += row_index * img->width; 1807 + } 1808 + else 1809 + { 1810 + p_double = (double *) (img->pixels); 1811 + p_double += row_index * img->width; 1812 + } 1813 + } 1814 + if (img->sample_format == GGRAPH_SAMPLE_INT) 1815 + { 1816 + if (img->bits_per_sample == 32) 1817 + { 1818 + p_int32 = (int *) (img->pixels); 1819 + p_int32 += row_index * img->width; 1820 + } 1821 + else 1822 + { 1823 + p_int16 = (short *) (img->pixels); 1824 + p_int16 += row_index * img->width; 1825 + } 1826 + } 1827 + if (img->sample_format == GGRAPH_SAMPLE_UINT) 1828 + { 1829 + if (img->bits_per_sample == 32) 1830 + { 1831 + p_uint32 = (unsigned int *) (img->pixels); 1832 + p_uint32 += row_index * img->width; 1833 + } 1834 + else 1835 + { 1836 + p_uint16 = (unsigned short *) (img->pixels); 1837 + p_uint16 += row_index * img->width; 1838 + } 1839 + } 1840 + p_out = triple_row->current_row; 1841 + for (x = 0; x < img->width; x++) 1842 + { 1843 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT) 1844 + { 1845 + if (img->bits_per_sample == 32) 1846 + pixel = *p_float++; 1847 + else 1848 + pixel = *p_double++; 1849 + } 1850 + if (img->sample_format == GGRAPH_SAMPLE_INT) 1851 + { 1852 + if (img->bits_per_sample == 32) 1853 + pixel = *p_int32++; 1854 + else 1855 + pixel = *p_int16++; 1856 + } 1857 + if (img->sample_format == GGRAPH_SAMPLE_UINT) 1858 + { 1859 + if (img->bits_per_sample == 32) 1860 + pixel = *p_uint32++; 1861 + else 1862 + pixel = *p_uint16++; 1863 + } 1864 + *p_out++ = pixel; 1865 + } 1866 + return GGRAPH_OK; 1867 +} 1868 + 1869 +GGRAPH_DECLARE int 1870 +gGraphStripImageSetShadedReliefScanline (const void *triple_row_handle, 1871 + const void *out_img_handle, 1872 + int row_index) 1873 +{ 1874 +/* copying out a Shaded Relief processed scanline */ 1875 + int x; 1876 + unsigned char *p_in; 1877 + unsigned char *p_out; 1878 + gGraphShadedReliefTripleRowPtr triple_row = 1879 + (gGraphShadedReliefTripleRowPtr) triple_row_handle; 1880 + gGraphStripImagePtr img = (gGraphStripImagePtr) out_img_handle; 1881 + 1882 + if (triple_row == NULL) 1883 + return GGRAPH_INVALID_SHADED_RELIEF_3ROWS; 1884 + if (triple_row->signature != GG_SHADED_RELIEF_3ROWS_MAGIC_SIGNATURE) 1885 + return GGRAPH_INVALID_SHADED_RELIEF_3ROWS; 1886 + if (img == NULL) 1887 + return GGRAPH_INVALID_IMAGE; 1888 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 1889 + return GGRAPH_INVALID_IMAGE; 1890 + if (img->pixel_format != GG_PIXEL_RGB) 1891 + return GGRAPH_INVALID_IMAGE; 1892 + if (img->width != triple_row->width - 2) 1893 + return GGRAPH_INVALID_IMAGE; 1894 + if (row_index >= 0 && row_index < img->rows_per_block) 1895 + ; 1896 + else 1897 + return GGRAPH_ERROR; 1898 + 1899 + p_in = triple_row->out_rgb; 1900 + p_out = img->pixels + (row_index * img->scanline_width); 1901 + for (x = 0; x < img->width; x++) 1902 + { 1903 + *p_out++ = *p_in++; /* RED */ 1904 + *p_out++ = *p_in++; /* GREEN */ 1905 + *p_out++ = *p_in++; /* BLUE */ 1906 + } 1907 + img->current_available_rows = row_index + 1; 1908 + return GGRAPH_OK; 1909 +} 1910 + 1911 +static void 1912 +do_shaded_relief_render (struct thread_shaded_relief_render *params) 1913 +{ 1914 +/* performing actual rendering (1 single pixel) */ 1915 + int j; 1916 + int n; 1917 + double x; 1918 + double y; 1919 + double aspect; 1920 + double slope; 1921 + double cang; 1922 + int gray; 1923 + float afWin[9]; 1924 + double red; 1925 + double green; 1926 + double blue; 1927 + double alpha; 1928 + int bContainsNull; 1929 + unsigned char *p_out; 1930 + unsigned char r; 1931 + unsigned char g; 1932 + unsigned char b; 1933 + gGraphShadedReliefTripleRowPtr triple_row; 1934 + 1935 + p_out = params->p_rgb + (params->base * 3); 1936 + triple_row = params->triple_row; 1937 + 1938 +/* 1939 +* Shaded Relief rendering 1940 +* 1941 +***************************************************************** 1942 +* 1943 +* DISCLAIMER: the following code is largely based upon Even Rouault's 1944 +* gdaldem.c 1945 +* wich was originally released on public domain for GRASS, and is 1946 +* now included into GDAL (X/MIT license) 1947 +* 1948 +*/ 1949 + 1950 + 1951 +/* 1952 +/ Move a 3x3 pafWindow over each cell 1953 +/ (where the cell in question is #4) 1954 +/ 1955 +/ 0 1 2 1956 +/ 3 4 5 1957 +/ 6 7 8 1958 +*/ 1959 + for (j = 0; j < params->num_pixels; j++) 1960 + { 1961 + /* Exclude the edges */ 1962 + int k = j + params->base; 1963 + if (j == 0 || j == params->num_pixels - 1) 1964 + continue; 1965 + 1966 + afWin[0] = triple_row->in_row1[k - 1]; 1967 + afWin[1] = triple_row->in_row1[k]; 1968 + afWin[2] = triple_row->in_row1[k + 1]; 1969 + afWin[3] = triple_row->in_row2[k - 1]; 1970 + afWin[4] = triple_row->in_row2[k]; 1971 + afWin[5] = triple_row->in_row2[k + 1]; 1972 + afWin[6] = triple_row->in_row3[k - 1]; 1973 + afWin[7] = triple_row->in_row3[k]; 1974 + afWin[8] = triple_row->in_row3[k + 1]; 1975 + 1976 + bContainsNull = 0; 1977 + for (n = 0; n <= 8; n++) 1978 + { 1979 + if (afWin[n] == triple_row->no_data_value) 1980 + { 1981 + bContainsNull = 1; 1982 + break; 1983 + } 1984 + } 1985 + 1986 + if (bContainsNull) 1987 + { 1988 + /* We have nulls so write nullValue and move on */ 1989 + r = triple_row->no_red; 1990 + g = triple_row->no_green; 1991 + b = triple_row->no_blue; 1992 + } 1993 + else 1994 + { 1995 + /* We have a valid 3x3 window. */ 1996 + 1997 + /* --------------------------------------- 1998 + * Compute Hillshade 1999 + */ 2000 + 2001 + /* First Slope ... */ 2002 + x = triple_row->z_factor * 2003 + ((afWin[0] + afWin[3] + afWin[3] + afWin[6]) - 2004 + (afWin[2] + afWin[5] + afWin[5] + 2005 + afWin[8])) / (8.0 * triple_row->scale_factor); 2006 + 2007 + y = triple_row->z_factor * 2008 + ((afWin[6] + afWin[7] + afWin[7] + afWin[8]) - 2009 + (afWin[0] + afWin[1] + afWin[1] + 2010 + afWin[2])) / (8.0 * triple_row->scale_factor); 2011 + 2012 + slope = M_PI / 2 - atan (sqrt (x * x + y * y)); 2013 + 2014 + /* ... then aspect... */ 2015 + aspect = atan2 (x, y); 2016 + 2017 + /* ... then the shade value */ 2018 + cang = sin (params->altRadians) * sin (slope) + 2019 + cos (params->altRadians) * cos (slope) * 2020 + cos (params->azRadians - M_PI / 2 - aspect); 2021 + 2022 + if (cang <= 0.0) 2023 + cang = 1.0; 2024 + else 2025 + cang = 1.0 + (254.0 * cang); 2026 + 2027 + if (triple_row->color_map != NULL) 2028 + { 2029 + /* Color + Shaded Relief rendering */ 2030 + match_color (triple_row->color_map, afWin[4], 2031 + triple_row->no_data_value, &r, &g, &b); 2032 + alpha = cang / 255.0; 2033 + red = (double) r *alpha; 2034 + green = (double) g *alpha; 2035 + blue = (double) b *alpha; 2036 + if (red < 0.0) 2037 + red = 0.0; 2038 + if (green < 0.0) 2039 + green = 0.0; 2040 + if (blue < 0.0) 2041 + blue = 0.0; 2042 + if (red > 255.0) 2043 + red = 255.0; 2044 + if (green > 255.0) 2045 + green = 255.0; 2046 + if (blue > 255.0) 2047 + blue = 255.0; 2048 + r = (unsigned char) red; 2049 + g = (unsigned char) green; 2050 + b = (unsigned) blue; 2051 + } 2052 + else 2053 + { 2054 + if ((triple_row->mono_red == 0 2055 + && triple_row->mono_green == 0 2056 + && triple_row->mono_blue == 0) 2057 + || (triple_row->mono_red == 255 2058 + && triple_row->mono_green == 255 2059 + && triple_row->mono_blue == 255)) 2060 + { 2061 + /* plain gray-scale */ 2062 + gray = (int) cang; 2063 + r = (unsigned char) gray; 2064 + g = (unsigned char) gray; 2065 + b = (unsigned) gray; 2066 + } 2067 + else 2068 + { 2069 + /* using the monochrome base color + ALPHA */ 2070 + alpha = cang / 255.0; 2071 + red = (double) (triple_row->mono_red) * alpha; 2072 + green = (double) (triple_row->mono_green) * alpha; 2073 + blue = (double) (triple_row->mono_blue) * alpha; 2074 + if (red < 0.0) 2075 + red = 0.0; 2076 + if (green < 0.0) 2077 + green = 0.0; 2078 + if (blue < 0.0) 2079 + blue = 0.0; 2080 + if (red > 255.0) 2081 + red = 255.0; 2082 + if (green > 255.0) 2083 + green = 255.0; 2084 + if (blue > 255.0) 2085 + blue = 255.0; 2086 + r = (unsigned char) red; 2087 + g = (unsigned char) green; 2088 + b = (unsigned) blue; 2089 + } 2090 + } 2091 + } 2092 + *p_out++ = r; 2093 + *p_out++ = g; 2094 + *p_out++ = b; 2095 + } 2096 +} 2097 + 2098 +#ifdef _WIN32 2099 +static DWORD WINAPI 2100 +#else 2101 +static void * 2102 +#endif 2103 +shaded_relief_render (void *arg) 2104 +{ 2105 +/* threaded function: rendering a Shaded Relief pixel */ 2106 + struct thread_shaded_relief_render *params = 2107 + (struct thread_shaded_relief_render *) arg; 2108 + do_shaded_relief_render (params); 2109 +#ifdef _WIN32 2110 + return 0; 2111 +#else 2112 + pthread_exit (NULL); 2113 +#endif 2114 +} 2115 + 2116 +GGRAPH_DECLARE int 2117 +gGraphShadedReliefRenderPixels (const void *triple_row_handle, int num_threads, 2118 + int *out_row_ready) 2119 +{ 2120 +/* rendering a Shaded Relief scanline */ 2121 + double degreesToRadians; 2122 + unsigned char *p_out; 2123 + int nt; 2124 + struct thread_shaded_relief_render threads[GG_MAX_THREADS]; 2125 +#ifdef _WIN32 2126 + HANDLE thread_handles[GG_MAX_THREADS]; 2127 + DWORD dwThreadIdArray[GG_MAX_THREADS]; 2128 +#else 2129 + pthread_t thread_ids[GG_MAX_THREADS]; 2130 +#endif 2131 + gGraphShadedReliefTripleRowPtr triple_row = 2132 + (gGraphShadedReliefTripleRowPtr) triple_row_handle; 2133 + 2134 + if (triple_row == NULL) 2135 + return GGRAPH_INVALID_SHADED_RELIEF_3ROWS; 2136 + if (triple_row->signature != GG_SHADED_RELIEF_3ROWS_MAGIC_SIGNATURE) 2137 + return GGRAPH_INVALID_SHADED_RELIEF_3ROWS; 2138 + 2139 + if (triple_row->current_row != triple_row->in_row3) 2140 + { 2141 + /* not yet ready ( < 3 rows into the buffer) */ 2142 + *out_row_ready = GGRAPH_FALSE; 2143 + return GGRAPH_OK; 2144 + } 2145 + 2146 + if (num_threads > GG_MAX_THREADS) 2147 + num_threads = GG_MAX_THREADS; 2148 + if (num_threads < 1) 2149 + num_threads = 1; 2150 + degreesToRadians = M_PI / 180.0; 2151 + 2152 + p_out = triple_row->out_rgb; 2153 + if (num_threads < 2) 2154 + { 2155 + /* not using multithreading */ 2156 + threads[0].triple_row = triple_row; 2157 + threads[0].altRadians = triple_row->altitude * degreesToRadians; 2158 + threads[0].azRadians = triple_row->azimuth * degreesToRadians; 2159 + threads[0].base = 0; 2160 + threads[0].num_pixels = triple_row->width; 2161 + threads[0].p_rgb = p_out; 2162 + do_shaded_relief_render (&(threads[0])); 2163 + } 2164 + else 2165 + { 2166 + /* using concurrent threads */ 2167 + int base = 0; 2168 + int pixels_per_thread = triple_row->width / num_threads; 2169 + if ((pixels_per_thread * num_threads) < triple_row->width) 2170 + pixels_per_thread++; 2171 + for (nt = 0; nt < num_threads; nt++) 2172 + { 2173 + int num_pixels; 2174 + threads[nt].triple_row = triple_row; 2175 + threads[nt].altRadians = 2176 + triple_row->altitude * degreesToRadians; 2177 + threads[nt].azRadians = triple_row->azimuth * degreesToRadians; 2178 + if (nt == 0) 2179 + threads[nt].base = base; 2180 + else 2181 + threads[nt].base = base - 1; 2182 + num_pixels = pixels_per_thread + 1; 2183 + if (base + pixels_per_thread > triple_row->width) 2184 + num_pixels = triple_row->width - base; 2185 + threads[nt].num_pixels = num_pixels; 2186 + threads[nt].p_rgb = p_out; 2187 + base += pixels_per_thread; 2188 + if (num_pixels > 0) 2189 + { 2190 +#ifdef _WIN32 2191 + thread_handles[nt] = 2192 + CreateThread (NULL, 0, shaded_relief_render, 2193 + &(threads[nt]), 0, 2194 + &dwThreadIdArray[nt]); 2195 +#else 2196 + pthread_create (&(thread_ids[nt]), NULL, 2197 + shaded_relief_render, &(threads[nt])); 2198 +#endif 2199 + } 2200 + } 2201 + /* waiting until any concurrent thread terminates */ 2202 +#ifdef _WIN32 2203 + WaitForMultipleObjects (num_threads, thread_handles, TRUE, INFINITE); 2204 +#else 2205 + for (nt = 0; nt < num_threads; nt++) 2206 + pthread_join (thread_ids[nt], NULL); 2207 +#endif 2208 + } 2209 + 2210 + *out_row_ready = GGRAPH_TRUE; 2211 + return GGRAPH_OK; 2212 +} 2213 + 2214 +static void 2215 +landsat_recalibrate (struct thread_landsat_recalibrate *p) 2216 +{ 2217 +/* recalibrating color */ 2218 + double lmin; 2219 + double lmax; 2220 + double qcalmin; 2221 + double qcalmax; 2222 + double radiance; 2223 + double albedo; 2224 + double spectral_irradiance; 2225 + double rads; 2226 + double recalibrate; 2227 + double recalibrate_min; 2228 + double recalibrate_max; 2229 + double gain; 2230 + double sample = p->value; 2231 + 2232 + switch (p->band) 2233 + { 2234 + case LANDSAT_RED: 2235 + lmin = p->lmin_red; 2236 + lmax = p->lmax_red; 2237 + qcalmin = p->qcalmin_red; 2238 + qcalmax = p->qcalmax_red; 2239 + spectral_irradiance = p->spectral_irradiance_red; 2240 + if (p->gain_low_red) 2241 + gain = p->low_gain_factor_red; 2242 + else 2243 + gain = p->high_gain_factor_red; 2244 + recalibrate_min = p->recalibration_min_red; 2245 + recalibrate_max = p->recalibration_max_red; 2246 + break; 2247 + case LANDSAT_GREEN: 2248 + lmin = p->lmin_green; 2249 + lmax = p->lmax_green; 2250 + qcalmin = p->qcalmin_green; 2251 + qcalmax = p->qcalmax_green; 2252 + spectral_irradiance = p->spectral_irradiance_green; 2253 + if (p->gain_low_green) 2254 + gain = p->low_gain_factor_green; 2255 + else 2256 + gain = p->high_gain_factor_green; 2257 + recalibrate_min = p->recalibration_min_green; 2258 + recalibrate_max = p->recalibration_max_green; 2259 + break; 2260 + case LANDSAT_BLUE: 2261 + lmin = p->lmin_blue; 2262 + lmax = p->lmax_blue; 2263 + qcalmin = p->qcalmin_blue; 2264 + qcalmax = p->qcalmax_blue; 2265 + spectral_irradiance = p->spectral_irradiance_blue; 2266 + if (p->gain_low_blue) 2267 + gain = p->low_gain_factor_blue; 2268 + else 2269 + gain = p->high_gain_factor_blue; 2270 + recalibrate_min = p->recalibration_min_blue; 2271 + recalibrate_max = p->recalibration_max_blue; 2272 + break; 2273 + case LANDSAT_PANCHRO: 2274 + lmin = p->lmin_panchro; 2275 + lmax = p->lmax_panchro; 2276 + qcalmin = p->qcalmin_panchro; 2277 + qcalmax = p->qcalmax_panchro; 2278 + spectral_irradiance = p->spectral_irradiance_panchro; 2279 + if (p->gain_low_panchro) 2280 + gain = p->low_gain_factor_panchro; 2281 + else 2282 + gain = p->high_gain_factor_panchro; 2283 + recalibrate_min = p->recalibration_min_panchro; 2284 + recalibrate_max = p->recalibration_max_panchro; 2285 + }; 2286 + 2287 +/* converting Solar Zenith angle into Radians */ 2288 + rads = (90.0 - p->sun_elevation) * (M_PI / 180.0); 2289 +/* computing RADIANCE value */ 2290 + radiance = 2291 + ((lmax - lmin) / (qcalmax - qcalmin)) * (sample - qcalmin) + lmin; 2292 +/* computing REFLECTANCE aka ALBEDO value */ 2293 + albedo = M_PI * radiance * (p->sun_distance * p->sun_distance); 2294 + albedo /= spectral_irradiance * cos (rads); 2295 +/* normalizing range [1-255] */ 2296 + sample = (qcalmax - qcalmin) * albedo * gain; 2297 +/* recalibrating (discarding both range extremities) */ 2298 + recalibrate = 2299 + ((sample - recalibrate_min) * (qcalmax - qcalmin)) / (recalibrate_max - 2300 + recalibrate_min); 2301 + sample = recalibrate; 2302 + if (sample > qcalmax) 2303 + sample = qcalmax; 2304 + if (sample < qcalmin) 2305 + sample = qcalmin; 2306 + p->value = (unsigned char) sample; 2307 +} 2308 + 2309 +static void 2310 +landsat_rgb (struct thread_landsat_recalibrate *ptr) 2311 +{ 2312 +/* precessing an RGB Landsat sub-strip */ 2313 + int x; 2314 + int y; 2315 + unsigned char red; 2316 + unsigned char green; 2317 + unsigned char blue; 2318 + unsigned char *p_red; 2319 + unsigned char *p_green; 2320 + unsigned char *p_blue; 2321 + unsigned char *p_rgb; 2322 + struct thread_landsat_recalibrate p; 2323 + 2324 +/* setting up the recalibrate struct */ 2325 + p.lmin_red = ptr->lmin_red; 2326 + p.lmax_red = ptr->lmax_red; 2327 + p.qcalmin_red = ptr->qcalmin_red; 2328 + p.qcalmax_red = ptr->qcalmax_red; 2329 + p.gain_low_red = ptr->gain_low_red; 2330 + p.spectral_irradiance_red = ptr->spectral_irradiance_red; 2331 + p.low_gain_factor_red = ptr->low_gain_factor_red; 2332 + p.high_gain_factor_red = ptr->high_gain_factor_red; 2333 + p.recalibration_min_red = ptr->recalibration_min_red; 2334 + p.recalibration_max_red = ptr->recalibration_max_red; 2335 + p.lmin_green = ptr->lmin_green; 2336 + p.lmax_green = ptr->lmax_green; 2337 + p.qcalmin_green = ptr->qcalmin_green; 2338 + p.qcalmax_green = ptr->qcalmax_green; 2339 + p.gain_low_green = ptr->gain_low_green; 2340 + p.spectral_irradiance_green = ptr->spectral_irradiance_green; 2341 + p.low_gain_factor_green = ptr->low_gain_factor_green; 2342 + p.high_gain_factor_green = ptr->high_gain_factor_green; 2343 + p.recalibration_min_green = ptr->recalibration_min_green; 2344 + p.recalibration_max_green = ptr->recalibration_max_green; 2345 + p.lmin_blue = ptr->lmin_blue; 2346 + p.lmax_blue = ptr->lmax_blue; 2347 + p.qcalmin_blue = ptr->qcalmin_blue; 2348 + p.qcalmax_blue = ptr->qcalmax_blue; 2349 + p.gain_low_blue = ptr->gain_low_blue; 2350 + p.spectral_irradiance_blue = ptr->spectral_irradiance_blue; 2351 + p.low_gain_factor_blue = ptr->low_gain_factor_blue; 2352 + p.high_gain_factor_blue = ptr->high_gain_factor_blue; 2353 + p.recalibration_min_blue = ptr->recalibration_min_blue; 2354 + p.recalibration_max_blue = ptr->recalibration_max_blue; 2355 + p.sun_distance = ptr->sun_distance; 2356 + p.sun_elevation = ptr->sun_elevation; 2357 + 2358 + for (y = ptr->min_row; y < ptr->max_row; y++) 2359 + { 2360 + p_red = ptr->img_red->pixels + (y * ptr->img_red->scanline_width); 2361 + p_green = 2362 + ptr->img_green->pixels + (y * ptr->img_green->scanline_width); 2363 + p_blue = ptr->img_blue->pixels + (y * ptr->img_blue->scanline_width); 2364 + p_rgb = ptr->img_out->pixels + (y * ptr->img_out->scanline_width); 2365 + for (x = 0; x < ptr->width; x++) 2366 + { 2367 + red = *p_red++; 2368 + green = *p_green++; 2369 + blue = *p_blue++; 2370 + if (red == 0 || green == 0 || blue == 0) 2371 + { 2372 + red = 0; 2373 + green = 0; 2374 + blue = 0; 2375 + } 2376 + else 2377 + { 2378 + p.value = red; 2379 + p.band = LANDSAT_RED; 2380 + landsat_recalibrate (&p); 2381 + red = p.value; 2382 + p.value = green; 2383 + p.band = LANDSAT_GREEN; 2384 + landsat_recalibrate (&p); 2385 + green = p.value; 2386 + p.value = blue; 2387 + p.band = LANDSAT_BLUE; 2388 + landsat_recalibrate (&p); 2389 + blue = p.value; 2390 + } 2391 + *p_rgb++ = red; 2392 + *p_rgb++ = green; 2393 + *p_rgb++ = blue; 2394 + } 2395 + } 2396 +} 2397 + 2398 +#ifdef _WIN32 2399 +static DWORD WINAPI 2400 +#else 2401 +static void * 2402 +#endif 2403 +landsat_rgb_recalibrate (void *arg) 2404 +{ 2405 +/* threaded function: rendering an RGB Landsat sub-strip */ 2406 + struct thread_landsat_recalibrate *params = 2407 + (struct thread_landsat_recalibrate *) arg; 2408 + landsat_rgb (params); 2409 +#ifdef _WIN32 2410 + return 0; 2411 +#else 2412 + pthread_exit (NULL); 2413 +#endif 2414 +} 2415 + 2416 +GGRAPH_DECLARE int 2417 +gGraphLandsatRGB (const void *red_ptr, const void *green_ptr, 2418 + const void *blue_ptr, const void *rgb_ptr, int width, 2419 + int num_rows, gGraphLandsatRecalibrationPtr params, 2420 + int num_threads) 2421 +{ 2422 +/* processing a whole RGB Landsat strip (may be, in a multithreaded way) */ 2423 + 2424 + gGraphStripImagePtr img_red = (gGraphStripImagePtr) red_ptr; 2425 + gGraphStripImagePtr img_green = (gGraphStripImagePtr) green_ptr; 2426 + gGraphStripImagePtr img_blue = (gGraphStripImagePtr) blue_ptr; 2427 + gGraphStripImagePtr img_rgb = (gGraphStripImagePtr) rgb_ptr; 2428 + int nt; 2429 + struct thread_landsat_recalibrate threads[GG_MAX_THREADS]; 2430 +#ifdef _WIN32 2431 + HANDLE thread_handles[GG_MAX_THREADS]; 2432 + DWORD dwThreadIdArray[GG_MAX_THREADS]; 2433 +#else 2434 + pthread_t thread_ids[GG_MAX_THREADS]; 2435 +#endif 2436 + 2437 + if (img_red == NULL || img_green == NULL || img_blue == NULL 2438 + || img_rgb == NULL) 2439 + return GGRAPH_INVALID_IMAGE; 2440 + if (img_red->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2441 + return GGRAPH_INVALID_IMAGE; 2442 + if (img_green->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2443 + return GGRAPH_INVALID_IMAGE; 2444 + if (img_blue->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2445 + return GGRAPH_INVALID_IMAGE; 2446 + if (img_rgb->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2447 + return GGRAPH_INVALID_IMAGE; 2448 + if (img_red->pixel_format == GG_PIXEL_GRAYSCALE 2449 + && img_green->pixel_format == GG_PIXEL_GRAYSCALE 2450 + && img_blue->pixel_format == GG_PIXEL_GRAYSCALE 2451 + && img_rgb->pixel_format == GG_PIXEL_RGB) 2452 + ; 2453 + else 2454 + return GGRAPH_INVALID_IMAGE; 2455 + if (img_red->width == width && img_green->width == width 2456 + && img_blue->width == width && img_rgb->width == width) 2457 + ; 2458 + else 2459 + return GGRAPH_INVALID_IMAGE; 2460 + if (img_red->current_available_rows == num_rows 2461 + && img_green->current_available_rows == num_rows 2462 + && img_blue->current_available_rows == num_rows 2463 + && img_rgb->rows_per_block >= num_rows) 2464 + ; 2465 + else 2466 + return GGRAPH_INVALID_IMAGE; 2467 + 2468 + if (num_threads > GG_MAX_THREADS) 2469 + num_threads = GG_MAX_THREADS; 2470 + if (num_threads < 1) 2471 + num_threads = 1; 2472 + 2473 + for (nt = 0; nt < num_threads; nt++) 2474 + { 2475 + /* setting up the recalibrate struct */ 2476 + threads[nt].img_red = img_red; 2477 + threads[nt].img_green = img_green; 2478 + threads[nt].img_blue = img_blue; 2479 + threads[nt].img_out = img_rgb; 2480 + threads[nt].width = width; 2481 + threads[nt].lmin_red = params->lmin_red; 2482 + threads[nt].lmax_red = params->lmax_red; 2483 + threads[nt].qcalmin_red = params->qcalmin_red; 2484 + threads[nt].qcalmax_red = params->qcalmax_red; 2485 + threads[nt].gain_low_red = params->is_gain_low_red; 2486 + threads[nt].spectral_irradiance_red = params->spectral_irradiance_red; 2487 + threads[nt].low_gain_factor_red = params->low_gain_factor_red; 2488 + threads[nt].high_gain_factor_red = params->high_gain_factor_red; 2489 + threads[nt].recalibration_min_red = params->recalibration_min_red; 2490 + threads[nt].recalibration_max_red = params->recalibration_max_red; 2491 + threads[nt].lmin_green = params->lmin_green; 2492 + threads[nt].lmax_green = params->lmax_green; 2493 + threads[nt].qcalmin_green = params->qcalmin_green; 2494 + threads[nt].qcalmax_green = params->qcalmax_green; 2495 + threads[nt].gain_low_green = params->is_gain_low_green; 2496 + threads[nt].spectral_irradiance_green = 2497 + params->spectral_irradiance_green; 2498 + threads[nt].low_gain_factor_green = params->low_gain_factor_green; 2499 + threads[nt].high_gain_factor_green = params->high_gain_factor_green; 2500 + threads[nt].recalibration_min_green = params->recalibration_min_green; 2501 + threads[nt].recalibration_max_green = params->recalibration_max_green; 2502 + threads[nt].lmin_blue = params->lmin_blue; 2503 + threads[nt].lmax_blue = params->lmax_blue; 2504 + threads[nt].qcalmin_blue = params->qcalmin_blue; 2505 + threads[nt].qcalmax_blue = params->qcalmax_blue; 2506 + threads[nt].gain_low_blue = params->is_gain_low_blue; 2507 + threads[nt].spectral_irradiance_blue = 2508 + params->spectral_irradiance_blue; 2509 + threads[nt].low_gain_factor_blue = params->low_gain_factor_blue; 2510 + threads[nt].high_gain_factor_blue = params->high_gain_factor_blue; 2511 + threads[nt].recalibration_min_blue = params->recalibration_min_blue; 2512 + threads[nt].recalibration_max_blue = params->recalibration_max_blue; 2513 + threads[nt].sun_distance = params->sun_distance; 2514 + threads[nt].sun_elevation = params->sun_elevation; 2515 + } 2516 + 2517 + if (num_threads == 1) 2518 + { 2519 + /* not using concurrent multithreading */ 2520 + threads[0].min_row = 0; 2521 + threads[0].max_row = num_rows; 2522 + landsat_rgb (&(threads[0])); 2523 + } 2524 + else 2525 + { 2526 + /* using concurrent multithreading */ 2527 + int base_row = 0; 2528 + int rows_per_thread = num_rows / num_threads; 2529 + if ((rows_per_thread * num_threads) < num_rows) 2530 + rows_per_thread++; 2531 + for (nt = 0; nt < num_threads; nt++) 2532 + { 2533 + int max_row = base_row + rows_per_thread; 2534 + if (max_row >= num_rows) 2535 + max_row = num_rows; 2536 + threads[nt].min_row = base_row; 2537 + threads[nt].max_row = max_row; 2538 + base_row += rows_per_thread; 2539 +#ifdef _WIN32 2540 + thread_handles[nt] = 2541 + CreateThread (NULL, 0, landsat_rgb_recalibrate, 2542 + &(threads[nt]), 0, &dwThreadIdArray[nt]); 2543 +#else 2544 + pthread_create (&(thread_ids[nt]), NULL, 2545 + landsat_rgb_recalibrate, &(threads[nt])); 2546 +#endif 2547 + } 2548 + /* waiting until any concurrent thread terminates */ 2549 +#ifdef _WIN32 2550 + WaitForMultipleObjects (num_threads, thread_handles, TRUE, INFINITE); 2551 +#else 2552 + for (nt = 0; nt < num_threads; nt++) 2553 + pthread_join (thread_ids[nt], NULL); 2554 +#endif 2555 + } 2556 + 2557 + return GGRAPH_OK; 2558 +} 2559 + 2560 +static void 2561 +landsat_bw (struct thread_landsat_recalibrate *ptr) 2562 +{ 2563 +/* precessing a B&W Landsat sub-strip */ 2564 + int x; 2565 + int y; 2566 + unsigned char gray; 2567 + unsigned char *p_in; 2568 + unsigned char *p_out; 2569 + struct thread_landsat_recalibrate p; 2570 + 2571 +/* setting up the recalibrate struct */ 2572 + p.lmin_panchro = ptr->lmin_panchro; 2573 + p.lmax_panchro = ptr->lmax_panchro; 2574 + p.qcalmin_panchro = ptr->qcalmin_panchro; 2575 + p.qcalmax_panchro = ptr->qcalmax_panchro; 2576 + p.gain_low_panchro = ptr->gain_low_panchro; 2577 + p.spectral_irradiance_panchro = ptr->spectral_irradiance_panchro; 2578 + p.low_gain_factor_panchro = ptr->low_gain_factor_panchro; 2579 + p.high_gain_factor_panchro = ptr->high_gain_factor_panchro; 2580 + p.recalibration_min_panchro = ptr->recalibration_min_panchro; 2581 + p.recalibration_max_panchro = ptr->recalibration_max_panchro; 2582 + p.sun_distance = ptr->sun_distance; 2583 + p.sun_elevation = ptr->sun_elevation; 2584 + 2585 + for (y = ptr->min_row; y < ptr->max_row; y++) 2586 + { 2587 + p_in = ptr->img_red->pixels + (y * ptr->img_red->scanline_width); 2588 + p_out = ptr->img_out->pixels + (y * ptr->img_out->scanline_width); 2589 + for (x = 0; x < ptr->width; x++) 2590 + { 2591 + gray = *p_in++; 2592 + if (gray == 0) 2593 + gray = 0; 2594 + else 2595 + { 2596 + p.value = gray; 2597 + p.band = LANDSAT_PANCHRO; 2598 + landsat_recalibrate (&p); 2599 + gray = p.value; 2600 + } 2601 + *p_out++ = gray; 2602 + } 2603 + } 2604 +} 2605 + 2606 +#ifdef _WIN32 2607 +static DWORD WINAPI 2608 +#else 2609 +static void * 2610 +#endif 2611 +landsat_bw_recalibrate (void *arg) 2612 +{ 2613 +/* threaded function: rendering a B&W Landsat sub-strip */ 2614 + struct thread_landsat_recalibrate *params = 2615 + (struct thread_landsat_recalibrate *) arg; 2616 + landsat_bw (params); 2617 +#ifdef _WIN32 2618 + return 0; 2619 +#else 2620 + pthread_exit (NULL); 2621 +#endif 2622 +} 2623 + 2624 +GGRAPH_DECLARE int 2625 +gGraphLandsatBW (const void *in_ptr, const void *out_ptr, int width, 2626 + int num_rows, gGraphLandsatRecalibrationPtr params, 2627 + int num_threads) 2628 +{ 2629 +/* processing a whole B&W Landsat strip (may be, in a multithreaded way) */ 2630 + gGraphStripImagePtr img_in = (gGraphStripImagePtr) in_ptr; 2631 + gGraphStripImagePtr img_out = (gGraphStripImagePtr) out_ptr; 2632 + int nt; 2633 + struct thread_landsat_recalibrate threads[GG_MAX_THREADS]; 2634 +#ifdef _WIN32 2635 + HANDLE thread_handles[GG_MAX_THREADS]; 2636 + DWORD dwThreadIdArray[GG_MAX_THREADS]; 2637 +#else 2638 + pthread_t thread_ids[GG_MAX_THREADS]; 2639 +#endif 2640 + 2641 + if (img_in == NULL || img_out == NULL) 2642 + return GGRAPH_INVALID_IMAGE; 2643 + if (img_in->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2644 + return GGRAPH_INVALID_IMAGE; 2645 + if (img_out->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2646 + return GGRAPH_INVALID_IMAGE; 2647 + if (img_in->pixel_format == GG_PIXEL_GRAYSCALE 2648 + && img_out->pixel_format == GG_PIXEL_GRAYSCALE) 2649 + ; 2650 + else 2651 + return GGRAPH_INVALID_IMAGE; 2652 + if (img_in->width == width && img_out->width == width) 2653 + ; 2654 + else 2655 + return GGRAPH_INVALID_IMAGE; 2656 + if (img_in->current_available_rows == num_rows 2657 + && img_out->rows_per_block >= num_rows) 2658 + ; 2659 + else 2660 + return GGRAPH_INVALID_IMAGE; 2661 + 2662 + if (num_threads > GG_MAX_THREADS) 2663 + num_threads = GG_MAX_THREADS; 2664 + if (num_threads < 1) 2665 + num_threads = 1; 2666 + 2667 + for (nt = 0; nt < num_threads; nt++) 2668 + { 2669 + /* setting up the recalibrate struct */ 2670 + threads[nt].img_red = img_in; 2671 + threads[nt].img_out = img_out; 2672 + threads[nt].width = width; 2673 + threads[nt].lmin_panchro = params->lmin_panchro; 2674 + threads[nt].lmax_panchro = params->lmax_panchro; 2675 + threads[nt].qcalmin_panchro = params->qcalmin_panchro; 2676 + threads[nt].qcalmax_panchro = params->qcalmax_panchro; 2677 + threads[nt].gain_low_panchro = params->is_gain_low_panchro; 2678 + threads[nt].spectral_irradiance_panchro = 2679 + params->spectral_irradiance_panchro; 2680 + threads[nt].low_gain_factor_panchro = params->low_gain_factor_panchro; 2681 + threads[nt].high_gain_factor_panchro = 2682 + params->high_gain_factor_panchro; 2683 + threads[nt].recalibration_min_panchro = 2684 + params->recalibration_min_panchro; 2685 + threads[nt].recalibration_max_panchro = 2686 + params->recalibration_max_panchro; 2687 + threads[nt].sun_distance = params->sun_distance; 2688 + threads[nt].sun_elevation = params->sun_elevation; 2689 + } 2690 + 2691 + if (num_threads == 1) 2692 + { 2693 + /* not using concurrent multithreading */ 2694 + threads[0].min_row = 0; 2695 + threads[0].max_row = num_rows; 2696 + landsat_bw (&(threads[0])); 2697 + } 2698 + else 2699 + { 2700 + /* using concurrent multithreading */ 2701 + int base_row = 0; 2702 + int rows_per_thread = num_rows / num_threads; 2703 + if ((rows_per_thread * num_threads) < num_rows) 2704 + rows_per_thread++; 2705 + for (nt = 0; nt < num_threads; nt++) 2706 + { 2707 + int max_row = base_row + rows_per_thread; 2708 + if (max_row >= num_rows) 2709 + max_row = num_rows; 2710 + threads[nt].min_row = base_row; 2711 + threads[nt].max_row = max_row; 2712 + base_row += rows_per_thread; 2713 +#ifdef _WIN32 2714 + thread_handles[nt] = 2715 + CreateThread (NULL, 0, landsat_bw_recalibrate, 2716 + &(threads[nt]), 0, &dwThreadIdArray[nt]); 2717 +#else 2718 + pthread_create (&(thread_ids[nt]), NULL, 2719 + landsat_bw_recalibrate, &(threads[nt])); 2720 +#endif 2721 + } 2722 + /* waiting until any concurrent thread terminates */ 2723 +#ifdef _WIN32 2724 + WaitForMultipleObjects (num_threads, thread_handles, TRUE, INFINITE); 2725 +#else 2726 + for (nt = 0; nt < num_threads; nt++) 2727 + pthread_join (thread_ids[nt], NULL); 2728 +#endif 2729 + } 2730 + 2731 + return GGRAPH_OK; 2732 +} 2733 + 2734 +GGRAPH_DECLARE int 2735 +gGraphGetLandsatSceneExtent (const void *ptr, int base_row, double *top_x, 2736 + double *top_y, double *bottom_x, double *bottom_y, 2737 + double *left_x, double *left_y, double *right_x, 2738 + double *right_y) 2739 +{ 2740 +/* determing the actual Landsat scene extent (by strips) */ 2741 + int x; 2742 + int y; 2743 + unsigned char *p_in; 2744 + unsigned char gray; 2745 + unsigned char red; 2746 + unsigned char green; 2747 + unsigned char blue; 2748 + double px; 2749 + double py; 2750 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2751 + 2752 + if (img == NULL) 2753 + return GGRAPH_INVALID_IMAGE; 2754 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2755 + return GGRAPH_INVALID_IMAGE; 2756 + if (img->pixel_format == GG_PIXEL_GRAYSCALE 2757 + || img->pixel_format == GG_PIXEL_RGB) 2758 + ; 2759 + else 2760 + return GGRAPH_INVALID_IMAGE; 2761 + 2762 + *top_x = 0.0 - DBL_MAX; 2763 + *top_y = 0.0 - DBL_MAX; 2764 + *bottom_x = DBL_MAX; 2765 + *bottom_y = DBL_MAX; 2766 + *left_x = DBL_MAX; 2767 + *left_y = DBL_MAX; 2768 + *right_x = 0.0 - DBL_MAX; 2769 + *right_y = 0.0 - DBL_MAX; 2770 + 2771 + for (y = 0; y < img->current_available_rows; y++) 2772 + { 2773 + p_in = img->pixels + (y * img->scanline_width); 2774 + for (x = 0; x < img->width; x++) 2775 + { 2776 + if (img->pixel_format == GG_PIXEL_GRAYSCALE) 2777 + { 2778 + gray = *p_in++; 2779 + if (gray == 0) 2780 + continue; 2781 + } 2782 + else 2783 + { 2784 + red = *p_in++; 2785 + green = *p_in++; 2786 + blue = *p_in++; 2787 + if (red == 0 || green == 0 || blue == 0) 2788 + continue; 2789 + } 2790 + /* ok, this one is a valid scene's pixel */ 2791 + px = img->upper_left_x + ((double) x * img->pixel_x_size); 2792 + py = img->upper_left_y - 2793 + ((double) (base_row + y) * img->pixel_y_size); 2794 + if (py > *top_y) 2795 + { 2796 + *top_y = py; 2797 + *top_x = px; 2798 + } 2799 + if (py < *bottom_y) 2800 + { 2801 + *bottom_y = py; 2802 + *bottom_x = px; 2803 + } 2804 + if (px < *left_x) 2805 + { 2806 + *left_x = px; 2807 + *left_y = py; 2808 + } 2809 + if (px > *right_x) 2810 + { 2811 + *right_x = px; 2812 + *right_y = py; 2813 + } 2814 + } 2815 + } 2816 + return GGRAPH_OK; 2817 +} 2818 + 2819 +GGRAPH_DECLARE int 2820 +gGraphLandsatMergePixels (const void *ptr_in, int base_row, const void *ptr_out) 2821 +{ 2822 +/* merging pixels between two images by Geographic position */ 2823 + int x; 2824 + int y; 2825 + unsigned char *p_in; 2826 + unsigned char *p_out; 2827 + unsigned char gray; 2828 + unsigned char red; 2829 + unsigned char green; 2830 + unsigned char blue; 2831 + double geo_x; 2832 + double geo_y; 2833 + int out_x; 2834 + int out_y; 2835 + double dout_x; 2836 + double dout_y; 2837 + double diff_x; 2838 + double diff_y; 2839 + gGraphStripImagePtr img_in = (gGraphStripImagePtr) ptr_in; 2840 + gGraphImagePtr img_out = (gGraphImagePtr) ptr_out; 2841 + 2842 + if (img_in == NULL) 2843 + return GGRAPH_INVALID_IMAGE; 2844 + if (img_out == NULL) 2845 + return GGRAPH_INVALID_IMAGE; 2846 + if (img_in->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2847 + return GGRAPH_INVALID_IMAGE; 2848 + if (img_out->signature != GG_IMAGE_MAGIC_SIGNATURE) 2849 + return GGRAPH_INVALID_IMAGE; 2850 + if (img_in->pixel_format == GG_PIXEL_GRAYSCALE 2851 + || img_in->pixel_format == GG_PIXEL_RGB) 2852 + ; 2853 + else 2854 + return GGRAPH_INVALID_IMAGE; 2855 + if (img_in->pixel_format != img_out->pixel_format) 2856 + return GGRAPH_INVALID_IMAGE; 2857 + if (img_in->srid != img_out->srid) 2858 + return GGRAPH_INVALID_IMAGE; 2859 + 2860 + for (y = 0; y < img_in->current_available_rows; y++) 2861 + { 2862 + p_in = img_in->pixels + (y * img_in->scanline_width); 2863 + for (x = 0; x < img_in->width; x++) 2864 + { 2865 + if (img_in->pixel_format == GG_PIXEL_GRAYSCALE) 2866 + { 2867 + gray = *p_in++; 2868 + if (gray == 0) 2869 + continue; 2870 + } 2871 + else 2872 + { 2873 + red = *p_in++; 2874 + green = *p_in++; 2875 + blue = *p_in++; 2876 + if (red == 0 || green == 0 || blue == 0) 2877 + continue; 2878 + } 2879 + /* ok, this one is a valid scene's pixel */ 2880 + geo_x = 2881 + img_in->upper_left_x + ((double) x * img_in->pixel_x_size); 2882 + geo_y = 2883 + img_in->upper_left_y - 2884 + ((double) (base_row + y) * img_in->pixel_y_size); 2885 + dout_x = 2886 + ((geo_x - img_out->upper_left_x) / img_out->pixel_x_size); 2887 + dout_y = 2888 + ((img_out->upper_left_y - geo_y) / img_out->pixel_y_size); 2889 + out_x = (int) dout_x; 2890 + out_y = (int) dout_y; 2891 + diff_x = dout_x - (double) out_x; 2892 + diff_y = dout_y - (double) out_y; 2893 + if (diff_x >= 0.5) 2894 + out_x++; 2895 + if (diff_y >= 0.5) 2896 + out_y++; 2897 + if (out_x < 0 || out_x >= img_out->width) 2898 + continue; 2899 + if (out_y < 0 || out_y >= img_out->height) 2900 + continue; 2901 + /* ok, setting this pixel into the output image */ 2902 + p_out = 2903 + img_out->pixels + (out_y * img_out->scanline_width) + 2904 + (out_x * img_out->pixel_size); 2905 + if (img_out->pixel_format == GG_PIXEL_GRAYSCALE) 2906 + *p_out++ = gray; 2907 + else 2908 + { 2909 + *p_out++ = red; 2910 + *p_out++ = green; 2911 + *p_out++ = blue; 2912 + } 2913 + } 2914 + } 2915 + 2916 + return GGRAPH_OK; 2917 +} 2918 + 2919 +static unsigned char 2920 +to_grayscale3 (unsigned char r, unsigned char g, unsigned char b) 2921 +{ 2922 +/* computing a grayscale value */ 2923 + double dval = 2924 + (0.3 * (double) r) + (0.59 * (double) g) + (0.11 * (double) b); 2925 + int ival = (int) dval; 2926 + if (ival < 0) 2927 + ival = 0; 2928 + if (ival > 255) 2929 + ival = 255; 2930 + return (unsigned char) ival; 2931 +} 2932 + 2933 +static int 2934 +merge_grid (gGraphImagePtr img_in, gGraphImagePtr img_out) 2935 +{ 2936 +/* mergine pixels between two GRIDS by Geographics position */ 2937 + int x; 2938 + int y; 2939 + unsigned char *p_in; 2940 + unsigned char *p_out; 2941 + double value; 2942 + double geo_x; 2943 + double geo_y; 2944 + int out_x; 2945 + int out_y; 2946 + double dout_x; 2947 + double dout_y; 2948 + double diff_x; 2949 + double diff_y; 2950 + for (y = 0; y < img_in->height; y++) 2951 + { 2952 + p_in = img_in->pixels + (y * img_in->scanline_width); 2953 + for (x = 0; x < img_in->width; x++) 2954 + { 2955 + switch (img_in->sample_format) 2956 + { 2957 + case GGRAPH_SAMPLE_INT: 2958 + if (img_in->bits_per_sample == 16) 2959 + { 2960 + short *p = (short *) p_in; 2961 + value = *p; 2962 + p_in += sizeof (short); 2963 + } 2964 + else 2965 + { 2966 + int *p = (int *) p_in; 2967 + value = *p; 2968 + p_in += sizeof (int); 2969 + } 2970 + break; 2971 + case GGRAPH_SAMPLE_UINT: 2972 + if (img_in->bits_per_sample == 16) 2973 + { 2974 + unsigned short *p = (unsigned short *) p_in; 2975 + value = *p; 2976 + p_in += sizeof (unsigned short); 2977 + } 2978 + else 2979 + { 2980 + unsigned int *p = (unsigned int *) p_in; 2981 + value = *p; 2982 + p_in += sizeof (unsigned int); 2983 + } 2984 + break; 2985 + case GGRAPH_SAMPLE_FLOAT: 2986 + if (img_in->bits_per_sample == 32) 2987 + { 2988 + float *p = (float *) p_in; 2989 + value = *p; 2990 + p_in += sizeof (float); 2991 + } 2992 + else 2993 + { 2994 + double *p = (double *) p_in; 2995 + value = *p; 2996 + p_in += sizeof (double); 2997 + } 2998 + break; 2999 + }; 3000 + if (value == img_in->no_data_value) 3001 + { 3002 + /* NoData pixel: skipping */ 3003 + continue; 3004 + } 3005 + /* ok, this one is a valid scene's pixel */ 3006 + geo_x = 3007 + img_in->upper_left_x + ((double) x * img_in->pixel_x_size); 3008 + geo_y = 3009 + img_in->upper_left_y - ((double) y * img_in->pixel_y_size); 3010 + dout_x = 3011 + ((geo_x - img_out->upper_left_x) / img_out->pixel_x_size); 3012 + dout_y = 3013 + ((img_out->upper_left_y - geo_y) / img_out->pixel_y_size); 3014 + out_x = (int) dout_x; 3015 + out_y = (int) dout_y; 3016 + diff_x = dout_x - (double) out_x; 3017 + diff_y = dout_y - (double) out_y; 3018 + if (diff_x >= 0.5) 3019 + out_x++; 3020 + if (diff_y >= 0.5) 3021 + out_y++; 3022 + if (out_x < 0 || out_x >= img_out->width) 3023 + continue; 3024 + if (out_y < 0 || out_y >= img_out->height) 3025 + continue; 3026 + /* ok, setting this pixel into the output image */ 3027 + p_out = 3028 + img_out->pixels + (out_y * img_out->scanline_width) + 3029 + (out_x * img_out->pixel_size); 3030 + switch (img_out->sample_format) 3031 + { 3032 + case GGRAPH_SAMPLE_INT: 3033 + if (img_out->bits_per_sample == 16) 3034 + { 3035 + short *p = (short *) p_out; 3036 + *p = (short) value; 3037 + p_out += sizeof (short); 3038 + } 3039 + else 3040 + { 3041 + int *p = (int *) p_out; 3042 + *p = (int) value; 3043 + p_out += sizeof (int); 3044 + } 3045 + break; 3046 + case GGRAPH_SAMPLE_UINT: 3047 + if (img_out->bits_per_sample == 16) 3048 + { 3049 + unsigned short *p = (unsigned short *) p_out; 3050 + *p = (unsigned short) value; 3051 + p_out += sizeof (unsigned short); 3052 + } 3053 + else 3054 + { 3055 + unsigned int *p = (unsigned int *) p_out; 3056 + *p = (unsigned int) value; 3057 + p_out += sizeof (unsigned int); 3058 + } 3059 + break; 3060 + case GGRAPH_SAMPLE_FLOAT: 3061 + if (img_out->bits_per_sample == 32) 3062 + { 3063 + float *p = (float *) p_out; 3064 + *p = (float) value; 3065 + p_out += sizeof (float); 3066 + } 3067 + else 3068 + { 3069 + double *p = (double *) p_out; 3070 + *p = value; 3071 + p_out += sizeof (double); 3072 + } 3073 + break; 3074 + }; 3075 + } 3076 + } 3077 + return GGRAPH_OK; 3078 +} 3079 + 3080 +GGRAPH_DECLARE int 3081 +gGraphGeoMergePixels (const void *ptr_in, const void *ptr_out) 3082 +{ 3083 +/* merging pixels between two images by Geographic position */ 3084 + int x; 3085 + int y; 3086 + unsigned char *p_in; 3087 + unsigned char *p_out; 3088 + unsigned char gray; 3089 + unsigned char red; 3090 + unsigned char green; 3091 + unsigned char blue; 3092 + double geo_x; 3093 + double geo_y; 3094 + int out_x; 3095 + int out_y; 3096 + double dout_x; 3097 + double dout_y; 3098 + double diff_x; 3099 + double diff_y; 3100 + gGraphImagePtr img_in = (gGraphImagePtr) ptr_in; 3101 + gGraphImagePtr img_out = (gGraphImagePtr) ptr_out; 3102 + 3103 + if (img_in == NULL) 3104 + return GGRAPH_INVALID_IMAGE; 3105 + if (img_out == NULL) 3106 + return GGRAPH_INVALID_IMAGE; 3107 + if (img_in->signature != GG_IMAGE_MAGIC_SIGNATURE) 3108 + return GGRAPH_INVALID_IMAGE; 3109 + if (img_out->signature != GG_IMAGE_MAGIC_SIGNATURE) 3110 + return GGRAPH_INVALID_IMAGE; 3111 + if (img_in->srid != img_out->srid) 3112 + return GGRAPH_INVALID_IMAGE; 3113 + 3114 + if (img_in->pixel_format == GG_PIXEL_GRID) 3115 + { 3116 + if (img_out->pixel_format == GG_PIXEL_GRID) 3117 + return merge_grid (img_in, img_out); 3118 + return GGRAPH_INVALID_IMAGE; 3119 + } 3120 + 3121 + for (y = 0; y < img_in->height; y++) 3122 + { 3123 + p_in = img_in->pixels + (y * img_in->scanline_width); 3124 + for (x = 0; x < img_in->width; x++) 3125 + { 3126 + if (img_in->pixel_format == GG_PIXEL_GRAYSCALE) 3127 + { 3128 + gray = *p_in++; 3129 + red = gray; 3130 + green = gray; 3131 + blue = gray; 3132 + } 3133 + else if (img_in->pixel_format == GG_PIXEL_PALETTE) 3134 + { 3135 + int index = *p_in++; 3136 + red = img_in->palette_red[index]; 3137 + green = img_in->palette_green[index]; 3138 + blue = img_in->palette_blue[index]; 3139 + if (red == green && red == blue) 3140 + gray = red; 3141 + else 3142 + gray = to_grayscale3 (red, green, blue); 3143 + } 3144 + else 3145 + { 3146 + red = *p_in++; 3147 + green = *p_in++; 3148 + blue = *p_in++; 3149 + if (red == green && red == blue) 3150 + gray = red; 3151 + else 3152 + gray = to_grayscale3 (red, green, blue); 3153 + } 3154 + /* ok, this one is a valid scene's pixel */ 3155 + geo_x = 3156 + img_in->upper_left_x + ((double) x * img_in->pixel_x_size); 3157 + geo_y = 3158 + img_in->upper_left_y - ((double) y * img_in->pixel_y_size); 3159 + dout_x = 3160 + ((geo_x - img_out->upper_left_x) / img_out->pixel_x_size); 3161 + dout_y = 3162 + ((img_out->upper_left_y - geo_y) / img_out->pixel_y_size); 3163 + out_x = (int) dout_x; 3164 + out_y = (int) dout_y; 3165 + diff_x = dout_x - (double) out_x; 3166 + diff_y = dout_y - (double) out_y; 3167 + if (diff_x >= 0.5) 3168 + out_x++; 3169 + if (diff_y >= 0.5) 3170 + out_y++; 3171 + if (out_x < 0 || out_x >= img_out->width) 3172 + continue; 3173 + if (out_y < 0 || out_y >= img_out->height) 3174 + continue; 3175 + /* ok, setting this pixel into the output image */ 3176 + p_out = 3177 + img_out->pixels + (out_y * img_out->scanline_width) + 3178 + (out_x * img_out->pixel_size); 3179 + if (img_out->pixel_format == GG_PIXEL_GRAYSCALE) 3180 + *p_out++ = gray; 3181 + else if (img_out->pixel_format == GG_PIXEL_RGBA) 3182 + { 3183 + *p_out++ = red; 3184 + *p_out++ = green; 3185 + *p_out++ = blue; 3186 + *p_out++ = 255; 3187 + } 3188 + else 3189 + { 3190 + *p_out++ = red; 3191 + *p_out++ = green; 3192 + *p_out++ = blue; 3193 + } 3194 + } 3195 + } 3196 + 3197 + return GGRAPH_OK; 3198 +}
Added src/gaiagraphics_gif.c.
1 +/* 2 +/ gaiagraphics_gif.c 3 +/ 4 +/ GIF auxiliary helpers 5 +/ 6 +/ version 1.0, 2010 July 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2010 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdio.h> 28 +#include <math.h> 29 +#include <string.h> 30 +#include <stdlib.h> 31 + 32 +#include "gaiagraphics.h" 33 +#include "gaiagraphics_internals.h" 34 + 35 +/* 36 +/ 37 +/ DISCLAIMER: 38 +/ all the following code merely is an 'ad hoc' adaption 39 +/ deriving from the original GD lib code 40 +/ which in turn is based on he following: 41 +/ 42 +** Code drawn from ppmtogif.c, from the pbmplus package 43 +** 44 +** Based on GIFENCOD by David Rowley <mgardi@watdscu.waterloo.edu>. A 45 +** Lempel-Zim compression based on "compress". 46 +** 47 +** Modified by Marcel Wijkstra <wijkstra@fwi.uva.nl> 48 +** 49 +** Copyright (C) 1989 by Jef Poskanzer. 50 +** 51 +** Permission to use, copy, modify, and distribute this software and its 52 +** documentation for any purpose and without fee is hereby granted, provided 53 +** that the above copyright notice appear in all copies and that both that 54 +** copyright notice and this permission notice appear in supporting 55 +** documentation. This software is provided "as is" without express or 56 +** implied warranty. 57 +** 58 +** The Graphics Interchange Format(c) is the Copyright property of 59 +** CompuServe Incorporated. GIF(sm) is a Service Mark property of 60 +** CompuServe Incorporated. 61 +/ 62 +*/ 63 + 64 +typedef int code_int; 65 + 66 +#ifdef SIGNED_COMPARE_SLOW 67 +typedef unsigned long int count_int; 68 +typedef unsigned short int count_short; 69 +#else /*SIGNED_COMPARE_SLOW */ 70 +typedef long int count_int; 71 +#endif /*SIGNED_COMPARE_SLOW */ 72 + 73 +#define GIFBITS 12 74 + 75 +#define maxbits GIFBITS 76 + 77 +#define maxmaxcode ((code_int)1 << GIFBITS) 78 + 79 +#define HSIZE 5003 80 +#define hsize HSIZE 81 + 82 +#ifdef COMPATIBLE 83 +#define MAXCODE(n_bits) ((code_int) 1 << (n_bits) - 1) 84 +#else /*COMPATIBLE*/ 85 +#define MAXCODE(n_bits) (((code_int) 1 << (n_bits)) - 1) 86 +#endif /*COMPATIBLE*/ 87 +#define HashTabOf(i) ctx->htab[i] 88 +#define CodeTabOf(i) ctx->codetab[i] 89 + typedef struct 90 +{ 91 + int Width, Height; 92 + int curx, cury; 93 + long CountDown; 94 + int Pass; 95 + int Interlace; 96 + int n_bits; 97 + code_int maxcode; 98 + count_int htab[HSIZE]; 99 + unsigned short codetab[HSIZE]; 100 + code_int free_ent; 101 + int clear_flg; 102 + int offset; 103 + long int in_count; 104 + long int out_count; 105 + int g_init_bits; 106 + xgdIOCtx *g_outfile; 107 + int ClearCode; 108 + int EOFCode; 109 + unsigned long cur_accum; 110 + int cur_bits; 111 + int a_count; 112 + char accum[256]; 113 +} GifCtx; 114 + 115 +#define MAXCOLORMAPSIZE 256 116 + 117 +#define TRUE 1 118 +#define FALSE 0 119 + 120 +#define CM_RED 0 121 +#define CM_GREEN 1 122 +#define CM_BLUE 2 123 + 124 +#define MAX_LWZ_BITS 12 125 + 126 +#define INTERLACE 0x40 127 +#define LOCALCOLORMAP 0x80 128 + 129 +#define BitSet(byte, bit) (((byte) & (bit)) == (bit)) 130 +#define ReadOK(file,buffer,len) (xgdGetBuf(buffer, len, file) > 0) 131 +#define LM_to_uint(a,b) (((b)<<8)|(a)) 132 + 133 +#define STACK_SIZE ((1<<(MAX_LWZ_BITS))*2) 134 + 135 +typedef struct 136 +{ 137 + unsigned char buf[280]; 138 + int curbit, lastbit, done, last_byte; 139 +} CODE_STATIC_DATA; 140 + 141 +typedef struct 142 +{ 143 + int fresh; 144 + int code_size, set_code_size; 145 + int max_code, max_code_size; 146 + int firstcode, oldcode; 147 + int clear_code, end_code; 148 + int table[2][(1 << MAX_LWZ_BITS)]; 149 + int stack[STACK_SIZE], *sp; 150 + CODE_STATIC_DATA scd; 151 +} LZW_STATIC_DATA; 152 + 153 +static int 154 +GetDataBlock_ (xgdIOCtx * fd, unsigned char *buf, int *ZeroDataBlockP) 155 +{ 156 + unsigned char count; 157 + if (!ReadOK (fd, &count, 1)) 158 + { 159 + return -1; 160 + } 161 + *ZeroDataBlockP = count == 0; 162 + if ((count != 0) && (!ReadOK (fd, buf, count))) 163 + { 164 + return -1; 165 + } 166 + return count; 167 +} 168 + 169 +static int 170 +GetDataBlock (xgdIOCtx * fd, unsigned char *buf, int *ZeroDataBlockP) 171 +{ 172 + int rv; 173 + rv = GetDataBlock_ (fd, buf, ZeroDataBlockP); 174 + return (rv); 175 +} 176 + 177 +static int 178 +ReadColorMap (xgdIOCtx * fd, int number, unsigned char (*buffer)[256]) 179 +{ 180 + int i; 181 + unsigned char rgb[3]; 182 + for (i = 0; i < number; ++i) 183 + { 184 + if (!ReadOK (fd, rgb, sizeof (rgb))) 185 + { 186 + return TRUE; 187 + } 188 + buffer[CM_RED][i] = rgb[0]; 189 + buffer[CM_GREEN][i] = rgb[1]; 190 + buffer[CM_BLUE][i] = rgb[2]; 191 + } 192 + return FALSE; 193 +} 194 + 195 +static int 196 +GetCode_ (xgdIOCtx * fd, CODE_STATIC_DATA * scd, int code_size, int flag, 197 + int *ZeroDataBlockP) 198 +{ 199 + int i, j, ret; 200 + unsigned char count; 201 + if (flag) 202 + { 203 + scd->curbit = 0; 204 + scd->lastbit = 0; 205 + scd->last_byte = 0; 206 + scd->done = FALSE; 207 + return 0; 208 + } 209 + if ((scd->curbit + code_size) >= scd->lastbit) 210 + { 211 + if (scd->done) 212 + { 213 + if (scd->curbit >= scd->lastbit) 214 + { 215 + /* Oh well */ 216 + } 217 + return -1; 218 + } 219 + scd->buf[0] = scd->buf[scd->last_byte - 2]; 220 + scd->buf[1] = scd->buf[scd->last_byte - 1]; 221 + if ((count = GetDataBlock (fd, &scd->buf[2], ZeroDataBlockP)) <= 0) 222 + scd->done = TRUE; 223 + scd->last_byte = 2 + count; 224 + scd->curbit = (scd->curbit - scd->lastbit) + 16; 225 + scd->lastbit = (2 + count) * 8; 226 + } 227 + ret = 0; 228 + for (i = scd->curbit, j = 0; j < code_size; ++i, ++j) 229 + ret |= ((scd->buf[i / 8] & (1 << (i % 8))) != 0) << j; 230 + scd->curbit += code_size; 231 + return ret; 232 +} 233 + 234 +static int 235 +GetCode (xgdIOCtx * fd, CODE_STATIC_DATA * scd, int code_size, int flag, 236 + int *ZeroDataBlockP) 237 +{ 238 + int rv; 239 + rv = GetCode_ (fd, scd, code_size, flag, ZeroDataBlockP); 240 + return (rv); 241 +} 242 + 243 +static int 244 +LWZReadByte_ (xgdIOCtx * fd, LZW_STATIC_DATA * sd, char flag, 245 + int input_code_size, int *ZeroDataBlockP) 246 +{ 247 + int code, incode, i; 248 + if (flag) 249 + { 250 + sd->set_code_size = input_code_size; 251 + sd->code_size = sd->set_code_size + 1; 252 + sd->clear_code = 1 << sd->set_code_size; 253 + sd->end_code = sd->clear_code + 1; 254 + sd->max_code_size = 2 * sd->clear_code; 255 + sd->max_code = sd->clear_code + 2; 256 + GetCode (fd, &sd->scd, 0, TRUE, ZeroDataBlockP); 257 + sd->fresh = TRUE; 258 + for (i = 0; i < sd->clear_code; ++i) 259 + { 260 + sd->table[0][i] = 0; 261 + sd->table[1][i] = i; 262 + } 263 + for (; i < (1 << MAX_LWZ_BITS); ++i) 264 + sd->table[0][i] = sd->table[1][0] = 0; 265 + sd->sp = sd->stack; 266 + return 0; 267 + } 268 + else if (sd->fresh) 269 + { 270 + sd->fresh = FALSE; 271 + do 272 + { 273 + sd->firstcode = sd->oldcode = 274 + GetCode (fd, &sd->scd, sd->code_size, FALSE, 275 + ZeroDataBlockP); 276 + } 277 + while (sd->firstcode == sd->clear_code); 278 + return sd->firstcode; 279 + } 280 + if (sd->sp > sd->stack) 281 + return *--sd->sp; 282 + while ((code = 283 + GetCode (fd, &sd->scd, sd->code_size, FALSE, ZeroDataBlockP)) >= 0) 284 + { 285 + if (code == sd->clear_code) 286 + { 287 + for (i = 0; i < sd->clear_code; ++i) 288 + { 289 + sd->table[0][i] = 0; 290 + sd->table[1][i] = i; 291 + } 292 + for (; i < (1 << MAX_LWZ_BITS); ++i) 293 + sd->table[0][i] = sd->table[1][i] = 0; 294 + sd->code_size = sd->set_code_size + 1; 295 + sd->max_code_size = 2 * sd->clear_code; 296 + sd->max_code = sd->clear_code + 2; 297 + sd->sp = sd->stack; 298 + sd->firstcode = sd->oldcode = 299 + GetCode (fd, &sd->scd, sd->code_size, FALSE, 300 + ZeroDataBlockP); 301 + return sd->firstcode; 302 + } 303 + else if (code == sd->end_code) 304 + { 305 + int count; 306 + unsigned char buf[260]; 307 + if (*ZeroDataBlockP) 308 + return -2; 309 + while ((count = GetDataBlock (fd, buf, ZeroDataBlockP)) > 0) 310 + ; 311 + if (count != 0) 312 + return -2; 313 + } 314 + incode = code; 315 + if (sd->sp == (sd->stack + STACK_SIZE)) 316 + { 317 + return -1; 318 + } 319 + if (code >= sd->max_code) 320 + { 321 + *sd->sp++ = sd->firstcode; 322 + code = sd->oldcode; 323 + } 324 + while (code >= sd->clear_code) 325 + { 326 + if (sd->sp == (sd->stack + STACK_SIZE)) 327 + { 328 + return -1; 329 + } 330 + *sd->sp++ = sd->table[1][code]; 331 + if (code == sd->table[0][code]) 332 + { 333 + /* Oh well */ 334 + } 335 + code = sd->table[0][code]; 336 + } 337 + *sd->sp++ = sd->firstcode = sd->table[1][code]; 338 + if ((code = sd->max_code) < (1 << MAX_LWZ_BITS)) 339 + { 340 + sd->table[0][code] = sd->oldcode; 341 + sd->table[1][code] = sd->firstcode; 342 + ++sd->max_code; 343 + if ((sd->max_code >= sd->max_code_size) && 344 + (sd->max_code_size < (1 << MAX_LWZ_BITS))) 345 + { 346 + sd->max_code_size *= 2; 347 + ++sd->code_size; 348 + } 349 + } 350 + sd->oldcode = incode; 351 + if (sd->sp > sd->stack) 352 + return *--sd->sp; 353 + } 354 + return code; 355 +} 356 + 357 +static int 358 +LWZReadByte (xgdIOCtx * fd, LZW_STATIC_DATA * sd, char flag, 359 + int input_code_size, int *ZeroDataBlockP) 360 +{ 361 + int rv; 362 + rv = LWZReadByte_ (fd, sd, flag, input_code_size, ZeroDataBlockP); 363 + return (rv); 364 +} 365 + 366 +static void 367 +ReadImage (gGraphImagePtr img, xgdIOCtx * fd, 368 + unsigned char (*cmap)[256], int interlace, int *ZeroDataBlockP) 369 +{ 370 + unsigned char c; 371 + int v; 372 + int xpos = 0, ypos = 0, pass = 0; 373 + int i; 374 + int red[256]; 375 + int green[256]; 376 + int blue[256]; 377 + unsigned char *p_out; 378 + int len = img->width; 379 + int height = img->height; 380 + LZW_STATIC_DATA sd; 381 + if (!ReadOK (fd, &c, 1)) 382 + { 383 + return; 384 + } 385 + if (c > MAX_LWZ_BITS) 386 + { 387 + return; 388 + } 389 + for (i = 0; (i < 256); i++) 390 + { 391 + red[i] = cmap[CM_RED][i]; 392 + green[i] = cmap[CM_GREEN][i]; 393 + blue[i] = cmap[CM_BLUE][i]; 394 + } 395 + if (LWZReadByte (fd, &sd, TRUE, c, ZeroDataBlockP) < 0) 396 + { 397 + return; 398 + } 399 + while ((v = LWZReadByte (fd, &sd, FALSE, c, ZeroDataBlockP)) >= 0) 400 + { 401 + if (v >= 256) 402 + { 403 + v = 0; 404 + } 405 + p_out = 406 + img->pixels + (ypos * img->scanline_width) + 407 + (xpos * img->pixel_size); 408 + if (img->pixel_format == GG_PIXEL_PALETTE) 409 + { 410 + /* the output image is expected to be PALETTE-based */ 411 + *p_out++ = v; 412 + if ((v + 1) > img->max_palette) 413 + img->max_palette = v + 1; 414 + img->palette_red[v] = red[v]; 415 + img->palette_green[v] = green[v]; 416 + img->palette_blue[v] = blue[v]; 417 + } 418 + ++xpos; 419 + if (xpos == len) 420 + { 421 + xpos = 0; 422 + if (interlace) 423 + { 424 + switch (pass) 425 + { 426 + case 0: 427 + case 1: 428 + ypos += 8; 429 + break; 430 + case 2: 431 + ypos += 4; 432 + break; 433 + case 3: 434 + ypos += 2; 435 + break; 436 + } 437 + if (ypos >= height) 438 + { 439 + ++pass; 440 + switch (pass) 441 + { 442 + case 1: 443 + ypos = 4; 444 + break; 445 + case 2: 446 + ypos = 2; 447 + break; 448 + case 3: 449 + ypos = 1; 450 + break; 451 + default: 452 + goto fini; 453 + } 454 + } 455 + } 456 + else 457 + { 458 + ++ypos; 459 + } 460 + } 461 + if (ypos >= height) 462 + break; 463 + } 464 + fini: 465 + if (LWZReadByte (fd, &sd, FALSE, c, ZeroDataBlockP) >= 0) 466 + { 467 + /* Ignore extra */ 468 + } 469 +} 470 + 471 +static int 472 +DoExtension (xgdIOCtx * fd, int label, int *Transparent, int *ZeroDataBlockP) 473 +{ 474 + unsigned char buf[256]; 475 + switch (label) 476 + { 477 + case 0xf9: 478 + memset (buf, 0, 4); 479 + (void) GetDataBlock (fd, (unsigned char *) buf, ZeroDataBlockP); 480 + if ((buf[0] & 0x1) != 0) 481 + *Transparent = buf[3]; 482 + while (GetDataBlock (fd, (unsigned char *) buf, ZeroDataBlockP) > 0); 483 + return FALSE; 484 + default: 485 + break; 486 + } 487 + while (GetDataBlock (fd, (unsigned char *) buf, ZeroDataBlockP) > 0) 488 + ; 489 + return FALSE; 490 +} 491 + 492 +static void 493 +BumpPixel (GifCtx * ctx) 494 +{ 495 + ++(ctx->curx); 496 + if (ctx->curx == ctx->Width) 497 + { 498 + ctx->curx = 0; 499 + if (!ctx->Interlace) 500 + ++(ctx->cury); 501 + else 502 + { 503 + switch (ctx->Pass) 504 + { 505 + case 0: 506 + ctx->cury += 8; 507 + if (ctx->cury >= ctx->Height) 508 + { 509 + ++(ctx->Pass); 510 + ctx->cury = 4; 511 + } 512 + break; 513 + case 1: 514 + ctx->cury += 8; 515 + if (ctx->cury >= ctx->Height) 516 + { 517 + ++(ctx->Pass); 518 + ctx->cury = 2; 519 + } 520 + break; 521 + case 2: 522 + ctx->cury += 4; 523 + if (ctx->cury >= ctx->Height) 524 + { 525 + ++(ctx->Pass); 526 + ctx->cury = 1; 527 + } 528 + break; 529 + 530 + case 3: 531 + ctx->cury += 2; 532 + break; 533 + } 534 + } 535 + } 536 +} 537 + 538 +static int 539 +GIFNextPixel (gGraphImagePtr img, GifCtx * ctx) 540 +{ 541 + int pixel = 0; 542 + unsigned char *p_in; 543 + if (ctx->CountDown == 0) 544 + return EOF; 545 + --(ctx->CountDown); 546 + 547 + p_in = 548 + img->pixels + (ctx->cury * img->scanline_width) + 549 + (ctx->curx * img->pixel_size); 550 + if (img->pixel_format == GG_PIXEL_GRAYSCALE 551 + || img->pixel_format == GG_PIXEL_PALETTE) 552 + { 553 + /* the input image is expected to be GRAYSCALE or PALETTE anyway */ 554 + pixel = *p_in; 555 + } 556 + BumpPixel (ctx); 557 + return pixel; 558 +} 559 + 560 +static void 561 +xgdPutC (const unsigned char c, xgdIOCtx * ctx) 562 +{ 563 + (ctx->putC) (ctx, c); 564 +} 565 + 566 +static void 567 +char_init (GifCtx * ctx) 568 +{ 569 + ctx->a_count = 0; 570 +} 571 + 572 +static void 573 +cl_hash (register count_int chsize, GifCtx * ctx) 574 +{ 575 + register count_int *htab_p = ctx->htab + chsize; 576 + register long i; 577 + register long m1 = -1; 578 + i = chsize - 16; 579 + do 580 + { 581 + *(htab_p - 16) = m1; 582 + *(htab_p - 15) = m1; 583 + *(htab_p - 14) = m1; 584 + *(htab_p - 13) = m1; 585 + *(htab_p - 12) = m1; 586 + *(htab_p - 11) = m1; 587 + *(htab_p - 10) = m1; 588 + *(htab_p - 9) = m1; 589 + *(htab_p - 8) = m1; 590 + *(htab_p - 7) = m1; 591 + *(htab_p - 6) = m1; 592 + *(htab_p - 5) = m1; 593 + *(htab_p - 4) = m1; 594 + *(htab_p - 3) = m1; 595 + *(htab_p - 2) = m1; 596 + *(htab_p - 1) = m1; 597 + htab_p -= 16; 598 + } 599 + while ((i -= 16) >= 0); 600 + for (i += 16; i > 0; --i) 601 + *--htab_p = m1; 602 +} 603 + 604 +static void 605 +flush_char (GifCtx * ctx) 606 +{ 607 + if (ctx->a_count > 0) 608 + { 609 + xgdPutC (ctx->a_count, ctx->g_outfile); 610 + xgdPutBuf (ctx->accum, ctx->a_count, ctx->g_outfile); 611 + ctx->a_count = 0; 612 + } 613 +} 614 + 615 +static void 616 +char_out (int c, GifCtx * ctx) 617 +{ 618 + ctx->accum[ctx->a_count++] = c; 619 + if (ctx->a_count >= 254) 620 + flush_char (ctx); 621 +} 622 + 623 +static unsigned long masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 624 + 0x001F, 0x003F, 0x007F, 0x00FF, 625 + 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 626 + 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF 627 +}; 628 + 629 +static void 630 +output (code_int code, GifCtx * ctx) 631 +{ 632 + ctx->cur_accum &= masks[ctx->cur_bits]; 633 + if (ctx->cur_bits > 0) 634 + ctx->cur_accum |= ((long) code << ctx->cur_bits); 635 + else 636 + ctx->cur_accum = code; 637 + ctx->cur_bits += ctx->n_bits; 638 + while (ctx->cur_bits >= 8) 639 + { 640 + char_out ((unsigned int) (ctx->cur_accum & 0xff), ctx); 641 + ctx->cur_accum >>= 8; 642 + ctx->cur_bits -= 8; 643 + } 644 + if (ctx->free_ent > ctx->maxcode || ctx->clear_flg) 645 + { 646 + 647 + if (ctx->clear_flg) 648 + { 649 + 650 + ctx->maxcode = MAXCODE (ctx->n_bits = ctx->g_init_bits); 651 + ctx->clear_flg = 0; 652 + 653 + } 654 + else 655 + { 656 + 657 + ++(ctx->n_bits); 658 + if (ctx->n_bits == maxbits) 659 + ctx->maxcode = maxmaxcode; 660 + else 661 + ctx->maxcode = MAXCODE (ctx->n_bits); 662 + } 663 + } 664 + if (code == ctx->EOFCode) 665 + { 666 + while (ctx->cur_bits > 0) 667 + { 668 + char_out ((unsigned int) (ctx->cur_accum & 0xff), ctx); 669 + ctx->cur_accum >>= 8; 670 + ctx->cur_bits -= 8; 671 + } 672 + flush_char (ctx); 673 + } 674 +} 675 + 676 +static void 677 +cl_block (GifCtx * ctx) 678 +{ 679 + cl_hash ((count_int) hsize, ctx); 680 + ctx->free_ent = ctx->ClearCode + 2; 681 + ctx->clear_flg = 1; 682 + output ((code_int) ctx->ClearCode, ctx); 683 +} 684 + 685 +static int 686 +gifPutWord (int w, xgdIOCtx * out) 687 +{ 688 + xgdPutC (w & 0xFF, out); 689 + xgdPutC ((w >> 8) & 0xFF, out); 690 + return 0; 691 +} 692 + 693 +static void 694 +GIFcompress (int init_bits, xgdIOCtxPtr outfile, gGraphImagePtr img, 695 + GifCtx * ctx) 696 +{ 697 +/* 698 + * compress stdin to stdout 699 + * 700 + * Algorithm: use open addressing double hashing (no chaining) on the 701 + * prefix code / next character combination. We do a variant of Knuth's 702 + * algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime 703 + * secondary probe. Here, the modular division first probe is gives way 704 + * to a faster exclusive-or manipulation. Also do block compression with 705 + * an adaptive reset, whereby the code table is cleared when the compression 706 + * ratio decreases, but after the table fills. The variable-length output 707 + * codes are re-sized at this point, and a special CLEAR code is generated 708 + * for the decompressor. Late addition: construct the table according to 709 + * file size for noticeable speed improvement on small files. Please direct 710 + * questions about this implementation to ames!jaw. 711 + */ 712 + register long fcode; 713 + register code_int i /* = 0 */ ; 714 + register int c; 715 + register code_int ent; 716 + register code_int disp; 717 + register code_int hsize_reg; 718 + register int hshift; 719 + ctx->g_init_bits = init_bits; 720 + ctx->g_outfile = outfile; 721 + ctx->offset = 0; 722 + ctx->out_count = 0; 723 + ctx->clear_flg = 0; 724 + ctx->in_count = 1; 725 + ctx->maxcode = MAXCODE (ctx->n_bits = ctx->g_init_bits); 726 + ctx->ClearCode = (1 << (init_bits - 1)); 727 + ctx->EOFCode = ctx->ClearCode + 1; 728 + ctx->free_ent = ctx->ClearCode + 2; 729 + char_init (ctx); 730 + ent = GIFNextPixel (img, ctx); 731 + hshift = 0; 732 + for (fcode = (long) hsize; fcode < 65536L; fcode *= 2L) 733 + ++hshift; 734 + hshift = 8 - hshift; 735 + hsize_reg = hsize; 736 + cl_hash ((count_int) hsize_reg, ctx); 737 + output ((code_int) ctx->ClearCode, ctx); 738 +#ifdef SIGNED_COMPARE_SLOW 739 + while ((c = GIFNextPixel (img)) != (unsigned) EOF) 740 + { 741 +#else /*SIGNED_COMPARE_SLOW */ 742 + while ((c = GIFNextPixel (img, ctx)) != EOF) 743 + { /* } */ 744 +#endif /*SIGNED_COMPARE_SLOW */ 745 + ++(ctx->in_count); 746 + fcode = (long) (((long) c << maxbits) + ent); 747 + i = (((code_int) c << hshift) ^ ent); 748 + if (HashTabOf (i) == fcode) 749 + { 750 + ent = CodeTabOf (i); 751 + continue; 752 + } 753 + else if ((long) HashTabOf (i) < 0) 754 + goto nomatch; 755 + disp = hsize_reg - i; 756 + if (i == 0) 757 + disp = 1; 758 + probe: 759 + if ((i -= disp) < 0) 760 + i += hsize_reg; 761 + if (HashTabOf (i) == fcode) 762 + { 763 + ent = CodeTabOf (i); 764 + continue; 765 + } 766 + if ((long) HashTabOf (i) > 0) 767 + goto probe; 768 + nomatch: 769 + output ((code_int) ent, ctx); 770 + ++(ctx->out_count); 771 + ent = c; 772 +#ifdef SIGNED_COMPARE_SLOW 773 + if ((unsigned) ctx->free_ent < (unsigned) maxmaxcode) 774 + { 775 +#else /*SIGNED_COMPARE_SLOW */ 776 + if (ctx->free_ent < maxmaxcode) 777 + { 778 +#endif /*SIGNED_COMPARE_SLOW */ 779 + CodeTabOf (i) = ctx->free_ent++; 780 + HashTabOf (i) = fcode; 781 + } 782 + else 783 + cl_block (ctx); 784 + } 785 + output ((code_int) ent, ctx); 786 + ++(ctx->out_count); 787 + output ((code_int) ctx->EOFCode, ctx); 788 +} 789 + 790 +static int 791 +GIFEncode (xgdIOCtxPtr fp, int GInterlace, 792 + int Background, int Transparent, int BitsPerPixel, int *Red, 793 + int *Green, int *Blue, gGraphImagePtr img) 794 +{ 795 + int B; 796 + int RWidth, RHeight; 797 + int LeftOfs, TopOfs; 798 + int Resolution; 799 + int ColorMapSize; 800 + int InitCodeSize; 801 + int i; 802 + int GWidth = img->width; 803 + int GHeight = img->height; 804 + GifCtx ctx; 805 + ctx.Interlace = GInterlace; 806 + ctx.in_count = 1; 807 + memset (&ctx, 0, sizeof (ctx)); 808 + ColorMapSize = 1 << BitsPerPixel; 809 + RWidth = ctx.Width = GWidth; 810 + RHeight = ctx.Height = GHeight; 811 + LeftOfs = TopOfs = 0; 812 + Resolution = BitsPerPixel; 813 + ctx.CountDown = (long) ctx.Width * (long) ctx.Height; 814 + ctx.Pass = 0; 815 + if (BitsPerPixel <= 1) 816 + InitCodeSize = 2; 817 + else 818 + InitCodeSize = BitsPerPixel; 819 + ctx.curx = ctx.cury = 0; 820 + xgdPutBuf (Transparent < 0 ? "GIF87a" : "GIF89a", 6, fp); 821 + gifPutWord (RWidth, fp); 822 + gifPutWord (RHeight, fp); 823 + B = 0x80; 824 + B |= (Resolution - 1) << 5; 825 + B |= (BitsPerPixel - 1); 826 + xgdPutC (B, fp); 827 + xgdPutC (Background, fp); 828 + xgdPutC (0, fp); 829 + for (i = 0; i < ColorMapSize; ++i) 830 + { 831 + xgdPutC (Red[i], fp); 832 + xgdPutC (Green[i], fp); 833 + xgdPutC (Blue[i], fp); 834 + } 835 + if (Transparent >= 0) 836 + { 837 + xgdPutC ('!', fp); 838 + xgdPutC (0xf9, fp); 839 + xgdPutC (4, fp); 840 + xgdPutC (1, fp); 841 + xgdPutC (0, fp); 842 + xgdPutC (0, fp); 843 + xgdPutC ((unsigned char) Transparent, fp); 844 + xgdPutC (0, fp); 845 + } 846 + xgdPutC (',', fp); 847 + gifPutWord (LeftOfs, fp); 848 + gifPutWord (TopOfs, fp); 849 + gifPutWord (ctx.Width, fp); 850 + gifPutWord (ctx.Height, fp); 851 + if (ctx.Interlace) 852 + xgdPutC (0x40, fp); 853 + else 854 + xgdPutC (0x00, fp); 855 + xgdPutC (InitCodeSize, fp); 856 + GIFcompress (InitCodeSize + 1, fp, img, &ctx); 857 + xgdPutC (0, fp); 858 + xgdPutC (';', fp); 859 + return GGRAPH_OK; 860 +} 861 + 862 +static int 863 +colorstobpp (int colors) 864 +{ 865 + int bpp = 0; 866 + 867 + if (colors <= 2) 868 + bpp = 1; 869 + else if (colors <= 4) 870 + bpp = 2; 871 + else if (colors <= 8) 872 + bpp = 3; 873 + else if (colors <= 16) 874 + bpp = 4; 875 + else if (colors <= 32) 876 + bpp = 5; 877 + else if (colors <= 64) 878 + bpp = 6; 879 + else if (colors <= 128) 880 + bpp = 7; 881 + else if (colors <= 256) 882 + bpp = 8; 883 + return bpp; 884 +} 885 + 886 +static gGraphImageInfosPtr 887 +xgdImageInfosFromGifCtx (xgdIOCtxPtr fd, int *errcode) 888 +{ 889 + int BitPixel; 890 + unsigned char buf[16]; 891 + int imw, imh, screen_width, screen_height; 892 + int bitPixel; 893 + gGraphImageInfosPtr infos = NULL; 894 + if (!ReadOK (fd, buf, 6)) 895 + { 896 + *errcode = GGRAPH_GIF_CODEC_ERROR; 897 + return NULL; 898 + } 899 + if (strncmp ((char *) buf, "GIF", 3) != 0) 900 + { 901 + *errcode = GGRAPH_GIF_CODEC_ERROR; 902 + return NULL; 903 + } 904 + if (memcmp ((char *) buf + 3, "87a", 3) == 0 905 + || memcmp ((char *) buf + 3, "89a", 3) == 0) 906 + ; 907 + else 908 + { 909 + *errcode = GGRAPH_GIF_CODEC_ERROR; 910 + return NULL; 911 + } 912 + if (!ReadOK (fd, buf, 7)) 913 + { 914 + *errcode = GGRAPH_GIF_CODEC_ERROR; 915 + return NULL; 916 + } 917 + BitPixel = 2 << (buf[4] & 0x07); 918 + screen_width = imw = LM_to_uint (buf[0], buf[1]); 919 + screen_height = imh = LM_to_uint (buf[2], buf[3]); 920 + bitPixel = colorstobpp (BitPixel); 921 + if (! 922 + (infos = 923 + gg_image_infos_create (GG_PIXEL_PALETTE, screen_width, screen_height, 924 + bitPixel, 1, GGRAPH_SAMPLE_UINT, NULL, NULL))) 925 + { 926 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 927 + return NULL; 928 + } 929 + infos->compression = GGRAPH_TIFF_COMPRESSION_LZW; 930 + if (!infos) 931 + { 932 + *errcode = GGRAPH_GIF_CODEC_ERROR; 933 + return NULL; 934 + } 935 + return infos; 936 +} 937 + 938 +static gGraphImagePtr 939 +xgdImageCreateFromGifCtx (xgdIOCtxPtr fd, int *errcode) 940 +{ 941 + int BitPixel; 942 + int Transparent = (-1); 943 + unsigned char buf[16]; 944 + unsigned char c; 945 + unsigned char ColorMap[3][MAXCOLORMAPSIZE]; 946 + unsigned char localColorMap[3][MAXCOLORMAPSIZE]; 947 + int imw, imh, screen_width, screen_height; 948 + int useGlobalColormap; 949 + int bitPixel; 950 + int ZeroDataBlock = FALSE; 951 + int haveGlobalColormap; 952 + gGraphImagePtr img = NULL; 953 + if (!ReadOK (fd, buf, 6)) 954 + { 955 + *errcode = GGRAPH_GIF_CODEC_ERROR; 956 + return NULL; 957 + } 958 + if (strncmp ((char *) buf, "GIF", 3) != 0) 959 + { 960 + *errcode = GGRAPH_GIF_CODEC_ERROR; 961 + return NULL; 962 + } 963 + if (memcmp ((char *) buf + 3, "87a", 3) == 0 964 + || memcmp ((char *) buf + 3, "89a", 3) == 0) 965 + ; 966 + else 967 + { 968 + *errcode = GGRAPH_GIF_CODEC_ERROR; 969 + return NULL; 970 + } 971 + if (!ReadOK (fd, buf, 7)) 972 + { 973 + *errcode = GGRAPH_GIF_CODEC_ERROR; 974 + return NULL; 975 + } 976 + BitPixel = 2 << (buf[4] & 0x07); 977 + screen_width = imw = LM_to_uint (buf[0], buf[1]); 978 + screen_height = imh = LM_to_uint (buf[2], buf[3]); 979 + haveGlobalColormap = BitSet (buf[4], LOCALCOLORMAP); /* Global Colormap */ 980 + if (haveGlobalColormap) 981 + { 982 + if (ReadColorMap (fd, BitPixel, ColorMap)) 983 + { 984 + *errcode = GGRAPH_GIF_CODEC_ERROR; 985 + return NULL; 986 + } 987 + } 988 + for (;;) 989 + { 990 + int top, left; 991 + int width, height; 992 + if (!ReadOK (fd, &c, 1)) 993 + { 994 + *errcode = GGRAPH_GIF_CODEC_ERROR; 995 + return NULL; 996 + } 997 + if (c == ';') 998 + { 999 + goto terminated; 1000 + } 1001 + 1002 + if (c == '!') 1003 + { 1004 + if (!ReadOK (fd, &c, 1)) 1005 + { 1006 + *errcode = GGRAPH_GIF_CODEC_ERROR; 1007 + return NULL; 1008 + } 1009 + DoExtension (fd, c, &Transparent, &ZeroDataBlock); 1010 + continue; 1011 + } 1012 + 1013 + if (c != ',') 1014 + { 1015 + continue; 1016 + } 1017 + if (!ReadOK (fd, buf, 9)) 1018 + { 1019 + *errcode = GGRAPH_GIF_CODEC_ERROR; 1020 + return NULL; 1021 + } 1022 + useGlobalColormap = !BitSet (buf[8], LOCALCOLORMAP); 1023 + bitPixel = 1 << ((buf[8] & 0x07) + 1); 1024 + left = LM_to_uint (buf[0], buf[1]); 1025 + top = LM_to_uint (buf[2], buf[3]); 1026 + width = LM_to_uint (buf[4], buf[5]); 1027 + height = LM_to_uint (buf[6], buf[7]); 1028 + if (left + width > screen_width || top + height > screen_height) 1029 + { 1030 + *errcode = GGRAPH_GIF_CODEC_ERROR; 1031 + return NULL; 1032 + } 1033 + if (! 1034 + (img = 1035 + gg_image_create (GG_PIXEL_PALETTE, width, height, bitPixel, 1, 1036 + GGRAPH_SAMPLE_UINT, NULL, NULL))) 1037 + { 1038 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 1039 + return NULL; 1040 + } 1041 + if (!useGlobalColormap) 1042 + { 1043 + if (ReadColorMap (fd, bitPixel, localColorMap)) 1044 + { 1045 + gg_image_destroy (img); 1046 + *errcode = GGRAPH_GIF_CODEC_ERROR; 1047 + return NULL; 1048 + } 1049 + ReadImage (img, fd, localColorMap, 1050 + BitSet (buf[8], INTERLACE), &ZeroDataBlock); 1051 + } 1052 + else 1053 + { 1054 + if (!haveGlobalColormap) 1055 + { 1056 + gg_image_destroy (img); 1057 + *errcode = GGRAPH_GIF_CODEC_ERROR; 1058 + return NULL; 1059 + } 1060 + ReadImage (img, fd, 1061 + ColorMap, 1062 + BitSet (buf[8], INTERLACE), &ZeroDataBlock); 1063 + } 1064 + } 1065 + terminated: 1066 + if (!img) 1067 + { 1068 + *errcode = GGRAPH_GIF_CODEC_ERROR; 1069 + return NULL; 1070 + } 1071 + return img; 1072 +} 1073 + 1074 +static int 1075 +xgdImageGifCtx (gGraphImagePtr img, xgdIOCtxPtr out, int is_transparent) 1076 +{ 1077 + int BitsPerPixel; 1078 + int Red[256]; 1079 + int Green[256]; 1080 + int Blue[256]; 1081 + int i, colors; 1082 + int transparent_idx = -1; 1083 + if (img->pixel_format == GG_PIXEL_GRAYSCALE) 1084 + { 1085 + /* generating a GRAYSCALE palette */ 1086 + colors = 256; 1087 + for (i = 0; i < 256; i++) 1088 + { 1089 + Red[i] = i; 1090 + Green[i] = i; 1091 + Blue[i] = i; 1092 + } 1093 + } 1094 + else 1095 + { 1096 + /* copying the PALETTE from image */ 1097 + colors = 0; 1098 + for (i = 0; i < img->max_palette; ++i) 1099 + { 1100 + Red[i] = img->palette_red[i]; 1101 + Green[i] = img->palette_green[i]; 1102 + Blue[i] = img->palette_blue[i]; 1103 + colors++; 1104 + } 1105 + } 1106 + BitsPerPixel = colorstobpp (colors); 1107 + if (is_transparent) 1108 + { 1109 + /* identifying the Transparent Color Index */ 1110 + for (i = 0; i < colors; ++i) 1111 + { 1112 + if (Red[i] == img->transparent_red 1113 + && Green[i] == img->transparent_green 1114 + && Blue[i] == img->transparent_blue) 1115 + transparent_idx = i; 1116 + } 1117 + } 1118 + return GIFEncode (out, 0, 0, transparent_idx, BitsPerPixel, Red, Green, 1119 + Blue, img); 1120 +} 1121 + 1122 +GGRAPH_PRIVATE int 1123 +gg_image_to_gif (const gGraphImagePtr img, void **mem_buf, int *mem_buf_size, 1124 + FILE * file, int dest_type, int is_transparent) 1125 +{ 1126 +/* compressing an image as GIF */ 1127 + int ret; 1128 + void *rv; 1129 + int size; 1130 + xgdIOCtx *out; 1131 + 1132 +/* checkings args for validity */ 1133 + if (dest_type == GG_TARGET_IS_FILE) 1134 + { 1135 + if (!file) 1136 + return GGRAPH_ERROR; 1137 + } 1138 + else 1139 + { 1140 + if (!mem_buf || !mem_buf_size) 1141 + return GGRAPH_ERROR; 1142 + *mem_buf = NULL; 1143 + *mem_buf_size = 0; 1144 + } 1145 + 1146 + if (dest_type == GG_TARGET_IS_FILE) 1147 + out = xgdNewDynamicCtx (0, file, dest_type); 1148 + else 1149 + out = xgdNewDynamicCtx (2048, NULL, dest_type); 1150 + ret = xgdImageGifCtx (img, out, is_transparent); 1151 + if (dest_type == GG_TARGET_IS_FILE) 1152 + { 1153 + out->xgd_free (out); 1154 + return ret; 1155 + } 1156 + 1157 + if (ret == GGRAPH_OK) 1158 + rv = xgdDPExtractData (out, &size); 1159 + out->xgd_free (out); 1160 + *mem_buf = rv; 1161 + *mem_buf_size = size; 1162 + return ret; 1163 +} 1164 + 1165 +GGRAPH_PRIVATE int 1166 +gg_image_from_gif (int size, const void *data, int source_type, 1167 + gGraphImagePtr * image_handle) 1168 +{ 1169 +/* uncompressing a GIF */ 1170 + int errcode = GGRAPH_OK; 1171 + gGraphImagePtr img; 1172 + xgdIOCtx *in = 1173 + xgdNewDynamicCtxEx (size, data, XGD_CTX_DONT_FREE, source_type); 1174 + img = xgdImageCreateFromGifCtx (in, &errcode); 1175 + in->xgd_free (in); 1176 + *image_handle = img; 1177 + return errcode; 1178 +} 1179 + 1180 +GGRAPH_PRIVATE int 1181 +gg_image_infos_from_gif (int size, const void *data, int source_type, 1182 + gGraphImageInfosPtr * infos_handle) 1183 +{ 1184 +/* image infos from GIF */ 1185 + int errcode = GGRAPH_OK; 1186 + gGraphImageInfosPtr infos; 1187 + xgdIOCtx *in = 1188 + xgdNewDynamicCtxEx (size, data, XGD_CTX_DONT_FREE, source_type); 1189 + infos = xgdImageInfosFromGifCtx (in, &errcode); 1190 + in->xgd_free (in); 1191 + *infos_handle = infos; 1192 + return errcode; 1193 +}
Added src/gaiagraphics_grids.c.
1 +/* 2 +/ gaiagraphics_grids.c 3 +/ 4 +/ GRIDS auxiliary helpers 5 +/ 6 +/ version 1.0, 2010 July 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2010 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdio.h> 28 +#include <math.h> 29 +#include <float.h> 30 +#include <limits.h> 31 +#include <string.h> 32 +#include <stdlib.h> 33 + 34 +#include "gaiagraphics.h" 35 +#include "gaiagraphics_internals.h" 36 + 37 +#define GRID_HGT_3 1 38 +#define GRID_HGT_1 2 39 +#define GRID_BIN_HDR 3 40 +#define GRID_FLT_HDR 4 41 +#define GRID_DEM_HDR 5 42 +#define GRID_ASCII 6 43 + 44 +struct grid_codec_data 45 +{ 46 +/* a struct used by GRID codec */ 47 + int grid_type; 48 + int is_writer; 49 + int little_endian; 50 + void *grid_buffer; 51 + long *row_offsets; 52 +}; 53 + 54 +GGRAPH_PRIVATE int 55 +gg_image_strip_prepare_from_hgt (FILE * in, int lon, int lat, 56 + gGraphStripImagePtr * image_handle) 57 +{ 58 +/* preparing to decode an HGT-GRID [by strips] */ 59 + gGraphStripImagePtr img = NULL; 60 + struct grid_codec_data *grid_codec = NULL; 61 + long file_length; 62 + int type; 63 + int width; 64 + int height; 65 + double pixel_size; 66 + double half_pixel; 67 + int buf_size; 68 + void *grid_buffer = NULL; 69 + int ret = GGRAPH_HGT_CODEC_ERROR; 70 + *image_handle = NULL; 71 + 72 +/* retrieving the HGT dimensions */ 73 + if (fseek (in, 0, SEEK_END) != 0) 74 + return GGRAPH_HGT_CODEC_ERROR; 75 + file_length = ftell (in); 76 + if (file_length == (1201 * 1201 * sizeof (short))) 77 + { 78 + type = GRID_HGT_3; 79 + width = 1201; 80 + height = 1201; 81 + pixel_size = 1.0 / 1200.0; 82 + } 83 + else if (file_length == (3601 * 3601 * sizeof (short))) 84 + { 85 + type = GRID_HGT_1; 86 + width = 3601; 87 + height = 3601; 88 + pixel_size = 1.0 / 3600.0; 89 + } 90 + else 91 + return GGRAPH_HGT_CODEC_ERROR; 92 + 93 + img = 94 + gg_strip_image_create (in, GGRAPH_IMAGE_HGT, GG_PIXEL_GRID, width, 95 + height, 16, 1, GGRAPH_SAMPLE_INT, "WGS 84", 96 + "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"); 97 + if (!img) 98 + { 99 + ret = GGRAPH_INSUFFICIENT_MEMORY; 100 + goto error; 101 + } 102 +/* setting up georeferencing infos */ 103 + half_pixel = pixel_size / 2.0; 104 + img->is_georeferenced = 1; 105 + img->srid = 4326; 106 + img->upper_left_x = (double) lon - half_pixel; 107 + img->upper_left_y = (double) lat + 1.0 + half_pixel; 108 + img->pixel_x_size = pixel_size; 109 + img->pixel_y_size = pixel_size; 110 + img->no_data_value = SHRT_MIN; 111 + 112 +/* setting up the GRID codec struct */ 113 + grid_codec = malloc (sizeof (struct grid_codec_data)); 114 + if (!grid_codec) 115 + goto error; 116 + grid_codec->grid_type = type; 117 + grid_codec->is_writer = 0; 118 + grid_codec->grid_buffer = NULL; 119 + grid_codec->row_offsets = NULL; 120 + img->codec_data = grid_codec; 121 + 122 +/* allocating the GRID read buffer */ 123 + buf_size = sizeof (short) * width; 124 + grid_buffer = malloc (buf_size); 125 + if (!grid_buffer) 126 + goto error; 127 + grid_codec->grid_buffer = grid_buffer; 128 + 129 + *image_handle = img; 130 + return GGRAPH_OK; 131 + 132 + error: 133 + if (img) 134 + gGraphDestroyImage (img); 135 + return ret; 136 +} 137 + 138 +GGRAPH_PRIVATE void 139 +gg_grid_codec_destroy (void *p) 140 +{ 141 +/* destroyng the GRID codec data */ 142 + struct grid_codec_data *codec = (struct grid_codec_data *) p; 143 + if (!codec) 144 + return; 145 + if (codec->grid_buffer) 146 + free (codec->grid_buffer); 147 + if (codec->row_offsets) 148 + free (codec->row_offsets); 149 + free (codec); 150 +} 151 + 152 +static int 153 +read_from_hgt (FILE * in, gGraphStripImagePtr img, void *scanline) 154 +{ 155 +/* decoding an HGT-GRID [by strip] */ 156 + int width = img->width; 157 + int height = img->height; 158 + size_t scan_size = width * 2; 159 + int row; 160 + int incr = 0; 161 + int x; 162 + int endian_arch = gg_endian_arch (); 163 + off_t pos = img->next_row * scan_size; 164 + unsigned char *p_in; 165 + short *p_out; 166 + short cell_value; 167 + 168 +/* positioning on the start scanline */ 169 + if (fseek (in, pos, SEEK_SET) != 0) 170 + return GGRAPH_HGT_CODEC_ERROR; 171 + for (row = 0; row < img->rows_per_block; row++) 172 + { 173 + /* reading the required number of scanlines */ 174 + if ((row + img->next_row) >= height) 175 + break; 176 + if (fread (scanline, 1, scan_size, in) != scan_size) 177 + return GGRAPH_HGT_CODEC_ERROR; 178 + p_in = scanline; 179 + p_out = (short *) (img->pixels); 180 + p_out += (row * width); 181 + for (x = 0; x < width; x++) 182 + { 183 + cell_value = gg_import_int16 (p_in, 0, endian_arch); 184 + *p_out++ = cell_value; 185 + p_in += sizeof (short); 186 + } 187 + incr++; 188 + } 189 + img->next_row += incr; 190 + img->current_available_rows = incr; 191 + return GGRAPH_OK; 192 +} 193 + 194 +GGRAPH_PRIVATE int 195 +gg_image_strip_read_from_hgt (gGraphStripImagePtr img, int *progress) 196 +{ 197 +/* decoding an HGT-GRID [by strip] */ 198 + struct grid_codec_data *grid_codec = 199 + (struct grid_codec_data *) (img->codec_data); 200 + FILE *in = img->file_handle; 201 + 202 + if (grid_codec->grid_type == GRID_HGT_1 203 + || grid_codec->grid_type == GRID_HGT_3) 204 + { 205 + int ret = read_from_hgt (in, img, grid_codec->grid_buffer); 206 + if (ret == GGRAPH_OK && progress != NULL) 207 + *progress = 208 + (int) (((double) (img->next_row + 1) * 100.0) / 209 + (double) (img->height)); 210 + return ret; 211 + } 212 + return GGRAPH_ERROR; 213 +} 214 + 215 +GGRAPH_DECLARE int 216 +gGraphCheckHgtPath (const char *path, int *lat, int *lon) 217 +{ 218 +/* checking for HGT format - retrieving coord from path */ 219 + char file_name[1024]; 220 + char coord_lat[8]; 221 + char coord_lon[8]; 222 + int lat_sign = 1; 223 + int lon_sign = 1; 224 + int i; 225 + int start = 0; 226 + 227 + for (i = strlen (path) - 1; i >= 0; i--) 228 + { 229 + /* attempting to extract the file name */ 230 + if (path[i] == '/' || path[i] == '\\') 231 + { 232 + start = i + 1; 233 + break; 234 + } 235 + } 236 + strcpy (file_name, path + start); 237 + 238 + if (strlen (file_name) != 11) 239 + return GGRAPH_ERROR; 240 + if (file_name[0] == 'N') 241 + ; 242 + else if (file_name[0] == 'S') 243 + lat_sign = -1; 244 + else 245 + return GGRAPH_ERROR; 246 + if (file_name[1] >= '0' && file_name[1] <= '9') 247 + coord_lat[0] = file_name[1]; 248 + else 249 + return GGRAPH_ERROR; 250 + if (file_name[2] >= '0' && file_name[2] <= '9') 251 + { 252 + coord_lat[1] = file_name[2]; 253 + coord_lat[2] = '\0'; 254 + } 255 + else 256 + return GGRAPH_ERROR; 257 + if (file_name[3] == 'E') 258 + ; 259 + else if (file_name[3] == 'W') 260 + lon_sign = -1; 261 + else 262 + return GGRAPH_ERROR; 263 + if (file_name[4] >= '0' && file_name[4] <= '9') 264 + coord_lon[0] = file_name[4]; 265 + else 266 + return GGRAPH_ERROR; 267 + if (file_name[5] >= '0' && file_name[5] <= '9') 268 + coord_lon[1] = file_name[5]; 269 + if (file_name[6] >= '0' && file_name[6] <= '9') 270 + { 271 + coord_lon[2] = file_name[6]; 272 + coord_lon[3] = '\0'; 273 + } 274 + else 275 + return GGRAPH_ERROR; 276 + if (file_name[7] != '.') 277 + return GGRAPH_ERROR; 278 + if (file_name[8] != 'h') 279 + return GGRAPH_ERROR; 280 + if (file_name[9] != 'g') 281 + return GGRAPH_ERROR; 282 + if (file_name[10] != 't') 283 + return GGRAPH_ERROR; 284 +/* ok, it's an HGT file */ 285 + *lat = atoi (coord_lat) * lat_sign; 286 + *lon = atoi (coord_lon) * lon_sign; 287 + return GGRAPH_OK; 288 +} 289 + 290 +GGRAPH_DECLARE int 291 +gGraphImageInfosFromHgtFile (const char *path, int lat, int lon, 292 + const void **infos_handle) 293 +{ 294 +/* retrieving Image infos from HGT file */ 295 + FILE *in = NULL; 296 + gGraphImageInfosPtr infos = NULL; 297 + long file_length; 298 + int width; 299 + int height; 300 + double pixel_size; 301 + double half_pixel; 302 + 303 + *infos_handle = NULL; 304 + 305 +/* attempting to open the image file */ 306 + in = fopen (path, "rb"); 307 + if (in == NULL) 308 + return GGRAPH_FILE_OPEN_ERROR; 309 + 310 +/* retrieving the HGT dimensions */ 311 + if (fseek (in, 0, SEEK_END) != 0) 312 + return GGRAPH_HGT_CODEC_ERROR; 313 + file_length = ftell (in); 314 + if (file_length == (1201 * 1201 * sizeof (short))) 315 + { 316 + width = 1201; 317 + height = 1201; 318 + pixel_size = 1.0 / 1200.0; 319 + } 320 + else if (file_length == (3601 * 3601 * sizeof (short))) 321 + { 322 + width = 3601; 323 + height = 3601; 324 + pixel_size = 1.0 / 3600.0; 325 + } 326 + else 327 + { 328 + fclose (in); 329 + return GGRAPH_HGT_CODEC_ERROR; 330 + } 331 + fclose (in); 332 + 333 + infos = 334 + gg_image_infos_create (GG_PIXEL_GRID, width, height, 16, 1, 335 + GGRAPH_SAMPLE_INT, "WGS 84", 336 + "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"); 337 + if (!infos) 338 + return GGRAPH_INSUFFICIENT_MEMORY; 339 + 340 +/* setting up georeferencing infos */ 341 + half_pixel = pixel_size / 2.0; 342 + infos->is_georeferenced = 1; 343 + infos->srid = 4326; 344 + infos->upper_left_x = (double) lon - half_pixel; 345 + infos->upper_left_y = (double) lat + 1.0 + half_pixel; 346 + infos->pixel_x_size = pixel_size; 347 + infos->pixel_y_size = pixel_size; 348 + infos->no_data_value = SHRT_MIN; 349 + 350 + *infos_handle = infos; 351 + return GGRAPH_OK; 352 +} 353 + 354 +GGRAPH_DECLARE int 355 +gGraphCheckBinPath (const char *path, char *hdr_path, int dont_test) 356 +{ 357 +/* checking for BIN+HDR format */ 358 + char naked_path[1024]; 359 + int i; 360 + int start = 0; 361 + FILE *in; 362 + 363 + *hdr_path = '\0'; 364 + for (i = strlen (path) - 1; i >= 0; i--) 365 + { 366 + /* attempting to extract the file name */ 367 + if (path[i] == '.') 368 + { 369 + start = i; 370 + break; 371 + } 372 + } 373 + strcpy (naked_path, path); 374 + if (strcasecmp (path + start, ".bin") != 0) 375 + return GGRAPH_ERROR; 376 + naked_path[start] = '\0'; 377 + strcat (naked_path, ".hdr"); 378 + if (dont_test) 379 + { 380 + strcpy (hdr_path, naked_path); 381 + return GGRAPH_OK; 382 + } 383 + 384 + in = fopen (naked_path, "rb"); 385 + if (in != NULL) 386 + { 387 + fclose (in); 388 + strcpy (hdr_path, naked_path); 389 + return GGRAPH_OK; 390 + } 391 + naked_path[start] = '\0'; 392 + strcat (naked_path, ".HDR"); 393 + in = fopen (naked_path, "rb"); 394 + if (in != NULL) 395 + { 396 + fclose (in); 397 + strcpy (hdr_path, naked_path); 398 + return GGRAPH_OK; 399 + } 400 + 401 + return GGRAPH_ERROR; 402 +} 403 + 404 +GGRAPH_DECLARE int 405 +gGraphCheckFltPath (const char *path, char *hdr_path, int dont_test) 406 +{ 407 +/* checking for FLT+HDR format */ 408 + char naked_path[1024]; 409 + int i; 410 + int start = 0; 411 + FILE *in; 412 + 413 + *hdr_path = '\0'; 414 + for (i = strlen (path) - 1; i >= 0; i--) 415 + { 416 + /* attempting to extract the file name */ 417 + if (path[i] == '.') 418 + { 419 + start = i; 420 + break; 421 + } 422 + } 423 + strcpy (naked_path, path); 424 + if (strcasecmp (path + start, ".flt") != 0) 425 + return GGRAPH_ERROR; 426 + naked_path[start] = '\0'; 427 + strcat (naked_path, ".hdr"); 428 + if (dont_test) 429 + { 430 + strcpy (hdr_path, naked_path); 431 + return GGRAPH_OK; 432 + } 433 + 434 + in = fopen (naked_path, "rb"); 435 + if (in != NULL) 436 + { 437 + fclose (in); 438 + strcpy (hdr_path, naked_path); 439 + return GGRAPH_OK; 440 + } 441 + naked_path[start] = '\0'; 442 + strcat (naked_path, ".HDR"); 443 + in = fopen (naked_path, "rb"); 444 + if (in != NULL) 445 + { 446 + fclose (in); 447 + strcpy (hdr_path, naked_path); 448 + return GGRAPH_OK; 449 + } 450 + 451 + return GGRAPH_ERROR; 452 +} 453 + 454 +GGRAPH_DECLARE int 455 +gGraphCheckDemPath (const char *path, char *hdr_path, int dont_test) 456 +{ 457 +/* checking for DEM+HDR format */ 458 + char naked_path[1024]; 459 + int i; 460 + int start = 0; 461 + FILE *in; 462 + 463 + *hdr_path = '\0'; 464 + for (i = strlen (path) - 1; i >= 0; i--) 465 + { 466 + /* attempting to extract the file name */ 467 + if (path[i] == '.') 468 + { 469 + start = i; 470 + break; 471 + } 472 + } 473 + strcpy (naked_path, path); 474 + if (strcasecmp (path + start, ".dem") != 0) 475 + return GGRAPH_ERROR; 476 + naked_path[start] = '\0'; 477 + strcat (naked_path, ".hdr"); 478 + if (dont_test) 479 + { 480 + strcpy (hdr_path, naked_path); 481 + return GGRAPH_OK; 482 + } 483 + 484 + in = fopen (naked_path, "rb"); 485 + if (in != NULL) 486 + { 487 + fclose (in); 488 + strcpy (hdr_path, naked_path); 489 + return GGRAPH_OK; 490 + } 491 + naked_path[start] = '\0'; 492 + strcat (naked_path, ".HDR"); 493 + in = fopen (naked_path, "rb"); 494 + if (in != NULL) 495 + { 496 + fclose (in); 497 + strcpy (hdr_path, naked_path); 498 + return GGRAPH_OK; 499 + } 500 + 501 + return GGRAPH_ERROR; 502 +} 503 + 504 +GGRAPH_DECLARE int 505 +gGraphCheckAscPath (const char *path) 506 +{ 507 +/* checking for ASC format */ 508 + int i; 509 + int start = 0; 510 + 511 + for (i = strlen (path) - 1; i >= 0; i--) 512 + { 513 + /* attempting to extract the file name */ 514 + if (path[i] == '.') 515 + { 516 + start = i; 517 + break; 518 + } 519 + } 520 + if (strcasecmp (path + start, ".asc") != 0) 521 + return GGRAPH_ERROR; 522 + return GGRAPH_OK; 523 +} 524 + 525 +static char * 526 +string_tokenizer (char *string, char *delimiters, char **ptr) 527 +{ 528 +/* breaking a string into distinct tokens */ 529 + char *start = NULL; 530 + char *p; 531 + if (*ptr != NULL) 532 + p = *ptr; 533 + else 534 + p = string; 535 + 536 + if (p == NULL) 537 + return NULL; 538 + 539 + while (1) 540 + { 541 + int sep = 0; 542 + char *pd = delimiters; 543 + 544 + if (*p == '\0') 545 + { 546 + /* last token end */ 547 + *ptr = p; 548 + break; 549 + } 550 + 551 + while (*pd != '\0') 552 + { 553 + if (*p == *pd) 554 + { 555 + /* found a separator char */ 556 + sep = 1; 557 + break; 558 + } 559 + pd++; 560 + } 561 + if (sep) 562 + { 563 + if (start) 564 + { 565 + /* token end */ 566 + *p = '\0'; 567 + *ptr = p + 1; 568 + break; 569 + } 570 + } 571 + else 572 + { 573 + if (!start) 574 + { 575 + /* token start */ 576 + start = p; 577 + } 578 + } 579 + p++; 580 + } 581 + 582 + return start; 583 +} 584 + 585 +static int 586 +cvtToInt (const char *str, int *value) 587 +{ 588 +/* attempting to convert from string to int */ 589 + const char *p = str; 590 + int error = 0; 591 + int digits = 0; 592 + int sign = 0; 593 + while (*p != '\0') 594 + { 595 + if (*p >= '0' && *p <= '9') 596 + digits++; 597 + else if (*p == '-' || *p == '+') 598 + { 599 + if (digits == 0) 600 + sign++; 601 + else 602 + error = 1; 603 + } 604 + else 605 + error = 1; 606 + p++; 607 + } 608 + if (digits > 0 && sign < 2 && error == 0) 609 + { 610 + *value = atoi (str); 611 + return 1; 612 + } 613 + return 0; 614 +} 615 + 616 +static int 617 +cvtToDouble (const char *str, double *value) 618 +{ 619 +/* attempting to convert from string to double */ 620 + const char *p = str; 621 + int error = 0; 622 + int digits = 0; 623 + int comma = 0; 624 + int sign = 0; 625 + while (*p != '\0') 626 + { 627 + if (*p >= '0' && *p <= '9') 628 + digits++; 629 + else if (*p == '.') 630 + comma++; 631 + else if (*p == '-' || *p == '+') 632 + { 633 + if (digits == 0) 634 + sign++; 635 + else 636 + error = 1; 637 + } 638 + else 639 + error = 1; 640 + p++; 641 + } 642 + if (digits > 0 && sign < 2 && comma < 2 && error == 0) 643 + { 644 + *value = atof (str); 645 + return 1; 646 + } 647 + return 0; 648 +} 649 + 650 +static int 651 +parse_binflt_hdr (const char *hdr_path, int *width, int *height, 652 + int *bits_per_sample, int *sample, int *endian, 653 + double *no_data, double *min, double *max, double *ulx, 654 + double *uly, double *pixel_x_size, double *pixel_y_size, 655 + int *expected_length) 656 +{ 657 +/* parsing an HDR file [BIN or FLT format] */ 658 + FILE *hdr = NULL; 659 + int s_width = INT_MIN; 660 + int s_height = INT_MIN; 661 + int sample_format = GGRAPH_SAMPLE_UNKNOWN; 662 + int sample_bits = INT_MIN; 663 + double no_data_value = DBL_MAX; 664 + double x_pixel_size = DBL_MAX; 665 + double y_pixel_size = DBL_MAX; 666 + double lower_left_x = DBL_MAX; 667 + double lower_left_y = DBL_MAX; 668 + double min_value = DBL_MAX; 669 + double max_value = DBL_MIN; 670 + int little_endian = 0; 671 + int c; 672 + int i_tk; 673 + char *saveptr; 674 + char hdr_buf[1024]; 675 + char *token; 676 + char keyword[1024]; 677 + char value[1024]; 678 + char *p_hdr; 679 + int cvt_int; 680 + double cvt_dbl; 681 + int x_centered; 682 + int y_centered; 683 + double half_pixel; 684 + 685 +/* opening the HDR header file */ 686 + hdr = fopen (hdr_path, "rb"); 687 + if (hdr == NULL) 688 + return 0; 689 + 690 + p_hdr = hdr_buf; 691 + while ((c = getc (hdr)) != EOF) 692 + { 693 + /* parsing the Header file */ 694 + if (c == '\r') 695 + continue; 696 + if (c == '\n') 697 + { 698 + *p_hdr = '\0'; 699 + if (*hdr_buf == '\0') 700 + { 701 + /* skipping empty lines */ 702 + p_hdr = hdr_buf; 703 + continue; 704 + } 705 + /* breaking the string into separate tokens */ 706 + i_tk = 0; 707 + saveptr = NULL; 708 + while (1) 709 + { 710 + token = string_tokenizer (hdr_buf, " \t", &saveptr); 711 + if (token == NULL) 712 + break; 713 + if (*token == '\0') 714 + continue; 715 + if (i_tk == 0) 716 + { 717 + strcpy (keyword, token); 718 + i_tk++; 719 + continue; 720 + } 721 + 722 + strcpy (value, token); 723 + i_tk++; 724 + } 725 + 726 + if (i_tk != 2) 727 + goto stop; 728 + if (strcasecmp (keyword, "BYTEORDER") == 0) 729 + { 730 + if (strcasecmp (value, "LSBFIRST") == 0) 731 + little_endian = 1; 732 + else 733 + little_endian = 0; 734 + } 735 + else if (strcasecmp (keyword, "NROWS") == 0) 736 + { 737 + if (!cvtToInt (value, &cvt_int)) 738 + goto stop; 739 + s_height = cvt_int; 740 + } 741 + else if (strcasecmp (keyword, "NCOLS") == 0) 742 + { 743 + if (!cvtToInt (value, &cvt_int)) 744 + goto stop; 745 + s_width = cvt_int; 746 + } 747 + else if (strcasecmp (keyword, "NUMBERTYPE") == 0) 748 + { 749 + if (strcasecmp (value, "2_BYTE_INTEGER") == 0) 750 + { 751 + sample_format = GGRAPH_SAMPLE_INT; 752 + sample_bits = 16; 753 + } 754 + else if (strcasecmp (value, "4_BYTE_INTEGER") == 0) 755 + { 756 + sample_format = GGRAPH_SAMPLE_INT; 757 + sample_bits = 32; 758 + } 759 + else if (strcasecmp (value, "4_BYTE_FLOAT") == 0) 760 + { 761 + sample_format = GGRAPH_SAMPLE_FLOAT; 762 + sample_bits = 32; 763 + } 764 + else if (strcasecmp (value, "8_BYTE_FLOAT") == 0) 765 + { 766 + sample_format = GGRAPH_SAMPLE_FLOAT; 767 + sample_bits = 64; 768 + } 769 + else 770 + goto stop; 771 + } 772 + else if (strcasecmp (keyword, "NODATA_VALUE") == 0) 773 + { 774 + if (!cvtToDouble (value, &cvt_dbl)) 775 + goto stop; 776 + no_data_value = cvt_dbl; 777 + } 778 + else if (strcasecmp (keyword, "XLLCENTER") == 0) 779 + { 780 + if (!cvtToDouble (value, &cvt_dbl)) 781 + goto stop; 782 + lower_left_x = cvt_dbl; 783 + x_centered = 1; 784 + } 785 + else if (strcasecmp (keyword, "XLLCORNER") == 0) 786 + { 787 + if (!cvtToDouble (value, &cvt_dbl)) 788 + goto stop; 789 + lower_left_x = cvt_dbl; 790 + x_centered = 0; 791 + } 792 + else if (strcasecmp (keyword, "YLLCENTER") == 0) 793 + { 794 + if (!cvtToDouble (value, &cvt_dbl)) 795 + goto stop; 796 + lower_left_y = cvt_dbl; 797 + y_centered = 1; 798 + } 799 + else if (strcasecmp (keyword, "YLLCORNER") == 0) 800 + { 801 + if (!cvtToDouble (value, &cvt_dbl)) 802 + goto stop; 803 + lower_left_y = cvt_dbl; 804 + y_centered = 0; 805 + } 806 + else if (strcasecmp (keyword, "CELLSIZE") == 0) 807 + { 808 + if (!cvtToDouble (value, &cvt_dbl)) 809 + goto stop; 810 + x_pixel_size = cvt_dbl; 811 + y_pixel_size = cvt_dbl; 812 + } 813 + else if (strcasecmp (keyword, "ZUNITS") == 0) 814 + { 815 + /* ignoring */ 816 + } 817 + else if (strcasecmp (keyword, "MIN_VALUE") == 0) 818 + { 819 + if (!cvtToDouble (value, &cvt_dbl)) 820 + goto stop; 821 + min_value = cvt_dbl; 822 + } 823 + else if (strcasecmp (keyword, "MAX_VALUE") == 0) 824 + { 825 + if (!cvtToDouble (value, &cvt_dbl)) 826 + goto stop; 827 + max_value = cvt_dbl; 828 + } 829 + else 830 + { 831 + /* unrecognized tag */ 832 + goto stop; 833 + } 834 + p_hdr = hdr_buf; 835 + continue; 836 + } 837 + *p_hdr++ = c; 838 + if (p_hdr - hdr_buf > 1024) 839 + goto stop; 840 + } 841 + fclose (hdr); 842 + hdr = NULL; 843 + 844 + if (s_width <= 0 || s_height <= 0 || sample_bits <= 0) 845 + goto stop; 846 + if (sample_format == GGRAPH_SAMPLE_UNKNOWN) 847 + goto stop; 848 + if (no_data_value == INT_MAX) 849 + goto stop; 850 + if (x_pixel_size == DBL_MAX || y_pixel_size == DBL_MAX) 851 + goto stop; 852 + if (lower_left_x == DBL_MAX || lower_left_y == DBL_MAX) 853 + goto stop; 854 + if (min_value == DBL_MAX || max_value == DBL_MIN) 855 + goto stop; 856 + 857 + *width = s_width; 858 + *height = s_height; 859 + *sample = sample_format; 860 + *bits_per_sample = sample_bits; 861 + *endian = little_endian; 862 + *no_data = no_data_value; 863 + *ulx = lower_left_x; 864 + half_pixel = x_pixel_size / 2.0; 865 + if (x_centered) 866 + *ulx -= half_pixel; 867 + *uly = lower_left_y + ((double) s_height * y_pixel_size); 868 + half_pixel = y_pixel_size / 2.0; 869 + if (y_centered) 870 + *uly += half_pixel; 871 + *pixel_x_size = x_pixel_size; 872 + *pixel_y_size = y_pixel_size; 873 + *min = min_value; 874 + *max = max_value; 875 + if (sample_bits == 16) 876 + *expected_length = s_width * s_height * 2; 877 + else if (sample_bits == 32) 878 + *expected_length = s_width * s_height * 4; 879 + else if (sample_bits == 64) 880 + *expected_length = s_width * s_height * 8; 881 + else 882 + *expected_length = -1; 883 + return 1; 884 + 885 + stop: 886 + if (hdr) 887 + fclose (hdr); 888 + return 0; 889 +} 890 + 891 +GGRAPH_DECLARE int 892 +gGraphImageInfosFromBinFile (const char *path, const char *hdr_path, 893 + const void **infos_handle) 894 +{ 895 +/* retrieving Image infos from BIN+HDR file */ 896 + FILE *in = NULL; 897 + gGraphImageInfosPtr infos = NULL; 898 + long file_length; 899 + int expected_length; 900 + int width; 901 + int height; 902 + double ulx; 903 + double uly; 904 + double pixel_x_size; 905 + double pixel_y_size; 906 + int sample; 907 + int bits_per_sample; 908 + int endian; 909 + double no_data; 910 + double min; 911 + double max; 912 + 913 + *infos_handle = NULL; 914 + 915 + if (!parse_binflt_hdr 916 + (hdr_path, &width, &height, &bits_per_sample, &sample, &endian, 917 + &no_data, &min, &max, &ulx, &uly, &pixel_x_size, &pixel_y_size, 918 + &expected_length)) 919 + return GGRAPH_BIN_CODEC_ERROR; 920 + 921 +/* attempting to open the image file */ 922 + in = fopen (path, "rb"); 923 + if (in == NULL) 924 + return GGRAPH_FILE_OPEN_ERROR; 925 + 926 +/* retrieving the BIN dimensions */ 927 + if (fseek (in, 0, SEEK_END) != 0) 928 + return GGRAPH_BIN_CODEC_ERROR; 929 + file_length = ftell (in); 930 + if (file_length != expected_length) 931 + { 932 + fclose (in); 933 + return GGRAPH_BIN_CODEC_ERROR; 934 + } 935 + fclose (in); 936 + 937 + infos = 938 + gg_image_infos_create (GG_PIXEL_GRID, width, height, bits_per_sample, 1, 939 + sample, NULL, NULL); 940 + if (!infos) 941 + return GGRAPH_INSUFFICIENT_MEMORY; 942 + 943 +/* setting up georeferencing infos */ 944 + infos->is_georeferenced = 1; 945 + infos->upper_left_x = ulx; 946 + infos->upper_left_y = uly; 947 + infos->pixel_x_size = pixel_x_size; 948 + infos->pixel_y_size = pixel_y_size; 949 + infos->no_data_value = no_data; 950 + infos->min_value = min; 951 + infos->max_value = max; 952 + 953 + *infos_handle = infos; 954 + return GGRAPH_OK; 955 +} 956 + 957 +GGRAPH_DECLARE int 958 +gGraphImageInfosFromFltFile (const char *path, const char *hdr_path, 959 + const void **infos_handle) 960 +{ 961 +/* retrieving Image infos from FLT+HDR file */ 962 + FILE *in = NULL; 963 + gGraphImageInfosPtr infos = NULL; 964 + long file_length; 965 + int expected_length; 966 + int width; 967 + int height; 968 + double ulx; 969 + double uly; 970 + double pixel_x_size; 971 + double pixel_y_size; 972 + int sample; 973 + int bits_per_sample; 974 + int endian; 975 + double no_data; 976 + double min; 977 + double max; 978 + 979 + *infos_handle = NULL; 980 + 981 + if (!parse_binflt_hdr 982 + (hdr_path, &width, &height, &bits_per_sample, &sample, &endian, 983 + &no_data, &min, &max, &ulx, &uly, &pixel_x_size, &pixel_y_size, 984 + &expected_length)) 985 + return GGRAPH_FLT_CODEC_ERROR; 986 + 987 +/* attempting to open the image file */ 988 + in = fopen (path, "rb"); 989 + if (in == NULL) 990 + return GGRAPH_FILE_OPEN_ERROR; 991 + 992 +/* retrieving the FLT dimensions */ 993 + if (fseek (in, 0, SEEK_END) != 0) 994 + return GGRAPH_FLT_CODEC_ERROR; 995 + file_length = ftell (in); 996 + if (file_length != expected_length) 997 + { 998 + fclose (in); 999 + return GGRAPH_FLT_CODEC_ERROR; 1000 + } 1001 + fclose (in); 1002 + 1003 + infos = 1004 + gg_image_infos_create (GG_PIXEL_GRID, width, height, bits_per_sample, 1, 1005 + sample, NULL, NULL); 1006 + if (!infos) 1007 + return GGRAPH_INSUFFICIENT_MEMORY; 1008 + 1009 +/* setting up georeferencing infos */ 1010 + infos->is_georeferenced = 1; 1011 + infos->upper_left_x = ulx; 1012 + infos->upper_left_y = uly; 1013 + infos->pixel_x_size = pixel_x_size; 1014 + infos->pixel_y_size = pixel_y_size; 1015 + infos->no_data_value = no_data; 1016 + infos->min_value = min; 1017 + infos->max_value = max; 1018 + 1019 + *infos_handle = infos; 1020 + return GGRAPH_OK; 1021 +} 1022 + 1023 +static int 1024 +parse_dem_hdr (const char *hdr_path, int *width, int *height, 1025 + int *bits_per_sample, int *sample, int *endian, double *no_data, 1026 + double *ulx, double *uly, double *pixel_x_size, 1027 + double *pixel_y_size, int *expected_length) 1028 +{ 1029 +/* parsing an HDR file [DEM format] */ 1030 + FILE *hdr = NULL; 1031 + int s_width = INT_MIN; 1032 + int s_height = INT_MIN; 1033 + int sample_format = GGRAPH_SAMPLE_UNKNOWN; 1034 + int sample_bits = INT_MIN; 1035 + double no_data_value = DBL_MAX; 1036 + double x_pixel_size = DBL_MAX; 1037 + double y_pixel_size = DBL_MAX; 1038 + double upper_left_x = DBL_MAX; 1039 + double upper_left_y = DBL_MAX; 1040 + int band_row_bytes = INT_MIN; 1041 + int total_row_bytes = INT_MIN; 1042 + int little_endian = 0; 1043 + int c; 1044 + int i_tk; 1045 + char *saveptr; 1046 + char hdr_buf[1024]; 1047 + char *token; 1048 + char keyword[1024]; 1049 + char value[1024]; 1050 + char *p_hdr; 1051 + int cvt_int; 1052 + double cvt_dbl; 1053 + 1054 +/* opening the HDR header file */ 1055 + hdr = fopen (hdr_path, "rb"); 1056 + if (hdr == NULL) 1057 + return 0; 1058 + 1059 + p_hdr = hdr_buf; 1060 + while ((c = getc (hdr)) != EOF) 1061 + { 1062 + /* parsing the Header file */ 1063 + if (c == '\r' || c == '\n') 1064 + { 1065 + *p_hdr = '\0'; 1066 + if (*hdr_buf == '\0') 1067 + { 1068 + /* skipping empty lines */ 1069 + p_hdr = hdr_buf; 1070 + continue; 1071 + } 1072 + /* breaking the string into separate tokens */ 1073 + i_tk = 0; 1074 + saveptr = NULL; 1075 + while (1) 1076 + { 1077 + token = string_tokenizer (hdr_buf, " \t", &saveptr); 1078 + if (token == NULL) 1079 + break; 1080 + if (*token == '\0') 1081 + continue; 1082 + if (i_tk == 0) 1083 + { 1084 + strcpy (keyword, token); 1085 + i_tk++; 1086 + continue; 1087 + } 1088 + 1089 + strcpy (value, token); 1090 + i_tk++; 1091 + } 1092 + 1093 + if (i_tk != 2) 1094 + goto stop; 1095 + if (strcasecmp (keyword, "BYTEORDER") == 0) 1096 + { 1097 + if (strcasecmp (value, "M") == 0) 1098 + little_endian = 0; 1099 + else 1100 + little_endian = 1; 1101 + } 1102 + else if (strcasecmp (keyword, "LAYOUT") == 0) 1103 + { 1104 + /* Bands organization: only Band Interleave by Line is supported */ 1105 + if (strcasecmp (value, "BIL") != 0) 1106 + goto stop; 1107 + } 1108 + else if (strcasecmp (keyword, "NROWS") == 0) 1109 + { 1110 + if (!cvtToInt (value, &cvt_int)) 1111 + goto stop; 1112 + s_height = cvt_int; 1113 + } 1114 + else if (strcasecmp (keyword, "NCOLS") == 0) 1115 + { 1116 + if (!cvtToInt (value, &cvt_int)) 1117 + goto stop; 1118 + s_width = cvt_int; 1119 + } 1120 + else if (strcasecmp (keyword, "NBANDS") == 0) 1121 + { 1122 + /* expected: 1 band */ 1123 + if (!cvtToInt (value, &cvt_int)) 1124 + goto stop; 1125 + if (cvt_int != 1) 1126 + goto stop; 1127 + } 1128 + else if (strcasecmp (keyword, "NBITS") == 0) 1129 + { 1130 + /* expected: 16 or 32 bit ints */ 1131 + if (!cvtToInt (value, &cvt_int)) 1132 + goto stop; 1133 + if (cvt_int == 16) 1134 + { 1135 + sample_format = GGRAPH_SAMPLE_INT; 1136 + sample_bits = 16; 1137 + } 1138 + else if (cvt_int == 32) 1139 + { 1140 + sample_format = GGRAPH_SAMPLE_INT; 1141 + sample_bits = 32; 1142 + } 1143 + else 1144 + goto stop; 1145 + } 1146 + else if (strcasecmp (keyword, "BANDROWBYTES") == 0) 1147 + { 1148 + if (!cvtToInt (value, &cvt_int)) 1149 + goto stop; 1150 + band_row_bytes = cvt_int; 1151 + } 1152 + else if (strcasecmp (keyword, "TOTALROWBYTES") == 0) 1153 + { 1154 + if (!cvtToInt (value, &cvt_int)) 1155 + goto stop; 1156 + total_row_bytes = cvt_int; 1157 + } 1158 + else if (strcasecmp (keyword, "BANDGAPBYTES") == 0) 1159 + { 1160 + /* expected: 0 bytes between bands */ 1161 + if (!cvtToInt (value, &cvt_int)) 1162 + goto stop; 1163 + if (cvt_int != 0) 1164 + goto stop; 1165 + } 1166 + else if (strcasecmp (keyword, "NODATA") == 0) 1167 + { 1168 + if (!cvtToInt (value, &cvt_int)) 1169 + goto stop; 1170 + no_data_value = cvt_int; 1171 + } 1172 + else if (strcasecmp (keyword, "ULXMAP") == 0) 1173 + { 1174 + if (!cvtToDouble (value, &cvt_dbl)) 1175 + goto stop; 1176 + upper_left_x = cvt_dbl; 1177 + } 1178 + else if (strcasecmp (keyword, "ULYMAP") == 0) 1179 + { 1180 + if (!cvtToDouble (value, &cvt_dbl)) 1181 + goto stop; 1182 + upper_left_y = cvt_dbl; 1183 + } 1184 + else if (strcasecmp (keyword, "XDIM") == 0) 1185 + { 1186 + if (!cvtToDouble (value, &cvt_dbl)) 1187 + goto stop; 1188 + x_pixel_size = cvt_dbl; 1189 + } 1190 + else if (strcasecmp (keyword, "YDIM") == 0) 1191 + { 1192 + if (!cvtToDouble (value, &cvt_dbl)) 1193 + goto stop; 1194 + y_pixel_size = cvt_dbl; 1195 + } 1196 + else 1197 + { 1198 + /* unrecognized tag */ 1199 + goto stop; 1200 + } 1201 + p_hdr = hdr_buf; 1202 + continue; 1203 + } 1204 + *p_hdr++ = c; 1205 + if (p_hdr - hdr_buf > 1024) 1206 + goto stop; 1207 + } 1208 + fclose (hdr); 1209 + hdr = NULL; 1210 + 1211 + if (s_width <= 0 || s_height <= 0 || sample_bits <= 0) 1212 + goto stop; 1213 + if (sample_format == GGRAPH_SAMPLE_UNKNOWN) 1214 + goto stop; 1215 + if (no_data_value == INT_MAX) 1216 + goto stop; 1217 + if (x_pixel_size == DBL_MAX || y_pixel_size == DBL_MAX) 1218 + goto stop; 1219 + if (upper_left_x == DBL_MAX || upper_left_y == DBL_MAX) 1220 + goto stop; 1221 + if (sample_bits == 16) 1222 + { 1223 + if (2 * s_width != band_row_bytes) 1224 + goto stop; 1225 + if (2 * s_width != total_row_bytes) 1226 + goto stop; 1227 + } 1228 + if (sample_bits == 32) 1229 + { 1230 + if (4 * s_width != band_row_bytes) 1231 + goto stop; 1232 + if (4 * s_width != total_row_bytes) 1233 + goto stop; 1234 + } 1235 + *width = s_width; 1236 + *height = s_height; 1237 + *sample = sample_format; 1238 + *bits_per_sample = sample_bits; 1239 + *endian = little_endian; 1240 + *no_data = no_data_value; 1241 + *ulx = upper_left_x; 1242 + *uly = upper_left_y; 1243 + *pixel_x_size = x_pixel_size; 1244 + *pixel_y_size = y_pixel_size; 1245 + if (sample_bits == 16) 1246 + *expected_length = s_width * s_height * 2; 1247 + else if (sample_bits == 32) 1248 + *expected_length = s_width * s_height * 4; 1249 + else 1250 + *expected_length = -1; 1251 + return 1; 1252 + 1253 + stop: 1254 + if (hdr) 1255 + fclose (hdr); 1256 + return 0; 1257 +} 1258 + 1259 +GGRAPH_DECLARE int 1260 +gGraphImageInfosFromDemFile (const char *path, const char *hdr_path, 1261 + const void **infos_handle) 1262 +{ 1263 +/* retrieving Image infos from DEM+HDR file */ 1264 + FILE *in = NULL; 1265 + gGraphImageInfosPtr infos = NULL; 1266 + long file_length; 1267 + int expected_length; 1268 + int width; 1269 + int height; 1270 + double ulx; 1271 + double uly; 1272 + double pixel_x_size; 1273 + double pixel_y_size; 1274 + int sample; 1275 + int bits_per_sample; 1276 + int endian; 1277 + double no_data; 1278 + 1279 + *infos_handle = NULL; 1280 + 1281 + if (!parse_dem_hdr 1282 + (hdr_path, &width, &height, &bits_per_sample, &sample, &endian, 1283 + &no_data, &ulx, &uly, &pixel_x_size, &pixel_y_size, &expected_length)) 1284 + return GGRAPH_FLT_CODEC_ERROR; 1285 + 1286 +/* attempting to open the image file */ 1287 + in = fopen (path, "rb"); 1288 + if (in == NULL) 1289 + return GGRAPH_FILE_OPEN_ERROR; 1290 + 1291 +/* retrieving the FLT dimensions */ 1292 + if (fseek (in, 0, SEEK_END) != 0) 1293 + return GGRAPH_FLT_CODEC_ERROR; 1294 + file_length = ftell (in); 1295 + if (file_length != expected_length) 1296 + { 1297 + fclose (in); 1298 + return GGRAPH_FLT_CODEC_ERROR; 1299 + } 1300 + fclose (in); 1301 + 1302 + infos = 1303 + gg_image_infos_create (GG_PIXEL_GRID, width, height, bits_per_sample, 1, 1304 + sample, NULL, NULL); 1305 + if (!infos) 1306 + return GGRAPH_INSUFFICIENT_MEMORY; 1307 + 1308 +/* setting up georeferencing infos */ 1309 + infos->is_georeferenced = 1; 1310 + infos->upper_left_x = ulx; 1311 + infos->upper_left_y = uly; 1312 + infos->pixel_x_size = pixel_x_size; 1313 + infos->pixel_y_size = pixel_y_size; 1314 + infos->no_data_value = no_data; 1315 + 1316 + *infos_handle = infos; 1317 + return GGRAPH_OK; 1318 +} 1319 + 1320 +static int 1321 +parse_asc_hdr (const char *path, FILE * file, int *width, int *height, 1322 + double *ulx, double *uly, double *pixel_x_size, 1323 + double *pixel_y_size, double *no_data) 1324 +{ 1325 +/* parsing an ASC file [ASCII GRID format] */ 1326 + FILE *hdr = NULL; 1327 + int s_width = INT_MIN; 1328 + int s_height = INT_MIN; 1329 + double x_pixel_size = DBL_MAX; 1330 + double y_pixel_size = DBL_MAX; 1331 + double lower_left_x = DBL_MAX; 1332 + double lower_left_y = DBL_MAX; 1333 + double no_data_value = DBL_MAX; 1334 + int c; 1335 + int i_tk; 1336 + char *saveptr; 1337 + char hdr_buf[1024]; 1338 + char *token; 1339 + char keyword[1024]; 1340 + char value[1024]; 1341 + char *p_hdr; 1342 + int cvt_int; 1343 + double cvt_dbl; 1344 + int x_centered; 1345 + int y_centered; 1346 + double half_pixel; 1347 + int row; 1348 + 1349 + if (path != NULL) 1350 + { 1351 + /* opening the ASC header file */ 1352 + hdr = fopen (path, "rb"); 1353 + } 1354 + else 1355 + hdr = file; 1356 + if (hdr == NULL) 1357 + return 0; 1358 + row = 0; 1359 + p_hdr = hdr_buf; 1360 + while ((c = getc (hdr)) != EOF) 1361 + { 1362 + /* parsing the Header file */ 1363 + if (c == '\r') 1364 + continue; 1365 + if (c == '\n') 1366 + { 1367 + row++; 1368 + *p_hdr = '\0'; 1369 + if (*hdr_buf == '\0') 1370 + { 1371 + /* skipping empty lines */ 1372 + p_hdr = hdr_buf; 1373 + continue; 1374 + } 1375 + /* breaking the string into separate tokens */ 1376 + i_tk = 0; 1377 + saveptr = NULL; 1378 + while (1) 1379 + { 1380 + token = string_tokenizer (hdr_buf, " \t", &saveptr); 1381 + if (token == NULL) 1382 + break; 1383 + if (*token == '\0') 1384 + continue; 1385 + if (i_tk == 0) 1386 + { 1387 + strcpy (keyword, token); 1388 + i_tk++; 1389 + continue; 1390 + } 1391 + 1392 + strcpy (value, token); 1393 + i_tk++; 1394 + } 1395 + 1396 + if (i_tk != 2) 1397 + goto stop; 1398 + if (strcasecmp (keyword, "NROWS") == 0) 1399 + { 1400 + if (!cvtToInt (value, &cvt_int)) 1401 + goto stop; 1402 + s_height = cvt_int; 1403 + } 1404 + else if (strcasecmp (keyword, "NCOLS") == 0) 1405 + { 1406 + if (!cvtToInt (value, &cvt_int)) 1407 + goto stop; 1408 + s_width = cvt_int; 1409 + } 1410 + else if (strcasecmp (keyword, "NODATA_VALUE") == 0) 1411 + { 1412 + if (!cvtToDouble (value, &cvt_dbl)) 1413 + goto stop; 1414 + no_data_value = cvt_dbl; 1415 + } 1416 + else if (strcasecmp (keyword, "XLLCENTER") == 0) 1417 + { 1418 + if (!cvtToDouble (value, &cvt_dbl)) 1419 + goto stop; 1420 + lower_left_x = cvt_dbl; 1421 + x_centered = 1; 1422 + } 1423 + else if (strcasecmp (keyword, "XLLCORNER") == 0) 1424 + { 1425 + if (!cvtToDouble (value, &cvt_dbl)) 1426 + goto stop; 1427 + lower_left_x = cvt_dbl; 1428 + x_centered = 0; 1429 + } 1430 + else if (strcasecmp (keyword, "YLLCENTER") == 0) 1431 + { 1432 + if (!cvtToDouble (value, &cvt_dbl)) 1433 + goto stop; 1434 + lower_left_y = cvt_dbl; 1435 + y_centered = 1; 1436 + } 1437 + else if (strcasecmp (keyword, "YLLCORNER") == 0) 1438 + { 1439 + if (!cvtToDouble (value, &cvt_dbl)) 1440 + goto stop; 1441 + lower_left_y = cvt_dbl; 1442 + y_centered = 0; 1443 + } 1444 + else if (strcasecmp (keyword, "CELLSIZE") == 0) 1445 + { 1446 + if (!cvtToDouble (value, &cvt_dbl)) 1447 + goto stop; 1448 + x_pixel_size = cvt_dbl; 1449 + y_pixel_size = x_pixel_size; 1450 + } 1451 + else 1452 + { 1453 + /* unrecognized tag */ 1454 + goto stop; 1455 + } 1456 + p_hdr = hdr_buf; 1457 + if (row == 6) 1458 + break; 1459 + continue; 1460 + } 1461 + *p_hdr++ = c; 1462 + if (p_hdr - hdr_buf > 1024) 1463 + goto stop; 1464 + } 1465 + if (path != NULL) 1466 + fclose (hdr); 1467 + hdr = NULL; 1468 + 1469 + if (s_width <= 0 || s_height <= 0) 1470 + goto stop; 1471 + if (no_data_value == INT_MAX) 1472 + goto stop; 1473 + if (x_pixel_size == DBL_MAX || y_pixel_size == DBL_MAX) 1474 + goto stop; 1475 + if (lower_left_x == DBL_MAX || lower_left_y == DBL_MAX) 1476 + goto stop; 1477 + *width = s_width; 1478 + *height = s_height; 1479 + *no_data = no_data_value; 1480 + *ulx = lower_left_x; 1481 + half_pixel = x_pixel_size / 2.0; 1482 + if (x_centered) 1483 + *ulx -= half_pixel; 1484 + *uly = lower_left_y + ((double) s_height * y_pixel_size); 1485 + half_pixel = y_pixel_size / 2.0; 1486 + if (y_centered) 1487 + *uly += half_pixel; 1488 + *pixel_x_size = x_pixel_size; 1489 + *pixel_y_size = y_pixel_size; 1490 + return 1; 1491 + 1492 + stop: 1493 + if (path != NULL) 1494 + { 1495 + if (hdr) 1496 + fclose (hdr); 1497 + } 1498 + return 0; 1499 +} 1500 + 1501 +GGRAPH_DECLARE int 1502 +gGraphImageInfosFromAscFile (const char *path, const void **infos_handle) 1503 +{ 1504 +/* retrieving Image infos from ASC file */ 1505 + gGraphImageInfosPtr infos = NULL; 1506 + int width; 1507 + int height; 1508 + double ulx; 1509 + double uly; 1510 + double pixel_x_size; 1511 + double pixel_y_size; 1512 + double no_data; 1513 + 1514 + *infos_handle = NULL; 1515 + 1516 + if (!parse_asc_hdr 1517 + (path, NULL, &width, &height, &ulx, &uly, &pixel_x_size, &pixel_y_size, 1518 + &no_data)) 1519 + return GGRAPH_ASCII_CODEC_ERROR; 1520 + 1521 + infos = 1522 + gg_image_infos_create (GG_PIXEL_GRID, width, height, 32, 1, 1523 + GGRAPH_SAMPLE_FLOAT, NULL, NULL); 1524 + if (!infos) 1525 + return GGRAPH_INSUFFICIENT_MEMORY; 1526 + 1527 +/* setting up georeferencing infos */ 1528 + infos->is_georeferenced = 1; 1529 + infos->upper_left_x = ulx; 1530 + infos->upper_left_y = uly; 1531 + infos->pixel_x_size = pixel_x_size; 1532 + infos->pixel_y_size = pixel_y_size; 1533 + infos->no_data_value = no_data; 1534 + 1535 + *infos_handle = infos; 1536 + return GGRAPH_OK; 1537 +} 1538 + 1539 +GGRAPH_PRIVATE int 1540 +gg_image_strip_prepare_from_bin_hdr (FILE * in, const char *hdr_path, 1541 + gGraphStripImagePtr * image_handle) 1542 +{ 1543 +/* preparing to decode an BIN-GRID [by strips] */ 1544 + gGraphStripImagePtr img = NULL; 1545 + struct grid_codec_data *grid_codec = NULL; 1546 + long file_length; 1547 + int expected_length; 1548 + int width; 1549 + int height; 1550 + double ulx; 1551 + double uly; 1552 + double pixel_x_size; 1553 + double pixel_y_size; 1554 + int sample; 1555 + int bits_per_sample; 1556 + int endian; 1557 + double no_data; 1558 + double min; 1559 + double max; 1560 + int buf_size; 1561 + void *grid_buffer = NULL; 1562 + int ret = GGRAPH_BIN_CODEC_ERROR; 1563 + *image_handle = NULL; 1564 + 1565 + if (!parse_binflt_hdr 1566 + (hdr_path, &width, &height, &bits_per_sample, &sample, &endian, 1567 + &no_data, &min, &max, &ulx, &uly, &pixel_x_size, &pixel_y_size, 1568 + &expected_length)) 1569 + return GGRAPH_BIN_CODEC_ERROR; 1570 + 1571 +/* retrieving the BIN dimensions */ 1572 + if (fseek (in, 0, SEEK_END) != 0) 1573 + return GGRAPH_BIN_CODEC_ERROR; 1574 + file_length = ftell (in); 1575 + if (file_length != expected_length) 1576 + return GGRAPH_BIN_CODEC_ERROR; 1577 + 1578 + img = 1579 + gg_strip_image_create (in, GGRAPH_IMAGE_BIN_HDR, GG_PIXEL_GRID, width, 1580 + height, bits_per_sample, 1, sample, NULL, NULL); 1581 + if (!img) 1582 + { 1583 + ret = GGRAPH_INSUFFICIENT_MEMORY; 1584 + goto error; 1585 + } 1586 + 1587 +/* setting up georeferencing infos */ 1588 + img->is_georeferenced = 1; 1589 + img->upper_left_x = ulx; 1590 + img->upper_left_y = uly; 1591 + img->pixel_x_size = pixel_x_size; 1592 + img->pixel_y_size = pixel_y_size; 1593 + img->no_data_value = no_data; 1594 + img->min_value = min; 1595 + img->max_value = max; 1596 + 1597 +/* setting up the GRID codec struct */ 1598 + grid_codec = malloc (sizeof (struct grid_codec_data)); 1599 + if (!grid_codec) 1600 + goto error; 1601 + grid_codec->grid_type = GRID_BIN_HDR; 1602 + grid_codec->is_writer = 0; 1603 + grid_codec->grid_buffer = NULL; 1604 + grid_codec->row_offsets = NULL; 1605 + grid_codec->little_endian = endian; 1606 + img->codec_data = grid_codec; 1607 + 1608 +/* allocating the GRID read buffer */ 1609 + if (sample == GGRAPH_SAMPLE_INT) 1610 + { 1611 + if (bits_per_sample == 16) 1612 + buf_size = sizeof (short) * width; 1613 + if (bits_per_sample == 32) 1614 + buf_size = sizeof (int) * width; 1615 + } 1616 + if (sample == GGRAPH_SAMPLE_FLOAT) 1617 + { 1618 + if (bits_per_sample == 32) 1619 + buf_size = sizeof (float) * width; 1620 + if (bits_per_sample == 64) 1621 + buf_size = sizeof (double) * width; 1622 + } 1623 + grid_buffer = malloc (buf_size); 1624 + if (!grid_buffer) 1625 + goto error; 1626 + grid_codec->grid_buffer = grid_buffer; 1627 + 1628 + *image_handle = img; 1629 + return GGRAPH_OK; 1630 + 1631 + error: 1632 + if (img) 1633 + gGraphDestroyImage (img); 1634 + return ret; 1635 +} 1636 + 1637 +GGRAPH_PRIVATE int 1638 +gg_image_strip_prepare_from_flt_hdr (FILE * in, const char *hdr_path, 1639 + gGraphStripImagePtr * image_handle) 1640 +{ 1641 +/* preparing to decode an FLT-GRID [by strips] */ 1642 + gGraphStripImagePtr img = NULL; 1643 + struct grid_codec_data *grid_codec = NULL; 1644 + long file_length; 1645 + int expected_length; 1646 + int width; 1647 + int height; 1648 + double ulx; 1649 + double uly; 1650 + double pixel_x_size; 1651 + double pixel_y_size; 1652 + int sample; 1653 + int bits_per_sample; 1654 + int endian; 1655 + double no_data; 1656 + double min; 1657 + double max; 1658 + int buf_size; 1659 + void *grid_buffer = NULL; 1660 + int ret = GGRAPH_FLT_CODEC_ERROR; 1661 + *image_handle = NULL; 1662 + 1663 + if (!parse_binflt_hdr 1664 + (hdr_path, &width, &height, &bits_per_sample, &sample, &endian, 1665 + &no_data, &min, &max, &ulx, &uly, &pixel_x_size, &pixel_y_size, 1666 + &expected_length)) 1667 + return GGRAPH_FLT_CODEC_ERROR; 1668 + 1669 +/* retrieving the FLT dimensions */ 1670 + if (fseek (in, 0, SEEK_END) != 0) 1671 + return GGRAPH_FLT_CODEC_ERROR; 1672 + file_length = ftell (in); 1673 + if (file_length != expected_length) 1674 + return GGRAPH_FLT_CODEC_ERROR; 1675 + 1676 + img = 1677 + gg_strip_image_create (in, GGRAPH_IMAGE_FLT_HDR, GG_PIXEL_GRID, width, 1678 + height, bits_per_sample, 1, sample, NULL, NULL); 1679 + if (!img) 1680 + { 1681 + ret = GGRAPH_INSUFFICIENT_MEMORY; 1682 + goto error; 1683 + } 1684 + 1685 +/* setting up georeferencing infos */ 1686 + img->is_georeferenced = 1; 1687 + img->upper_left_x = ulx; 1688 + img->upper_left_y = uly; 1689 + img->pixel_x_size = pixel_x_size; 1690 + img->pixel_y_size = pixel_y_size; 1691 + img->no_data_value = no_data; 1692 + img->min_value = min; 1693 + img->max_value = max; 1694 + 1695 +/* setting up the GRID codec struct */ 1696 + grid_codec = malloc (sizeof (struct grid_codec_data)); 1697 + if (!grid_codec) 1698 + goto error; 1699 + grid_codec->grid_type = GRID_FLT_HDR; 1700 + grid_codec->is_writer = 0; 1701 + grid_codec->grid_buffer = NULL; 1702 + grid_codec->row_offsets = NULL; 1703 + grid_codec->little_endian = endian; 1704 + img->codec_data = grid_codec; 1705 + 1706 +/* allocating the GRID read buffer */ 1707 + if (sample == GGRAPH_SAMPLE_INT) 1708 + { 1709 + if (bits_per_sample == 16) 1710 + buf_size = sizeof (short) * width; 1711 + if (bits_per_sample == 32) 1712 + buf_size = sizeof (int) * width; 1713 + } 1714 + if (sample == GGRAPH_SAMPLE_FLOAT) 1715 + { 1716 + if (bits_per_sample == 32) 1717 + buf_size = sizeof (float) * width; 1718 + if (bits_per_sample == 64) 1719 + buf_size = sizeof (double) * width; 1720 + } 1721 + grid_buffer = malloc (buf_size); 1722 + if (!grid_buffer) 1723 + goto error; 1724 + grid_codec->grid_buffer = grid_buffer; 1725 + 1726 + *image_handle = img; 1727 + return GGRAPH_OK; 1728 + 1729 + error: 1730 + if (img) 1731 + gGraphDestroyImage (img); 1732 + return ret; 1733 +} 1734 + 1735 +GGRAPH_PRIVATE int 1736 +gg_image_strip_prepare_from_dem_hdr (FILE * in, const char *hdr_path, 1737 + gGraphStripImagePtr * image_handle) 1738 +{ 1739 +/* preparing to decode an DEM-GRID [by strips] */ 1740 + gGraphStripImagePtr img = NULL; 1741 + struct grid_codec_data *grid_codec = NULL; 1742 + long file_length; 1743 + int expected_length; 1744 + int width; 1745 + int height; 1746 + double ulx; 1747 + double uly; 1748 + double pixel_x_size; 1749 + double pixel_y_size; 1750 + int sample; 1751 + int bits_per_sample; 1752 + int endian; 1753 + double no_data; 1754 + int buf_size; 1755 + void *grid_buffer = NULL; 1756 + int ret = GGRAPH_DEM_CODEC_ERROR; 1757 + *image_handle = NULL; 1758 + 1759 + if (!parse_dem_hdr 1760 + (hdr_path, &width, &height, &bits_per_sample, &sample, &endian, 1761 + &no_data, &ulx, &uly, &pixel_x_size, &pixel_y_size, &expected_length)) 1762 + return GGRAPH_DEM_CODEC_ERROR; 1763 + 1764 +/* retrieving the DEM dimensions */ 1765 + if (fseek (in, 0, SEEK_END) != 0) 1766 + return GGRAPH_DEM_CODEC_ERROR; 1767 + file_length = ftell (in); 1768 + if (file_length != expected_length) 1769 + return GGRAPH_DEM_CODEC_ERROR; 1770 + 1771 + img = 1772 + gg_strip_image_create (in, GGRAPH_IMAGE_DEM_HDR, GG_PIXEL_GRID, width, 1773 + height, bits_per_sample, 1, sample, NULL, NULL); 1774 + if (!img) 1775 + { 1776 + ret = GGRAPH_INSUFFICIENT_MEMORY; 1777 + goto error; 1778 + } 1779 + 1780 +/* setting up georeferencing infos */ 1781 + img->is_georeferenced = 1; 1782 + img->upper_left_x = ulx; 1783 + img->upper_left_y = uly; 1784 + img->pixel_x_size = pixel_x_size; 1785 + img->pixel_y_size = pixel_y_size; 1786 + img->no_data_value = no_data; 1787 + 1788 +/* setting up the GRID codec struct */ 1789 + grid_codec = malloc (sizeof (struct grid_codec_data)); 1790 + if (!grid_codec) 1791 + goto error; 1792 + grid_codec->grid_type = GRID_DEM_HDR; 1793 + grid_codec->is_writer = 0; 1794 + grid_codec->grid_buffer = NULL; 1795 + grid_codec->row_offsets = NULL; 1796 + grid_codec->little_endian = endian; 1797 + img->codec_data = grid_codec; 1798 + 1799 +/* allocating the GRID read buffer */ 1800 + if (bits_per_sample == 16) 1801 + buf_size = sizeof (short) * width; 1802 + if (bits_per_sample == 32) 1803 + buf_size = sizeof (int) * width; 1804 + grid_buffer = malloc (buf_size); 1805 + if (!grid_buffer) 1806 + goto error; 1807 + grid_codec->grid_buffer = grid_buffer; 1808 + 1809 + *image_handle = img; 1810 + return GGRAPH_OK; 1811 + 1812 + error: 1813 + if (img) 1814 + gGraphDestroyImage (img); 1815 + return ret; 1816 +} 1817 + 1818 +static int 1819 +parse_asc_offsets (FILE * in, int height, long **row_offsets) 1820 +{ 1821 +/* retrieving row-offsets from an ASC file [ASCII GRID format] */ 1822 + int c; 1823 + int row = 0; 1824 + int ind = 0; 1825 + long *offsets = *row_offsets; 1826 + long current = 0; 1827 + 1828 + rewind (in); 1829 + while ((c = getc (in)) != EOF) 1830 + { 1831 + /* parsing the Header file */ 1832 + if (c == '\n') 1833 + { 1834 + row++; 1835 + if (row >= 6) 1836 + { 1837 + if (ind < height) 1838 + *(offsets + ind) = current; 1839 + ind++; 1840 + } 1841 + } 1842 + current++; 1843 + } 1844 + if (ind != height + 1) 1845 + return 0; 1846 + return 1; 1847 +} 1848 + 1849 +GGRAPH_PRIVATE int 1850 +gg_image_strip_prepare_from_ascii_grid (FILE * in, 1851 + gGraphStripImagePtr * image_handle) 1852 +{ 1853 +/* preparing to decode an ASCII-GRID [by strips] */ 1854 + gGraphStripImagePtr img = NULL; 1855 + struct grid_codec_data *grid_codec = NULL; 1856 + int width; 1857 + int height; 1858 + double ulx; 1859 + double uly; 1860 + double pixel_x_size; 1861 + double pixel_y_size; 1862 + double no_data; 1863 + long *row_offsets = NULL; 1864 + int ret = GGRAPH_ASCII_CODEC_ERROR; 1865 + *image_handle = NULL; 1866 + 1867 + if (!parse_asc_hdr 1868 + (NULL, in, &width, &height, &ulx, &uly, &pixel_x_size, &pixel_y_size, 1869 + &no_data)) 1870 + return GGRAPH_ASCII_CODEC_ERROR; 1871 + 1872 +/* preparing the row-offset array */ 1873 + row_offsets = malloc (sizeof (long) * height); 1874 + if (!row_offsets) 1875 + return GGRAPH_ASCII_CODEC_ERROR; 1876 + if (!parse_asc_offsets (in, height, &row_offsets)) 1877 + { 1878 + free (row_offsets); 1879 + return GGRAPH_ASCII_CODEC_ERROR; 1880 + } 1881 + 1882 + img = 1883 + gg_strip_image_create (in, GGRAPH_IMAGE_ASCII_GRID, GG_PIXEL_GRID, 1884 + width, height, 32, 1, GGRAPH_SAMPLE_FLOAT, NULL, 1885 + NULL); 1886 + if (!img) 1887 + { 1888 + ret = GGRAPH_INSUFFICIENT_MEMORY; 1889 + goto error; 1890 + } 1891 + 1892 +/* setting up georeferencing infos */ 1893 + img->is_georeferenced = 1; 1894 + img->upper_left_x = ulx; 1895 + img->upper_left_y = uly; 1896 + img->pixel_x_size = pixel_x_size; 1897 + img->pixel_y_size = pixel_y_size; 1898 + img->no_data_value = no_data; 1899 + 1900 +/* setting up the GRID codec struct */ 1901 + grid_codec = malloc (sizeof (struct grid_codec_data)); 1902 + if (!grid_codec) 1903 + goto error; 1904 + grid_codec->grid_type = GRID_ASCII; 1905 + grid_codec->is_writer = 0; 1906 + grid_codec->grid_buffer = NULL; 1907 + grid_codec->row_offsets = row_offsets; 1908 + img->codec_data = grid_codec; 1909 + 1910 + *image_handle = img; 1911 + return GGRAPH_OK; 1912 + 1913 + error: 1914 + if (img) 1915 + gGraphDestroyImage (img); 1916 + return ret; 1917 +} 1918 + 1919 +static int 1920 +read_from_bin_grid (FILE * in, gGraphStripImagePtr img, int sample, 1921 + int bits_per_pixel, int type, void *scanline, int endian) 1922 +{ 1923 +/* decoding a BIN-GRID or a FLT-GRID [by strip] */ 1924 + int width = img->width; 1925 + int height = img->height; 1926 + size_t scan_size; 1927 + int row; 1928 + int incr = 0; 1929 + int x; 1930 + int endian_arch = gg_endian_arch (); 1931 + off_t pos; 1932 + unsigned char *p_in; 1933 + short *p_out_short; 1934 + short cell_value_short; 1935 + int *p_out_int; 1936 + int cell_value_int; 1937 + float *p_out_float; 1938 + float cell_value_float; 1939 + double *p_out_double; 1940 + double cell_value_double; 1941 + 1942 + if (bits_per_pixel == 16) 1943 + scan_size = width * 2; 1944 + if (bits_per_pixel == 32) 1945 + scan_size = width * 4; 1946 + if (bits_per_pixel == 64) 1947 + scan_size = width * 8; 1948 + pos = img->next_row * scan_size; 1949 +/* positioning on the start scanline */ 1950 + if (fseek (in, pos, SEEK_SET) != 0) 1951 + { 1952 + if (type == GRID_BIN_HDR) 1953 + return GGRAPH_BIN_CODEC_ERROR; 1954 + if (type == GRID_FLT_HDR) 1955 + return GGRAPH_FLT_CODEC_ERROR; 1956 + if (type == GRID_DEM_HDR) 1957 + return GGRAPH_DEM_CODEC_ERROR; 1958 + } 1959 + for (row = 0; row < img->rows_per_block; row++) 1960 + { 1961 + /* reading the required number of scanlines */ 1962 + if ((row + img->next_row) >= height) 1963 + break; 1964 + if (fread (scanline, 1, scan_size, in) != scan_size) 1965 + return GGRAPH_HGT_CODEC_ERROR; 1966 + p_in = scanline; 1967 + if (sample == GGRAPH_SAMPLE_INT) 1968 + { 1969 + if (bits_per_pixel == 16) 1970 + { 1971 + p_out_short = (short *) (img->pixels); 1972 + p_out_short += (row * width); 1973 + } 1974 + 1975 + if (bits_per_pixel == 32) 1976 + { 1977 + p_out_int = (int *) (img->pixels); 1978 + p_out_int += (row * width); 1979 + } 1980 + } 1981 + if (sample == GGRAPH_SAMPLE_FLOAT) 1982 + { 1983 + if (bits_per_pixel == 32) 1984 + { 1985 + p_out_float = (float *) (img->pixels); 1986 + p_out_float += (row * width); 1987 + } 1988 + 1989 + if (bits_per_pixel == 64) 1990 + { 1991 + p_out_double = (double *) (img->pixels); 1992 + p_out_double += (row * width); 1993 + } 1994 + } 1995 + for (x = 0; x < width; x++) 1996 + { 1997 + if (sample == GGRAPH_SAMPLE_INT) 1998 + { 1999 + if (bits_per_pixel == 16) 2000 + { 2001 + cell_value_short = 2002 + gg_import_int16 (p_in, endian, endian_arch); 2003 + *p_out_short++ = cell_value_short; 2004 + p_in += sizeof (short); 2005 + } 2006 + if (bits_per_pixel == 32) 2007 + { 2008 + cell_value_int = 2009 + gg_import_int32 (p_in, endian, endian_arch); 2010 + *p_out_int++ = cell_value_int; 2011 + p_in += sizeof (int); 2012 + } 2013 + } 2014 + if (sample == GGRAPH_SAMPLE_FLOAT) 2015 + { 2016 + if (bits_per_pixel == 32) 2017 + { 2018 + cell_value_float = 2019 + gg_import_float (p_in, endian, endian_arch); 2020 + *p_out_float++ = cell_value_float; 2021 + p_in += sizeof (float); 2022 + } 2023 + if (bits_per_pixel == 64) 2024 + { 2025 + cell_value_double = 2026 + gg_import_double (p_in, endian, endian_arch); 2027 + *p_out_double++ = cell_value_double; 2028 + p_in += sizeof (double); 2029 + } 2030 + } 2031 + } 2032 + incr++; 2033 + } 2034 + img->next_row += incr; 2035 + img->current_available_rows = incr; 2036 + return GGRAPH_OK; 2037 +} 2038 + 2039 +GGRAPH_PRIVATE int 2040 +gg_image_strip_read_from_bin_grid (gGraphStripImagePtr img, int *progress) 2041 +{ 2042 +/* decoding a BIN-GRID or a FLT-GRID [by strip] */ 2043 + struct grid_codec_data *grid_codec = 2044 + (struct grid_codec_data *) (img->codec_data); 2045 + FILE *in = img->file_handle; 2046 + 2047 + if (grid_codec->grid_type == GRID_BIN_HDR 2048 + || grid_codec->grid_type == GRID_FLT_HDR) 2049 + { 2050 + int ret = read_from_bin_grid (in, img, img->sample_format, 2051 + img->bits_per_sample, 2052 + grid_codec->grid_type, 2053 + grid_codec->grid_buffer, 2054 + grid_codec->little_endian); 2055 + if (ret == GGRAPH_OK && progress != NULL) 2056 + *progress = 2057 + (int) (((double) (img->next_row + 1) * 100.0) / 2058 + (double) (img->height)); 2059 + return ret; 2060 + } 2061 + return GGRAPH_ERROR; 2062 +} 2063 + 2064 +GGRAPH_PRIVATE int 2065 +gg_image_strip_read_from_dem_grid (gGraphStripImagePtr img, int *progress) 2066 +{ 2067 +/* decoding a DEM-GRID [by strip] */ 2068 + struct grid_codec_data *grid_codec = 2069 + (struct grid_codec_data *) (img->codec_data); 2070 + FILE *in = img->file_handle; 2071 + 2072 + if (grid_codec->grid_type == GRID_DEM_HDR) 2073 + { 2074 + int ret = read_from_bin_grid (in, img, img->sample_format, 2075 + img->bits_per_sample, 2076 + grid_codec->grid_type, 2077 + grid_codec->grid_buffer, 2078 + grid_codec->little_endian); 2079 + if (ret == GGRAPH_OK && progress != NULL) 2080 + *progress = 2081 + (int) (((double) (img->next_row + 1) * 100.0) / 2082 + (double) (img->height)); 2083 + return ret; 2084 + } 2085 + return GGRAPH_ERROR; 2086 +} 2087 + 2088 +static int 2089 +read_from_ascii_grid (FILE * in, gGraphStripImagePtr img, long *row_offsets) 2090 +{ 2091 +/* decoding an ASCII-GRID [by strip] */ 2092 + int width = img->width; 2093 + int height = img->height; 2094 + int row; 2095 + int incr = 0; 2096 + int col; 2097 + int c; 2098 + float *p_out; 2099 + float cell_value; 2100 + char buf[256]; 2101 + char *p; 2102 + 2103 +/* positioning on the start scanline */ 2104 + if (fseek (in, row_offsets[img->next_row], SEEK_SET) != 0) 2105 + return GGRAPH_ASCII_CODEC_ERROR; 2106 + if (getc (in) != '\n') 2107 + return GGRAPH_ASCII_CODEC_ERROR; 2108 + 2109 + for (row = 0; row < img->rows_per_block; row++) 2110 + { 2111 + /* reading the required number of scanlines */ 2112 + if ((row + img->next_row) >= height) 2113 + break; 2114 + p_out = (float *) (img->pixels); 2115 + p_out += row * width; 2116 + p = buf; 2117 + col = 0; 2118 + while ((c = getc (in)) != EOF) 2119 + { 2120 + /* parsing cell values */ 2121 + if (c == '\r') 2122 + continue; 2123 + if (c == '\n') 2124 + break; 2125 + if (c == ' ') 2126 + { 2127 + /* cell end */ 2128 + *p = '\0'; 2129 + cell_value = atof (buf); 2130 + if (col >= width) 2131 + return GGRAPH_ASCII_CODEC_ERROR; 2132 + *p_out++ = cell_value; 2133 + col++; 2134 + p = buf; 2135 + continue; 2136 + } 2137 + if ((p - buf) >= 256) 2138 + return GGRAPH_ASCII_CODEC_ERROR; 2139 + *p++ = c; 2140 + } 2141 + if (col != width) 2142 + return GGRAPH_ASCII_CODEC_ERROR; 2143 + incr++; 2144 + } 2145 + img->next_row += incr; 2146 + img->current_available_rows = incr; 2147 + return GGRAPH_OK; 2148 +} 2149 + 2150 +GGRAPH_PRIVATE int 2151 +gg_image_strip_read_from_ascii_grid (gGraphStripImagePtr img, int *progress) 2152 +{ 2153 +/* decoding an ASCII-GRID [by strip] */ 2154 + struct grid_codec_data *grid_codec = 2155 + (struct grid_codec_data *) (img->codec_data); 2156 + FILE *in = img->file_handle; 2157 + 2158 + if (grid_codec->grid_type == GRID_ASCII) 2159 + { 2160 + int ret = read_from_ascii_grid (in, img, grid_codec->row_offsets); 2161 + if (ret == GGRAPH_OK && progress != NULL) 2162 + *progress = 2163 + (int) (((double) (img->next_row + 1) * 100.0) / 2164 + (double) (img->height)); 2165 + return ret; 2166 + } 2167 + return GGRAPH_ERROR; 2168 +} 2169 + 2170 +GGRAPH_PRIVATE int 2171 +gg_image_prepare_to_ascii_grid_by_strip (const gGraphStripImagePtr img, 2172 + FILE * out) 2173 +{ 2174 +/* preparing to export an ASCII GRID [by strips] */ 2175 + char dummy[256]; 2176 + 2177 + fprintf (out, "ncols %d\r\n", img->width); 2178 + fprintf (out, "nrows %d\r\n", img->height); 2179 + gGraphSmartPrintf (img->upper_left_x, dummy); 2180 + fprintf (out, "xllcorner %s\r\n", dummy); 2181 + gGraphSmartPrintf (img->upper_left_y - 2182 + ((double) (img->height) * img->pixel_y_size), dummy); 2183 + fprintf (out, "yllcorner %s\r\n", dummy); 2184 + gGraphSmartPrintf (img->pixel_y_size, dummy); 2185 + fprintf (out, "cellsize %s\r\n", dummy); 2186 + gGraphSmartPrintf (img->no_data_value, dummy); 2187 + fprintf (out, "NODATA_value %s\r\n", dummy); 2188 + 2189 + return GGRAPH_OK; 2190 +} 2191 + 2192 +GGRAPH_PRIVATE int 2193 +gg_image_write_to_ascii_grid_by_strip (const gGraphStripImagePtr img, 2194 + int *progress) 2195 +{ 2196 +/* scanline(s) ASCII GRID export [by strip] */ 2197 + FILE *out = img->file_handle; 2198 + int row; 2199 + int col; 2200 + char *p_in_int8; 2201 + unsigned char *p_in_uint8; 2202 + short *p_in_int16; 2203 + unsigned short *p_in_uint16; 2204 + int *p_in_int32; 2205 + unsigned int *p_in_uint32; 2206 + float *p_in_flt; 2207 + double *p_in_dbl; 2208 + char dummy[256]; 2209 + 2210 + for (row = 0; row < img->current_available_rows; row++) 2211 + { 2212 + switch (img->sample_format) 2213 + { 2214 + case GGRAPH_SAMPLE_UINT: 2215 + switch (img->bits_per_sample) 2216 + { 2217 + case 8: 2218 + p_in_uint8 = (unsigned char *) (img->pixels); 2219 + p_in_uint8 += row * img->width; 2220 + break; 2221 + case 16: 2222 + p_in_uint16 = (unsigned short *) (img->pixels); 2223 + p_in_uint16 += row * img->width; 2224 + break; 2225 + case 32: 2226 + p_in_uint32 = (unsigned int *) (img->pixels); 2227 + p_in_uint32 += row * img->width; 2228 + break; 2229 + }; 2230 + break; 2231 + case GGRAPH_SAMPLE_INT: 2232 + switch (img->bits_per_sample) 2233 + { 2234 + case 8: 2235 + p_in_int8 = (char *) (img->pixels); 2236 + p_in_int8 += row * img->width; 2237 + break; 2238 + case 16: 2239 + p_in_int16 = (short *) (img->pixels); 2240 + p_in_int16 += row * img->width; 2241 + break; 2242 + case 32: 2243 + p_in_int32 = (int *) (img->pixels); 2244 + p_in_int32 += row * img->width; 2245 + break; 2246 + }; 2247 + break; 2248 + case GGRAPH_SAMPLE_FLOAT: 2249 + switch (img->bits_per_sample) 2250 + { 2251 + case 32: 2252 + p_in_flt = (float *) (img->pixels); 2253 + p_in_flt += row * img->width; 2254 + break; 2255 + case 64: 2256 + p_in_dbl = (double *) (img->pixels); 2257 + p_in_dbl += row * img->width; 2258 + break; 2259 + }; 2260 + break; 2261 + }; 2262 + for (col = 0; col < img->width; col++) 2263 + { 2264 + switch (img->sample_format) 2265 + { 2266 + case GGRAPH_SAMPLE_UINT: 2267 + switch (img->bits_per_sample) 2268 + { 2269 + case 8: 2270 + sprintf (dummy, "%u", *p_in_uint8++); 2271 + break; 2272 + case 16: 2273 + sprintf (dummy, "%u", *p_in_uint16++); 2274 + break; 2275 + case 32: 2276 + sprintf (dummy, "%u", *p_in_uint32++); 2277 + break; 2278 + }; 2279 + break; 2280 + case GGRAPH_SAMPLE_INT: 2281 + switch (img->bits_per_sample) 2282 + { 2283 + case 8: 2284 + sprintf (dummy, "%d", *p_in_int8++); 2285 + break; 2286 + case 16: 2287 + sprintf (dummy, "%d", *p_in_int16++); 2288 + break; 2289 + case 32: 2290 + sprintf (dummy, "%d", *p_in_int32++); 2291 + break; 2292 + }; 2293 + break; 2294 + case GGRAPH_SAMPLE_FLOAT: 2295 + switch (img->bits_per_sample) 2296 + { 2297 + case 32: 2298 + gGraphSmartPrintf (*p_in_flt++, dummy); 2299 + break; 2300 + case 64: 2301 + gGraphSmartPrintf (*p_in_dbl++, dummy); 2302 + break; 2303 + }; 2304 + break; 2305 + }; 2306 + fprintf (out, "%s ", dummy); 2307 + } 2308 + /* terminating a full scanline */ 2309 + fprintf (out, "\r\n"); 2310 + } 2311 + img->next_row += img->current_available_rows; 2312 + 2313 + if (progress != NULL) 2314 + *progress = 2315 + (int) (((double) (img->next_row + 1) * 100.0) / 2316 + (double) (img->height)); 2317 + return GGRAPH_OK; 2318 +} 2319 + 2320 +GGRAPH_PRIVATE int 2321 +gg_image_prepare_to_bin_hdr_by_strip (const gGraphStripImagePtr img) 2322 +{ 2323 +/* preparing to export a BIN+HDR GRID [by strips] */ 2324 + struct grid_codec_data *grid_codec = NULL; 2325 + int buf_size; 2326 + void *grid_buffer = NULL; 2327 + 2328 + if (img->sample_format != GGRAPH_SAMPLE_INT) 2329 + return GGRAPH_BIN_CODEC_ERROR; 2330 + if (img->bits_per_sample == 16 || img->bits_per_sample == 32) 2331 + ; 2332 + else 2333 + return GGRAPH_BIN_CODEC_ERROR; 2334 + 2335 +/* setting up the GRID codec struct */ 2336 + grid_codec = malloc (sizeof (struct grid_codec_data)); 2337 + if (!grid_codec) 2338 + return GGRAPH_BIN_CODEC_ERROR; 2339 + grid_codec->grid_type = GRID_BIN_HDR; 2340 + grid_codec->is_writer = 1; 2341 + grid_codec->grid_buffer = NULL; 2342 + grid_codec->row_offsets = NULL; 2343 + 2344 +/* allocating the GRID read buffer */ 2345 + if (img->bits_per_sample == 16) 2346 + buf_size = sizeof (short) * img->width; 2347 + else 2348 + buf_size = sizeof (int) * img->width; 2349 + grid_buffer = malloc (buf_size); 2350 + if (!grid_buffer) 2351 + { 2352 + free (grid_codec); 2353 + return GGRAPH_BIN_CODEC_ERROR; 2354 + } 2355 + grid_codec->grid_buffer = grid_buffer; 2356 + img->codec_data = grid_codec; 2357 + 2358 + return GGRAPH_OK; 2359 +} 2360 + 2361 +GGRAPH_PRIVATE int 2362 +gg_image_prepare_to_flt_hdr_by_strip (const gGraphStripImagePtr img) 2363 +{ 2364 +/* preparing to export a FLT+HDR GRID [by strips] */ 2365 + struct grid_codec_data *grid_codec = NULL; 2366 + int buf_size; 2367 + void *grid_buffer = NULL; 2368 + 2369 + if (img->sample_format != GGRAPH_SAMPLE_FLOAT) 2370 + return GGRAPH_FLT_CODEC_ERROR; 2371 + if (img->bits_per_sample == 32 || img->bits_per_sample == 64) 2372 + ; 2373 + else 2374 + return GGRAPH_FLT_CODEC_ERROR; 2375 + 2376 +/* setting up the GRID codec struct */ 2377 + grid_codec = malloc (sizeof (struct grid_codec_data)); 2378 + if (!grid_codec) 2379 + return GGRAPH_FLT_CODEC_ERROR; 2380 + grid_codec->grid_type = GRID_FLT_HDR; 2381 + grid_codec->is_writer = 1; 2382 + grid_codec->grid_buffer = NULL; 2383 + grid_codec->row_offsets = NULL; 2384 + 2385 +/* allocating the GRID read buffer */ 2386 + if (img->bits_per_sample == 32) 2387 + buf_size = sizeof (float) * img->width; 2388 + else 2389 + buf_size = sizeof (double) * img->width; 2390 + grid_buffer = malloc (buf_size); 2391 + if (!grid_buffer) 2392 + { 2393 + free (grid_codec); 2394 + return GGRAPH_FLT_CODEC_ERROR; 2395 + } 2396 + grid_codec->grid_buffer = grid_buffer; 2397 + img->codec_data = grid_codec; 2398 + 2399 + return GGRAPH_OK; 2400 +} 2401 + 2402 +GGRAPH_PRIVATE int 2403 +gg_image_write_to_bin_hdr_by_strip (const gGraphStripImagePtr img, 2404 + int *progress) 2405 +{ 2406 +/* scanline(s) BIN+HDR GRID export [by strip] */ 2407 + FILE *out = img->file_handle; 2408 + struct grid_codec_data *grid_codec = 2409 + (struct grid_codec_data *) (img->codec_data); 2410 + int row; 2411 + int col; 2412 + short *p_in_int16; 2413 + int *p_in_int32; 2414 + unsigned char *p_out; 2415 + size_t sz; 2416 + int endian_arch = gg_endian_arch (); 2417 + 2418 + for (row = 0; row < img->current_available_rows; row++) 2419 + { 2420 + switch (img->bits_per_sample) 2421 + { 2422 + case 16: 2423 + p_in_int16 = (short *) (img->pixels); 2424 + p_in_int16 += row * img->width; 2425 + sz = img->width * sizeof (short); 2426 + break; 2427 + case 32: 2428 + p_in_int32 = (int *) (img->pixels); 2429 + p_in_int32 += row * img->width; 2430 + sz = img->width * sizeof (int); 2431 + break; 2432 + }; 2433 + p_out = grid_codec->grid_buffer; 2434 + 2435 + for (col = 0; col < img->width; col++) 2436 + { 2437 + switch (img->bits_per_sample) 2438 + { 2439 + case 16: 2440 + if (*p_in_int16 < img->min_value) 2441 + img->min_value = *p_in_int16; 2442 + if (*p_in_int16 > img->max_value) 2443 + img->max_value = *p_in_int16; 2444 + gg_export_int16 (*p_in_int16++, p_out, 1, endian_arch); 2445 + p_out += sizeof (short); 2446 + break; 2447 + case 32: 2448 + if (*p_in_int32 < img->min_value) 2449 + img->min_value = *p_in_int32; 2450 + if (*p_in_int32 > img->max_value) 2451 + img->max_value = *p_in_int32; 2452 + gg_export_int32 (*p_in_int32++, p_out, 1, endian_arch); 2453 + p_out += sizeof (int); 2454 + break; 2455 + }; 2456 + } 2457 + /* terminating a full scanline */ 2458 + if (fwrite (grid_codec->grid_buffer, 1, sz, out) != sz) 2459 + return GGRAPH_BIN_CODEC_ERROR; 2460 + } 2461 + img->next_row += img->current_available_rows; 2462 + 2463 + if (progress != NULL) 2464 + *progress = 2465 + (int) (((double) (img->next_row + 1) * 100.0) / 2466 + (double) (img->height)); 2467 + return GGRAPH_OK; 2468 +} 2469 + 2470 +GGRAPH_PRIVATE int 2471 +gg_image_write_to_flt_hdr_by_strip (const gGraphStripImagePtr img, 2472 + int *progress) 2473 +{ 2474 +/* scanline(s) FLT+HDR GRID export [by strip] */ 2475 + FILE *out = img->file_handle; 2476 + struct grid_codec_data *grid_codec = 2477 + (struct grid_codec_data *) (img->codec_data); 2478 + int row; 2479 + int col; 2480 + float *p_in_float; 2481 + double *p_in_double; 2482 + unsigned char *p_out; 2483 + size_t sz; 2484 + int endian_arch = gg_endian_arch (); 2485 + 2486 + for (row = 0; row < img->current_available_rows; row++) 2487 + { 2488 + switch (img->bits_per_sample) 2489 + { 2490 + case 32: 2491 + p_in_float = (float *) (img->pixels); 2492 + p_in_float += row * img->width; 2493 + sz = img->width * sizeof (float); 2494 + break; 2495 + case 64: 2496 + p_in_double = (double *) (img->pixels); 2497 + p_in_double += row * img->width; 2498 + sz = img->width * sizeof (double); 2499 + break; 2500 + }; 2501 + p_out = grid_codec->grid_buffer; 2502 + 2503 + for (col = 0; col < img->width; col++) 2504 + { 2505 + switch (img->bits_per_sample) 2506 + { 2507 + case 32: 2508 + if (*p_in_float < img->min_value) 2509 + img->min_value = *p_in_float; 2510 + if (*p_in_float > img->max_value) 2511 + img->max_value = *p_in_float; 2512 + gg_export_float (*p_in_float++, p_out, 1, endian_arch); 2513 + p_out += sizeof (float); 2514 + break; 2515 + case 64: 2516 + if (*p_in_double < img->min_value) 2517 + img->min_value = *p_in_double; 2518 + if (*p_in_double > img->max_value) 2519 + img->max_value = *p_in_double; 2520 + gg_export_double (*p_in_double++, p_out, 1, endian_arch); 2521 + p_out += sizeof (float); 2522 + break; 2523 + }; 2524 + } 2525 + /* terminating a full scanline */ 2526 + if (fwrite (grid_codec->grid_buffer, 1, sz, out) != sz) 2527 + return GGRAPH_FLT_CODEC_ERROR; 2528 + } 2529 + img->next_row += img->current_available_rows; 2530 + 2531 + if (progress != NULL) 2532 + *progress = 2533 + (int) (((double) (img->next_row + 1) * 100.0) / 2534 + (double) (img->height)); 2535 + return GGRAPH_OK; 2536 +} 2537 + 2538 +GGRAPH_DECLARE int 2539 +gGraphWriteBinHeader (const char *hdr_path, const void *ptr) 2540 +{ 2541 +/* exporting a BIN Header file */ 2542 + FILE *out = NULL; 2543 + char dummy[256]; 2544 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2545 + 2546 + if (img == NULL) 2547 + return GGRAPH_INVALID_IMAGE; 2548 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2549 + return GGRAPH_INVALID_IMAGE; 2550 + 2551 +/* attempting to open/create the header file */ 2552 + out = fopen (hdr_path, "wb"); 2553 + if (out == NULL) 2554 + return GGRAPH_FILE_OPEN_ERROR; 2555 + 2556 + fprintf (out, "NCOLS %d\r\n", img->width); 2557 + fprintf (out, "NROWS %d\r\n", img->height); 2558 + gGraphSmartPrintf (img->upper_left_x, dummy); 2559 + fprintf (out, "XLLCORNER %s\r\n", dummy); 2560 + gGraphSmartPrintf (img->upper_left_y - 2561 + ((double) (img->height) * img->pixel_y_size), dummy); 2562 + fprintf (out, "YLLCORNER %s\r\n", dummy); 2563 + gGraphSmartPrintf (img->pixel_y_size, dummy); 2564 + fprintf (out, "CELLSIZE %s\r\n", dummy); 2565 + gGraphSmartPrintf (img->no_data_value, dummy); 2566 + fprintf (out, "NODATA_VALUE %s\r\n", dummy); 2567 + fprintf (out, "BYTEORDER LSBFIRST\r\n"); 2568 + if (img->bits_per_sample == 16) 2569 + fprintf (out, "NUMBERTYPE 2_BYTE_INTEGER\r\n"); 2570 + else 2571 + fprintf (out, "NUMBERTYPE 4_BYTE_INTEGER\r\n"); 2572 + fprintf (out, "ZUNITS METERS\r\n"); 2573 + gGraphSmartPrintf (img->min_value, dummy); 2574 + fprintf (out, "MIN_VALUE %s\r\n", dummy); 2575 + gGraphSmartPrintf (img->max_value, dummy); 2576 + fprintf (out, "MAX_VALUE %s\r\n", dummy); 2577 + 2578 + fclose (out); 2579 + 2580 + return GGRAPH_OK; 2581 +} 2582 + 2583 +GGRAPH_DECLARE int 2584 +gGraphWriteFltHeader (const char *hdr_path, const void *ptr) 2585 +{ 2586 +/* exporting a FLT Header file */ 2587 + FILE *out = NULL; 2588 + char dummy[256]; 2589 + gGraphStripImagePtr img = (gGraphStripImagePtr) ptr; 2590 + 2591 + if (img == NULL) 2592 + return GGRAPH_INVALID_IMAGE; 2593 + if (img->signature != GG_STRIP_IMAGE_MAGIC_SIGNATURE) 2594 + return GGRAPH_INVALID_IMAGE; 2595 + 2596 +/* attempting to open/create the header file */ 2597 + out = fopen (hdr_path, "wb"); 2598 + if (out == NULL) 2599 + return GGRAPH_FILE_OPEN_ERROR; 2600 + 2601 + fprintf (out, "ncols %d\r\n", img->width); 2602 + fprintf (out, "nrows %d\r\n", img->height); 2603 + gGraphSmartPrintf (img->upper_left_x, dummy); 2604 + fprintf (out, "xllcorner %s\r\n", dummy); 2605 + gGraphSmartPrintf (img->upper_left_y - 2606 + ((double) (img->height) * img->pixel_y_size), dummy); 2607 + fprintf (out, "yllcorner %s\r\n", dummy); 2608 + gGraphSmartPrintf (img->pixel_y_size, dummy); 2609 + fprintf (out, "cellsize %s\r\n", dummy); 2610 + gGraphSmartPrintf (img->no_data_value, dummy); 2611 + fprintf (out, "NODATA_value %s\r\n", dummy); 2612 + fprintf (out, "byteorder LSBFIRST\r\n"); 2613 + if (img->bits_per_sample == 32) 2614 + fprintf (out, "NUMBERTYPE 4_BYTE_FLOAT\r\n"); 2615 + else 2616 + fprintf (out, "NUMBERTYPE 8_BYTE_FLOAT\r\n"); 2617 + gGraphSmartPrintf (img->min_value, dummy); 2618 + fprintf (out, "MIN_VALUE %s\r\n", dummy); 2619 + gGraphSmartPrintf (img->max_value, dummy); 2620 + fprintf (out, "MAX_VALUE %s\r\n", dummy); 2621 + 2622 + fclose (out); 2623 + 2624 + return GGRAPH_OK; 2625 +}
Added src/gaiagraphics_image.c.
1 +/* 2 +/ gaiagraphics_image.c 3 +/ 4 +/ image methods 5 +/ 6 +/ version 1.0, 2010 July 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2010 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdio.h> 28 +#include <stdlib.h> 29 +#include <string.h> 30 +#include <float.h> 31 +#include <math.h> 32 +#include <limits.h> 33 + 34 +#include "gaiagraphics.h" 35 +#include "gaiagraphics_internals.h" 36 + 37 +GGRAPH_PRIVATE gGraphImageInfosPtr 38 +gg_image_infos_create (int pixel_format, int width, int height, 39 + int bits_per_sample, int samples_per_pixel, 40 + int sample_format, const char *srs_name, 41 + const char *proj4text) 42 +{ 43 +/* creating an image infos struct */ 44 + gGraphImageInfosPtr img; 45 + int len; 46 + char *SrsName = NULL; 47 + char *Proj4Text = NULL; 48 + 49 +/* checking PIXEL_FORMAT */ 50 + if (pixel_format == GG_PIXEL_RGB || pixel_format == GG_PIXEL_RGBA 51 + || pixel_format == GG_PIXEL_ARGB || pixel_format == GG_PIXEL_BGR 52 + || pixel_format == GG_PIXEL_GRAYSCALE 53 + || pixel_format == GG_PIXEL_PALETTE || pixel_format == GG_PIXEL_GRID 54 + || pixel_format == GG_PIXEL_UNKNOWN) 55 + ; 56 + else 57 + return NULL; 58 + 59 + if (srs_name) 60 + { 61 + len = strlen (srs_name); 62 + SrsName = malloc (len + 1); 63 + if (!SrsName) 64 + return NULL; 65 + strcpy (SrsName, srs_name); 66 + } 67 + if (proj4text) 68 + { 69 + len = strlen (proj4text); 70 + Proj4Text = malloc (len + 1); 71 + if (!Proj4Text) 72 + { 73 + if (SrsName) 74 + free (SrsName); 75 + return NULL; 76 + } 77 + strcpy (Proj4Text, proj4text); 78 + } 79 + 80 +/* allocating the image INFOS struct */ 81 + img = malloc (sizeof (gGraphImage)); 82 + if (!img) 83 + return NULL; 84 + 85 + img->signature = GG_IMAGE_INFOS_MAGIC_SIGNATURE; 86 + img->width = width; 87 + img->height = height; 88 + img->bits_per_sample = bits_per_sample; 89 + img->samples_per_pixel = samples_per_pixel; 90 + img->sample_format = sample_format; 91 + img->pixel_format = pixel_format; 92 + img->max_palette = 0; 93 + img->is_transparent = 0; 94 + img->tile_width = -1; 95 + img->tile_height = -1; 96 + img->rows_per_strip = -1; 97 + img->compression = GGRAPH_TIFF_COMPRESSION_NONE; 98 + img->scale_1_2 = 0; 99 + img->scale_1_4 = 0; 100 + img->scale_1_8 = 0; 101 + img->is_georeferenced = 0; 102 + img->srid = -1; 103 + img->srs_name = SrsName; 104 + img->proj4text = Proj4Text; 105 + img->upper_left_x = DBL_MAX; 106 + img->upper_left_y = DBL_MAX; 107 + img->pixel_x_size = 0.0; 108 + img->pixel_y_size = 0.0; 109 + img->no_data_value = 0.0 - DBL_MAX; 110 + img->min_value = DBL_MAX; 111 + img->max_value = 0.0 - DBL_MAX; 112 + 113 + return img; 114 +} 115 + 116 +GGRAPH_PRIVATE void 117 +gg_image_infos_destroy (gGraphImageInfosPtr img) 118 +{ 119 +/* destroying an image INFOS struct */ 120 + if (!img) 121 + return; 122 + if (img->srs_name) 123 + free (img->srs_name); 124 + if (img->proj4text) 125 + free (img->proj4text); 126 + free (img); 127 +} 128 + 129 +GGRAPH_PRIVATE gGraphImagePtr 130 +gg_image_create (int pixel_format, int width, int height, int bits_per_sample, 131 + int samples_per_pixel, int sample_format, const char *srs_name, 132 + const char *proj4text) 133 +{ 134 +/* creating a generic image */ 135 + gGraphImagePtr img; 136 + int len; 137 + char *SrsName = NULL; 138 + char *Proj4Text = NULL; 139 + 140 +/* checking PIXEL_FORMAT */ 141 + if (pixel_format == GG_PIXEL_RGB || pixel_format == GG_PIXEL_RGBA 142 + || pixel_format == GG_PIXEL_ARGB || pixel_format == GG_PIXEL_BGR 143 + || pixel_format == GG_PIXEL_GRAYSCALE 144 + || pixel_format == GG_PIXEL_PALETTE || pixel_format == GG_PIXEL_GRID) 145 + ; 146 + else 147 + return NULL; 148 + if (sample_format == GGRAPH_SAMPLE_UINT 149 + || sample_format == GGRAPH_SAMPLE_INT 150 + || sample_format == GGRAPH_SAMPLE_FLOAT) 151 + ; 152 + else 153 + return NULL; 154 + 155 + if (srs_name) 156 + { 157 + len = strlen (srs_name); 158 + if (len > 0) 159 + { 160 + SrsName = malloc (len + 1); 161 + if (!SrsName) 162 + return NULL; 163 + strcpy (SrsName, srs_name); 164 + } 165 + } 166 + if (proj4text) 167 + { 168 + len = strlen (proj4text); 169 + if (len > 0) 170 + { 171 + Proj4Text = malloc (len + 1); 172 + if (!Proj4Text) 173 + { 174 + if (SrsName) 175 + free (SrsName); 176 + return NULL; 177 + } 178 + strcpy (Proj4Text, proj4text); 179 + } 180 + } 181 + 182 +/* allocating the image struct */ 183 + img = malloc (sizeof (gGraphImage)); 184 + if (!img) 185 + return NULL; 186 + 187 + img->signature = GG_IMAGE_MAGIC_SIGNATURE; 188 + img->pixels = NULL; 189 + img->width = width; 190 + img->height = height; 191 + img->bits_per_sample = bits_per_sample; 192 + img->samples_per_pixel = samples_per_pixel; 193 + img->sample_format = sample_format; 194 + img->pixel_format = pixel_format; 195 + img->max_palette = 0; 196 + img->is_transparent = 0; 197 + img->tile_width = -1; 198 + img->tile_height = -1; 199 + img->rows_per_strip = -1; 200 + img->compression = GGRAPH_TIFF_COMPRESSION_NONE; 201 + img->is_georeferenced = 0; 202 + img->srid = -1; 203 + img->srs_name = SrsName; 204 + img->proj4text = Proj4Text; 205 + img->upper_left_x = DBL_MAX; 206 + img->upper_left_y = DBL_MAX; 207 + img->pixel_x_size = 0.0; 208 + img->pixel_y_size = 0.0; 209 + img->no_data_value = 0.0 - DBL_MAX; 210 + img->min_value = DBL_MAX; 211 + img->max_value = 0.0 - DBL_MAX; 212 + 213 +/* computing the scanline size */ 214 + if (pixel_format == GG_PIXEL_GRAYSCALE || pixel_format == GG_PIXEL_PALETTE) 215 + { 216 + img->scanline_width = width; 217 + img->pixel_size = 1; 218 + } 219 + else if (pixel_format == GG_PIXEL_RGB || pixel_format == GG_PIXEL_BGR) 220 + { 221 + img->scanline_width = width * 3; 222 + img->pixel_size = 3; 223 + } 224 + else if (pixel_format == GG_PIXEL_GRID) 225 + { 226 + if (sample_format == GGRAPH_SAMPLE_FLOAT) 227 + { 228 + if (bits_per_sample == 32) 229 + { 230 + /* float */ 231 + img->scanline_width = width * 4; 232 + img->pixel_size = 8; 233 + } 234 + else 235 + { 236 + /* double */ 237 + img->scanline_width = width * 8; 238 + img->pixel_size = 8; 239 + } 240 + } 241 + else 242 + { 243 + /* UINT or INT */ 244 + if (bits_per_sample == 8) 245 + { 246 + /* 8bits int */ 247 + img->scanline_width = width; 248 + img->pixel_size = 1; 249 + } 250 + else if (bits_per_sample == 16) 251 + { 252 + /* 16bits int */ 253 + img->scanline_width = width * 2; 254 + img->pixel_size = 2; 255 + } 256 + else 257 + { 258 + /* 32bits int */ 259 + img->scanline_width = width * 4; 260 + img->pixel_size = 4; 261 + } 262 + } 263 + } 264 + else 265 + { 266 + /* RGBA, ARGB or BGRA */ 267 + img->scanline_width = width * 4; 268 + img->pixel_size = 4; 269 + } 270 + 271 +/* allocating the pixel buffer */ 272 + img->pixels = malloc (img->scanline_width * height); 273 + if (!img->pixels) 274 + { 275 + free (img); 276 + return NULL; 277 + } 278 + return img; 279 +} 280 + 281 +GGRAPH_PRIVATE gGraphImagePtr 282 +gg_image_create_from_bitmap (unsigned char *bitmap, int pixel_format, int width, 283 + int height, int bits_per_sample, 284 + int samples_per_pixel, int sample_format, 285 + const char *srs_name, const char *proj4text) 286 +{ 287 +/* creating a generic image */ 288 + gGraphImagePtr img; 289 + int len; 290 + char *SrsName = NULL; 291 + char *Proj4Text = NULL; 292 + 293 +/* checking PIXEL_FORMAT */ 294 + if (pixel_format == GG_PIXEL_RGB || pixel_format == GG_PIXEL_RGBA 295 + || pixel_format == GG_PIXEL_ARGB || pixel_format == GG_PIXEL_BGR 296 + || pixel_format == GG_PIXEL_GRAYSCALE 297 + || pixel_format == GG_PIXEL_PALETTE || pixel_format == GG_PIXEL_GRID) 298 + ; 299 + else 300 + return NULL; 301 + if (sample_format == GGRAPH_SAMPLE_UINT 302 + || sample_format == GGRAPH_SAMPLE_INT 303 + || sample_format == GGRAPH_SAMPLE_FLOAT) 304 + ; 305 + else 306 + return NULL; 307 + 308 + if (srs_name) 309 + { 310 + len = strlen (srs_name); 311 + if (len > 0) 312 + { 313 + SrsName = malloc (len + 1); 314 + if (!SrsName) 315 + return NULL; 316 + strcpy (SrsName, srs_name); 317 + } 318 + } 319 + if (proj4text) 320 + { 321 + len = strlen (proj4text); 322 + if (len > 0) 323 + { 324 + Proj4Text = malloc (len + 1); 325 + if (!Proj4Text) 326 + { 327 + if (SrsName) 328 + free (SrsName); 329 + return NULL; 330 + } 331 + strcpy (Proj4Text, proj4text); 332 + } 333 + } 334 + 335 +/* allocating the image struct */ 336 + img = malloc (sizeof (gGraphImage)); 337 + if (!img) 338 + return NULL; 339 + 340 + img->signature = GG_IMAGE_MAGIC_SIGNATURE; 341 + img->pixels = NULL; 342 + img->width = width; 343 + img->height = height; 344 + img->bits_per_sample = bits_per_sample; 345 + img->samples_per_pixel = samples_per_pixel; 346 + img->sample_format = sample_format; 347 + img->pixel_format = pixel_format; 348 + img->max_palette = 0; 349 + img->is_transparent = 0; 350 + img->tile_width = -1; 351 + img->tile_height = -1; 352 + img->rows_per_strip = -1; 353 + img->compression = GGRAPH_TIFF_COMPRESSION_NONE; 354 + img->is_georeferenced = 0; 355 + img->srid = -1; 356 + img->srs_name = SrsName; 357 + img->proj4text = Proj4Text; 358 + img->upper_left_x = DBL_MAX; 359 + img->upper_left_y = DBL_MAX; 360 + img->pixel_x_size = 0.0; 361 + img->pixel_y_size = 0.0; 362 + img->no_data_value = 0.0 - DBL_MAX; 363 + img->min_value = DBL_MAX; 364 + img->max_value = 0.0 - DBL_MAX; 365 + 366 +/* computing the scanline size */ 367 + if (pixel_format == GG_PIXEL_GRAYSCALE || pixel_format == GG_PIXEL_PALETTE) 368 + { 369 + img->scanline_width = width; 370 + img->pixel_size = 1; 371 + } 372 + else if (pixel_format == GG_PIXEL_RGB || pixel_format == GG_PIXEL_BGR) 373 + { 374 + img->scanline_width = width * 3; 375 + img->pixel_size = 3; 376 + } 377 + else if (pixel_format == GG_PIXEL_GRID) 378 + { 379 + if (sample_format == GGRAPH_SAMPLE_FLOAT) 380 + { 381 + if (bits_per_sample == 32) 382 + { 383 + /* float */ 384 + img->scanline_width = width * 4; 385 + img->pixel_size = 8; 386 + } 387 + else 388 + { 389 + /* double */ 390 + img->scanline_width = width * 8; 391 + img->pixel_size = 8; 392 + } 393 + } 394 + else 395 + { 396 + /* UINT or INT */ 397 + if (bits_per_sample == 8) 398 + { 399 + /* 8bits int */ 400 + img->scanline_width = width; 401 + img->pixel_size = 1; 402 + } 403 + else if (bits_per_sample == 16) 404 + { 405 + /* 16bits int */ 406 + img->scanline_width = width * 2; 407 + img->pixel_size = 2; 408 + } 409 + else 410 + { 411 + /* 32bits int */ 412 + img->scanline_width = width * 4; 413 + img->pixel_size = 4; 414 + } 415 + } 416 + } 417 + else 418 + { 419 + /* RGBA, ARGB or BGRA */ 420 + img->scanline_width = width * 4; 421 + img->pixel_size = 4; 422 + } 423 + 424 +/* setting up the pixel buffer */ 425 + img->pixels = bitmap; 426 + return img; 427 +} 428 + 429 +GGRAPH_PRIVATE void 430 +gg_image_destroy (gGraphImagePtr img) 431 +{ 432 +/* destroying a generic image */ 433 + if (!img) 434 + return; 435 + if (img->pixels) 436 + free (img->pixels); 437 + if (img->srs_name) 438 + free (img->srs_name); 439 + if (img->proj4text) 440 + free (img->proj4text); 441 + free (img); 442 +} 443 + 444 +GGRAPH_PRIVATE gGraphStripImagePtr 445 +gg_strip_image_create (FILE * file_handle, int codec_id, int pixel_format, 446 + int width, int height, int bits_per_sample, 447 + int samples_per_pixel, int sample_format, 448 + const char *srs_name, const char *proj4text) 449 +{ 450 +/* creating a file-based image implementing access by strips */ 451 + gGraphStripImagePtr img; 452 + int len; 453 + char *SrsName = NULL; 454 + char *Proj4Text = NULL; 455 + 456 +/* checking PIXEL_FORMAT */ 457 + if (pixel_format == GG_PIXEL_RGB || pixel_format == GG_PIXEL_RGBA 458 + || pixel_format == GG_PIXEL_ARGB || pixel_format == GG_PIXEL_BGR 459 + || pixel_format == GG_PIXEL_GRAYSCALE 460 + || pixel_format == GG_PIXEL_PALETTE || pixel_format == GG_PIXEL_GRID) 461 + ; 462 + else 463 + return NULL; 464 + if (sample_format == GGRAPH_SAMPLE_UINT 465 + || sample_format == GGRAPH_SAMPLE_INT 466 + || sample_format == GGRAPH_SAMPLE_FLOAT) 467 + ; 468 + else 469 + return NULL; 470 + 471 + if (srs_name) 472 + { 473 + len = strlen (srs_name); 474 + if (len > 0) 475 + { 476 + SrsName = malloc (len + 1); 477 + if (!SrsName) 478 + return NULL; 479 + strcpy (SrsName, srs_name); 480 + } 481 + } 482 + if (proj4text) 483 + { 484 + len = strlen (proj4text); 485 + if (len > 0) 486 + { 487 + Proj4Text = malloc (len + 1); 488 + if (!Proj4Text) 489 + { 490 + if (SrsName) 491 + free (SrsName); 492 + return NULL; 493 + } 494 + strcpy (Proj4Text, proj4text); 495 + } 496 + } 497 + 498 +/* allocating the image struct */ 499 + img = malloc (sizeof (gGraphStripImage)); 500 + if (!img) 501 + return NULL; 502 + 503 + img->signature = GG_STRIP_IMAGE_MAGIC_SIGNATURE; 504 + img->file_handle = file_handle; 505 + img->codec_id = codec_id; 506 + img->rows_per_block = 0; 507 + img->current_available_rows = 0; 508 + img->codec_data = NULL; 509 + img->pixels = NULL; 510 + img->next_row = 0; 511 + img->codec_data = NULL; 512 + img->width = width; 513 + img->height = height; 514 + img->bits_per_sample = bits_per_sample; 515 + img->samples_per_pixel = samples_per_pixel; 516 + img->sample_format = sample_format; 517 + img->pixel_format = pixel_format; 518 + img->max_palette = 0; 519 + img->is_transparent = 0; 520 + img->tile_width = -1; 521 + img->tile_height = -1; 522 + img->rows_per_strip = -1; 523 + img->compression = GGRAPH_TIFF_COMPRESSION_NONE; 524 + img->is_georeferenced = 0; 525 + img->srid = -1; 526 + img->srs_name = SrsName; 527 + img->proj4text = Proj4Text; 528 + img->upper_left_x = DBL_MAX; 529 + img->upper_left_y = DBL_MAX; 530 + img->pixel_x_size = 0.0; 531 + img->pixel_y_size = 0.0; 532 + img->no_data_value = 0.0 - DBL_MAX; 533 + img->min_value = DBL_MAX; 534 + img->max_value = 0.0 - DBL_MAX; 535 + 536 +/* computing the scanline size */ 537 + if (pixel_format == GG_PIXEL_GRAYSCALE || pixel_format == GG_PIXEL_PALETTE) 538 + { 539 + img->scanline_width = width; 540 + img->pixel_size = 1; 541 + } 542 + else if (pixel_format == GG_PIXEL_RGB || pixel_format == GG_PIXEL_BGR) 543 + { 544 + img->scanline_width = width * 3; 545 + img->pixel_size = 3; 546 + } 547 + else if (pixel_format == GG_PIXEL_GRID) 548 + { 549 + if (sample_format == GGRAPH_SAMPLE_FLOAT) 550 + { 551 + if (bits_per_sample == 32) 552 + { 553 + /* float */ 554 + img->scanline_width = width * 4; 555 + img->pixel_size = 8; 556 + } 557 + else 558 + { 559 + /* double */ 560 + img->scanline_width = width * 8; 561 + img->pixel_size = 8; 562 + } 563 + } 564 + else 565 + { 566 + /* UINT or INT */ 567 + if (bits_per_sample == 8) 568 + { 569 + /* 8bits int */ 570 + img->scanline_width = width; 571 + img->pixel_size = 1; 572 + } 573 + else if (bits_per_sample == 16) 574 + { 575 + /* 16bits int */ 576 + img->scanline_width = width * 2; 577 + img->pixel_size = 2; 578 + } 579 + else 580 + { 581 + /* 32bits int */ 582 + img->scanline_width = width * 4; 583 + img->pixel_size = 4; 584 + } 585 + } 586 + } 587 + else 588 + { 589 + /* RGBA, ARGB or BGRA */ 590 + img->scanline_width = width * 4; 591 + img->pixel_size = 4; 592 + } 593 + 594 + return img; 595 +} 596 + 597 +GGRAPH_PRIVATE void 598 +gg_strip_image_destroy (gGraphStripImagePtr img) 599 +{ 600 +/* destroying a file-based image implementing access by strips */ 601 + if (!img) 602 + return; 603 + if (img->codec_id == GGRAPH_IMAGE_PNG) 604 + gg_png_codec_destroy (img->codec_data); 605 + if (img->codec_id == GGRAPH_IMAGE_JPEG) 606 + gg_jpeg_codec_destroy (img->codec_data); 607 + if (img->codec_id == GGRAPH_IMAGE_TIFF 608 + || img->codec_id == GGRAPH_IMAGE_GEOTIFF) 609 + gg_tiff_codec_destroy (img->codec_data); 610 + if (img->codec_id == GGRAPH_IMAGE_HGT) 611 + gg_grid_codec_destroy (img->codec_data); 612 + if (img->file_handle) 613 + fclose (img->file_handle); 614 + if (img->pixels) 615 + free (img->pixels); 616 + if (img->srs_name) 617 + free (img->srs_name); 618 + if (img->proj4text) 619 + free (img->proj4text); 620 + free (img); 621 +} 622 + 623 +GGRAPH_PRIVATE void 624 +gg_image_clone_georeferencing (const gGraphImagePtr dst, 625 + const gGraphImagePtr src) 626 +{ 627 +/* adjusting georeferencing infos between two images */ 628 + double size_x; 629 + double size_y; 630 + int len; 631 + char *SrsName = NULL; 632 + char *Proj4Text = NULL; 633 + if (src->is_georeferenced) 634 + { 635 + if (src->srs_name) 636 + { 637 + len = strlen (src->srs_name); 638 + if (len > 0) 639 + { 640 + SrsName = malloc (len + 1); 641 + if (SrsName) 642 + strcpy (SrsName, src->srs_name); 643 + } 644 + } 645 + if (src->proj4text) 646 + { 647 + len = strlen (src->proj4text); 648 + if (len > 0) 649 + { 650 + Proj4Text = malloc (len + 1); 651 + if (Proj4Text) 652 + strcpy (Proj4Text, src->proj4text); 653 + } 654 + } 655 + } 656 + 657 +/* cleaning up destination georeferencing */ 658 + dst->is_georeferenced = 0; 659 + dst->srid = -1; 660 + if (dst->srs_name) 661 + free (dst->srs_name); 662 + if (dst->proj4text) 663 + free (dst->proj4text); 664 + dst->srs_name = NULL; 665 + dst->proj4text = NULL; 666 + dst->upper_left_x = DBL_MAX; 667 + dst->upper_left_y = DBL_MAX; 668 + dst->pixel_x_size = 0.0; 669 + dst->pixel_y_size = 0.0; 670 + if (src->is_georeferenced == 0) 671 + return; 672 + 673 +/* setting up destination georeferencing */ 674 + dst->is_georeferenced = 1; 675 + dst->srid = src->srid; 676 + dst->srs_name = SrsName; 677 + dst->proj4text = Proj4Text; 678 + dst->upper_left_x = src->upper_left_x; 679 + dst->upper_left_y = src->upper_left_y; 680 + size_x = (double) (src->width) * src->pixel_x_size; 681 + size_y = (double) (src->height) * src->pixel_y_size; 682 + dst->pixel_x_size = size_x / (double) (dst->width); 683 + dst->pixel_y_size = size_y / (double) (dst->height); 684 + 685 +} 686 + 687 +static void 688 +sub_set_georeferencing (const gGraphImagePtr dst, const gGraphImagePtr src, 689 + int upper_left_x, int upper_left_y) 690 +{ 691 +/* adjusting georeferencing infos between two images [ImageSubSet] */ 692 + int len; 693 + char *SrsName = NULL; 694 + char *Proj4Text = NULL; 695 + if (src->is_georeferenced) 696 + { 697 + if (src->srs_name) 698 + { 699 + len = strlen (src->srs_name); 700 + if (len > 0) 701 + { 702 + SrsName = malloc (len + 1); 703 + if (SrsName) 704 + strcpy (SrsName, src->srs_name); 705 + } 706 + } 707 + if (src->proj4text) 708 + { 709 + len = strlen (src->proj4text); 710 + if (len > 0) 711 + { 712 + Proj4Text = malloc (len + 1); 713 + if (Proj4Text) 714 + strcpy (Proj4Text, src->proj4text); 715 + } 716 + } 717 + } 718 + 719 +/* cleaning up destination georeferencing */ 720 + dst->is_georeferenced = 0; 721 + dst->srid = -1; 722 + if (dst->srs_name) 723 + free (dst->srs_name); 724 + if (dst->proj4text) 725 + free (dst->proj4text); 726 + dst->srs_name = NULL; 727 + dst->proj4text = NULL; 728 + dst->upper_left_x = DBL_MAX; 729 + dst->upper_left_y = DBL_MAX; 730 + dst->pixel_x_size = 0.0; 731 + dst->pixel_y_size = 0.0; 732 + if (src->is_georeferenced == 0) 733 + return; 734 + 735 +/* setting up destination georeferencing */ 736 + dst->is_georeferenced = 1; 737 + dst->srid = src->srid; 738 + dst->srs_name = SrsName; 739 + dst->proj4text = Proj4Text; 740 + dst->upper_left_x = 741 + src->upper_left_x + ((double) upper_left_x * src->pixel_x_size); 742 + dst->upper_left_y = 743 + src->upper_left_y - ((double) upper_left_y * src->pixel_y_size); 744 + dst->pixel_x_size = src->pixel_x_size; 745 + dst->pixel_y_size = src->pixel_y_size; 746 + 747 +} 748 + 749 +GGRAPH_PRIVATE void 750 +gg_image_sub_set (const gGraphImagePtr dst, const gGraphImagePtr src, 751 + int upper_left_x, int upper_left_y) 752 +{ 753 +/* creating an ImageSubSet */ 754 + int x; 755 + int y; 756 + int dx; 757 + int dy = 0; 758 + int c; 759 + unsigned char *p_in; 760 + unsigned char *p_out; 761 + 762 + if (src->pixel_format != dst->pixel_format) 763 + { 764 + /* an absolutely unexpected condition !!!! */ 765 + return; 766 + } 767 + 768 + for (y = upper_left_y; y < src->height; y++, dy++) 769 + { 770 + if (dy >= dst->height) 771 + break; 772 + dx = 0; 773 + p_in = src->pixels + (y * src->scanline_width); 774 + p_in += upper_left_x * src->pixel_size; 775 + p_out = dst->pixels + (dy * dst->scanline_width); 776 + for (x = upper_left_x; x < src->width; x++, dx++) 777 + { 778 + if (dx >= dst->width) 779 + break; 780 + /* copying pixel's components */ 781 + for (c = 0; c < src->pixel_size; c++) 782 + *p_out++ = *p_in++; 783 + } 784 + } 785 + if (src->pixel_format == GG_PIXEL_PALETTE) 786 + { 787 + /* copying palette entries */ 788 + for (x = 0; x < src->max_palette; x++) 789 + { 790 + dst->palette_red[x] = src->palette_red[x]; 791 + dst->palette_green[x] = src->palette_green[x]; 792 + dst->palette_blue[x] = src->palette_blue[x]; 793 + } 794 + dst->max_palette = src->max_palette; 795 + } 796 + 797 +/* computing georeferencing */ 798 + sub_set_georeferencing (dst, src, upper_left_x, upper_left_y); 799 +} 800 + 801 +static unsigned char 802 +to_grayscale (unsigned char r, unsigned char g, unsigned char b) 803 +{ 804 +/* computing a grayscale value */ 805 + double dval = 806 + (0.3 * (double) r) + (0.59 * (double) g) + (0.11 * (double) b); 807 + int ival = (int) dval; 808 + if (ival < 0) 809 + ival = 0; 810 + if (ival > 255) 811 + ival = 255; 812 + return (unsigned char) ival; 813 +} 814 + 815 +GGRAPH_PRIVATE void 816 +gg_image_fill (const gGraphImagePtr img, unsigned char r, unsigned char g, 817 + unsigned char b, unsigned char alpha) 818 +{ 819 +/* filling the image with given color */ 820 + int x; 821 + int y; 822 + unsigned char *p; 823 + unsigned char gray; 824 + 825 +/* resetting the palette anyway */ 826 + img->max_palette = 1; 827 + img->palette_red[0] = r; 828 + img->palette_green[0] = g; 829 + img->palette_blue[0] = b; 830 + 831 +/* precomputing a grayscale value anyway */ 832 + if (r == g && g == b) 833 + gray = r; 834 + else 835 + gray = to_grayscale (r, g, b); 836 + 837 + for (y = 0; y < img->height; y++) 838 + { 839 + /* setting pixels by scanline */ 840 + p = img->pixels + (y * img->scanline_width); 841 + for (x = 0; x < img->width; x++) 842 + { 843 + /* setting pixels */ 844 + if (img->pixel_format == GG_PIXEL_RGB) 845 + { 846 + *p++ = r; 847 + *p++ = g; 848 + *p++ = b; 849 + } 850 + else if (img->pixel_format == GG_PIXEL_RGBA) 851 + { 852 + *p++ = r; 853 + *p++ = g; 854 + *p++ = b; 855 + *p++ = alpha; 856 + } 857 + else if (img->pixel_format == GG_PIXEL_ARGB) 858 + { 859 + *p++ = alpha; 860 + *p++ = r; 861 + *p++ = g; 862 + *p++ = b; 863 + } 864 + else if (img->pixel_format == GG_PIXEL_BGR) 865 + { 866 + *p++ = b; 867 + *p++ = g; 868 + *p++ = r; 869 + } 870 + else if (img->pixel_format == GG_PIXEL_BGRA) 871 + { 872 + *p++ = b; 873 + *p++ = g; 874 + *p++ = r; 875 + *p++ = alpha; 876 + } 877 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 878 + *p++ = gray; 879 + else if (img->pixel_format == GG_PIXEL_PALETTE) 880 + *p++ = 0; 881 + } 882 + } 883 +} 884 + 885 +GGRAPH_PRIVATE unsigned char 886 +gg_match_palette (const gGraphImagePtr img, unsigned char r, unsigned char g, 887 + unsigned char b) 888 +{ 889 +/* handling palette colors */ 890 + int index; 891 + double min_dist = DBL_MAX; 892 + double dist; 893 + int min_index; 894 + for (index = 0; index < img->max_palette; index++) 895 + { 896 + /* searching if already defined */ 897 + if (img->palette_red[index] == r && img->palette_green[index] == g 898 + && img->palette_blue[index] == b) 899 + return (unsigned char) index; 900 + } 901 + if (img->max_palette < 255) 902 + { 903 + /* inserting a new palette entry */ 904 + unsigned char i = img->max_palette; 905 + img->max_palette += 1; 906 + img->palette_red[i] = r; 907 + img->palette_green[i] = g; 908 + img->palette_blue[i] = b; 909 + return i; 910 + } 911 +/* all right, the palette is already fully populated */ 912 + for (index = 0; index < img->max_palette; index++) 913 + { 914 + /* computing the minimal euclidean distance */ 915 + dist = 916 + sqrt (((img->palette_red[index] - r) * (img->palette_red[index] - 917 + r)) + 918 + ((img->palette_green[index] - 919 + g) * (img->palette_green[index] - g)) + 920 + ((img->palette_blue[index] - 921 + b) * (img->palette_blue[index] - b))); 922 + if (dist < min_dist) 923 + { 924 + min_dist = dist; 925 + min_index = index; 926 + } 927 + } 928 + return (unsigned char) min_index; 929 +} 930 + 931 +static void 932 +shrink_by (const gGraphImagePtr dst, const gGraphImagePtr src) 933 +{ 934 +/* 935 +/ this code is widely base upon the original wxWidgets gwxImage wxImage::ShrinkBy(() function 936 +*/ 937 + int xFactor = src->width / dst->width; 938 + int yFactor = src->height / dst->height; 939 + int x; 940 + int y; 941 + int x1; 942 + int y1; 943 + int y_offset; 944 + int x_offset; 945 + unsigned char red; 946 + unsigned char green; 947 + unsigned char blue; 948 + unsigned char gray; 949 + unsigned char *p; 950 + for (y = 0; y < dst->height; y++) 951 + { 952 + for (x = 0; x < dst->width; x++) 953 + { 954 + /* determine average */ 955 + unsigned int avgRed = 0; 956 + unsigned int avgGreen = 0; 957 + unsigned int avgBlue = 0; 958 + unsigned int counter = 0; 959 + for (y1 = 0; y1 < yFactor; ++y1) 960 + { 961 + y_offset = (y * yFactor + y1); 962 + for (x1 = 0; x1 < xFactor; ++x1) 963 + { 964 + x_offset = (x * xFactor) + x1; 965 + p = src->pixels + (y_offset * src->scanline_width); 966 + if (src->pixel_format == GG_PIXEL_RGB) 967 + { 968 + p += x_offset * 3; 969 + red = *p++; 970 + green = *p++; 971 + blue = *p; 972 + } 973 + else if (src->pixel_format == GG_PIXEL_RGBA) 974 + { 975 + p += x_offset * 4; 976 + red = *p++; 977 + green = *p++; 978 + blue = *p; 979 + } 980 + else if (src->pixel_format == GG_PIXEL_ARGB) 981 + { 982 + p += x_offset * 4; 983 + p++; 984 + red = *p++; 985 + green = *p++; 986 + blue = *p; 987 + } 988 + else if (src->pixel_format == GG_PIXEL_BGR) 989 + { 990 + p += x_offset * 3; 991 + blue = *p++; 992 + green = *p++; 993 + red = *p; 994 + } 995 + else if (src->pixel_format == GG_PIXEL_BGRA) 996 + { 997 + p += x_offset * 4; 998 + blue = *p++; 999 + green = *p++; 1000 + red = *p; 1001 + } 1002 + else if (src->pixel_format == GG_PIXEL_GRAYSCALE) 1003 + { 1004 + p += x_offset; 1005 + red = *p; 1006 + green = *p; 1007 + blue = *p; 1008 + } 1009 + else if (src->pixel_format == GG_PIXEL_PALETTE) 1010 + { 1011 + p += x_offset; 1012 + red = src->palette_red[*p]; 1013 + green = src->palette_green[*p]; 1014 + blue = src->palette_blue[*p]; 1015 + } 1016 + avgRed += red; 1017 + avgGreen += green; 1018 + avgBlue += blue; 1019 + counter++; 1020 + } 1021 + } 1022 + /* storing the pixel into destination */ 1023 + red = avgRed / counter; 1024 + green = avgGreen / counter; 1025 + blue = avgBlue / counter; 1026 + p = dst->pixels + (y * dst->scanline_width); 1027 + if (dst->pixel_format == GG_PIXEL_RGB) 1028 + { 1029 + p += x * 3; 1030 + *p++ = red; 1031 + *p++ = green; 1032 + *p = blue; 1033 + } 1034 + else if (dst->pixel_format == GG_PIXEL_RGBA) 1035 + { 1036 + p += x * 4; 1037 + *p++ = red; 1038 + *p++ = green; 1039 + *p++ = blue; 1040 + *p = 255; /* opaque */ 1041 + } 1042 + else if (dst->pixel_format == GG_PIXEL_ARGB) 1043 + { 1044 + p += x * 4; 1045 + *p++ = 255; /* opaque */ 1046 + *p++ = red; 1047 + *p++ = green; 1048 + *p = blue; 1049 + } 1050 + else if (dst->pixel_format == GG_PIXEL_BGR) 1051 + { 1052 + p += x * 3; 1053 + *p++ = blue; 1054 + *p++ = green; 1055 + *p = red; 1056 + } 1057 + else if (dst->pixel_format == GG_PIXEL_BGRA) 1058 + { 1059 + p += x * 4; 1060 + *p++ = blue; 1061 + *p++ = green; 1062 + *p++ = red; 1063 + *p = 255; /* opaque */ 1064 + } 1065 + else if (dst->pixel_format == GG_PIXEL_GRAYSCALE) 1066 + { 1067 + p += x; 1068 + if (red == green && green == blue) 1069 + gray = red; 1070 + else 1071 + gray = to_grayscale (red, green, blue); 1072 + *p = gray; 1073 + } 1074 + else if (dst->pixel_format == GG_PIXEL_PALETTE) 1075 + { 1076 + unsigned char index = 1077 + gg_match_palette (dst, red, green, blue); 1078 + p += x; 1079 + *p = index; 1080 + } 1081 + } 1082 + } 1083 +} 1084 + 1085 +GGRAPH_PRIVATE void 1086 +gg_image_resize (const gGraphImagePtr dst, const gGraphImagePtr src) 1087 +{ 1088 +/* 1089 +/ this function builds an ordinary quality resized image, applying pixel replication 1090 +/ 1091 +/ this code is widely base upon the original wxWidgets gwxImage wxImage::Scale(() function 1092 +/ wxIMAGE_QUALITY_NORMAL 1093 +*/ 1094 + int x_delta; 1095 + int y_delta; 1096 + int y; 1097 + int j; 1098 + int x; 1099 + int i; 1100 + unsigned char red; 1101 + unsigned char green; 1102 + unsigned char blue; 1103 + unsigned char alpha; 1104 + unsigned char gray; 1105 + unsigned char *p; 1106 + 1107 + if ((src->width % dst->width) == 0 && src->width >= dst->width 1108 + && (src->height % dst->height) == 0 && src->height >= dst->height) 1109 + { 1110 + shrink_by (dst, src); 1111 + return; 1112 + } 1113 + x = src->width; 1114 + y = src->height; 1115 + x_delta = (x << 16) / dst->width; 1116 + y_delta = (y << 16) / dst->height; 1117 + y = 0; 1118 + for (j = 0; j < dst->height; j++) 1119 + { 1120 + x = 0; 1121 + for (i = 0; i < dst->width; i++) 1122 + { 1123 + /* retrieving the origin pixel */ 1124 + p = src->pixels + ((y >> 16) * src->scanline_width); 1125 + if (src->pixel_format == GG_PIXEL_RGB) 1126 + { 1127 + p += (x >> 16) * 3; 1128 + red = *p++; 1129 + green = *p++; 1130 + blue = *p; 1131 + alpha = 255; 1132 + } 1133 + else if (src->pixel_format == GG_PIXEL_RGBA) 1134 + { 1135 + p += (x >> 16) * 4; 1136 + red = *p++; 1137 + green = *p++; 1138 + blue = *p++; 1139 + alpha = *p; 1140 + } 1141 + else if (src->pixel_format == GG_PIXEL_ARGB) 1142 + { 1143 + p += (x >> 16) * 4; 1144 + alpha = *p++; 1145 + red = *p++; 1146 + green = *p++; 1147 + blue = *p; 1148 + } 1149 + else if (src->pixel_format == GG_PIXEL_BGR) 1150 + { 1151 + p += (x >> 16) * 3; 1152 + blue = *p++; 1153 + green = *p++; 1154 + red = *p; 1155 + alpha = 255; 1156 + } 1157 + else if (src->pixel_format == GG_PIXEL_BGRA) 1158 + { 1159 + p += (x >> 16) * 4; 1160 + blue = *p++; 1161 + green = *p++; 1162 + red = *p++; 1163 + alpha = *p; 1164 + } 1165 + else if (src->pixel_format == GG_PIXEL_GRAYSCALE) 1166 + { 1167 + p += (x >> 16); 1168 + red = *p; 1169 + green = *p; 1170 + blue = *p; 1171 + alpha = 255; 1172 + } 1173 + else if (src->pixel_format == GG_PIXEL_PALETTE) 1174 + { 1175 + p += (x >> 16); 1176 + red = src->palette_red[*p]; 1177 + green = src->palette_green[*p]; 1178 + blue = src->palette_blue[*p]; 1179 + alpha = 255; 1180 + } 1181 + /* setting the destination pixel */ 1182 + p = dst->pixels + (j * dst->scanline_width); 1183 + if (dst->pixel_format == GG_PIXEL_RGB) 1184 + { 1185 + p += i * 3; 1186 + *p++ = red; 1187 + *p++ = green; 1188 + *p = blue; 1189 + } 1190 + else if (dst->pixel_format == GG_PIXEL_RGBA) 1191 + { 1192 + p += i * 4; 1193 + *p++ = red; 1194 + *p++ = green; 1195 + *p++ = blue; 1196 + *p = alpha; 1197 + } 1198 + else if (dst->pixel_format == GG_PIXEL_ARGB) 1199 + { 1200 + p += i * 4; 1201 + *p++ = alpha; 1202 + *p++ = red; 1203 + *p++ = green; 1204 + *p = blue; 1205 + } 1206 + else if (dst->pixel_format == GG_PIXEL_BGR) 1207 + { 1208 + p += i * 3; 1209 + *p++ = blue; 1210 + *p++ = green; 1211 + *p = red; 1212 + } 1213 + else if (dst->pixel_format == GG_PIXEL_BGRA) 1214 + { 1215 + p += i * 4; 1216 + *p++ = blue; 1217 + *p++ = green; 1218 + *p++ = red; 1219 + *p = alpha; 1220 + } 1221 + else if (dst->pixel_format == GG_PIXEL_GRAYSCALE) 1222 + { 1223 + p += i; 1224 + if (red == green && green == blue) 1225 + gray = red; 1226 + else 1227 + gray = to_grayscale (red, green, blue); 1228 + *p = gray; 1229 + } 1230 + else if (dst->pixel_format == GG_PIXEL_PALETTE) 1231 + { 1232 + unsigned char index = 1233 + gg_match_palette (dst, red, green, blue); 1234 + p += i; 1235 + *p = index; 1236 + } 1237 + x += x_delta; 1238 + } 1239 + y += y_delta; 1240 + } 1241 +} 1242 + 1243 +static void 1244 +shrink_grid_by (const gGraphImagePtr dst, const gGraphImagePtr src) 1245 +{ 1246 +/* 1247 +/ this code is widely base upon the original wxWidgets gwxImage wxImage::ShrinkBy(() function 1248 +*/ 1249 + int xFactor = src->width / dst->width; 1250 + int yFactor = src->height / dst->height; 1251 + int x; 1252 + int y; 1253 + int x1; 1254 + int y1; 1255 + int y_offset; 1256 + int x_offset; 1257 + short short_value; 1258 + unsigned short ushort_value; 1259 + int int_value; 1260 + unsigned int uint_value; 1261 + float float_value; 1262 + double double_value; 1263 + short *p_short; 1264 + unsigned short *p_ushort; 1265 + int *p_int; 1266 + unsigned int *p_uint; 1267 + float *p_float; 1268 + double *p_double; 1269 + for (y = 0; y < dst->height; y++) 1270 + { 1271 + for (x = 0; x < dst->width; x++) 1272 + { 1273 + /* determine average */ 1274 + int is_nodata = 0; 1275 + double avg; 1276 + unsigned int counter = 0; 1277 + unsigned char *p; 1278 + for (y1 = 0; y1 < yFactor; ++y1) 1279 + { 1280 + y_offset = (y * yFactor + y1); 1281 + for (x1 = 0; x1 < xFactor; ++x1) 1282 + { 1283 + x_offset = (x * xFactor) + x1; 1284 + p = src->pixels + (y_offset * src->scanline_width); 1285 + if (src->pixel_format == GG_PIXEL_GRID) 1286 + { 1287 + p += x_offset * (src->bits_per_sample / 8); 1288 + switch (src->sample_format) 1289 + { 1290 + case GGRAPH_SAMPLE_INT: 1291 + if (src->bits_per_sample == 16) 1292 + { 1293 + p_short = (short *) p; 1294 + short_value = *p_short; 1295 + if (short_value == 1296 + src->no_data_value) 1297 + is_nodata = 1; 1298 + if (!is_nodata) 1299 + avg += short_value; 1300 + } 1301 + else 1302 + { 1303 + p_int = (int *) p; 1304 + int_value = *p_int; 1305 + if (int_value == 1306 + src->no_data_value) 1307 + is_nodata = 1; 1308 + if (!is_nodata) 1309 + avg += int_value; 1310 + } 1311 + break; 1312 + case GGRAPH_SAMPLE_UINT: 1313 + if (src->bits_per_sample == 16) 1314 + { 1315 + p_ushort = (unsigned short *) p; 1316 + ushort_value = *p_ushort; 1317 + if (ushort_value == 1318 + src->no_data_value) 1319 + is_nodata = 1; 1320 + if (!is_nodata) 1321 + avg += ushort_value; 1322 + } 1323 + else 1324 + { 1325 + p_uint = (unsigned int *) p; 1326 + uint_value = *p_uint; 1327 + if (uint_value == 1328 + src->no_data_value) 1329 + is_nodata = 1; 1330 + if (!is_nodata) 1331 + avg += uint_value; 1332 + } 1333 + break; 1334 + case GGRAPH_SAMPLE_FLOAT: 1335 + if (src->bits_per_sample == 32) 1336 + { 1337 + p_float = (float *) p; 1338 + float_value = *p_float; 1339 + if (float_value == 1340 + src->no_data_value) 1341 + is_nodata = 1; 1342 + if (!is_nodata) 1343 + avg += float_value; 1344 + } 1345 + else 1346 + { 1347 + p_double = (double *) p; 1348 + double_value = *p_double; 1349 + if (double_value == 1350 + src->no_data_value) 1351 + is_nodata = 1; 1352 + if (!is_nodata) 1353 + avg += double_value; 1354 + } 1355 + break; 1356 + }; 1357 + } 1358 + counter++; 1359 + } 1360 + } 1361 + /* storing the pixel into destination */ 1362 + p = dst->pixels + (y * dst->scanline_width); 1363 + if (dst->pixel_format == GG_PIXEL_GRID) 1364 + { 1365 + p += x * (dst->bits_per_sample / 8); 1366 + switch (dst->sample_format) 1367 + { 1368 + case GGRAPH_SAMPLE_INT: 1369 + if (dst->bits_per_sample == 16) 1370 + { 1371 + p_short = (short *) p; 1372 + if (is_nodata) 1373 + *p_short = (short) (dst->no_data_value); 1374 + else 1375 + *p_short = (short) (avg / counter); 1376 + } 1377 + else 1378 + { 1379 + p_int = (int *) p; 1380 + if (is_nodata) 1381 + *p_int = (int) (dst->no_data_value); 1382 + else 1383 + *p_int = (int) (avg / counter); 1384 + } 1385 + break; 1386 + case GGRAPH_SAMPLE_UINT: 1387 + if (dst->bits_per_sample == 16) 1388 + { 1389 + p_ushort = (unsigned short *) p; 1390 + if (is_nodata) 1391 + *p_ushort = 1392 + (unsigned short) (dst->no_data_value); 1393 + else 1394 + *p_ushort = 1395 + (unsigned short) (avg / counter); 1396 + } 1397 + else 1398 + { 1399 + p_uint = (unsigned int *) p; 1400 + if (is_nodata) 1401 + *p_uint = 1402 + (unsigned int) (dst->no_data_value); 1403 + else 1404 + *p_uint = (unsigned int) (avg / counter); 1405 + } 1406 + break; 1407 + case GGRAPH_SAMPLE_FLOAT: 1408 + if (dst->bits_per_sample == 32) 1409 + { 1410 + p_float = (float *) p; 1411 + if (is_nodata) 1412 + *p_float = (float) (dst->no_data_value); 1413 + else 1414 + *p_float = (float) (avg / counter); 1415 + } 1416 + else 1417 + { 1418 + p_double = (double *) p; 1419 + if (is_nodata) 1420 + *p_double = dst->no_data_value; 1421 + else 1422 + *p_double = avg / counter; 1423 + } 1424 + break; 1425 + }; 1426 + } 1427 + } 1428 + } 1429 +} 1430 + 1431 +GGRAPH_PRIVATE void 1432 +gg_grid_resize (const gGraphImagePtr dst, const gGraphImagePtr src) 1433 +{ 1434 +/* 1435 +/ this function builds an ordinary quality resized GRID, applying pixel replication 1436 +/ 1437 +/ this code is widely base upon the original wxWidgets gwxImage wxImage::Scale(() function 1438 +/ wxIMAGE_QUALITY_NORMAL 1439 +*/ 1440 + int x_delta; 1441 + int y_delta; 1442 + int y; 1443 + int j; 1444 + int x; 1445 + int i; 1446 + short short_value; 1447 + unsigned short ushort_value; 1448 + int int_value; 1449 + unsigned int uint_value; 1450 + float float_value; 1451 + double double_value; 1452 + short *p_short; 1453 + unsigned short *p_ushort; 1454 + int *p_int; 1455 + unsigned int *p_uint; 1456 + float *p_float; 1457 + double *p_double; 1458 + 1459 + if ((src->width % dst->width) == 0 && src->width >= dst->width 1460 + && (src->height % dst->height) == 0 && src->height >= dst->height) 1461 + { 1462 + shrink_grid_by (dst, src); 1463 + return; 1464 + } 1465 + x = src->width; 1466 + y = src->height; 1467 + x_delta = (x << 16) / dst->width; 1468 + y_delta = (y << 16) / dst->height; 1469 + y = 0; 1470 + for (j = 0; j < dst->height; j++) 1471 + { 1472 + x = 0; 1473 + for (i = 0; i < dst->width; i++) 1474 + { 1475 + /* retrieving the origin pixel */ 1476 + unsigned char *p = 1477 + src->pixels + ((y >> 16) * src->scanline_width); 1478 + if (src->pixel_format == GG_PIXEL_GRID) 1479 + { 1480 + p += (x >> 16) * (src->bits_per_sample / 8); 1481 + switch (src->sample_format) 1482 + { 1483 + case GGRAPH_SAMPLE_INT: 1484 + if (src->bits_per_sample == 16) 1485 + { 1486 + p_short = (short *) p; 1487 + short_value = *p_short; 1488 + p += sizeof (short); 1489 + } 1490 + else 1491 + { 1492 + p_int = (int *) p; 1493 + int_value = *p_int; 1494 + p += sizeof (int); 1495 + } 1496 + break; 1497 + case GGRAPH_SAMPLE_UINT: 1498 + if (src->bits_per_sample == 16) 1499 + { 1500 + p_ushort = (unsigned short *) p; 1501 + ushort_value = *p_ushort; 1502 + p += sizeof (unsigned short); 1503 + } 1504 + else 1505 + { 1506 + p_uint = (unsigned int *) p; 1507 + uint_value = *p_uint; 1508 + p += sizeof (unsigned int); 1509 + } 1510 + break; 1511 + case GGRAPH_SAMPLE_FLOAT: 1512 + if (src->bits_per_sample == 32) 1513 + { 1514 + p_float = (float *) p; 1515 + float_value = *p_float; 1516 + p += sizeof (float); 1517 + } 1518 + else 1519 + { 1520 + p_double = (double *) p; 1521 + double_value = *p_double; 1522 + p += sizeof (double); 1523 + } 1524 + break; 1525 + }; 1526 + } 1527 + /* setting the destination pixel */ 1528 + p = dst->pixels + (j * dst->scanline_width); 1529 + if (dst->pixel_format == GG_PIXEL_GRID) 1530 + { 1531 + p += i * (dst->bits_per_sample / 8); 1532 + switch (dst->sample_format) 1533 + { 1534 + case GGRAPH_SAMPLE_INT: 1535 + if (dst->bits_per_sample == 16) 1536 + { 1537 + p_short = (short *) p; 1538 + *p_short = short_value; 1539 + } 1540 + else 1541 + { 1542 + p_int = (int *) p; 1543 + *p_int = int_value; 1544 + } 1545 + break; 1546 + case GGRAPH_SAMPLE_UINT: 1547 + if (dst->bits_per_sample == 16) 1548 + { 1549 + p_ushort = (unsigned short *) p; 1550 + *p_ushort = ushort_value; 1551 + } 1552 + else 1553 + { 1554 + p_uint = (unsigned int *) p; 1555 + *p_uint = uint_value; 1556 + } 1557 + break; 1558 + case GGRAPH_SAMPLE_FLOAT: 1559 + if (dst->bits_per_sample == 32) 1560 + { 1561 + p_float = (float *) p; 1562 + *p_float = float_value; 1563 + } 1564 + else 1565 + { 1566 + p_double = (double *) p; 1567 + *p_double = double_value; 1568 + } 1569 + break; 1570 + }; 1571 + } 1572 + x += x_delta; 1573 + } 1574 + y += y_delta; 1575 + } 1576 +} 1577 + 1578 +#define floor2(exp) ((long) exp) 1579 + 1580 +GGRAPH_PRIVATE void 1581 +gg_make_thumbnail (const gGraphImagePtr thumbnail, const gGraphImagePtr image) 1582 +{ 1583 +/* 1584 +/ this function builds an high quality thumbnail image, applying pixel interpolation 1585 +/ 1586 +/ this code is widely base upon the original GD gdImageCopyResampled() function 1587 +*/ 1588 + int x, y; 1589 + double sy1, sy2, sx1, sx2; 1590 + unsigned char r; 1591 + unsigned char g; 1592 + unsigned char b; 1593 + unsigned char a; 1594 + unsigned char gray; 1595 + unsigned char *p; 1596 + for (y = 0; y < thumbnail->height; y++) 1597 + { 1598 + sy1 = 1599 + ((double) y) * (double) image->height / 1600 + (double) thumbnail->height; 1601 + sy2 = 1602 + ((double) (y + 1)) * (double) image->height / 1603 + (double) thumbnail->height; 1604 + for (x = 0; x < thumbnail->width; x++) 1605 + { 1606 + double sx, sy; 1607 + double spixels = 0; 1608 + double red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0; 1609 + sx1 = 1610 + ((double) x) * (double) image->width / 1611 + (double) thumbnail->width; 1612 + sx2 = 1613 + ((double) (x + 1)) * (double) image->width / 1614 + (double) thumbnail->width; 1615 + sy = sy1; 1616 + do 1617 + { 1618 + double yportion; 1619 + if (floor2 (sy) == floor2 (sy1)) 1620 + { 1621 + yportion = 1.0 - (sy - floor2 (sy)); 1622 + if (yportion > sy2 - sy1) 1623 + { 1624 + yportion = sy2 - sy1; 1625 + } 1626 + sy = floor2 (sy); 1627 + } 1628 + else if (sy == floor2 (sy2)) 1629 + { 1630 + yportion = sy2 - floor2 (sy2); 1631 + } 1632 + else 1633 + { 1634 + yportion = 1.0; 1635 + } 1636 + sx = sx1; 1637 + do 1638 + { 1639 + double xportion; 1640 + double pcontribution; 1641 + if (floor2 (sx) == floor2 (sx1)) 1642 + { 1643 + xportion = 1.0 - (sx - floor2 (sx)); 1644 + if (xportion > sx2 - sx1) 1645 + { 1646 + xportion = sx2 - sx1; 1647 + } 1648 + sx = floor2 (sx); 1649 + } 1650 + else if (sx == floor2 (sx2)) 1651 + { 1652 + xportion = sx2 - floor2 (sx2); 1653 + } 1654 + else 1655 + { 1656 + xportion = 1.0; 1657 + } 1658 + pcontribution = xportion * yportion; 1659 + /* retrieving the origin pixel */ 1660 + p = image->pixels + 1661 + ((int) sy * image->scanline_width); 1662 + if (image->pixel_format == GG_PIXEL_RGB) 1663 + { 1664 + p += (int) sx *3; 1665 + r = *p++; 1666 + g = *p++; 1667 + b = *p; 1668 + a = 255; 1669 + } 1670 + else if (image->pixel_format == GG_PIXEL_RGBA) 1671 + { 1672 + p += (int) sx *4; 1673 + r = *p++; 1674 + g = *p++; 1675 + b = *p++; 1676 + a = *p; 1677 + } 1678 + else if (image->pixel_format == GG_PIXEL_ARGB) 1679 + { 1680 + p += (int) sx *4; 1681 + a = *p++; 1682 + r = *p++; 1683 + g = *p++; 1684 + b = *p; 1685 + } 1686 + else if (image->pixel_format == GG_PIXEL_BGR) 1687 + { 1688 + p += (int) sx *3; 1689 + b = *p++; 1690 + g = *p++; 1691 + r = *p; 1692 + a = 255; 1693 + } 1694 + else if (image->pixel_format == GG_PIXEL_BGRA) 1695 + { 1696 + p += (int) sx *4; 1697 + b = *p++; 1698 + g = *p++; 1699 + r = *p++; 1700 + a = *p; 1701 + } 1702 + else if (image->pixel_format == GG_PIXEL_GRAYSCALE) 1703 + { 1704 + p += (int) sx; 1705 + r = *p; 1706 + g = *p; 1707 + b = *p; 1708 + a = 255; 1709 + } 1710 + else if (image->pixel_format == GG_PIXEL_PALETTE) 1711 + { 1712 + p += (int) sx; 1713 + r = image->palette_red[*p]; 1714 + g = image->palette_green[*p]; 1715 + b = image->palette_blue[*p]; 1716 + a = 255; 1717 + } 1718 + red += r * pcontribution; 1719 + green += g * pcontribution; 1720 + blue += b * pcontribution; 1721 + alpha += a * pcontribution; 1722 + spixels += xportion * yportion; 1723 + sx += 1.0; 1724 + } 1725 + while (sx < sx2); 1726 + sy += 1.0; 1727 + } 1728 + while (sy < sy2); 1729 + if (spixels != 0.0) 1730 + { 1731 + red /= spixels; 1732 + green /= spixels; 1733 + blue /= spixels; 1734 + alpha /= spixels; 1735 + } 1736 + if (red > 255.0) 1737 + red = 255.0; 1738 + if (green > 255.0) 1739 + green = 255.0; 1740 + if (blue > 255.0) 1741 + blue = 255.0; 1742 + if (alpha > 255.0) 1743 + alpha = 255.0; 1744 + /* setting the destination pixel */ 1745 + p = thumbnail->pixels + (y * thumbnail->scanline_width); 1746 + if (thumbnail->pixel_format == GG_PIXEL_RGB) 1747 + { 1748 + p += x * 3; 1749 + *p++ = (unsigned char) red; 1750 + *p++ = (unsigned char) green; 1751 + *p = (unsigned char) blue; 1752 + } 1753 + else if (thumbnail->pixel_format == GG_PIXEL_RGBA) 1754 + { 1755 + p += x * 4; 1756 + *p++ = (unsigned char) red; 1757 + *p++ = (unsigned char) green; 1758 + *p++ = (unsigned char) blue; 1759 + *p = (unsigned char) alpha; 1760 + } 1761 + else if (thumbnail->pixel_format == GG_PIXEL_ARGB) 1762 + { 1763 + p += x * 4; 1764 + *p++ = (unsigned char) alpha; 1765 + *p++ = (unsigned char) red; 1766 + *p++ = (unsigned char) green; 1767 + *p = (unsigned char) blue; 1768 + } 1769 + else if (thumbnail->pixel_format == GG_PIXEL_BGR) 1770 + { 1771 + p += x * 3; 1772 + *p++ = (unsigned char) blue; 1773 + *p++ = (unsigned char) green; 1774 + *p = (unsigned char) red; 1775 + } 1776 + else if (thumbnail->pixel_format == GG_PIXEL_BGRA) 1777 + { 1778 + p += x * 4; 1779 + *p++ = (unsigned char) blue; 1780 + *p++ = (unsigned char) green; 1781 + *p++ = (unsigned char) red; 1782 + *p = (unsigned char) alpha; 1783 + } 1784 + else if (thumbnail->pixel_format == GG_PIXEL_GRAYSCALE) 1785 + { 1786 + p += x; 1787 + if (red == green && green == blue) 1788 + gray = (unsigned char) red; 1789 + else 1790 + gray = 1791 + to_grayscale ((unsigned char) red, 1792 + (unsigned char) green, 1793 + (unsigned char) blue); 1794 + *p = gray; 1795 + } 1796 + else if (thumbnail->pixel_format == GG_PIXEL_PALETTE) 1797 + { 1798 + unsigned char index = 1799 + gg_match_palette (thumbnail, (unsigned char) red, 1800 + (unsigned char) green, 1801 + (unsigned char) blue); 1802 + p += x; 1803 + *p = index; 1804 + } 1805 + } 1806 + } 1807 +} 1808 + 1809 +GGRAPH_PRIVATE void 1810 +gg_make_grid_thumbnail (const gGraphImagePtr thumbnail, 1811 + const gGraphImagePtr image) 1812 +{ 1813 +/* 1814 +/ this function builds an high quality thumbnail image, applying pixel interpolation 1815 +/ 1816 +/ this code is widely base upon the original GD gdImageCopyResampled() function 1817 +*/ 1818 + int x, y; 1819 + double sy1, sy2, sx1, sx2; 1820 + short short_value; 1821 + unsigned short ushort_value; 1822 + int int_value; 1823 + unsigned int uint_value; 1824 + float float_value; 1825 + double double_value; 1826 + short *p_short; 1827 + unsigned short *p_ushort; 1828 + int *p_int; 1829 + unsigned int *p_uint; 1830 + float *p_float; 1831 + double *p_double; 1832 + unsigned char *p; 1833 + for (y = 0; y < thumbnail->height; y++) 1834 + { 1835 + sy1 = 1836 + ((double) y) * (double) image->height / 1837 + (double) thumbnail->height; 1838 + sy2 = 1839 + ((double) (y + 1)) * (double) image->height / 1840 + (double) thumbnail->height; 1841 + for (x = 0; x < thumbnail->width; x++) 1842 + { 1843 + double sx, sy; 1844 + double spixels = 0; 1845 + double avg = 0.0; 1846 + int is_nodata = 0; 1847 + sx1 = 1848 + ((double) x) * (double) image->width / 1849 + (double) thumbnail->width; 1850 + sx2 = 1851 + ((double) (x + 1)) * (double) image->width / 1852 + (double) thumbnail->width; 1853 + sy = sy1; 1854 + do 1855 + { 1856 + double yportion; 1857 + if (floor2 (sy) == floor2 (sy1)) 1858 + { 1859 + yportion = 1.0 - (sy - floor2 (sy)); 1860 + if (yportion > sy2 - sy1) 1861 + { 1862 + yportion = sy2 - sy1; 1863 + } 1864 + sy = floor2 (sy); 1865 + } 1866 + else if (sy == floor2 (sy2)) 1867 + { 1868 + yportion = sy2 - floor2 (sy2); 1869 + } 1870 + else 1871 + { 1872 + yportion = 1.0; 1873 + } 1874 + sx = sx1; 1875 + do 1876 + { 1877 + double xportion; 1878 + double pcontribution; 1879 + if (floor2 (sx) == floor2 (sx1)) 1880 + { 1881 + xportion = 1.0 - (sx - floor2 (sx)); 1882 + if (xportion > sx2 - sx1) 1883 + { 1884 + xportion = sx2 - sx1; 1885 + } 1886 + sx = floor2 (sx); 1887 + } 1888 + else if (sx == floor2 (sx2)) 1889 + { 1890 + xportion = sx2 - floor2 (sx2); 1891 + } 1892 + else 1893 + { 1894 + xportion = 1.0; 1895 + } 1896 + pcontribution = xportion * yportion; 1897 + /* retrieving the origin pixel */ 1898 + p = image->pixels + 1899 + ((int) sy * image->scanline_width); 1900 + if (image->pixel_format == GG_PIXEL_GRID) 1901 + { 1902 + p += (int) sx *(image->bits_per_sample / 8); 1903 + switch (image->sample_format) 1904 + { 1905 + case GGRAPH_SAMPLE_INT: 1906 + if (image->bits_per_sample == 16) 1907 + { 1908 + p_short = (short *) p; 1909 + short_value = *p_short; 1910 + if (short_value == 1911 + image->no_data_value) 1912 + is_nodata = 1; 1913 + else 1914 + avg += 1915 + (double) short_value 1916 + * pcontribution; 1917 + } 1918 + else 1919 + { 1920 + p_int = (int *) p; 1921 + int_value = *p_int; 1922 + if (int_value == 1923 + image->no_data_value) 1924 + is_nodata = 1; 1925 + else 1926 + avg += 1927 + (double) int_value 1928 + * pcontribution; 1929 + } 1930 + break; 1931 + case GGRAPH_SAMPLE_UINT: 1932 + if (image->bits_per_sample == 16) 1933 + { 1934 + p_ushort = (unsigned short *) p; 1935 + ushort_value = *p_ushort; 1936 + if (ushort_value == 1937 + image->no_data_value) 1938 + is_nodata = 1; 1939 + else 1940 + avg += 1941 + (double) ushort_value 1942 + * pcontribution; 1943 + } 1944 + else 1945 + { 1946 + p_uint = (unsigned int *) p; 1947 + uint_value = *p_uint; 1948 + if (uint_value == 1949 + image->no_data_value) 1950 + is_nodata = 1; 1951 + else 1952 + avg += 1953 + (double) uint_value 1954 + * pcontribution; 1955 + } 1956 + break; 1957 + case GGRAPH_SAMPLE_FLOAT: 1958 + if (image->bits_per_sample == 32) 1959 + { 1960 + p_float = (float *) p; 1961 + float_value = *p_float; 1962 + if (float_value == 1963 + image->no_data_value) 1964 + is_nodata = 1; 1965 + else 1966 + avg += 1967 + (double) float_value 1968 + * pcontribution; 1969 + } 1970 + else 1971 + { 1972 + p_double = (double *) p; 1973 + double_value = *p_double; 1974 + if (double_value == 1975 + image->no_data_value) 1976 + is_nodata = 1; 1977 + else 1978 + avg += 1979 + double_value * 1980 + pcontribution; 1981 + } 1982 + break; 1983 + }; 1984 + } 1985 + spixels += xportion * yportion; 1986 + sx += 1.0; 1987 + } 1988 + while (sx < sx2); 1989 + sy += 1.0; 1990 + } 1991 + while (sy < sy2); 1992 + if (spixels != 0.0) 1993 + { 1994 + if (!is_nodata) 1995 + avg /= spixels; 1996 + } 1997 + /* setting the destination pixel */ 1998 + p = thumbnail->pixels + (y * thumbnail->scanline_width); 1999 + if (thumbnail->pixel_format == GG_PIXEL_GRID) 2000 + { 2001 + p += x * (thumbnail->bits_per_sample / 8); 2002 + switch (thumbnail->sample_format) 2003 + { 2004 + case GGRAPH_SAMPLE_INT: 2005 + if (thumbnail->bits_per_sample == 16) 2006 + { 2007 + p_short = (short *) p; 2008 + if (is_nodata) 2009 + *p_short = 2010 + (short) (thumbnail->no_data_value); 2011 + else 2012 + *p_short = (short) avg; 2013 + } 2014 + else 2015 + { 2016 + p_int = (int *) p; 2017 + if (is_nodata) 2018 + *p_int = (int) (thumbnail->no_data_value); 2019 + else 2020 + *p_int = (int) avg; 2021 + } 2022 + break; 2023 + case GGRAPH_SAMPLE_UINT: 2024 + if (thumbnail->bits_per_sample == 16) 2025 + { 2026 + p_ushort = (unsigned short *) p; 2027 + if (is_nodata) 2028 + *p_ushort = 2029 + (unsigned 2030 + short) (thumbnail->no_data_value); 2031 + else 2032 + *p_ushort = (unsigned short) avg; 2033 + } 2034 + else 2035 + { 2036 + p_uint = (unsigned int *) p; 2037 + if (is_nodata) 2038 + *p_uint = 2039 + (unsigned 2040 + int) (thumbnail->no_data_value); 2041 + else 2042 + *p_uint = (unsigned int) avg; 2043 + } 2044 + break; 2045 + case GGRAPH_SAMPLE_FLOAT: 2046 + if (thumbnail->bits_per_sample == 32) 2047 + { 2048 + p_float = (float *) p; 2049 + if (is_nodata) 2050 + *p_float = 2051 + (float) (thumbnail->no_data_value); 2052 + else 2053 + *p_float = (float) avg; 2054 + } 2055 + else 2056 + { 2057 + p_double = (double *) p; 2058 + if (is_nodata) 2059 + *p_double = thumbnail->no_data_value; 2060 + else 2061 + *p_double = avg; 2062 + } 2063 + break; 2064 + }; 2065 + } 2066 + } 2067 + } 2068 +} 2069 + 2070 +GGRAPH_PRIVATE int 2071 +gg_convert_image_to_grid_int16 (const gGraphImagePtr img) 2072 +{ 2073 +/* converting this grid-image to Int16 */ 2074 + int x; 2075 + int y; 2076 + void *pixels; 2077 + short value; 2078 + unsigned char *p_in; 2079 + short *p_out; 2080 + 2081 + if (img->pixel_format != GG_PIXEL_GRID) 2082 + return GGRAPH_INVALID_IMAGE; 2083 + 2084 + if (img->sample_format == GGRAPH_SAMPLE_INT && img->bits_per_sample == 16) 2085 + return GGRAPH_OK; 2086 + 2087 + pixels = malloc (img->width * img->height * sizeof (short)); 2088 + if (!pixels) 2089 + return GGRAPH_INSUFFICIENT_MEMORY; 2090 + for (y = 0; y < img->height; y++) 2091 + { 2092 + /* processing any scanline */ 2093 + p_in = img->pixels + (y * img->scanline_width); 2094 + p_out = pixels; 2095 + p_out += (y * img->width); 2096 + for (x = 0; x < img->width; x++) 2097 + { 2098 + /* retrieving the origin pixel */ 2099 + if (img->sample_format == GGRAPH_SAMPLE_UINT 2100 + && img->bits_per_sample == 16) 2101 + { 2102 + value = (short) *((unsigned short *) p_in); 2103 + p_in += sizeof (unsigned short); 2104 + } 2105 + if (img->sample_format == GGRAPH_SAMPLE_INT 2106 + && img->bits_per_sample == 32) 2107 + { 2108 + value = (short) *((int *) p_in); 2109 + p_in += sizeof (int); 2110 + } 2111 + if (img->sample_format == GGRAPH_SAMPLE_UINT 2112 + && img->bits_per_sample == 32) 2113 + { 2114 + value = (short) *((unsigned int *) p_in); 2115 + p_in += sizeof (unsigned int); 2116 + } 2117 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT 2118 + && img->bits_per_sample == 32) 2119 + { 2120 + value = (short) *((float *) p_in); 2121 + p_in += sizeof (float); 2122 + } 2123 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT 2124 + && img->bits_per_sample == 64) 2125 + { 2126 + value = (short) *((double *) p_in); 2127 + p_in += sizeof (double); 2128 + } 2129 + /* setting the destination pixel */ 2130 + *p_out++ = value; 2131 + } 2132 + } 2133 + 2134 + free (img->pixels); 2135 + img->pixels = pixels; 2136 + img->pixel_format = GG_PIXEL_GRID; 2137 + img->scanline_width = img->width * sizeof (short); 2138 + img->pixel_size = sizeof (short); 2139 + img->sample_format = GGRAPH_SAMPLE_INT; 2140 + img->bits_per_sample = 16; 2141 + return GGRAPH_OK; 2142 +} 2143 + 2144 +GGRAPH_PRIVATE int 2145 +gg_convert_image_to_grid_uint16 (const gGraphImagePtr img) 2146 +{ 2147 +/* converting this grid-image to UInt16 */ 2148 + int x; 2149 + int y; 2150 + void *pixels; 2151 + unsigned short value; 2152 + unsigned char *p_in; 2153 + unsigned short *p_out; 2154 + 2155 + if (img->pixel_format != GG_PIXEL_GRID) 2156 + return GGRAPH_INVALID_IMAGE; 2157 + 2158 + if (img->sample_format == GGRAPH_SAMPLE_UINT && img->bits_per_sample == 16) 2159 + return GGRAPH_OK; 2160 + 2161 + pixels = malloc (img->width * img->height * sizeof (unsigned short)); 2162 + if (!pixels) 2163 + return GGRAPH_INSUFFICIENT_MEMORY; 2164 + for (y = 0; y < img->height; y++) 2165 + { 2166 + /* processing any scanline */ 2167 + p_in = img->pixels + (y * img->scanline_width); 2168 + p_out = pixels; 2169 + p_out += (y * img->width); 2170 + for (x = 0; x < img->width; x++) 2171 + { 2172 + /* retrieving the origin pixel */ 2173 + if (img->sample_format == GGRAPH_SAMPLE_INT 2174 + && img->bits_per_sample == 16) 2175 + { 2176 + value = (unsigned short) *((short *) p_in); 2177 + p_in += sizeof (short); 2178 + } 2179 + if (img->sample_format == GGRAPH_SAMPLE_INT 2180 + && img->bits_per_sample == 32) 2181 + { 2182 + value = (unsigned short) *((int *) p_in); 2183 + p_in += sizeof (int); 2184 + } 2185 + if (img->sample_format == GGRAPH_SAMPLE_UINT 2186 + && img->bits_per_sample == 32) 2187 + { 2188 + value = (unsigned short) *((unsigned int *) p_in); 2189 + p_in += sizeof (unsigned int); 2190 + } 2191 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT 2192 + && img->bits_per_sample == 32) 2193 + { 2194 + value = (unsigned short) *((float *) p_in); 2195 + p_in += sizeof (float); 2196 + } 2197 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT 2198 + && img->bits_per_sample == 64) 2199 + { 2200 + value = (unsigned short) *((double *) p_in); 2201 + p_in += sizeof (double); 2202 + } 2203 + /* setting the destination pixel */ 2204 + *p_out++ = value; 2205 + } 2206 + } 2207 + 2208 + free (img->pixels); 2209 + img->pixels = pixels; 2210 + img->pixel_format = GG_PIXEL_GRID; 2211 + img->scanline_width = img->width * sizeof (unsigned short); 2212 + img->pixel_size = sizeof (unsigned short); 2213 + img->sample_format = GGRAPH_SAMPLE_UINT; 2214 + img->bits_per_sample = 16; 2215 + return GGRAPH_OK; 2216 +} 2217 + 2218 +GGRAPH_PRIVATE int 2219 +gg_convert_image_to_grid_int32 (const gGraphImagePtr img) 2220 +{ 2221 +/* converting this grid-image to Int32 */ 2222 + int x; 2223 + int y; 2224 + void *pixels; 2225 + int value; 2226 + unsigned char *p_in; 2227 + int *p_out; 2228 + 2229 + if (img->pixel_format != GG_PIXEL_GRID) 2230 + return GGRAPH_INVALID_IMAGE; 2231 + 2232 + if (img->sample_format == GGRAPH_SAMPLE_INT && img->bits_per_sample == 32) 2233 + return GGRAPH_OK; 2234 + 2235 + pixels = malloc (img->width * img->height * sizeof (int)); 2236 + if (!pixels) 2237 + return GGRAPH_INSUFFICIENT_MEMORY; 2238 + for (y = 0; y < img->height; y++) 2239 + { 2240 + /* processing any scanline */ 2241 + p_in = img->pixels + (y * img->scanline_width); 2242 + p_out = pixels; 2243 + p_out += (y * img->width); 2244 + for (x = 0; x < img->width; x++) 2245 + { 2246 + /* retrieving the origin pixel */ 2247 + if (img->sample_format == GGRAPH_SAMPLE_INT 2248 + && img->bits_per_sample == 16) 2249 + { 2250 + value = (int) *((short *) p_in); 2251 + p_in += sizeof (short); 2252 + } 2253 + if (img->sample_format == GGRAPH_SAMPLE_UINT 2254 + && img->bits_per_sample == 16) 2255 + { 2256 + value = (int) *((unsigned short *) p_in); 2257 + p_in += sizeof (unsigned short); 2258 + } 2259 + if (img->sample_format == GGRAPH_SAMPLE_UINT 2260 + && img->bits_per_sample == 32) 2261 + { 2262 + value = (int) *((unsigned int *) p_in); 2263 + p_in += sizeof (unsigned int); 2264 + } 2265 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT 2266 + && img->bits_per_sample == 32) 2267 + { 2268 + value = (int) *((float *) p_in); 2269 + p_in += sizeof (float); 2270 + } 2271 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT 2272 + && img->bits_per_sample == 64) 2273 + { 2274 + value = (int) *((double *) p_in); 2275 + p_in += sizeof (double); 2276 + } 2277 + /* setting the destination pixel */ 2278 + *p_out++ = value; 2279 + } 2280 + } 2281 + 2282 + free (img->pixels); 2283 + img->pixels = pixels; 2284 + img->pixel_format = GG_PIXEL_GRID; 2285 + img->scanline_width = img->width * sizeof (int); 2286 + img->pixel_size = sizeof (int); 2287 + img->sample_format = GGRAPH_SAMPLE_INT; 2288 + img->bits_per_sample = 32; 2289 + return GGRAPH_OK; 2290 +} 2291 + 2292 +GGRAPH_PRIVATE int 2293 +gg_convert_image_to_grid_uint32 (const gGraphImagePtr img) 2294 +{ 2295 +/* converting this grid-image to UInt32 */ 2296 + int x; 2297 + int y; 2298 + void *pixels; 2299 + unsigned int value; 2300 + unsigned char *p_in; 2301 + unsigned int *p_out; 2302 + 2303 + if (img->pixel_format != GG_PIXEL_GRID) 2304 + return GGRAPH_INVALID_IMAGE; 2305 + 2306 + if (img->sample_format == GGRAPH_SAMPLE_UINT && img->bits_per_sample == 32) 2307 + return GGRAPH_OK; 2308 + 2309 + pixels = malloc (img->width * img->height * sizeof (unsigned short)); 2310 + if (!pixels) 2311 + return GGRAPH_INSUFFICIENT_MEMORY; 2312 + for (y = 0; y < img->height; y++) 2313 + { 2314 + /* processing any scanline */ 2315 + p_in = img->pixels + (y * img->scanline_width); 2316 + p_out = pixels; 2317 + p_out += (y * img->width); 2318 + for (x = 0; x < img->width; x++) 2319 + { 2320 + /* retrieving the origin pixel */ 2321 + if (img->sample_format == GGRAPH_SAMPLE_INT 2322 + && img->bits_per_sample == 16) 2323 + { 2324 + value = (unsigned int) *((short *) p_in); 2325 + p_in += sizeof (short); 2326 + } 2327 + if (img->sample_format == GGRAPH_SAMPLE_UINT 2328 + && img->bits_per_sample == 16) 2329 + { 2330 + value = (unsigned int) *((unsigned short *) p_in); 2331 + p_in += sizeof (unsigned short); 2332 + } 2333 + if (img->sample_format == GGRAPH_SAMPLE_INT 2334 + && img->bits_per_sample == 32) 2335 + { 2336 + value = (unsigned int) *((int *) p_in); 2337 + p_in += sizeof (int); 2338 + } 2339 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT 2340 + && img->bits_per_sample == 32) 2341 + { 2342 + value = (unsigned int) *((float *) p_in); 2343 + p_in += sizeof (float); 2344 + } 2345 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT 2346 + && img->bits_per_sample == 64) 2347 + { 2348 + value = (unsigned int) *((double *) p_in); 2349 + p_in += sizeof (double); 2350 + } 2351 + /* setting the destination pixel */ 2352 + *p_out++ = value; 2353 + } 2354 + } 2355 + 2356 + free (img->pixels); 2357 + img->pixels = pixels; 2358 + img->pixel_format = GG_PIXEL_GRID; 2359 + img->scanline_width = img->width * sizeof (unsigned int); 2360 + img->pixel_size = sizeof (unsigned int); 2361 + img->sample_format = GGRAPH_SAMPLE_UINT; 2362 + img->bits_per_sample = 32; 2363 + return GGRAPH_OK; 2364 +} 2365 + 2366 +GGRAPH_PRIVATE int 2367 +gg_convert_image_to_grid_float (const gGraphImagePtr img) 2368 +{ 2369 +/* converting this grid-image to Float */ 2370 + int x; 2371 + int y; 2372 + void *pixels; 2373 + float value; 2374 + unsigned char *p_in; 2375 + float *p_out; 2376 + 2377 + if (img->pixel_format != GG_PIXEL_GRID) 2378 + return GGRAPH_INVALID_IMAGE; 2379 + 2380 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT && img->bits_per_sample == 32) 2381 + return GGRAPH_OK; 2382 + 2383 + pixels = malloc (img->width * img->height * sizeof (short)); 2384 + if (!pixels) 2385 + return GGRAPH_INSUFFICIENT_MEMORY; 2386 + for (y = 0; y < img->height; y++) 2387 + { 2388 + /* processing any scanline */ 2389 + p_in = img->pixels + (y * img->scanline_width); 2390 + p_out = pixels; 2391 + p_out += (y * img->width); 2392 + for (x = 0; x < img->width; x++) 2393 + { 2394 + /* retrieving the origin pixel */ 2395 + if (img->sample_format == GGRAPH_SAMPLE_INT 2396 + && img->bits_per_sample == 16) 2397 + { 2398 + value = (float) *((short *) p_in); 2399 + p_in += sizeof (short); 2400 + } 2401 + if (img->sample_format == GGRAPH_SAMPLE_UINT 2402 + && img->bits_per_sample == 16) 2403 + { 2404 + value = (float) *((unsigned short *) p_in); 2405 + p_in += sizeof (unsigned short); 2406 + } 2407 + if (img->sample_format == GGRAPH_SAMPLE_INT 2408 + && img->bits_per_sample == 32) 2409 + { 2410 + value = (float) *((int *) p_in); 2411 + p_in += sizeof (int); 2412 + } 2413 + if (img->sample_format == GGRAPH_SAMPLE_UINT 2414 + && img->bits_per_sample == 32) 2415 + { 2416 + value = (float) *((unsigned int *) p_in); 2417 + p_in += sizeof (unsigned int); 2418 + } 2419 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT 2420 + && img->bits_per_sample == 64) 2421 + { 2422 + value = (float) *((double *) p_in); 2423 + p_in += sizeof (double); 2424 + } 2425 + /* setting the destination pixel */ 2426 + *p_out++ = value; 2427 + } 2428 + } 2429 + 2430 + free (img->pixels); 2431 + img->pixels = pixels; 2432 + img->pixel_format = GG_PIXEL_GRID; 2433 + img->scanline_width = img->width * sizeof (float); 2434 + img->pixel_size = sizeof (float); 2435 + img->sample_format = GGRAPH_SAMPLE_INT; 2436 + img->bits_per_sample = 32; 2437 + return GGRAPH_OK; 2438 +} 2439 + 2440 +GGRAPH_PRIVATE int 2441 +gg_convert_image_to_grid_double (const gGraphImagePtr img) 2442 +{ 2443 +/* converting this grid-image to Double */ 2444 + int x; 2445 + int y; 2446 + void *pixels; 2447 + double value; 2448 + unsigned char *p_in; 2449 + double *p_out; 2450 + 2451 + if (img->pixel_format != GG_PIXEL_GRID) 2452 + return GGRAPH_INVALID_IMAGE; 2453 + 2454 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT && img->bits_per_sample == 64) 2455 + return GGRAPH_OK; 2456 + 2457 + pixels = malloc (img->width * img->height * sizeof (short)); 2458 + if (!pixels) 2459 + return GGRAPH_INSUFFICIENT_MEMORY; 2460 + for (y = 0; y < img->height; y++) 2461 + { 2462 + /* processing any scanline */ 2463 + p_in = img->pixels + (y * img->scanline_width); 2464 + p_out = pixels; 2465 + p_out += (y * img->width); 2466 + for (x = 0; x < img->width; x++) 2467 + { 2468 + /* retrieving the origin pixel */ 2469 + if (img->sample_format == GGRAPH_SAMPLE_INT 2470 + && img->bits_per_sample == 16) 2471 + { 2472 + value = (double) *((short *) p_in); 2473 + p_in += sizeof (short); 2474 + } 2475 + if (img->sample_format == GGRAPH_SAMPLE_UINT 2476 + && img->bits_per_sample == 16) 2477 + { 2478 + value = (double) *((unsigned short *) p_in); 2479 + p_in += sizeof (unsigned short); 2480 + } 2481 + if (img->sample_format == GGRAPH_SAMPLE_INT 2482 + && img->bits_per_sample == 32) 2483 + { 2484 + value = (double) *((int *) p_in); 2485 + p_in += sizeof (int); 2486 + } 2487 + if (img->sample_format == GGRAPH_SAMPLE_UINT 2488 + && img->bits_per_sample == 32) 2489 + { 2490 + value = (double) *((unsigned int *) p_in); 2491 + p_in += sizeof (unsigned int); 2492 + } 2493 + if (img->sample_format == GGRAPH_SAMPLE_FLOAT 2494 + && img->bits_per_sample == 32) 2495 + { 2496 + value = (double) *((float *) p_in); 2497 + p_in += sizeof (float); 2498 + } 2499 + /* setting the destination pixel */ 2500 + *p_out++ = value; 2501 + } 2502 + } 2503 + 2504 + free (img->pixels); 2505 + img->pixels = pixels; 2506 + img->pixel_format = GG_PIXEL_GRID; 2507 + img->scanline_width = img->width * sizeof (double); 2508 + img->pixel_size = sizeof (double); 2509 + img->sample_format = GGRAPH_SAMPLE_FLOAT; 2510 + img->bits_per_sample = 64; 2511 + return GGRAPH_OK; 2512 +} 2513 + 2514 +GGRAPH_PRIVATE int 2515 +gg_convert_image_to_rgb (const gGraphImagePtr img) 2516 +{ 2517 +/* converting this image to RGB */ 2518 + int x; 2519 + int y; 2520 + void *pixels; 2521 + unsigned char red; 2522 + unsigned char green; 2523 + unsigned char blue; 2524 + unsigned char *p_in; 2525 + unsigned char *p_out; 2526 + 2527 + if (img->pixel_format == GG_PIXEL_RGB || img->pixel_format == GG_PIXEL_RGBA 2528 + || img->pixel_format == GG_PIXEL_ARGB 2529 + || img->pixel_format == GG_PIXEL_BGR 2530 + || img->pixel_format == GG_PIXEL_BGRA 2531 + || img->pixel_format == GG_PIXEL_GRAYSCALE 2532 + || img->pixel_format == GG_PIXEL_PALETTE) 2533 + ; 2534 + else 2535 + return GGRAPH_INVALID_IMAGE; 2536 + 2537 + if (img->pixel_format == GG_PIXEL_RGB) 2538 + return GGRAPH_OK; 2539 + 2540 + pixels = malloc (img->width * img->height * 3); 2541 + if (!pixels) 2542 + return GGRAPH_INSUFFICIENT_MEMORY; 2543 + for (y = 0; y < img->height; y++) 2544 + { 2545 + /* processing any scanline */ 2546 + p_in = img->pixels + (y * img->scanline_width); 2547 + p_out = pixels; 2548 + p_out += (y * img->width * 3); 2549 + for (x = 0; x < img->width; x++) 2550 + { 2551 + /* retrieving the origin pixel */ 2552 + if (img->pixel_format == GG_PIXEL_RGBA) 2553 + { 2554 + red = *p_in++; 2555 + green = *p_in++; 2556 + blue = *p_in++; 2557 + p_in++; /* skipping alpha */ 2558 + } 2559 + else if (img->pixel_format == GG_PIXEL_ARGB) 2560 + { 2561 + p_in++; /* skipping alpha */ 2562 + red = *p_in++; 2563 + green = *p_in++; 2564 + blue = *p_in++; 2565 + } 2566 + else if (img->pixel_format == GG_PIXEL_BGR) 2567 + { 2568 + blue = *p_in++; 2569 + green = *p_in++; 2570 + red = *p_in++; 2571 + } 2572 + else if (img->pixel_format == GG_PIXEL_BGRA) 2573 + { 2574 + blue = *p_in++; 2575 + green = *p_in++; 2576 + red = *p_in++; 2577 + p_in++; /* skipping alpha */ 2578 + } 2579 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 2580 + { 2581 + red = *p_in++; 2582 + green = red; 2583 + blue = red; 2584 + 2585 + } 2586 + else if (img->pixel_format == GG_PIXEL_PALETTE) 2587 + { 2588 + int index = *p_in++; 2589 + red = img->palette_red[index]; 2590 + green = img->palette_green[index]; 2591 + blue = img->palette_blue[index]; 2592 + } 2593 + /* setting the destination pixel */ 2594 + *p_out++ = red; 2595 + *p_out++ = green; 2596 + *p_out++ = blue; 2597 + } 2598 + } 2599 + 2600 + free (img->pixels); 2601 + img->pixels = pixels; 2602 + img->pixel_format = GG_PIXEL_RGB; 2603 + img->scanline_width = img->width * 3; 2604 + img->pixel_size = 3; 2605 + img->max_palette = 0; 2606 + return GGRAPH_OK; 2607 +} 2608 + 2609 +GGRAPH_PRIVATE int 2610 +gg_convert_image_to_rgba (const gGraphImagePtr img) 2611 +{ 2612 +/* converting this image to RGBA */ 2613 + int x; 2614 + int y; 2615 + void *pixels; 2616 + unsigned char red; 2617 + unsigned char green; 2618 + unsigned char blue; 2619 + unsigned char alpha; 2620 + unsigned char *p_in; 2621 + unsigned char *p_out; 2622 + 2623 + if (img->pixel_format == GG_PIXEL_RGB || img->pixel_format == GG_PIXEL_RGBA 2624 + || img->pixel_format == GG_PIXEL_ARGB 2625 + || img->pixel_format == GG_PIXEL_BGR 2626 + || img->pixel_format == GG_PIXEL_BGRA 2627 + || img->pixel_format == GG_PIXEL_GRAYSCALE 2628 + || img->pixel_format == GG_PIXEL_PALETTE) 2629 + ; 2630 + else 2631 + return GGRAPH_INVALID_IMAGE; 2632 + 2633 + if (img->pixel_format == GG_PIXEL_RGBA) 2634 + return GGRAPH_OK; 2635 + 2636 + pixels = malloc (img->width * img->height * 4); 2637 + if (!pixels) 2638 + return GGRAPH_INSUFFICIENT_MEMORY; 2639 + for (y = 0; y < img->height; y++) 2640 + { 2641 + /* processing any scanline */ 2642 + p_in = img->pixels + (y * img->scanline_width); 2643 + p_out = pixels; 2644 + p_out += (y * img->width * 4); 2645 + for (x = 0; x < img->width; x++) 2646 + { 2647 + /* retrieving the origin pixel */ 2648 + if (img->pixel_format == GG_PIXEL_RGB) 2649 + { 2650 + red = *p_in++; 2651 + green = *p_in++; 2652 + blue = *p_in++; 2653 + alpha = 255; 2654 + } 2655 + else if (img->pixel_format == GG_PIXEL_ARGB) 2656 + { 2657 + alpha = *p_in++; 2658 + red = *p_in++; 2659 + green = *p_in++; 2660 + blue = *p_in++; 2661 + } 2662 + else if (img->pixel_format == GG_PIXEL_BGR) 2663 + { 2664 + blue = *p_in++; 2665 + green = *p_in++; 2666 + red = *p_in++; 2667 + alpha = 255; 2668 + } 2669 + else if (img->pixel_format == GG_PIXEL_BGRA) 2670 + { 2671 + blue = *p_in++; 2672 + green = *p_in++; 2673 + red = *p_in++; 2674 + alpha = *p_in++; 2675 + } 2676 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 2677 + { 2678 + red = *p_in++; 2679 + green = red; 2680 + blue = red; 2681 + alpha = 255; 2682 + } 2683 + else if (img->pixel_format == GG_PIXEL_PALETTE) 2684 + { 2685 + int index = *p_in++; 2686 + red = img->palette_red[index]; 2687 + green = img->palette_green[index]; 2688 + blue = img->palette_blue[index]; 2689 + alpha = 255; 2690 + } 2691 + /* setting the destination pixel */ 2692 + *p_out++ = red; 2693 + *p_out++ = green; 2694 + *p_out++ = blue; 2695 + *p_out++ = alpha; 2696 + } 2697 + } 2698 + 2699 + free (img->pixels); 2700 + img->pixels = pixels; 2701 + img->pixel_format = GG_PIXEL_RGBA; 2702 + img->scanline_width = img->width * 4; 2703 + img->pixel_size = 4; 2704 + img->max_palette = 0; 2705 + return GGRAPH_OK; 2706 +} 2707 + 2708 +GGRAPH_PRIVATE int 2709 +gg_convert_image_to_argb (const gGraphImagePtr img) 2710 +{ 2711 +/* converting this image to ARGB */ 2712 + int x; 2713 + int y; 2714 + void *pixels; 2715 + unsigned char red; 2716 + unsigned char green; 2717 + unsigned char blue; 2718 + unsigned char alpha; 2719 + unsigned char *p_in; 2720 + unsigned char *p_out; 2721 + 2722 + if (img->pixel_format == GG_PIXEL_RGB || img->pixel_format == GG_PIXEL_RGBA 2723 + || img->pixel_format == GG_PIXEL_ARGB 2724 + || img->pixel_format == GG_PIXEL_BGR 2725 + || img->pixel_format == GG_PIXEL_BGRA 2726 + || img->pixel_format == GG_PIXEL_GRAYSCALE 2727 + || img->pixel_format == GG_PIXEL_PALETTE) 2728 + ; 2729 + else 2730 + return GGRAPH_INVALID_IMAGE; 2731 + 2732 + if (img->pixel_format == GG_PIXEL_ARGB) 2733 + return GGRAPH_OK; 2734 + 2735 + pixels = malloc (img->width * img->height * 4); 2736 + if (!pixels) 2737 + return GGRAPH_INSUFFICIENT_MEMORY; 2738 + for (y = 0; y < img->height; y++) 2739 + { 2740 + /* processing any scanline */ 2741 + p_in = img->pixels + (y * img->scanline_width); 2742 + p_out = pixels; 2743 + p_out += (y * img->width * 4); 2744 + for (x = 0; x < img->width; x++) 2745 + { 2746 + /* retrieving the origin pixel */ 2747 + if (img->pixel_format == GG_PIXEL_RGB) 2748 + { 2749 + red = *p_in++; 2750 + green = *p_in++; 2751 + blue = *p_in++; 2752 + alpha = 255; 2753 + } 2754 + else if (img->pixel_format == GG_PIXEL_RGBA) 2755 + { 2756 + red = *p_in++; 2757 + green = *p_in++; 2758 + blue = *p_in++; 2759 + alpha = *p_in++; 2760 + } 2761 + else if (img->pixel_format == GG_PIXEL_BGR) 2762 + { 2763 + blue = *p_in++; 2764 + green = *p_in++; 2765 + red = *p_in++; 2766 + alpha = 255; 2767 + } 2768 + else if (img->pixel_format == GG_PIXEL_BGRA) 2769 + { 2770 + blue = *p_in++; 2771 + green = *p_in++; 2772 + red = *p_in++; 2773 + alpha = *p_in++; 2774 + } 2775 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 2776 + { 2777 + red = *p_in++; 2778 + green = red; 2779 + blue = red; 2780 + alpha = 255; 2781 + } 2782 + else if (img->pixel_format == GG_PIXEL_PALETTE) 2783 + { 2784 + int index = *p_in++; 2785 + red = img->palette_red[index]; 2786 + green = img->palette_green[index]; 2787 + blue = img->palette_blue[index]; 2788 + alpha = 255; 2789 + } 2790 + /* setting the destination pixel */ 2791 + *p_out++ = alpha; 2792 + *p_out++ = red; 2793 + *p_out++ = green; 2794 + *p_out++ = blue; 2795 + } 2796 + } 2797 + 2798 + free (img->pixels); 2799 + img->pixels = pixels; 2800 + img->pixel_format = GG_PIXEL_ARGB; 2801 + img->scanline_width = img->width * 4; 2802 + img->pixel_size = 4; 2803 + img->max_palette = 0; 2804 + return GGRAPH_OK; 2805 +} 2806 + 2807 +GGRAPH_PRIVATE int 2808 +gg_convert_image_to_bgr (const gGraphImagePtr img) 2809 +{ 2810 +/* converting this image to BGR */ 2811 + int x; 2812 + int y; 2813 + void *pixels; 2814 + unsigned char red; 2815 + unsigned char green; 2816 + unsigned char blue; 2817 + unsigned char *p_in; 2818 + unsigned char *p_out; 2819 + 2820 + if (img->pixel_format == GG_PIXEL_RGB || img->pixel_format == GG_PIXEL_RGBA 2821 + || img->pixel_format == GG_PIXEL_ARGB 2822 + || img->pixel_format == GG_PIXEL_BGR 2823 + || img->pixel_format == GG_PIXEL_BGRA 2824 + || img->pixel_format == GG_PIXEL_GRAYSCALE 2825 + || img->pixel_format == GG_PIXEL_PALETTE) 2826 + ; 2827 + else 2828 + return GGRAPH_INVALID_IMAGE; 2829 + 2830 + if (img->pixel_format == GG_PIXEL_BGR) 2831 + return GGRAPH_OK; 2832 + 2833 + pixels = malloc (img->width * img->height * 3); 2834 + if (!pixels) 2835 + return GGRAPH_INSUFFICIENT_MEMORY; 2836 + for (y = 0; y < img->height; y++) 2837 + { 2838 + /* processing any scanline */ 2839 + p_in = img->pixels + (y * img->scanline_width); 2840 + p_out = pixels; 2841 + p_out += (y * img->width * 3); 2842 + for (x = 0; x < img->width; x++) 2843 + { 2844 + /* retrieving the origin pixel */ 2845 + if (img->pixel_format == GG_PIXEL_RGB) 2846 + { 2847 + red = *p_in++; 2848 + green = *p_in++; 2849 + blue = *p_in++; 2850 + } 2851 + else if (img->pixel_format == GG_PIXEL_RGBA) 2852 + { 2853 + red = *p_in++; 2854 + green = *p_in++; 2855 + blue = *p_in++; 2856 + p_in++; /* skipping alpha */ 2857 + } 2858 + else if (img->pixel_format == GG_PIXEL_ARGB) 2859 + { 2860 + p_in++; /* skipping alpha */ 2861 + blue = *p_in++; 2862 + green = *p_in++; 2863 + red = *p_in++; 2864 + } 2865 + else if (img->pixel_format == GG_PIXEL_BGRA) 2866 + { 2867 + blue = *p_in++; 2868 + green = *p_in++; 2869 + red = *p_in++; 2870 + p_in++; /* skipping alpha */ 2871 + } 2872 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 2873 + { 2874 + red = *p_in++; 2875 + green = red; 2876 + blue = red; 2877 + } 2878 + else if (img->pixel_format == GG_PIXEL_PALETTE) 2879 + { 2880 + int index = *p_in++; 2881 + red = img->palette_red[index]; 2882 + green = img->palette_green[index]; 2883 + blue = img->palette_blue[index]; 2884 + } 2885 + /* setting the destination pixel */ 2886 + *p_out++ = blue; 2887 + *p_out++ = green; 2888 + *p_out++ = red; 2889 + } 2890 + } 2891 + 2892 + free (img->pixels); 2893 + img->pixels = pixels; 2894 + img->pixel_format = GG_PIXEL_BGR; 2895 + img->scanline_width = img->width * 3; 2896 + img->pixel_size = 3; 2897 + img->max_palette = 0; 2898 + return GGRAPH_OK; 2899 +} 2900 + 2901 +GGRAPH_PRIVATE int 2902 +gg_convert_image_to_bgra (const gGraphImagePtr img) 2903 +{ 2904 +/* converting this image to BGRA */ 2905 + int x; 2906 + int y; 2907 + void *pixels; 2908 + unsigned char red; 2909 + unsigned char green; 2910 + unsigned char blue; 2911 + unsigned char alpha; 2912 + unsigned char *p_in; 2913 + unsigned char *p_out; 2914 + 2915 + if (img->pixel_format == GG_PIXEL_RGB || img->pixel_format == GG_PIXEL_RGBA 2916 + || img->pixel_format == GG_PIXEL_ARGB 2917 + || img->pixel_format == GG_PIXEL_BGR 2918 + || img->pixel_format == GG_PIXEL_BGRA 2919 + || img->pixel_format == GG_PIXEL_GRAYSCALE 2920 + || img->pixel_format == GG_PIXEL_PALETTE) 2921 + ; 2922 + else 2923 + return GGRAPH_INVALID_IMAGE; 2924 + 2925 + if (img->pixel_format == GG_PIXEL_ARGB) 2926 + return GGRAPH_OK; 2927 + 2928 + pixels = malloc (img->width * img->height * 4); 2929 + if (!pixels) 2930 + return GGRAPH_INSUFFICIENT_MEMORY; 2931 + for (y = 0; y < img->height; y++) 2932 + { 2933 + /* processing any scanline */ 2934 + p_in = img->pixels + (y * img->scanline_width); 2935 + p_out = pixels; 2936 + p_out += (y * img->width * 4); 2937 + for (x = 0; x < img->width; x++) 2938 + { 2939 + /* retrieving the origin pixel */ 2940 + if (img->pixel_format == GG_PIXEL_RGB) 2941 + { 2942 + red = *p_in++; 2943 + green = *p_in++; 2944 + blue = *p_in++; 2945 + alpha = 255; 2946 + } 2947 + else if (img->pixel_format == GG_PIXEL_RGBA) 2948 + { 2949 + red = *p_in++; 2950 + green = *p_in++; 2951 + blue = *p_in++; 2952 + alpha = *p_in++; 2953 + } 2954 + else if (img->pixel_format == GG_PIXEL_ARGB) 2955 + { 2956 + alpha = *p_in++; 2957 + blue = *p_in++; 2958 + green = *p_in++; 2959 + red = *p_in++; 2960 + } 2961 + else if (img->pixel_format == GG_PIXEL_BGR) 2962 + { 2963 + blue = *p_in++; 2964 + green = *p_in++; 2965 + red = *p_in++; 2966 + alpha = 255; 2967 + } 2968 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 2969 + { 2970 + red = *p_in++; 2971 + green = red; 2972 + blue = red; 2973 + alpha = 255; 2974 + } 2975 + else if (img->pixel_format == GG_PIXEL_PALETTE) 2976 + { 2977 + int index = *p_in++; 2978 + red = img->palette_red[index]; 2979 + green = img->palette_green[index]; 2980 + blue = img->palette_blue[index]; 2981 + alpha = 255; 2982 + } 2983 + /* setting the destination pixel */ 2984 + *p_out++ = blue; 2985 + *p_out++ = green; 2986 + *p_out++ = red; 2987 + *p_out++ = alpha; 2988 + } 2989 + } 2990 + 2991 + free (img->pixels); 2992 + img->pixels = pixels; 2993 + img->pixel_format = GG_PIXEL_BGRA; 2994 + img->scanline_width = img->width * 4; 2995 + img->pixel_size = 4; 2996 + img->max_palette = 0; 2997 + return GGRAPH_OK; 2998 +} 2999 + 3000 +GGRAPH_PRIVATE int 3001 +gg_convert_image_to_grayscale (const gGraphImagePtr img) 3002 +{ 3003 +/* converting this image to GRAYSCALE */ 3004 + int x; 3005 + int y; 3006 + void *pixels; 3007 + unsigned char red; 3008 + unsigned char green; 3009 + unsigned char blue; 3010 + unsigned char gray; 3011 + unsigned char *p_in; 3012 + unsigned char *p_out; 3013 + 3014 + if (img->pixel_format == GG_PIXEL_RGB || img->pixel_format == GG_PIXEL_RGBA 3015 + || img->pixel_format == GG_PIXEL_ARGB 3016 + || img->pixel_format == GG_PIXEL_BGR 3017 + || img->pixel_format == GG_PIXEL_BGRA 3018 + || img->pixel_format == GG_PIXEL_GRAYSCALE 3019 + || img->pixel_format == GG_PIXEL_PALETTE) 3020 + ; 3021 + else 3022 + return GGRAPH_INVALID_IMAGE; 3023 + 3024 + if (img->pixel_format == GG_PIXEL_GRAYSCALE) 3025 + return GGRAPH_OK; 3026 + 3027 + pixels = malloc (img->width * img->height); 3028 + if (!pixels) 3029 + return GGRAPH_INSUFFICIENT_MEMORY; 3030 + for (y = 0; y < img->height; y++) 3031 + { 3032 + /* processing any scanline */ 3033 + p_in = img->pixels + (y * img->scanline_width); 3034 + p_out = pixels; 3035 + p_out += (y * img->width); 3036 + for (x = 0; x < img->width; x++) 3037 + { 3038 + /* retrieving the origin pixel */ 3039 + if (img->pixel_format == GG_PIXEL_RGB) 3040 + { 3041 + red = *p_in++; 3042 + green = *p_in++; 3043 + blue = *p_in++; 3044 + } 3045 + else if (img->pixel_format == GG_PIXEL_RGBA) 3046 + { 3047 + red = *p_in++; 3048 + green = *p_in++; 3049 + blue = *p_in++; 3050 + p_in++; /* skipping alpha */ 3051 + } 3052 + else if (img->pixel_format == GG_PIXEL_ARGB) 3053 + { 3054 + p_in++; /* skipping alpha */ 3055 + blue = *p_in++; 3056 + green = *p_in++; 3057 + red = *p_in++; 3058 + } 3059 + else if (img->pixel_format == GG_PIXEL_BGR) 3060 + { 3061 + blue = *p_in++; 3062 + green = *p_in++; 3063 + red = *p_in++; 3064 + } 3065 + else if (img->pixel_format == GG_PIXEL_BGRA) 3066 + { 3067 + blue = *p_in++; 3068 + green = *p_in++; 3069 + red = *p_in++; 3070 + p_in++; /* skipping alpha */ 3071 + } 3072 + else if (img->pixel_format == GG_PIXEL_PALETTE) 3073 + { 3074 + int index = *p_in++; 3075 + red = img->palette_red[index]; 3076 + green = img->palette_green[index]; 3077 + blue = img->palette_blue[index]; 3078 + } 3079 + /* setting the destination pixel */ 3080 + gray = to_grayscale (red, green, blue); 3081 + *p_out++ = gray; 3082 + } 3083 + } 3084 + 3085 + free (img->pixels); 3086 + img->pixels = pixels; 3087 + img->pixel_format = GG_PIXEL_GRAYSCALE; 3088 + img->scanline_width = img->width; 3089 + img->pixel_size = 1; 3090 + img->max_palette = 0; 3091 + return GGRAPH_OK; 3092 +} 3093 + 3094 +GGRAPH_PRIVATE int 3095 +gg_convert_image_to_palette (const gGraphImagePtr img) 3096 +{ 3097 +/* converting this image to PALETTE */ 3098 + int x; 3099 + int y; 3100 + void *pixels; 3101 + unsigned char red; 3102 + unsigned char green; 3103 + unsigned char blue; 3104 + unsigned char index; 3105 + unsigned char *p_in; 3106 + unsigned char *p_out; 3107 + 3108 + if (img->pixel_format == GG_PIXEL_RGB || img->pixel_format == GG_PIXEL_RGBA 3109 + || img->pixel_format == GG_PIXEL_ARGB 3110 + || img->pixel_format == GG_PIXEL_BGR 3111 + || img->pixel_format == GG_PIXEL_BGRA 3112 + || img->pixel_format == GG_PIXEL_GRAYSCALE 3113 + || img->pixel_format == GG_PIXEL_PALETTE) 3114 + ; 3115 + else 3116 + return GGRAPH_INVALID_IMAGE; 3117 + 3118 + if (img->pixel_format == GG_PIXEL_PALETTE) 3119 + return GGRAPH_OK; 3120 + 3121 + pixels = malloc (img->width * img->height); 3122 + if (!pixels) 3123 + return GGRAPH_INSUFFICIENT_MEMORY; 3124 + img->max_palette = 0; 3125 + for (y = 0; y < img->height; y++) 3126 + { 3127 + /* processing any scanline */ 3128 + p_in = img->pixels + (y * img->scanline_width); 3129 + p_out = pixels; 3130 + p_out += (y * img->width); 3131 + for (x = 0; x < img->width; x++) 3132 + { 3133 + /* retrieving the origin pixel */ 3134 + if (img->pixel_format == GG_PIXEL_RGB) 3135 + { 3136 + red = *p_in++; 3137 + green = *p_in++; 3138 + blue = *p_in++; 3139 + } 3140 + else if (img->pixel_format == GG_PIXEL_RGBA) 3141 + { 3142 + red = *p_in++; 3143 + green = *p_in++; 3144 + blue = *p_in++; 3145 + p_in++; /* skipping alpha */ 3146 + } 3147 + else if (img->pixel_format == GG_PIXEL_ARGB) 3148 + { 3149 + p_in++; /* skipping alpha */ 3150 + blue = *p_in++; 3151 + green = *p_in++; 3152 + red = *p_in++; 3153 + } 3154 + else if (img->pixel_format == GG_PIXEL_BGR) 3155 + { 3156 + blue = *p_in++; 3157 + green = *p_in++; 3158 + red = *p_in++; 3159 + p_in++; /* skipping alpha */ 3160 + } 3161 + else if (img->pixel_format == GG_PIXEL_BGRA) 3162 + { 3163 + blue = *p_in++; 3164 + green = *p_in++; 3165 + red = *p_in++; 3166 + p_in++; /* skipping alpha */ 3167 + } 3168 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 3169 + { 3170 + red = *p_in++; 3171 + green = red; 3172 + blue = red; 3173 + } 3174 + /* setting the destination pixel */ 3175 + index = gg_match_palette (img, red, green, blue); 3176 + *p_out++ = index; 3177 + } 3178 + } 3179 + 3180 + free (img->pixels); 3181 + img->pixels = pixels; 3182 + img->pixel_format = GG_PIXEL_PALETTE; 3183 + img->scanline_width = img->width; 3184 + img->pixel_size = 1; 3185 + return GGRAPH_OK; 3186 +} 3187 + 3188 +GGRAPH_PRIVATE int 3189 +gg_convert_image_to_monochrome (const gGraphImagePtr img) 3190 +{ 3191 +/* converting this image to MONOCHROME */ 3192 + int x; 3193 + int y; 3194 + void *pixels; 3195 + unsigned char red; 3196 + unsigned char green; 3197 + unsigned char blue; 3198 + unsigned char index; 3199 + unsigned char *p_in; 3200 + unsigned char *p_out; 3201 + 3202 + if (img->pixel_format == GG_PIXEL_RGB || img->pixel_format == GG_PIXEL_RGBA 3203 + || img->pixel_format == GG_PIXEL_ARGB 3204 + || img->pixel_format == GG_PIXEL_BGR 3205 + || img->pixel_format == GG_PIXEL_BGRA 3206 + || img->pixel_format == GG_PIXEL_GRAYSCALE 3207 + || img->pixel_format == GG_PIXEL_PALETTE) 3208 + ; 3209 + else 3210 + return GGRAPH_INVALID_IMAGE; 3211 + 3212 + if (img->pixel_format == GG_PIXEL_PALETTE 3213 + && gg_is_image_monochrome_ready (img) == GGRAPH_TRUE) 3214 + return GGRAPH_OK; 3215 + 3216 + pixels = malloc (img->width * img->height); 3217 + if (!pixels) 3218 + return GGRAPH_INSUFFICIENT_MEMORY; 3219 + for (y = 0; y < img->height; y++) 3220 + { 3221 + /* processing any scanline */ 3222 + p_in = img->pixels + (y * img->scanline_width); 3223 + p_out = pixels; 3224 + p_out += (y * img->width); 3225 + for (x = 0; x < img->width; x++) 3226 + { 3227 + /* retrieving the origin pixel */ 3228 + if (img->pixel_format == GG_PIXEL_RGB) 3229 + { 3230 + red = *p_in++; 3231 + green = *p_in++; 3232 + blue = *p_in++; 3233 + } 3234 + else if (img->pixel_format == GG_PIXEL_RGBA) 3235 + { 3236 + red = *p_in++; 3237 + green = *p_in++; 3238 + blue = *p_in++; 3239 + p_in++; /* skipping alpha */ 3240 + } 3241 + else if (img->pixel_format == GG_PIXEL_ARGB) 3242 + { 3243 + p_in++; /* skipping alpha */ 3244 + blue = *p_in++; 3245 + green = *p_in++; 3246 + red = *p_in++; 3247 + } 3248 + else if (img->pixel_format == GG_PIXEL_BGR) 3249 + { 3250 + blue = *p_in++; 3251 + green = *p_in++; 3252 + red = *p_in++; 3253 + p_in++; /* skipping alpha */ 3254 + } 3255 + else if (img->pixel_format == GG_PIXEL_BGRA) 3256 + { 3257 + blue = *p_in++; 3258 + green = *p_in++; 3259 + red = *p_in++; 3260 + p_in++; /* skipping alpha */ 3261 + } 3262 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 3263 + { 3264 + red = *p_in++; 3265 + green = red; 3266 + blue = red; 3267 + } 3268 + else if (img->pixel_format == GG_PIXEL_PALETTE) 3269 + { 3270 + int index = *p_in++; 3271 + red = img->palette_red[index]; 3272 + green = img->palette_green[index]; 3273 + blue = img->palette_blue[index]; 3274 + } 3275 + /* setting the destination pixel */ 3276 + if (red == 0 && green == 0 && blue == 0) 3277 + index = 0; 3278 + else if (red == 255 && green == 255 && blue == 255) 3279 + index = 1; 3280 + else 3281 + { 3282 + /* neither WHITE nor BLACK */ 3283 + unsigned char gray = to_grayscale (red, green, blue); 3284 + if (gray < 128) 3285 + { 3286 + /* defaulting to BLACK */ 3287 + index = 0; 3288 + } 3289 + else 3290 + { 3291 + /* defaulting to WHITE */ 3292 + index = 1; 3293 + } 3294 + } 3295 + *p_out++ = index; 3296 + } 3297 + } 3298 + 3299 + free (img->pixels); 3300 + img->pixels = pixels; 3301 + img->pixel_format = GG_PIXEL_PALETTE; 3302 + img->scanline_width = img->width; 3303 + img->pixel_size = 1; 3304 + img->max_palette = 2; 3305 + img->palette_red[0] = 0; 3306 + img->palette_green[0] = 0; 3307 + img->palette_blue[0] = 0; 3308 + img->palette_red[1] = 255; 3309 + img->palette_green[1] = 255; 3310 + img->palette_blue[1] = 255; 3311 + return GGRAPH_OK; 3312 +} 3313 + 3314 +GGRAPH_PRIVATE int 3315 +gg_is_image_monochrome_ready (gGraphImagePtr img) 3316 +{ 3317 +/* 3318 +/ checking if this Image is into the Monochrome colorspace and ready to be used 3319 +/ expected: palette, 2 colors, black&white 3320 +*/ 3321 + int i; 3322 + int black = 0; 3323 + int white = 0; 3324 + if (img->pixel_format != GG_PIXEL_PALETTE) 3325 + return GGRAPH_FALSE; 3326 + if (img->max_palette != 2) 3327 + return GGRAPH_FALSE; 3328 + for (i = 0; i < img->max_palette; i++) 3329 + { 3330 + if (img->palette_red[i] == 0 && img->palette_green[i] == 0 3331 + && img->palette_blue[i] == 0) 3332 + black = 1; 3333 + if (img->palette_red[i] == 255 && img->palette_green[i] == 255 3334 + && img->palette_blue[i] == 255) 3335 + white = 1; 3336 + } 3337 + if (black && white) 3338 + return GGRAPH_TRUE; 3339 + return GGRAPH_FALSE; 3340 +} 3341 + 3342 +GGRAPH_PRIVATE int 3343 +gg_is_image_monochrome (gGraphImagePtr img) 3344 +{ 3345 +/* checking if this Image is into the Monochrome colorspace */ 3346 + int x; 3347 + int y; 3348 + unsigned char red; 3349 + unsigned char green; 3350 + unsigned char blue; 3351 + unsigned char *p_in; 3352 + for (y = 0; y < img->height; y++) 3353 + { 3354 + p_in = img->pixels + (y * img->scanline_width); 3355 + for (x = 0; x < img->width; x++) 3356 + { 3357 + /* retrieving a pixel */ 3358 + if (img->pixel_format == GG_PIXEL_RGB) 3359 + { 3360 + red = *p_in++; 3361 + green = *p_in++; 3362 + blue = *p_in++; 3363 + } 3364 + else if (img->pixel_format == GG_PIXEL_RGBA) 3365 + { 3366 + red = *p_in++; 3367 + green = *p_in++; 3368 + blue = *p_in++; 3369 + p_in++; /* skipping alpha */ 3370 + } 3371 + else if (img->pixel_format == GG_PIXEL_ARGB) 3372 + { 3373 + p_in++; /* skipping alpha */ 3374 + blue = *p_in++; 3375 + green = *p_in++; 3376 + red = *p_in++; 3377 + } 3378 + else if (img->pixel_format == GG_PIXEL_BGR) 3379 + { 3380 + blue = *p_in++; 3381 + green = *p_in++; 3382 + red = *p_in++; 3383 + } 3384 + else if (img->pixel_format == GG_PIXEL_BGRA) 3385 + { 3386 + blue = *p_in++; 3387 + green = *p_in++; 3388 + red = *p_in++; 3389 + p_in++; /* skipping alpha */ 3390 + } 3391 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 3392 + { 3393 + red = *p_in++; 3394 + green = red; 3395 + blue = red; 3396 + } 3397 + else if (img->pixel_format == GG_PIXEL_PALETTE) 3398 + { 3399 + int index = *p_in++; 3400 + red = img->palette_red[index]; 3401 + green = img->palette_green[index]; 3402 + blue = img->palette_blue[index]; 3403 + } 3404 + if (red == 0 && green == 0 && blue == 0) 3405 + continue; 3406 + if (red == 255 && green == 255 && blue == 255) 3407 + continue; 3408 + return GGRAPH_FALSE; 3409 + } 3410 + } 3411 + return GGRAPH_TRUE; 3412 +} 3413 + 3414 +GGRAPH_PRIVATE int 3415 +gg_is_image_grayscale (gGraphImagePtr img) 3416 +{ 3417 +/* checking if this Image is into the GrayScale colorspace */ 3418 + int x; 3419 + int y; 3420 + unsigned char red; 3421 + unsigned char green; 3422 + unsigned char blue; 3423 + unsigned char *p_in; 3424 + if (img->pixel_format == GG_PIXEL_GRAYSCALE) 3425 + return GGRAPH_TRUE; 3426 + for (y = 0; y < img->height; y++) 3427 + { 3428 + p_in = img->pixels + (y * img->scanline_width); 3429 + for (x = 0; x < img->width; x++) 3430 + { 3431 + /* retrieving a pixel */ 3432 + if (img->pixel_format == GG_PIXEL_RGB) 3433 + { 3434 + red = *p_in++; 3435 + green = *p_in++; 3436 + blue = *p_in++; 3437 + } 3438 + else if (img->pixel_format == GG_PIXEL_RGBA) 3439 + { 3440 + red = *p_in++; 3441 + green = *p_in++; 3442 + blue = *p_in++; 3443 + p_in++; /* skipping alpha */ 3444 + } 3445 + else if (img->pixel_format == GG_PIXEL_ARGB) 3446 + { 3447 + p_in++; /* skipping alpha */ 3448 + blue = *p_in++; 3449 + green = *p_in++; 3450 + red = *p_in++; 3451 + } 3452 + else if (img->pixel_format == GG_PIXEL_BGR) 3453 + { 3454 + blue = *p_in++; 3455 + green = *p_in++; 3456 + red = *p_in++; 3457 + } 3458 + else if (img->pixel_format == GG_PIXEL_BGRA) 3459 + { 3460 + blue = *p_in++; 3461 + green = *p_in++; 3462 + red = *p_in++; 3463 + p_in++; /* skipping alpha */ 3464 + } 3465 + else if (img->pixel_format == GG_PIXEL_PALETTE) 3466 + { 3467 + int index = *p_in++; 3468 + red = img->palette_red[index]; 3469 + green = img->palette_green[index]; 3470 + blue = img->palette_blue[index]; 3471 + } 3472 + if (red == green && green == blue) 3473 + continue; 3474 + return GGRAPH_FALSE; 3475 + } 3476 + } 3477 + return GGRAPH_TRUE; 3478 +} 3479 + 3480 +static int 3481 +palette_check (gGraphImagePtr img, unsigned char r, unsigned char g, 3482 + unsigned char b) 3483 +{ 3484 + unsigned char index; 3485 + for (index = 0; index < img->max_palette; index++) 3486 + { 3487 + /* searching if already defined */ 3488 + if (img->palette_red[index] == r && img->palette_green[index] == g 3489 + && img->palette_blue[index] == b) 3490 + return GGRAPH_TRUE; 3491 + } 3492 + if (img->max_palette < 255) 3493 + { 3494 + /* inserting a new palette entry */ 3495 + unsigned char i = img->max_palette; 3496 + img->max_palette += 1; 3497 + img->palette_red[i] = r; 3498 + img->palette_green[i] = g; 3499 + img->palette_blue[i] = b; 3500 + return GGRAPH_TRUE; 3501 + } 3502 + return GGRAPH_FALSE; 3503 +} 3504 + 3505 +GGRAPH_PRIVATE int 3506 +gg_is_image_palette256 (gGraphImagePtr img) 3507 +{ 3508 +/* checking if this Image may be represented using a 256 colors palette */ 3509 + int x; 3510 + int y; 3511 + unsigned char red; 3512 + unsigned char green; 3513 + unsigned char blue; 3514 + unsigned char *p_in; 3515 + if (img->pixel_format == GG_PIXEL_PALETTE 3516 + || img->pixel_format == GG_PIXEL_GRAYSCALE) 3517 + return GGRAPH_TRUE; 3518 + img->max_palette = 0; 3519 + for (y = 0; y < img->height; y++) 3520 + { 3521 + p_in = img->pixels + (y * img->scanline_width); 3522 + for (x = 0; x < img->width; x++) 3523 + { 3524 + /* retrieving a pixel */ 3525 + if (img->pixel_format == GG_PIXEL_RGB) 3526 + { 3527 + red = *p_in++; 3528 + green = *p_in++; 3529 + blue = *p_in++; 3530 + } 3531 + else if (img->pixel_format == GG_PIXEL_RGBA) 3532 + { 3533 + red = *p_in++; 3534 + green = *p_in++; 3535 + blue = *p_in++; 3536 + p_in++; /* skipping alpha */ 3537 + } 3538 + else if (img->pixel_format == GG_PIXEL_ARGB) 3539 + { 3540 + p_in++; /* skipping alpha */ 3541 + blue = *p_in++; 3542 + green = *p_in++; 3543 + red = *p_in++; 3544 + } 3545 + else if (img->pixel_format == GG_PIXEL_BGR) 3546 + { 3547 + blue = *p_in++; 3548 + green = *p_in++; 3549 + red = *p_in++; 3550 + } 3551 + else if (img->pixel_format == GG_PIXEL_BGRA) 3552 + { 3553 + blue = *p_in++; 3554 + green = *p_in++; 3555 + red = *p_in++; 3556 + p_in++; /* skipping alpha */ 3557 + } 3558 + if (palette_check (img, red, green, blue) == GGRAPH_FALSE) 3559 + return GGRAPH_FALSE; 3560 + } 3561 + } 3562 + return GGRAPH_TRUE; 3563 +} 3564 + 3565 +static gGraphImagePtr 3566 +raw_monochrome (unsigned char *p, int width, int height) 3567 +{ 3568 +/* creating a visible image from RAW MONOCHROME */ 3569 + int x; 3570 + int y; 3571 + int line_width; 3572 + gGraphImagePtr img = gg_image_create (GG_PIXEL_PALETTE, width, height, 8, 1, 3573 + GGRAPH_SAMPLE_UINT, NULL, NULL); 3574 + 3575 + if (!img) 3576 + return NULL; 3577 + 3578 + img->max_palette = 2; 3579 + img->palette_red[0] = 255; 3580 + img->palette_green[0] = 255; 3581 + img->palette_blue[0] = 255; 3582 + img->palette_red[1] = 0; 3583 + img->palette_green[1] = 0; 3584 + img->palette_blue[1] = 0; 3585 + 3586 + line_width = width / 8; 3587 + if ((line_width * 8) < width) 3588 + line_width++; 3589 + 3590 + for (y = 0; y < height; y++) 3591 + { 3592 + unsigned char *p_in = p + (y * line_width); 3593 + unsigned char *p_out = img->pixels + (y * img->scanline_width); 3594 + unsigned char byte = 0x00; 3595 + unsigned char px; 3596 + int pixel; 3597 + int pos = 0; 3598 + for (x = 0; x < width; x++) 3599 + { 3600 + if (pos == 0) 3601 + byte = *p_in++; 3602 + pixel = 0; 3603 + switch (pos) 3604 + { 3605 + case 0: 3606 + px = byte & 0x80; 3607 + if (px == 0x80) 3608 + pixel = 1; 3609 + break; 3610 + case 1: 3611 + px = byte & 0x40; 3612 + if (px == 0x40) 3613 + pixel = 1; 3614 + break; 3615 + case 2: 3616 + px = byte & 0x20; 3617 + if (px == 0x20) 3618 + pixel = 1; 3619 + break; 3620 + case 3: 3621 + px = byte & 0x10; 3622 + if (px == 0x10) 3623 + pixel = 1; 3624 + break; 3625 + case 4: 3626 + px = byte & 0x08; 3627 + if (px == 0x08) 3628 + pixel = 1; 3629 + break; 3630 + case 5: 3631 + px = byte & 0x04; 3632 + if (px == 0x04) 3633 + pixel = 1; 3634 + break; 3635 + case 6: 3636 + px = byte & 0x02; 3637 + if (px == 0x02) 3638 + pixel = 1; 3639 + break; 3640 + case 7: 3641 + px = byte & 0x01; 3642 + if (px == 0x01) 3643 + pixel = 1; 3644 + break; 3645 + }; 3646 + *p_out++ = pixel; 3647 + pos++; 3648 + if (pos > 7) 3649 + { 3650 + byte = 0x00; 3651 + pos = 0; 3652 + } 3653 + } 3654 + } 3655 + return img; 3656 +} 3657 + 3658 +static gGraphImagePtr 3659 +raw_rgb (unsigned char *p, int width, int height) 3660 +{ 3661 +/* creating a visible image from RAW RGB */ 3662 + int y; 3663 + gGraphImagePtr img = 3664 + gg_image_create (GG_PIXEL_RGB, width, height, 8, 3, GGRAPH_SAMPLE_UINT, 3665 + NULL, NULL); 3666 + 3667 + if (!img) 3668 + return NULL; 3669 + 3670 + for (y = 0; y < height; y++) 3671 + { 3672 + unsigned char *p_in = p + (y * img->scanline_width); 3673 + unsigned char *p_out = img->pixels + (y * img->scanline_width); 3674 + memcpy (p_out, p_in, img->scanline_width); 3675 + } 3676 + return img; 3677 +} 3678 + 3679 +static gGraphImagePtr 3680 +raw_grayscale (unsigned char *p, int width, int height) 3681 +{ 3682 +/* creating a visible image from RAW GRAYSCALE */ 3683 + int y; 3684 + gGraphImagePtr img = 3685 + gg_image_create (GG_PIXEL_GRAYSCALE, width, height, 8, 1, 3686 + GGRAPH_SAMPLE_UINT, NULL, NULL); 3687 + 3688 + if (!img) 3689 + return NULL; 3690 + 3691 + for (y = 0; y < height; y++) 3692 + { 3693 + unsigned char *p_in = p + (y * img->scanline_width); 3694 + unsigned char *p_out = img->pixels + (y * img->scanline_width); 3695 + memcpy (p_out, p_in, img->scanline_width); 3696 + } 3697 + return img; 3698 +} 3699 + 3700 +static gGraphImagePtr 3701 +raw_palette (unsigned char *p, int width, int height) 3702 +{ 3703 +/* creating a visible image from RAW PALETTE */ 3704 + int x; 3705 + int y; 3706 + gGraphImagePtr img = gg_image_create (GG_PIXEL_PALETTE, width, height, 8, 1, 3707 + GGRAPH_SAMPLE_UINT, NULL, NULL); 3708 + 3709 + if (!img) 3710 + return NULL; 3711 + 3712 + srand (1); 3713 + for (y = 0; y < height; y++) 3714 + { 3715 + unsigned char *p_in = p + (y * img->scanline_width); 3716 + unsigned char *p_out = img->pixels + (y * img->scanline_width); 3717 + for (x = 0; x < width; x++) 3718 + { 3719 + unsigned int col; 3720 + int idx = *p_in++; 3721 + *p_out++ = idx; 3722 + if (img->max_palette < (idx + 1)) 3723 + { 3724 + img->max_palette = idx + 1; 3725 + col = 255 - (unsigned int) rand () % 256; 3726 + img->palette_red[idx] = col; 3727 + col = (unsigned int) rand () % 256; 3728 + img->palette_green[idx] = col; 3729 + col = 255 - (unsigned int) rand () % 256; 3730 + img->palette_blue[idx] = col; 3731 + } 3732 + } 3733 + } 3734 + return img; 3735 +} 3736 + 3737 +static gGraphImagePtr 3738 +raw_int16 (unsigned char *p, int width, int height, int endian) 3739 +{ 3740 +/* creating a visible image from RAW GRID-INT16 */ 3741 + int x; 3742 + int y; 3743 + int endian_arch = gg_endian_arch (); 3744 + unsigned char *p_in; 3745 + short value; 3746 + short min = SHRT_MAX; 3747 + short max = SHRT_MIN; 3748 + double step; 3749 + double gray; 3750 + gGraphImagePtr img = 3751 + gg_image_create (GG_PIXEL_GRAYSCALE, width, height, 8, 1, 3752 + GGRAPH_SAMPLE_UINT, NULL, NULL); 3753 + 3754 + if (!img) 3755 + return NULL; 3756 + 3757 + for (y = 0; y < height; y++) 3758 + { 3759 + /* identifying Min/Max values */ 3760 + p_in = p + (y * width * sizeof (short)); 3761 + for (x = 0; x < width; x++) 3762 + { 3763 + value = gg_import_int16 (p_in, endian, endian_arch); 3764 + p_in += sizeof (short); 3765 + if (value > max) 3766 + max = value; 3767 + if (value < min) 3768 + min = value; 3769 + } 3770 + } 3771 + step = (double) (max - min) / 256.0; 3772 + for (y = 0; y < height; y++) 3773 + { 3774 + /* visualizing as Grayscale */ 3775 + unsigned char *p_out = img->pixels + (y * img->scanline_width); 3776 + p_in = p + (y * width * sizeof (short)); 3777 + for (x = 0; x < width; x++) 3778 + { 3779 + value = gg_import_int16 (p_in, endian, endian_arch); 3780 + p_in += sizeof (short); 3781 + gray = (double) (value - min) / step; 3782 + if (gray < 0.0) 3783 + gray = 0.0; 3784 + if (gray > 255) 3785 + gray = 255.0; 3786 + *p_out++ = (short) gray; 3787 + } 3788 + } 3789 + return img; 3790 +} 3791 + 3792 +static gGraphImagePtr 3793 +raw_int32 (unsigned char *p, int width, int height, int endian) 3794 +{ 3795 +/* creating a visible image from RAW GRID-INT32 */ 3796 + int x; 3797 + int y; 3798 + int endian_arch = gg_endian_arch (); 3799 + unsigned char *p_in; 3800 + int value; 3801 + int min = INT_MAX; 3802 + int max = INT_MIN; 3803 + double step; 3804 + double gray; 3805 + gGraphImagePtr img = 3806 + gg_image_create (GG_PIXEL_GRAYSCALE, width, height, 8, 1, 3807 + GGRAPH_SAMPLE_UINT, NULL, NULL); 3808 + 3809 + if (!img) 3810 + return NULL; 3811 + 3812 + for (y = 0; y < height; y++) 3813 + { 3814 + /* identifying Min/Max values */ 3815 + p_in = p + (y * width * sizeof (int)); 3816 + for (x = 0; x < width; x++) 3817 + { 3818 + value = gg_import_int32 (p_in, endian, endian_arch); 3819 + p_in += sizeof (int); 3820 + if (value > max) 3821 + max = value; 3822 + if (value < min) 3823 + min = value; 3824 + } 3825 + } 3826 + step = (double) (max - min) / 256.0; 3827 + for (y = 0; y < height; y++) 3828 + { 3829 + /* visualizing as Grayscale */ 3830 + unsigned char *p_out = img->pixels + (y * img->scanline_width); 3831 + p_in = p + (y * width * sizeof (int)); 3832 + for (x = 0; x < width; x++) 3833 + { 3834 + value = gg_import_int32 (p_in, endian, endian_arch); 3835 + p_in += sizeof (int); 3836 + gray = (double) (value - min) / step; 3837 + if (gray < 0.0) 3838 + gray = 0.0; 3839 + if (gray > 255) 3840 + gray = 255.0; 3841 + *p_out++ = (short) gray; 3842 + } 3843 + } 3844 + return img; 3845 +} 3846 + 3847 +static gGraphImagePtr 3848 +raw_uint16 (unsigned char *p, int width, int height, int endian) 3849 +{ 3850 +/* creating a visible image from RAW GRID-UINT16 */ 3851 + int x; 3852 + int y; 3853 + int endian_arch = gg_endian_arch (); 3854 + unsigned char *p_in; 3855 + unsigned short value; 3856 + unsigned short min = USHRT_MAX; 3857 + unsigned short max = 0; 3858 + double step; 3859 + double gray; 3860 + gGraphImagePtr img = 3861 + gg_image_create (GG_PIXEL_GRAYSCALE, width, height, 8, 1, 3862 + GGRAPH_SAMPLE_UINT, NULL, NULL); 3863 + 3864 + if (!img) 3865 + return NULL; 3866 + 3867 + for (y = 0; y < height; y++) 3868 + { 3869 + /* identifying Min/Max values */ 3870 + p_in = p + (y * width * sizeof (unsigned short)); 3871 + for (x = 0; x < width; x++) 3872 + { 3873 + value = gg_import_uint16 (p_in, endian, endian_arch); 3874 + p_in += sizeof (unsigned short); 3875 + if (value > max) 3876 + max = value; 3877 + if (value < min) 3878 + min = value; 3879 + } 3880 + } 3881 + step = (double) (max - min) / 256.0; 3882 + for (y = 0; y < height; y++) 3883 + { 3884 + /* visualizing as Grayscale */ 3885 + unsigned char *p_out = img->pixels + (y * img->scanline_width); 3886 + p_in = p + (y * width * sizeof (unsigned short)); 3887 + for (x = 0; x < width; x++) 3888 + { 3889 + value = gg_import_uint16 (p_in, endian, endian_arch); 3890 + p_in += sizeof (unsigned short); 3891 + gray = (double) (value - min) / step; 3892 + if (gray < 0.0) 3893 + gray = 0.0; 3894 + if (gray > 255) 3895 + gray = 255.0; 3896 + *p_out++ = (short) gray; 3897 + } 3898 + } 3899 + return img; 3900 +} 3901 + 3902 +static gGraphImagePtr 3903 +raw_uint32 (unsigned char *p, int width, int height, int endian) 3904 +{ 3905 +/* creating a visible image from RAW GRID-UINT32 */ 3906 + int x; 3907 + int y; 3908 + int endian_arch = gg_endian_arch (); 3909 + unsigned char *p_in; 3910 + unsigned int value; 3911 + unsigned int min = UINT_MAX; 3912 + unsigned int max = 0; 3913 + double step; 3914 + double gray; 3915 + gGraphImagePtr img = 3916 + gg_image_create (GG_PIXEL_GRAYSCALE, width, height, 8, 1, 3917 + GGRAPH_SAMPLE_UINT, NULL, NULL); 3918 + 3919 + if (!img) 3920 + return NULL; 3921 + 3922 + for (y = 0; y < height; y++) 3923 + { 3924 + /* identifying Min/Max values */ 3925 + p_in = p + (y * width * sizeof (int)); 3926 + for (x = 0; x < width; x++) 3927 + { 3928 + value = gg_import_uint32 (p_in, endian, endian_arch); 3929 + p_in += sizeof (unsigned int); 3930 + if (value > max) 3931 + max = value; 3932 + if (value < min) 3933 + min = value; 3934 + } 3935 + } 3936 + step = (double) (max - min) / 256.0; 3937 + for (y = 0; y < height; y++) 3938 + { 3939 + /* visualizing as Grayscale */ 3940 + unsigned char *p_out = img->pixels + (y * img->scanline_width); 3941 + p_in = p + (y * width * sizeof (unsigned int)); 3942 + for (x = 0; x < width; x++) 3943 + { 3944 + value = gg_import_uint32 (p_in, endian, endian_arch); 3945 + p_in += sizeof (unsigned int); 3946 + gray = (double) (value - min) / step; 3947 + if (gray < 0.0) 3948 + gray = 0.0; 3949 + if (gray > 255) 3950 + gray = 255.0; 3951 + *p_out++ = (short) gray; 3952 + } 3953 + } 3954 + return img; 3955 +} 3956 + 3957 +static gGraphImagePtr 3958 +raw_float (unsigned char *p, int width, int height, int endian) 3959 +{ 3960 +/* creating a visible image from RAW GRID-FLOAT */ 3961 + int x; 3962 + int y; 3963 + int endian_arch = gg_endian_arch (); 3964 + unsigned char *p_in; 3965 + float value; 3966 + float min = FLT_MAX; 3967 + float max = 0.0 - FLT_MAX; 3968 + double step; 3969 + double gray; 3970 + gGraphImagePtr img = 3971 + gg_image_create (GG_PIXEL_GRAYSCALE, width, height, 8, 1, 3972 + GGRAPH_SAMPLE_UINT, NULL, NULL); 3973 + 3974 + if (!img) 3975 + return NULL; 3976 + 3977 + for (y = 0; y < height; y++) 3978 + { 3979 + /* identifying Min/Max values */ 3980 + p_in = p + (y * width * sizeof (float)); 3981 + for (x = 0; x < width; x++) 3982 + { 3983 + value = gg_import_float (p_in, endian, endian_arch); 3984 + p_in += sizeof (float); 3985 + if (value > max) 3986 + max = value; 3987 + if (value < min) 3988 + min = value; 3989 + } 3990 + } 3991 + step = (double) (max - min) / 256.0; 3992 + for (y = 0; y < height; y++) 3993 + { 3994 + /* visualizing as Grayscale */ 3995 + unsigned char *p_out = img->pixels + (y * img->scanline_width); 3996 + p_in = p + (y * width * sizeof (float)); 3997 + for (x = 0; x < width; x++) 3998 + { 3999 + value = gg_import_float (p_in, endian, endian_arch); 4000 + p_in += sizeof (float); 4001 + gray = (double) (value - min) / step; 4002 + if (gray < 0.0) 4003 + gray = 0.0; 4004 + if (gray > 255) 4005 + gray = 255.0; 4006 + *p_out++ = (short) gray; 4007 + } 4008 + } 4009 + return img; 4010 +} 4011 + 4012 +static gGraphImagePtr 4013 +raw_double (unsigned char *p, int width, int height, int endian) 4014 +{ 4015 +/* creating a visible image from RAW GRID-DOUBLE */ 4016 + int x; 4017 + int y; 4018 + int endian_arch = gg_endian_arch (); 4019 + unsigned char *p_in; 4020 + double value; 4021 + double min = DBL_MAX; 4022 + double max = 0.0 - DBL_MAX; 4023 + double step; 4024 + double gray; 4025 + gGraphImagePtr img = 4026 + gg_image_create (GG_PIXEL_GRAYSCALE, width, height, 8, 1, 4027 + GGRAPH_SAMPLE_UINT, NULL, NULL); 4028 + 4029 + if (!img) 4030 + return NULL; 4031 + 4032 + for (y = 0; y < height; y++) 4033 + { 4034 + /* identifying Min/Max values */ 4035 + p_in = p + (y * width * sizeof (float)); 4036 + for (x = 0; x < width; x++) 4037 + { 4038 + value = gg_import_double (p_in, endian, endian_arch); 4039 + p_in += sizeof (double); 4040 + if (value > max) 4041 + max = value; 4042 + if (value < min) 4043 + min = value; 4044 + } 4045 + } 4046 + step = (double) (max - min) / 256.0; 4047 + for (y = 0; y < height; y++) 4048 + { 4049 + /* visualizing as Grayscale */ 4050 + unsigned char *p_out = img->pixels + (y * img->scanline_width); 4051 + p_in = p + (y * width * sizeof (double)); 4052 + for (x = 0; x < width; x++) 4053 + { 4054 + value = gg_import_double (p_in, endian, endian_arch); 4055 + p_in += sizeof (double); 4056 + gray = (value - min) / step; 4057 + if (gray < 0.0) 4058 + gray = 0.0; 4059 + if (gray > 255) 4060 + gray = 255.0; 4061 + *p_out++ = (short) gray; 4062 + } 4063 + } 4064 + return img; 4065 +} 4066 + 4067 +GGRAPH_PRIVATE int 4068 +gg_image_from_raw (int mem_buf_size, const void *mem_buf, 4069 + gGraphImagePtr * image_handle) 4070 +{ 4071 +/* importing a RAW image */ 4072 + gGraphImagePtr img = NULL; 4073 + int width; 4074 + int height; 4075 + int line_width; 4076 + unsigned char *p = (unsigned char *) mem_buf; 4077 + short start_signature; 4078 + short end_signature; 4079 + int endian_arch = gg_endian_arch (); 4080 + 4081 + *image_handle = NULL; 4082 + if (mem_buf_size < (int) (sizeof (short) * 4)) 4083 + return GGRAPH_ERROR; 4084 + 4085 +/* checking the magic signature */ 4086 + start_signature = gg_import_int16 (p, 1, endian_arch); 4087 + p = (unsigned char *) mem_buf + mem_buf_size - sizeof (short); 4088 + end_signature = gg_import_int16 (p, 1, endian_arch); 4089 + if (start_signature == GG_MONOCHROME_START 4090 + && end_signature == GG_MONOCHROME_END) 4091 + { 4092 + p = (unsigned char *) mem_buf + sizeof (short); 4093 + width = gg_import_int16 (p, 0, endian_arch); 4094 + p += sizeof (short); 4095 + height = gg_import_int16 (p, 0, endian_arch); 4096 + p += sizeof (short); 4097 + line_width = width / 8; 4098 + if ((line_width * 8) < width) 4099 + line_width++; 4100 + if ((line_width * height) != 4101 + (int) (mem_buf_size - (4 * sizeof (short)))) 4102 + return GGRAPH_ERROR; 4103 + img = raw_monochrome (p, width, height); 4104 + if (!img) 4105 + return GGRAPH_ERROR; 4106 + *image_handle = img; 4107 + return GGRAPH_OK; 4108 + } 4109 + if ((start_signature == GG_ADAM7_1_RGB_START 4110 + && end_signature == GG_ADAM7_1_RGB_END) || 4111 + (start_signature == GG_ADAM7_3_RGB_START 4112 + && end_signature == GG_ADAM7_3_RGB_END) || 4113 + (start_signature == GG_ADAM7_5_RGB_START 4114 + && end_signature == GG_ADAM7_5_RGB_END)) 4115 + { 4116 + p = (unsigned char *) mem_buf + sizeof (short); 4117 + width = gg_import_int16 (p, 1, endian_arch); 4118 + p += sizeof (short); 4119 + height = gg_import_int16 (p, 1, endian_arch); 4120 + p += sizeof (short); 4121 + line_width = width * 3; 4122 + if ((line_width * height) != 4123 + (int) (mem_buf_size - (4 * sizeof (short)))) 4124 + return GGRAPH_ERROR; 4125 + img = raw_rgb (p, width, height); 4126 + if (!img) 4127 + return GGRAPH_ERROR; 4128 + *image_handle = img; 4129 + return GGRAPH_OK; 4130 + } 4131 + if ((start_signature == GG_ADAM7_1_GRAYSCALE_START 4132 + && end_signature == GG_ADAM7_1_GRAYSCALE_END) || 4133 + (start_signature == GG_ADAM7_3_GRAYSCALE_START 4134 + && end_signature == GG_ADAM7_3_GRAYSCALE_END) || 4135 + (start_signature == GG_ADAM7_5_GRAYSCALE_START 4136 + && end_signature == GG_ADAM7_5_GRAYSCALE_END)) 4137 + { 4138 + p = (unsigned char *) mem_buf + sizeof (short); 4139 + width = gg_import_int16 (p, 1, endian_arch); 4140 + p += sizeof (short); 4141 + height = gg_import_int16 (p, 1, endian_arch); 4142 + p += sizeof (short); 4143 + line_width = width; 4144 + if ((line_width * height) != 4145 + (int) (mem_buf_size - (4 * sizeof (short)))) 4146 + return GGRAPH_ERROR; 4147 + img = raw_grayscale (p, width, height); 4148 + if (!img) 4149 + return GGRAPH_ERROR; 4150 + *image_handle = img; 4151 + return GGRAPH_OK; 4152 + } 4153 + if ((start_signature == GG_ADAM7_1_PALETTE_START 4154 + && end_signature == GG_ADAM7_1_PALETTE_END) || 4155 + (start_signature == GG_ADAM7_3_PALETTE_START 4156 + && end_signature == GG_ADAM7_3_PALETTE_END) || 4157 + (start_signature == GG_ADAM7_5_PALETTE_START 4158 + && end_signature == GG_ADAM7_5_PALETTE_END)) 4159 + { 4160 + p = (unsigned char *) mem_buf + sizeof (short); 4161 + width = gg_import_int16 (p, 1, endian_arch); 4162 + p += sizeof (short); 4163 + height = gg_import_int16 (p, 1, endian_arch); 4164 + p += sizeof (short); 4165 + line_width = width; 4166 + if ((line_width * height) != 4167 + (int) (mem_buf_size - (4 * sizeof (short)))) 4168 + return GGRAPH_ERROR; 4169 + img = raw_palette (p, width, height); 4170 + if (!img) 4171 + return GGRAPH_ERROR; 4172 + *image_handle = img; 4173 + return GGRAPH_OK; 4174 + } 4175 + if ((start_signature == GG_ADAM7_1_INT16_START 4176 + && end_signature == GG_ADAM7_1_INT16_END) || 4177 + (start_signature == GG_ADAM7_3_INT16_START 4178 + && end_signature == GG_ADAM7_3_INT16_END) || 4179 + (start_signature == GG_ADAM7_5_INT16_START 4180 + && end_signature == GG_ADAM7_5_INT16_END)) 4181 + { 4182 + p = (unsigned char *) mem_buf + sizeof (short); 4183 + width = gg_import_int16 (p, 1, endian_arch); 4184 + p += sizeof (short); 4185 + height = gg_import_int16 (p, 1, endian_arch); 4186 + p += sizeof (short); 4187 + line_width = width * sizeof (short); 4188 + if ((line_width * height) != 4189 + (int) (mem_buf_size - (4 * sizeof (short)))) 4190 + return GGRAPH_ERROR; 4191 + img = raw_int16 (p, width, height, 1); 4192 + if (!img) 4193 + return GGRAPH_ERROR; 4194 + *image_handle = img; 4195 + return GGRAPH_OK; 4196 + } 4197 + if ((start_signature == GG_ADAM7_1_UINT16_START 4198 + && end_signature == GG_ADAM7_1_UINT16_END) || 4199 + (start_signature == GG_ADAM7_3_UINT16_START 4200 + && end_signature == GG_ADAM7_3_UINT16_END) || 4201 + (start_signature == GG_ADAM7_5_UINT16_START 4202 + && end_signature == GG_ADAM7_5_UINT16_END)) 4203 + { 4204 + p = (unsigned char *) mem_buf + sizeof (short); 4205 + width = gg_import_int16 (p, 1, endian_arch); 4206 + p += sizeof (short); 4207 + height = gg_import_int16 (p, 1, endian_arch); 4208 + p += sizeof (short); 4209 + line_width = width * sizeof (unsigned short); 4210 + if ((line_width * height) != 4211 + (int) (mem_buf_size - (4 * sizeof (short)))) 4212 + return GGRAPH_ERROR; 4213 + img = raw_uint16 (p, width, height, 1); 4214 + if (!img) 4215 + return GGRAPH_ERROR; 4216 + *image_handle = img; 4217 + return GGRAPH_OK; 4218 + } 4219 + if ((start_signature == GG_ADAM7_1_INT32_START 4220 + && end_signature == GG_ADAM7_1_INT32_END) || 4221 + (start_signature == GG_ADAM7_3_INT32_START 4222 + && end_signature == GG_ADAM7_3_INT32_END) || 4223 + (start_signature == GG_ADAM7_5_INT32_START 4224 + && end_signature == GG_ADAM7_5_INT32_END)) 4225 + { 4226 + p = (unsigned char *) mem_buf + sizeof (short); 4227 + width = gg_import_int16 (p, 1, endian_arch); 4228 + p += sizeof (short); 4229 + height = gg_import_int16 (p, 1, endian_arch); 4230 + p += sizeof (short); 4231 + line_width = width * sizeof (int); 4232 + if ((line_width * height) != 4233 + (int) (mem_buf_size - (4 * sizeof (short)))) 4234 + return GGRAPH_ERROR; 4235 + img = raw_int32 (p, width, height, 1); 4236 + if (!img) 4237 + return GGRAPH_ERROR; 4238 + *image_handle = img; 4239 + return GGRAPH_OK; 4240 + } 4241 + if ((start_signature == GG_ADAM7_1_UINT32_START 4242 + && end_signature == GG_ADAM7_1_UINT32_END) || 4243 + (start_signature == GG_ADAM7_3_UINT32_START 4244 + && end_signature == GG_ADAM7_3_UINT32_END) || 4245 + (start_signature == GG_ADAM7_5_UINT32_START 4246 + && end_signature == GG_ADAM7_5_UINT32_END)) 4247 + { 4248 + p = (unsigned char *) mem_buf + sizeof (short); 4249 + width = gg_import_int16 (p, 1, endian_arch); 4250 + p += sizeof (short); 4251 + height = gg_import_int16 (p, 1, endian_arch); 4252 + p += sizeof (short); 4253 + line_width = width * sizeof (unsigned int); 4254 + if ((line_width * height) != 4255 + (int) (mem_buf_size - (4 * sizeof (short)))) 4256 + return GGRAPH_ERROR; 4257 + img = raw_uint32 (p, width, height, 1); 4258 + if (!img) 4259 + return GGRAPH_ERROR; 4260 + *image_handle = img; 4261 + return GGRAPH_OK; 4262 + } 4263 + if ((start_signature == GG_ADAM7_1_FLOAT_START 4264 + && end_signature == GG_ADAM7_1_FLOAT_END) || 4265 + (start_signature == GG_ADAM7_3_FLOAT_START 4266 + && end_signature == GG_ADAM7_3_FLOAT_END) || 4267 + (start_signature == GG_ADAM7_5_FLOAT_START 4268 + && end_signature == GG_ADAM7_5_FLOAT_END)) 4269 + { 4270 + p = (unsigned char *) mem_buf + sizeof (short); 4271 + width = gg_import_int16 (p, 1, endian_arch); 4272 + p += sizeof (short); 4273 + height = gg_import_int16 (p, 1, endian_arch); 4274 + p += sizeof (short); 4275 + line_width = width * sizeof (float); 4276 + if ((line_width * height) != 4277 + (int) (mem_buf_size - (4 * sizeof (short)))) 4278 + return GGRAPH_ERROR; 4279 + img = raw_float (p, width, height, 1); 4280 + if (!img) 4281 + return GGRAPH_ERROR; 4282 + *image_handle = img; 4283 + return GGRAPH_OK; 4284 + } 4285 + if ((start_signature == GG_ADAM7_1_DOUBLE_START 4286 + && end_signature == GG_ADAM7_1_DOUBLE_END) || 4287 + (start_signature == GG_ADAM7_3_DOUBLE_START 4288 + && end_signature == GG_ADAM7_3_DOUBLE_END) || 4289 + (start_signature == GG_ADAM7_5_DOUBLE_START 4290 + && end_signature == GG_ADAM7_5_DOUBLE_END)) 4291 + { 4292 + p = (unsigned char *) mem_buf + sizeof (short); 4293 + width = gg_import_int16 (p, 1, endian_arch); 4294 + p += sizeof (short); 4295 + height = gg_import_int16 (p, 1, endian_arch); 4296 + p += sizeof (short); 4297 + line_width = width * sizeof (double); 4298 + if ((line_width * height) != 4299 + (int) (mem_buf_size - (4 * sizeof (short)))) 4300 + return GGRAPH_ERROR; 4301 + img = raw_double (p, width, height, 1); 4302 + if (!img) 4303 + return GGRAPH_ERROR; 4304 + *image_handle = img; 4305 + return GGRAPH_OK; 4306 + } 4307 + 4308 + p = (unsigned char *) mem_buf; 4309 + start_signature = gg_import_int16 (p, 0, endian_arch); 4310 + p = (unsigned char *) mem_buf + mem_buf_size - sizeof (short); 4311 + end_signature = gg_import_int16 (p, 0, endian_arch); 4312 + if ((start_signature == GG_ADAM7_0_RGB_START 4313 + && end_signature == GG_ADAM7_0_RGB_END) || 4314 + (start_signature == GG_ADAM7_2_RGB_START 4315 + && end_signature == GG_ADAM7_2_RGB_END) || 4316 + (start_signature == GG_ADAM7_4_RGB_START 4317 + && end_signature == GG_ADAM7_4_RGB_END) || 4318 + (start_signature == GG_ADAM7_6_RGB_START 4319 + && end_signature == GG_ADAM7_6_RGB_END)) 4320 + { 4321 + p = (unsigned char *) mem_buf + sizeof (short); 4322 + width = gg_import_int16 (p, 0, endian_arch); 4323 + p += sizeof (short); 4324 + height = gg_import_int16 (p, 0, endian_arch); 4325 + p += sizeof (short); 4326 + img = raw_rgb (p, width, height); 4327 + if (!img) 4328 + return GGRAPH_ERROR; 4329 + *image_handle = img; 4330 + return GGRAPH_OK; 4331 + } 4332 + if ((start_signature == GG_ADAM7_0_GRAYSCALE_START 4333 + && end_signature == GG_ADAM7_0_GRAYSCALE_END) || 4334 + (start_signature == GG_ADAM7_2_GRAYSCALE_START 4335 + && end_signature == GG_ADAM7_2_GRAYSCALE_END) || 4336 + (start_signature == GG_ADAM7_4_GRAYSCALE_START 4337 + && end_signature == GG_ADAM7_4_GRAYSCALE_END) || 4338 + (start_signature == GG_ADAM7_6_GRAYSCALE_START 4339 + && end_signature == GG_ADAM7_6_GRAYSCALE_END)) 4340 + { 4341 + p = (unsigned char *) mem_buf + sizeof (short); 4342 + width = gg_import_int16 (p, 0, endian_arch); 4343 + p += sizeof (short); 4344 + height = gg_import_int16 (p, 0, endian_arch); 4345 + p += sizeof (short); 4346 + img = raw_grayscale (p, width, height); 4347 + if (!img) 4348 + return GGRAPH_ERROR; 4349 + *image_handle = img; 4350 + return GGRAPH_OK; 4351 + } 4352 + if ((start_signature == GG_ADAM7_0_PALETTE_START 4353 + && end_signature == GG_ADAM7_0_PALETTE_END) || 4354 + (start_signature == GG_ADAM7_2_PALETTE_START 4355 + && end_signature == GG_ADAM7_2_PALETTE_END) || 4356 + (start_signature == GG_ADAM7_4_PALETTE_START 4357 + && end_signature == GG_ADAM7_4_PALETTE_END) || 4358 + (start_signature == GG_ADAM7_6_PALETTE_START 4359 + && end_signature == GG_ADAM7_6_PALETTE_END)) 4360 + { 4361 + p = (unsigned char *) mem_buf + sizeof (short); 4362 + width = gg_import_int16 (p, 0, endian_arch); 4363 + p += sizeof (short); 4364 + height = gg_import_int16 (p, 0, endian_arch); 4365 + p += sizeof (short); 4366 + img = raw_palette (p, width, height); 4367 + if (!img) 4368 + return GGRAPH_ERROR; 4369 + *image_handle = img; 4370 + return GGRAPH_OK; 4371 + } 4372 + if ((start_signature == GG_ADAM7_0_INT16_START 4373 + && end_signature == GG_ADAM7_0_INT16_END) || 4374 + (start_signature == GG_ADAM7_2_INT16_START 4375 + && end_signature == GG_ADAM7_2_INT16_END) || 4376 + (start_signature == GG_ADAM7_4_INT16_START 4377 + && end_signature == GG_ADAM7_4_INT16_END) || 4378 + (start_signature == GG_ADAM7_6_INT16_START 4379 + && end_signature == GG_ADAM7_6_INT16_END)) 4380 + { 4381 + p = (unsigned char *) mem_buf + sizeof (short); 4382 + width = gg_import_int16 (p, 0, endian_arch); 4383 + p += sizeof (short); 4384 + height = gg_import_int16 (p, 0, endian_arch); 4385 + p += sizeof (short); 4386 + img = raw_int16 (p, width, height, 0); 4387 + if (!img) 4388 + return GGRAPH_ERROR; 4389 + *image_handle = img; 4390 + return GGRAPH_OK; 4391 + } 4392 + if ((start_signature == GG_ADAM7_0_UINT16_START 4393 + && end_signature == GG_ADAM7_0_UINT16_END) || 4394 + (start_signature == GG_ADAM7_2_UINT16_START 4395 + && end_signature == GG_ADAM7_2_UINT16_END) || 4396 + (start_signature == GG_ADAM7_4_UINT16_START 4397 + && end_signature == GG_ADAM7_4_UINT16_END) || 4398 + (start_signature == GG_ADAM7_6_UINT16_START 4399 + && end_signature == GG_ADAM7_6_UINT16_END)) 4400 + { 4401 + p = (unsigned char *) mem_buf + sizeof (short); 4402 + width = gg_import_int16 (p, 0, endian_arch); 4403 + p += sizeof (short); 4404 + height = gg_import_int16 (p, 0, endian_arch); 4405 + p += sizeof (short); 4406 + img = raw_uint16 (p, width, height, 0); 4407 + if (!img) 4408 + return GGRAPH_ERROR; 4409 + *image_handle = img; 4410 + return GGRAPH_OK; 4411 + } 4412 + if ((start_signature == GG_ADAM7_0_INT32_START 4413 + && end_signature == GG_ADAM7_0_INT32_END) || 4414 + (start_signature == GG_ADAM7_2_INT32_START 4415 + && end_signature == GG_ADAM7_2_INT32_END) || 4416 + (start_signature == GG_ADAM7_4_INT32_START 4417 + && end_signature == GG_ADAM7_4_INT32_END) || 4418 + (start_signature == GG_ADAM7_6_INT32_START 4419 + && end_signature == GG_ADAM7_6_INT32_END)) 4420 + { 4421 + p = (unsigned char *) mem_buf + sizeof (short); 4422 + width = gg_import_int16 (p, 0, endian_arch); 4423 + p += sizeof (short); 4424 + height = gg_import_int16 (p, 0, endian_arch); 4425 + p += sizeof (short); 4426 + img = raw_int32 (p, width, height, 0); 4427 + if (!img) 4428 + return GGRAPH_ERROR; 4429 + *image_handle = img; 4430 + return GGRAPH_OK; 4431 + } 4432 + if ((start_signature == GG_ADAM7_0_UINT32_START 4433 + && end_signature == GG_ADAM7_0_UINT32_END) || 4434 + (start_signature == GG_ADAM7_2_UINT32_START 4435 + && end_signature == GG_ADAM7_2_UINT32_END) || 4436 + (start_signature == GG_ADAM7_4_UINT32_START 4437 + && end_signature == GG_ADAM7_4_UINT32_END) || 4438 + (start_signature == GG_ADAM7_6_UINT32_START 4439 + && end_signature == GG_ADAM7_6_UINT32_END)) 4440 + { 4441 + p = (unsigned char *) mem_buf + sizeof (short); 4442 + width = gg_import_int16 (p, 0, endian_arch); 4443 + p += sizeof (short); 4444 + height = gg_import_int16 (p, 0, endian_arch); 4445 + p += sizeof (short); 4446 + img = raw_uint32 (p, width, height, 0); 4447 + if (!img) 4448 + return GGRAPH_ERROR; 4449 + *image_handle = img; 4450 + return GGRAPH_OK; 4451 + } 4452 + if ((start_signature == GG_ADAM7_0_FLOAT_START 4453 + && end_signature == GG_ADAM7_0_FLOAT_END) || 4454 + (start_signature == GG_ADAM7_2_FLOAT_START 4455 + && end_signature == GG_ADAM7_2_FLOAT_END) || 4456 + (start_signature == GG_ADAM7_4_FLOAT_START 4457 + && end_signature == GG_ADAM7_4_FLOAT_END) || 4458 + (start_signature == GG_ADAM7_6_FLOAT_START 4459 + && end_signature == GG_ADAM7_6_FLOAT_END)) 4460 + { 4461 + p = (unsigned char *) mem_buf + sizeof (short); 4462 + width = gg_import_int16 (p, 0, endian_arch); 4463 + p += sizeof (short); 4464 + height = gg_import_int16 (p, 0, endian_arch); 4465 + p += sizeof (short); 4466 + img = raw_float (p, width, height, 0); 4467 + if (!img) 4468 + return GGRAPH_ERROR; 4469 + *image_handle = img; 4470 + return GGRAPH_OK; 4471 + } 4472 + if ((start_signature == GG_ADAM7_0_DOUBLE_START 4473 + && end_signature == GG_ADAM7_0_DOUBLE_END) || 4474 + (start_signature == GG_ADAM7_2_DOUBLE_START 4475 + && end_signature == GG_ADAM7_2_DOUBLE_END) || 4476 + (start_signature == GG_ADAM7_4_DOUBLE_START 4477 + && end_signature == GG_ADAM7_4_DOUBLE_END) || 4478 + (start_signature == GG_ADAM7_6_DOUBLE_START 4479 + && end_signature == GG_ADAM7_6_DOUBLE_END)) 4480 + { 4481 + p = (unsigned char *) mem_buf + sizeof (short); 4482 + width = gg_import_int16 (p, 0, endian_arch); 4483 + p += sizeof (short); 4484 + height = gg_import_int16 (p, 0, endian_arch); 4485 + p += sizeof (short); 4486 + img = raw_double (p, width, height, 0); 4487 + if (!img) 4488 + return GGRAPH_ERROR; 4489 + *image_handle = img; 4490 + return GGRAPH_OK; 4491 + } 4492 + 4493 + return GGRAPH_ERROR; 4494 +} 4495 + 4496 +static int 4497 +is_near_transparent (unsigned char r, unsigned char g, unsigned char b, 4498 + const gGraphImagePtr img) 4499 +{ 4500 +/* checking if this one is a near-transparent value */ 4501 + int diff; 4502 + if (r == img->transparent_red && g == img->transparent_green 4503 + && b == img->transparent_blue) 4504 + return 0; 4505 + diff = r - img->transparent_red; 4506 + if (diff <= 8 && diff >= -8) 4507 + ; 4508 + else 4509 + return 0; 4510 + diff = g - img->transparent_green; 4511 + if (diff <= 8 && diff >= -8) 4512 + ; 4513 + else 4514 + return 0; 4515 + diff = b - img->transparent_blue; 4516 + if (diff <= 8 && diff >= -8) 4517 + ; 4518 + else 4519 + return 0; 4520 + return 1; 4521 +} 4522 + 4523 +GGRAPH_PRIVATE int 4524 +gg_resample_transparent_rgb (const gGraphImagePtr img) 4525 +{ 4526 +/* 4527 +/ resampling colors so to make near-transparent values 4528 +/ to be really transparent 4529 +*/ 4530 + int x; 4531 + int y; 4532 + unsigned char *p_in; 4533 + unsigned char *p_out; 4534 + unsigned char r; 4535 + unsigned char g; 4536 + unsigned char b; 4537 + 4538 + if (img->pixel_format != GG_PIXEL_RGB) 4539 + return GGRAPH_ERROR; 4540 + 4541 + for (y = 0; y < img->height; y++) 4542 + { 4543 + p_in = img->pixels + (y * img->scanline_width); 4544 + p_out = img->pixels + (y * img->scanline_width); 4545 + for (x = 0; x < img->width; x++) 4546 + { 4547 + r = *p_in++; 4548 + g = *p_in++; 4549 + b = *p_in++; 4550 + if (is_near_transparent (r, g, b, img)) 4551 + { 4552 + *p_out++ = img->transparent_red; 4553 + *p_out++ = img->transparent_green; 4554 + *p_out++ = img->transparent_blue; 4555 + } 4556 + else 4557 + p_out += 3; 4558 + } 4559 + } 4560 + return GGRAPH_OK; 4561 +} 4562 + 4563 +GGRAPH_PRIVATE int 4564 +gg_resample_transparent_rgba (const gGraphImagePtr img) 4565 +{ 4566 +/* 4567 +/ resampling colors so to make near-transparent values 4568 +/ to be really transparent 4569 +*/ 4570 + int x; 4571 + int y; 4572 + unsigned char *p_in; 4573 + unsigned char *p_out; 4574 + unsigned char r; 4575 + unsigned char g; 4576 + unsigned char b; 4577 + 4578 + if (img->pixel_format != GG_PIXEL_RGBA) 4579 + return GGRAPH_ERROR; 4580 + 4581 + for (y = 0; y < img->height; y++) 4582 + { 4583 + p_in = img->pixels + (y * img->scanline_width); 4584 + p_out = img->pixels + (y * img->scanline_width); 4585 + for (x = 0; x < img->width; x++) 4586 + { 4587 + r = *p_in++; 4588 + g = *p_in++; 4589 + b = *p_in++; 4590 + p_in++; 4591 + if (is_near_transparent (r, g, b, img)) 4592 + { 4593 + *p_out++ = img->transparent_red; 4594 + *p_out++ = img->transparent_green; 4595 + *p_out++ = img->transparent_blue; 4596 + *p_out++ = 0; 4597 + } 4598 + else 4599 + p_out += 4; 4600 + } 4601 + } 4602 + return GGRAPH_OK; 4603 +} 4604 + 4605 +GGRAPH_PRIVATE int 4606 +gg_resample_transparent_grayscale (const gGraphImagePtr img) 4607 +{ 4608 +/* 4609 +/ resampling colors so to make near-transparent values 4610 +/ to be really transparent 4611 +*/ 4612 + int x; 4613 + int y; 4614 + unsigned char r; 4615 + unsigned char g; 4616 + unsigned char b; 4617 + unsigned char *p_in; 4618 + unsigned char *p_out; 4619 + 4620 + if (img->pixel_format != GG_PIXEL_GRAYSCALE) 4621 + return GGRAPH_ERROR; 4622 + if (img->transparent_red == img->transparent_green 4623 + && img->transparent_red == img->transparent_blue) 4624 + ; 4625 + else 4626 + return GGRAPH_OK; 4627 + 4628 + for (y = 0; y < img->height; y++) 4629 + { 4630 + p_in = img->pixels + (y * img->scanline_width); 4631 + p_out = img->pixels + (y * img->scanline_width); 4632 + for (x = 0; x < img->width; x++) 4633 + { 4634 + r = *p_in++; 4635 + g = r; 4636 + b = r; 4637 + if (is_near_transparent (r, g, b, img)) 4638 + *p_out = img->transparent_red; 4639 + p_out++; 4640 + } 4641 + } 4642 + return GGRAPH_OK; 4643 +} 4644 + 4645 +GGRAPH_PRIVATE int 4646 +gg_resample_transparent_palette (const gGraphImagePtr img) 4647 +{ 4648 +/* 4649 +/ resampling colors so to make near-transparent values 4650 +/ to be really transparent 4651 +*/ 4652 + int x; 4653 + int y; 4654 + int idx; 4655 + unsigned char r; 4656 + unsigned char g; 4657 + unsigned char b; 4658 + int transparent_idx = -1; 4659 + unsigned char *p_in; 4660 + unsigned char *p_out; 4661 + 4662 + if (img->pixel_format != GG_PIXEL_RGB) 4663 + return GGRAPH_ERROR; 4664 + for (idx = 0; idx < img->max_palette; idx++) 4665 + { 4666 + if (img->palette_red[idx] == img->transparent_red && 4667 + img->palette_green[idx] == img->transparent_green && 4668 + img->palette_blue[idx] == img->transparent_blue) 4669 + { 4670 + transparent_idx = idx; 4671 + break; 4672 + } 4673 + } 4674 + if (transparent_idx < 0) 4675 + return GGRAPH_OK; 4676 + 4677 + for (y = 0; y < img->height; y++) 4678 + { 4679 + p_in = img->pixels + (y * img->scanline_width); 4680 + p_out = p_in; 4681 + for (x = 0; x < img->width; x++) 4682 + { 4683 + idx = *p_in++; 4684 + r = img->palette_red[idx]; 4685 + g = img->palette_green[idx]; 4686 + b = img->palette_blue[idx]; 4687 + if (is_near_transparent (r, g, b, img)) 4688 + *p_out = transparent_idx; 4689 + p_out++; 4690 + } 4691 + } 4692 + return GGRAPH_OK; 4693 +}
Added src/gaiagraphics_io.c.
1 +/* 2 +/ gaiagraphics_io.c 3 +/ 4 +/ IO helper methods 5 +/ 6 +/ version 1.0, 2010 July 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2009 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdio.h> 28 +#include <stdlib.h> 29 +#include <string.h> 30 +#include <limits.h> 31 + 32 +#include <tiffio.h> 33 + 34 +#include "gaiagraphics.h" 35 +#include "gaiagraphics_internals.h" 36 + 37 +#define TRUE 1 38 +#define FALSE 0 39 + 40 +GGRAPH_DECLARE void 41 +gGraphSmartPrintf (double value, char *buf) 42 +{ 43 +/* well formatting a decimal number */ 44 + int i; 45 + sprintf (buf, "%1.18f", value); 46 + for (i = strlen (buf) - 1; i >= 0; i--) 47 + { 48 + if (buf[i] == '0') 49 + buf[i] = '\0'; 50 + else 51 + break; 52 + } 53 + i = strlen (buf) - 1; 54 + if (buf[i] == '.') 55 + buf[i] = '\0'; 56 +} 57 + 58 +GGRAPH_PRIVATE int 59 +gg_endian_arch () 60 +{ 61 +/* checking if target CPU is a little-endian one */ 62 + union cvt 63 + { 64 + unsigned char byte[4]; 65 + int int_value; 66 + } convert; 67 + convert.int_value = 1; 68 + if (convert.byte[0] == 0) 69 + return 0; 70 + return 1; 71 +} 72 + 73 +GGRAPH_PRIVATE short 74 +gg_import_int16 (const unsigned char *p, int little_endian, 75 + int little_endian_arch) 76 +{ 77 +/* fetches a signed 16bit int from BLOB respecting declared endiannes */ 78 + union cvt 79 + { 80 + unsigned char byte[2]; 81 + short short_value; 82 + } convert; 83 + if (little_endian_arch) 84 + { 85 + /* Litte-Endian architecture [e.g. x86] */ 86 + if (!little_endian) 87 + { 88 + /* Big Endian data */ 89 + convert.byte[0] = *(p + 1); 90 + convert.byte[1] = *(p + 0); 91 + } 92 + else 93 + { 94 + /* Little Endian data */ 95 + convert.byte[0] = *(p + 0); 96 + convert.byte[1] = *(p + 1); 97 + } 98 + } 99 + else 100 + { 101 + /* Big Endian architecture [e.g. PPC] */ 102 + if (!little_endian) 103 + { 104 + /* Big Endian data */ 105 + convert.byte[0] = *(p + 0); 106 + convert.byte[1] = *(p + 1); 107 + } 108 + else 109 + { 110 + /* Little Endian data */ 111 + convert.byte[0] = *(p + 1); 112 + convert.byte[1] = *(p + 0); 113 + } 114 + } 115 + return convert.short_value; 116 +} 117 + 118 +GGRAPH_PRIVATE unsigned short 119 +gg_import_uint16 (const unsigned char *p, int little_endian, 120 + int little_endian_arch) 121 +{ 122 +/* fetches an unsigned 16bit int from BLOB respecting declared endiannes */ 123 + union cvt 124 + { 125 + unsigned char byte[2]; 126 + unsigned short short_value; 127 + } convert; 128 + if (little_endian_arch) 129 + { 130 + /* Litte-Endian architecture [e.g. x86] */ 131 + if (!little_endian) 132 + { 133 + /* Big Endian data */ 134 + convert.byte[0] = *(p + 1); 135 + convert.byte[1] = *(p + 0); 136 + } 137 + else 138 + { 139 + /* Little Endian data */ 140 + convert.byte[0] = *(p + 0); 141 + convert.byte[1] = *(p + 1); 142 + } 143 + } 144 + else 145 + { 146 + /* Big Endian architecture [e.g. PPC] */ 147 + if (!little_endian) 148 + { 149 + /* Big Endian data */ 150 + convert.byte[0] = *(p + 0); 151 + convert.byte[1] = *(p + 1); 152 + } 153 + else 154 + { 155 + /* Little Endian data */ 156 + convert.byte[0] = *(p + 1); 157 + convert.byte[1] = *(p + 0); 158 + } 159 + } 160 + return convert.short_value; 161 +} 162 + 163 +GGRAPH_PRIVATE int 164 +gg_import_int32 (const unsigned char *p, int little_endian, 165 + int little_endian_arch) 166 +{ 167 +/* fetches a signed 32bit int from BLOB respecting declared endiannes */ 168 + union cvt 169 + { 170 + unsigned char byte[4]; 171 + int int_value; 172 + } convert; 173 + if (little_endian_arch) 174 + { 175 + /* Litte-Endian architecture [e.g. x86] */ 176 + if (!little_endian) 177 + { 178 + /* Big Endian data */ 179 + convert.byte[0] = *(p + 3); 180 + convert.byte[1] = *(p + 2); 181 + convert.byte[2] = *(p + 1); 182 + convert.byte[3] = *(p + 0); 183 + } 184 + else 185 + { 186 + /* Little Endian data */ 187 + convert.byte[0] = *(p + 0); 188 + convert.byte[1] = *(p + 1); 189 + convert.byte[2] = *(p + 2); 190 + convert.byte[3] = *(p + 3); 191 + } 192 + } 193 + else 194 + { 195 + /* Big Endian architecture [e.g. PPC] */ 196 + if (!little_endian) 197 + { 198 + /* Big Endian data */ 199 + convert.byte[0] = *(p + 0); 200 + convert.byte[1] = *(p + 1); 201 + convert.byte[2] = *(p + 2); 202 + convert.byte[3] = *(p + 3); 203 + } 204 + else 205 + { 206 + /* Little Endian data */ 207 + convert.byte[0] = *(p + 3); 208 + convert.byte[1] = *(p + 2); 209 + convert.byte[2] = *(p + 1); 210 + convert.byte[3] = *(p + 0); 211 + } 212 + } 213 + return convert.int_value; 214 +} 215 + 216 +GGRAPH_PRIVATE unsigned int 217 +gg_import_uint32 (const unsigned char *p, int little_endian, 218 + int little_endian_arch) 219 +{ 220 +/* fetches an unsigned 32bit int from BLOB respecting declared endiannes */ 221 + union cvt 222 + { 223 + unsigned char byte[4]; 224 + unsigned int int_value; 225 + } convert; 226 + if (little_endian_arch) 227 + { 228 + /* Litte-Endian architecture [e.g. x86] */ 229 + if (!little_endian) 230 + { 231 + /* Big Endian data */ 232 + convert.byte[0] = *(p + 3); 233 + convert.byte[1] = *(p + 2); 234 + convert.byte[2] = *(p + 1); 235 + convert.byte[3] = *(p + 0); 236 + } 237 + else 238 + { 239 + /* Little Endian data */ 240 + convert.byte[0] = *(p + 0); 241 + convert.byte[1] = *(p + 1); 242 + convert.byte[2] = *(p + 2); 243 + convert.byte[3] = *(p + 3); 244 + } 245 + } 246 + else 247 + { 248 + /* Big Endian architecture [e.g. PPC] */ 249 + if (!little_endian) 250 + { 251 + /* Big Endian data */ 252 + convert.byte[0] = *(p + 0); 253 + convert.byte[1] = *(p + 1); 254 + convert.byte[2] = *(p + 2); 255 + convert.byte[3] = *(p + 3); 256 + } 257 + else 258 + { 259 + /* Little Endian data */ 260 + convert.byte[0] = *(p + 3); 261 + convert.byte[1] = *(p + 2); 262 + convert.byte[2] = *(p + 1); 263 + convert.byte[3] = *(p + 0); 264 + } 265 + } 266 + return convert.int_value; 267 +} 268 + 269 +GGRAPH_PRIVATE float 270 +gg_import_float (const unsigned char *p, int little_endian, 271 + int little_endian_arch) 272 +{ 273 +/* fetches a 32bit float from BLOB respecting declared endiannes */ 274 + union cvt 275 + { 276 + unsigned char byte[4]; 277 + float flt_value; 278 + } convert; 279 + if (little_endian_arch) 280 + { 281 + /* Litte-Endian architecture [e.g. x86] */ 282 + if (!little_endian) 283 + { 284 + /* Big Endian data */ 285 + convert.byte[0] = *(p + 3); 286 + convert.byte[1] = *(p + 2); 287 + convert.byte[2] = *(p + 1); 288 + convert.byte[3] = *(p + 0); 289 + } 290 + else 291 + { 292 + /* Little Endian data */ 293 + convert.byte[0] = *(p + 0); 294 + convert.byte[1] = *(p + 1); 295 + convert.byte[2] = *(p + 2); 296 + convert.byte[3] = *(p + 3); 297 + } 298 + } 299 + else 300 + { 301 + /* Big Endian architecture [e.g. PPC] */ 302 + if (!little_endian) 303 + { 304 + /* Big Endian data */ 305 + convert.byte[0] = *(p + 0); 306 + convert.byte[1] = *(p + 1); 307 + convert.byte[2] = *(p + 2); 308 + convert.byte[3] = *(p + 3); 309 + } 310 + else 311 + { 312 + /* Little Endian data */ 313 + convert.byte[0] = *(p + 3); 314 + convert.byte[1] = *(p + 2); 315 + convert.byte[2] = *(p + 1); 316 + convert.byte[3] = *(p + 0); 317 + } 318 + } 319 + return convert.flt_value; 320 +} 321 + 322 +GGRAPH_PRIVATE double 323 +gg_import_double (const unsigned char *p, int little_endian, 324 + int little_endian_arch) 325 +{ 326 +/* fetches a 64bit double from BLOB respecting declared endiannes */ 327 + union cvt 328 + { 329 + unsigned char byte[8]; 330 + double double_value; 331 + } convert; 332 + if (little_endian_arch) 333 + { 334 +/* Litte-Endian architecture [e.g. x86] */ 335 + if (!little_endian) 336 + { 337 + /* Big Endian data */ 338 + convert.byte[0] = *(p + 7); 339 + convert.byte[1] = *(p + 6); 340 + convert.byte[2] = *(p + 5); 341 + convert.byte[3] = *(p + 4); 342 + convert.byte[4] = *(p + 3); 343 + convert.byte[5] = *(p + 2); 344 + convert.byte[6] = *(p + 1); 345 + convert.byte[7] = *(p + 0); 346 + } 347 + else 348 + { 349 + /* Little Endian data */ 350 + convert.byte[0] = *(p + 0); 351 + convert.byte[1] = *(p + 1); 352 + convert.byte[2] = *(p + 2); 353 + convert.byte[3] = *(p + 3); 354 + convert.byte[4] = *(p + 4); 355 + convert.byte[5] = *(p + 5); 356 + convert.byte[6] = *(p + 6); 357 + convert.byte[7] = *(p + 7); 358 + } 359 + } 360 + else 361 + { 362 + /* Big Endian architecture [e.g. PPC] */ 363 + if (!little_endian) 364 + { 365 + /* Big Endian data */ 366 + convert.byte[0] = *(p + 0); 367 + convert.byte[1] = *(p + 1); 368 + convert.byte[2] = *(p + 2); 369 + convert.byte[3] = *(p + 3); 370 + convert.byte[4] = *(p + 4); 371 + convert.byte[5] = *(p + 5); 372 + convert.byte[6] = *(p + 6); 373 + convert.byte[7] = *(p + 7); 374 + } 375 + else 376 + { 377 + /* Little Endian data */ 378 + convert.byte[0] = *(p + 7); 379 + convert.byte[1] = *(p + 6); 380 + convert.byte[2] = *(p + 5); 381 + convert.byte[3] = *(p + 4); 382 + convert.byte[4] = *(p + 3); 383 + convert.byte[5] = *(p + 2); 384 + convert.byte[6] = *(p + 1); 385 + convert.byte[7] = *(p + 0); 386 + } 387 + } 388 + return convert.double_value; 389 +} 390 + 391 +GGRAPH_PRIVATE void 392 +gg_export_int16 (short value, unsigned char *p, int little_endian, 393 + int little_endian_arch) 394 +{ 395 +/* stores a signed 16bit int into a BLOB respecting declared endiannes */ 396 + union cvt 397 + { 398 + unsigned char byte[2]; 399 + short short_value; 400 + } convert; 401 + convert.short_value = value; 402 + if (little_endian_arch) 403 + { 404 + /* Litte-Endian architecture [e.g. x86] */ 405 + if (!little_endian) 406 + { 407 + /* Big Endian data */ 408 + *(p + 1) = convert.byte[0]; 409 + *(p + 0) = convert.byte[1]; 410 + } 411 + else 412 + { 413 + /* Little Endian data */ 414 + *(p + 0) = convert.byte[0]; 415 + *(p + 1) = convert.byte[1]; 416 + } 417 + } 418 + else 419 + { 420 + /* Big Endian architecture [e.g. PPC] */ 421 + if (!little_endian) 422 + { 423 + /* Big Endian data */ 424 + *(p + 0) = convert.byte[0]; 425 + *(p + 1) = convert.byte[1]; 426 + } 427 + else 428 + { 429 + /* Little Endian data */ 430 + *(p + 1) = convert.byte[0]; 431 + *(p + 0) = convert.byte[1]; 432 + } 433 + } 434 +} 435 + 436 +GGRAPH_PRIVATE void 437 +gg_export_uint16 (unsigned short value, unsigned char *p, int little_endian, 438 + int little_endian_arch) 439 +{ 440 +/* stores an unsigned 16bit int into a BLOB respecting declared endiannes */ 441 + union cvt 442 + { 443 + unsigned char byte[2]; 444 + unsigned short ushort_value; 445 + } convert; 446 + convert.ushort_value = value; 447 + if (little_endian_arch) 448 + { 449 + /* Litte-Endian architecture [e.g. x86] */ 450 + if (!little_endian) 451 + { 452 + /* Big Endian data */ 453 + *(p + 1) = convert.byte[0]; 454 + *(p + 0) = convert.byte[1]; 455 + } 456 + else 457 + { 458 + /* Little Endian data */ 459 + *(p + 0) = convert.byte[0]; 460 + *(p + 1) = convert.byte[1]; 461 + } 462 + } 463 + else 464 + { 465 + /* Big Endian architecture [e.g. PPC] */ 466 + if (!little_endian) 467 + { 468 + /* Big Endian data */ 469 + *(p + 0) = convert.byte[0]; 470 + *(p + 1) = convert.byte[1]; 471 + } 472 + else 473 + { 474 + /* Little Endian data */ 475 + *(p + 1) = convert.byte[0]; 476 + *(p + 0) = convert.byte[1]; 477 + } 478 + } 479 +} 480 + 481 +GGRAPH_PRIVATE void 482 +gg_export_int32 (int value, unsigned char *p, int little_endian, 483 + int little_endian_arch) 484 +{ 485 +/* stores a signed 32bit int into a BLOB respecting declared endiannes */ 486 + union cvt 487 + { 488 + unsigned char byte[4]; 489 + int int_value; 490 + } convert; 491 + convert.int_value = value; 492 + if (little_endian_arch) 493 + { 494 + /* Litte-Endian architecture [e.g. x86] */ 495 + if (!little_endian) 496 + { 497 + /* Big Endian data */ 498 + *(p + 3) = convert.byte[0]; 499 + *(p + 2) = convert.byte[1]; 500 + *(p + 1) = convert.byte[2]; 501 + *(p + 0) = convert.byte[3]; 502 + } 503 + else 504 + { 505 + /* Little Endian data */ 506 + *(p + 0) = convert.byte[0]; 507 + *(p + 1) = convert.byte[1]; 508 + *(p + 2) = convert.byte[2]; 509 + *(p + 3) = convert.byte[3]; 510 + } 511 + } 512 + else 513 + { 514 + /* Big Endian architecture [e.g. PPC] */ 515 + if (!little_endian) 516 + { 517 + /* Big Endian data */ 518 + *(p + 0) = convert.byte[0]; 519 + *(p + 1) = convert.byte[1]; 520 + *(p + 2) = convert.byte[2]; 521 + *(p + 3) = convert.byte[3]; 522 + } 523 + else 524 + { 525 + /* Little Endian data */ 526 + *(p + 3) = convert.byte[0]; 527 + *(p + 2) = convert.byte[1]; 528 + *(p + 1) = convert.byte[2]; 529 + *(p + 0) = convert.byte[3]; 530 + } 531 + } 532 +} 533 + 534 +GGRAPH_PRIVATE void 535 +gg_export_uint32 (unsigned int value, unsigned char *p, int little_endian, 536 + int little_endian_arch) 537 +{ 538 +/* stores an unsigned 32bit int into a BLOB respecting declared endiannes */ 539 + union cvt 540 + { 541 + unsigned char byte[4]; 542 + unsigned int uint_value; 543 + } convert; 544 + convert.uint_value = value; 545 + if (little_endian_arch) 546 + { 547 + /* Litte-Endian architecture [e.g. x86] */ 548 + if (!little_endian) 549 + { 550 + /* Big Endian data */ 551 + *(p + 3) = convert.byte[0]; 552 + *(p + 2) = convert.byte[1]; 553 + *(p + 1) = convert.byte[2]; 554 + *(p + 0) = convert.byte[3]; 555 + } 556 + else 557 + { 558 + /* Little Endian data */ 559 + *(p + 0) = convert.byte[0]; 560 + *(p + 1) = convert.byte[1]; 561 + *(p + 2) = convert.byte[2]; 562 + *(p + 3) = convert.byte[3]; 563 + } 564 + } 565 + else 566 + { 567 + /* Big Endian architecture [e.g. PPC] */ 568 + if (!little_endian) 569 + { 570 + /* Big Endian data */ 571 + *(p + 0) = convert.byte[0]; 572 + *(p + 1) = convert.byte[1]; 573 + *(p + 2) = convert.byte[2]; 574 + *(p + 3) = convert.byte[3]; 575 + } 576 + else 577 + { 578 + /* Little Endian data */ 579 + *(p + 3) = convert.byte[0]; 580 + *(p + 2) = convert.byte[1]; 581 + *(p + 1) = convert.byte[2]; 582 + *(p + 0) = convert.byte[3]; 583 + } 584 + } 585 +} 586 + 587 +GGRAPH_PRIVATE void 588 +gg_export_float (float value, unsigned char *p, int little_endian, 589 + int little_endian_arch) 590 +{ 591 +/* stores a Float into a BLOB respecting declared endiannes */ 592 + union cvt 593 + { 594 + unsigned char byte[4]; 595 + float flt_value; 596 + } convert; 597 + convert.flt_value = value; 598 + if (little_endian_arch) 599 + { 600 + /* Litte-Endian architecture [e.g. x86] */ 601 + if (!little_endian) 602 + { 603 + /* Big Endian data */ 604 + *(p + 3) = convert.byte[0]; 605 + *(p + 2) = convert.byte[1]; 606 + *(p + 1) = convert.byte[2]; 607 + *(p + 0) = convert.byte[3]; 608 + } 609 + else 610 + { 611 + /* Little Endian data */ 612 + *(p + 0) = convert.byte[0]; 613 + *(p + 1) = convert.byte[1]; 614 + *(p + 2) = convert.byte[2]; 615 + *(p + 3) = convert.byte[3]; 616 + } 617 + } 618 + else 619 + { 620 + /* Big Endian architecture [e.g. PPC] */ 621 + if (!little_endian) 622 + { 623 + /* Big Endian data */ 624 + *(p + 0) = convert.byte[0]; 625 + *(p + 1) = convert.byte[1]; 626 + *(p + 2) = convert.byte[2]; 627 + *(p + 3) = convert.byte[3]; 628 + } 629 + else 630 + { 631 + /* Little Endian data */ 632 + *(p + 3) = convert.byte[0]; 633 + *(p + 2) = convert.byte[1]; 634 + *(p + 1) = convert.byte[2]; 635 + *(p + 0) = convert.byte[3]; 636 + } 637 + } 638 +} 639 + 640 +GGRAPH_PRIVATE void 641 +gg_export_double (double value, unsigned char *p, int little_endian, 642 + int little_endian_arch) 643 +{ 644 +/* stores a Double into a BLOB respecting declared endiannes */ 645 + union cvt 646 + { 647 + unsigned char byte[8]; 648 + double dbl_value; 649 + } convert; 650 + convert.dbl_value = value; 651 + if (little_endian_arch) 652 + { 653 + /* Litte-Endian architecture [e.g. x86] */ 654 + if (!little_endian) 655 + { 656 + /* Big Endian data */ 657 + *(p + 7) = convert.byte[0]; 658 + *(p + 6) = convert.byte[1]; 659 + *(p + 5) = convert.byte[2]; 660 + *(p + 4) = convert.byte[3]; 661 + *(p + 3) = convert.byte[4]; 662 + *(p + 2) = convert.byte[5]; 663 + *(p + 1) = convert.byte[6]; 664 + *(p + 0) = convert.byte[7]; 665 + } 666 + else 667 + { 668 + /* Little Endian data */ 669 + *(p + 0) = convert.byte[0]; 670 + *(p + 1) = convert.byte[1]; 671 + *(p + 2) = convert.byte[2]; 672 + *(p + 3) = convert.byte[3]; 673 + *(p + 4) = convert.byte[4]; 674 + *(p + 5) = convert.byte[5]; 675 + *(p + 6) = convert.byte[6]; 676 + *(p + 7) = convert.byte[7]; 677 + } 678 + } 679 + else 680 + { 681 + /* Big Endian architecture [e.g. PPC] */ 682 + if (!little_endian) 683 + { 684 + /* Big Endian data */ 685 + *(p + 0) = convert.byte[0]; 686 + *(p + 1) = convert.byte[1]; 687 + *(p + 2) = convert.byte[2]; 688 + *(p + 3) = convert.byte[3]; 689 + *(p + 4) = convert.byte[4]; 690 + *(p + 5) = convert.byte[5]; 691 + *(p + 6) = convert.byte[6]; 692 + *(p + 7) = convert.byte[7]; 693 + } 694 + else 695 + { 696 + /* Little Endian data */ 697 + *(p + 7) = convert.byte[0]; 698 + *(p + 6) = convert.byte[1]; 699 + *(p + 5) = convert.byte[2]; 700 + *(p + 4) = convert.byte[3]; 701 + *(p + 3) = convert.byte[4]; 702 + *(p + 2) = convert.byte[5]; 703 + *(p + 1) = convert.byte[6]; 704 + *(p + 0) = convert.byte[7]; 705 + } 706 + } 707 +} 708 + 709 +/* 710 +/ 711 +/ DISCLAIMER: 712 +/ all the following code merely is an 'ad hoc' adaption 713 +/ deriving from the original GD lib code 714 +/ 715 +*/ 716 + 717 +static int 718 +xgdReallocMemory (dynamicPtr * dp, int required) 719 +{ 720 + void *newPtr; 721 + if ((newPtr = realloc (dp->data, required))) 722 + { 723 + dp->realSize = required; 724 + dp->data = newPtr; 725 + return TRUE; 726 + } 727 + newPtr = malloc (required); 728 + if (!newPtr) 729 + { 730 + dp->dataGood = FALSE; 731 + return FALSE; 732 + } 733 + memcpy (newPtr, dp->data, dp->logicalSize); 734 + free (dp->data); 735 + dp->data = newPtr; 736 + dp->realSize = required; 737 + return TRUE; 738 +} 739 + 740 +static void 741 +xgdFreeMemoryCtx (struct xgdIOCtx *ctx) 742 +{ 743 + dynamicPtr *dp; 744 + dpIOCtx *dctx; 745 + dctx = (dpIOCtx *) ctx; 746 + dp = dctx->dp; 747 + free (ctx); 748 + if ((dp->data != NULL) && (dp->freeOK)) 749 + { 750 + free (dp->data); 751 + dp->data = NULL; 752 + } 753 + dp->realSize = 0; 754 + dp->logicalSize = 0; 755 + free (dp); 756 +} 757 + 758 +static void 759 +xgdFreeFileCtx (struct xgdIOCtx *ctx) 760 +{ 761 + dynamicPtr *dp; 762 + dpIOCtx *dctx; 763 + dctx = (dpIOCtx *) ctx; 764 + dp = dctx->dp; 765 + free (ctx); 766 + free (dp); 767 +} 768 + 769 +static int 770 +allocMemory (dynamicPtr * dp, int initialSize, const void *data) 771 +{ 772 + if (data == NULL) 773 + { 774 + dp->logicalSize = 0; 775 + dp->dataGood = FALSE; 776 + dp->data = malloc (initialSize); 777 + } 778 + else 779 + { 780 + dp->logicalSize = initialSize; 781 + dp->dataGood = TRUE; 782 + dp->data = (void *) data; 783 + } 784 + if (dp->data != NULL) 785 + { 786 + dp->realSize = initialSize; 787 + dp->dataGood = TRUE; 788 + dp->pos = 0; 789 + return TRUE; 790 + } 791 + else 792 + { 793 + dp->realSize = 0; 794 + return FALSE; 795 + } 796 +} 797 + 798 +static int 799 +appendMemory (dynamicPtr * dp, const void *src, int size) 800 +{ 801 + int bytesNeeded; 802 + char *tmp; 803 + if (!dp->dataGood) 804 + return FALSE; 805 + bytesNeeded = dp->pos + size; 806 + if (bytesNeeded > dp->realSize) 807 + { 808 + if (!dp->freeOK) 809 + return FALSE; 810 + if (overflow2 (dp->realSize, 2)) 811 + return FALSE; 812 + if (!xgdReallocMemory (dp, bytesNeeded * 2)) 813 + { 814 + dp->dataGood = FALSE; 815 + return FALSE; 816 + } 817 + } 818 + tmp = (char *) dp->data; 819 + memcpy ((void *) (tmp + (dp->pos)), src, size); 820 + dp->pos += size; 821 + if (dp->pos > dp->logicalSize) 822 + dp->logicalSize = dp->pos; 823 + return TRUE; 824 +} 825 + 826 +static int 827 +appendFile (dynamicPtr * dp, const void *src, int size) 828 +{ 829 + size_t wr = fwrite (src, 1, size, dp->file); 830 + return (int) wr; 831 +} 832 + 833 +static int 834 +memoryPutbuf (struct xgdIOCtx *ctx, const void *buf, int size) 835 +{ 836 + dpIOCtx *dctx; 837 + dctx = (dpIOCtx *) ctx; 838 + appendMemory (dctx->dp, buf, size); 839 + if (dctx->dp->dataGood) 840 + return size; 841 + else 842 + return -1; 843 +} 844 + 845 +static int 846 +filePutbuf (struct xgdIOCtx *ctx, const void *buf, int size) 847 +{ 848 + dpIOCtx *dctx; 849 + dctx = (dpIOCtx *) ctx; 850 + if (appendFile (dctx->dp, buf, size) == size) 851 + return size; 852 + else 853 + return -1; 854 +} 855 + 856 +static void 857 +memoryPutchar (struct xgdIOCtx *ctx, int a) 858 +{ 859 + unsigned char b; 860 + dpIOCtxPtr dctx; 861 + b = a; 862 + dctx = (dpIOCtxPtr) ctx; 863 + appendMemory (dctx->dp, &b, 1); 864 +} 865 + 866 +static void 867 +filePutchar (struct xgdIOCtx *ctx, int a) 868 +{ 869 + unsigned char b; 870 + dpIOCtxPtr dctx; 871 + b = a; 872 + dctx = (dpIOCtxPtr) ctx; 873 + appendFile (dctx->dp, &b, 1); 874 +} 875 + 876 +static int 877 +memoryGetbuf (xgdIOCtxPtr ctx, void *buf, int len) 878 +{ 879 + int rlen, remain; 880 + dpIOCtxPtr dctx; 881 + dynamicPtr *dp; 882 + dctx = (dpIOCtxPtr) ctx; 883 + dp = dctx->dp; 884 + remain = dp->logicalSize - dp->pos; 885 + if (remain >= len) 886 + rlen = len; 887 + else 888 + { 889 + if (remain == 0) 890 + return 0; 891 + rlen = remain; 892 + } 893 + memcpy (buf, (void *) ((char *) dp->data + dp->pos), rlen); 894 + dp->pos += rlen; 895 + return rlen; 896 +} 897 + 898 +static int 899 +fileGetbuf (xgdIOCtxPtr ctx, void *buf, int len) 900 +{ 901 + dynamicPtr *dp; 902 + dpIOCtxPtr dctx; 903 + dctx = (dpIOCtxPtr) ctx; 904 + dp = dctx->dp; 905 + return fread (buf, 1, len, dp->file); 906 +} 907 + 908 +static int 909 +memoryGetchar (xgdIOCtxPtr ctx) 910 +{ 911 + unsigned char b; 912 + int rv; 913 + rv = memoryGetbuf (ctx, &b, 1); 914 + if (rv != 1) 915 + return EOF; 916 + else 917 + return b; 918 +} 919 + 920 +static int 921 +fileGetchar (xgdIOCtxPtr ctx) 922 +{ 923 + unsigned char b; 924 + int rv; 925 + rv = fileGetbuf (ctx, &b, 1); 926 + if (rv != 1) 927 + return EOF; 928 + else 929 + return b; 930 +} 931 + 932 +static long 933 +memoryTell (struct xgdIOCtx *ctx) 934 +{ 935 + dpIOCtx *dctx; 936 + dctx = (dpIOCtx *) ctx; 937 + return (dctx->dp->pos); 938 +} 939 + 940 +static long 941 +fileTell (struct xgdIOCtx *ctx) 942 +{ 943 + dynamicPtr *dp; 944 + dpIOCtx *dctx; 945 + dctx = (dpIOCtx *) ctx; 946 + dp = dctx->dp; 947 + return ftell (dp->file); 948 +} 949 + 950 +static int 951 +memorySeek (struct xgdIOCtx *ctx, const int pos) 952 +{ 953 + int bytesNeeded; 954 + dynamicPtr *dp; 955 + dpIOCtx *dctx; 956 + dctx = (dpIOCtx *) ctx; 957 + dp = dctx->dp; 958 + if (!dp->dataGood) 959 + return FALSE; 960 + bytesNeeded = pos; 961 + if (bytesNeeded > dp->realSize) 962 + { 963 + if (!dp->freeOK) 964 + return FALSE; 965 + if (overflow2 (dp->realSize, 2)) 966 + return FALSE; 967 + if (!xgdReallocMemory (dp, dp->realSize * 2)) 968 + { 969 + dp->dataGood = FALSE; 970 + return FALSE; 971 + } 972 + } 973 + if (pos > dp->logicalSize) 974 + dp->logicalSize = pos; 975 + dp->pos = pos; 976 + return TRUE; 977 +} 978 + 979 +static int 980 +fileSeek (struct xgdIOCtx *ctx, const int pos) 981 +{ 982 + dynamicPtr *dp; 983 + dpIOCtx *dctx; 984 + dctx = (dpIOCtx *) ctx; 985 + dp = dctx->dp; 986 + if (fseek (dp->file, pos, SEEK_SET) < 0) 987 + return FALSE; 988 + else 989 + return TRUE; 990 +} 991 + 992 +static dynamicPtr * 993 +newMemory (int initialSize, const void *data, int freeOKFlag) 994 +{ 995 + dynamicPtr *dp; 996 + dp = malloc (sizeof (dynamicPtr)); 997 + if (dp == NULL) 998 + return NULL; 999 + if (!allocMemory (dp, initialSize, data)) 1000 + return NULL; 1001 + dp->pos = 0; 1002 + if (freeOKFlag == XGD_CTX_FREE) 1003 + dp->freeOK = 1; 1004 + else 1005 + dp->freeOK = 0; 1006 + return dp; 1007 +} 1008 + 1009 +static dynamicPtr * 1010 +newFile (const void *data) 1011 +{ 1012 + dynamicPtr *dp; 1013 + dp = malloc (sizeof (dynamicPtr)); 1014 + if (dp == NULL) 1015 + return NULL; 1016 + dp->file = (FILE *) data; 1017 + return dp; 1018 +} 1019 + 1020 +static int 1021 +trimMemory (dynamicPtr * dp) 1022 +{ 1023 + if (!dp->freeOK) 1024 + return TRUE; 1025 + return xgdReallocMemory (dp, dp->logicalSize); 1026 +} 1027 + 1028 +GGRAPH_PRIVATE int 1029 +overflow2 (int a, int b) 1030 +{ 1031 + if (a < 0 || b < 0) 1032 + { 1033 + fprintf (stderr, 1034 + "warning: one parameter to a memory allocation multiplication is negative, failing operation gracefully\n"); 1035 + return 1; 1036 + } 1037 + if (b == 0) 1038 + return 0; 1039 + if (a > INT_MAX / b) 1040 + { 1041 + fprintf (stderr, 1042 + "warning: product of memory allocation multiplication would exceed INT_MAX, failing operation gracefully\n"); 1043 + return 1; 1044 + } 1045 + return 0; 1046 +} 1047 + 1048 +GGRAPH_PRIVATE void * 1049 +xgdDPExtractData (struct xgdIOCtx *ctx, int *size) 1050 +{ 1051 + dynamicPtr *dp; 1052 + dpIOCtx *dctx; 1053 + void *data; 1054 + dctx = (dpIOCtx *) ctx; 1055 + dp = dctx->dp; 1056 + if (dp->dataGood) 1057 + { 1058 + trimMemory (dp); 1059 + *size = dp->logicalSize; 1060 + data = dp->data; 1061 + } 1062 + else 1063 + { 1064 + *size = 0; 1065 + data = NULL; 1066 + if ((dp->data != NULL) && (dp->freeOK)) 1067 + free (dp->data); 1068 + } 1069 + dp->data = NULL; 1070 + dp->realSize = 0; 1071 + dp->logicalSize = 0; 1072 + return data; 1073 +} 1074 + 1075 +GGRAPH_PRIVATE xgdIOCtx * 1076 +xgdNewDynamicCtx (int initialSize, const void *data, int mem_or_file) 1077 +{ 1078 + return xgdNewDynamicCtxEx (initialSize, data, XGD_CTX_FREE, mem_or_file); 1079 +} 1080 + 1081 +GGRAPH_PRIVATE xgdIOCtx * 1082 +xgdNewDynamicCtxEx (int initialSize, const void *data, int freeOKFlag, 1083 + int mem_or_file) 1084 +{ 1085 + dpIOCtx *ctx; 1086 + dynamicPtr *dp; 1087 + ctx = malloc (sizeof (dpIOCtx)); 1088 + if (ctx == NULL) 1089 + { 1090 + return NULL; 1091 + } 1092 + if (mem_or_file == GG_TARGET_IS_FILE) 1093 + { 1094 + dp = newFile (data); 1095 + if (!dp) 1096 + { 1097 + free (ctx); 1098 + return NULL; 1099 + }; 1100 + ctx->dp = dp; 1101 + ctx->ctx.getC = fileGetchar; 1102 + ctx->ctx.putC = filePutchar; 1103 + ctx->ctx.getBuf = fileGetbuf; 1104 + ctx->ctx.putBuf = filePutbuf; 1105 + ctx->ctx.seek = fileSeek; 1106 + ctx->ctx.tell = fileTell; 1107 + ctx->ctx.xgd_free = xgdFreeFileCtx; 1108 + } 1109 + else 1110 + { 1111 + dp = newMemory (initialSize, data, freeOKFlag); 1112 + if (!dp) 1113 + { 1114 + free (ctx); 1115 + return NULL; 1116 + }; 1117 + ctx->dp = dp; 1118 + ctx->ctx.getC = memoryGetchar; 1119 + ctx->ctx.putC = memoryPutchar; 1120 + ctx->ctx.getBuf = memoryGetbuf; 1121 + ctx->ctx.putBuf = memoryPutbuf; 1122 + ctx->ctx.seek = memorySeek; 1123 + ctx->ctx.tell = memoryTell; 1124 + ctx->ctx.xgd_free = xgdFreeMemoryCtx; 1125 + } 1126 + return (xgdIOCtx *) ctx; 1127 +} 1128 + 1129 +GGRAPH_PRIVATE int 1130 +xgdPutBuf (const void *buf, int size, xgdIOCtx * ctx) 1131 +{ 1132 + return (ctx->putBuf) (ctx, buf, size); 1133 +} 1134 + 1135 +GGRAPH_PRIVATE int 1136 +xgdGetBuf (void *buf, int size, xgdIOCtx * ctx) 1137 +{ 1138 + return (ctx->getBuf) (ctx, buf, size); 1139 +}
Added src/gaiagraphics_jpeg.c.
1 +/* 2 +/ gaiagraphics_jpeg.c 3 +/ 4 +/ JPEG auxiliary helpers 5 +/ 6 +/ version 1.0, 2010 July 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2010 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdio.h> 28 +#include <stdlib.h> 29 +#include <setjmp.h> 30 +#include <limits.h> 31 +#include <string.h> 32 + 33 +#include <jpeglib.h> 34 +#include <jerror.h> 35 + 36 +#include "gaiagraphics.h" 37 +#include "gaiagraphics_internals.h" 38 + 39 +struct jpeg_codec_data 40 +{ 41 +/* a struct used by JPEG codec */ 42 + int is_writer; 43 + struct jpeg_compress_struct cmp_cinfo; 44 + struct jpeg_decompress_struct dec_cinfo; 45 + JSAMPROW row; 46 + xgdIOCtx *io_ctx; 47 +}; 48 + 49 +/* 50 +/ 51 +/ DISCLAIMER: 52 +/ the following code is vaguely derived from the original GD lib 53 +/ code, which was originally released under a BSD-like license 54 +/ 55 +*/ 56 + 57 +#define OUTPUT_BUF_SIZE 4096 58 + 59 +#ifdef HAVE_BOOLEAN 60 +typedef boolean safeboolean; 61 +#else 62 +typedef int safeboolean; 63 +#endif /* HAVE_BOOLEAN */ 64 + 65 +typedef struct _jmpbuf_wrapper 66 +{ 67 + jmp_buf jmpbuf; 68 +} 69 +jmpbuf_wrapper; 70 + 71 +typedef struct 72 +{ 73 + struct jpeg_destination_mgr pub; 74 + xgdIOCtx *outfile; 75 + unsigned char *buffer; 76 +} 77 +my_destination_mgr; 78 + 79 +typedef struct 80 +{ 81 + struct jpeg_source_mgr pub; 82 + xgdIOCtx *infile; 83 + unsigned char *buffer; 84 + safeboolean start_of_file; 85 +} 86 +my_source_mgr; 87 + 88 +typedef my_source_mgr *my_src_ptr; 89 + 90 +#define INPUT_BUF_SIZE 4096 91 + 92 +typedef my_destination_mgr *my_dest_ptr; 93 + 94 +static void 95 +fatal_jpeg_error (j_common_ptr cinfo) 96 +{ 97 + jmpbuf_wrapper *jmpbufw; 98 + 99 + fprintf (stderr, 100 + "jpeg-wrapper: JPEG library reports unrecoverable error: "); 101 + (*cinfo->err->output_message) (cinfo); 102 + fflush (stderr); 103 + jmpbufw = (jmpbuf_wrapper *) cinfo->client_data; 104 + jpeg_destroy (cinfo); 105 + if (jmpbufw != 0) 106 + { 107 + longjmp (jmpbufw->jmpbuf, 1); 108 + fprintf (stderr, "jpeg-wrappeg: EXTREMELY fatal error: longjmp" 109 + " returned control; terminating\n"); 110 + } 111 + else 112 + { 113 + fprintf (stderr, "jpeg-wrappeg: EXTREMELY fatal error: jmpbuf" 114 + " unrecoverable; terminating\n"); 115 + } 116 + fflush (stderr); 117 + exit (99); 118 +} 119 + 120 +static void 121 +init_source (j_decompress_ptr cinfo) 122 +{ 123 + my_src_ptr src = (my_src_ptr) cinfo->src; 124 + src->start_of_file = TRUE; 125 +} 126 + 127 +#define END_JPEG_SEQUENCE "\r\n[*]--:END JPEG:--[*]\r\n" 128 +static safeboolean 129 +fill_input_buffer (j_decompress_ptr cinfo) 130 +{ 131 + my_src_ptr src = (my_src_ptr) cinfo->src; 132 + int nbytes = 0; 133 + memset (src->buffer, 0, INPUT_BUF_SIZE); 134 + while (nbytes < INPUT_BUF_SIZE) 135 + { 136 + int got = xgdGetBuf (src->buffer + nbytes, 137 + INPUT_BUF_SIZE - nbytes, 138 + src->infile); 139 + if ((got == EOF) || (got == 0)) 140 + { 141 + if (!nbytes) 142 + { 143 + nbytes = -1; 144 + } 145 + break; 146 + } 147 + nbytes += got; 148 + } 149 + if (nbytes <= 0) 150 + { 151 + if (src->start_of_file) 152 + ERREXIT (cinfo, JERR_INPUT_EMPTY); 153 + WARNMS (cinfo, JWRN_JPEG_EOF); 154 + src->buffer[0] = (unsigned char) 0xFF; 155 + src->buffer[1] = (unsigned char) JPEG_EOI; 156 + nbytes = 2; 157 + } 158 + src->pub.next_input_byte = (JOCTET *) (src->buffer); 159 + src->pub.bytes_in_buffer = nbytes; 160 + src->start_of_file = FALSE; 161 + return TRUE; 162 +} 163 + 164 +static void 165 +skip_input_data (j_decompress_ptr cinfo, long num_bytes) 166 +{ 167 + my_src_ptr src = (my_src_ptr) cinfo->src; 168 + if (num_bytes > 0) 169 + { 170 + while (num_bytes > (long) src->pub.bytes_in_buffer) 171 + { 172 + num_bytes -= (long) src->pub.bytes_in_buffer; 173 + (void) fill_input_buffer (cinfo); 174 + } 175 + src->pub.next_input_byte += (size_t) num_bytes; 176 + src->pub.bytes_in_buffer -= (size_t) num_bytes; 177 + } 178 +} 179 + 180 +static void 181 +term_source (j_decompress_ptr cinfo) 182 +{ 183 + if (cinfo) 184 + return; /* does absolutely nothing - required in order to suppress warnings */ 185 +} 186 + 187 +static void 188 +init_destination (j_compress_ptr cinfo) 189 +{ 190 + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; 191 + dest->buffer = (unsigned char *) 192 + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 193 + OUTPUT_BUF_SIZE * sizeof (unsigned char)); 194 + dest->pub.next_output_byte = (JOCTET *) (dest->buffer); 195 + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; 196 +} 197 + 198 +static safeboolean 199 +empty_output_buffer (j_compress_ptr cinfo) 200 +{ 201 + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; 202 + if (xgdPutBuf (dest->buffer, OUTPUT_BUF_SIZE, dest->outfile) != 203 + (size_t) OUTPUT_BUF_SIZE) 204 + ERREXIT (cinfo, JERR_FILE_WRITE); 205 + dest->pub.next_output_byte = (JOCTET *) (dest->buffer); 206 + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; 207 + return TRUE; 208 +} 209 + 210 +static void 211 +term_destination (j_compress_ptr cinfo) 212 +{ 213 + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; 214 + size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer; 215 + if (datacount > 0) 216 + { 217 + if (xgdPutBuf (dest->buffer, datacount, dest->outfile) != 218 + (int) datacount) 219 + ERREXIT (cinfo, JERR_FILE_WRITE); 220 + } 221 +} 222 + 223 +static void 224 +jpeg_xgdIOCtx_src (j_decompress_ptr cinfo, xgdIOCtx * infile) 225 +{ 226 + my_src_ptr src; 227 + if (cinfo->src == NULL) 228 + { 229 + cinfo->src = (struct jpeg_source_mgr *) 230 + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 231 + sizeof (my_source_mgr)); 232 + src = (my_src_ptr) cinfo->src; 233 + src->buffer = (unsigned char *) 234 + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 235 + INPUT_BUF_SIZE * 236 + sizeof (unsigned char)); 237 + 238 + } 239 + src = (my_src_ptr) cinfo->src; 240 + src->pub.init_source = init_source; 241 + src->pub.fill_input_buffer = fill_input_buffer; 242 + src->pub.skip_input_data = skip_input_data; 243 + src->pub.resync_to_restart = jpeg_resync_to_restart; 244 + src->pub.term_source = term_source; 245 + src->infile = infile; 246 + src->pub.bytes_in_buffer = 0; 247 + src->pub.next_input_byte = NULL; 248 +} 249 + 250 +static void 251 +jpeg_xgdIOCtx_dest (j_compress_ptr cinfo, xgdIOCtx * outfile) 252 +{ 253 + my_dest_ptr dest; 254 + if (cinfo->dest == NULL) 255 + { 256 + cinfo->dest = (struct jpeg_destination_mgr *) 257 + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 258 + sizeof (my_destination_mgr)); 259 + } 260 + dest = (my_dest_ptr) cinfo->dest; 261 + dest->pub.init_destination = init_destination; 262 + dest->pub.empty_output_buffer = empty_output_buffer; 263 + dest->pub.term_destination = term_destination; 264 + dest->outfile = outfile; 265 +} 266 + 267 +static int 268 +xgdImageJpegCtx (gGraphImagePtr img, xgdIOCtx * outfile, int quality) 269 +{ 270 +/* compressing a JPEG image */ 271 + struct jpeg_compress_struct cinfo; 272 + struct jpeg_error_mgr jerr; 273 + int i, j, jidx; 274 + volatile JSAMPROW row = 0; 275 + JSAMPROW rowptr[1]; 276 + jmpbuf_wrapper jmpbufw; 277 + JDIMENSION nlines; 278 + char comment[255]; 279 + memset (&cinfo, 0, sizeof (cinfo)); 280 + memset (&jerr, 0, sizeof (jerr)); 281 + cinfo.err = jpeg_std_error (&jerr); 282 + cinfo.client_data = &jmpbufw; 283 + if (setjmp (jmpbufw.jmpbuf) != 0) 284 + { 285 + if (row) 286 + free (row); 287 + return GGRAPH_JPEG_CODEC_ERROR; 288 + } 289 + cinfo.err->error_exit = fatal_jpeg_error; 290 + jpeg_create_compress (&cinfo); 291 + cinfo.image_width = img->width; 292 + cinfo.image_height = img->height; 293 + if (img->pixel_format == GG_PIXEL_GRAYSCALE) 294 + { 295 + /* GRAYSCALE */ 296 + cinfo.input_components = 1; 297 + cinfo.in_color_space = JCS_GRAYSCALE; 298 + } 299 + else 300 + { 301 + /* RGB */ 302 + cinfo.input_components = 3; 303 + cinfo.in_color_space = JCS_RGB; 304 + } 305 + jpeg_set_defaults (&cinfo); 306 + if (quality >= 0) 307 + jpeg_set_quality (&cinfo, quality, TRUE); 308 + jpeg_xgdIOCtx_dest (&cinfo, outfile); 309 + row = (JSAMPROW) calloc (1, cinfo.image_width * cinfo.input_components 310 + * sizeof (JSAMPLE)); 311 + if (row == 0) 312 + { 313 + jpeg_destroy_compress (&cinfo); 314 + return GGRAPH_INSUFFICIENT_MEMORY; 315 + } 316 + rowptr[0] = row; 317 + jpeg_start_compress (&cinfo, TRUE); 318 + sprintf (comment, "CREATOR: jpeg-wrapper (using IJG JPEG v%d),", 319 + JPEG_LIB_VERSION); 320 + if (quality >= 0) 321 + sprintf (comment + strlen (comment), " quality = %d\n", quality); 322 + else 323 + strcat (comment + strlen (comment), " default quality\n"); 324 + jpeg_write_marker (&cinfo, JPEG_COM, (unsigned char *) comment, 325 + (unsigned int) strlen (comment)); 326 +#if BITS_IN_JSAMPLE == 12 327 + fprintf (stderr, 328 + "jpeg-wrapper: error: jpeg library was compiled for 12-bit\n"); 329 + goto error; 330 +#endif /* BITS_IN_JSAMPLE == 12 */ 331 + for (i = 0; i < img->height; i++) 332 + { 333 + unsigned char *p_in = img->pixels + (i * img->scanline_width); 334 + for (jidx = 0, j = 0; j < img->width; j++) 335 + { 336 + if (img->pixel_format == GG_PIXEL_GRAYSCALE) 337 + { 338 + /* GRAYSCALE */ 339 + row[jidx++] = *p_in++; 340 + } 341 + else 342 + { 343 + /* RGB */ 344 + unsigned char r; 345 + unsigned char g; 346 + unsigned char b; 347 + if (img->pixel_format == GG_PIXEL_RGB) 348 + { 349 + r = *p_in++; 350 + g = *p_in++; 351 + b = *p_in++; 352 + } 353 + else if (img->pixel_format == GG_PIXEL_RGBA) 354 + { 355 + r = *p_in++; 356 + g = *p_in++; 357 + b = *p_in++; 358 + p_in++; /* skipping Alpha */ 359 + } 360 + else if (img->pixel_format == GG_PIXEL_ARGB) 361 + { 362 + p_in++; /* skipping Alpha */ 363 + r = *p_in++; 364 + g = *p_in++; 365 + b = *p_in++; 366 + } 367 + else if (img->pixel_format == GG_PIXEL_BGR) 368 + { 369 + b = *p_in++; 370 + g = *p_in++; 371 + r = *p_in++; 372 + } 373 + else if (img->pixel_format == GG_PIXEL_BGRA) 374 + { 375 + b = *p_in++; 376 + g = *p_in++; 377 + r = *p_in++; 378 + p_in++; /* skipping Alpha */ 379 + } 380 + else if (img->pixel_format == GG_PIXEL_PALETTE) 381 + { 382 + int index = *p_in++; 383 + r = img->palette_red[index]; 384 + g = img->palette_green[index]; 385 + b = img->palette_blue[index]; 386 + } 387 + row[jidx++] = r; 388 + row[jidx++] = g; 389 + row[jidx++] = b; 390 + } 391 + } 392 + nlines = jpeg_write_scanlines (&cinfo, rowptr, 1); 393 + if (nlines != 1) 394 + fprintf (stderr, "jpeg-wrapper: warning: jpeg_write_scanlines" 395 + " returns %u -- expected 1\n", nlines); 396 + } 397 + jpeg_finish_compress (&cinfo); 398 + jpeg_destroy_compress (&cinfo); 399 + free (row); 400 + return GGRAPH_OK; 401 +} 402 + 403 +GGRAPH_PRIVATE void 404 +gg_jpeg_codec_destroy (void *p) 405 +{ 406 +/* destroyng the JPEG codec data */ 407 + jmpbuf_wrapper jmpbufw; 408 + struct jpeg_codec_data *codec = (struct jpeg_codec_data *) p; 409 + 410 + if (!codec) 411 + return; 412 + 413 + if (codec->is_writer) 414 + { 415 + codec->cmp_cinfo.client_data = &jmpbufw; 416 + if (setjmp (jmpbufw.jmpbuf) != 0) 417 + { 418 + fprintf (stderr, "SetJump\n"); 419 + fflush (stderr); 420 + return; 421 + } 422 + jpeg_finish_compress (&(codec->cmp_cinfo)); 423 + jpeg_destroy_compress (&(codec->cmp_cinfo)); 424 + } 425 + else 426 + { 427 + codec->dec_cinfo.client_data = &jmpbufw; 428 + if (setjmp (jmpbufw.jmpbuf) != 0) 429 + { 430 + fprintf (stderr, "SetJump\n"); 431 + fflush (stderr); 432 + return; 433 + } 434 + jpeg_destroy_decompress (&(codec->dec_cinfo)); 435 + } 436 + free (codec->row); 437 + codec->io_ctx->xgd_free (codec->io_ctx); 438 + free (codec); 439 +} 440 + 441 +static int 442 +xgdStripImageJpegCtx (gGraphStripImagePtr img, xgdIOCtx * outfile, int quality) 443 +{ 444 +/* preparing to compress a JPEG image (by strip) */ 445 + struct jpeg_compress_struct cinfo; 446 + struct jpeg_error_mgr jerr; 447 + volatile JSAMPROW row = 0; 448 + jmpbuf_wrapper jmpbufw; 449 + char comment[255]; 450 + struct jpeg_codec_data *jpeg_codec; 451 + memset (&cinfo, 0, sizeof (cinfo)); 452 + memset (&jerr, 0, sizeof (jerr)); 453 + cinfo.err = jpeg_std_error (&jerr); 454 + cinfo.client_data = &jmpbufw; 455 + if (setjmp (jmpbufw.jmpbuf) != 0) 456 + { 457 + if (row) 458 + free (row); 459 + return GGRAPH_JPEG_CODEC_ERROR; 460 + } 461 + cinfo.err->error_exit = fatal_jpeg_error; 462 + jpeg_create_compress (&cinfo); 463 + cinfo.image_width = img->width; 464 + cinfo.image_height = img->height; 465 + if (img->pixel_format == GG_PIXEL_GRAYSCALE) 466 + { 467 + /* GRAYSCALE */ 468 + cinfo.input_components = 1; 469 + cinfo.in_color_space = JCS_GRAYSCALE; 470 + } 471 + else 472 + { 473 + /* RGB */ 474 + cinfo.input_components = 3; 475 + cinfo.in_color_space = JCS_RGB; 476 + } 477 + jpeg_set_defaults (&cinfo); 478 + if (quality >= 0) 479 + jpeg_set_quality (&cinfo, quality, TRUE); 480 + jpeg_xgdIOCtx_dest (&cinfo, outfile); 481 + row = (JSAMPROW) calloc (1, cinfo.image_width * cinfo.input_components 482 + * sizeof (JSAMPLE)); 483 + if (row == 0) 484 + { 485 + jpeg_destroy_compress (&cinfo); 486 + return GGRAPH_INSUFFICIENT_MEMORY; 487 + } 488 + jpeg_start_compress (&cinfo, TRUE); 489 + sprintf (comment, "CREATOR: jpeg-wrapper (using IJG JPEG v%d),", 490 + JPEG_LIB_VERSION); 491 + if (quality >= 0) 492 + sprintf (comment + strlen (comment), " quality = %d\n", quality); 493 + else 494 + strcat (comment + strlen (comment), " default quality\n"); 495 + jpeg_write_marker (&cinfo, JPEG_COM, (unsigned char *) comment, 496 + (unsigned int) strlen (comment)); 497 + 498 +/* setting up the JPEG codec struct */ 499 + jpeg_codec = malloc (sizeof (struct jpeg_codec_data)); 500 + if (!jpeg_codec) 501 + { 502 + jpeg_destroy_compress (&cinfo); 503 + free (row); 504 + gg_strip_image_destroy (img); 505 + return GGRAPH_INSUFFICIENT_MEMORY; 506 + } 507 + jpeg_codec->is_writer = 1; 508 + memcpy (&(jpeg_codec->cmp_cinfo), &cinfo, 509 + sizeof (struct jpeg_compress_struct)); 510 + jpeg_codec->row = row; 511 + jpeg_codec->io_ctx = outfile; 512 + img->codec_data = jpeg_codec; 513 + 514 + return GGRAPH_OK; 515 +} 516 + 517 +static int 518 +xgdStripImageJpegWriteCtx (gGraphStripImagePtr img) 519 +{ 520 +/* compressing a JPEG image (by strip) */ 521 + int i, j, jidx; 522 + int height; 523 + struct jpeg_codec_data *jpeg_codec = 524 + (struct jpeg_codec_data *) (img->codec_data); 525 + JSAMPROW rowptr[1]; 526 + JDIMENSION nlines; 527 + volatile JSAMPROW row = jpeg_codec->row; 528 + jmpbuf_wrapper jmpbufw; 529 + 530 + rowptr[0] = jpeg_codec->row; 531 + if (img->next_row >= img->height) 532 + { 533 + /* EOF condition */ 534 + fprintf (stderr, "png-wrapper error: attempting to write beyond EOF"); 535 + return GGRAPH_PNG_CODEC_ERROR; 536 + } 537 + height = img->current_available_rows; 538 + 539 + jpeg_codec->cmp_cinfo.client_data = &jmpbufw; 540 + if (setjmp (jmpbufw.jmpbuf) != 0) 541 + return GGRAPH_JPEG_CODEC_ERROR; 542 + for (i = 0; i < height; i++) 543 + { 544 + unsigned char *p_in = img->pixels + (i * img->scanline_width); 545 + for (jidx = 0, j = 0; j < img->width; j++) 546 + { 547 + if (img->pixel_format == GG_PIXEL_GRAYSCALE) 548 + { 549 + /* GRAYSCALE */ 550 + row[jidx++] = *p_in++; 551 + } 552 + else 553 + { 554 + /* RGB */ 555 + unsigned char r; 556 + unsigned char g; 557 + unsigned char b; 558 + if (img->pixel_format == GG_PIXEL_RGB) 559 + { 560 + r = *p_in++; 561 + g = *p_in++; 562 + b = *p_in++; 563 + } 564 + else if (img->pixel_format == GG_PIXEL_RGBA) 565 + { 566 + r = *p_in++; 567 + g = *p_in++; 568 + b = *p_in++; 569 + p_in++; /* skipping Alpha */ 570 + } 571 + else if (img->pixel_format == GG_PIXEL_ARGB) 572 + { 573 + p_in++; /* skipping Alpha */ 574 + r = *p_in++; 575 + g = *p_in++; 576 + b = *p_in++; 577 + } 578 + else if (img->pixel_format == GG_PIXEL_BGR) 579 + { 580 + b = *p_in++; 581 + g = *p_in++; 582 + r = *p_in++; 583 + } 584 + else if (img->pixel_format == GG_PIXEL_BGRA) 585 + { 586 + b = *p_in++; 587 + g = *p_in++; 588 + r = *p_in++; 589 + p_in++; /* skipping Alpha */ 590 + } 591 + else if (img->pixel_format == GG_PIXEL_PALETTE) 592 + { 593 + int index = *p_in++; 594 + r = img->palette_red[index]; 595 + g = img->palette_green[index]; 596 + b = img->palette_blue[index]; 597 + } 598 + row[jidx++] = r; 599 + row[jidx++] = g; 600 + row[jidx++] = b; 601 + } 602 + } 603 + nlines = jpeg_write_scanlines (&(jpeg_codec->cmp_cinfo), rowptr, 1); 604 + if (nlines != 1) 605 + fprintf (stderr, "jpeg-wrapper: warning: jpeg_write_scanlines" 606 + " returns %u -- expected 1\n", nlines); 607 + } 608 + img->next_row += height; 609 + return GGRAPH_OK; 610 +} 611 + 612 +static void 613 +CMYKToRGB (int c, int m, int y, int k, int inverted, unsigned char *red, 614 + unsigned char *green, unsigned char *blue) 615 +{ 616 + if (inverted) 617 + { 618 + c = 255 - c; 619 + m = 255 - m; 620 + y = 255 - y; 621 + k = 255 - k; 622 + } 623 + *red = (255 - c) * (255 - k) / 255; 624 + *green = (255 - m) * (255 - k) / 255; 625 + *blue = (255 - y) * (255 - k) / 255; 626 +} 627 + 628 +static gGraphImageInfosPtr 629 +xgdImageInspectJpegCtx (xgdIOCtx * infile, int *errcode) 630 +{ 631 + struct jpeg_decompress_struct cinfo; 632 + struct jpeg_error_mgr jerr; 633 + volatile gGraphImageInfosPtr infos = 0; 634 + int retval; 635 + jmpbuf_wrapper jmpbufw; 636 + memset (&cinfo, 0, sizeof (cinfo)); 637 + memset (&jerr, 0, sizeof (jerr)); 638 + cinfo.err = jpeg_std_error (&jerr); 639 + cinfo.client_data = &jmpbufw; 640 + if (setjmp (jmpbufw.jmpbuf) != 0) 641 + { 642 + if (infos) 643 + gg_image_infos_destroy (infos); 644 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 645 + return NULL; 646 + } 647 + cinfo.err->error_exit = fatal_jpeg_error; 648 + jpeg_create_decompress (&cinfo); 649 + jpeg_xgdIOCtx_src (&cinfo, infile); 650 + jpeg_save_markers (&cinfo, JPEG_APP0 + 14, 256); 651 + retval = jpeg_read_header (&cinfo, TRUE); 652 + if (retval != JPEG_HEADER_OK) 653 + fprintf (stderr, "jpeg-wrapper: warning: jpeg_read_header returns" 654 + " %d, expected %d\n", retval, JPEG_HEADER_OK); 655 + if (cinfo.image_height > INT_MAX) 656 + fprintf (stderr, 657 + "jpeg-wrapper: warning: JPEG image height (%u) is greater than INT_MAX\n", 658 + cinfo.image_height); 659 + if (cinfo.image_width > INT_MAX) 660 + fprintf (stderr, 661 + "jpeg-wrapper: warning: JPEG image width (%u) is greater than INT_MAX\n", 662 + cinfo.image_width); 663 + 664 + if ((cinfo.jpeg_color_space == JCS_CMYK) || 665 + (cinfo.jpeg_color_space == JCS_YCCK)) 666 + cinfo.out_color_space = JCS_CMYK; 667 + else if (cinfo.jpeg_color_space == JCS_GRAYSCALE) 668 + cinfo.out_color_space = JCS_GRAYSCALE; 669 + else 670 + cinfo.out_color_space = JCS_RGB; 671 + 672 + if (cinfo.out_color_space == JCS_GRAYSCALE) 673 + infos = 674 + gg_image_infos_create (GG_PIXEL_GRAYSCALE, (int) cinfo.image_width, 675 + (int) cinfo.image_height, 8, 1, 676 + GGRAPH_SAMPLE_UINT, NULL, NULL); 677 + else 678 + infos = 679 + gg_image_infos_create (GG_PIXEL_RGB, (int) cinfo.image_width, 680 + (int) cinfo.image_height, 8, 3, 681 + GGRAPH_SAMPLE_UINT, NULL, NULL); 682 + if (infos == NULL) 683 + { 684 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 685 + goto error; 686 + } 687 + infos->compression = GGRAPH_TIFF_COMPRESSION_JPEG; 688 + infos->scale_1_2 = 1; 689 + infos->scale_1_4 = 1; 690 + infos->scale_1_8 = 1; 691 + return infos; 692 + error: 693 + if (infos) 694 + gg_image_infos_destroy (infos); 695 + return NULL; 696 +} 697 + 698 +static gGraphImagePtr 699 +xgdImageCreateFromJpegCtx (xgdIOCtx * infile, int *errcode, int scale) 700 +{ 701 +/* decompressing a JPEG image */ 702 + struct jpeg_decompress_struct cinfo; 703 + struct jpeg_error_mgr jerr; 704 + jmpbuf_wrapper jmpbufw; 705 + volatile JSAMPROW row = 0; 706 + volatile gGraphImagePtr img = 0; 707 + JSAMPROW rowptr[1]; 708 + int i, j, retval; 709 + JDIMENSION nrows; 710 + int channels = 3; 711 + int inverted = 0; 712 + unsigned char red; 713 + unsigned char green; 714 + unsigned char blue; 715 + memset (&cinfo, 0, sizeof (cinfo)); 716 + memset (&jerr, 0, sizeof (jerr)); 717 + cinfo.err = jpeg_std_error (&jerr); 718 + cinfo.client_data = &jmpbufw; 719 + if (setjmp (jmpbufw.jmpbuf) != 0) 720 + { 721 + if (row) 722 + free (row); 723 + if (img) 724 + gg_image_destroy (img); 725 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 726 + return NULL; 727 + } 728 + cinfo.err->error_exit = fatal_jpeg_error; 729 + jpeg_create_decompress (&cinfo); 730 + jpeg_xgdIOCtx_src (&cinfo, infile); 731 + jpeg_save_markers (&cinfo, JPEG_APP0 + 14, 256); 732 + retval = jpeg_read_header (&cinfo, TRUE); 733 + if (retval != JPEG_HEADER_OK) 734 + fprintf (stderr, "jpeg-wrapper: warning: jpeg_read_header returns" 735 + " %d, expected %d\n", retval, JPEG_HEADER_OK); 736 + if (cinfo.image_height > INT_MAX) 737 + fprintf (stderr, 738 + "jpeg-wrapper: warning: JPEG image height (%u) is greater than INT_MAX\n", 739 + cinfo.image_height); 740 + if (cinfo.image_width > INT_MAX) 741 + fprintf (stderr, 742 + "jpeg-wrapper: warning: JPEG image width (%u) is greater than INT_MAX\n", 743 + cinfo.image_width); 744 + 745 + if (scale == 8) 746 + { 747 + /* requesting 1:8 scaling */ 748 + cinfo.scale_num = 1; 749 + } 750 + else if (scale == 4) 751 + { 752 + /* requesting 1:4 scaling */ 753 + cinfo.scale_num = 2; 754 + } 755 + else if (scale == 2) 756 + { 757 + /* requesting 1:2 scaling */ 758 + cinfo.scale_num = 4; 759 + } 760 + else 761 + { 762 + /* no scaling, full dimension */ 763 + cinfo.scale_num = 8; 764 + } 765 + cinfo.scale_denom = 8; 766 + if ((cinfo.jpeg_color_space == JCS_CMYK) || 767 + (cinfo.jpeg_color_space == JCS_YCCK)) 768 + cinfo.out_color_space = JCS_CMYK; 769 + else if (cinfo.jpeg_color_space == JCS_GRAYSCALE) 770 + cinfo.out_color_space = JCS_GRAYSCALE; 771 + else 772 + cinfo.out_color_space = JCS_RGB; 773 + 774 + if (jpeg_start_decompress (&cinfo) != TRUE) 775 + fprintf (stderr, 776 + "jpeg-wrapper: warning: jpeg_start_decompress reports suspended data source\n"); 777 + if (cinfo.out_color_space == JCS_GRAYSCALE) 778 + img = 779 + gg_image_create (GG_PIXEL_GRAYSCALE, (int) cinfo.output_width, 780 + (int) cinfo.output_height, 8, 1, 781 + GGRAPH_SAMPLE_UINT, NULL, NULL); 782 + else 783 + img = 784 + gg_image_create (GG_PIXEL_RGB, (int) cinfo.output_width, 785 + (int) cinfo.output_height, 8, 3, 786 + GGRAPH_SAMPLE_UINT, NULL, NULL); 787 + if (img == NULL) 788 + { 789 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 790 + goto error; 791 + } 792 + if (cinfo.out_color_space == JCS_RGB) 793 + { 794 + if (cinfo.output_components != 3) 795 + { 796 + fprintf (stderr, 797 + "jpeg-wrapper: error: JPEG color output_components == %d\n", 798 + cinfo.output_components); 799 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 800 + goto error; 801 + } 802 + channels = 3; 803 + } 804 + else if (cinfo.out_color_space == JCS_GRAYSCALE) 805 + { 806 + if (cinfo.output_components != 1) 807 + { 808 + fprintf (stderr, 809 + "jpeg-wrapper: error: JPEG color output_components == %d\n", 810 + cinfo.output_components); 811 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 812 + goto error; 813 + } 814 + channels = 1; 815 + } 816 + else if (cinfo.out_color_space == JCS_CMYK) 817 + { 818 + jpeg_saved_marker_ptr marker; 819 + if (cinfo.output_components != 4) 820 + { 821 + fprintf (stderr, 822 + "jpeg-wrapper: error: JPEG output_components == %d\n", 823 + cinfo.output_components); 824 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 825 + goto error; 826 + } 827 + channels = 4; 828 + marker = cinfo.marker_list; 829 + while (marker) 830 + { 831 + if ((marker->marker == (JPEG_APP0 + 14)) && 832 + (marker->data_length >= 12) 833 + && (!strncmp ((const char *) marker->data, "Adobe", 5))) 834 + { 835 + inverted = 1; 836 + break; 837 + } 838 + marker = marker->next; 839 + } 840 + } 841 + else 842 + { 843 + fprintf (stderr, "jpeg-wrapper: error: unexpected colorspace\n"); 844 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 845 + goto error; 846 + } 847 +#if BITS_IN_JSAMPLE == 12 848 + fprintf (stderr, 849 + "jpeg-wrapper: error: jpeg library was compiled for 12-bit\n"); 850 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 851 + goto error; 852 +#endif /* BITS_IN_JSAMPLE == 12 */ 853 + row = calloc (cinfo.output_width * channels, sizeof (JSAMPLE)); 854 + if (row == 0) 855 + { 856 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 857 + goto error; 858 + } 859 + rowptr[0] = row; 860 + if (cinfo.out_color_space == JCS_CMYK) 861 + { 862 + for (i = 0; i < (int) cinfo.output_height; i++) 863 + { 864 + register JSAMPROW currow = row; 865 + unsigned char *p_out = img->pixels + (i * img->scanline_width); 866 + nrows = jpeg_read_scanlines (&cinfo, rowptr, 1); 867 + if (nrows != 1) 868 + { 869 + fprintf (stderr, 870 + "jpeg-wrapper: error: jpeg_read_scanlines returns %u, expected 1\n", 871 + nrows); 872 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 873 + goto error; 874 + } 875 + for (j = 0; j < (int) cinfo.output_width; j++, currow += 4) 876 + { 877 + CMYKToRGB (currow[0], currow[1], currow[2], currow[3], 878 + inverted, &red, &green, &blue); 879 + *p_out++ = red; 880 + *p_out++ = green; 881 + *p_out++ = blue; 882 + } 883 + } 884 + } 885 + else if (cinfo.out_color_space == JCS_GRAYSCALE) 886 + { 887 + for (i = 0; i < (int) cinfo.output_height; i++) 888 + { 889 + register JSAMPROW currow = row; 890 + unsigned char *p_out = img->pixels + (i * img->scanline_width); 891 + nrows = jpeg_read_scanlines (&cinfo, rowptr, 1); 892 + if (nrows != 1) 893 + { 894 + fprintf (stderr, 895 + "jpeg-wrapper: error: jpeg_read_scanlines returns %u, expected 1\n", 896 + nrows); 897 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 898 + goto error; 899 + } 900 + for (j = 0; j < (int) cinfo.output_width; j++, currow++) 901 + *p_out++ = currow[0]; 902 + } 903 + } 904 + else 905 + { 906 + for (i = 0; i < (int) cinfo.output_height; i++) 907 + { 908 + register JSAMPROW currow = row; 909 + unsigned char *p_out = img->pixels + (i * img->scanline_width); 910 + nrows = jpeg_read_scanlines (&cinfo, rowptr, 1); 911 + if (nrows != 1) 912 + { 913 + fprintf (stderr, 914 + "jpeg-wrapper: error: jpeg_read_scanlines returns %u, expected 1\n", 915 + nrows); 916 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 917 + goto error; 918 + } 919 + for (j = 0; j < (int) cinfo.output_width; j++, currow += 3) 920 + { 921 + *p_out++ = currow[0]; 922 + *p_out++ = currow[1]; 923 + *p_out++ = currow[2]; 924 + } 925 + } 926 + } 927 + if (jpeg_finish_decompress (&cinfo) != TRUE) 928 + fprintf (stderr, 929 + "jpeg-wrapper: warning: jpeg_finish_decompress reports suspended data source\n"); 930 + jpeg_destroy_decompress (&cinfo); 931 + free (row); 932 + return img; 933 + error: 934 + jpeg_destroy_decompress (&cinfo); 935 + if (row) 936 + free (row); 937 + if (img) 938 + gg_image_destroy (img); 939 + return NULL; 940 +} 941 + 942 +static gGraphStripImagePtr 943 +xgdStripImageCreateFromJpegCtx (xgdIOCtx * infile, int *errcode, FILE * file) 944 +{ 945 +/* preparing to decompress a JPEG image [by strips] */ 946 + struct jpeg_decompress_struct cinfo; 947 + struct jpeg_error_mgr jerr; 948 + jmpbuf_wrapper jmpbufw; 949 + volatile JSAMPROW row = 0; 950 + volatile gGraphStripImagePtr img = 0; 951 + int retval; 952 + int channels = 3; 953 + struct jpeg_codec_data *jpeg_codec; 954 + memset (&cinfo, 0, sizeof (cinfo)); 955 + memset (&jerr, 0, sizeof (jerr)); 956 + cinfo.err = jpeg_std_error (&jerr); 957 + cinfo.client_data = &jmpbufw; 958 + if (setjmp (jmpbufw.jmpbuf) != 0) 959 + { 960 + if (row) 961 + free (row); 962 + if (img) 963 + gg_strip_image_destroy (img); 964 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 965 + return NULL; 966 + } 967 + cinfo.err->error_exit = fatal_jpeg_error; 968 + jpeg_create_decompress (&cinfo); 969 + jpeg_xgdIOCtx_src (&cinfo, infile); 970 + jpeg_save_markers (&cinfo, JPEG_APP0 + 14, 256); 971 + retval = jpeg_read_header (&cinfo, TRUE); 972 + if (retval != JPEG_HEADER_OK) 973 + fprintf (stderr, "jpeg-wrapper: warning: jpeg_read_header returns" 974 + " %d, expected %d\n", retval, JPEG_HEADER_OK); 975 + if (cinfo.image_height > INT_MAX) 976 + fprintf (stderr, 977 + "jpeg-wrapper: warning: JPEG image height (%u) is greater than INT_MAX\n", 978 + cinfo.image_height); 979 + if (cinfo.image_width > INT_MAX) 980 + fprintf (stderr, 981 + "jpeg-wrapper: warning: JPEG image width (%u) is greater than INT_MAX\n", 982 + cinfo.image_width); 983 + cinfo.scale_num = 8; 984 + cinfo.scale_denom = 8; 985 + if ((cinfo.jpeg_color_space == JCS_CMYK) || 986 + (cinfo.jpeg_color_space == JCS_YCCK)) 987 + cinfo.out_color_space = JCS_CMYK; 988 + else if (cinfo.jpeg_color_space == JCS_GRAYSCALE) 989 + cinfo.out_color_space = JCS_GRAYSCALE; 990 + else 991 + cinfo.out_color_space = JCS_RGB; 992 + 993 + if (jpeg_start_decompress (&cinfo) != TRUE) 994 + fprintf (stderr, 995 + "jpeg-wrapper: warning: jpeg_start_decompress reports suspended data source\n"); 996 + if (cinfo.out_color_space == JCS_GRAYSCALE) 997 + img = 998 + gg_strip_image_create (file, GGRAPH_IMAGE_JPEG, GG_PIXEL_GRAYSCALE, 999 + cinfo.output_width, cinfo.output_height, 8, 1000 + 1, GGRAPH_SAMPLE_UINT, NULL, NULL); 1001 + else 1002 + img = 1003 + gg_strip_image_create (file, GGRAPH_IMAGE_JPEG, GG_PIXEL_RGB, 1004 + cinfo.output_width, cinfo.output_height, 8, 1005 + 3, GGRAPH_SAMPLE_UINT, NULL, NULL); 1006 + if (img == NULL) 1007 + { 1008 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 1009 + goto error; 1010 + } 1011 + if (cinfo.out_color_space == JCS_RGB) 1012 + { 1013 + if (cinfo.output_components != 3) 1014 + { 1015 + fprintf (stderr, 1016 + "jpeg-wrapper: error: JPEG color output_components == %d\n", 1017 + cinfo.output_components); 1018 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 1019 + goto error; 1020 + } 1021 + channels = 3; 1022 + } 1023 + else if (cinfo.out_color_space == JCS_GRAYSCALE) 1024 + { 1025 + if (cinfo.output_components != 1) 1026 + { 1027 + fprintf (stderr, 1028 + "jpeg-wrapper: error: JPEG color output_components == %d\n", 1029 + cinfo.output_components); 1030 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 1031 + goto error; 1032 + } 1033 + channels = 1; 1034 + } 1035 + else if (cinfo.out_color_space == JCS_CMYK) 1036 + { 1037 + jpeg_saved_marker_ptr marker; 1038 + if (cinfo.output_components != 4) 1039 + { 1040 + fprintf (stderr, 1041 + "jpeg-wrapper: error: JPEG output_components == %d\n", 1042 + cinfo.output_components); 1043 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 1044 + goto error; 1045 + } 1046 + channels = 4; 1047 + marker = cinfo.marker_list; 1048 + while (marker) 1049 + { 1050 + if ((marker->marker == (JPEG_APP0 + 14)) && 1051 + (marker->data_length >= 12) 1052 + && (!strncmp ((const char *) marker->data, "Adobe", 5))) 1053 + { 1054 + break; 1055 + } 1056 + marker = marker->next; 1057 + } 1058 + } 1059 + else 1060 + { 1061 + fprintf (stderr, "jpeg-wrapper: error: unexpected colorspace\n"); 1062 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 1063 + goto error; 1064 + } 1065 +#if BITS_IN_JSAMPLE == 12 1066 + fprintf (stderr, 1067 + "jpeg-wrapper: error: jpeg library was compiled for 12-bit\n"); 1068 + *errcode = GGRAPH_JPEG_CODEC_ERROR; 1069 + goto error; 1070 +#endif /* BITS_IN_JSAMPLE == 12 */ 1071 + row = calloc (cinfo.output_width * channels, sizeof (JSAMPLE)); 1072 + if (row == 0) 1073 + { 1074 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 1075 + goto error; 1076 + } 1077 + 1078 +/* setting up the JPEG codec struct */ 1079 + jpeg_codec = malloc (sizeof (struct jpeg_codec_data)); 1080 + if (!jpeg_codec) 1081 + { 1082 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 1083 + goto error; 1084 + } 1085 + jpeg_codec->is_writer = 0; 1086 + memcpy (&(jpeg_codec->dec_cinfo), &cinfo, 1087 + sizeof (struct jpeg_decompress_struct)); 1088 + jpeg_codec->row = row; 1089 + jpeg_codec->io_ctx = infile; 1090 + img->codec_data = jpeg_codec; 1091 + 1092 + return img; 1093 + error: 1094 + jpeg_destroy_decompress (&cinfo); 1095 + if (row) 1096 + free (row); 1097 + if (img) 1098 + gg_strip_image_destroy (img); 1099 + return NULL; 1100 +} 1101 + 1102 +static int 1103 +xgdStripImageReadFromJpegCtx (gGraphStripImagePtr img) 1104 +{ 1105 +/* decompressing a JPEG image (by strip) */ 1106 + struct jpeg_codec_data *jpeg_codec = 1107 + (struct jpeg_codec_data *) (img->codec_data); 1108 + jmpbuf_wrapper jmpbufw; 1109 + JSAMPROW rowptr[1]; 1110 + int i, j; 1111 + JDIMENSION nrows; 1112 + int inverted = 0; 1113 + unsigned char red; 1114 + unsigned char green; 1115 + unsigned char blue; 1116 + int height = img->rows_per_block; 1117 + 1118 + if (img->next_row >= img->height) 1119 + { 1120 + /* EOF condition */ 1121 + fprintf (stderr, "jpeg-wrapper error: attempting to read beyond EOF"); 1122 + return GGRAPH_JPEG_CODEC_ERROR; 1123 + } 1124 + if ((img->next_row + img->rows_per_block) >= img->height) 1125 + height = img->height - img->next_row; 1126 + img->current_available_rows = height; 1127 + 1128 + jpeg_codec->dec_cinfo.client_data = &jmpbufw; 1129 + if (setjmp (jmpbufw.jmpbuf) != 0) 1130 + return GGRAPH_JPEG_CODEC_ERROR; 1131 + 1132 + rowptr[0] = jpeg_codec->row; 1133 + if (jpeg_codec->dec_cinfo.out_color_space == JCS_CMYK) 1134 + { 1135 + for (i = 0; i < height; i++) 1136 + { 1137 + register JSAMPROW currow = jpeg_codec->row; 1138 + unsigned char *p_out = img->pixels + (i * img->scanline_width); 1139 + nrows = 1140 + jpeg_read_scanlines (&(jpeg_codec->dec_cinfo), rowptr, 1); 1141 + if (nrows != 1) 1142 + { 1143 + fprintf (stderr, 1144 + "jpeg-wrapper: error: jpeg_read_scanlines returns %u, expected 1\n", 1145 + nrows); 1146 + return GGRAPH_JPEG_CODEC_ERROR; 1147 + } 1148 + for (j = 0; j < (int) jpeg_codec->dec_cinfo.output_width; 1149 + j++, currow += 4) 1150 + { 1151 + CMYKToRGB (currow[0], currow[1], currow[2], currow[3], 1152 + inverted, &red, &green, &blue); 1153 + *p_out++ = red; 1154 + *p_out++ = green; 1155 + *p_out++ = blue; 1156 + } 1157 + } 1158 + } 1159 + else if (jpeg_codec->dec_cinfo.out_color_space == JCS_GRAYSCALE) 1160 + { 1161 + for (i = 0; i < height; i++) 1162 + { 1163 + register JSAMPROW currow = jpeg_codec->row; 1164 + unsigned char *p_out = img->pixels + (i * img->scanline_width); 1165 + nrows = 1166 + jpeg_read_scanlines (&(jpeg_codec->dec_cinfo), rowptr, 1); 1167 + if (nrows != 1) 1168 + { 1169 + fprintf (stderr, 1170 + "jpeg-wrapper: error: jpeg_read_scanlines returns %u, expected 1\n", 1171 + nrows); 1172 + return GGRAPH_JPEG_CODEC_ERROR; 1173 + } 1174 + for (j = 0; j < (int) jpeg_codec->dec_cinfo.output_width; 1175 + j++, currow++) 1176 + *p_out++ = currow[0]; 1177 + } 1178 + } 1179 + else 1180 + { 1181 + for (i = 0; i < height; i++) 1182 + { 1183 + register JSAMPROW currow = jpeg_codec->row; 1184 + unsigned char *p_out = img->pixels + (i * img->scanline_width); 1185 + nrows = 1186 + jpeg_read_scanlines (&(jpeg_codec->dec_cinfo), rowptr, 1); 1187 + if (nrows != 1) 1188 + { 1189 + fprintf (stderr, 1190 + "jpeg-wrapper: error: jpeg_read_scanlines returns %u, expected 1\n", 1191 + nrows); 1192 + return GGRAPH_JPEG_CODEC_ERROR; 1193 + } 1194 + for (j = 0; j < (int) jpeg_codec->dec_cinfo.output_width; 1195 + j++, currow += 3) 1196 + { 1197 + *p_out++ = currow[0]; 1198 + *p_out++ = currow[1]; 1199 + *p_out++ = currow[2]; 1200 + } 1201 + } 1202 + } 1203 + img->next_row += height; 1204 + return GGRAPH_OK; 1205 +} 1206 + 1207 +GGRAPH_PRIVATE int 1208 +gg_image_to_jpeg (const gGraphImagePtr img, void **mem_buf, int *mem_buf_size, 1209 + FILE * file, int dest_type, int quality) 1210 +{ 1211 +/* compressing an image as JPEG */ 1212 + int ret; 1213 + void *rv; 1214 + int size; 1215 + xgdIOCtx *out; 1216 + 1217 +/* checkings args for validity */ 1218 + if (dest_type == GG_TARGET_IS_FILE) 1219 + { 1220 + if (!file) 1221 + return GGRAPH_ERROR; 1222 + } 1223 + else 1224 + { 1225 + if (!mem_buf || !mem_buf_size) 1226 + return GGRAPH_ERROR; 1227 + *mem_buf = NULL; 1228 + *mem_buf_size = 0; 1229 + } 1230 + 1231 + if (dest_type == GG_TARGET_IS_FILE) 1232 + out = xgdNewDynamicCtx (0, file, dest_type); 1233 + else 1234 + out = xgdNewDynamicCtx (2048, NULL, dest_type); 1235 + ret = xgdImageJpegCtx (img, out, quality); 1236 + if (dest_type == GG_TARGET_IS_FILE) 1237 + { 1238 + out->xgd_free (out); 1239 + return ret; 1240 + } 1241 + 1242 + if (ret == GGRAPH_OK) 1243 + rv = xgdDPExtractData (out, &size); 1244 + out->xgd_free (out); 1245 + *mem_buf = rv; 1246 + *mem_buf_size = size; 1247 + return ret; 1248 +} 1249 + 1250 +GGRAPH_PRIVATE int 1251 +gg_image_prepare_to_jpeg_by_strip (const gGraphStripImagePtr img, FILE * file, 1252 + int quality) 1253 +{ 1254 +/* preparing to compress an image as JPEG [by strip] */ 1255 + xgdIOCtx *out; 1256 + 1257 +/* checkings args for validity */ 1258 + if (!file) 1259 + return GGRAPH_ERROR; 1260 + 1261 + out = xgdNewDynamicCtx (0, file, GG_TARGET_IS_FILE); 1262 + return xgdStripImageJpegCtx (img, out, quality); 1263 +} 1264 + 1265 +GGRAPH_PRIVATE int 1266 +gg_image_write_to_jpeg_by_strip (const gGraphStripImagePtr img, int *progress) 1267 +{ 1268 +/* scanline(s) JPEG compression [by strip] */ 1269 + int ret = xgdStripImageJpegWriteCtx (img); 1270 + if (ret == GGRAPH_OK && progress != NULL) 1271 + *progress = 1272 + (int) (((double) (img->next_row + 1) * 100.0) / 1273 + (double) (img->height)); 1274 + return ret; 1275 +} 1276 + 1277 +GGRAPH_PRIVATE int 1278 +gg_image_from_jpeg (int size, const void *data, int source_type, 1279 + gGraphImagePtr * image_handle, int scale) 1280 +{ 1281 +/* uncompressing a JPEG */ 1282 + int errcode = GGRAPH_OK; 1283 + gGraphImagePtr img; 1284 + xgdIOCtx *in = 1285 + xgdNewDynamicCtxEx (size, data, XGD_CTX_DONT_FREE, source_type); 1286 + img = xgdImageCreateFromJpegCtx (in, &errcode, scale); 1287 + in->xgd_free (in); 1288 + *image_handle = img; 1289 + return errcode; 1290 +} 1291 + 1292 +GGRAPH_PRIVATE int 1293 +gg_image_infos_from_jpeg (int size, const void *data, int source_type, 1294 + gGraphImageInfosPtr * infos_handle) 1295 +{ 1296 +/* image infos from JPEG */ 1297 + int errcode = GGRAPH_OK; 1298 + gGraphImageInfosPtr infos; 1299 + xgdIOCtx *in = 1300 + xgdNewDynamicCtxEx (size, data, XGD_CTX_DONT_FREE, source_type); 1301 + infos = xgdImageInspectJpegCtx (in, &errcode); 1302 + in->xgd_free (in); 1303 + *infos_handle = infos; 1304 + return errcode; 1305 +} 1306 + 1307 +GGRAPH_PRIVATE int 1308 +gg_image_strip_prepare_from_jpeg (FILE * file, 1309 + gGraphStripImagePtr * image_handle) 1310 +{ 1311 +/* preparing to uncompress a JPEG [by strips] */ 1312 + int errcode = GGRAPH_OK; 1313 + gGraphStripImagePtr img; 1314 + xgdIOCtx *in = 1315 + xgdNewDynamicCtxEx (0, file, XGD_CTX_DONT_FREE, GG_TARGET_IS_FILE); 1316 + img = xgdStripImageCreateFromJpegCtx (in, &errcode, file); 1317 + *image_handle = img; 1318 + return errcode; 1319 +} 1320 + 1321 +GGRAPH_PRIVATE int 1322 +gg_image_strip_read_from_jpeg (gGraphStripImagePtr img, int *progress) 1323 +{ 1324 +/* uncompressing a JPEG [by strips] */ 1325 + int ret = xgdStripImageReadFromJpegCtx (img); 1326 + if (ret == GGRAPH_OK && progress != NULL) 1327 + *progress = 1328 + (int) (((double) (img->next_row + 1) * 100.0) / 1329 + (double) (img->height)); 1330 + return ret; 1331 +}
Added src/gaiagraphics_paint.c.
1 +/* 2 +/ gaiagraphics_paint.c 3 +/ 4 +/ painting helpers 5 +/ 6 +/ version 1.0, 2010 October 19 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2009 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdlib.h> 28 +#include <stdio.h> 29 +#include <string.h> 30 +#include <math.h> 31 + 32 +#include "gaiagraphics.h" 33 +#include "gaiagraphics_internals.h" 34 + 35 +GGRAPH_DECLARE int 36 +gGraphCreateContext (int width, int height, const void **context) 37 +{ 38 +/* creating a Graphics Context */ 39 + gGraphContextPtr ctx; 40 + 41 + *context = NULL; 42 + 43 + ctx = malloc (sizeof (gGraphContext)); 44 + if (!ctx) 45 + return GGRAPH_INSUFFICIENT_MEMORY; 46 + ctx->signature = GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE; 47 + ctx->surface = 48 + cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); 49 + if (cairo_surface_status (ctx->surface) == CAIRO_STATUS_SUCCESS) 50 + ; 51 + else 52 + goto error1; 53 + ctx->cairo = cairo_create (ctx->surface); 54 + if (cairo_status (ctx->cairo) == CAIRO_STATUS_NO_MEMORY) 55 + goto error2; 56 + 57 +/* setting up a default Black Pen */ 58 + ctx->current_pen.red = 0.0; 59 + ctx->current_pen.green = 0.0; 60 + ctx->current_pen.blue = 0.0; 61 + ctx->current_pen.alpha = 1.0; 62 + ctx->current_pen.width = 1.0; 63 + ctx->current_pen.lengths[0] = 1.0; 64 + ctx->current_pen.lengths_count = 1; 65 + 66 +/* setting up a default Black Brush */ 67 + ctx->current_brush.is_solid_color = 1; 68 + ctx->current_brush.is_linear_gradient = 0; 69 + ctx->current_brush.is_pattern = 0; 70 + ctx->current_brush.red = 0.0; 71 + ctx->current_brush.green = 0.0; 72 + ctx->current_brush.blue = 0.0; 73 + ctx->current_brush.alpha = 1.0; 74 + ctx->current_brush.pattern = NULL; 75 + 76 +/* priming a transparent background */ 77 + cairo_rectangle (ctx->cairo, 0, 0, width, height); 78 + cairo_set_source_rgba (ctx->cairo, 0.0, 0.0, 0.0, 0.0); 79 + cairo_fill (ctx->cairo); 80 + 81 +/* setting up default Font options */ 82 + ctx->font_red = 0.0; 83 + ctx->font_green = 0.0; 84 + ctx->font_blue = 0.0; 85 + ctx->font_alpha = 1.0; 86 + ctx->is_font_outlined = 0; 87 + ctx->font_outline_width = 0.0; 88 + 89 + *context = ctx; 90 + return GGRAPH_OK; 91 + error2: 92 + cairo_destroy (ctx->cairo); 93 + cairo_surface_destroy (ctx->surface); 94 + return GGRAPH_ERROR; 95 + error1: 96 + cairo_surface_destroy (ctx->surface); 97 + return GGRAPH_ERROR; 98 +} 99 + 100 +GGRAPH_DECLARE int 101 +gGraphDestroyContext (const void *context) 102 +{ 103 +/* freeing a Graphics Context */ 104 + gGraphContextPtr ctx = (gGraphContextPtr) context; 105 + if (!ctx) 106 + return GGRAPH_INVALID_PAINT_CONTEXT; 107 + if (ctx->signature != GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE) 108 + return GGRAPH_INVALID_PAINT_CONTEXT; 109 + cairo_destroy (ctx->cairo); 110 + cairo_surface_destroy (ctx->surface); 111 + free (ctx); 112 + return GGRAPH_OK; 113 +} 114 + 115 +GGRAPH_DECLARE int 116 +gGraphCreateSvgContext (const char *path, int width, int height, 117 + const void **context) 118 +{ 119 +/* creating an SVG Graphics Context */ 120 + gGraphContextPtr ctx; 121 + 122 + *context = NULL; 123 + 124 + ctx = malloc (sizeof (gGraphContext)); 125 + if (!ctx) 126 + return GGRAPH_INSUFFICIENT_MEMORY; 127 + ctx->signature = GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE; 128 + 129 + ctx->surface = 130 + cairo_svg_surface_create (path, (double) width, (double) height); 131 + 132 + if (cairo_surface_status (ctx->surface) == CAIRO_STATUS_SUCCESS) 133 + ; 134 + else 135 + goto error1; 136 + ctx->cairo = cairo_create (ctx->surface); 137 + if (cairo_status (ctx->cairo) == CAIRO_STATUS_NO_MEMORY) 138 + goto error2; 139 + 140 +/* setting up a default Black Pen */ 141 + ctx->current_pen.red = 0.0; 142 + ctx->current_pen.green = 0.0; 143 + ctx->current_pen.blue = 0.0; 144 + ctx->current_pen.alpha = 1.0; 145 + ctx->current_pen.width = 1.0; 146 + ctx->current_pen.lengths[0] = 1.0; 147 + ctx->current_pen.lengths_count = 1; 148 + 149 +/* setting up a default Black Brush */ 150 + ctx->current_brush.is_solid_color = 1; 151 + ctx->current_brush.is_linear_gradient = 0; 152 + ctx->current_brush.is_pattern = 0; 153 + ctx->current_brush.red = 0.0; 154 + ctx->current_brush.green = 0.0; 155 + ctx->current_brush.blue = 0.0; 156 + ctx->current_brush.alpha = 1.0; 157 + ctx->current_brush.pattern = NULL; 158 + 159 +/* priming a transparent background */ 160 + cairo_rectangle (ctx->cairo, 0, 0, width, height); 161 + cairo_set_source_rgba (ctx->cairo, 0.0, 0.0, 0.0, 0.0); 162 + cairo_fill (ctx->cairo); 163 + 164 +/* setting up default Font options */ 165 + ctx->font_red = 0.0; 166 + ctx->font_green = 0.0; 167 + ctx->font_blue = 0.0; 168 + ctx->font_alpha = 1.0; 169 + ctx->is_font_outlined = 0; 170 + ctx->font_outline_width = 0.0; 171 + 172 + *context = ctx; 173 + return GGRAPH_OK; 174 + error2: 175 + cairo_destroy (ctx->cairo); 176 + cairo_surface_destroy (ctx->surface); 177 + return GGRAPH_ERROR; 178 + error1: 179 + cairo_surface_destroy (ctx->surface); 180 + return GGRAPH_ERROR; 181 +} 182 + 183 +GGRAPH_DECLARE int 184 +gGraphDestroySvgContext (const void *context) 185 +{ 186 +/* freeing an SVG Graphics Context */ 187 + gGraphContextPtr ctx = (gGraphContextPtr) context; 188 + if (!ctx) 189 + return GGRAPH_INVALID_PAINT_CONTEXT; 190 + if (ctx->signature != GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE) 191 + return GGRAPH_INVALID_PAINT_CONTEXT; 192 + cairo_surface_show_page (ctx->surface); 193 + cairo_destroy (ctx->cairo); 194 + cairo_surface_finish (ctx->surface); 195 + cairo_surface_destroy (ctx->surface); 196 + free (ctx); 197 + return GGRAPH_OK; 198 +} 199 + 200 +GGRAPH_DECLARE int 201 +gGraphCreatePdfContext (const char *path, int page_width, int page_height, 202 + int width, int height, const void **context) 203 +{ 204 +/* creating an PDF Graphics Context */ 205 + int base_x = (page_width - width) / 2; 206 + int base_y = (page_height - height) / 2; 207 + gGraphContextPtr ctx; 208 + 209 + *context = NULL; 210 + 211 + ctx = malloc (sizeof (gGraphContext)); 212 + if (!ctx) 213 + return GGRAPH_INSUFFICIENT_MEMORY; 214 + ctx->signature = GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE; 215 + ctx->surface = 216 + cairo_pdf_surface_create (path, (double) page_width, 217 + (double) page_height); 218 + if (cairo_surface_status (ctx->surface) == CAIRO_STATUS_SUCCESS) 219 + ; 220 + else 221 + goto error1; 222 + ctx->cairo = cairo_create (ctx->surface); 223 + if (cairo_status (ctx->cairo) == CAIRO_STATUS_NO_MEMORY) 224 + goto error2; 225 + 226 +/* setting up a default Black Pen */ 227 + ctx->current_pen.red = 0.0; 228 + ctx->current_pen.green = 0.0; 229 + ctx->current_pen.blue = 0.0; 230 + ctx->current_pen.alpha = 1.0; 231 + ctx->current_pen.width = 1.0; 232 + ctx->current_pen.lengths[0] = 1.0; 233 + ctx->current_pen.lengths_count = 1; 234 + 235 +/* setting up a default Black Brush */ 236 + ctx->current_brush.is_solid_color = 1; 237 + ctx->current_brush.is_linear_gradient = 0; 238 + ctx->current_brush.is_pattern = 0; 239 + ctx->current_brush.red = 0.0; 240 + ctx->current_brush.green = 0.0; 241 + ctx->current_brush.blue = 0.0; 242 + ctx->current_brush.alpha = 1.0; 243 + ctx->current_brush.pattern = NULL; 244 + 245 +/* priming a transparent background */ 246 + cairo_rectangle (ctx->cairo, 0, 0, width, height); 247 + cairo_set_source_rgba (ctx->cairo, 0.0, 0.0, 0.0, 0.0); 248 + cairo_fill (ctx->cairo); 249 + 250 +/* setting up default Font options */ 251 + ctx->font_red = 0.0; 252 + ctx->font_green = 0.0; 253 + ctx->font_blue = 0.0; 254 + ctx->font_alpha = 1.0; 255 + ctx->is_font_outlined = 0; 256 + ctx->font_outline_width = 0.0; 257 + 258 + cairo_translate (ctx->cairo, base_x, base_y); 259 + *context = ctx; 260 + return GGRAPH_OK; 261 + error2: 262 + cairo_destroy (ctx->cairo); 263 + cairo_surface_destroy (ctx->surface); 264 + return GGRAPH_ERROR; 265 + error1: 266 + cairo_surface_destroy (ctx->surface); 267 + return GGRAPH_ERROR; 268 +} 269 + 270 +GGRAPH_DECLARE int 271 +gGraphDestroyPdfContext (const void *context) 272 +{ 273 +/* freeing an PDF Graphics Context */ 274 + gGraphContextPtr ctx = (gGraphContextPtr) context; 275 + if (!ctx) 276 + return GGRAPH_INVALID_PAINT_CONTEXT; 277 + if (ctx->signature != GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 278 + return GGRAPH_INVALID_PAINT_CONTEXT; 279 + cairo_surface_show_page (ctx->surface); 280 + cairo_destroy (ctx->cairo); 281 + cairo_surface_finish (ctx->surface); 282 + cairo_surface_destroy (ctx->surface); 283 + free (ctx); 284 + return GGRAPH_OK; 285 +} 286 + 287 +GGRAPH_DECLARE int 288 +gGraphSetPen (const void *context, unsigned char red, unsigned char green, 289 + unsigned char blue, unsigned char alpha, double width, int style) 290 +{ 291 +/* creating a Color Pen */ 292 + double d_red = (double) red / 255.0; 293 + double d_green = (double) green / 255.0; 294 + double d_blue = (double) blue / 255.0; 295 + double d_alpha = (double) alpha / 255.0; 296 + gGraphContextPtr ctx = (gGraphContextPtr) context; 297 + if (!ctx) 298 + return GGRAPH_INVALID_PAINT_CONTEXT; 299 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 300 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 301 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 302 + ; 303 + else 304 + return GGRAPH_INVALID_PAINT_CONTEXT; 305 + 306 + ctx->current_pen.width = width; 307 + ctx->current_pen.red = d_red; 308 + ctx->current_pen.green = d_green; 309 + ctx->current_pen.blue = d_blue; 310 + ctx->current_pen.alpha = d_alpha; 311 + switch (style) 312 + { 313 + case GGRAPH_PENSTYLE_DOT: 314 + ctx->current_pen.lengths[0] = 2; 315 + ctx->current_pen.lengths[1] = 2; 316 + ctx->current_pen.lengths_count = 2; 317 + break; 318 + case GGRAPH_PENSTYLE_LONG_DASH: 319 + ctx->current_pen.lengths[0] = 16; 320 + ctx->current_pen.lengths[1] = 8; 321 + ctx->current_pen.lengths_count = 2; 322 + break; 323 + case GGRAPH_PENSTYLE_SHORT_DASH: 324 + ctx->current_pen.lengths[0] = 8; 325 + ctx->current_pen.lengths[1] = 4; 326 + ctx->current_pen.lengths_count = 2; 327 + break; 328 + case GGRAPH_PENSTYLE_DOT_DASH: 329 + ctx->current_pen.lengths[0] = 8; 330 + ctx->current_pen.lengths[1] = 4; 331 + ctx->current_pen.lengths[2] = 2; 332 + ctx->current_pen.lengths[3] = 4; 333 + ctx->current_pen.lengths_count = 4; 334 + break; 335 + default: 336 + ctx->current_pen.lengths[0] = 1; 337 + ctx->current_pen.lengths[1] = 0; 338 + ctx->current_pen.lengths_count = 2; 339 + }; 340 + return GGRAPH_OK; 341 +} 342 + 343 +GGRAPH_DECLARE int 344 +gGraphSetBrush (const void *context, unsigned char red, unsigned char green, 345 + unsigned char blue, unsigned char alpha) 346 +{ 347 +/* setting up a Color Brush */ 348 + double d_red = (double) red / 255.0; 349 + double d_green = (double) green / 255.0; 350 + double d_blue = (double) blue / 255.0; 351 + double d_alpha = (double) alpha / 255.0; 352 + gGraphContextPtr ctx = (gGraphContextPtr) context; 353 + if (!ctx) 354 + return GGRAPH_INVALID_PAINT_CONTEXT; 355 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 356 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 357 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 358 + ; 359 + else 360 + return GGRAPH_INVALID_PAINT_CONTEXT; 361 + 362 + ctx->current_brush.is_solid_color = 1; 363 + ctx->current_brush.is_linear_gradient = 0; 364 + ctx->current_brush.is_pattern = 0; 365 + ctx->current_brush.red = d_red; 366 + ctx->current_brush.green = d_green; 367 + ctx->current_brush.blue = d_blue; 368 + ctx->current_brush.alpha = d_alpha; 369 + return GGRAPH_OK; 370 +} 371 + 372 +GGRAPH_DECLARE int 373 +gGraphSetLinearGradientBrush (const void *context, double x, double y, 374 + double width, double height, unsigned char red1, 375 + unsigned char green1, unsigned char blue1, 376 + unsigned char alpha1, unsigned char red2, 377 + unsigned char green2, unsigned char blue2, 378 + unsigned char alpha2) 379 +{ 380 +/* setting up a Linear Gradient Brush */ 381 + double d_red = (double) red1 / 255.0; 382 + double d_green = (double) green1 / 255.0; 383 + double d_blue = (double) blue1 / 255.0; 384 + double d_alpha = (double) alpha1 / 255.0; 385 + gGraphContextPtr ctx = (gGraphContextPtr) context; 386 + if (!ctx) 387 + return GGRAPH_INVALID_PAINT_CONTEXT; 388 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 389 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 390 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 391 + ; 392 + else 393 + return GGRAPH_INVALID_PAINT_CONTEXT; 394 + 395 + ctx->current_brush.is_solid_color = 0; 396 + ctx->current_brush.is_linear_gradient = 1; 397 + ctx->current_brush.is_pattern = 0; 398 + ctx->current_brush.red = d_red; 399 + ctx->current_brush.green = d_green; 400 + ctx->current_brush.blue = d_blue; 401 + ctx->current_brush.alpha = d_alpha; 402 + ctx->current_brush.x0 = x; 403 + ctx->current_brush.y0 = y; 404 + ctx->current_brush.x1 = x + width; 405 + ctx->current_brush.y1 = y + height; 406 + d_red = (double) red2 / 255.0; 407 + d_green = (double) green2 / 255.0; 408 + d_blue = (double) blue2 / 255.0; 409 + d_alpha = (double) alpha2 / 255.0; 410 + ctx->current_brush.red2 = d_red; 411 + ctx->current_brush.green2 = d_green; 412 + ctx->current_brush.blue2 = d_blue; 413 + ctx->current_brush.alpha2 = d_alpha; 414 + return GGRAPH_OK; 415 +} 416 + 417 +GGRAPH_DECLARE int 418 +gGraphSetPatternBrush (const void *context, const void *brush) 419 +{ 420 +/* setting up a Pattern Brush */ 421 + gGraphPatternBrushPtr pattern = (gGraphPatternBrushPtr) brush; 422 + gGraphContextPtr ctx = (gGraphContextPtr) context; 423 + 424 + if (!ctx) 425 + return GGRAPH_INVALID_PAINT_CONTEXT; 426 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 427 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 428 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 429 + ; 430 + else 431 + return GGRAPH_INVALID_PAINT_CONTEXT; 432 + 433 + if (!pattern) 434 + return GGRAPH_INVALID_PAINT_BRUSH; 435 + if (pattern->signature != GG_GRAPHICS_BRUSH_MAGIC_SIGNATURE) 436 + return GGRAPH_INVALID_PAINT_BRUSH; 437 + 438 + ctx->current_brush.is_solid_color = 0; 439 + ctx->current_brush.is_linear_gradient = 0; 440 + ctx->current_brush.is_pattern = 1; 441 + 442 + ctx->current_brush.pattern = pattern->pattern; 443 + return GGRAPH_OK; 444 +} 445 + 446 +static void 447 +set_current_brush (gGraphContextPtr ctx) 448 +{ 449 +/* setting up the current Brush */ 450 + if (ctx->current_brush.is_solid_color) 451 + { 452 + /* using a Solid Color Brush */ 453 + cairo_set_source_rgba (ctx->cairo, ctx->current_brush.red, 454 + ctx->current_brush.green, 455 + ctx->current_brush.blue, 456 + ctx->current_brush.alpha); 457 + } 458 + else if (ctx->current_brush.is_linear_gradient) 459 + { 460 + /* using a Linear Gradient Brush */ 461 + cairo_pattern_t *pattern = 462 + cairo_pattern_create_linear (ctx->current_brush.x0, 463 + ctx->current_brush.y0, 464 + ctx->current_brush.x1, 465 + ctx->current_brush.y1); 466 + cairo_pattern_add_color_stop_rgba (pattern, 0.0, 467 + ctx->current_brush.red, 468 + ctx->current_brush.green, 469 + ctx->current_brush.blue, 470 + ctx->current_brush.alpha); 471 + cairo_pattern_add_color_stop_rgba (pattern, 1.0, 472 + ctx->current_brush.red2, 473 + ctx->current_brush.green2, 474 + ctx->current_brush.blue2, 475 + ctx->current_brush.alpha2); 476 + cairo_set_source (ctx->cairo, pattern); 477 + cairo_pattern_destroy (pattern); 478 + } 479 + else if (ctx->current_brush.is_pattern) 480 + { 481 + /* using a Pattern Brush */ 482 + cairo_set_source (ctx->cairo, ctx->current_brush.pattern); 483 + } 484 +} 485 + 486 +GGRAPH_DECLARE int 487 +gGraphFillPath (const void *context, int preserve) 488 +{ 489 +/* Filling a path */ 490 + gGraphContextPtr ctx = (gGraphContextPtr) context; 491 + if (!ctx) 492 + return GGRAPH_INVALID_PAINT_CONTEXT; 493 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 494 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 495 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 496 + ; 497 + else 498 + return GGRAPH_INVALID_PAINT_CONTEXT; 499 + 500 + set_current_brush (ctx); 501 + if (preserve == GGRAPH_PRESERVE_PATH) 502 + cairo_fill_preserve (ctx->cairo); 503 + else 504 + cairo_fill (ctx->cairo); 505 + return GGRAPH_OK; 506 +} 507 + 508 +static void 509 +set_current_pen (gGraphContextPtr ctx) 510 +{ 511 +/* setting up the current Pen */ 512 + cairo_set_line_width (ctx->cairo, ctx->current_pen.width); 513 + cairo_set_source_rgba (ctx->cairo, ctx->current_pen.red, 514 + ctx->current_pen.green, ctx->current_pen.blue, 515 + ctx->current_pen.alpha); 516 + cairo_set_line_cap (ctx->cairo, CAIRO_LINE_CAP_BUTT); 517 + cairo_set_line_join (ctx->cairo, CAIRO_LINE_JOIN_MITER); 518 + cairo_set_dash (ctx->cairo, ctx->current_pen.lengths, 519 + ctx->current_pen.lengths_count, 0.0); 520 +} 521 + 522 +GGRAPH_DECLARE int 523 +gGraphStrokePath (const void *context, int preserve) 524 +{ 525 +/* Stroking a path */ 526 + gGraphContextPtr ctx = (gGraphContextPtr) context; 527 + if (!ctx) 528 + return GGRAPH_INVALID_PAINT_CONTEXT; 529 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 530 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 531 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 532 + ; 533 + else 534 + return GGRAPH_INVALID_PAINT_CONTEXT; 535 + 536 + set_current_pen (ctx); 537 + if (preserve == GGRAPH_PRESERVE_PATH) 538 + cairo_stroke_preserve (ctx->cairo); 539 + else 540 + cairo_stroke (ctx->cairo); 541 + return GGRAPH_OK; 542 +} 543 + 544 +GGRAPH_DECLARE int 545 +gGraphMoveToPoint (const void *context, double x, double y) 546 +{ 547 +/* Moving to a Path Point */ 548 + gGraphContextPtr ctx = (gGraphContextPtr) context; 549 + if (!ctx) 550 + return GGRAPH_INVALID_PAINT_CONTEXT; 551 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 552 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 553 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 554 + ; 555 + else 556 + return GGRAPH_INVALID_PAINT_CONTEXT; 557 + cairo_move_to (ctx->cairo, x, y); 558 + return GGRAPH_OK; 559 +} 560 + 561 +GGRAPH_DECLARE int 562 +gGraphAddLineToPath (const void *context, double x, double y) 563 +{ 564 +/* Adding a Lint to a Path */ 565 + gGraphContextPtr ctx = (gGraphContextPtr) context; 566 + if (!ctx) 567 + return GGRAPH_INVALID_PAINT_CONTEXT; 568 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 569 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 570 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 571 + ; 572 + else 573 + return GGRAPH_INVALID_PAINT_CONTEXT; 574 + cairo_line_to (ctx->cairo, x, y); 575 + return GGRAPH_OK; 576 +} 577 + 578 +GGRAPH_DECLARE int 579 +gGraphCloseSubpath (const void *context) 580 +{ 581 +/* Closing a SubPath */ 582 + gGraphContextPtr ctx = (gGraphContextPtr) context; 583 + if (!ctx) 584 + return GGRAPH_INVALID_PAINT_CONTEXT; 585 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 586 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 587 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 588 + ; 589 + else 590 + return GGRAPH_INVALID_PAINT_CONTEXT; 591 + cairo_close_path (ctx->cairo); 592 + return GGRAPH_OK; 593 +} 594 + 595 +GGRAPH_DECLARE int 596 +gGraphStrokeLine (const void *context, double x0, double y0, double x1, 597 + double y1) 598 +{ 599 +/* Stroking a line */ 600 + gGraphContextPtr ctx = (gGraphContextPtr) context; 601 + if (!ctx) 602 + return GGRAPH_INVALID_PAINT_CONTEXT; 603 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 604 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 605 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 606 + ; 607 + else 608 + return GGRAPH_INVALID_PAINT_CONTEXT; 609 + cairo_move_to (ctx->cairo, x0, y0); 610 + cairo_line_to (ctx->cairo, x1, y1); 611 + set_current_pen (ctx); 612 + cairo_stroke (ctx->cairo); 613 + return GGRAPH_OK; 614 +} 615 + 616 +GGRAPH_DECLARE int 617 +gGraphDrawEllipse (const void *context, double x, double y, double width, 618 + double height) 619 +{ 620 +/* Drawing a filled ellipse */ 621 + gGraphContextPtr ctx = (gGraphContextPtr) context; 622 + if (!ctx) 623 + return GGRAPH_INVALID_PAINT_CONTEXT; 624 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 625 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 626 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 627 + ; 628 + else 629 + return GGRAPH_INVALID_PAINT_CONTEXT; 630 + cairo_save (ctx->cairo); 631 + cairo_translate (ctx->cairo, x + (width / 2.0), y + (height / 2.0)); 632 + cairo_scale (ctx->cairo, width / 2.0, height / 2.0); 633 + cairo_arc (ctx->cairo, 0.0, 0.0, 1.0, 0.0, 2.0 * M_PI); 634 + cairo_restore (ctx->cairo); 635 + set_current_brush (ctx); 636 + cairo_fill_preserve (ctx->cairo); 637 + set_current_pen (ctx); 638 + cairo_stroke (ctx->cairo); 639 + return GGRAPH_OK; 640 +} 641 + 642 +GGRAPH_DECLARE int 643 +gGraphDrawCircleSector (const void *context, double center_x, 644 + double center_y, double radius, double from_angle, 645 + double to_angle) 646 +{ 647 +/* drawing a filled circular sector */ 648 + gGraphContextPtr ctx = (gGraphContextPtr) context; 649 + if (!ctx) 650 + return GGRAPH_INVALID_PAINT_CONTEXT; 651 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 652 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 653 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 654 + ; 655 + else 656 + return GGRAPH_INVALID_PAINT_CONTEXT; 657 + cairo_move_to (ctx->cairo, center_x, center_y); 658 + cairo_arc (ctx->cairo, center_x, center_y, radius, from_angle, to_angle); 659 + cairo_line_to (ctx->cairo, center_x, center_y); 660 + set_current_brush (ctx); 661 + cairo_fill_preserve (ctx->cairo); 662 + set_current_pen (ctx); 663 + cairo_stroke (ctx->cairo); 664 + return GGRAPH_OK; 665 +} 666 + 667 +GGRAPH_DECLARE int 668 +gGraphDrawRectangle (const void *context, double x, double y, double width, 669 + double height) 670 +{ 671 +/* Drawing a filled rectangle */ 672 + gGraphContextPtr ctx = (gGraphContextPtr) context; 673 + if (!ctx) 674 + return GGRAPH_INVALID_PAINT_CONTEXT; 675 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 676 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 677 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 678 + ; 679 + else 680 + return GGRAPH_INVALID_PAINT_CONTEXT; 681 + cairo_rectangle (ctx->cairo, x, y, width, height); 682 + set_current_brush (ctx); 683 + cairo_fill_preserve (ctx->cairo); 684 + set_current_pen (ctx); 685 + cairo_stroke (ctx->cairo); 686 + return GGRAPH_OK; 687 +} 688 + 689 +GGRAPH_DECLARE int 690 +gGraphDrawRoundedRectangle (const void *context, double x, double y, 691 + double width, double height, double radius) 692 +{ 693 +/* Drawing a filled rectangle with rounded corners */ 694 + double degrees = M_PI / 180.0; 695 + gGraphContextPtr ctx = (gGraphContextPtr) context; 696 + if (!ctx) 697 + return GGRAPH_INVALID_PAINT_CONTEXT; 698 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 699 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 700 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 701 + ; 702 + else 703 + return GGRAPH_INVALID_PAINT_CONTEXT; 704 + cairo_new_sub_path (ctx->cairo); 705 + cairo_arc (ctx->cairo, x + width - radius, y + radius, radius, 706 + -90 * degrees, 0 * degrees); 707 + cairo_arc (ctx->cairo, x + width - radius, y + height - radius, radius, 708 + 0 * degrees, 90 * degrees); 709 + cairo_arc (ctx->cairo, x + radius, y + height - radius, radius, 710 + 90 * degrees, 180 * degrees); 711 + cairo_arc (ctx->cairo, x + radius, y + radius, radius, 180 * degrees, 712 + 270 * degrees); 713 + cairo_close_path (ctx->cairo); 714 + set_current_brush (ctx); 715 + cairo_fill_preserve (ctx->cairo); 716 + set_current_pen (ctx); 717 + cairo_stroke (ctx->cairo); 718 + return GGRAPH_OK; 719 +} 720 + 721 +GGRAPH_DECLARE int 722 +gGraphGetContextRgbArray (const void *context, unsigned char **rgbArray) 723 +{ 724 +/* creating an RGB buffer from the given Context */ 725 + int width; 726 + int height; 727 + int x; 728 + int y; 729 + unsigned char *p_in; 730 + unsigned char *p_out; 731 + unsigned char *rgb; 732 + int little_endian = gg_endian_arch (); 733 + gGraphContextPtr ctx = (gGraphContextPtr) context; 734 + 735 + *rgbArray = NULL; 736 + if (!ctx) 737 + return GGRAPH_INVALID_PAINT_CONTEXT; 738 + if (ctx->signature != GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE) 739 + return GGRAPH_INVALID_PAINT_CONTEXT; 740 + 741 + width = cairo_image_surface_get_width (ctx->surface); 742 + height = cairo_image_surface_get_height (ctx->surface); 743 + rgb = malloc (width * height * 3); 744 + if (!rgb) 745 + return GGRAPH_INSUFFICIENT_MEMORY; 746 + 747 + p_in = cairo_image_surface_get_data (ctx->surface); 748 + p_out = rgb; 749 + for (y = 0; y < height; y++) 750 + { 751 + for (x = 0; x < width; x++) 752 + { 753 + unsigned char r; 754 + unsigned char g; 755 + unsigned char b; 756 + if (little_endian) 757 + { 758 + b = *p_in++; 759 + g = *p_in++; 760 + r = *p_in++; 761 + p_in++; /* skipping Alpha */ 762 + } 763 + else 764 + { 765 + p_in++; /* skipping Alpha */ 766 + r = *p_in++; 767 + g = *p_in++; 768 + b = *p_in++; 769 + } 770 + *p_out++ = r; 771 + *p_out++ = g; 772 + *p_out++ = b; 773 + } 774 + } 775 + *rgbArray = rgb; 776 + return GGRAPH_OK; 777 +} 778 + 779 +GGRAPH_DECLARE int 780 +gGraphGetContextAlphaArray (const void *context, unsigned char **alphaArray) 781 +{ 782 +/* creating an Alpha buffer from the given Context */ 783 + int width; 784 + int height; 785 + int x; 786 + int y; 787 + unsigned char *p_in; 788 + unsigned char *p_out; 789 + unsigned char *alpha; 790 + gGraphContextPtr ctx = (gGraphContextPtr) context; 791 + 792 + *alphaArray = NULL; 793 + if (!ctx) 794 + return GGRAPH_INVALID_PAINT_CONTEXT; 795 + if (ctx->signature != GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE) 796 + return GGRAPH_INVALID_PAINT_CONTEXT; 797 + 798 + width = cairo_image_surface_get_width (ctx->surface); 799 + height = cairo_image_surface_get_height (ctx->surface); 800 + alpha = malloc (width * height); 801 + if (!alpha) 802 + return GGRAPH_INSUFFICIENT_MEMORY; 803 + 804 + p_in = cairo_image_surface_get_data (ctx->surface); 805 + p_out = alpha; 806 + for (y = 0; y < height; y++) 807 + { 808 + for (x = 0; x < width; x++) 809 + { 810 + p_in += 3; /* skipping RGB */ 811 + *p_out++ = *p_in++; 812 + } 813 + } 814 + *alphaArray = alpha; 815 + return GGRAPH_OK; 816 +} 817 + 818 +GGRAPH_DECLARE int 819 +gGraphDrawBitmap (const void *context, const void *bitmap, int x, int y) 820 +{ 821 +/* drawing a symbol bitmap */ 822 + gGraphBitmapPtr bmp = (gGraphBitmapPtr) bitmap; 823 + gGraphContextPtr ctx = (gGraphContextPtr) context; 824 + 825 + if (!ctx) 826 + return GGRAPH_INVALID_PAINT_CONTEXT; 827 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 828 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 829 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 830 + ; 831 + else 832 + return GGRAPH_INVALID_PAINT_CONTEXT; 833 + 834 + if (!bmp) 835 + return GGRAPH_INVALID_PAINT_BITMAP; 836 + if (bmp->signature != GG_GRAPHICS_BITMAP_MAGIC_SIGNATURE) 837 + return GGRAPH_INVALID_PAINT_BITMAP; 838 + 839 + cairo_save (ctx->cairo); 840 + cairo_scale (ctx->cairo, 1, 1); 841 + cairo_translate (ctx->cairo, x, y); 842 + cairo_set_source (ctx->cairo, bmp->pattern); 843 + cairo_rectangle (ctx->cairo, 0, 0, bmp->width, bmp->height); 844 + cairo_fill (ctx->cairo); 845 + cairo_restore (ctx->cairo); 846 + return GGRAPH_OK; 847 +} 848 + 849 +static void 850 +adjust_for_endianness (unsigned char *rgbaArray, int width, int height) 851 +{ 852 +/* Adjusting from RGBA to ARGB respecting platform endianness */ 853 + int x; 854 + int y; 855 + unsigned char red; 856 + unsigned char green; 857 + unsigned char blue; 858 + unsigned char alpha; 859 + unsigned char *p_in = rgbaArray; 860 + unsigned char *p_out = rgbaArray; 861 + int little_endian = gg_endian_arch (); 862 + 863 + for (y = 0; y < height; y++) 864 + { 865 + for (x = 0; x < width; x++) 866 + { 867 + red = *p_in++; 868 + green = *p_in++; 869 + blue = *p_in++; 870 + alpha = *p_in++; 871 + if (alpha == 0) 872 + { 873 + *p_out++ = 0; 874 + *p_out++ = 0; 875 + *p_out++ = 0; 876 + *p_out++ = 0; 877 + } 878 + else 879 + { 880 + if (little_endian) 881 + { 882 + *p_out++ = blue; 883 + *p_out++ = green; 884 + *p_out++ = red; 885 + *p_out++ = alpha; 886 + } 887 + else 888 + { 889 + *p_out++ = alpha; 890 + *p_out++ = red; 891 + *p_out++ = green; 892 + *p_out++ = blue; 893 + } 894 + } 895 + } 896 + } 897 +} 898 + 899 +GGRAPH_DECLARE int 900 +gGraphCreateBitmap (unsigned char *rgbaArray, int width, int height, 901 + const void **bitmap) 902 +{ 903 +/* creating a symbol bitmap */ 904 + gGraphBitmapPtr bmp; 905 + 906 + *bitmap = NULL; 907 + if (!rgbaArray) 908 + return GGRAPH_ERROR; 909 + 910 + adjust_for_endianness (rgbaArray, width, height); 911 + bmp = malloc (sizeof (gGraphBitmap)); 912 + if (!bmp) 913 + return GGRAPH_INSUFFICIENT_MEMORY; 914 + bmp->signature = GG_GRAPHICS_BITMAP_MAGIC_SIGNATURE; 915 + bmp->width = width; 916 + bmp->height = height; 917 + bmp->bitmap = 918 + cairo_image_surface_create_for_data (rgbaArray, CAIRO_FORMAT_ARGB32, 919 + width, height, width * 4); 920 + bmp->pattern = cairo_pattern_create_for_surface (bmp->bitmap); 921 + *bitmap = bmp; 922 + return GGRAPH_OK; 923 +} 924 + 925 +GGRAPH_DECLARE int 926 +gGraphDestroyBitmap (const void *bitmap) 927 +{ 928 +/* destroying a symbol bitmap */ 929 + gGraphBitmapPtr bmp = (gGraphBitmapPtr) bitmap; 930 + 931 + if (!bmp) 932 + return GGRAPH_INVALID_PAINT_BITMAP; 933 + if (bmp->signature != GG_GRAPHICS_BITMAP_MAGIC_SIGNATURE) 934 + return GGRAPH_INVALID_PAINT_BITMAP; 935 + 936 + cairo_pattern_destroy (bmp->pattern); 937 + cairo_surface_destroy (bmp->bitmap); 938 + free (bmp); 939 + return GGRAPH_OK; 940 +} 941 + 942 +GGRAPH_DECLARE int 943 +gGraphCreateBrush (unsigned char *rgbaArray, int width, int height, 944 + const void **brush) 945 +{ 946 +/* creating a pattern brush */ 947 + gGraphPatternBrushPtr pattern; 948 + 949 + *brush = NULL; 950 + if (!rgbaArray) 951 + return GGRAPH_ERROR; 952 + 953 + adjust_for_endianness (rgbaArray, width, height); 954 + pattern = malloc (sizeof (gGraphPatternBrush)); 955 + if (!pattern) 956 + return GGRAPH_INSUFFICIENT_MEMORY; 957 + pattern->signature = GG_GRAPHICS_BRUSH_MAGIC_SIGNATURE; 958 + pattern->width = width; 959 + pattern->height = height; 960 + pattern->bitmap = 961 + cairo_image_surface_create_for_data (rgbaArray, CAIRO_FORMAT_ARGB32, 962 + width, height, width * 4); 963 + pattern->pattern = cairo_pattern_create_for_surface (pattern->bitmap); 964 + cairo_pattern_set_extend (pattern->pattern, CAIRO_EXTEND_REPEAT); 965 + *brush = pattern; 966 + return GGRAPH_OK; 967 +} 968 + 969 +GGRAPH_DECLARE int 970 +gGraphDestroyBrush (const void *brush) 971 +{ 972 +/* destroying a pattern brush */ 973 + gGraphPatternBrushPtr pattern = (gGraphPatternBrushPtr) brush; 974 + 975 + if (!pattern) 976 + return GGRAPH_INVALID_PAINT_BRUSH; 977 + if (pattern->signature != GG_GRAPHICS_BRUSH_MAGIC_SIGNATURE) 978 + return GGRAPH_INVALID_PAINT_BRUSH; 979 + 980 + cairo_pattern_destroy (pattern->pattern); 981 + cairo_surface_destroy (pattern->bitmap); 982 + free (pattern); 983 + return GGRAPH_OK; 984 +} 985 + 986 +GGRAPH_DECLARE int 987 +gGraphCreateFont (double size, int style, int weight, const void **font) 988 +{ 989 +/* creating a font */ 990 + gGraphFontPtr fnt; 991 + 992 + *font = NULL; 993 + fnt = malloc (sizeof (gGraphFont)); 994 + if (!fnt) 995 + return GGRAPH_INSUFFICIENT_MEMORY; 996 + fnt->signature = GG_GRAPHICS_FONT_MAGIC_SIGNATURE; 997 + if (size < 1.0) 998 + fnt->size = 1.0; 999 + else if (size > 32.0) 1000 + fnt->size = 32.0; 1001 + else 1002 + fnt->size = size; 1003 + if (style == GGRAPH_FONTSTYLE_ITALIC) 1004 + fnt->style = GGRAPH_FONTSTYLE_ITALIC; 1005 + else 1006 + fnt->style = GGRAPH_FONTSTYLE_NORMAL; 1007 + if (weight == GGRAPH_FONTWEIGHT_BOLD) 1008 + fnt->weight = GGRAPH_FONTWEIGHT_BOLD; 1009 + else 1010 + fnt->weight = GGRAPH_FONTWEIGHT_NORMAL; 1011 + fnt->is_outlined = 0; 1012 + fnt->outline_width = 0.0; 1013 + fnt->red = 0.0; 1014 + fnt->green = 0.0; 1015 + fnt->blue = 0.0; 1016 + fnt->alpha = 1.0; 1017 + *font = fnt; 1018 + return GGRAPH_OK; 1019 +} 1020 + 1021 +GGRAPH_DECLARE int 1022 +gGraphDestroyFont (const void *font) 1023 +{ 1024 +/* destroying a font */ 1025 + gGraphFontPtr fnt = (gGraphFontPtr) font; 1026 + 1027 + if (!fnt) 1028 + return GGRAPH_INVALID_PAINT_FONT; 1029 + if (fnt->signature != GG_GRAPHICS_FONT_MAGIC_SIGNATURE) 1030 + return GGRAPH_INVALID_PAINT_FONT; 1031 + 1032 + free (fnt); 1033 + return GGRAPH_OK; 1034 +} 1035 + 1036 +GGRAPH_DECLARE int 1037 +gGraphFontSetColor (const void *font, unsigned char red, unsigned char green, 1038 + unsigned char blue, unsigned char alpha) 1039 +{ 1040 +/* setting up the font color */ 1041 + gGraphFontPtr fnt = (gGraphFontPtr) font; 1042 + 1043 + if (!fnt) 1044 + return GGRAPH_INVALID_PAINT_FONT; 1045 + if (fnt->signature != GG_GRAPHICS_FONT_MAGIC_SIGNATURE) 1046 + return GGRAPH_INVALID_PAINT_FONT; 1047 + 1048 + fnt->red = (double) red / 255.0; 1049 + fnt->green = (double) green / 255.0; 1050 + fnt->blue = (double) blue / 255.0; 1051 + fnt->alpha = (double) alpha / 255.0; 1052 + return GGRAPH_OK; 1053 +} 1054 + 1055 +GGRAPH_DECLARE int 1056 +gGraphFontSetOutline (const void *font, double width) 1057 +{ 1058 +/* setting up the font outline */ 1059 + gGraphFontPtr fnt = (gGraphFontPtr) font; 1060 + 1061 + if (!fnt) 1062 + return GGRAPH_INVALID_PAINT_FONT; 1063 + if (fnt->signature != GG_GRAPHICS_FONT_MAGIC_SIGNATURE) 1064 + return GGRAPH_INVALID_PAINT_FONT; 1065 + 1066 + if (width <= 0.0) 1067 + { 1068 + fnt->is_outlined = 0; 1069 + fnt->outline_width = 0.0; 1070 + } 1071 + else 1072 + { 1073 + fnt->is_outlined = 1; 1074 + fnt->outline_width = width; 1075 + } 1076 + return GGRAPH_OK; 1077 +} 1078 + 1079 +GGRAPH_DECLARE int 1080 +gGraphSetFont (const void *context, const void *font) 1081 +{ 1082 +/* setting up the current font */ 1083 + int style = CAIRO_FONT_SLANT_NORMAL; 1084 + int weight = CAIRO_FONT_WEIGHT_NORMAL; 1085 + double size; 1086 + gGraphFontPtr fnt = (gGraphFontPtr) font; 1087 + gGraphContextPtr ctx = (gGraphContextPtr) context; 1088 + 1089 + if (!ctx) 1090 + return GGRAPH_INVALID_PAINT_CONTEXT; 1091 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 1092 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 1093 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 1094 + ; 1095 + else 1096 + return GGRAPH_INVALID_PAINT_CONTEXT; 1097 + 1098 + if (!fnt) 1099 + return GGRAPH_INVALID_PAINT_FONT; 1100 + if (fnt->signature != GG_GRAPHICS_FONT_MAGIC_SIGNATURE) 1101 + return GGRAPH_INVALID_PAINT_FONT; 1102 + 1103 + if (fnt->style == GGRAPH_FONTSTYLE_ITALIC) 1104 + style = CAIRO_FONT_SLANT_ITALIC; 1105 + if (fnt->weight == GGRAPH_FONTWEIGHT_BOLD) 1106 + weight = CAIRO_FONT_WEIGHT_BOLD; 1107 + cairo_select_font_face (ctx->cairo, "monospace", style, weight); 1108 + size = fnt->size; 1109 + if (fnt->is_outlined) 1110 + size += fnt->outline_width; 1111 + cairo_set_font_size (ctx->cairo, size); 1112 + ctx->font_red = fnt->red; 1113 + ctx->font_green = fnt->green; 1114 + ctx->font_blue = fnt->blue; 1115 + ctx->font_alpha = fnt->alpha; 1116 + ctx->is_font_outlined = fnt->is_outlined; 1117 + ctx->font_outline_width = fnt->outline_width; 1118 + 1119 + return GGRAPH_OK; 1120 +} 1121 + 1122 +GGRAPH_DECLARE int 1123 +gGraphGetTextExtent (const void *context, const char *text, double *pre_x, 1124 + double *pre_y, double *width, double *height, 1125 + double *post_x, double *post_y) 1126 +{ 1127 +/* measuring the text extent (using the current font) */ 1128 + cairo_text_extents_t extents; 1129 + gGraphContextPtr ctx = (gGraphContextPtr) context; 1130 + 1131 + if (!ctx) 1132 + return GGRAPH_INVALID_PAINT_CONTEXT; 1133 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 1134 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 1135 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 1136 + ; 1137 + else 1138 + return GGRAPH_INVALID_PAINT_CONTEXT; 1139 + 1140 + cairo_text_extents (ctx->cairo, text, &extents); 1141 + *pre_x = extents.x_bearing; 1142 + *pre_y = extents.y_bearing; 1143 + *width = extents.width; 1144 + *height = extents.height; 1145 + *post_x = extents.x_advance; 1146 + *post_y = extents.y_advance; 1147 + return GGRAPH_OK; 1148 +} 1149 + 1150 +GGRAPH_DECLARE int 1151 +gGraphDrawText (const void *context, const char *text, double x, double y, 1152 + double angle) 1153 +{ 1154 +/* drawing a text string (using the current font) */ 1155 + gGraphContextPtr ctx = (gGraphContextPtr) context; 1156 + 1157 + if (!ctx) 1158 + return GGRAPH_INVALID_PAINT_CONTEXT; 1159 + if (ctx->signature == GG_GRAPHICS_CONTEXT_MAGIC_SIGNATURE || 1160 + ctx->signature == GG_GRAPHICS_SVG_CONTEXT_MAGIC_SIGNATURE || 1161 + ctx->signature == GG_GRAPHICS_PDF_CONTEXT_MAGIC_SIGNATURE) 1162 + ; 1163 + else 1164 + return GGRAPH_INVALID_PAINT_CONTEXT; 1165 + 1166 + cairo_save (ctx->cairo); 1167 + cairo_translate (ctx->cairo, x, y); 1168 + cairo_rotate (ctx->cairo, angle); 1169 + if (ctx->is_font_outlined) 1170 + { 1171 + /* outlined font */ 1172 + cairo_move_to (ctx->cairo, 0.0, 0.0); 1173 + cairo_text_path (ctx->cairo, text); 1174 + cairo_set_source_rgba (ctx->cairo, ctx->font_red, ctx->font_green, 1175 + ctx->font_blue, ctx->font_alpha); 1176 + cairo_fill_preserve (ctx->cairo); 1177 + cairo_set_source_rgba (ctx->cairo, 1.0, 1.0, 1.0, ctx->font_alpha); 1178 + cairo_set_line_width (ctx->cairo, ctx->font_outline_width); 1179 + cairo_stroke (ctx->cairo); 1180 + } 1181 + else 1182 + { 1183 + /* no outline */ 1184 + cairo_set_source_rgba (ctx->cairo, ctx->font_red, ctx->font_green, 1185 + ctx->font_blue, ctx->font_alpha); 1186 + cairo_move_to (ctx->cairo, 0.0, 0.0); 1187 + cairo_show_text (ctx->cairo, text); 1188 + } 1189 + cairo_restore (ctx->cairo); 1190 + return GGRAPH_OK; 1191 +}
Added src/gaiagraphics_png.c.
1 +/* 2 +/ gaiagraphics_png.c 3 +/ 4 +/ PNG auxiliary helpers 5 +/ 6 +/ version 1.0, 2010 July 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2010 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdio.h> 28 +#include <math.h> 29 +#include <string.h> 30 +#include <stdlib.h> 31 + 32 +#include <png.h> 33 + 34 +#define PNG_TRUE 1 35 +#define PNG_FALSE 0 36 + 37 +#include "gaiagraphics.h" 38 +#include "gaiagraphics_internals.h" 39 + 40 +struct png_codec_data 41 +{ 42 +/* a struct used by PNG codec */ 43 + int is_writer; 44 + png_structp png_ptr; 45 + png_infop info_ptr; 46 + png_bytep row_pointer; 47 + int palette_allocated; 48 + int num_palette; 49 + png_colorp palette; 50 + int bit_depth; 51 + int color_type; 52 + int interlace_type; 53 + int quantization_factor; 54 + xgdIOCtx *io_ctx; 55 +}; 56 + 57 +/* 58 +/ 59 +/ DISCLAIMER: 60 +/ the following code is vaguely derived from the original GD lib 61 +/ code, which was originally released under a BSD-like license 62 +/ 63 +*/ 64 + 65 +#ifndef PNG_SETJMP_NOT_SUPPORTED 66 +typedef struct _jmpbuf_wrapper 67 +{ 68 + jmp_buf jmpbuf; 69 +} 70 +jmpbuf_wrapper; 71 + 72 +static jmpbuf_wrapper xgdPngJmpbufStruct; 73 + 74 +static void 75 +xgdPngErrorHandler (png_structp png_ptr, png_const_charp msg) 76 +{ 77 + jmpbuf_wrapper *jmpbuf_ptr; 78 + fprintf (stderr, "png-wrapper: fatal libpng error: %s\n", msg); 79 + fflush (stderr); 80 + jmpbuf_ptr = png_get_error_ptr (png_ptr); 81 + if (jmpbuf_ptr == NULL) 82 + { 83 + fprintf (stderr, 84 + "png-wrapper: EXTREMELY fatal error: jmpbuf unrecoverable; terminating.\n"); 85 + fflush (stderr); 86 + exit (99); 87 + } 88 + longjmp (jmpbuf_ptr->jmpbuf, 1); 89 +} 90 +#endif 91 + 92 +static void 93 +xgdPngReadData (png_structp png_ptr, png_bytep data, png_size_t length) 94 +{ 95 + int check; 96 + check = xgdGetBuf (data, length, (xgdIOCtx *) png_get_io_ptr (png_ptr)); 97 + if (check != (int) length) 98 + { 99 + png_error (png_ptr, "Read Error: truncated data"); 100 + } 101 +} 102 + 103 +static void 104 +xgdPngWriteData (png_structp png_ptr, png_bytep data, png_size_t length) 105 +{ 106 + xgdPutBuf (data, length, (xgdIOCtx *) png_get_io_ptr (png_ptr)); 107 +} 108 + 109 +static void 110 +xgdPngFlushData (png_structp png_ptr) 111 +{ 112 + if (png_ptr) 113 + return; /* does absolutely nothing - required in order to suppress warnings */ 114 +} 115 + 116 +static gGraphImageInfosPtr 117 +xgdImageInfosFromPngCtx (xgdIOCtx * infile, int *errcode) 118 +{ 119 +/* retrieving general infos from a PNG image */ 120 + png_byte sig[8]; 121 + png_structp png_ptr; 122 + png_infop info_ptr; 123 + png_uint_32 width, height; 124 + int bit_depth, color_type, interlace_type; 125 + int num_palette; 126 + png_colorp palette; 127 + int i; 128 + gGraphImageInfosPtr infos = NULL; 129 + memset (sig, 0, sizeof (sig)); 130 + if (xgdGetBuf (sig, 8, infile) < 8) 131 + { 132 + *errcode = GGRAPH_PNG_CODEC_ERROR; 133 + return NULL; 134 + } 135 + if (png_sig_cmp (sig, 0, 8)) 136 + { 137 + *errcode = GGRAPH_PNG_CODEC_ERROR; 138 + return NULL; 139 + } 140 +#ifndef PNG_SETJMP_NOT_SUPPORTED 141 + png_ptr = 142 + png_create_read_struct (PNG_LIBPNG_VER_STRING, &xgdPngJmpbufStruct, 143 + xgdPngErrorHandler, NULL); 144 +#else 145 + png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 146 +#endif 147 + if (png_ptr == NULL) 148 + { 149 + fprintf (stderr, 150 + "png-wrapper error: cannot allocate libpng main struct\n"); 151 + *errcode = GGRAPH_PNG_CODEC_ERROR; 152 + return NULL; 153 + } 154 + info_ptr = png_create_info_struct (png_ptr); 155 + if (info_ptr == NULL) 156 + { 157 + fprintf (stderr, 158 + "png-wrapper error: cannot allocate libpng info struct\n"); 159 + png_destroy_read_struct (&png_ptr, NULL, NULL); 160 + *errcode = GGRAPH_PNG_CODEC_ERROR; 161 + return NULL; 162 + } 163 +#ifndef PNG_SETJMP_NOT_SUPPORTED 164 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 165 + { 166 + fprintf (stderr, 167 + "png-wrapper error: setjmp returns error condition 1\n"); 168 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 169 + *errcode = GGRAPH_PNG_CODEC_ERROR; 170 + return NULL; 171 + } 172 +#endif 173 + png_set_sig_bytes (png_ptr, 8); 174 + png_set_read_fn (png_ptr, (void *) infile, xgdPngReadData); 175 + png_read_info (png_ptr, info_ptr); 176 + png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, 177 + &interlace_type, NULL, NULL); 178 + if (color_type == PNG_COLOR_TYPE_PALETTE) 179 + { 180 + infos = 181 + gg_image_infos_create (GG_PIXEL_PALETTE, (int) width, 182 + (int) height, bit_depth, 1, 183 + GGRAPH_SAMPLE_UINT, NULL, NULL); 184 + png_get_PLTE (png_ptr, info_ptr, &palette, &num_palette); 185 + infos->max_palette = num_palette; 186 + for (i = 0; i < num_palette; i++) 187 + { 188 + infos->palette_red[i] = palette[i].red; 189 + infos->palette_green[i] = palette[i].green; 190 + infos->palette_blue[i] = palette[i].blue; 191 + fprintf (stderr, "plt %d/%d %02x%02x%02x\n", i, num_palette, 192 + infos->palette_red[i], infos->palette_green[i], 193 + infos->palette_blue[i]); 194 + fflush (stderr); 195 + } 196 + } 197 + else if (color_type == PNG_COLOR_TYPE_GRAY 198 + || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 199 + infos = 200 + gg_image_infos_create (GG_PIXEL_GRAYSCALE, (int) width, 201 + (int) height, bit_depth, 1, 202 + GGRAPH_SAMPLE_UINT, NULL, NULL); 203 + else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) 204 + infos = 205 + gg_image_infos_create (GG_PIXEL_RGBA, (int) width, (int) height, 206 + bit_depth, 4, GGRAPH_SAMPLE_UINT, NULL, 207 + NULL); 208 + else 209 + infos = 210 + gg_image_infos_create (GG_PIXEL_RGB, (int) width, (int) height, 211 + bit_depth, 3, GGRAPH_SAMPLE_UINT, NULL, 212 + NULL); 213 + if (infos == NULL) 214 + { 215 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 216 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 217 + return NULL; 218 + } 219 + infos->compression = GGRAPH_TIFF_COMPRESSION_DEFLATE; 220 + if (png_get_interlace_type (png_ptr, info_ptr) == PNG_INTERLACE_ADAM7) 221 + { 222 + infos->scale_1_2 = 1; 223 + infos->scale_1_4 = 1; 224 + infos->scale_1_8 = 1; 225 + } 226 + return infos; 227 +} 228 + 229 +static gGraphImagePtr 230 +xgdImageCreateFromPngCtx (xgdIOCtx * infile, int *errcode, int scale) 231 +{ 232 +/* decompressing a PNG image */ 233 + png_byte sig[8]; 234 + png_structp png_ptr; 235 + png_infop info_ptr; 236 + png_uint_32 width, height, rowbytes, w, h; 237 + int img_width, img_height; 238 + int bit_depth, color_type, interlace_type; 239 + int num_palette; 240 + png_colorp palette; 241 + int is_adam7; 242 + png_bytep row_pointer = NULL; 243 + gGraphImagePtr img = NULL; 244 + int i, j; 245 + volatile int palette_allocated = PNG_FALSE; 246 + memset (sig, 0, sizeof (sig)); 247 + if (xgdGetBuf (sig, 8, infile) < 8) 248 + { 249 + *errcode = GGRAPH_PNG_CODEC_ERROR; 250 + return NULL; 251 + } 252 + if (png_sig_cmp (sig, 0, 8)) 253 + { 254 + *errcode = GGRAPH_PNG_CODEC_ERROR; 255 + return NULL; 256 + } 257 +#ifndef PNG_SETJMP_NOT_SUPPORTED 258 + png_ptr = 259 + png_create_read_struct (PNG_LIBPNG_VER_STRING, &xgdPngJmpbufStruct, 260 + xgdPngErrorHandler, NULL); 261 +#else 262 + png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 263 +#endif 264 + if (png_ptr == NULL) 265 + { 266 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 267 + return NULL; 268 + } 269 + info_ptr = png_create_info_struct (png_ptr); 270 + if (info_ptr == NULL) 271 + { 272 + png_destroy_read_struct (&png_ptr, NULL, NULL); 273 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 274 + return NULL; 275 + } 276 +#ifndef PNG_SETJMP_NOT_SUPPORTED 277 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 278 + { 279 + fprintf (stderr, 280 + "png-wrapper error: setjmp returns error condition 1\n"); 281 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 282 + *errcode = GGRAPH_PNG_CODEC_ERROR; 283 + return NULL; 284 + } 285 +#endif 286 + png_set_sig_bytes (png_ptr, 8); 287 + png_set_read_fn (png_ptr, (void *) infile, xgdPngReadData); 288 + png_read_info (png_ptr, info_ptr); 289 + png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, 290 + &interlace_type, NULL, NULL); 291 + if (png_get_interlace_type (png_ptr, info_ptr) == PNG_INTERLACE_ADAM7) 292 + { 293 + /* Adam7 interlaced [supporting 1:1, 1:2, 1:4 and 1:8 reduced image] */ 294 + is_adam7 = 1; 295 + if (scale == 8) 296 + { 297 + /* requesting 1:8 scaling */ 298 + img_width = width / 8; 299 + if ((img_width * 8) < (int) width) 300 + img_width++; 301 + img_height = height / 8; 302 + if ((img_height * 8) < (int) height) 303 + img_height++; 304 + } 305 + else if (scale == 4) 306 + { 307 + /* requesting 1:4 scaling */ 308 + img_width = width / 4; 309 + if ((img_width * 4) < (int) width) 310 + img_width++; 311 + img_height = height / 4; 312 + if ((img_height * 4) < (int) height) 313 + img_height++; 314 + } 315 + else if (scale == 2) 316 + { 317 + /* requesting 1:2 scaling */ 318 + img_width = width / 2; 319 + if ((img_width * 2) < (int) width) 320 + img_width++; 321 + img_height = height / 2; 322 + if ((img_height * 2) < (int) height) 323 + img_height++; 324 + } 325 + else 326 + { 327 + /* no scaling, full dimension */ 328 + img_width = width; 329 + img_height = height; 330 + } 331 + } 332 + else 333 + { 334 + /* normal, not Adam7 interlaced */ 335 + is_adam7 = 0; 336 + img_width = width; 337 + img_height = height; 338 + } 339 + 340 + if (color_type == PNG_COLOR_TYPE_PALETTE) 341 + img = 342 + gg_image_create (GG_PIXEL_PALETTE, img_width, img_height, bit_depth, 343 + 1, GGRAPH_SAMPLE_UINT, NULL, NULL); 344 + else if (color_type == PNG_COLOR_TYPE_GRAY 345 + || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 346 + img = 347 + gg_image_create (GG_PIXEL_GRAYSCALE, img_width, img_height, 348 + bit_depth, 1, GGRAPH_SAMPLE_UINT, NULL, NULL); 349 + else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) 350 + img = 351 + gg_image_create (GG_PIXEL_RGBA, img_width, img_height, bit_depth, 4, 352 + GGRAPH_SAMPLE_UINT, NULL, NULL); 353 + else 354 + img = 355 + gg_image_create (GG_PIXEL_RGB, img_width, img_height, bit_depth, 3, 356 + GGRAPH_SAMPLE_UINT, NULL, NULL); 357 + if (img == NULL) 358 + { 359 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 360 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 361 + return NULL; 362 + } 363 + 364 + if (bit_depth == 16) 365 + { 366 + png_set_strip_16 (png_ptr); 367 + } 368 + else if (bit_depth < 8) 369 + { 370 + png_set_packing (png_ptr); 371 + } 372 +#ifndef PNG_SETJMP_NOT_SUPPORTED 373 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 374 + { 375 + fprintf (stderr, 376 + "png-wrapper error: setjmp returns error condition 2"); 377 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 378 + free (row_pointer); 379 + if (img) 380 + gg_image_destroy (img); 381 + *errcode = GGRAPH_PNG_CODEC_ERROR; 382 + return NULL; 383 + } 384 +#endif 385 + switch (color_type) 386 + { 387 + case PNG_COLOR_TYPE_PALETTE: 388 + png_get_PLTE (png_ptr, info_ptr, &palette, &num_palette); 389 + img->max_palette = num_palette; 390 + for (i = 0; i < num_palette; i++) 391 + { 392 + img->palette_red[i] = palette[i].red; 393 + img->palette_green[i] = palette[i].green; 394 + img->palette_blue[i] = palette[i].blue; 395 + } 396 + break; 397 + case PNG_COLOR_TYPE_GRAY: 398 + case PNG_COLOR_TYPE_GRAY_ALPHA: 399 + if ((palette = malloc (256 * sizeof (png_color))) == NULL) 400 + { 401 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 402 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 403 + return NULL; 404 + } 405 + palette_allocated = PNG_TRUE; 406 + if (bit_depth < 8) 407 + { 408 + num_palette = 1 << bit_depth; 409 + for (i = 0; i < 256; ++i) 410 + { 411 + j = (255 * i) / (num_palette - 1); 412 + palette[i].red = palette[i].green = palette[i].blue = j; 413 + } 414 + } 415 + else 416 + { 417 + num_palette = 256; 418 + for (i = 0; i < 256; ++i) 419 + { 420 + palette[i].red = palette[i].green = palette[i].blue = i; 421 + } 422 + } 423 + break; 424 + } 425 + png_read_update_info (png_ptr, info_ptr); 426 + rowbytes = png_get_rowbytes (png_ptr, info_ptr); 427 + if (overflow2 (rowbytes, height)) 428 + { 429 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 430 + *errcode = GGRAPH_PNG_CODEC_ERROR; 431 + return NULL; 432 + } 433 + row_pointer = malloc (rowbytes); 434 + if (!row_pointer) 435 + { 436 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 437 + if (img) 438 + gg_image_destroy (img); 439 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 440 + return NULL; 441 + } 442 + if (overflow2 (height, sizeof (png_bytep))) 443 + { 444 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 445 + free (row_pointer); 446 + if (img) 447 + gg_image_destroy (img); 448 + *errcode = GGRAPH_PNG_CODEC_ERROR; 449 + return NULL; 450 + } 451 + if (is_adam7) 452 + { 453 + /* reading an ADAM7 interlaced image */ 454 + int row_no; 455 + int pass; 456 + int y_base, y_step; 457 + png_uint_32 h_limit, w_limit; 458 + for (pass = 0; pass < 7; pass++) 459 + { 460 + /* reading an interlaced image requires 7 passes */ 461 + if (scale == 8 && pass > 0) 462 + { 463 + /* 1:8 reduced image already exctracted */ 464 + break; 465 + } 466 + if (scale == 4 && pass > 2) 467 + { 468 + /* 1:4 reduced image already extracted */ 469 + break; 470 + } 471 + if (scale == 2 && pass > 4) 472 + { 473 + /* 1:2 reduced image already extracted */ 474 + break; 475 + } 476 + 477 + switch (pass) 478 + { 479 + case 0: 480 + y_base = 0; 481 + y_step = 8; 482 + break; 483 + case 1: 484 + y_base = 0; 485 + y_step = 8; 486 + break; 487 + case 2: 488 + y_base = 4; 489 + y_step = 8; 490 + break; 491 + case 3: 492 + y_base = 0; 493 + y_step = 4; 494 + break; 495 + case 4: 496 + y_base = 2; 497 + y_step = 4; 498 + break; 499 + case 5: 500 + y_base = 0; 501 + y_step = 2; 502 + break; 503 + case 6: 504 + y_base = 1; 505 + y_step = 2; 506 + break; 507 + }; 508 + h_limit = (height - y_base) / y_step; 509 + if ((h_limit * y_step) < (height - y_base)) 510 + h_limit++; 511 + row_no = 0; 512 + for (h = 0; h < h_limit; h++) 513 + { 514 + int skip; 515 + int boffset = 0; 516 + int x_base; 517 + int x_step; 518 + unsigned char *p_out; 519 + png_read_row (png_ptr, row_pointer, NULL); 520 + 521 + switch (pass) 522 + { 523 + case 0: 524 + x_base = 0; 525 + x_step = 8; 526 + break; 527 + case 1: 528 + x_base = 4; 529 + x_step = 8; 530 + break; 531 + case 2: 532 + x_base = 0; 533 + x_step = 4; 534 + break; 535 + case 3: 536 + x_base = 4; 537 + x_step = 4; 538 + break; 539 + case 4: 540 + x_base = 0; 541 + x_step = 2; 542 + break; 543 + case 5: 544 + x_base = 1; 545 + x_step = 2; 546 + break; 547 + case 6: 548 + x_base = 0; 549 + x_step = 1; 550 + break; 551 + }; 552 + w_limit = (width - x_base) / x_step; 553 + if ((w_limit * x_step) < (width - x_base)) 554 + w_limit++; 555 + switch (pass) 556 + { 557 + case 0: 558 + p_out = 559 + img->pixels + (row_no * img->scanline_width); 560 + switch (scale) 561 + { 562 + case 8: 563 + skip = 0; 564 + row_no += 1; 565 + break; 566 + case 4: 567 + skip = 1; 568 + row_no += 2; 569 + break; 570 + case 2: 571 + skip = 3; 572 + row_no += 4; 573 + break; 574 + case 1: 575 + skip = 7; 576 + row_no += 8; 577 + break; 578 + }; 579 + break; 580 + case 1: 581 + switch (scale) 582 + { 583 + case 4: 584 + p_out = 585 + img->pixels + 586 + (row_no * img->scanline_width) + 587 + img->pixel_size; 588 + skip = 1; 589 + row_no += 2; 590 + break; 591 + case 2: 592 + p_out = 593 + img->pixels + 594 + (row_no * img->scanline_width) + 595 + (img->pixel_size * 2); 596 + skip = 3; 597 + row_no += 4; 598 + break; 599 + case 1: 600 + p_out = 601 + img->pixels + 602 + (row_no * img->scanline_width) + 603 + (img->pixel_size * 4); 604 + skip = 7; 605 + row_no += 8; 606 + break; 607 + }; 608 + break; 609 + case 2: 610 + switch (scale) 611 + { 612 + case 4: 613 + p_out = 614 + img->pixels + 615 + ((row_no + 1) * img->scanline_width); 616 + skip = 0; 617 + row_no += 2; 618 + break; 619 + case 2: 620 + p_out = 621 + img->pixels + 622 + ((row_no + 2) * img->scanline_width); 623 + skip = 1; 624 + row_no += 4; 625 + break; 626 + case 1: 627 + p_out = 628 + img->pixels + 629 + ((row_no + 4) * img->scanline_width); 630 + skip = 3; 631 + row_no += 8; 632 + break; 633 + }; 634 + break; 635 + case 3: 636 + switch (scale) 637 + { 638 + case 2: 639 + p_out = 640 + img->pixels + 641 + (row_no * img->scanline_width) + 642 + img->pixel_size; 643 + skip = 1; 644 + row_no += 2; 645 + break; 646 + case 1: 647 + p_out = 648 + img->pixels + 649 + (row_no * img->scanline_width) + 650 + (img->pixel_size * 2); 651 + skip = 3; 652 + row_no += 4; 653 + break; 654 + }; 655 + break; 656 + case 4: 657 + switch (scale) 658 + { 659 + case 2: 660 + p_out = 661 + img->pixels + 662 + ((row_no + 1) * img->scanline_width); 663 + skip = 0; 664 + row_no += 2; 665 + break; 666 + case 1: 667 + p_out = 668 + img->pixels + 669 + ((row_no + 2) * img->scanline_width); 670 + skip = 1; 671 + row_no += 4; 672 + break; 673 + }; 674 + break; 675 + case 5: 676 + p_out = 677 + img->pixels + (row_no * img->scanline_width) + 678 + (img->pixel_size); 679 + skip = 1; 680 + row_no += 2; 681 + break; 682 + case 6: 683 + p_out = 684 + img->pixels + 685 + ((row_no + 1) * img->scanline_width); 686 + skip = 0; 687 + row_no += 2; 688 + break; 689 + }; 690 + 691 + switch (color_type) 692 + { 693 + case PNG_COLOR_TYPE_RGB: 694 + for (w = 0; w < w_limit; w++) 695 + { 696 + register png_byte r = row_pointer[boffset++]; 697 + register png_byte g = row_pointer[boffset++]; 698 + register png_byte b = row_pointer[boffset++]; 699 + *p_out++ = r; 700 + *p_out++ = g; 701 + *p_out++ = b; 702 + p_out += skip * 3; 703 + } 704 + break; 705 + case PNG_COLOR_TYPE_RGB_ALPHA: 706 + for (w = 0; w < w_limit; w++) 707 + { 708 + register png_byte r = row_pointer[boffset++]; 709 + register png_byte g = row_pointer[boffset++]; 710 + register png_byte b = row_pointer[boffset++]; 711 + register png_byte alpha = 712 + row_pointer[boffset++]; 713 + *p_out++ = r; 714 + *p_out++ = g; 715 + *p_out++ = b; 716 + *p_out++ = alpha; 717 + p_out += skip * 4; 718 + } 719 + break; 720 + case PNG_COLOR_TYPE_GRAY: 721 + case PNG_COLOR_TYPE_GRAY_ALPHA: 722 + for (w = 0; w < w_limit; w++) 723 + { 724 + register png_byte idx = row_pointer[w]; 725 + *p_out++ = idx; 726 + p_out += skip; 727 + } 728 + break; 729 + default: 730 + for (w = 0; w < w_limit; w++) 731 + { 732 + register png_byte idx = row_pointer[w]; 733 + *p_out++ = idx; 734 + p_out += skip; 735 + } 736 + }; 737 + } 738 + } 739 + } 740 + else 741 + { 742 + /* reading a non-interlaced image */ 743 + for (h = 0; h < height; h++) 744 + { 745 + int boffset = 0; 746 + unsigned char *p_out = img->pixels + (h * img->scanline_width); 747 + png_read_row (png_ptr, row_pointer, NULL); 748 + switch (color_type) 749 + { 750 + case PNG_COLOR_TYPE_RGB: 751 + for (w = 0; w < width; w++) 752 + { 753 + register png_byte r = row_pointer[boffset++]; 754 + register png_byte g = row_pointer[boffset++]; 755 + register png_byte b = row_pointer[boffset++]; 756 + *p_out++ = r; 757 + *p_out++ = g; 758 + *p_out++ = b; 759 + } 760 + break; 761 + case PNG_COLOR_TYPE_RGB_ALPHA: 762 + for (w = 0; w < width; w++) 763 + { 764 + register png_byte r = row_pointer[boffset++]; 765 + register png_byte g = row_pointer[boffset++]; 766 + register png_byte b = row_pointer[boffset++]; 767 + register png_byte alpha = row_pointer[boffset++]; 768 + *p_out++ = r; 769 + *p_out++ = g; 770 + *p_out++ = b; 771 + *p_out++ = alpha; 772 + } 773 + break; 774 + case PNG_COLOR_TYPE_GRAY: 775 + case PNG_COLOR_TYPE_GRAY_ALPHA: 776 + for (w = 0; w < width; ++w) 777 + { 778 + register png_byte idx = row_pointer[w]; 779 + *p_out++ = idx; 780 + } 781 + break; 782 + default: 783 + for (w = 0; w < width; ++w) 784 + { 785 + register png_byte idx = row_pointer[w]; 786 + *p_out++ = idx; 787 + } 788 + } 789 + } 790 + } 791 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 792 + 793 + if (palette_allocated == PNG_TRUE) 794 + free (palette); 795 + free (row_pointer); 796 + return img; 797 +} 798 + 799 +GGRAPH_PRIVATE void 800 +gg_png_codec_destroy (void *p) 801 +{ 802 +/* destroyng the PNG codec data */ 803 + struct png_codec_data *codec = (struct png_codec_data *) p; 804 + if (!codec) 805 + return; 806 + if (codec->is_writer) 807 + { 808 + png_write_end (codec->png_ptr, codec->info_ptr); 809 + png_destroy_write_struct (&(codec->png_ptr), &(codec->info_ptr)); 810 + } 811 + else 812 + { 813 + png_read_end (codec->png_ptr, codec->info_ptr); 814 + png_destroy_read_struct (&(codec->png_ptr), &(codec->info_ptr), NULL); 815 + } 816 + if (codec->palette_allocated == PNG_TRUE) 817 + free (codec->palette); 818 + free (codec->row_pointer); 819 + codec->io_ctx->xgd_free (codec->io_ctx); 820 + free (codec); 821 +} 822 + 823 +static gGraphStripImagePtr 824 +xgdStripImageCreateFromPngCtx (xgdIOCtx * infile, int *errcode, FILE * file) 825 +{ 826 +/* preparing to decompress a PNG image [by strips] */ 827 + png_byte sig[8]; 828 + png_structp png_ptr; 829 + png_infop info_ptr; 830 + png_uint_32 width, height, rowbytes; 831 + int bit_depth, color_type, interlace_type; 832 + int num_palette; 833 + png_colorp palette; 834 + png_bytep row_pointer = NULL; 835 + gGraphStripImagePtr img = NULL; 836 + struct png_codec_data *png_codec; 837 + int i, j; 838 + volatile int palette_allocated = PNG_FALSE; 839 + memset (sig, 0, sizeof (sig)); 840 + if (xgdGetBuf (sig, 8, infile) < 8) 841 + { 842 + *errcode = GGRAPH_PNG_CODEC_ERROR; 843 + return NULL; 844 + } 845 + if (png_sig_cmp (sig, 0, 8)) 846 + { 847 + *errcode = GGRAPH_PNG_CODEC_ERROR; 848 + return NULL; 849 + } 850 +#ifndef PNG_SETJMP_NOT_SUPPORTED 851 + png_ptr = 852 + png_create_read_struct (PNG_LIBPNG_VER_STRING, &xgdPngJmpbufStruct, 853 + xgdPngErrorHandler, NULL); 854 +#else 855 + png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 856 +#endif 857 + if (png_ptr == NULL) 858 + { 859 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 860 + return NULL; 861 + } 862 + info_ptr = png_create_info_struct (png_ptr); 863 + if (info_ptr == NULL) 864 + { 865 + png_destroy_read_struct (&png_ptr, NULL, NULL); 866 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 867 + return NULL; 868 + } 869 +#ifndef PNG_SETJMP_NOT_SUPPORTED 870 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 871 + { 872 + fprintf (stderr, 873 + "png-wrapper error: setjmp returns error condition 1\n"); 874 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 875 + *errcode = GGRAPH_PNG_CODEC_ERROR; 876 + return NULL; 877 + } 878 +#endif 879 + png_set_sig_bytes (png_ptr, 8); 880 + png_set_read_fn (png_ptr, (void *) infile, xgdPngReadData); 881 + png_read_info (png_ptr, info_ptr); 882 + png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, 883 + &interlace_type, NULL, NULL); 884 + 885 + if (interlace_type == PNG_INTERLACE_ADAM7) 886 + { 887 + fprintf (stderr, 888 + "png-wrapper error: ADAM7 interlace cannot be accessed by strips\n"); 889 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 890 + *errcode = GGRAPH_PNG_CODEC_ERROR; 891 + return NULL; 892 + } 893 + 894 + if (color_type == PNG_COLOR_TYPE_PALETTE) 895 + { 896 + img = 897 + gg_strip_image_create (file, GGRAPH_IMAGE_PNG, GG_PIXEL_PALETTE, 898 + width, height, bit_depth, 1, 899 + GGRAPH_SAMPLE_UINT, NULL, NULL); 900 + } 901 + else if (color_type == PNG_COLOR_TYPE_GRAY 902 + || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 903 + { 904 + img = 905 + gg_strip_image_create (file, GGRAPH_IMAGE_PNG, GG_PIXEL_GRAYSCALE, 906 + width, height, bit_depth, 1, 907 + GGRAPH_SAMPLE_UINT, NULL, NULL); 908 + } 909 + else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) 910 + { 911 + img = 912 + gg_strip_image_create (file, GGRAPH_IMAGE_PNG, GG_PIXEL_RGBA, 913 + width, height, bit_depth, 4, 914 + GGRAPH_SAMPLE_UINT, NULL, NULL); 915 + } 916 + else 917 + { 918 + img = 919 + gg_strip_image_create (file, GGRAPH_IMAGE_PNG, GG_PIXEL_RGB, 920 + width, height, bit_depth, 3, 921 + GGRAPH_SAMPLE_UINT, NULL, NULL); 922 + } 923 + if (img == NULL) 924 + { 925 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 926 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 927 + return NULL; 928 + } 929 + 930 + if (bit_depth == 16) 931 + { 932 + png_set_strip_16 (png_ptr); 933 + } 934 + else if (bit_depth < 8) 935 + { 936 + png_set_packing (png_ptr); 937 + } 938 +#ifndef PNG_SETJMP_NOT_SUPPORTED 939 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 940 + { 941 + fprintf (stderr, 942 + "png-wrapper error: setjmp returns error condition 2"); 943 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 944 + free (row_pointer); 945 + if (img) 946 + gg_strip_image_destroy (img); 947 + *errcode = GGRAPH_PNG_CODEC_ERROR; 948 + return NULL; 949 + } 950 +#endif 951 + switch (color_type) 952 + { 953 + case PNG_COLOR_TYPE_PALETTE: 954 + png_get_PLTE (png_ptr, info_ptr, &palette, &num_palette); 955 + img->max_palette = num_palette; 956 + for (i = 0; i < num_palette; i++) 957 + { 958 + img->palette_red[i] = palette[i].red; 959 + img->palette_green[i] = palette[i].green; 960 + img->palette_blue[i] = palette[i].blue; 961 + } 962 + break; 963 + case PNG_COLOR_TYPE_GRAY: 964 + case PNG_COLOR_TYPE_GRAY_ALPHA: 965 + if ((palette = malloc (256 * sizeof (png_color))) == NULL) 966 + { 967 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 968 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 969 + return NULL; 970 + } 971 + palette_allocated = PNG_TRUE; 972 + if (bit_depth < 8) 973 + { 974 + num_palette = 1 << bit_depth; 975 + for (i = 0; i < 256; ++i) 976 + { 977 + j = (255 * i) / (num_palette - 1); 978 + palette[i].red = palette[i].green = palette[i].blue = j; 979 + } 980 + } 981 + else 982 + { 983 + num_palette = 256; 984 + for (i = 0; i < 256; ++i) 985 + { 986 + palette[i].red = palette[i].green = palette[i].blue = i; 987 + } 988 + } 989 + break; 990 + } 991 + png_read_update_info (png_ptr, info_ptr); 992 + rowbytes = png_get_rowbytes (png_ptr, info_ptr); 993 + if (overflow2 (rowbytes, height)) 994 + { 995 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 996 + *errcode = GGRAPH_PNG_CODEC_ERROR; 997 + return NULL; 998 + } 999 + row_pointer = malloc (rowbytes); 1000 + if (!row_pointer) 1001 + { 1002 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 1003 + if (img) 1004 + gg_strip_image_destroy (img); 1005 + *errcode = GGRAPH_INSUFFICIENT_MEMORY; 1006 + return NULL; 1007 + } 1008 + if (overflow2 (height, sizeof (png_bytep))) 1009 + { 1010 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 1011 + free (row_pointer); 1012 + if (img) 1013 + gg_strip_image_destroy (img); 1014 + *errcode = GGRAPH_PNG_CODEC_ERROR; 1015 + return NULL; 1016 + } 1017 + 1018 +/* setting up the PNG codec struct */ 1019 + png_codec = malloc (sizeof (struct png_codec_data)); 1020 + if (!png_codec) 1021 + { 1022 + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); 1023 + free (row_pointer); 1024 + gg_strip_image_destroy (img); 1025 + *errcode = GGRAPH_PNG_CODEC_ERROR; 1026 + return NULL; 1027 + } 1028 + png_codec->is_writer = 0; 1029 + png_codec->row_pointer = row_pointer; 1030 + png_codec->png_ptr = png_ptr; 1031 + png_codec->info_ptr = info_ptr; 1032 + png_codec->palette_allocated = palette_allocated; 1033 + png_codec->num_palette = num_palette; 1034 + png_codec->palette = palette; 1035 + png_codec->bit_depth = bit_depth; 1036 + png_codec->color_type = color_type; 1037 + png_codec->interlace_type = interlace_type; 1038 + png_codec->io_ctx = infile; 1039 + img->codec_data = png_codec; 1040 + 1041 + return img; 1042 +} 1043 + 1044 +static int 1045 +xgdStripImageReadFromPngCtx (gGraphStripImagePtr img) 1046 +{ 1047 +/* decompressing a PNG image [by strip] */ 1048 + png_uint_32 w, h; 1049 + struct png_codec_data *png_codec = 1050 + (struct png_codec_data *) (img->codec_data); 1051 + png_structp png_ptr = png_codec->png_ptr; 1052 + int color_type = png_codec->color_type; 1053 + png_bytep row_pointer = png_codec->row_pointer; 1054 + png_uint_32 width = img->width; 1055 + png_uint_32 height = img->rows_per_block; 1056 + 1057 + if (img->next_row >= img->height) 1058 + { 1059 + /* EOF condition */ 1060 + fprintf (stderr, "png-wrapper error: attempting to read beyond EOF"); 1061 + return GGRAPH_PNG_CODEC_ERROR; 1062 + } 1063 + if ((img->next_row + img->rows_per_block) >= img->height) 1064 + height = img->height - img->next_row; 1065 + img->current_available_rows = height; 1066 + 1067 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1068 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 1069 + { 1070 + fprintf (stderr, 1071 + "png-wrapper error: setjmp returns error condition 2"); 1072 + return GGRAPH_PNG_CODEC_ERROR; 1073 + } 1074 +#endif 1075 + 1076 +/* reading a non-interlaced image */ 1077 + for (h = 0; h < height; h++) 1078 + { 1079 + int boffset = 0; 1080 + unsigned char *p_out = img->pixels + (h * img->scanline_width); 1081 + png_read_row (png_ptr, row_pointer, NULL); 1082 + switch (color_type) 1083 + { 1084 + case PNG_COLOR_TYPE_RGB: 1085 + for (w = 0; w < width; w++) 1086 + { 1087 + register png_byte r = row_pointer[boffset++]; 1088 + register png_byte g = row_pointer[boffset++]; 1089 + register png_byte b = row_pointer[boffset++]; 1090 + *p_out++ = r; 1091 + *p_out++ = g; 1092 + *p_out++ = b; 1093 + } 1094 + break; 1095 + case PNG_COLOR_TYPE_RGB_ALPHA: 1096 + for (w = 0; w < width; w++) 1097 + { 1098 + register png_byte r = row_pointer[boffset++]; 1099 + register png_byte g = row_pointer[boffset++]; 1100 + register png_byte b = row_pointer[boffset++]; 1101 + register png_byte alpha = row_pointer[boffset++]; 1102 + *p_out++ = r; 1103 + *p_out++ = g; 1104 + *p_out++ = b; 1105 + *p_out++ = alpha; 1106 + } 1107 + break; 1108 + case PNG_COLOR_TYPE_GRAY: 1109 + case PNG_COLOR_TYPE_GRAY_ALPHA: 1110 + for (w = 0; w < width; ++w) 1111 + { 1112 + register png_byte idx = row_pointer[w]; 1113 + *p_out++ = idx; 1114 + } 1115 + break; 1116 + default: 1117 + for (w = 0; w < width; ++w) 1118 + { 1119 + register png_byte idx = row_pointer[w]; 1120 + *p_out++ = idx; 1121 + } 1122 + } 1123 + } 1124 + img->next_row += height; 1125 + return GGRAPH_OK; 1126 +} 1127 + 1128 +static int 1129 +xgdImagePngCtxPalette (gGraphImagePtr img, xgdIOCtx * outfile, 1130 + int compression_level, int interlaced) 1131 +{ 1132 +/* compressing a PNG image [palette] */ 1133 + int i, j, bit_depth = 0, interlace_type; 1134 + int width = img->width; 1135 + int height = img->height; 1136 + png_color palette[256]; 1137 + int colors = img->max_palette; 1138 + png_structp png_ptr; 1139 + png_infop info_ptr; 1140 + png_bytep row_pointer = NULL; 1141 + int pass; 1142 + int num_passes; 1143 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1144 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, 1145 + &xgdPngJmpbufStruct, xgdPngErrorHandler, 1146 + NULL); 1147 +#else 1148 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 1149 +#endif 1150 + if (png_ptr == NULL) 1151 + return GGRAPH_INSUFFICIENT_MEMORY; 1152 + info_ptr = png_create_info_struct (png_ptr); 1153 + if (info_ptr == NULL) 1154 + { 1155 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1156 + return GGRAPH_INSUFFICIENT_MEMORY; 1157 + } 1158 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1159 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 1160 + { 1161 + if (row_pointer) 1162 + free (row_pointer); 1163 + png_destroy_write_struct (&png_ptr, &info_ptr); 1164 + return GGRAPH_PNG_CODEC_ERROR; 1165 + } 1166 +#endif 1167 + png_set_write_fn (png_ptr, (void *) outfile, xgdPngWriteData, 1168 + xgdPngFlushData); 1169 + png_set_compression_level (png_ptr, compression_level); 1170 + if (colors <= 2) 1171 + bit_depth = 1; 1172 + else if (colors <= 4) 1173 + bit_depth = 2; 1174 + else if (colors <= 16) 1175 + bit_depth = 4; 1176 + else 1177 + bit_depth = 8; 1178 + if (interlaced) 1179 + interlace_type = PNG_INTERLACE_ADAM7; 1180 + else 1181 + interlace_type = PNG_INTERLACE_NONE; 1182 + png_set_IHDR (png_ptr, info_ptr, width, height, bit_depth, 1183 + PNG_COLOR_TYPE_PALETTE, interlace_type, 1184 + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); 1185 + for (i = 0; i < colors; i++) 1186 + { 1187 + palette[i].red = img->palette_red[i]; 1188 + palette[i].green = img->palette_green[i]; 1189 + palette[i].blue = img->palette_blue[i]; 1190 + } 1191 + png_set_PLTE (png_ptr, info_ptr, palette, colors); 1192 + png_write_info (png_ptr, info_ptr); 1193 + png_set_packing (png_ptr); 1194 + if (overflow2 (sizeof (png_bytep), height)) 1195 + return GGRAPH_PNG_CODEC_ERROR; 1196 + row_pointer = malloc (width); 1197 + if (!row_pointer) 1198 + { 1199 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1200 + return GGRAPH_INSUFFICIENT_MEMORY; 1201 + } 1202 + num_passes = png_set_interlace_handling (png_ptr); 1203 + for (pass = 0; pass < num_passes; pass++) 1204 + { 1205 + /* Adam7 interlacing may require seven distinct images */ 1206 + for (j = 0; j < height; ++j) 1207 + { 1208 + png_bytep p_out = row_pointer; 1209 + unsigned char *p_in = img->pixels + (j * img->scanline_width); 1210 + for (i = 0; i < width; ++i) 1211 + *p_out++ = *p_in++; 1212 + png_write_row (png_ptr, row_pointer); 1213 + } 1214 + } 1215 + png_write_end (png_ptr, info_ptr); 1216 + free (row_pointer); 1217 + png_destroy_write_struct (&png_ptr, &info_ptr); 1218 + return GGRAPH_OK; 1219 +} 1220 + 1221 +static int 1222 +xgdStripImagePngCtxPalette (gGraphStripImagePtr img, xgdIOCtx * outfile, 1223 + int compression_level) 1224 +{ 1225 +/* preparing to compress a PNG image [palette] (by strip) */ 1226 + int i, bit_depth = 0, interlace_type; 1227 + int width = img->width; 1228 + int height = img->height; 1229 + png_color palette[256]; 1230 + int colors = img->max_palette; 1231 + png_structp png_ptr; 1232 + png_infop info_ptr; 1233 + png_bytep row_pointer = NULL; 1234 + struct png_codec_data *png_codec; 1235 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1236 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, 1237 + &xgdPngJmpbufStruct, xgdPngErrorHandler, 1238 + NULL); 1239 +#else 1240 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 1241 +#endif 1242 + if (png_ptr == NULL) 1243 + return GGRAPH_INSUFFICIENT_MEMORY; 1244 + info_ptr = png_create_info_struct (png_ptr); 1245 + if (info_ptr == NULL) 1246 + { 1247 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1248 + return GGRAPH_INSUFFICIENT_MEMORY; 1249 + } 1250 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1251 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 1252 + { 1253 + if (row_pointer) 1254 + free (row_pointer); 1255 + png_destroy_write_struct (&png_ptr, &info_ptr); 1256 + return GGRAPH_PNG_CODEC_ERROR; 1257 + } 1258 +#endif 1259 + png_set_write_fn (png_ptr, (void *) outfile, xgdPngWriteData, 1260 + xgdPngFlushData); 1261 + png_set_compression_level (png_ptr, compression_level); 1262 + if (colors <= 2) 1263 + bit_depth = 1; 1264 + else if (colors <= 4) 1265 + bit_depth = 2; 1266 + else if (colors <= 16) 1267 + bit_depth = 4; 1268 + else 1269 + bit_depth = 8; 1270 + interlace_type = PNG_INTERLACE_NONE; 1271 + png_set_IHDR (png_ptr, info_ptr, width, height, bit_depth, 1272 + PNG_COLOR_TYPE_PALETTE, interlace_type, 1273 + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); 1274 + for (i = 0; i < colors; i++) 1275 + { 1276 + palette[i].red = img->palette_red[i]; 1277 + palette[i].green = img->palette_green[i]; 1278 + palette[i].blue = img->palette_blue[i]; 1279 + } 1280 + png_set_PLTE (png_ptr, info_ptr, palette, colors); 1281 + png_write_info (png_ptr, info_ptr); 1282 + png_set_packing (png_ptr); 1283 + if (overflow2 (sizeof (png_bytep), height)) 1284 + return GGRAPH_PNG_CODEC_ERROR; 1285 + row_pointer = malloc (width * 3); 1286 + if (!row_pointer) 1287 + { 1288 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1289 + return GGRAPH_INSUFFICIENT_MEMORY; 1290 + } 1291 + 1292 +/* setting up the PNG codec struct */ 1293 + png_codec = malloc (sizeof (struct png_codec_data)); 1294 + if (!png_codec) 1295 + { 1296 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1297 + free (row_pointer); 1298 + gg_strip_image_destroy (img); 1299 + return GGRAPH_INSUFFICIENT_MEMORY; 1300 + } 1301 + png_codec->is_writer = 1; 1302 + png_codec->row_pointer = row_pointer; 1303 + png_codec->png_ptr = png_ptr; 1304 + png_codec->info_ptr = info_ptr; 1305 + png_codec->palette_allocated = PNG_FALSE; 1306 + png_codec->palette = NULL; 1307 + png_codec->bit_depth = bit_depth; 1308 + png_codec->color_type = PNG_COLOR_TYPE_GRAY; 1309 + png_codec->interlace_type = PNG_INTERLACE_NONE; 1310 + png_codec->quantization_factor = 0; 1311 + png_codec->io_ctx = outfile; 1312 + img->codec_data = png_codec; 1313 + 1314 + return GGRAPH_OK; 1315 +} 1316 + 1317 +static int 1318 +xgdImagePngCtxGrayscale (gGraphImagePtr img, xgdIOCtx * outfile, 1319 + int compression_level, int quantization_factor, 1320 + int interlaced) 1321 +{ 1322 +/* compressing a PNG image [grayscale] */ 1323 + int i, j, bit_depth = 0, interlace_type; 1324 + int width = img->width; 1325 + int height = img->height; 1326 + png_structp png_ptr; 1327 + png_infop info_ptr; 1328 + png_bytep row_pointer = NULL; 1329 + int pass; 1330 + int num_passes; 1331 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1332 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, 1333 + &xgdPngJmpbufStruct, xgdPngErrorHandler, 1334 + NULL); 1335 +#else 1336 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 1337 +#endif 1338 + if (png_ptr == NULL) 1339 + return GGRAPH_INSUFFICIENT_MEMORY; 1340 + info_ptr = png_create_info_struct (png_ptr); 1341 + if (info_ptr == NULL) 1342 + { 1343 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1344 + return GGRAPH_INSUFFICIENT_MEMORY; 1345 + } 1346 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1347 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 1348 + return GGRAPH_PNG_CODEC_ERROR; 1349 +#endif 1350 + png_set_write_fn (png_ptr, (void *) outfile, xgdPngWriteData, 1351 + xgdPngFlushData); 1352 + png_set_compression_level (png_ptr, compression_level); 1353 + bit_depth = 8; 1354 + if (interlaced) 1355 + interlace_type = PNG_INTERLACE_ADAM7; 1356 + else 1357 + interlace_type = PNG_INTERLACE_NONE; 1358 + png_set_IHDR (png_ptr, info_ptr, width, height, bit_depth, 1359 + PNG_COLOR_TYPE_GRAY, interlace_type, 1360 + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); 1361 + png_write_info (png_ptr, info_ptr); 1362 + png_set_packing (png_ptr); 1363 + if (overflow2 (sizeof (png_bytep), height)) 1364 + return GGRAPH_PNG_CODEC_ERROR; 1365 + row_pointer = malloc (width); 1366 + if (!row_pointer) 1367 + { 1368 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1369 + return GGRAPH_INSUFFICIENT_MEMORY; 1370 + } 1371 + num_passes = png_set_interlace_handling (png_ptr); 1372 + for (pass = 0; pass < num_passes; pass++) 1373 + { 1374 + /* Adam7 interlacing may require seven distinct images */ 1375 + for (j = 0; j < height; ++j) 1376 + { 1377 + png_bytep p_out = row_pointer; 1378 + unsigned char *p_in = img->pixels + (j * img->scanline_width); 1379 + for (i = 0; i < width; ++i) 1380 + { 1381 + int gray = *p_in++; 1382 + if (quantization_factor <= 0) 1383 + ; 1384 + else if (quantization_factor == 1) 1385 + gray |= 0x01; 1386 + else if (quantization_factor == 2) 1387 + gray |= 0x03; 1388 + else if (quantization_factor == 3) 1389 + gray |= 0x07; 1390 + else 1391 + gray |= 0x0f; 1392 + *p_out++ = gray; 1393 + } 1394 + png_write_row (png_ptr, row_pointer); 1395 + } 1396 + } 1397 + png_write_end (png_ptr, info_ptr); 1398 + free (row_pointer); 1399 + png_destroy_write_struct (&png_ptr, &info_ptr); 1400 + return GGRAPH_OK; 1401 +} 1402 + 1403 +static int 1404 +xgdStripImagePngCtxGrayscale (gGraphStripImagePtr img, xgdIOCtx * outfile, 1405 + int compression_level, int quantization_factor) 1406 +{ 1407 +/* preparing to compress a PNG image [grayscale] (by strip) */ 1408 + int bit_depth = 0, interlace_type; 1409 + int width = img->width; 1410 + int height = img->height; 1411 + png_structp png_ptr; 1412 + png_infop info_ptr; 1413 + png_bytep row_pointer = NULL; 1414 + struct png_codec_data *png_codec; 1415 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1416 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, 1417 + &xgdPngJmpbufStruct, xgdPngErrorHandler, 1418 + NULL); 1419 +#else 1420 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 1421 +#endif 1422 + if (png_ptr == NULL) 1423 + return GGRAPH_INSUFFICIENT_MEMORY; 1424 + info_ptr = png_create_info_struct (png_ptr); 1425 + if (info_ptr == NULL) 1426 + { 1427 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1428 + return GGRAPH_INSUFFICIENT_MEMORY; 1429 + } 1430 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1431 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 1432 + { 1433 + if (row_pointer) 1434 + free (row_pointer); 1435 + png_destroy_write_struct (&png_ptr, &info_ptr); 1436 + return GGRAPH_PNG_CODEC_ERROR; 1437 + } 1438 +#endif 1439 + png_set_write_fn (png_ptr, (void *) outfile, xgdPngWriteData, 1440 + xgdPngFlushData); 1441 + png_set_compression_level (png_ptr, compression_level); 1442 + bit_depth = 8; 1443 + interlace_type = PNG_INTERLACE_NONE; 1444 + png_set_IHDR (png_ptr, info_ptr, width, height, bit_depth, 1445 + PNG_COLOR_TYPE_GRAY, interlace_type, 1446 + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); 1447 + png_write_info (png_ptr, info_ptr); 1448 + png_set_packing (png_ptr); 1449 + if (overflow2 (sizeof (png_bytep), height)) 1450 + return GGRAPH_PNG_CODEC_ERROR; 1451 + row_pointer = malloc (width * 3); 1452 + if (!row_pointer) 1453 + { 1454 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1455 + return GGRAPH_INSUFFICIENT_MEMORY; 1456 + } 1457 + 1458 +/* setting up the PNG codec struct */ 1459 + png_codec = malloc (sizeof (struct png_codec_data)); 1460 + if (!png_codec) 1461 + { 1462 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1463 + free (row_pointer); 1464 + gg_strip_image_destroy (img); 1465 + return GGRAPH_INSUFFICIENT_MEMORY; 1466 + } 1467 + png_codec->is_writer = 1; 1468 + png_codec->row_pointer = row_pointer; 1469 + png_codec->png_ptr = png_ptr; 1470 + png_codec->info_ptr = info_ptr; 1471 + png_codec->palette_allocated = PNG_FALSE; 1472 + png_codec->palette = NULL; 1473 + png_codec->bit_depth = bit_depth; 1474 + png_codec->color_type = PNG_COLOR_TYPE_GRAY; 1475 + png_codec->interlace_type = PNG_INTERLACE_NONE; 1476 + png_codec->quantization_factor = quantization_factor; 1477 + png_codec->io_ctx = outfile; 1478 + img->codec_data = png_codec; 1479 + 1480 + return GGRAPH_OK; 1481 +} 1482 + 1483 +static int 1484 +xgdImagePngCtxRgb (gGraphImagePtr img, xgdIOCtx * outfile, 1485 + int compression_level, int quantization_factor, 1486 + int interlaced) 1487 +{ 1488 +/* compressing a PNG image [RGB] */ 1489 + int i, j, bit_depth = 0, interlace_type; 1490 + int width = img->width; 1491 + int height = img->height; 1492 + png_structp png_ptr; 1493 + png_infop info_ptr; 1494 + png_bytep row_pointer = NULL; 1495 + int pass; 1496 + int num_passes; 1497 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1498 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, 1499 + &xgdPngJmpbufStruct, xgdPngErrorHandler, 1500 + NULL); 1501 +#else 1502 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 1503 +#endif 1504 + if (png_ptr == NULL) 1505 + return GGRAPH_INSUFFICIENT_MEMORY; 1506 + info_ptr = png_create_info_struct (png_ptr); 1507 + if (info_ptr == NULL) 1508 + { 1509 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1510 + return GGRAPH_INSUFFICIENT_MEMORY; 1511 + } 1512 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1513 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 1514 + { 1515 + if (row_pointer) 1516 + free (row_pointer); 1517 + png_destroy_write_struct (&png_ptr, &info_ptr); 1518 + return GGRAPH_PNG_CODEC_ERROR; 1519 + } 1520 +#endif 1521 + png_set_write_fn (png_ptr, (void *) outfile, xgdPngWriteData, 1522 + xgdPngFlushData); 1523 + png_set_compression_level (png_ptr, compression_level); 1524 + bit_depth = 8; 1525 + if (interlaced) 1526 + interlace_type = PNG_INTERLACE_ADAM7; 1527 + else 1528 + interlace_type = PNG_INTERLACE_NONE; 1529 + png_set_IHDR (png_ptr, info_ptr, width, height, bit_depth, 1530 + PNG_COLOR_TYPE_RGB, interlace_type, 1531 + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); 1532 + png_write_info (png_ptr, info_ptr); 1533 + png_set_packing (png_ptr); 1534 + if (overflow2 (sizeof (png_bytep), height)) 1535 + return GGRAPH_PNG_CODEC_ERROR; 1536 + row_pointer = malloc (width * 3); 1537 + if (!row_pointer) 1538 + { 1539 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1540 + return GGRAPH_INSUFFICIENT_MEMORY; 1541 + } 1542 + num_passes = png_set_interlace_handling (png_ptr); 1543 + for (pass = 0; pass < num_passes; pass++) 1544 + { 1545 + /* Adam7 interlacing may require seven distinct images */ 1546 + for (j = 0; j < height; j++) 1547 + { 1548 + png_bytep p_out = row_pointer; 1549 + unsigned char *p_in = img->pixels + (j * img->scanline_width); 1550 + for (i = 0; i < width; ++i) 1551 + { 1552 + unsigned char r; 1553 + unsigned char g; 1554 + unsigned char b; 1555 + if (img->pixel_format == GG_PIXEL_RGB) 1556 + { 1557 + r = *p_in++; 1558 + g = *p_in++; 1559 + b = *p_in++; 1560 + } 1561 + else if (img->pixel_format == GG_PIXEL_BGR) 1562 + { 1563 + b = *p_in++; 1564 + g = *p_in++; 1565 + r = *p_in++; 1566 + } 1567 + if (quantization_factor <= 0) 1568 + ; 1569 + else if (quantization_factor == 1) 1570 + { 1571 + r |= 0x01; 1572 + g |= 0x01; 1573 + b |= 0x01; 1574 + } 1575 + else if (quantization_factor == 2) 1576 + { 1577 + r |= 0x03; 1578 + g |= 0x03; 1579 + b |= 0x03; 1580 + } 1581 + else if (quantization_factor == 3) 1582 + { 1583 + r |= 0x07; 1584 + g |= 0x07; 1585 + b |= 0x07; 1586 + } 1587 + else 1588 + { 1589 + r |= 0x0f; 1590 + g |= 0x0f; 1591 + b |= 0x0f; 1592 + } 1593 + *p_out++ = r; 1594 + *p_out++ = g; 1595 + *p_out++ = b; 1596 + } 1597 + png_write_row (png_ptr, row_pointer); 1598 + } 1599 + } 1600 + png_write_end (png_ptr, info_ptr); 1601 + free (row_pointer); 1602 + png_destroy_write_struct (&png_ptr, &info_ptr); 1603 + return GGRAPH_OK; 1604 +} 1605 + 1606 +static int 1607 +xgdStripImagePngCtxRgb (gGraphStripImagePtr img, xgdIOCtx * outfile, 1608 + int compression_level, int quantization_factor) 1609 +{ 1610 +/* preparing to compress a PNG image [RGB] (by strip) */ 1611 + int bit_depth = 0, interlace_type; 1612 + int width = img->width; 1613 + int height = img->height; 1614 + png_structp png_ptr; 1615 + png_infop info_ptr; 1616 + png_bytep row_pointer = NULL; 1617 + struct png_codec_data *png_codec; 1618 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1619 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, 1620 + &xgdPngJmpbufStruct, xgdPngErrorHandler, 1621 + NULL); 1622 +#else 1623 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 1624 +#endif 1625 + if (png_ptr == NULL) 1626 + return GGRAPH_INSUFFICIENT_MEMORY; 1627 + info_ptr = png_create_info_struct (png_ptr); 1628 + if (info_ptr == NULL) 1629 + { 1630 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1631 + return GGRAPH_INSUFFICIENT_MEMORY; 1632 + } 1633 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1634 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 1635 + { 1636 + if (row_pointer) 1637 + free (row_pointer); 1638 + png_destroy_write_struct (&png_ptr, &info_ptr); 1639 + return GGRAPH_PNG_CODEC_ERROR; 1640 + } 1641 +#endif 1642 + png_set_write_fn (png_ptr, (void *) outfile, xgdPngWriteData, 1643 + xgdPngFlushData); 1644 + png_set_compression_level (png_ptr, compression_level); 1645 + bit_depth = 8; 1646 + interlace_type = PNG_INTERLACE_NONE; 1647 + png_set_IHDR (png_ptr, info_ptr, width, height, bit_depth, 1648 + PNG_COLOR_TYPE_RGB, interlace_type, 1649 + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); 1650 + png_write_info (png_ptr, info_ptr); 1651 + png_set_packing (png_ptr); 1652 + if (overflow2 (sizeof (png_bytep), height)) 1653 + return GGRAPH_PNG_CODEC_ERROR; 1654 + row_pointer = malloc (width * 3); 1655 + if (!row_pointer) 1656 + { 1657 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1658 + return GGRAPH_INSUFFICIENT_MEMORY; 1659 + } 1660 + 1661 +/* setting up the PNG codec struct */ 1662 + png_codec = malloc (sizeof (struct png_codec_data)); 1663 + if (!png_codec) 1664 + { 1665 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1666 + free (row_pointer); 1667 + gg_strip_image_destroy (img); 1668 + return GGRAPH_INSUFFICIENT_MEMORY; 1669 + } 1670 + png_codec->is_writer = 1; 1671 + png_codec->row_pointer = row_pointer; 1672 + png_codec->png_ptr = png_ptr; 1673 + png_codec->info_ptr = info_ptr; 1674 + png_codec->palette_allocated = PNG_FALSE; 1675 + png_codec->palette = NULL; 1676 + png_codec->bit_depth = bit_depth; 1677 + png_codec->color_type = PNG_COLOR_TYPE_RGB; 1678 + png_codec->interlace_type = PNG_INTERLACE_NONE; 1679 + png_codec->quantization_factor = quantization_factor; 1680 + png_codec->io_ctx = outfile; 1681 + img->codec_data = png_codec; 1682 + 1683 + return GGRAPH_OK; 1684 +} 1685 + 1686 +static int 1687 +xgdImagePngCtxRgbAlpha (gGraphImagePtr img, xgdIOCtx * outfile, 1688 + int compression_level, int quantization_factor, 1689 + int interlaced) 1690 +{ 1691 +/* compressing a PNG image [RGBA] */ 1692 + int i, j, bit_depth = 0, interlace_type; 1693 + int width = img->width; 1694 + int height = img->height; 1695 + png_structp png_ptr; 1696 + png_infop info_ptr; 1697 + png_bytep row_pointer = NULL; 1698 + int pass; 1699 + int num_passes; 1700 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1701 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, 1702 + &xgdPngJmpbufStruct, xgdPngErrorHandler, 1703 + NULL); 1704 +#else 1705 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 1706 +#endif 1707 + if (png_ptr == NULL) 1708 + return GGRAPH_INSUFFICIENT_MEMORY; 1709 + info_ptr = png_create_info_struct (png_ptr); 1710 + if (info_ptr == NULL) 1711 + { 1712 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1713 + return GGRAPH_INSUFFICIENT_MEMORY; 1714 + } 1715 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1716 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 1717 + { 1718 + if (row_pointer) 1719 + free (row_pointer); 1720 + png_destroy_write_struct (&png_ptr, &info_ptr); 1721 + return GGRAPH_PNG_CODEC_ERROR; 1722 + } 1723 +#endif 1724 + png_set_write_fn (png_ptr, (void *) outfile, xgdPngWriteData, 1725 + xgdPngFlushData); 1726 + png_set_compression_level (png_ptr, compression_level); 1727 + bit_depth = 8; 1728 + if (interlaced) 1729 + interlace_type = PNG_INTERLACE_ADAM7; 1730 + else 1731 + interlace_type = PNG_INTERLACE_NONE; 1732 + png_set_IHDR (png_ptr, info_ptr, width, height, bit_depth, 1733 + PNG_COLOR_TYPE_RGB_ALPHA, interlace_type, 1734 + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); 1735 + png_write_info (png_ptr, info_ptr); 1736 + png_set_packing (png_ptr); 1737 + if (overflow2 (sizeof (png_bytep), height)) 1738 + return GGRAPH_PNG_CODEC_ERROR; 1739 + row_pointer = malloc (width * 4); 1740 + if (!row_pointer) 1741 + { 1742 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1743 + return GGRAPH_INSUFFICIENT_MEMORY; 1744 + } 1745 + num_passes = png_set_interlace_handling (png_ptr); 1746 + for (pass = 0; pass < num_passes; pass++) 1747 + { 1748 + /* Adam7 interlacing may require seven distinct images */ 1749 + for (j = 0; j < height; ++j) 1750 + { 1751 + png_bytep p_out = row_pointer; 1752 + unsigned char *p_in = img->pixels + (j * img->scanline_width); 1753 + for (i = 0; i < width; ++i) 1754 + { 1755 + unsigned char r; 1756 + unsigned char g; 1757 + unsigned char b; 1758 + unsigned char alpha; 1759 + if (img->pixel_format == GG_PIXEL_RGBA) 1760 + { 1761 + r = *p_in++; 1762 + g = *p_in++; 1763 + b = *p_in++; 1764 + alpha = *p_in++; 1765 + } 1766 + else if (img->pixel_format == GG_PIXEL_ARGB) 1767 + { 1768 + alpha = *p_in++; 1769 + r = *p_in++; 1770 + g = *p_in++; 1771 + b = *p_in++; 1772 + } 1773 + else if (img->pixel_format == GG_PIXEL_BGRA) 1774 + { 1775 + b = *p_in++; 1776 + g = *p_in++; 1777 + r = *p_in++; 1778 + alpha = *p_in++; 1779 + } 1780 + else if (img->pixel_format == GG_PIXEL_RGB) 1781 + { 1782 + r = *p_in++; 1783 + g = *p_in++; 1784 + b = *p_in++; 1785 + if (r == img->transparent_red 1786 + && g == img->transparent_green 1787 + && b == img->transparent_blue) 1788 + alpha = 0; 1789 + else 1790 + alpha = 255; 1791 + } 1792 + else if (img->pixel_format == GG_PIXEL_BGR) 1793 + { 1794 + b = *p_in++; 1795 + g = *p_in++; 1796 + r = *p_in++; 1797 + if (r == img->transparent_red 1798 + && g == img->transparent_green 1799 + && b == img->transparent_blue) 1800 + alpha = 0; 1801 + else 1802 + alpha = 255; 1803 + } 1804 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 1805 + { 1806 + r = *p_in++; 1807 + g = r; 1808 + b = r; 1809 + if (r == img->transparent_red 1810 + && g == img->transparent_green 1811 + && b == img->transparent_blue) 1812 + alpha = 0; 1813 + else 1814 + alpha = 255; 1815 + } 1816 + else if (img->pixel_format == GG_PIXEL_PALETTE) 1817 + { 1818 + int idx = *p_in++; 1819 + r = img->palette_red[idx]; 1820 + g = img->palette_green[idx]; 1821 + b = img->palette_blue[idx]; 1822 + if (r == img->transparent_red 1823 + && g == img->transparent_green 1824 + && b == img->transparent_blue) 1825 + alpha = 0; 1826 + else 1827 + alpha = 255; 1828 + } 1829 + if (quantization_factor <= 0) 1830 + ; 1831 + else if (quantization_factor == 1) 1832 + { 1833 + r |= 0x01; 1834 + g |= 0x01; 1835 + b |= 0x01; 1836 + } 1837 + else if (quantization_factor == 2) 1838 + { 1839 + r |= 0x03; 1840 + g |= 0x03; 1841 + b |= 0x03; 1842 + } 1843 + else if (quantization_factor == 3) 1844 + { 1845 + r |= 0x07; 1846 + g |= 0x07; 1847 + b |= 0x07; 1848 + } 1849 + else 1850 + { 1851 + r |= 0x0f; 1852 + g |= 0x0f; 1853 + b |= 0x0f; 1854 + } 1855 + *p_out++ = r; 1856 + *p_out++ = g; 1857 + *p_out++ = b; 1858 + *p_out++ = alpha; 1859 + } 1860 + png_write_row (png_ptr, row_pointer); 1861 + } 1862 + } 1863 + png_write_end (png_ptr, info_ptr); 1864 + free (row_pointer); 1865 + png_destroy_write_struct (&png_ptr, &info_ptr); 1866 + return GGRAPH_OK; 1867 +} 1868 + 1869 +static int 1870 +xgdStripImagePngCtxRgbAlpha (gGraphStripImagePtr img, xgdIOCtx * outfile, 1871 + int compression_level, int quantization_factor) 1872 +{ 1873 +/* preparing to compress a PNG image [RGBA] (by strip) */ 1874 + int bit_depth = 0, interlace_type; 1875 + int width = img->width; 1876 + int height = img->height; 1877 + png_structp png_ptr; 1878 + png_infop info_ptr; 1879 + png_bytep row_pointer = NULL; 1880 + struct png_codec_data *png_codec; 1881 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1882 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, 1883 + &xgdPngJmpbufStruct, xgdPngErrorHandler, 1884 + NULL); 1885 +#else 1886 + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 1887 +#endif 1888 + if (png_ptr == NULL) 1889 + return GGRAPH_INSUFFICIENT_MEMORY; 1890 + info_ptr = png_create_info_struct (png_ptr); 1891 + if (info_ptr == NULL) 1892 + { 1893 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1894 + return GGRAPH_INSUFFICIENT_MEMORY; 1895 + } 1896 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1897 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 1898 + { 1899 + if (row_pointer) 1900 + free (row_pointer); 1901 + png_destroy_write_struct (&png_ptr, &info_ptr); 1902 + return GGRAPH_PNG_CODEC_ERROR; 1903 + } 1904 +#endif 1905 + png_set_write_fn (png_ptr, (void *) outfile, xgdPngWriteData, 1906 + xgdPngFlushData); 1907 + png_set_compression_level (png_ptr, compression_level); 1908 + bit_depth = 8; 1909 + interlace_type = PNG_INTERLACE_NONE; 1910 + png_set_IHDR (png_ptr, info_ptr, width, height, bit_depth, 1911 + PNG_COLOR_TYPE_RGB_ALPHA, interlace_type, 1912 + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); 1913 + png_write_info (png_ptr, info_ptr); 1914 + png_set_packing (png_ptr); 1915 + if (overflow2 (sizeof (png_bytep), height)) 1916 + return GGRAPH_PNG_CODEC_ERROR; 1917 + row_pointer = malloc (width * 4); 1918 + if (!row_pointer) 1919 + { 1920 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1921 + return GGRAPH_INSUFFICIENT_MEMORY; 1922 + } 1923 + 1924 +/* setting up the PNG codec struct */ 1925 + png_codec = malloc (sizeof (struct png_codec_data)); 1926 + if (!png_codec) 1927 + { 1928 + png_destroy_write_struct (&png_ptr, (png_infopp) NULL); 1929 + free (row_pointer); 1930 + gg_strip_image_destroy (img); 1931 + return GGRAPH_INSUFFICIENT_MEMORY; 1932 + } 1933 + png_codec->is_writer = 1; 1934 + png_codec->row_pointer = row_pointer; 1935 + png_codec->png_ptr = png_ptr; 1936 + png_codec->info_ptr = info_ptr; 1937 + png_codec->palette_allocated = PNG_FALSE; 1938 + png_codec->palette = NULL; 1939 + png_codec->bit_depth = bit_depth; 1940 + png_codec->color_type = PNG_COLOR_TYPE_RGB_ALPHA; 1941 + png_codec->interlace_type = PNG_INTERLACE_NONE; 1942 + png_codec->quantization_factor = quantization_factor; 1943 + png_codec->io_ctx = outfile; 1944 + img->codec_data = png_codec; 1945 + 1946 + return GGRAPH_OK; 1947 +} 1948 + 1949 +static int 1950 +xgdStripImagePngCtx (gGraphStripImagePtr img) 1951 +{ 1952 +/* compressing a PNG image [by strip] */ 1953 + int i, j; 1954 + int width = img->width; 1955 + int height = img->height; 1956 + struct png_codec_data *png_codec = 1957 + (struct png_codec_data *) (img->codec_data); 1958 + png_structp png_ptr = png_codec->png_ptr; 1959 + png_bytep row_pointer = png_codec->row_pointer; 1960 + int quantization_factor = png_codec->quantization_factor; 1961 + 1962 + if (img->next_row >= img->height) 1963 + { 1964 + /* EOF condition */ 1965 + fprintf (stderr, "png-wrapper error: attempting to write beyond EOF"); 1966 + return GGRAPH_PNG_CODEC_ERROR; 1967 + } 1968 + height = img->current_available_rows; 1969 + 1970 +#ifndef PNG_SETJMP_NOT_SUPPORTED 1971 + if (setjmp (xgdPngJmpbufStruct.jmpbuf)) 1972 + return GGRAPH_PNG_CODEC_ERROR; 1973 +#endif 1974 + for (j = 0; j < height; ++j) 1975 + { 1976 + png_bytep p_out = row_pointer; 1977 + unsigned char *p_in = img->pixels + (j * img->scanline_width); 1978 + for (i = 0; i < width; ++i) 1979 + { 1980 + unsigned char r; 1981 + unsigned char g; 1982 + unsigned char b; 1983 + unsigned char alpha; 1984 + if (img->pixel_format == GG_PIXEL_PALETTE 1985 + || img->pixel_format == GG_PIXEL_GRAYSCALE) 1986 + { 1987 + /* simply copying pixels */ 1988 + *p_out++ = *p_in++; 1989 + continue; 1990 + } 1991 + 1992 + /* expected to be RGB or RGB-Alpha */ 1993 + if (img->pixel_format == GG_PIXEL_RGBA) 1994 + { 1995 + r = *p_in++; 1996 + g = *p_in++; 1997 + b = *p_in++; 1998 + alpha = *p_in++; 1999 + } 2000 + else 2001 + { 2002 + r = *p_in++; 2003 + g = *p_in++; 2004 + b = *p_in++; 2005 + } 2006 + 2007 + /* applying color quantization (if required) */ 2008 + if (quantization_factor <= 0) 2009 + ; 2010 + else if (quantization_factor == 1) 2011 + { 2012 + r |= 0x01; 2013 + g |= 0x01; 2014 + b |= 0x01; 2015 + } 2016 + else if (quantization_factor == 2) 2017 + { 2018 + r |= 0x03; 2019 + g |= 0x03; 2020 + b |= 0x03; 2021 + } 2022 + else if (quantization_factor == 3) 2023 + { 2024 + r |= 0x07; 2025 + g |= 0x07; 2026 + b |= 0x07; 2027 + } 2028 + else 2029 + { 2030 + r |= 0x0f; 2031 + g |= 0x0f; 2032 + b |= 0x0f; 2033 + } 2034 + 2035 + /* outputting the pixel */ 2036 + if (img->pixel_format == GG_PIXEL_RGBA) 2037 + { 2038 + *p_out++ = r; 2039 + *p_out++ = g; 2040 + *p_out++ = b; 2041 + *p_out++ = alpha; 2042 + } 2043 + else 2044 + { 2045 + *p_out++ = r; 2046 + *p_out++ = g; 2047 + *p_out++ = b; 2048 + } 2049 + } 2050 + png_write_row (png_ptr, row_pointer); 2051 + } 2052 + img->next_row += height; 2053 + return GGRAPH_OK; 2054 +} 2055 + 2056 +static int 2057 +image_to_png_palette (const gGraphImagePtr img, void **mem_buf, 2058 + int *mem_buf_size, FILE * file, int dest_type, 2059 + int compression_level, int interlaced) 2060 +{ 2061 +/* compressing an image as PNG PALETTE */ 2062 + int ret; 2063 + void *rv; 2064 + int size; 2065 + xgdIOCtx *out; 2066 + 2067 +/* checkings args for validity */ 2068 + if (dest_type == GG_TARGET_IS_FILE) 2069 + { 2070 + if (!file) 2071 + return GGRAPH_ERROR; 2072 + } 2073 + else 2074 + { 2075 + if (!mem_buf || !mem_buf_size) 2076 + return GGRAPH_ERROR; 2077 + *mem_buf = NULL; 2078 + *mem_buf_size = 0; 2079 + } 2080 + 2081 + if (dest_type == GG_TARGET_IS_FILE) 2082 + out = xgdNewDynamicCtx (0, file, dest_type); 2083 + else 2084 + out = xgdNewDynamicCtx (2048, NULL, dest_type); 2085 + if (compression_level < 0 || compression_level > 9) 2086 + compression_level = 4; 2087 + ret = xgdImagePngCtxPalette (img, out, compression_level, interlaced); 2088 + if (dest_type == GG_TARGET_IS_FILE) 2089 + { 2090 + out->xgd_free (out); 2091 + return ret; 2092 + } 2093 + 2094 + if (ret == GGRAPH_OK) 2095 + rv = xgdDPExtractData (out, &size); 2096 + out->xgd_free (out); 2097 + *mem_buf = rv; 2098 + *mem_buf_size = size; 2099 + return ret; 2100 +} 2101 + 2102 +static int 2103 +image_prepare_to_png_palette_by_strip (const gGraphStripImagePtr img, 2104 + FILE * file, int compression_level) 2105 +{ 2106 +/* preparing to compress an image as PNG PALETTE [by strip] */ 2107 + xgdIOCtx *out; 2108 + 2109 +/* checkings args for validity */ 2110 + if (!file) 2111 + return GGRAPH_ERROR; 2112 + 2113 + out = xgdNewDynamicCtx (0, file, GG_TARGET_IS_FILE); 2114 + if (compression_level < 0 || compression_level > 9) 2115 + compression_level = 4; 2116 + return xgdStripImagePngCtxPalette (img, out, compression_level); 2117 +} 2118 + 2119 +static int 2120 +image_to_png_grayscale (const gGraphImagePtr img, void **mem_buf, 2121 + int *mem_buf_size, FILE * file, int dest_type, 2122 + int compression_level, int quantization_factor, 2123 + int interlaced) 2124 +{ 2125 +/* compressing an image as PNG GRAYSCALE */ 2126 + int ret; 2127 + void *rv; 2128 + int size; 2129 + xgdIOCtx *out; 2130 + 2131 +/* checkings args for validity */ 2132 + if (dest_type == GG_TARGET_IS_FILE) 2133 + { 2134 + if (!file) 2135 + return GGRAPH_ERROR; 2136 + } 2137 + else 2138 + { 2139 + if (!mem_buf || !mem_buf_size) 2140 + return GGRAPH_ERROR; 2141 + *mem_buf = NULL; 2142 + *mem_buf_size = 0; 2143 + } 2144 + 2145 + if (dest_type == GG_TARGET_IS_FILE) 2146 + out = xgdNewDynamicCtx (0, file, dest_type); 2147 + else 2148 + out = xgdNewDynamicCtx (2048, NULL, dest_type); 2149 + if (compression_level < 0 || compression_level > 9) 2150 + compression_level = 4; 2151 + ret = 2152 + xgdImagePngCtxGrayscale (img, out, compression_level, 2153 + quantization_factor, interlaced); 2154 + if (dest_type == GG_TARGET_IS_FILE) 2155 + { 2156 + out->xgd_free (out); 2157 + return ret; 2158 + } 2159 + 2160 + if (ret == GGRAPH_OK) 2161 + rv = xgdDPExtractData (out, &size); 2162 + out->xgd_free (out); 2163 + *mem_buf = rv; 2164 + *mem_buf_size = size; 2165 + return ret; 2166 +} 2167 + 2168 +static int 2169 +image_prepare_to_png_grayscale_by_strip (const gGraphStripImagePtr img, 2170 + FILE * file, int compression_level, 2171 + int quantization_factor) 2172 +{ 2173 +/* preparing to compress an image as PNG GRAYSCALE [by strip] */ 2174 + xgdIOCtx *out; 2175 + 2176 +/* checkings args for validity */ 2177 + if (!file) 2178 + return GGRAPH_ERROR; 2179 + 2180 + out = xgdNewDynamicCtx (0, file, GG_TARGET_IS_FILE); 2181 + if (compression_level < 0 || compression_level > 9) 2182 + compression_level = 4; 2183 + return xgdStripImagePngCtxGrayscale (img, out, compression_level, 2184 + quantization_factor); 2185 +} 2186 + 2187 +static int 2188 +image_to_png_rgb (const gGraphImagePtr img, void **mem_buf, int *mem_buf_size, 2189 + FILE * file, int dest_type, int compression_level, 2190 + int quantization_factor, int interlaced) 2191 +{ 2192 +/* compressing an image as PNG RGB */ 2193 + int ret; 2194 + void *rv; 2195 + int size; 2196 + xgdIOCtx *out; 2197 + 2198 +/* checkings args for validity */ 2199 + if (dest_type == GG_TARGET_IS_FILE) 2200 + { 2201 + if (!file) 2202 + return GGRAPH_ERROR; 2203 + } 2204 + else 2205 + { 2206 + if (!mem_buf || !mem_buf_size) 2207 + return GGRAPH_ERROR; 2208 + *mem_buf = NULL; 2209 + *mem_buf_size = 0; 2210 + } 2211 + 2212 + if (dest_type == GG_TARGET_IS_FILE) 2213 + out = xgdNewDynamicCtx (0, file, dest_type); 2214 + else 2215 + out = xgdNewDynamicCtx (2048, NULL, dest_type); 2216 + if (compression_level < 0 || compression_level > 9) 2217 + compression_level = 4; 2218 + ret = 2219 + xgdImagePngCtxRgb (img, out, compression_level, quantization_factor, 2220 + interlaced); 2221 + if (dest_type == GG_TARGET_IS_FILE) 2222 + { 2223 + out->xgd_free (out); 2224 + return ret; 2225 + } 2226 + 2227 + if (ret == GGRAPH_OK) 2228 + rv = xgdDPExtractData (out, &size); 2229 + out->xgd_free (out); 2230 + *mem_buf = rv; 2231 + *mem_buf_size = size; 2232 + return ret; 2233 +} 2234 + 2235 +static int 2236 +image_prepare_to_png_rgb_by_strip (const gGraphStripImagePtr img, FILE * file, 2237 + int compression_level, 2238 + int quantization_factor) 2239 +{ 2240 +/* preparing to compress an image as PNG RGB [by strip] */ 2241 + xgdIOCtx *out; 2242 + 2243 +/* checkings args for validity */ 2244 + if (!file) 2245 + return GGRAPH_ERROR; 2246 + 2247 + out = xgdNewDynamicCtx (0, file, GG_TARGET_IS_FILE); 2248 + if (compression_level < 0 || compression_level > 9) 2249 + compression_level = 4; 2250 + return xgdStripImagePngCtxRgb (img, out, compression_level, 2251 + quantization_factor); 2252 +} 2253 + 2254 +static int 2255 +image_to_png_rgba (const gGraphImagePtr img, void **mem_buf, int *mem_buf_size, 2256 + FILE * file, int dest_type, int compression_level, 2257 + int quantization_factor, int interlaced) 2258 +{ 2259 +/* compressing an image as PNG RGBA */ 2260 + int ret; 2261 + void *rv; 2262 + int size; 2263 + xgdIOCtx *out; 2264 + 2265 +/* checkings args for validity */ 2266 + if (dest_type == GG_TARGET_IS_FILE) 2267 + { 2268 + if (!file) 2269 + return GGRAPH_ERROR; 2270 + } 2271 + else 2272 + { 2273 + if (!mem_buf || !mem_buf_size) 2274 + return GGRAPH_ERROR; 2275 + *mem_buf = NULL; 2276 + *mem_buf_size = 0; 2277 + } 2278 + 2279 + if (dest_type == GG_TARGET_IS_FILE) 2280 + out = xgdNewDynamicCtx (0, file, dest_type); 2281 + else 2282 + out = xgdNewDynamicCtx (2048, NULL, dest_type); 2283 + if (compression_level < 0 || compression_level > 9) 2284 + compression_level = 4; 2285 + ret = 2286 + xgdImagePngCtxRgbAlpha (img, out, compression_level, 2287 + quantization_factor, interlaced); 2288 + if (dest_type == GG_TARGET_IS_FILE) 2289 + { 2290 + out->xgd_free (out); 2291 + return ret; 2292 + } 2293 + 2294 + if (ret == GGRAPH_OK) 2295 + rv = xgdDPExtractData (out, &size); 2296 + out->xgd_free (out); 2297 + *mem_buf = rv; 2298 + *mem_buf_size = size; 2299 + return ret; 2300 +} 2301 + 2302 +static int 2303 +image_prepare_to_png_rgba_by_strip (const gGraphStripImagePtr img, FILE * file, 2304 + int compression_level, 2305 + int quantization_factor) 2306 +{ 2307 +/* preparing to compress an image as PNG RGBA [by strip] */ 2308 + xgdIOCtx *out; 2309 + 2310 +/* checkings args for validity */ 2311 + if (!file) 2312 + return GGRAPH_ERROR; 2313 + 2314 + out = xgdNewDynamicCtx (0, file, GG_TARGET_IS_FILE); 2315 + if (compression_level < 0 || compression_level > 9) 2316 + compression_level = 4; 2317 + return xgdStripImagePngCtxRgbAlpha (img, out, compression_level, 2318 + quantization_factor); 2319 +} 2320 + 2321 +GGRAPH_PRIVATE int 2322 +gg_image_to_png (const gGraphImagePtr img, void **mem_buf, int *mem_buf_size, 2323 + FILE * file, int dest_type, int compression_level, 2324 + int quantization_factor, int interlaced, int is_transparent) 2325 +{ 2326 +/* dispatching PNG compression */ 2327 + if (img->pixel_format == GG_PIXEL_RGBA || img->pixel_format == GG_PIXEL_ARGB 2328 + || img->pixel_format == GG_PIXEL_BGRA || is_transparent) 2329 + return image_to_png_rgba (img, mem_buf, mem_buf_size, file, dest_type, 2330 + compression_level, quantization_factor, 2331 + interlaced); 2332 + if (img->pixel_format == GG_PIXEL_PALETTE) 2333 + return image_to_png_palette (img, mem_buf, mem_buf_size, file, 2334 + dest_type, compression_level, interlaced); 2335 + if (img->pixel_format == GG_PIXEL_GRAYSCALE) 2336 + return image_to_png_grayscale (img, mem_buf, mem_buf_size, file, 2337 + dest_type, compression_level, 2338 + quantization_factor, interlaced); 2339 + return image_to_png_rgb (img, mem_buf, mem_buf_size, file, dest_type, 2340 + compression_level, quantization_factor, 2341 + interlaced); 2342 +} 2343 + 2344 +GGRAPH_PRIVATE int 2345 +gg_image_prepare_to_png_by_strip (const gGraphStripImagePtr img, 2346 + FILE * file, int compression_level, 2347 + int quantization_factor) 2348 +{ 2349 +/* dispatching PNG compression [by strip] */ 2350 + if (img->pixel_format == GG_PIXEL_PALETTE) 2351 + return image_prepare_to_png_palette_by_strip (img, file, 2352 + compression_level); 2353 + if (img->pixel_format == GG_PIXEL_GRAYSCALE) 2354 + return image_prepare_to_png_grayscale_by_strip (img, file, 2355 + compression_level, 2356 + quantization_factor); 2357 + if (img->pixel_format == GG_PIXEL_RGBA || img->pixel_format == GG_PIXEL_ARGB 2358 + || img->pixel_format == GG_PIXEL_BGRA) 2359 + return image_prepare_to_png_rgba_by_strip (img, file, compression_level, 2360 + quantization_factor); 2361 + return image_prepare_to_png_rgb_by_strip (img, file, compression_level, 2362 + quantization_factor); 2363 +} 2364 + 2365 +GGRAPH_PRIVATE int 2366 +gg_image_write_to_png_by_strip (const gGraphStripImagePtr img, int *progress) 2367 +{ 2368 +/* scanline(s) PNG compression [by strip] */ 2369 + int ret = xgdStripImagePngCtx (img); 2370 + if (ret == GGRAPH_OK && progress != NULL) 2371 + *progress = 2372 + (int) (((double) (img->next_row + 1) * 100.0) / 2373 + (double) (img->height)); 2374 + return ret; 2375 +} 2376 + 2377 +GGRAPH_PRIVATE int 2378 +gg_image_from_png (int size, const void *data, int source_type, 2379 + gGraphImagePtr * image_handle, int scale) 2380 +{ 2381 +/* uncompressing a PNG */ 2382 + int errcode = GGRAPH_OK; 2383 + gGraphImagePtr img; 2384 + xgdIOCtx *in = 2385 + xgdNewDynamicCtxEx (size, data, XGD_CTX_DONT_FREE, source_type); 2386 + img = xgdImageCreateFromPngCtx (in, &errcode, scale); 2387 + in->xgd_free (in); 2388 + *image_handle = img; 2389 + return errcode; 2390 +} 2391 + 2392 +GGRAPH_PRIVATE int 2393 +gg_image_infos_from_png (int size, const void *data, int source_type, 2394 + gGraphImageInfosPtr * infos_handle) 2395 +{ 2396 +/* image infos from PNG */ 2397 + int errcode = GGRAPH_OK; 2398 + gGraphImageInfosPtr infos; 2399 + xgdIOCtx *in = 2400 + xgdNewDynamicCtxEx (size, data, XGD_CTX_DONT_FREE, source_type); 2401 + infos = xgdImageInfosFromPngCtx (in, &errcode); 2402 + in->xgd_free (in); 2403 + *infos_handle = infos; 2404 + return errcode; 2405 +} 2406 + 2407 +GGRAPH_PRIVATE int 2408 +gg_image_strip_prepare_from_png (FILE * file, 2409 + gGraphStripImagePtr * image_handle) 2410 +{ 2411 +/* preparing to uncompress a PNG [by strips] */ 2412 + int errcode = GGRAPH_OK; 2413 + gGraphStripImagePtr img; 2414 + xgdIOCtx *in = 2415 + xgdNewDynamicCtxEx (0, file, XGD_CTX_DONT_FREE, GG_TARGET_IS_FILE); 2416 + img = xgdStripImageCreateFromPngCtx (in, &errcode, file); 2417 + *image_handle = img; 2418 + return errcode; 2419 +} 2420 + 2421 +GGRAPH_PRIVATE int 2422 +gg_image_strip_read_from_png (gGraphStripImagePtr img, int *progress) 2423 +{ 2424 +/* uncompressing a PNG [by strips] */ 2425 + int ret = xgdStripImageReadFromPngCtx (img); 2426 + if (ret == GGRAPH_OK && progress != NULL) 2427 + *progress = 2428 + (int) (((double) (img->next_row + 1) * 100.0) / 2429 + (double) (img->height)); 2430 + return ret; 2431 +}
Added src/gaiagraphics_quantize.c.
1 +/* 2 +/ gaiagraphics_quantize.c 3 +/ 4 +/ quantization methods 5 +/ 6 +/ version 1.0, 2010 July 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2010 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +/* 28 +/ 29 +/ DISCLAIMER: 30 +/ all the following code merely is an 'ad hoc' adaption 31 +/ of the following LGPLed code: 32 +/ 33 +////////////////////////////////////////////////////////////////////////////// 34 +/ 35 + median.c: median cut - reducing a high color bitmap to certain number of colors 36 + 37 + Copyright (C) 2001, 2002 Martin Weber 38 + 39 + This library is free software; you can redistribute it and/or 40 + modify it under the terms of the GNU Lesser General Public License 41 + as published by the Free Software Foundation; either version 2.1 of 42 + the License, or (at your option) any later version. 43 + 44 + This library is distributed in the hope that it will be useful, but 45 + WITHOUT ANY WARRANTY; without even the implied warranty of 46 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 47 + Lesser General Public License for more details. 48 + 49 + You should have received a copy of the GNU Lesser General Public 50 + License along with this library; if not, write to the Free Software 51 + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 52 + USA. 53 +*/ 54 + 55 +#include <stdlib.h> 56 +#include <stdio.h> 57 + 58 +#include "gaiagraphics.h" 59 +#include "gaiagraphics_internals.h" 60 + 61 +#define encode_color(r, g, b) (((r) << 16) + ((g) << 8) + (b)) 62 +#define color_get_red(c) (((c) & 0xFF0000) >> 16) 63 +#define color_get_green(c) (((c) & 0x00FF00) >> 8) 64 +#define color_get_blue(c) ((c) & 0x0000FF) 65 + 66 +#define MAXNUMCOLORS 256 67 + 68 +/* scale RGB distances by *2,*3,*1 */ 69 +#define R_SCALE <<1 70 +#define G_SCALE *3 71 +#define B_SCALE 72 + 73 +#define BITS_IN_SAMPLE 8 74 + 75 +#define R_SHIFT (BITS_IN_SAMPLE - PRECISION_R) 76 +#define G_SHIFT (BITS_IN_SAMPLE - PRECISION_G) 77 +#define B_SHIFT (BITS_IN_SAMPLE - PRECISION_B) 78 + 79 +#define PRECISION_R 7 80 +#define PRECISION_G 7 81 +#define PRECISION_B 7 82 + 83 +#define HIST_R_ELEMS (1<<PRECISION_R) 84 +#define HIST_G_ELEMS (1<<PRECISION_G) 85 +#define HIST_B_ELEMS (1<<PRECISION_B) 86 + 87 +#define MR HIST_G_ELEMS*HIST_B_ELEMS 88 +#define MG HIST_B_ELEMS 89 + 90 +typedef unsigned long ColorFreq; 91 +typedef ColorFreq *Histogram; 92 + 93 +typedef struct 94 +{ 95 + int desired_number_of_colors; /* Number of colors we will allow */ 96 + int actual_number_of_colors; /* Number of colors actually needed */ 97 + int cmap[256]; /* colormap created by quantization */ 98 + int max_cmap; 99 + ColorFreq freq[256]; 100 + Histogram histogram; /* holds the histogram */ 101 +} QuantizeObj; 102 + 103 +typedef struct 104 +{ 105 + /* The bounds of the box (inclusive); expressed as histogram indexes */ 106 + int Rmin, Rmax; 107 + int Gmin, Gmax; 108 + int Bmin, Bmax; 109 + /* The volume (actually 2-norm) of the box */ 110 + int volume; 111 + /* The number of nonzero histogram cells within this box */ 112 + long colorcount; 113 +} box, *boxptr; 114 + 115 +static void 116 +zero_histogram_rgb (Histogram histogram) 117 +{ 118 + int r, g, b; 119 + for (r = 0; r < HIST_R_ELEMS; r++) 120 + for (g = 0; g < HIST_G_ELEMS; g++) 121 + for (b = 0; b < HIST_B_ELEMS; b++) 122 + histogram[r * MR + g * MG + b] = 0; 123 +} 124 + 125 +static void 126 +generate_histogram_rgb (Histogram histogram, gGraphImagePtr img) 127 +{ 128 + int x; 129 + int y; 130 + int red; 131 + int green; 132 + int blue; 133 + unsigned char *p_in; 134 + ColorFreq *col; 135 + 136 + zero_histogram_rgb (histogram); 137 + 138 + for (y = 0; y < img->height; y++) 139 + { 140 + p_in = img->pixels + (y * img->scanline_width); 141 + for (x = 0; x < img->width; x++) 142 + { 143 + /* retrieving a pixel */ 144 + if (img->pixel_format == GG_PIXEL_RGB) 145 + { 146 + red = *p_in++; 147 + green = *p_in++; 148 + blue = *p_in++; 149 + } 150 + else if (img->pixel_format == GG_PIXEL_RGBA) 151 + { 152 + red = *p_in++; 153 + green = *p_in++; 154 + blue = *p_in++; 155 + p_in++; /* skipping alpha */ 156 + } 157 + else if (img->pixel_format == GG_PIXEL_ARGB) 158 + { 159 + p_in++; /* skipping alpha */ 160 + blue = *p_in++; 161 + green = *p_in++; 162 + red = *p_in++; 163 + } 164 + else if (img->pixel_format == GG_PIXEL_BGR) 165 + { 166 + blue = *p_in++; 167 + green = *p_in++; 168 + red = *p_in++; 169 + } 170 + else if (img->pixel_format == GG_PIXEL_BGRA) 171 + { 172 + blue = *p_in++; 173 + green = *p_in++; 174 + red = *p_in++; 175 + p_in++; /* skipping alpha */ 176 + } 177 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 178 + { 179 + red = *p_in++; 180 + green = red; 181 + blue = red; 182 + } 183 + else if (img->pixel_format == GG_PIXEL_PALETTE) 184 + { 185 + int index = *p_in++; 186 + red = img->palette_red[index]; 187 + green = img->palette_green[index]; 188 + blue = img->palette_blue[index]; 189 + } 190 + col = &histogram[(red >> R_SHIFT) * MR 191 + + (green >> G_SHIFT) * MG + (blue >> B_SHIFT)]; 192 + (*col)++; 193 + } 194 + } 195 +} 196 + 197 + 198 +static boxptr 199 +find_biggest_volume (boxptr boxlist, int numboxes) 200 +/* Find the splittable box with the largest (scaled) volume */ 201 +/* Returns 0 if no splittable boxes remain */ 202 +{ 203 + boxptr boxp; 204 + int i; 205 + int maxv = 0; 206 + boxptr which = 0; 207 + 208 + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) 209 + { 210 + if (boxp->volume > maxv) 211 + { 212 + which = boxp; 213 + maxv = boxp->volume; 214 + } 215 + } 216 + 217 + return which; 218 +} 219 + 220 + 221 +static void 222 +update_box_rgb (Histogram histogram, boxptr boxp) 223 +/* Shrink the min/max bounds of a box to enclose only nonzero elements, */ 224 +/* and recompute its volume and population */ 225 +{ 226 + ColorFreq *histp; 227 + int R, G, B; 228 + int Rmin, Rmax, Gmin, Gmax, Bmin, Bmax; 229 + int dist0, dist1, dist2; 230 + long ccount; 231 + 232 + Rmin = boxp->Rmin; 233 + Rmax = boxp->Rmax; 234 + Gmin = boxp->Gmin; 235 + Gmax = boxp->Gmax; 236 + Bmin = boxp->Bmin; 237 + Bmax = boxp->Bmax; 238 + 239 + if (Rmax > Rmin) 240 + for (R = Rmin; R <= Rmax; R++) 241 + for (G = Gmin; G <= Gmax; G++) 242 + { 243 + histp = histogram + R * MR + G * MG + Bmin; 244 + for (B = Bmin; B <= Bmax; B++) 245 + if (*histp++ != 0) 246 + { 247 + boxp->Rmin = Rmin = R; 248 + goto have_Rmin; 249 + } 250 + } 251 + have_Rmin: 252 + if (Rmax > Rmin) 253 + for (R = Rmax; R >= Rmin; R--) 254 + for (G = Gmin; G <= Gmax; G++) 255 + { 256 + histp = histogram + R * MR + G * MG + Bmin; 257 + for (B = Bmin; B <= Bmax; B++) 258 + if (*histp++ != 0) 259 + { 260 + boxp->Rmax = Rmax = R; 261 + goto have_Rmax; 262 + } 263 + } 264 + have_Rmax: 265 + if (Gmax > Gmin) 266 + for (G = Gmin; G <= Gmax; G++) 267 + for (R = Rmin; R <= Rmax; R++) 268 + { 269 + histp = histogram + R * MR + G * MG + Bmin; 270 + for (B = Bmin; B <= Bmax; B++) 271 + if (*histp++ != 0) 272 + { 273 + boxp->Gmin = Gmin = G; 274 + goto have_Gmin; 275 + } 276 + } 277 + have_Gmin: 278 + if (Gmax > Gmin) 279 + for (G = Gmax; G >= Gmin; G--) 280 + for (R = Rmin; R <= Rmax; R++) 281 + { 282 + histp = histogram + R * MR + G * MG + Bmin; 283 + for (B = Bmin; B <= Bmax; B++) 284 + if (*histp++ != 0) 285 + { 286 + boxp->Gmax = Gmax = G; 287 + goto have_Gmax; 288 + } 289 + } 290 + have_Gmax: 291 + if (Bmax > Bmin) 292 + for (B = Bmin; B <= Bmax; B++) 293 + for (R = Rmin; R <= Rmax; R++) 294 + { 295 + histp = histogram + R * MR + Gmin * MG + B; 296 + for (G = Gmin; G <= Gmax; G++, histp += MG) 297 + if (*histp != 0) 298 + { 299 + boxp->Bmin = Bmin = B; 300 + goto have_Bmin; 301 + } 302 + } 303 + have_Bmin: 304 + if (Bmax > Bmin) 305 + for (B = Bmax; B >= Bmin; B--) 306 + for (R = Rmin; R <= Rmax; R++) 307 + { 308 + histp = histogram + R * MR + Gmin * MG + B; 309 + for (G = Gmin; G <= Gmax; G++, histp += MG) 310 + if (*histp != 0) 311 + { 312 + boxp->Bmax = Bmax = B; 313 + goto have_Bmax; 314 + } 315 + } 316 + have_Bmax: 317 + 318 + /* Update box volume. 319 + * We use 2-norm rather than real volume here; this biases the method 320 + * against making long narrow boxes, and it has the side benefit that 321 + * a box is splittable iff norm > 0. 322 + * Since the differences are expressed in histogram-cell units, 323 + * we have to shift back to JSAMPLE units to get consistent distances; 324 + * after which, we scale according to the selected distance scale factors. 325 + */ 326 + dist0 = Rmax - Rmin; 327 + dist1 = Gmax - Gmin; 328 + dist2 = Bmax - Bmin; 329 + boxp->volume = dist0 * dist0 + dist1 * dist1 + dist2 * dist2; 330 + 331 + /* Now scan remaining volume of box and compute population */ 332 + ccount = 0; 333 + for (R = Rmin; R <= Rmax; R++) 334 + for (G = Gmin; G <= Gmax; G++) 335 + { 336 + histp = histogram + R * MR + G * MG + Bmin; 337 + for (B = Bmin; B <= Bmax; B++, histp++) 338 + if (*histp != 0) 339 + { 340 + ccount++; 341 + } 342 + } 343 + 344 + boxp->colorcount = ccount; 345 +} 346 + 347 + 348 +static int 349 +median_cut_rgb (Histogram histogram, boxptr boxlist, int numboxes, 350 + int desired_colors) 351 +/* Repeatedly select and split the largest box until we have enough boxes */ 352 +{ 353 + int n, lb; 354 + int R, G, B, cmax; 355 + boxptr b1, b2; 356 + 357 + while (numboxes < desired_colors) 358 + { 359 + /* Select box to split. 360 + * Current algorithm: by population for first half, then by volume. 361 + */ 362 + b1 = find_biggest_volume (boxlist, numboxes); 363 + 364 + if (b1 == 0) /* no splittable boxes left! */ 365 + break; 366 + b2 = boxlist + numboxes; /* where new box will go */ 367 + /* Copy the color bounds to the new box. */ 368 + b2->Rmax = b1->Rmax; 369 + b2->Gmax = b1->Gmax; 370 + b2->Bmax = b1->Bmax; 371 + b2->Rmin = b1->Rmin; 372 + b2->Gmin = b1->Gmin; 373 + b2->Bmin = b1->Bmin; 374 + /* Choose which axis to split the box on. 375 + * Current algorithm: longest scaled axis. 376 + * See notes in update_box about scaling distances. 377 + */ 378 + R = b1->Rmax - b1->Rmin; 379 + G = b1->Gmax - b1->Gmin; 380 + B = b1->Bmax - b1->Bmin; 381 + /* We want to break any ties in favor of green, then red, blue last. 382 + */ 383 + cmax = G; 384 + n = 1; 385 + if (R > cmax) 386 + { 387 + cmax = R; 388 + n = 0; 389 + } 390 + if (B > cmax) 391 + { 392 + n = 2; 393 + } 394 + /* Choose split point along selected axis, and update box bounds. 395 + * Current algorithm: split at halfway point. 396 + * (Since the box has been shrunk to minimum volume, 397 + * any split will produce two nonempty subboxes.) 398 + * Note that lb value is max for lower box, so must be < old max. 399 + */ 400 + switch (n) 401 + { 402 + case 0: 403 + lb = (b1->Rmax + b1->Rmin) / 2; 404 + b1->Rmax = lb; 405 + b2->Rmin = lb + 1; 406 + break; 407 + case 1: 408 + lb = (b1->Gmax + b1->Gmin) / 2; 409 + b1->Gmax = lb; 410 + b2->Gmin = lb + 1; 411 + break; 412 + case 2: 413 + lb = (b1->Bmax + b1->Bmin) / 2; 414 + b1->Bmax = lb; 415 + b2->Bmin = lb + 1; 416 + break; 417 + } 418 + /* Update stats for boxes */ 419 + update_box_rgb (histogram, b1); 420 + update_box_rgb (histogram, b2); 421 + numboxes++; 422 + } 423 + return numboxes; 424 +} 425 + 426 + 427 +static void 428 +compute_color_rgb (QuantizeObj * quantobj, Histogram histogram, 429 + boxptr boxp, int icolor) 430 +/* Compute representative color for a box, put it in colormap[icolor] */ 431 +{ 432 + /* Current algorithm: mean weighted by pixels (not colors) */ 433 + /* Note it is important to get the rounding correct! */ 434 + ColorFreq *histp; 435 + int R, G, B; 436 + int Rmin, Rmax; 437 + int Gmin, Gmax; 438 + int Bmin, Bmax; 439 + unsigned long count; 440 + unsigned long total = 0; 441 + unsigned long Rtotal = 0; 442 + unsigned long Gtotal = 0; 443 + unsigned long Btotal = 0; 444 + int pixel; 445 + int r; 446 + int g; 447 + int b; 448 + 449 + Rmin = boxp->Rmin; 450 + Rmax = boxp->Rmax; 451 + Gmin = boxp->Gmin; 452 + Gmax = boxp->Gmax; 453 + Bmin = boxp->Bmin; 454 + Bmax = boxp->Bmax; 455 + 456 + for (R = Rmin; R <= Rmax; R++) 457 + for (G = Gmin; G <= Gmax; G++) 458 + { 459 + histp = histogram + R * MR + G * MG + Bmin; 460 + for (B = Bmin; B <= Bmax; B++) 461 + { 462 + if ((count = *histp++) != 0) 463 + { 464 + total += count; 465 + Rtotal += 466 + ((R << R_SHIFT) + ((1 << R_SHIFT) >> 1)) * count; 467 + Gtotal += 468 + ((G << G_SHIFT) + ((1 << G_SHIFT) >> 1)) * count; 469 + Btotal += 470 + ((B << B_SHIFT) + ((1 << B_SHIFT) >> 1)) * count; 471 + } 472 + } 473 + } 474 + 475 + r = (unsigned char) ((Rtotal + (total >> 1)) / total); 476 + g = (unsigned char) ((Gtotal + (total >> 1)) / total); 477 + b = (unsigned char) ((Btotal + (total >> 1)) / total); 478 + pixel = encode_color (r, g, b); 479 + quantobj->cmap[icolor] = pixel; 480 + if ((icolor + 1) > quantobj->max_cmap) 481 + quantobj->max_cmap = (icolor + 1); 482 + quantobj->freq[icolor] = total; 483 +} 484 + 485 + 486 +static void 487 +select_colors_rgb (QuantizeObj * quantobj, Histogram histogram) 488 +/* Master routine for color selection */ 489 +{ 490 + boxptr boxlist; 491 + int numboxes; 492 + int desired = quantobj->desired_number_of_colors; 493 + int i; 494 + 495 + /* Allocate workspace for box list */ 496 + boxlist = malloc (desired * sizeof (box)); 497 + 498 + /* Initialize one box containing whole space */ 499 + numboxes = 1; 500 + boxlist[0].Rmin = 0; 501 + boxlist[0].Rmax = (1 << PRECISION_R) - 1; 502 + boxlist[0].Gmin = 0; 503 + boxlist[0].Gmax = (1 << PRECISION_G) - 1; 504 + boxlist[0].Bmin = 0; 505 + boxlist[0].Bmax = (1 << PRECISION_B) - 1; 506 + /* Shrink it to actually-used volume and set its statistics */ 507 + update_box_rgb (histogram, boxlist); 508 + /* Perform median-cut to produce final box list */ 509 + numboxes = median_cut_rgb (histogram, boxlist, numboxes, desired); 510 + quantobj->actual_number_of_colors = numboxes; 511 + /* Compute the representative color for each box, fill colormap */ 512 + for (i = 0; i < numboxes; i++) 513 + compute_color_rgb (quantobj, histogram, boxlist + i, i); 514 + free (boxlist); 515 +} 516 + 517 + 518 +/* 519 + * These routines are concerned with the time-critical task of mapping input 520 + * colors to the nearest color in the selected colormap. 521 + * 522 + * We re-use the histogram space as an "inverse color map", essentially a 523 + * cache for the results of nearest-color searches. All colors within a 524 + * histogram cell will be mapped to the same colormap entry, namely the one 525 + * closest to the cell's center. This may not be quite the closest entry to 526 + * the actual input color, but it's almost as good. A zero in the cache 527 + * indicates we haven't found the nearest color for that cell yet; the array 528 + * is cleared to zeroes before starting the mapping pass. When we find the 529 + * nearest color for a cell, its colormap index plus one is recorded in the 530 + * cache for future use. The pass2 scanning routines call fill_inverse_cmap 531 + * when they need to use an unfilled entry in the cache. 532 + * 533 + * Our method of efficiently finding nearest colors is based on the "locally 534 + * sorted search" idea described by Heckbert and on the incremental distance 535 + * calculation described by Spencer W. Thomas in chapter III.1 of Graphics 536 + * Gems II (James Arvo, ed. Academic Press, 1991). Thomas points out that 537 + * the distances from a given colormap entry to each cell of the histogram can 538 + * be computed quickly using an incremental method: the differences between 539 + * distances to adjacent cells themselves differ by a constant. This allows a 540 + * fairly fast implementation of the "brute force" approach of computing the 541 + * distance from every colormap entry to every histogram cell. Unfortunately, 542 + * it needs a work array to hold the best-distance-so-far for each histogram 543 + * cell (because the inner loop has to be over cells, not colormap entries). 544 + * The work array elements have to be ints, so the work array would need 545 + * 256Kb at our recommended precision. This is not feasible in DOS machines. 546 + 547 +[ 256*1024/4 = 65,536 ] 548 + 549 + * To get around these problems, we apply Thomas' method to compute the 550 + * nearest colors for only the cells within a small subbox of the histogram. 551 + * The work array need be only as big as the subbox, so the memory usage 552 + * problem is solved. Furthermore, we need not fill subboxes that are never 553 + * referenced in pass2; many images use only part of the color gamut, so a 554 + * fair amount of work is saved. An additional advantage of this 555 + * approach is that we can apply Heckbert's locality criterion to quickly 556 + * eliminate colormap entries that are far away from the subbox; typically 557 + * three-fourths of the colormap entries are rejected by Heckbert's criterion, 558 + * and we need not compute their distances to individual cells in the subbox. 559 + * The speed of this approach is heavily influenced by the subbox size: too 560 + * small means too much overhead, too big loses because Heckbert's criterion 561 + * can't eliminate as many colormap entries. Empirically the best subbox 562 + * size seems to be about 1/512th of the histogram (1/8th in each direction). 563 + * 564 + * Thomas' article also describes a refined method which is asymptotically 565 + * faster than the brute-force method, but it is also far more complex and 566 + * cannot efficiently be applied to small subboxes. It is therefore not 567 + * useful for programs intended to be portable to DOS machines. On machines 568 + * with plenty of memory, filling the whole histogram in one shot with Thomas' 569 + * refined method might be faster than the present code --- but then again, 570 + * it might not be any faster, and it's certainly more complicated. 571 + */ 572 + 573 +/* log2(histogram cells in update box) for each axis; this can be adjusted */ 574 +#define BOX_R_LOG (PRECISION_R-3) 575 +#define BOX_G_LOG (PRECISION_G-3) 576 +#define BOX_B_LOG (PRECISION_B-3) 577 + 578 +#define BOX_R_ELEMS (1<<BOX_R_LOG) /* # of hist cells in update box */ 579 +#define BOX_G_ELEMS (1<<BOX_G_LOG) 580 +#define BOX_B_ELEMS (1<<BOX_B_LOG) 581 + 582 +#define BOX_R_SHIFT (R_SHIFT + BOX_R_LOG) 583 +#define BOX_G_SHIFT (G_SHIFT + BOX_G_LOG) 584 +#define BOX_B_SHIFT (B_SHIFT + BOX_B_LOG) 585 + 586 +/* 587 + * The next three routines implement inverse colormap filling. They could 588 + * all be folded into one big routine, but splitting them up this way saves 589 + * some stack space (the mindist[] and bestdist[] arrays need not coexist) 590 + * and may allow some compilers to produce better code by registerizing more 591 + * inner-loop variables. 592 + */ 593 + 594 +static int 595 +find_nearby_colors (QuantizeObj * quantobj, int minR, int minG, 596 + int minB, int *colorlist) 597 +/* Locate the colormap entries close enough to an update box to be candidates 598 + * for the nearest entry to some cell(s) in the update box. The update box 599 + * is specified by the center coordinates of its first cell. The number of 600 + * candidate colormap entries is returned, and their colormap indexes are 601 + * placed in colorlist[]. 602 + * This routine uses Heckbert's "locally sorted search" criterion to select 603 + * the colors that need further consideration. 604 + */ 605 +{ 606 + int numcolors = quantobj->actual_number_of_colors; 607 + int maxR, maxG, maxB; 608 + int centerR, centerG, centerB; 609 + int i, x, ncolors; 610 + int minmaxdist, min_dist = 0, max_dist, tdist; 611 + int mindist[MAXNUMCOLORS]; /* min distance to colormap entry i */ 612 + int pixel; 613 + int r; 614 + int g; 615 + int b; 616 + 617 + /* Compute TRUE coordinates of update box's upper corner and center. 618 + * Actually we compute the coordinates of the center of the upper-corner 619 + * histogram cell, which are the upper bounds of the volume we care about. 620 + * Note that since ">>" rounds down, the "center" values may be closer to 621 + * min than to max; hence comparisons to them must be "<=", not "<". 622 + */ 623 + maxR = minR + ((1 << BOX_R_SHIFT) - (1 << R_SHIFT)); 624 + centerR = (minR + maxR) >> 1; 625 + maxG = minG + ((1 << BOX_G_SHIFT) - (1 << G_SHIFT)); 626 + centerG = (minG + maxG) >> 1; 627 + maxB = minB + ((1 << BOX_B_SHIFT) - (1 << B_SHIFT)); 628 + centerB = (minB + maxB) >> 1; 629 + 630 + /* For each color in colormap, find: 631 + * 1. its minimum squared-distance to any point in the update box 632 + * (zero if color is within update box); 633 + * 2. its maximum squared-distance to any point in the update box. 634 + * Both of these can be found by considering only the corners of the box. 635 + * We save the minimum distance for each color in mindist[]; 636 + * only the smallest maximum distance is of interest. 637 + */ 638 + minmaxdist = 0x7FFFFFFFL; 639 + 640 + for (i = 0; i < numcolors; i++) 641 + { 642 + /* We compute the squared-R-distance term, then add in the other two. */ 643 + pixel = quantobj->cmap[i]; 644 + r = color_get_red (pixel); 645 + g = color_get_green (pixel); 646 + b = color_get_blue (pixel); 647 + x = r; 648 + if (x < minR) 649 + { 650 + tdist = (x - minR) R_SCALE; 651 + min_dist = tdist * tdist; 652 + tdist = (x - maxR) R_SCALE; 653 + max_dist = tdist * tdist; 654 + } 655 + else if (x > maxR) 656 + { 657 + tdist = (x - maxR) R_SCALE; 658 + min_dist = tdist * tdist; 659 + tdist = (x - minR) R_SCALE; 660 + max_dist = tdist * tdist; 661 + } 662 + else 663 + { 664 + /* within cell range so no contribution to min_dist */ 665 + min_dist = 0; 666 + if (x <= centerR) 667 + { 668 + tdist = (x - maxR) R_SCALE; 669 + max_dist = tdist * tdist; 670 + } 671 + else 672 + { 673 + tdist = (x - minR) R_SCALE; 674 + max_dist = tdist * tdist; 675 + } 676 + } 677 + 678 + x = g; 679 + if (x < minG) 680 + { 681 + tdist = (x - minG) G_SCALE; 682 + min_dist += tdist * tdist; 683 + tdist = (x - maxG) G_SCALE; 684 + max_dist += tdist * tdist; 685 + } 686 + else if (x > maxG) 687 + { 688 + tdist = (x - maxG) G_SCALE; 689 + min_dist += tdist * tdist; 690 + tdist = (x - minG) G_SCALE; 691 + max_dist += tdist * tdist; 692 + } 693 + else 694 + { 695 + /* within cell range so no contribution to min_dist */ 696 + if (x <= centerG) 697 + { 698 + tdist = (x - maxG) G_SCALE; 699 + max_dist += tdist * tdist; 700 + } 701 + else 702 + { 703 + tdist = (x - minG) G_SCALE; 704 + max_dist += tdist * tdist; 705 + } 706 + } 707 + 708 + x = b; 709 + if (x < minB) 710 + { 711 + tdist = (x - minB) B_SCALE; 712 + min_dist += tdist * tdist; 713 + tdist = (x - maxB) B_SCALE; 714 + max_dist += tdist * tdist; 715 + } 716 + else if (x > maxB) 717 + { 718 + tdist = (x - maxB) B_SCALE; 719 + min_dist += tdist * tdist; 720 + tdist = (x - minB) B_SCALE; 721 + max_dist += tdist * tdist; 722 + } 723 + else 724 + { 725 + /* within cell range so no contribution to min_dist */ 726 + if (x <= centerB) 727 + { 728 + tdist = (x - maxB) B_SCALE; 729 + max_dist += tdist * tdist; 730 + } 731 + else 732 + { 733 + tdist = (x - minB) B_SCALE; 734 + max_dist += tdist * tdist; 735 + } 736 + } 737 + 738 + mindist[i] = min_dist; /* save away the results */ 739 + if (max_dist < minmaxdist) 740 + minmaxdist = max_dist; 741 + } 742 + 743 + /* Now we know that no cell in the update box is more than minmaxdist 744 + * away from some colormap entry. Therefore, only colors that are 745 + * within minmaxdist of some part of the box need be considered. 746 + */ 747 + ncolors = 0; 748 + for (i = 0; i < numcolors; i++) 749 + { 750 + if (mindist[i] <= minmaxdist) 751 + colorlist[ncolors++] = i; 752 + } 753 + return ncolors; 754 +} 755 + 756 + 757 +static void 758 +find_best_colors (QuantizeObj * quantobj, int minR, int minG, 759 + int minB, int numcolors, int *colorlist, int *bestcolor) 760 +/* Find the closest colormap entry for each cell in the update box, 761 + given the list of candidate colors prepared by find_nearby_colors. 762 + Return the indexes of the closest entries in the bestcolor[] array. 763 + This routine uses Thomas' incremental distance calculation method to 764 + find the distance from a colormap entry to successive cells in the box. 765 + */ 766 +{ 767 + int iR, iG, iB; 768 + int i, icolor; 769 + int *bptr; /* pointer into bestdist[] array */ 770 + int *cptr; /* pointer into bestcolor[] array */ 771 + int dist0, dist1; /* initial distance values */ 772 + int dist2; /* current distance in inner loop */ 773 + int xx0, xx1; /* distance increments */ 774 + int xx2; 775 + int inR, inG, inB; /* initial values for increments */ 776 + int pixel; 777 + int r; 778 + int g; 779 + int b; 780 + 781 + /* This array holds the distance to the nearest-so-far color for each cell */ 782 + int bestdist[BOX_R_ELEMS * BOX_G_ELEMS * BOX_B_ELEMS]; 783 + 784 + /* Initialize best-distance for each cell of the update box */ 785 + bptr = bestdist; 786 + for (i = BOX_R_ELEMS * BOX_G_ELEMS * BOX_B_ELEMS - 1; i >= 0; i--) 787 + *bptr++ = 0x7FFFFFFFL; 788 + 789 + /* For each color selected by find_nearby_colors, 790 + * compute its distance to the center of each cell in the box. 791 + * If that's less than best-so-far, update best distance and color number. 792 + */ 793 + 794 + /* Nominal steps between cell centers ("x" in Thomas article) */ 795 +#define STEP_R ((1 << R_SHIFT) R_SCALE) 796 +#define STEP_G ((1 << G_SHIFT) G_SCALE) 797 +#define STEP_B ((1 << B_SHIFT) B_SCALE) 798 + 799 + for (i = 0; i < numcolors; i++) 800 + { 801 + icolor = colorlist[i]; 802 + /* Compute (square of) distance from minR/G/B to this color */ 803 + pixel = quantobj->cmap[icolor]; 804 + r = color_get_red (pixel); 805 + g = color_get_green (pixel); 806 + b = color_get_blue (pixel); 807 + inR = (minR - r) R_SCALE; 808 + dist0 = inR * inR; 809 + inG = (minG - g) G_SCALE; 810 + dist0 += inG * inG; 811 + inB = (minB - b) B_SCALE; 812 + dist0 += inB * inB; 813 + /* Form the initial difference increments */ 814 + inR = inR * (2 * STEP_R) + STEP_R * STEP_R; 815 + inG = inG * (2 * STEP_G) + STEP_G * STEP_G; 816 + inB = inB * (2 * STEP_B) + STEP_B * STEP_B; 817 + /* Now loop over all cells in box, updating distance per Thomas method */ 818 + bptr = bestdist; 819 + cptr = bestcolor; 820 + xx0 = inR; 821 + for (iR = BOX_R_ELEMS - 1; iR >= 0; iR--) 822 + { 823 + dist1 = dist0; 824 + xx1 = inG; 825 + for (iG = BOX_G_ELEMS - 1; iG >= 0; iG--) 826 + { 827 + dist2 = dist1; 828 + xx2 = inB; 829 + for (iB = BOX_B_ELEMS - 1; iB >= 0; iB--) 830 + { 831 + if (dist2 < *bptr) 832 + { 833 + *bptr = dist2; 834 + *cptr = icolor; 835 + } 836 + dist2 += xx2; 837 + xx2 += 2 * STEP_B * STEP_B; 838 + bptr++; 839 + cptr++; 840 + } 841 + dist1 += xx1; 842 + xx1 += 2 * STEP_G * STEP_G; 843 + } 844 + dist0 += xx0; 845 + xx0 += 2 * STEP_R * STEP_R; 846 + } 847 + } 848 +} 849 + 850 +static void 851 +fill_inverse_cmap_rgb (QuantizeObj * quantobj, Histogram histogram, 852 + int R, int G, int B) 853 +/* Fill the inverse-colormap entries in the update box that contains 854 + histogram cell R/G/B. (Only that one cell MUST be filled, but 855 + we can fill as many others as we wish.) */ 856 +{ 857 + int minR, minG, minB; /* lower left corner of update box */ 858 + int iR, iG, iB; 859 + int *cptr; /* pointer into bestcolor[] array */ 860 + ColorFreq *cachep; /* pointer into main cache array */ 861 + /* This array lists the candidate colormap indexes. */ 862 + int colorlist[MAXNUMCOLORS]; 863 + int numcolors; /* number of candidate colors */ 864 + /* This array holds the actually closest colormap index for each cell. */ 865 + int bestcolor[BOX_R_ELEMS * BOX_G_ELEMS * BOX_B_ELEMS]; 866 + 867 + /* Convert cell coordinates to update box ID */ 868 + R >>= BOX_R_LOG; 869 + G >>= BOX_G_LOG; 870 + B >>= BOX_B_LOG; 871 + 872 + /* Compute TRUE coordinates of update box's origin corner. 873 + * Actually we compute the coordinates of the center of the corner 874 + * histogram cell, which are the lower bounds of the volume we care about. 875 + */ 876 + minR = (R << BOX_R_SHIFT) + ((1 << R_SHIFT) >> 1); 877 + minG = (G << BOX_G_SHIFT) + ((1 << G_SHIFT) >> 1); 878 + minB = (B << BOX_B_SHIFT) + ((1 << B_SHIFT) >> 1); 879 + 880 + /* Determine which colormap entries are close enough to be candidates 881 + * for the nearest entry to some cell in the update box. 882 + */ 883 + numcolors = find_nearby_colors (quantobj, minR, minG, minB, colorlist); 884 + 885 + /* Determine the actually nearest colors. */ 886 + find_best_colors (quantobj, minR, minG, minB, numcolors, colorlist, 887 + bestcolor); 888 + 889 + /* Save the best color numbers (plus 1) in the main cache array */ 890 + R <<= BOX_R_LOG; /* convert ID back to base cell indexes */ 891 + G <<= BOX_G_LOG; 892 + B <<= BOX_B_LOG; 893 + cptr = bestcolor; 894 + for (iR = 0; iR < BOX_R_ELEMS; iR++) 895 + { 896 + for (iG = 0; iG < BOX_G_ELEMS; iG++) 897 + { 898 + cachep = &histogram[(R + iR) * MR + (G + iG) * MG + B]; 899 + for (iB = 0; iB < BOX_B_ELEMS; iB++) 900 + { 901 + *cachep++ = (*cptr++) + 1; 902 + } 903 + } 904 + } 905 +} 906 + 907 +/* This is pass 1 */ 908 +static void 909 +median_cut_pass1_rgb (QuantizeObj * quantobj, gGraphImagePtr image) 910 +{ 911 + generate_histogram_rgb (quantobj->histogram, image); 912 + select_colors_rgb (quantobj, quantobj->histogram); 913 +} 914 + 915 + 916 +/* Map some rows of pixels to the output colormapped representation. */ 917 +static void 918 +median_cut_pass2_rgb (QuantizeObj * quantobj, gGraphImagePtr img, 919 + void *palette_pixels) 920 + /* This version performs no dithering */ 921 +{ 922 + Histogram histogram = quantobj->histogram; 923 + ColorFreq *cachep; 924 + int R, G, B; 925 + int origR, origG, origB; 926 + int row, col; 927 + int width = img->width; 928 + int height = img->height; 929 + unsigned char red; 930 + unsigned char green; 931 + unsigned char blue; 932 + unsigned char *p_in; 933 + unsigned char *p_out; 934 + 935 + zero_histogram_rgb (histogram); 936 + 937 + for (row = 0; row < height; row++) 938 + { 939 + p_in = img->pixels + (row * img->scanline_width); 940 + p_out = palette_pixels; 941 + p_out += (row * width); 942 + for (col = 0; col < width; col++) 943 + { 944 + /* get pixel value and index into the cache */ 945 + if (img->pixel_format == GG_PIXEL_RGB) 946 + { 947 + red = *p_in++; 948 + green = *p_in++; 949 + blue = *p_in++; 950 + } 951 + else if (img->pixel_format == GG_PIXEL_RGBA) 952 + { 953 + red = *p_in++; 954 + green = *p_in++; 955 + blue = *p_in++; 956 + p_in++; /* skipping alpha */ 957 + } 958 + else if (img->pixel_format == GG_PIXEL_ARGB) 959 + { 960 + p_in++; /* skipping alpha */ 961 + red = *p_in++; 962 + green = *p_in++; 963 + blue = *p_in++; 964 + } 965 + else if (img->pixel_format == GG_PIXEL_BGR) 966 + { 967 + blue = *p_in++; 968 + green = *p_in++; 969 + red = *p_in++; 970 + } 971 + else if (img->pixel_format == GG_PIXEL_BGRA) 972 + { 973 + blue = *p_in++; 974 + green = *p_in++; 975 + red = *p_in++; 976 + p_in++; /* skipping alpha */ 977 + } 978 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 979 + { 980 + red = *p_in++; 981 + green = red; 982 + blue = red; 983 + } 984 + else if (img->pixel_format == GG_PIXEL_PALETTE) 985 + { 986 + int index = *p_in++; 987 + red = img->palette_red[index]; 988 + green = img->palette_green[index]; 989 + blue = img->palette_blue[index]; 990 + } 991 + origR = red; 992 + origG = green; 993 + origB = blue; 994 + 995 + /* get pixel value and index into the cache */ 996 + R = origR >> R_SHIFT; 997 + G = origG >> G_SHIFT; 998 + B = origB >> B_SHIFT; 999 + cachep = &histogram[R * MR + G * MG + B]; 1000 + /* If we have not seen this color before, find nearest 1001 + colormap entry and update the cache */ 1002 + if (*cachep == 0) 1003 + { 1004 + fill_inverse_cmap_rgb (quantobj, histogram, R, G, B); 1005 + } 1006 + /* Now emit the colormap index for this cell */ 1007 + *p_out++ = *cachep - 1; 1008 + } 1009 + } 1010 +} 1011 + 1012 +static QuantizeObj * 1013 +initialize_median_cut (int num_colors) 1014 +{ 1015 + QuantizeObj *quantobj; 1016 + 1017 + /* Initialize the data structures */ 1018 + quantobj = malloc (sizeof (QuantizeObj)); 1019 + if (!quantobj) 1020 + return NULL; 1021 + 1022 + quantobj->histogram = malloc (sizeof (ColorFreq) * 1023 + HIST_R_ELEMS * HIST_G_ELEMS * HIST_B_ELEMS); 1024 + if (quantobj->histogram == NULL) 1025 + { 1026 + free (quantobj); 1027 + return NULL; 1028 + } 1029 + quantobj->desired_number_of_colors = num_colors; 1030 + quantobj->max_cmap = 0; 1031 + 1032 + return quantobj; 1033 +} 1034 + 1035 +static void 1036 +quantize_object_free (QuantizeObj * quantobj) 1037 +{ 1038 + free (quantobj->histogram); 1039 + free (quantobj); 1040 +} 1041 + 1042 +GGRAPH_PRIVATE int 1043 +gg_image_resample_as_palette (const gGraphImagePtr img, int num_colors) 1044 +{ 1045 +/* applies quantization to the current image, so to get 256/16/4 colors */ 1046 + QuantizeObj *quantobj; 1047 + void *palette_pixels; 1048 + int i; 1049 + int safe_num_colors; 1050 + 1051 + if (num_colors > 16) 1052 + safe_num_colors = 256; /* 8 bits_per_sample */ 1053 + else if (num_colors > 4) 1054 + safe_num_colors = 16; /* 4 bits per sample */ 1055 + else 1056 + safe_num_colors = 4; /* 2 bits per sample */ 1057 + 1058 + if (img->pixel_format == GG_PIXEL_GRAYSCALE && safe_num_colors == 256) 1059 + { 1060 + /* useless operation: there are already 256 colors */ 1061 + return GGRAPH_OK; 1062 + } 1063 + if (img->pixel_format == GG_PIXEL_PALETTE 1064 + && img->max_palette <= safe_num_colors) 1065 + { 1066 + /* useless operation */ 1067 + return GGRAPH_OK; 1068 + } 1069 + 1070 + palette_pixels = malloc (img->width * img->height); 1071 + if (!palette_pixels) 1072 + return GGRAPH_INSUFFICIENT_MEMORY; 1073 + 1074 + quantobj = initialize_median_cut (safe_num_colors); 1075 + if (!quantobj) 1076 + return GGRAPH_INSUFFICIENT_MEMORY; 1077 + 1078 + median_cut_pass1_rgb (quantobj, img); 1079 + median_cut_pass2_rgb (quantobj, img, palette_pixels); 1080 + 1081 +/* setting up the palette */ 1082 + for (i = 0; i < quantobj->max_cmap; i++) 1083 + { 1084 + img->palette_red[i] = color_get_red (quantobj->cmap[i]); 1085 + img->palette_green[i] = color_get_green (quantobj->cmap[i]); 1086 + img->palette_blue[i] = color_get_blue (quantobj->cmap[i]); 1087 + img->max_palette = i + 1; 1088 + } 1089 + 1090 + quantize_object_free (quantobj); 1091 + 1092 + free (img->pixels); 1093 + img->pixels = palette_pixels; 1094 + img->pixel_format = GG_PIXEL_PALETTE; 1095 + img->scanline_width = img->width; 1096 + img->pixel_size = 1; 1097 + return GGRAPH_OK; 1098 +}
Added src/gaiagraphics_svg.c.
1 +/* 2 +/ gaiagraphics_svg.c 3 +/ 4 +/ SVG renderering 5 +/ 6 +/ version 1.0, 2013 February 10 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2013 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdlib.h> 28 +#include <stdio.h> 29 +#include <string.h> 30 +#include <math.h> 31 +#include <float.h> 32 + 33 +#include "gaiagraphics.h" 34 +#include "gaiagraphics_internals.h" 35 + 36 +#define GG_SVG_PI 3.141592653589793 37 + 38 +struct gg_svg_parent_ref 39 +{ 40 +/* a parent reference (inheritance chain) */ 41 + struct gg_svg_group *parent; 42 + struct gg_svg_parent_ref *next; 43 +}; 44 + 45 +struct gg_svg_parents 46 +{ 47 +/* inheritance chain */ 48 + struct gg_svg_parent_ref *first; 49 + struct gg_svg_parent_ref *last; 50 +}; 51 + 52 +static void 53 +gg_svg_free_parents (struct gg_svg_parents *chain) 54 +{ 55 +/* freeing an inheritance chain */ 56 + struct gg_svg_parent_ref *pp; 57 + struct gg_svg_parent_ref *ppn; 58 + pp = chain->first; 59 + while (pp) 60 + { 61 + ppn = pp->next; 62 + free (pp); 63 + pp = ppn; 64 + } 65 +} 66 + 67 +static void 68 +gg_svg_add_parent (struct gg_svg_parents *chain, struct gg_svg_group *parent) 69 +{ 70 +/* adding an inheritance item into the chain */ 71 + struct gg_svg_parent_ref *p = malloc (sizeof (struct gg_svg_parent_ref)); 72 + p->parent = parent; 73 + p->next = chain->first; 74 +/* updating a reverse-ordered linked list */ 75 + if (chain->last == NULL) 76 + chain->last = p; 77 + chain->first = p; 78 +} 79 + 80 +static void 81 +gg_svg_gradient_transformation (cairo_pattern_t * pattern, 82 + struct gg_svg_transform *trans) 83 +{ 84 +/* applying a single transformation */ 85 + double angle; 86 + double tangent; 87 + struct gg_svg_matrix *mtrx; 88 + struct gg_svg_translate *translate; 89 + struct gg_svg_scale *scale; 90 + struct gg_svg_rotate *rotate; 91 + struct gg_svg_skew *skew; 92 + cairo_matrix_t matrix; 93 + cairo_matrix_t matrix_in; 94 + 95 + if (trans->data == NULL) 96 + return; 97 + switch (trans->type) 98 + { 99 + case GG_SVG_MATRIX: 100 + mtrx = trans->data; 101 + cairo_pattern_get_matrix (pattern, &matrix); 102 + matrix_in.xx = mtrx->a; 103 + matrix_in.yx = mtrx->b; 104 + matrix_in.xy = mtrx->c; 105 + matrix_in.yy = mtrx->d; 106 + matrix_in.x0 = mtrx->e; 107 + matrix_in.y0 = mtrx->f; 108 + cairo_matrix_multiply (&matrix, &matrix, &matrix_in); 109 + cairo_matrix_invert (&matrix); 110 + cairo_pattern_set_matrix (pattern, &matrix); 111 + break; 112 + case GG_SVG_TRANSLATE: 113 + translate = trans->data; 114 + cairo_pattern_get_matrix (pattern, &matrix); 115 + cairo_matrix_translate (&matrix, translate->tx, translate->ty); 116 + cairo_matrix_invert (&matrix); 117 + cairo_pattern_set_matrix (pattern, &matrix); 118 + break; 119 + case GG_SVG_SCALE: 120 + scale = trans->data; 121 + cairo_pattern_get_matrix (pattern, &matrix); 122 + cairo_matrix_scale (&matrix, scale->sx, scale->sy); 123 + cairo_matrix_invert (&matrix); 124 + cairo_pattern_set_matrix (pattern, &matrix); 125 + break; 126 + case GG_SVG_ROTATE: 127 + rotate = trans->data; 128 + cairo_pattern_get_matrix (pattern, &matrix); 129 + angle = rotate->angle * (GG_SVG_PI / 180.0); 130 + cairo_matrix_translate (&matrix, rotate->cx, rotate->cy); 131 + cairo_matrix_rotate (&matrix, angle); 132 + cairo_matrix_translate (&matrix, -1.0 * rotate->cx, 133 + -1.0 * rotate->cy); 134 + cairo_matrix_invert (&matrix); 135 + cairo_pattern_set_matrix (pattern, &matrix); 136 + break; 137 + case GG_SVG_SKEW_X: 138 + skew = trans->data; 139 + cairo_pattern_get_matrix (pattern, &matrix); 140 + angle = skew->angle * (GG_SVG_PI / 180.0); 141 + tangent = tan (angle); 142 + matrix_in.xx = 1.0; 143 + matrix_in.yx = 0.0; 144 + matrix_in.xy = tangent; 145 + matrix_in.yy = 1.0; 146 + matrix_in.x0 = 0.0; 147 + matrix_in.y0 = 0.0; 148 + cairo_matrix_multiply (&matrix, &matrix_in, &matrix); 149 + cairo_matrix_invert (&matrix); 150 + cairo_pattern_set_matrix (pattern, &matrix); 151 + break; 152 + case GG_SVG_SKEW_Y: 153 + skew = trans->data; 154 + cairo_pattern_get_matrix (pattern, &matrix); 155 + angle = skew->angle * (GG_SVG_PI / 180.0); 156 + tangent = tan (angle); 157 + matrix_in.xx = 1.0; 158 + matrix_in.yx = tangent; 159 + matrix_in.xy = 0.0; 160 + matrix_in.yy = 1.0; 161 + matrix_in.x0 = 0.0; 162 + matrix_in.y0 = 0.0; 163 + cairo_matrix_multiply (&matrix, &matrix_in, &matrix); 164 + cairo_matrix_invert (&matrix); 165 + cairo_pattern_set_matrix (pattern, &matrix); 166 + break; 167 + }; 168 +} 169 + 170 +static void 171 +gg_svg_apply_gradient_transformations (cairo_pattern_t * pattern, 172 + struct gg_svg_gradient *grad) 173 +{ 174 +/* applying all Gradient-related transformations */ 175 + struct gg_svg_transform *trans = grad->first_trans; 176 + while (trans) 177 + { 178 + gg_svg_gradient_transformation (pattern, trans); 179 + trans = trans->next; 180 + } 181 +} 182 + 183 +static void 184 +gg_svg_set_pen (cairo_t * cairo, struct gg_svg_style *style) 185 +{ 186 +/* setting up a Pen for Cairo */ 187 + cairo_pattern_t *pattern; 188 + double lengths[4]; 189 + lengths[0] = 1.0; 190 + cairo_set_line_width (cairo, style->stroke_width); 191 + if (style->stroke_url != NULL && style->stroke_pointer != NULL) 192 + { 193 + struct gg_svg_gradient *grad = style->stroke_pointer; 194 + struct gg_svg_gradient_stop *stop; 195 + if (grad->type == GG_SVG_LINEAR_GRADIENT) 196 + { 197 + pattern = 198 + cairo_pattern_create_linear (grad->x1, grad->y1, grad->x2, 199 + grad->y2); 200 + gg_svg_apply_gradient_transformations (pattern, grad); 201 + stop = grad->first_stop; 202 + while (stop) 203 + { 204 + cairo_pattern_add_color_stop_rgba (pattern, stop->offset, 205 + stop->red, stop->green, 206 + stop->blue, 207 + stop->opacity * 208 + style->opacity); 209 + stop = stop->next; 210 + } 211 + cairo_set_source (cairo, pattern); 212 + cairo_set_line_cap (cairo, style->stroke_linecap); 213 + cairo_set_line_join (cairo, style->stroke_linejoin); 214 + cairo_set_miter_limit (cairo, style->stroke_miterlimit); 215 + if (style->stroke_dashitems == 0 216 + || style->stroke_dasharray == NULL) 217 + cairo_set_dash (cairo, lengths, 0, 0.0); 218 + else 219 + cairo_set_dash (cairo, style->stroke_dasharray, 220 + style->stroke_dashitems, 221 + style->stroke_dashoffset); 222 + cairo_pattern_destroy (pattern); 223 + return; 224 + } 225 + else if (grad->type == GG_SVG_RADIAL_GRADIENT) 226 + { 227 + pattern = 228 + cairo_pattern_create_radial (grad->cx, grad->cy, 0.0, 229 + grad->fx, grad->fy, grad->r); 230 + gg_svg_apply_gradient_transformations (pattern, grad); 231 + stop = grad->first_stop; 232 + while (stop) 233 + { 234 + cairo_pattern_add_color_stop_rgba (pattern, stop->offset, 235 + stop->red, stop->green, 236 + stop->blue, 237 + stop->opacity * 238 + style->opacity); 239 + stop = stop->next; 240 + } 241 + cairo_set_source (cairo, pattern); 242 + cairo_set_line_cap (cairo, style->stroke_linecap); 243 + cairo_set_line_join (cairo, style->stroke_linejoin); 244 + cairo_set_miter_limit (cairo, style->stroke_miterlimit); 245 + if (style->stroke_dashitems == 0 246 + || style->stroke_dasharray == NULL) 247 + cairo_set_dash (cairo, lengths, 0, 0.0); 248 + else 249 + cairo_set_dash (cairo, style->stroke_dasharray, 250 + style->stroke_dashitems, 251 + style->stroke_dashoffset); 252 + cairo_pattern_destroy (pattern); 253 + return; 254 + } 255 + } 256 + cairo_set_source_rgba (cairo, style->stroke_red, style->stroke_green, 257 + style->stroke_blue, 258 + style->stroke_opacity * style->opacity); 259 + cairo_set_line_cap (cairo, style->stroke_linecap); 260 + cairo_set_line_join (cairo, style->stroke_linejoin); 261 + cairo_set_miter_limit (cairo, style->stroke_miterlimit); 262 + if (style->stroke_dashitems == 0 || style->stroke_dasharray == NULL) 263 + cairo_set_dash (cairo, lengths, 0, 0.0); 264 + else 265 + cairo_set_dash (cairo, style->stroke_dasharray, style->stroke_dashitems, 266 + style->stroke_dashoffset); 267 +} 268 + 269 +static void 270 +gg_svg_set_brush (cairo_t * cairo, struct gg_svg_style *style) 271 +{ 272 +/* setting up a Brush for Cairo */ 273 + cairo_pattern_t *pattern; 274 + if (style->fill_url != NULL && style->fill_pointer != NULL) 275 + { 276 + struct gg_svg_gradient *grad = style->fill_pointer; 277 + struct gg_svg_gradient_stop *stop; 278 + if (grad->type == GG_SVG_LINEAR_GRADIENT) 279 + { 280 + pattern = 281 + cairo_pattern_create_linear (grad->x1, grad->y1, grad->x2, 282 + grad->y2); 283 + gg_svg_apply_gradient_transformations (pattern, grad); 284 + stop = grad->first_stop; 285 + while (stop) 286 + { 287 + cairo_pattern_add_color_stop_rgba (pattern, stop->offset, 288 + stop->red, stop->green, 289 + stop->blue, 290 + stop->opacity * 291 + style->opacity); 292 + stop = stop->next; 293 + } 294 + cairo_set_source (cairo, pattern); 295 + cairo_pattern_destroy (pattern); 296 + return; 297 + } 298 + else if (grad->type == GG_SVG_RADIAL_GRADIENT) 299 + { 300 + pattern = 301 + cairo_pattern_create_radial (grad->cx, grad->cy, 0.0, 302 + grad->fx, grad->fy, grad->r); 303 + gg_svg_apply_gradient_transformations (pattern, grad); 304 + stop = grad->first_stop; 305 + while (stop) 306 + { 307 + cairo_pattern_add_color_stop_rgba (pattern, stop->offset, 308 + stop->red, stop->green, 309 + stop->blue, 310 + stop->opacity * 311 + style->opacity); 312 + stop = stop->next; 313 + } 314 + cairo_set_source (cairo, pattern); 315 + cairo_pattern_destroy (pattern); 316 + return; 317 + } 318 + } 319 + 320 + cairo_set_source_rgba (cairo, style->fill_red, style->fill_green, 321 + style->fill_blue, 322 + style->fill_opacity * style->opacity); 323 + cairo_set_fill_rule (cairo, style->fill_rule); 324 +} 325 + 326 +static void 327 +gg_svg_draw_rect (cairo_t * cairo, struct gg_svg_shape *shape, 328 + struct gg_svg_style *style) 329 +{ 330 +/* drawing an SVG Rect */ 331 + struct gg_svg_rect *rect = shape->data; 332 + if (rect->width == 0 || rect->height == 0) 333 + return; 334 + if (style->visibility == 0) 335 + return; 336 + if (style->fill == 0 && style->stroke == 0) 337 + return; 338 + 339 + if (rect->rx <= 0 || rect->ry <= 0) 340 + { 341 + /* normal Rect */ 342 + cairo_rectangle (cairo, rect->x, rect->y, rect->width, rect->height); 343 + } 344 + else 345 + { 346 + /* rounded Rect */ 347 + cairo_new_sub_path (cairo); 348 + cairo_save (cairo); 349 + cairo_translate (cairo, rect->x + rect->rx, rect->y + rect->ry); 350 + cairo_scale (cairo, rect->rx, rect->ry); 351 + cairo_arc (cairo, 0.0, 0.0, 1.0, GG_SVG_PI, -1 * GG_SVG_PI / 2.0); 352 + cairo_restore (cairo); 353 + cairo_save (cairo); 354 + cairo_translate (cairo, rect->x + rect->width - rect->rx, 355 + rect->y + rect->ry); 356 + cairo_scale (cairo, rect->rx, rect->ry); 357 + cairo_arc (cairo, 0.0, 0.0, 1.0, -1 * GG_SVG_PI / 2.0, 0.0); 358 + cairo_restore (cairo); 359 + cairo_save (cairo); 360 + cairo_translate (cairo, rect->x + rect->width - rect->rx, 361 + rect->y + rect->height - rect->ry); 362 + cairo_scale (cairo, rect->rx, rect->ry); 363 + cairo_arc (cairo, 0.0, 0.0, 1.0, 0.0, GG_SVG_PI / 2.0); 364 + cairo_restore (cairo); 365 + cairo_save (cairo); 366 + cairo_translate (cairo, rect->x + rect->rx, 367 + rect->y + rect->height - rect->ry); 368 + cairo_scale (cairo, rect->rx, rect->ry); 369 + cairo_arc (cairo, 0.0, 0.0, 1.0, GG_SVG_PI / 2.0, GG_SVG_PI); 370 + cairo_restore (cairo); 371 + cairo_close_path (cairo); 372 + } 373 + 374 +/* drawing the Rect */ 375 + if (style->fill) 376 + { 377 + /* filling */ 378 + gg_svg_set_brush (cairo, style); 379 + if (style->stroke) 380 + cairo_fill_preserve (cairo); 381 + else 382 + cairo_fill (cairo); 383 + } 384 + if (style->stroke) 385 + { 386 + /* stroking */ 387 + gg_svg_set_pen (cairo, style); 388 + cairo_stroke (cairo); 389 + } 390 +} 391 + 392 +static void 393 +gg_svg_clip_rect (cairo_t * cairo, struct gg_svg_shape *shape) 394 +{ 395 +/* clipping an SVG Rect */ 396 + struct gg_svg_rect *rect = shape->data; 397 + if (rect->width == 0 || rect->height == 0) 398 + return; 399 + 400 + if (rect->rx <= 0 || rect->ry <= 0) 401 + { 402 + /* normal Rect */ 403 + cairo_rectangle (cairo, rect->x, rect->y, rect->width, rect->height); 404 + } 405 + else 406 + { 407 + /* rounded Rect */ 408 + cairo_new_sub_path (cairo); 409 + cairo_save (cairo); 410 + cairo_translate (cairo, rect->x + rect->rx, rect->y + rect->ry); 411 + cairo_scale (cairo, rect->rx, rect->ry); 412 + cairo_arc (cairo, 0.0, 0.0, 1.0, GG_SVG_PI, -1 * GG_SVG_PI / 2.0); 413 + cairo_restore (cairo); 414 + cairo_save (cairo); 415 + cairo_translate (cairo, rect->x + rect->width - rect->rx, 416 + rect->y + rect->ry); 417 + cairo_scale (cairo, rect->rx, rect->ry); 418 + cairo_arc (cairo, 0.0, 0.0, 1.0, -1 * GG_SVG_PI / 2.0, 0.0); 419 + cairo_restore (cairo); 420 + cairo_save (cairo); 421 + cairo_translate (cairo, rect->x + rect->width - rect->rx, 422 + rect->y + rect->height - rect->ry); 423 + cairo_scale (cairo, rect->rx, rect->ry); 424 + cairo_arc (cairo, 0.0, 0.0, 1.0, 0.0, GG_SVG_PI / 2.0); 425 + cairo_restore (cairo); 426 + cairo_save (cairo); 427 + cairo_translate (cairo, rect->x + rect->rx, 428 + rect->y + rect->height - rect->ry); 429 + cairo_scale (cairo, rect->rx, rect->ry); 430 + cairo_arc (cairo, 0.0, 0.0, 1.0, GG_SVG_PI / 2.0, GG_SVG_PI); 431 + cairo_restore (cairo); 432 + cairo_close_path (cairo); 433 + } 434 + cairo_clip (cairo); 435 +} 436 + 437 +static void 438 +gg_svg_draw_circle (cairo_t * cairo, struct gg_svg_shape *shape, 439 + struct gg_svg_style *style) 440 +{ 441 +/* drawing an SVG Circle */ 442 + struct gg_svg_circle *circle = shape->data; 443 + if (circle->r <= 0) 444 + return; 445 + if (style->visibility == 0) 446 + return; 447 + if (style->fill == 0 && style->stroke == 0) 448 + return; 449 + 450 +/* drawing the Arc */ 451 + cairo_arc (cairo, circle->cx, circle->cy, circle->r, 0.0, 2.0 * GG_SVG_PI); 452 + if (style->fill) 453 + { 454 + /* filling */ 455 + gg_svg_set_brush (cairo, style); 456 + if (style->stroke) 457 + cairo_fill_preserve (cairo); 458 + else 459 + cairo_fill (cairo); 460 + } 461 + if (style->stroke) 462 + { 463 + /* stroking */ 464 + gg_svg_set_pen (cairo, style); 465 + cairo_stroke (cairo); 466 + } 467 +} 468 + 469 +static void 470 +gg_svg_clip_circle (cairo_t * cairo, struct gg_svg_shape *shape) 471 +{ 472 +/* clipping an SVG Circle */ 473 + struct gg_svg_circle *circle = shape->data; 474 + if (circle->r <= 0) 475 + return; 476 + 477 +/* clipping the Arc */ 478 + cairo_arc (cairo, circle->cx, circle->cy, circle->r, 0.0, 2.0 * GG_SVG_PI); 479 + cairo_clip (cairo); 480 +} 481 + 482 +static void 483 +gg_svg_draw_ellipse (cairo_t * cairo, struct gg_svg_shape *shape, 484 + struct gg_svg_style *style) 485 +{ 486 +/* drawing an SVG Ellipse */ 487 + struct gg_svg_ellipse *ellipse = shape->data; 488 + if (ellipse->rx <= 0 || ellipse->ry <= 0) 489 + return; 490 + if (style->visibility == 0) 491 + return; 492 + if (style->fill == 0 && style->stroke == 0) 493 + return; 494 + 495 +/* drawing the Ellipse */ 496 + cairo_save (cairo); 497 + 498 + cairo_translate (cairo, ellipse->cx + ellipse->rx / 2.0, 499 + ellipse->cy + ellipse->ry / 2.0); 500 + cairo_scale (cairo, ellipse->rx / 2.0, ellipse->ry / 2.0); 501 + cairo_arc (cairo, 0.0, 0.0, 2.0, 0.0, 2.0 * GG_SVG_PI); 502 + cairo_restore (cairo); 503 + if (style->fill) 504 + { 505 + /* filling */ 506 + gg_svg_set_brush (cairo, style); 507 + if (style->stroke) 508 + cairo_fill_preserve (cairo); 509 + else 510 + cairo_fill (cairo); 511 + } 512 + if (style->stroke) 513 + { 514 + /* stroking */ 515 + gg_svg_set_pen (cairo, style); 516 + cairo_stroke (cairo); 517 + } 518 +} 519 + 520 +static void 521 +gg_svg_clip_ellipse (cairo_t * cairo, struct gg_svg_shape *shape) 522 +{ 523 +/* clipping an SVG Ellipse */ 524 + struct gg_svg_ellipse *ellipse = shape->data; 525 + if (ellipse->rx <= 0 || ellipse->ry <= 0) 526 + return; 527 + 528 +/* clipping the Ellipse */ 529 + cairo_save (cairo); 530 + 531 + cairo_translate (cairo, ellipse->cx + ellipse->rx / 2.0, 532 + ellipse->cy + ellipse->ry / 2.0); 533 + cairo_scale (cairo, ellipse->rx / 2.0, ellipse->ry / 2.0); 534 + cairo_arc (cairo, 0.0, 0.0, 2.0, 0.0, 2.0 * GG_SVG_PI); 535 + cairo_restore (cairo); 536 + cairo_clip (cairo); 537 +} 538 + 539 +static void 540 +gg_svg_draw_line (cairo_t * cairo, struct gg_svg_shape *shape, 541 + struct gg_svg_style *style) 542 +{ 543 +/* drawing an SVG Line */ 544 + struct gg_svg_line *line = shape->data; 545 + if (style->visibility == 0) 546 + return; 547 + if (style->fill == 0 && style->stroke == 0) 548 + return; 549 + 550 +/* drawing the Line */ 551 + cairo_move_to (cairo, line->x1, line->y1); 552 + cairo_line_to (cairo, line->x2, line->y2); 553 + if (style->fill) 554 + { 555 + /* filling */ 556 + gg_svg_set_brush (cairo, style); 557 + cairo_fill (cairo); 558 + } 559 + if (style->stroke) 560 + { 561 + /* stroking */ 562 + gg_svg_set_pen (cairo, style); 563 + cairo_stroke (cairo); 564 + } 565 +} 566 + 567 +static void 568 +gg_svg_clip_line (cairo_t * cairo, struct gg_svg_shape *shape) 569 +{ 570 +/* clipping an SVG Line */ 571 + struct gg_svg_line *line = shape->data; 572 + 573 +/* clipping the Line */ 574 + cairo_move_to (cairo, line->x1, line->y1); 575 + cairo_line_to (cairo, line->x2, line->y2); 576 + cairo_clip (cairo); 577 +} 578 + 579 +static void 580 +gg_svg_draw_polyline (cairo_t * cairo, struct gg_svg_shape *shape, 581 + struct gg_svg_style *style) 582 +{ 583 +/* drawing an SVG Polyline */ 584 + int iv; 585 + struct gg_svg_polyline *poly = shape->data; 586 + if (poly->points <= 0 || poly->x == NULL || poly->y == NULL) 587 + return; 588 + if (style->visibility == 0) 589 + return; 590 + if (style->fill == 0 && style->stroke == 0) 591 + return; 592 + 593 +/* drawing the Polyline */ 594 + for (iv = 0; iv < poly->points; iv++) 595 + { 596 + if (iv == 0) 597 + cairo_move_to (cairo, *(poly->x + iv), *(poly->y + iv)); 598 + else 599 + cairo_line_to (cairo, *(poly->x + iv), *(poly->y + iv)); 600 + } 601 + if (style->fill) 602 + { 603 + /* filling */ 604 + gg_svg_set_brush (cairo, style); 605 + if (style->stroke) 606 + cairo_fill_preserve (cairo); 607 + else 608 + cairo_fill (cairo); 609 + } 610 + if (style->stroke) 611 + { 612 + /* stroking */ 613 + gg_svg_set_pen (cairo, style); 614 + cairo_stroke (cairo); 615 + } 616 +} 617 + 618 +static void 619 +gg_svg_clip_polyline (cairo_t * cairo, struct gg_svg_shape *shape) 620 +{ 621 +/* clipping an SVG Polyline */ 622 + int iv; 623 + struct gg_svg_polyline *poly = shape->data; 624 + if (poly->points <= 0 || poly->x == NULL || poly->y == NULL) 625 + return; 626 + 627 +/* clipping the Polyline */ 628 + for (iv = 0; iv < poly->points; iv++) 629 + { 630 + if (iv == 0) 631 + cairo_move_to (cairo, *(poly->x + iv), *(poly->y + iv)); 632 + else 633 + cairo_line_to (cairo, *(poly->x + iv), *(poly->y + iv)); 634 + } 635 + cairo_clip (cairo); 636 +} 637 + 638 +static void 639 +gg_svg_draw_polygon (cairo_t * cairo, struct gg_svg_shape *shape, 640 + struct gg_svg_style *style) 641 +{ 642 +/* drawing an SVG Polygon */ 643 + int iv; 644 + struct gg_svg_polygon *poly = shape->data; 645 + if (poly->points <= 0 || poly->x == NULL || poly->y == NULL) 646 + return; 647 + if (style->visibility == 0) 648 + return; 649 + if (style->fill == 0 && style->stroke == 0) 650 + return; 651 + 652 +/* drawing the Polygon */ 653 + for (iv = 0; iv < poly->points; iv++) 654 + { 655 + if (iv == 0) 656 + cairo_move_to (cairo, *(poly->x + iv), *(poly->y + iv)); 657 + else 658 + cairo_line_to (cairo, *(poly->x + iv), *(poly->y + iv)); 659 + } 660 + cairo_close_path (cairo); 661 + if (style->fill) 662 + { 663 + /* filling */ 664 + gg_svg_set_brush (cairo, style); 665 + if (style->stroke) 666 + cairo_fill_preserve (cairo); 667 + else 668 + cairo_fill (cairo); 669 + } 670 + if (style->stroke) 671 + { 672 + /* stroking */ 673 + gg_svg_set_pen (cairo, style); 674 + cairo_stroke (cairo); 675 + } 676 +} 677 + 678 +static void 679 +gg_svg_clip_polygon (cairo_t * cairo, struct gg_svg_shape *shape) 680 +{ 681 +/* clipping an SVG Polygon */ 682 + int iv; 683 + struct gg_svg_polygon *poly = shape->data; 684 + if (poly->points <= 0 || poly->x == NULL || poly->y == NULL) 685 + return; 686 + 687 +/* clipping the Polygon */ 688 + for (iv = 0; iv < poly->points; iv++) 689 + { 690 + if (iv == 0) 691 + cairo_move_to (cairo, *(poly->x + iv), *(poly->y + iv)); 692 + else 693 + cairo_line_to (cairo, *(poly->x + iv), *(poly->y + iv)); 694 + } 695 + cairo_close_path (cairo); 696 + cairo_clip (cairo); 697 +} 698 + 699 +static void 700 +svg_rotate (double x, double y, double angle, double *rx, double *ry) 701 +{ 702 +/* rotate a point of an angle around the origin point */ 703 + *rx = x * cos (angle) - y * sin (angle); 704 + *ry = y * cos (angle) + x * sin (angle); 705 +} 706 + 707 +static double 708 +gg_svg_point_angle (double cx, double cy, double px, double py) 709 +{ 710 +/* return angle between x axis and point knowing given center */ 711 + return atan2 (py - cy, px - cx); 712 +} 713 + 714 +static void 715 +gg_svg_arc_to_cairo (struct gg_svg_path_ellipt_arc *arc, double x1, double y1, 716 + double *xc, double *yc, double *rx, double *rotation, 717 + double *radii_ratio, double *angle1, double *angle2) 718 +{ 719 +/* 720 +/ computing the arguments for CairoArc starting from an SVG Elliptic Arc 721 +/ (simply a C translation of pyCairo Python code) 722 +*/ 723 + double x3; 724 + double y3; 725 + double ry; 726 + double xe; 727 + double ye; 728 + double angle; 729 +/* converting absolute x3 and y3 to relative */ 730 + x3 = arc->x - x1; 731 + y3 = arc->y - y1; 732 + *rx = arc->rx; 733 + ry = arc->ry; 734 + *radii_ratio = ry / *rx; 735 + *rotation = arc->rotation * (GG_SVG_PI / 180.0); 736 +/* cancel the rotation of the second point */ 737 + svg_rotate (x3, y3, *rotation * -1, &xe, &ye); 738 + ye /= *radii_ratio; 739 +/* find the angle between the second point and the x axis */ 740 + angle = gg_svg_point_angle (0.0, 0.0, xe, ye); 741 +/* put the second point onto the x axis */ 742 + xe = sqrt ((xe * xe) + (ye * ye)); 743 + ye = 0.0; 744 +/* update the x radius if it is too small */ 745 + if (*rx < xe / 2.0) 746 + *rx = xe / 2.0; 747 +/* find one circle centre */ 748 + *xc = xe / 2.0; 749 + *yc = sqrt ((*rx * *rx) - (*xc * *xc)); 750 +/* choose between the two circles according to flags */ 751 + if ((arc->large_arc ^ arc->sweep) == 0) 752 + *yc = *yc * -1.0; 753 +/* put the second point and the center back to their positions */ 754 + svg_rotate (xe, ye, angle, &xe, &ye); 755 + svg_rotate (*xc, *yc, angle, xc, yc); 756 +/* find the drawing angles */ 757 + *angle1 = gg_svg_point_angle (*xc, *yc, 0.0, 0.0); 758 + *angle2 = gg_svg_point_angle (*xc, *yc, xe, ye); 759 +} 760 + 761 +static void 762 +gg_svg_draw_path (cairo_t * cairo, struct gg_svg_shape *shape, 763 + struct gg_svg_style *style) 764 +{ 765 +/* drawing an SVG Path */ 766 + struct gg_svg_path_item *item; 767 + struct gg_svg_path *path = shape->data; 768 + struct gg_svg_path_move *move; 769 + struct gg_svg_path_bezier *bezier; 770 + struct gg_svg_path_ellipt_arc *arc; 771 + double x; 772 + double y; 773 + double x0; 774 + double y0; 775 + double radii_ratio; 776 + double xc; 777 + double yc; 778 + double rx; 779 + double rotation; 780 + double angle1; 781 + double angle2; 782 + int is_new_path = 0; 783 + if (path->error) 784 + return; 785 + if (style->visibility == 0) 786 + return; 787 + if (style->fill == 0 && style->stroke == 0) 788 + return; 789 + 790 +/* drawing the Path */ 791 + item = path->first; 792 + while (item) 793 + { 794 + if (is_new_path && item->type != GG_SVG_MOVE_TO) 795 + { 796 + /* implicit MoveTO */ 797 + cairo_get_current_point (cairo, &x, &y); 798 + cairo_move_to (cairo, x, y); 799 + } 800 + is_new_path = 0; 801 + switch (item->type) 802 + { 803 + case GG_SVG_CLOSE_PATH: 804 + cairo_close_path (cairo); 805 + is_new_path = 1; 806 + break; 807 + case GG_SVG_MOVE_TO: 808 + move = item->data; 809 + cairo_move_to (cairo, move->x, move->y); 810 + break; 811 + case GG_SVG_LINE_TO: 812 + move = item->data; 813 + cairo_line_to (cairo, move->x, move->y); 814 + break; 815 + case GG_SVG_CURVE_3: 816 + bezier = item->data; 817 + cairo_curve_to (cairo, bezier->x1, bezier->y1, bezier->x2, 818 + bezier->y2, bezier->x, bezier->y); 819 + break; 820 + case GG_SVG_CURVE_4: 821 + bezier = item->data; 822 + cairo_get_current_point (cairo, &x0, &y0); 823 + cairo_curve_to (cairo, 2.0 / 3.0 * bezier->x1 + 1.0 / 3.0 * x0, 824 + 2.0 / 3.0 * bezier->y1 + 1.0 / 3.0 * y0, 825 + 2.0 / 3.0 * bezier->x1 + 1.0 / 3.0 * bezier->x2, 826 + 2.0 / 3.0 * bezier->y1 + 1.0 / 3.0 * bezier->y2, 827 + bezier->y1, bezier->y2); 828 + break; 829 + case GG_SVG_ELLIPT_ARC: 830 + arc = item->data; 831 + cairo_get_current_point (cairo, &x0, &y0); 832 + gg_svg_arc_to_cairo (arc, x0, y0, &xc, &yc, &rx, &rotation, 833 + &radii_ratio, &angle1, &angle2); 834 + cairo_save (cairo); 835 + cairo_translate (cairo, x0, y0); 836 + cairo_rotate (cairo, rotation); 837 + cairo_scale (cairo, 1.0, radii_ratio); 838 + if (arc->sweep == 0) 839 + cairo_arc_negative (cairo, xc, yc, rx, angle1, angle2); 840 + else 841 + cairo_arc (cairo, xc, yc, rx, angle1, angle2); 842 + cairo_restore (cairo); 843 + break; 844 + }; 845 + item = item->next; 846 + } 847 + if (style->fill) 848 + { 849 + /* filling */ 850 + gg_svg_set_brush (cairo, style); 851 + if (style->stroke) 852 + cairo_fill_preserve (cairo); 853 + else 854 + cairo_fill (cairo); 855 + } 856 + if (style->stroke) 857 + { 858 + /* stroking */ 859 + gg_svg_set_pen (cairo, style); 860 + cairo_stroke (cairo); 861 + } 862 +} 863 + 864 +static void 865 +gg_svg_clip_path (cairo_t * cairo, struct gg_svg_shape *shape) 866 +{ 867 +/* clipping an SVG Path */ 868 + struct gg_svg_path_item *item; 869 + struct gg_svg_path *path = shape->data; 870 + struct gg_svg_path_move *move; 871 + struct gg_svg_path_bezier *bezier; 872 + struct gg_svg_path_ellipt_arc *arc; 873 + double x; 874 + double y; 875 + double x0; 876 + double y0; 877 + double radii_ratio; 878 + double xc; 879 + double yc; 880 + double rx; 881 + double rotation; 882 + double angle1; 883 + double angle2; 884 + int is_new_path = 0; 885 + if (path->error) 886 + return; 887 +/* clipping the Path */ 888 + item = path->first; 889 + while (item) 890 + { 891 + if (is_new_path && item->type != GG_SVG_MOVE_TO) 892 + { 893 + /* implicit MoveTO */ 894 + cairo_get_current_point (cairo, &x, &y); 895 + cairo_move_to (cairo, x, y); 896 + } 897 + is_new_path = 0; 898 + switch (item->type) 899 + { 900 + case GG_SVG_CLOSE_PATH: 901 + cairo_close_path (cairo); 902 + is_new_path = 1; 903 + break; 904 + case GG_SVG_MOVE_TO: 905 + move = item->data; 906 + cairo_move_to (cairo, move->x, move->y); 907 + break; 908 + case GG_SVG_LINE_TO: 909 + move = item->data; 910 + cairo_line_to (cairo, move->x, move->y); 911 + break; 912 + case GG_SVG_CURVE_3: 913 + bezier = item->data; 914 + cairo_curve_to (cairo, bezier->x1, bezier->y1, bezier->x2, 915 + bezier->y2, bezier->x, bezier->y); 916 + break; 917 + case GG_SVG_CURVE_4: 918 + bezier = item->data; 919 + cairo_get_current_point (cairo, &x0, &y0); 920 + cairo_curve_to (cairo, 2.0 / 3.0 * bezier->x1 + 1.0 / 3.0 * x0, 921 + 2.0 / 3.0 * bezier->y1 + 1.0 / 3.0 * y0, 922 + 2.0 / 3.0 * bezier->x1 + 1.0 / 3.0 * bezier->x2, 923 + 2.0 / 3.0 * bezier->y1 + 1.0 / 3.0 * bezier->y2, 924 + bezier->y1, bezier->y2); 925 + break; 926 + case GG_SVG_ELLIPT_ARC: 927 + arc = item->data; 928 + cairo_get_current_point (cairo, &x0, &y0); 929 + gg_svg_arc_to_cairo (arc, x0, y0, &xc, &yc, &rx, &rotation, 930 + &radii_ratio, &angle1, &angle2); 931 + cairo_save (cairo); 932 + cairo_translate (cairo, x0, y0); 933 + cairo_rotate (cairo, rotation); 934 + cairo_scale (cairo, 1.0, radii_ratio); 935 + if (arc->sweep == 0) 936 + cairo_arc_negative (cairo, xc, yc, rx, angle1, angle2); 937 + else 938 + cairo_arc (cairo, xc, yc, rx, angle1, angle2); 939 + cairo_restore (cairo); 940 + break; 941 + }; 942 + item = item->next; 943 + } 944 + cairo_clip (cairo); 945 +} 946 + 947 +static void 948 +gg_svg_draw_shape (cairo_t * cairo, struct gg_svg_shape *shape, 949 + struct gg_svg_style *style) 950 +{ 951 +/* drawing an SVG Shape */ 952 + if (shape->style.visibility == 0) 953 + return; 954 + switch (shape->type) 955 + { 956 + case GG_SVG_RECT: 957 + gg_svg_draw_rect (cairo, shape, style); 958 + break; 959 + case GG_SVG_CIRCLE: 960 + gg_svg_draw_circle (cairo, shape, style); 961 + break; 962 + case GG_SVG_ELLIPSE: 963 + gg_svg_draw_ellipse (cairo, shape, style); 964 + break; 965 + case GG_SVG_LINE: 966 + gg_svg_draw_line (cairo, shape, style); 967 + break; 968 + case GG_SVG_POLYLINE: 969 + gg_svg_draw_polyline (cairo, shape, style); 970 + break; 971 + case GG_SVG_POLYGON: 972 + gg_svg_draw_polygon (cairo, shape, style); 973 + break; 974 + case GG_SVG_PATH: 975 + gg_svg_draw_path (cairo, shape, style); 976 + break; 977 + }; 978 +} 979 + 980 +static void 981 +gg_svg_transformation (cairo_t * cairo, struct gg_svg_transform *trans) 982 +{ 983 +/* applying a single transformation */ 984 + double angle; 985 + double tangent; 986 + struct gg_svg_matrix *mtrx; 987 + struct gg_svg_translate *translate; 988 + struct gg_svg_scale *scale; 989 + struct gg_svg_rotate *rotate; 990 + struct gg_svg_skew *skew; 991 + cairo_matrix_t matrix; 992 + cairo_matrix_t matrix_in; 993 + 994 + if (trans->data == NULL) 995 + return; 996 + switch (trans->type) 997 + { 998 + case GG_SVG_MATRIX: 999 + mtrx = trans->data; 1000 + cairo_get_matrix (cairo, &matrix); 1001 + matrix_in.xx = mtrx->a; 1002 + matrix_in.yx = mtrx->b; 1003 + matrix_in.xy = mtrx->c; 1004 + matrix_in.yy = mtrx->d; 1005 + matrix_in.x0 = mtrx->e; 1006 + matrix_in.y0 = mtrx->f; 1007 + cairo_matrix_multiply (&matrix, &matrix_in, &matrix); 1008 + cairo_set_matrix (cairo, &matrix); 1009 + break; 1010 + case GG_SVG_TRANSLATE: 1011 + translate = trans->data; 1012 + cairo_get_matrix (cairo, &matrix); 1013 + cairo_matrix_translate (&matrix, translate->tx, translate->ty); 1014 + cairo_set_matrix (cairo, &matrix); 1015 + break; 1016 + case GG_SVG_SCALE: 1017 + scale = trans->data; 1018 + cairo_get_matrix (cairo, &matrix); 1019 + cairo_matrix_scale (&matrix, scale->sx, scale->sy); 1020 + cairo_set_matrix (cairo, &matrix); 1021 + break; 1022 + case GG_SVG_ROTATE: 1023 + rotate = trans->data; 1024 + cairo_get_matrix (cairo, &matrix); 1025 + angle = rotate->angle * (GG_SVG_PI / 180.0); 1026 + cairo_matrix_translate (&matrix, rotate->cx, rotate->cy); 1027 + cairo_matrix_rotate (&matrix, angle); 1028 + cairo_matrix_translate (&matrix, -1.0 * rotate->cx, 1029 + -1.0 * rotate->cy); 1030 + cairo_set_matrix (cairo, &matrix); 1031 + break; 1032 + case GG_SVG_SKEW_X: 1033 + skew = trans->data; 1034 + cairo_get_matrix (cairo, &matrix); 1035 + angle = skew->angle * (GG_SVG_PI / 180.0); 1036 + tangent = tan (angle); 1037 + matrix_in.xx = 1.0; 1038 + matrix_in.yx = 0.0; 1039 + matrix_in.xy = tangent; 1040 + matrix_in.yy = 1.0; 1041 + matrix_in.x0 = 0.0; 1042 + matrix_in.y0 = 0.0; 1043 + cairo_matrix_multiply (&matrix, &matrix_in, &matrix); 1044 + cairo_set_matrix (cairo, &matrix); 1045 + break; 1046 + case GG_SVG_SKEW_Y: 1047 + skew = trans->data; 1048 + cairo_get_matrix (cairo, &matrix); 1049 + angle = skew->angle * (GG_SVG_PI / 180.0); 1050 + tangent = tan (angle); 1051 + matrix_in.xx = 1.0; 1052 + matrix_in.yx = tangent; 1053 + matrix_in.xy = 0.0; 1054 + matrix_in.yy = 1.0; 1055 + matrix_in.x0 = 0.0; 1056 + matrix_in.y0 = 0.0; 1057 + cairo_matrix_multiply (&matrix, &matrix_in, &matrix); 1058 + cairo_set_matrix (cairo, &matrix); 1059 + break; 1060 + }; 1061 +} 1062 + 1063 +static void 1064 +gg_svg_apply_transformations (cairo_t * cairo, struct gg_svg_document *svg_doc, 1065 + struct gg_svg_shape *shape) 1066 +{ 1067 +/* applying the whole transformations chain (supporting inheritance) */ 1068 + struct gg_svg_group *parent; 1069 + struct gg_svg_parents chain; 1070 + struct gg_svg_parent_ref *ref; 1071 + struct gg_svg_group *group; 1072 + struct gg_svg_transform *trans; 1073 + cairo_matrix_t matrix; 1074 + 1075 +/* initializing the chain as empty */ 1076 + chain.first = NULL; 1077 + chain.last = NULL; 1078 + 1079 + parent = shape->parent; 1080 + if (parent != NULL) 1081 + { 1082 + /* identifying all direct parents in reverse order */ 1083 + while (parent) 1084 + { 1085 + gg_svg_add_parent (&chain, parent); 1086 + parent = parent->parent; 1087 + } 1088 + } 1089 + 1090 +/* starting from the SVG Document basic transformations */ 1091 + matrix.xx = svg_doc->matrix.xx; 1092 + matrix.yx = svg_doc->matrix.yx; 1093 + matrix.xy = svg_doc->matrix.xy; 1094 + matrix.yy = svg_doc->matrix.yy; 1095 + matrix.x0 = svg_doc->matrix.x0; 1096 + matrix.y0 = svg_doc->matrix.y0; 1097 + cairo_set_matrix (cairo, &matrix); 1098 + 1099 + ref = chain.first; 1100 + while (ref) 1101 + { 1102 + /* chaining all transformations inherited by ancestors */ 1103 + group = ref->parent; 1104 + if (group != NULL) 1105 + { 1106 + trans = group->first_trans; 1107 + while (trans) 1108 + { 1109 + gg_svg_transformation (cairo, trans); 1110 + trans = trans->next; 1111 + } 1112 + } 1113 + ref = ref->next; 1114 + } 1115 + 1116 +/* applying Shape specific transformations */ 1117 + trans = shape->first_trans; 1118 + while (trans) 1119 + { 1120 + gg_svg_transformation (cairo, trans); 1121 + trans = trans->next; 1122 + } 1123 + 1124 + gg_svg_free_parents (&chain); 1125 +} 1126 + 1127 +static void 1128 +gg_svg_apply_style (struct gg_svg_shape *shape, struct gg_svg_style *style) 1129 +{ 1130 +/* applying the final style (supporting inheritance) */ 1131 + struct gg_svg_group *parent; 1132 + struct gg_svg_parents chain; 1133 + struct gg_svg_parent_ref *ref; 1134 + struct gg_svg_group *group; 1135 + 1136 +/* initializing the chain as empty */ 1137 + chain.first = NULL; 1138 + chain.last = NULL; 1139 + 1140 + parent = shape->parent; 1141 + if (parent != NULL) 1142 + { 1143 + /* identifying all parents in reverse order */ 1144 + while (parent) 1145 + { 1146 + gg_svg_add_parent (&chain, parent); 1147 + parent = parent->parent; 1148 + } 1149 + } 1150 + 1151 +/* initializing an Undefined Style */ 1152 + style->visibility = 1; 1153 + style->opacity = 1.0; 1154 + style->fill = 1; 1155 + style->no_fill = 0; 1156 + style->fill_url = NULL; 1157 + style->fill_pointer = NULL; 1158 + style->fill_rule = -1; 1159 + style->fill_red = 0.0; 1160 + style->fill_green = 0.0; 1161 + style->fill_blue = 0.0; 1162 + style->fill_opacity = 1.0; 1163 + style->stroke = -1; 1164 + style->no_stroke = 0; 1165 + style->stroke_url = NULL; 1166 + style->stroke_pointer = NULL; 1167 + style->stroke_width = -1.0; 1168 + style->stroke_linecap = -1; 1169 + style->stroke_linejoin = -1; 1170 + style->stroke_miterlimit = -1.0; 1171 + style->stroke_dashitems = 0; 1172 + style->stroke_dasharray = NULL; 1173 + style->stroke_dashoffset = 0.0; 1174 + style->stroke_red = -1.0; 1175 + style->stroke_green = -1.0; 1176 + style->stroke_blue = -1.0; 1177 + style->stroke_opacity = -1.0; 1178 + style->clip_url = NULL; 1179 + style->clip_pointer = NULL; 1180 + 1181 + ref = chain.first; 1182 + while (ref) 1183 + { 1184 + /* chaining all style definitions inherited by ancestors */ 1185 + group = ref->parent; 1186 + if (group != NULL) 1187 + { 1188 + if (group->style.visibility >= 0) 1189 + style->visibility = group->style.visibility; 1190 + style->opacity = group->style.opacity; 1191 + if (group->style.fill >= 0) 1192 + style->fill = group->style.fill; 1193 + if (group->style.no_fill) 1194 + style->no_fill = group->style.no_fill; 1195 + if (group->style.fill_rule >= 0) 1196 + style->fill_rule = group->style.fill_rule; 1197 + if (group->style.fill_url != NULL) 1198 + gg_svg_add_fill_gradient_url (style, group->style.fill_url); 1199 + if (group->style.fill_red >= 0.0) 1200 + style->fill_red = group->style.fill_red; 1201 + if (group->style.fill_green >= 0.0) 1202 + style->fill_green = group->style.fill_green; 1203 + if (group->style.fill_blue >= 0.0) 1204 + style->fill_blue = group->style.fill_blue; 1205 + if (group->style.fill_opacity >= 0.0) 1206 + style->fill_opacity = group->style.fill_opacity; 1207 + if (group->style.stroke >= 0) 1208 + style->stroke = group->style.stroke; 1209 + if (group->style.no_stroke >= 0) 1210 + style->no_stroke = group->style.no_stroke; 1211 + if (group->style.stroke_width >= 0.0) 1212 + style->stroke_width = group->style.stroke_width; 1213 + if (group->style.stroke_linecap >= 0) 1214 + style->stroke_linecap = group->style.stroke_linecap; 1215 + if (group->style.stroke_linejoin >= 0) 1216 + style->stroke_linejoin = group->style.stroke_linejoin; 1217 + if (group->style.stroke_miterlimit >= 0.0) 1218 + style->stroke_miterlimit = group->style.stroke_miterlimit; 1219 + if (group->style.stroke_dashitems > 0) 1220 + { 1221 + style->stroke_dashitems = group->style.stroke_dashitems; 1222 + if (style->stroke_dasharray != NULL) 1223 + free (style->stroke_dasharray); 1224 + style->stroke_dasharray = NULL; 1225 + if (group->style.stroke_dashitems > 0) 1226 + { 1227 + int i; 1228 + style->stroke_dasharray = 1229 + malloc (sizeof (double) * 1230 + group->style.stroke_dashitems); 1231 + for (i = 0; i < group->style.stroke_dashitems; i++) 1232 + style->stroke_dasharray[i] = 1233 + group->style.stroke_dasharray[i]; 1234 + } 1235 + style->stroke_dashoffset = group->style.stroke_dashoffset; 1236 + } 1237 + if (group->style.stroke_url != NULL) 1238 + gg_svg_add_stroke_gradient_url (style, 1239 + group->style.stroke_url); 1240 + if (group->style.stroke_red >= 0.0) 1241 + style->stroke_red = group->style.stroke_red; 1242 + if (group->style.stroke_green >= 0.0) 1243 + style->stroke_green = group->style.stroke_green; 1244 + if (group->style.stroke_blue >= 0.0) 1245 + style->stroke_blue = group->style.stroke_blue; 1246 + if (group->style.stroke_opacity >= 0.0) 1247 + style->stroke_opacity = group->style.stroke_opacity; 1248 + if (group->style.clip_url != NULL) 1249 + { 1250 + gg_svg_add_clip_url (style, group->style.clip_url); 1251 + style->clip_pointer = group->style.clip_pointer; 1252 + } 1253 + } 1254 + ref = ref->next; 1255 + } 1256 + 1257 +/* applying Shape specific style definitions */ 1258 + if (shape->style.visibility >= 0) 1259 + style->visibility = shape->style.visibility; 1260 + style->opacity = shape->style.opacity; 1261 + if (shape->style.fill >= 0) 1262 + style->fill = shape->style.fill; 1263 + if (shape->style.no_fill >= 0) 1264 + style->no_fill = shape->style.no_fill; 1265 + if (shape->style.fill_rule >= 0) 1266 + style->fill_rule = shape->style.fill_rule; 1267 + if (shape->style.fill_url != NULL) 1268 + gg_svg_add_fill_gradient_url (style, shape->style.fill_url); 1269 + if (shape->style.fill_red >= 0.0) 1270 + style->fill_red = shape->style.fill_red; 1271 + if (shape->style.fill_green >= 0.0) 1272 + style->fill_green = shape->style.fill_green; 1273 + if (shape->style.fill_blue >= 0.0) 1274 + style->fill_blue = shape->style.fill_blue; 1275 + if (shape->style.fill_opacity >= 0.0) 1276 + style->fill_opacity = shape->style.fill_opacity; 1277 + if (shape->style.stroke >= 0) 1278 + style->stroke = shape->style.stroke; 1279 + if (shape->style.no_stroke >= 0) 1280 + style->no_stroke = shape->style.no_stroke; 1281 + if (shape->style.stroke_width >= 0.0) 1282 + style->stroke_width = shape->style.stroke_width; 1283 + if (shape->style.stroke_linecap >= 0) 1284 + style->stroke_linecap = shape->style.stroke_linecap; 1285 + if (shape->style.stroke_linejoin >= 0) 1286 + style->stroke_linejoin = shape->style.stroke_linejoin; 1287 + if (shape->style.stroke_miterlimit >= 0.0) 1288 + style->stroke_miterlimit = shape->style.stroke_miterlimit; 1289 + if (shape->style.stroke_dashitems > 0) 1290 + { 1291 + style->stroke_dashitems = shape->style.stroke_dashitems; 1292 + if (style->stroke_dasharray != NULL) 1293 + free (style->stroke_dasharray); 1294 + style->stroke_dasharray = NULL; 1295 + if (shape->style.stroke_dashitems > 0) 1296 + { 1297 + int i; 1298 + style->stroke_dasharray = 1299 + malloc (sizeof (double) * shape->style.stroke_dashitems); 1300 + for (i = 0; i < shape->style.stroke_dashitems; i++) 1301 + style->stroke_dasharray[i] = 1302 + shape->style.stroke_dasharray[i]; 1303 + } 1304 + style->stroke_dashoffset = shape->style.stroke_dashoffset; 1305 + } 1306 + if (shape->style.stroke_url != NULL) 1307 + gg_svg_add_stroke_gradient_url (style, shape->style.stroke_url); 1308 + if (shape->style.stroke_red >= 0.0) 1309 + style->stroke_red = shape->style.stroke_red; 1310 + if (shape->style.stroke_green >= 0.0) 1311 + style->stroke_green = shape->style.stroke_green; 1312 + if (shape->style.stroke_blue >= 0.0) 1313 + style->stroke_blue = shape->style.stroke_blue; 1314 + if (shape->style.stroke_opacity >= 0.0) 1315 + style->stroke_opacity = shape->style.stroke_opacity; 1316 + if (shape->style.clip_url != NULL) 1317 + { 1318 + gg_svg_add_clip_url (style, shape->style.clip_url); 1319 + style->clip_pointer = shape->style.clip_pointer; 1320 + } 1321 +/* final adjustements */ 1322 + if (style->fill < 0) 1323 + style->fill = 1; 1324 + if (style->stroke < 0) 1325 + style->stroke = 1; 1326 + if (style->no_fill < 0) 1327 + style->no_fill = 0; 1328 + if (style->no_stroke < 0) 1329 + style->no_stroke = 0; 1330 + if (style->fill_red < 0.0 && style->fill_green < 0.0 1331 + && style->fill_blue < 0.0 && style->fill_url == NULL) 1332 + style->no_fill = 1; 1333 + if (style->stroke_red < 0.0 && style->stroke_green < 0.0 1334 + && style->stroke_blue < 0.0 && style->stroke_url == NULL) 1335 + style->no_stroke = 1; 1336 + if (style->no_fill) 1337 + style->fill = 0; 1338 + if (style->no_stroke) 1339 + style->stroke = 0; 1340 + if (style->fill) 1341 + { 1342 + if (style->fill_rule < 0) 1343 + style->fill_rule = CAIRO_FILL_RULE_WINDING; 1344 + if (style->fill_red < 0.0 || style->fill_red > 1.0) 1345 + style->fill_red = 0.0; 1346 + if (style->fill_green < 0.0 || style->fill_green > 1.0) 1347 + style->fill_green = 0.0; 1348 + if (style->fill_blue < 0.0 || style->fill_blue > 1.0) 1349 + style->fill_blue = 0.0; 1350 + if (style->fill_opacity < 0.0 || style->fill_opacity > 1.0) 1351 + style->fill_opacity = 1.0; 1352 + } 1353 + if (style->stroke) 1354 + { 1355 + if (style->stroke_width <= 0.0) 1356 + style->stroke_width = 1.0; 1357 + if (style->stroke_linecap < 0) 1358 + style->stroke_linecap = CAIRO_LINE_CAP_BUTT; 1359 + if (style->stroke_linejoin < 0) 1360 + style->stroke_linejoin = CAIRO_LINE_JOIN_MITER; 1361 + if (style->stroke_miterlimit < 0) 1362 + style->stroke_miterlimit = 4.0; 1363 + if (style->stroke_red < 0.0 || style->stroke_red > 1.0) 1364 + style->stroke_red = 0.0; 1365 + if (style->stroke_green < 0.0 || style->stroke_green > 1.0) 1366 + style->stroke_green = 0.0; 1367 + if (style->stroke_blue < 0.0 || style->stroke_blue > 1.0) 1368 + style->stroke_blue = 0.0; 1369 + if (style->stroke_opacity < 0.0 || style->stroke_opacity > 1.0) 1370 + style->stroke_opacity = 1.0; 1371 + } 1372 + gg_svg_free_parents (&chain); 1373 +} 1374 + 1375 +static void 1376 +gg_svg_resolve_fill_url (struct gg_svg_document *svg_doc, 1377 + struct gg_svg_style *style) 1378 +{ 1379 +/* attempting to resolve a FillGradient by URL */ 1380 + struct gg_svg_gradient *gradient = svg_doc->first_grad; 1381 + while (gradient) 1382 + { 1383 + if (gradient->id != NULL) 1384 + { 1385 + if (strcmp (style->fill_url, gradient->id) == 0) 1386 + { 1387 + style->fill_pointer = gradient; 1388 + return; 1389 + } 1390 + } 1391 + gradient = gradient->next; 1392 + } 1393 + style->fill_pointer = NULL; 1394 + style->fill = 0; 1395 +} 1396 + 1397 +static void 1398 +gg_svg_resolve_stroke_url (struct gg_svg_document *svg_doc, 1399 + struct gg_svg_style *style) 1400 +{ 1401 +/* attempting to resolve a StrokeGradient by URL */ 1402 + struct gg_svg_gradient *gradient = svg_doc->first_grad; 1403 + while (gradient) 1404 + { 1405 + if (gradient->id != NULL) 1406 + { 1407 + if (strcmp (style->stroke_url, gradient->id) == 0) 1408 + { 1409 + style->stroke_pointer = gradient; 1410 + return; 1411 + } 1412 + } 1413 + gradient = gradient->next; 1414 + } 1415 + style->stroke_pointer = NULL; 1416 + style->stroke = 0; 1417 +} 1418 + 1419 +static void 1420 +gg_svg_apply_clip2 (cairo_t * cairo, struct gg_svg_item *clip_path) 1421 +{ 1422 +/* attempting to apply a ClipPath - actuation */ 1423 + struct gg_svg_group *group; 1424 + struct gg_svg_shape *shape; 1425 + struct gg_svg_clip *clip; 1426 + struct gg_svg_item *item = clip_path; 1427 + while (item) 1428 + { 1429 + /* looping on Items */ 1430 + if (item->type == GG_SVG_ITEM_SHAPE && item->pointer != NULL) 1431 + { 1432 + shape = item->pointer; 1433 + switch (shape->type) 1434 + { 1435 + case GG_SVG_RECT: 1436 + gg_svg_clip_rect (cairo, shape); 1437 + break; 1438 + case GG_SVG_CIRCLE: 1439 + gg_svg_clip_circle (cairo, shape); 1440 + break; 1441 + case GG_SVG_ELLIPSE: 1442 + gg_svg_clip_ellipse (cairo, shape); 1443 + break; 1444 + case GG_SVG_LINE: 1445 + gg_svg_clip_line (cairo, shape); 1446 + break; 1447 + case GG_SVG_POLYLINE: 1448 + gg_svg_clip_polyline (cairo, shape); 1449 + break; 1450 + case GG_SVG_POLYGON: 1451 + gg_svg_clip_polygon (cairo, shape); 1452 + break; 1453 + case GG_SVG_PATH: 1454 + gg_svg_clip_path (cairo, shape); 1455 + break; 1456 + }; 1457 + } 1458 + if (item->type == GG_SVG_ITEM_GROUP && item->pointer != NULL) 1459 + { 1460 + group = item->pointer; 1461 + gg_svg_apply_clip2 (cairo, group->first); 1462 + } 1463 + if (item->type == GG_SVG_ITEM_CLIP && item->pointer != NULL) 1464 + { 1465 + clip = item->pointer; 1466 + gg_svg_apply_clip2 (cairo, clip->first); 1467 + } 1468 + item = item->next; 1469 + } 1470 +} 1471 + 1472 +static void 1473 +gg_svg_apply_clip (cairo_t * cairo, struct gg_svg_item *item) 1474 +{ 1475 +/* attempting to apply a ClipPath */ 1476 + if (item->type == GG_SVG_ITEM_CLIP && item->pointer != NULL) 1477 + { 1478 + struct gg_svg_clip *clip = item->pointer; 1479 + gg_svg_apply_clip2 (cairo, clip->first); 1480 + } 1481 +} 1482 + 1483 +static void 1484 +gg_svg_render_item (cairo_t * cairo, struct gg_svg_document *svg_doc, 1485 + struct gg_svg_item *item) 1486 +{ 1487 +/* rendering all SVG Items */ 1488 + struct gg_svg_group *group; 1489 + struct gg_svg_shape *shape; 1490 + struct gg_svg_style style; 1491 + 1492 + while (item) 1493 + { 1494 + /* looping on Items */ 1495 + if (item->type == GG_SVG_ITEM_SHAPE && item->pointer != NULL) 1496 + { 1497 + shape = item->pointer; 1498 + if (shape->is_defs || shape->is_flow_root) 1499 + ; 1500 + else 1501 + { 1502 + gg_svg_apply_transformations (cairo, svg_doc, shape); 1503 + gg_svg_apply_style (shape, &style); 1504 + if (style.visibility) 1505 + { 1506 + if (style.fill_url != NULL) 1507 + gg_svg_resolve_fill_url (svg_doc, &style); 1508 + if (style.stroke_url != NULL) 1509 + gg_svg_resolve_stroke_url (svg_doc, &style); 1510 + if (style.clip_url != NULL 1511 + && style.clip_pointer != NULL) 1512 + gg_svg_apply_clip (cairo, style.clip_pointer); 1513 + gg_svg_draw_shape (cairo, shape, &style); 1514 + cairo_reset_clip (cairo); 1515 + } 1516 + if (style.fill_url != NULL) 1517 + free (style.fill_url); 1518 + if (style.stroke_url != NULL) 1519 + free (style.stroke_url); 1520 + if (style.clip_url != NULL) 1521 + free (style.clip_url); 1522 + } 1523 + } 1524 + if (item->type == GG_SVG_ITEM_GROUP && item->pointer != NULL) 1525 + { 1526 + group = item->pointer; 1527 + if (group->is_defs || group->is_flow_root) 1528 + ; 1529 + else 1530 + gg_svg_render_item (cairo, svg_doc, group->first); 1531 + } 1532 + item = item->next; 1533 + } 1534 +} 1535 + 1536 +static void 1537 +gg_svg_find_href (struct gg_svg_document *svg_doc, struct gg_svg_item *item, 1538 + const char *href, struct gg_svg_item **pointer) 1539 +{ 1540 +/* attempting to recursively resolve an xlink:href reference */ 1541 + struct gg_svg_group *group; 1542 + struct gg_svg_shape *shape; 1543 + 1544 + while (item) 1545 + { 1546 + /* looping on Items */ 1547 + if (item->type == GG_SVG_ITEM_SHAPE && item->pointer != NULL) 1548 + { 1549 + shape = item->pointer; 1550 + if (shape->id != NULL) 1551 + { 1552 + if (strcmp (shape->id, href + 1) == 0) 1553 + { 1554 + *pointer = item; 1555 + return; 1556 + } 1557 + } 1558 + } 1559 + if (item->type == GG_SVG_ITEM_GROUP && item->pointer != NULL) 1560 + { 1561 + group = item->pointer; 1562 + if (group->id != NULL) 1563 + { 1564 + if (strcmp (group->id, href + 1) == 0) 1565 + { 1566 + *pointer = item; 1567 + return; 1568 + } 1569 + } 1570 + gg_svg_find_href (svg_doc, group->first, href, pointer); 1571 + } 1572 + item = item->next; 1573 + } 1574 +} 1575 + 1576 +static void 1577 +gg_svg_replace_use (struct gg_svg_item *item, struct gg_svg_item *repl) 1578 +{ 1579 +/* replacing an Use with the corrensponding resolved item */ 1580 + struct gg_svg_use *use = item->pointer; 1581 + 1582 + if (repl->type == GG_SVG_ITEM_SHAPE && repl->pointer) 1583 + { 1584 + struct gg_svg_shape *shape = repl->pointer; 1585 + item->pointer = gg_svg_clone_shape (shape, use); 1586 + item->type = GG_SVG_ITEM_SHAPE; 1587 + } 1588 + if (repl->type == GG_SVG_ITEM_GROUP && repl->pointer) 1589 + { 1590 + struct gg_svg_group *group = repl->pointer; 1591 + item->pointer = gg_svg_clone_group (group, use); 1592 + item->type = GG_SVG_ITEM_GROUP; 1593 + } 1594 + gg_svg_free_use (use); 1595 +} 1596 + 1597 +static void 1598 +gg_svg_find_gradient_href (struct gg_svg_document *svg_doc, const char *href, 1599 + struct gg_svg_gradient **pointer) 1600 +{ 1601 +/* attempting to recursively resolve an xlink:href reference (Gradients) */ 1602 + struct gg_svg_gradient *grad = svg_doc->first_grad; 1603 + 1604 + while (grad) 1605 + { 1606 + /* looping on Gradients */ 1607 + if (strcmp (grad->id, href + 1) == 0) 1608 + { 1609 + *pointer = grad; 1610 + return; 1611 + } 1612 + grad = grad->next; 1613 + } 1614 +} 1615 + 1616 +static struct gg_svg_gradient * 1617 +gg_svg_replace_gradient (struct gg_svg_document *svg_doc, 1618 + struct gg_svg_gradient *gradient, 1619 + struct gg_svg_gradient *repl) 1620 +{ 1621 +/* replacing a Gradient with the corrensponding resolved item */ 1622 + struct gg_svg_gradient *new_grad = gg_svg_clone_gradient (repl, gradient); 1623 + new_grad->prev = gradient->prev; 1624 + new_grad->next = gradient->next; 1625 + if (gradient->prev != NULL) 1626 + gradient->prev->next = new_grad; 1627 + if (gradient->next != NULL) 1628 + gradient->next->prev = new_grad; 1629 + if (svg_doc->first_grad == gradient) 1630 + svg_doc->first_grad = new_grad; 1631 + if (svg_doc->last_grad == gradient) 1632 + svg_doc->last_grad = new_grad; 1633 + gg_svg_free_gradient (gradient); 1634 + return new_grad; 1635 +} 1636 + 1637 +static void 1638 +gg_svg_resolve_gradients_xlink_href (struct gg_svg_document *svg_doc) 1639 +{ 1640 +/* resolving any indirect reference: Gradient xlink:href */ 1641 + struct gg_svg_gradient *grad = svg_doc->first_grad; 1642 + struct gg_svg_gradient *ret; 1643 + 1644 + while (grad) 1645 + { 1646 + /* looping on Gradients */ 1647 + if (grad->xlink_href != NULL) 1648 + { 1649 + gg_svg_find_gradient_href (svg_doc, grad->xlink_href, &ret); 1650 + if (ret != NULL) 1651 + grad = gg_svg_replace_gradient (svg_doc, grad, ret); 1652 + } 1653 + grad = grad->next; 1654 + } 1655 +} 1656 + 1657 +static void 1658 +gg_svg_resolve_xlink_href (struct gg_svg_document *svg_doc, 1659 + struct gg_svg_item *item) 1660 +{ 1661 +/* recursively resolving any indirect reference: xlink:href */ 1662 + struct gg_svg_group *group; 1663 + struct gg_svg_use *use; 1664 + struct gg_svg_clip *clip; 1665 + struct gg_svg_item *ret; 1666 + 1667 + while (item) 1668 + { 1669 + /* looping on Items */ 1670 + if (item->type == GG_SVG_ITEM_USE && item->pointer != NULL) 1671 + { 1672 + use = item->pointer; 1673 + gg_svg_find_href (svg_doc, svg_doc->first, use->xlink_href, 1674 + &ret); 1675 + if (ret != NULL) 1676 + gg_svg_replace_use (item, ret); 1677 + } 1678 + if (item->type == GG_SVG_ITEM_GROUP && item->pointer != NULL) 1679 + { 1680 + group = item->pointer; 1681 + gg_svg_resolve_xlink_href (svg_doc, group->first); 1682 + } 1683 + if (item->type == GG_SVG_ITEM_CLIP && item->pointer != NULL) 1684 + { 1685 + clip = item->pointer; 1686 + gg_svg_resolve_xlink_href (svg_doc, clip->first); 1687 + } 1688 + item = item->next; 1689 + } 1690 +} 1691 + 1692 +static void 1693 +gg_svg_find_clip_href (struct gg_svg_document *svg_doc, 1694 + struct gg_svg_item *item, const char *href, 1695 + struct gg_svg_item **pointer) 1696 +{ 1697 +/* attempting to recursively resolve an xlink:href reference (ClipPath) */ 1698 + 1699 + struct gg_svg_group *group; 1700 + struct gg_svg_clip *clip; 1701 + 1702 + while (item) 1703 + { 1704 + /* looping on Items */ 1705 + if (item->type == GG_SVG_ITEM_CLIP && item->pointer != NULL) 1706 + { 1707 + clip = item->pointer; 1708 + if (clip->id != NULL) 1709 + { 1710 + if (strcmp (clip->id, href) == 0) 1711 + { 1712 + *pointer = item; 1713 + return; 1714 + } 1715 + } 1716 + } 1717 + if (item->type == GG_SVG_ITEM_GROUP && item->pointer != NULL) 1718 + { 1719 + group = item->pointer; 1720 + if (group->id != NULL) 1721 + { 1722 + if (strcmp (group->id, href + 1) == 0) 1723 + { 1724 + *pointer = item; 1725 + return; 1726 + } 1727 + } 1728 + gg_svg_find_clip_href (svg_doc, group->first, href, pointer); 1729 + } 1730 + item = item->next; 1731 + } 1732 +} 1733 + 1734 +static void 1735 +gg_svg_resolve_clip_xlink_href (struct gg_svg_document *svg_doc, 1736 + struct gg_svg_item *item) 1737 +{ 1738 +/* recursively resolving any indirect reference: ClipPath url */ 1739 + struct gg_svg_group *group; 1740 + struct gg_svg_shape *shape; 1741 + struct gg_svg_use *use; 1742 + struct gg_svg_item *ret = NULL; 1743 + 1744 + while (item) 1745 + { 1746 + /* looping on Items */ 1747 + if (item->type == GG_SVG_ITEM_USE && item->pointer != NULL) 1748 + { 1749 + use = item->pointer; 1750 + if (use->style.clip_url != NULL) 1751 + { 1752 + gg_svg_find_clip_href (svg_doc, svg_doc->first, 1753 + use->style.clip_url, &ret); 1754 + if (ret != NULL) 1755 + use->style.clip_pointer = ret; 1756 + } 1757 + } 1758 + if (item->type == GG_SVG_ITEM_SHAPE && item->pointer != NULL) 1759 + { 1760 + shape = item->pointer; 1761 + if (shape->style.clip_url != NULL) 1762 + { 1763 + gg_svg_find_clip_href (svg_doc, svg_doc->first, 1764 + shape->style.clip_url, &ret); 1765 + if (ret != NULL) 1766 + shape->style.clip_pointer = ret; 1767 + } 1768 + } 1769 + if (item->type == GG_SVG_ITEM_GROUP && item->pointer != NULL) 1770 + { 1771 + group = item->pointer; 1772 + if (group->style.clip_url != NULL) 1773 + { 1774 + gg_svg_find_clip_href (svg_doc, svg_doc->first, 1775 + group->style.clip_url, &ret); 1776 + if (ret != NULL) 1777 + group->style.clip_pointer = ret; 1778 + } 1779 + gg_svg_resolve_clip_xlink_href (svg_doc, group->first); 1780 + } 1781 + item = item->next; 1782 + } 1783 +} 1784 + 1785 +static int 1786 +gg_svg_to_img (const void **img_out, int size, struct gg_svg_document *svg_doc) 1787 +{ 1788 +/* rendering an SVG document as an RGBA image */ 1789 + cairo_surface_t *surface; 1790 + cairo_t *cairo; 1791 + double ratio_x; 1792 + double ratio_y; 1793 + double width; 1794 + double height; 1795 + double shift_x; 1796 + double shift_y; 1797 + int ret = 1; 1798 + gGraphImagePtr img = NULL; 1799 + int w; 1800 + int h; 1801 + int x; 1802 + int y; 1803 + const unsigned char *in_buf; 1804 + unsigned char *out_buf = NULL; 1805 + 1806 + if (svg_doc->viewbox_x != DBL_MIN && svg_doc->viewbox_y != DBL_MIN 1807 + && svg_doc->viewbox_width != DBL_MIN 1808 + && svg_doc->viewbox_height != DBL_MIN) 1809 + { 1810 + /* setting the SVG dimensions from the ViewBox */ 1811 + if (svg_doc->width <= 0) 1812 + svg_doc->width = svg_doc->viewbox_width; 1813 + if (svg_doc->height <= 0) 1814 + svg_doc->height = svg_doc->viewbox_height; 1815 + } 1816 + else 1817 + { 1818 + /* setting the ViewBox from the SVG dimensions */ 1819 + svg_doc->viewbox_x = 0.0; 1820 + svg_doc->viewbox_y = 0.0; 1821 + svg_doc->viewbox_width = svg_doc->width; 1822 + svg_doc->viewbox_height = svg_doc->height; 1823 + } 1824 + if (svg_doc->width <= 0.0 || svg_doc->height <= 0.0) 1825 + return 0; 1826 + 1827 +/* setting the image dimensions */ 1828 + ratio_x = svg_doc->width / (double) size; 1829 + ratio_y = svg_doc->height / (double) size; 1830 + if (ratio_x > ratio_y) 1831 + { 1832 + width = svg_doc->width / ratio_x; 1833 + height = svg_doc->height / ratio_x; 1834 + } 1835 + else 1836 + { 1837 + width = svg_doc->width / ratio_y; 1838 + height = svg_doc->height / ratio_y; 1839 + } 1840 + 1841 + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); 1842 + if (cairo_surface_status (surface) == CAIRO_STATUS_SUCCESS) 1843 + ; 1844 + else 1845 + return 0; 1846 + cairo = cairo_create (surface); 1847 + if (cairo_status (cairo) == CAIRO_STATUS_NO_MEMORY) 1848 + { 1849 + fprintf (stderr, "CAIRO reports: Insufficient Memory\n"); 1850 + ret = 0; 1851 + goto stop; 1852 + } 1853 + 1854 +/* priming a transparent background */ 1855 + cairo_rectangle (cairo, 0, 0, width, height); 1856 + cairo_set_source_rgba (cairo, 0.0, 0.0, 0.0, 0.0); 1857 + cairo_fill (cairo); 1858 +/* setting the basic document matrix */ 1859 + svg_doc->matrix.xx = 1.0; 1860 + svg_doc->matrix.yx = 0.0; 1861 + svg_doc->matrix.xy = 0.0; 1862 + svg_doc->matrix.yy = 1.0; 1863 + svg_doc->matrix.x0 = 0.0; 1864 + svg_doc->matrix.y0 = 0.0; 1865 + ratio_x = width / svg_doc->viewbox_width; 1866 + ratio_y = height / svg_doc->viewbox_height; 1867 + cairo_matrix_scale (&(svg_doc->matrix), ratio_x, ratio_y); 1868 + shift_x = -1 * svg_doc->viewbox_x; 1869 + shift_y = -1 * svg_doc->viewbox_y; 1870 + cairo_matrix_translate (&(svg_doc->matrix), shift_x, shift_y); 1871 + 1872 +/* resolving any xlink:href */ 1873 + gg_svg_resolve_gradients_xlink_href (svg_doc); 1874 + gg_svg_resolve_clip_xlink_href (svg_doc, svg_doc->first); 1875 + gg_svg_resolve_xlink_href (svg_doc, svg_doc->first); 1876 + 1877 +/* recursively rendering all SVG Items */ 1878 + gg_svg_render_item (cairo, svg_doc, svg_doc->first); 1879 + 1880 +/* accessing the CairoSurface buffer */ 1881 + w = cairo_image_surface_get_width (surface); 1882 + h = cairo_image_surface_get_height (surface); 1883 + cairo_surface_flush (surface); 1884 + in_buf = cairo_image_surface_get_data (surface); 1885 + if (in_buf == NULL) 1886 + { 1887 + ret = 0; 1888 + goto stop; 1889 + } 1890 + 1891 +/* creating the Image buffer */ 1892 + out_buf = malloc (h * w * 4); 1893 + if (out_buf == NULL) 1894 + { 1895 + ret = 0; 1896 + goto stop; 1897 + } 1898 + for (y = 0; y < h; y++) 1899 + { 1900 + /* looping on lines */ double multiplier; 1901 + double r; 1902 + double g; 1903 + double b; 1904 + const unsigned char *p_in = in_buf + (y * w * 4); 1905 + unsigned char *p_out = out_buf + (y * w * 4); 1906 + for (x = 0; x < w; x++) 1907 + { 1908 + /* looping on columns */ 1909 + unsigned char alpha; 1910 + unsigned char red; 1911 + unsigned char green; 1912 + unsigned char blue; 1913 + if (gg_endian_arch ()) 1914 + { 1915 + /* little endian byte order */ 1916 + alpha = *(p_in + 3); 1917 + red = *(p_in + 2); 1918 + green = *(p_in + 1); 1919 + blue = *(p_in + 0); 1920 + } 1921 + else 1922 + { 1923 + /* big endian byte order */ 1924 + alpha = *(p_in + 0); 1925 + red = *(p_in + 1); 1926 + green = *(p_in + 2); 1927 + blue = *(p_in + 3); 1928 + } 1929 + /* Cairo colors are pre-multiplied; normalizing */ 1930 + multiplier = 255.0 / (double) alpha; 1931 + r = (double) red *multiplier; 1932 + g = (double) green *multiplier; 1933 + b = (double) blue *multiplier; 1934 + if (r < 0.0) 1935 + red = 0; 1936 + else if (r > 255.0) 1937 + red = 255; 1938 + else 1939 + red = r; 1940 + if (g < 0.0) 1941 + green = 0; 1942 + else if (g > 255.0) 1943 + green = 255; 1944 + else 1945 + green = g; 1946 + if (b < 0.0) 1947 + blue = 0; 1948 + else if (b > 255.0) 1949 + blue = 255; 1950 + else 1951 + blue = b; 1952 + *(p_out + 0) = red; 1953 + *(p_out + 1) = green; 1954 + *(p_out + 2) = blue; 1955 + *(p_out + 3) = alpha; 1956 + p_in += 4; 1957 + p_out += 4; 1958 + } 1959 + } 1960 + 1961 +/* creating the output image */ 1962 + img = 1963 + gg_image_create_from_bitmap (out_buf, GG_PIXEL_RGBA, w, h, 8, 4, 1964 + GGRAPH_SAMPLE_UINT, NULL, NULL); 1965 +/* releasing ownership on output buffer */ 1966 + out_buf = NULL; 1967 + 1968 + stop: 1969 + if (out_buf != NULL) 1970 + free (out_buf); 1971 + cairo_surface_destroy (surface); 1972 + cairo_destroy (cairo); 1973 + *img_out = img; 1974 + return ret; 1975 +} 1976 + 1977 +GGRAPH_DECLARE int 1978 +gGraphCreateSVG (const unsigned char *svg, int svg_bytes, void **svg_handle) 1979 +{ 1980 +/* parsing the SVG Document and returning an opaque handle */ 1981 + struct gg_svg_document *svg_doc; 1982 + 1983 + *svg_handle = NULL; 1984 + svg_doc = gg_svg_parse_doc (svg, svg_bytes); 1985 + if (svg_doc == NULL) 1986 + { 1987 + /* unable to parse the SVG Document */ 1988 + return GGRAPH_INVALID_SVG; 1989 + } 1990 + *svg_handle = svg_doc; 1991 + return GGRAPH_OK; 1992 +} 1993 + 1994 +GGRAPH_DECLARE int 1995 +gGraphGetSVGDims (void *svg_handle, double *width, double *height) 1996 +{ 1997 +/* destroying the SVG document */ 1998 + struct gg_svg_document *svg_doc = (struct gg_svg_document *) svg_handle; 1999 + if (svg_doc == NULL) 2000 + return GGRAPH_INVALID_SVG; 2001 + if (svg_doc->signature != GG_GRAPHICS_SVG_MAGIC_SIGNATURE) 2002 + return GGRAPH_INVALID_SVG; 2003 + *width = svg_doc->width; 2004 + *height = svg_doc->height; 2005 + return GGRAPH_OK; 2006 +} 2007 + 2008 +GGRAPH_DECLARE int 2009 +gGraphFreeSVG (void *svg_handle) 2010 +{ 2011 +/* parsing the SVG Document */ 2012 + struct gg_svg_document *svg_doc = (struct gg_svg_document *) svg_handle; 2013 + if (svg_doc == NULL) 2014 + return GGRAPH_INVALID_SVG; 2015 + if (svg_doc->signature != GG_GRAPHICS_SVG_MAGIC_SIGNATURE) 2016 + return GGRAPH_INVALID_SVG; 2017 + gg_svg_free_document (svg_doc); 2018 + return GGRAPH_OK; 2019 +} 2020 + 2021 +GGRAPH_DECLARE int 2022 +gGraphImageFromSVG (void *svg_handle, double size, const void **img_out) 2023 +{ 2024 +/* rendering the SVG Document into a raster image */ 2025 + struct gg_svg_document *svg_doc = (struct gg_svg_document *) svg_handle; 2026 + if (svg_doc == NULL) 2027 + return GGRAPH_INVALID_SVG; 2028 + if (svg_doc->signature != GG_GRAPHICS_SVG_MAGIC_SIGNATURE) 2029 + return GGRAPH_INVALID_SVG; 2030 +/* SVG image rendering */ 2031 + if (!gg_svg_to_img (img_out, size, svg_doc)) 2032 + { 2033 + gg_svg_free_document (svg_doc); 2034 + return GGRAPH_INVALID_SVG; 2035 + } 2036 + return GGRAPH_OK; 2037 +}
Added src/gaiagraphics_svg_aux.c.
1 +/* 2 +/ gaiagraphics_svg_aux.c 3 +/ 4 +/ SVG auxiliary methods 5 +/ 6 +/ version 1.0, 2013 February 10 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2013 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdlib.h> 28 +#include <stdio.h> 29 +#include <string.h> 30 +#include <math.h> 31 +#include <float.h> 32 + 33 +#include "gaiagraphics.h" 34 +#include "gaiagraphics_internals.h" 35 + 36 +GGRAPH_PRIVATE void 37 +gg_svg_free_transform (struct gg_svg_transform *p) 38 +{ 39 +/* freeing an SVG Transform */ 40 + if (p == NULL) 41 + return; 42 + if (p->data != NULL) 43 + free (p->data); 44 + free (p); 45 +} 46 + 47 +GGRAPH_PRIVATE void 48 +gg_svg_free_polyline (struct gg_svg_polyline *p) 49 +{ 50 +/* freeing an SVG Polyline */ 51 + if (p == NULL) 52 + return; 53 + if (p->x != NULL) 54 + free (p->x); 55 + if (p->y != NULL) 56 + free (p->y); 57 + free (p); 58 +} 59 + 60 +GGRAPH_PRIVATE void 61 +gg_svg_free_polygon (struct gg_svg_polygon *p) 62 +{ 63 +/* freeing an SVG Polygon */ 64 + if (p == NULL) 65 + return; 66 + if (p->x != NULL) 67 + free (p->x); 68 + if (p->y != NULL) 69 + free (p->y); 70 + free (p); 71 +} 72 + 73 +GGRAPH_PRIVATE void 74 +gg_svg_free_path_item (struct gg_svg_path_item *p) 75 +{ 76 +/* freeing an SVG Path item */ 77 + if (p == NULL) 78 + return; 79 + if (p->data != NULL) 80 + free (p->data); 81 + free (p); 82 +} 83 + 84 +GGRAPH_PRIVATE void 85 +gg_svg_free_path (struct gg_svg_path *p) 86 +{ 87 +/* freeing an SVG Path */ 88 + struct gg_svg_path_item *pp; 89 + struct gg_svg_path_item *ppn; 90 + if (p == NULL) 91 + return; 92 + pp = p->first; 93 + while (pp != NULL) 94 + { 95 + ppn = pp->next; 96 + gg_svg_free_path_item (pp); 97 + pp = ppn; 98 + } 99 + free (p); 100 +} 101 + 102 +GGRAPH_PRIVATE void 103 +gg_svg_free_shape (struct gg_svg_shape *p) 104 +{ 105 +/* freeing an SVG Shape */ 106 + struct gg_svg_transform *ptn; 107 + struct gg_svg_transform *pt = p->first_trans; 108 + if (p->id != NULL) 109 + free (p->id); 110 + while (pt) 111 + { 112 + ptn = pt->next; 113 + gg_svg_free_transform (pt); 114 + pt = ptn; 115 + } 116 + switch (p->type) 117 + { 118 + case GG_SVG_POLYLINE: 119 + gg_svg_free_polyline (p->data); 120 + break; 121 + case GG_SVG_POLYGON: 122 + gg_svg_free_polygon (p->data); 123 + break; 124 + case GG_SVG_PATH: 125 + gg_svg_free_path (p->data); 126 + break; 127 + default: 128 + if (p->data) 129 + free (p->data); 130 + break; 131 + }; 132 + if (p->style.stroke_dasharray != NULL) 133 + free (p->style.stroke_dasharray); 134 + if (p->style.fill_url != NULL) 135 + free (p->style.fill_url); 136 + if (p->style.stroke_url != NULL) 137 + free (p->style.stroke_url); 138 + if (p->style.clip_url != NULL) 139 + free (p->style.clip_url); 140 + free (p); 141 +} 142 + 143 +GGRAPH_PRIVATE void 144 +gg_svg_free_use (struct gg_svg_use *p) 145 +{ 146 +/* freeing an SVG Use (xlink:href) */ 147 + struct gg_svg_transform *pt; 148 + struct gg_svg_transform *ptn; 149 + if (p->xlink_href != NULL) 150 + free (p->xlink_href); 151 + pt = p->first_trans; 152 + while (pt) 153 + { 154 + ptn = pt->next; 155 + gg_svg_free_transform (pt); 156 + pt = ptn; 157 + } 158 + if (p->style.stroke_dasharray != NULL) 159 + free (p->style.stroke_dasharray); 160 + if (p->style.fill_url != NULL) 161 + free (p->style.fill_url); 162 + if (p->style.stroke_url != NULL) 163 + free (p->style.stroke_url); 164 + if (p->style.clip_url != NULL) 165 + free (p->style.clip_url); 166 + free (p); 167 +} 168 + 169 +GGRAPH_PRIVATE void 170 +gg_svg_free_item (struct gg_svg_item *p) 171 +{ 172 +/* freeing an SVG Item */ 173 + if (p->type == GG_SVG_ITEM_GROUP) 174 + gg_svg_free_group ((struct gg_svg_group *) (p->pointer)); 175 + if (p->type == GG_SVG_ITEM_SHAPE) 176 + gg_svg_free_shape ((struct gg_svg_shape *) (p->pointer)); 177 + if (p->type == GG_SVG_ITEM_CLIP) 178 + gg_svg_free_clip ((struct gg_svg_clip *) (p->pointer)); 179 + free (p); 180 +} 181 + 182 +GGRAPH_PRIVATE void 183 +gg_svg_free_clip (struct gg_svg_clip *p) 184 +{ 185 +/* freeing an SVG Clip */ 186 + struct gg_svg_item *pi; 187 + struct gg_svg_item *pin; 188 + if (p->id != NULL) 189 + free (p->id); 190 + pi = p->first; 191 + while (pi) 192 + { 193 + pin = pi->next; 194 + gg_svg_free_item (pi); 195 + pi = pin; 196 + } 197 + free (p); 198 +} 199 + 200 +GGRAPH_PRIVATE void 201 +gg_svg_free_group (struct gg_svg_group *p) 202 +{ 203 +/* freeing an SVG Group <g> */ 204 + struct gg_svg_item *pi; 205 + struct gg_svg_item *pin; 206 + struct gg_svg_transform *pt; 207 + struct gg_svg_transform *ptn; 208 + if (p->id != NULL) 209 + free (p->id); 210 + pi = p->first; 211 + while (pi) 212 + { 213 + pin = pi->next; 214 + gg_svg_free_item (pi); 215 + pi = pin; 216 + } 217 + pt = p->first_trans; 218 + while (pt) 219 + { 220 + ptn = pt->next; 221 + gg_svg_free_transform (pt); 222 + pt = ptn; 223 + } 224 + if (p->style.stroke_dasharray != NULL) 225 + free (p->style.stroke_dasharray); 226 + if (p->style.fill_url != NULL) 227 + free (p->style.fill_url); 228 + if (p->style.stroke_url != NULL) 229 + free (p->style.stroke_url); 230 + if (p->style.clip_url != NULL) 231 + free (p->style.clip_url); 232 + free (p); 233 +} 234 + 235 +GGRAPH_PRIVATE void 236 +gg_svg_free_gradient_stop (struct gg_svg_gradient_stop *p) 237 +{ 238 +/* freeing an SVG GradientStop */ 239 + free (p); 240 +} 241 + 242 +GGRAPH_PRIVATE void 243 +gg_svg_free_gradient (struct gg_svg_gradient *p) 244 +{ 245 +/* freeing an SVG Gradient */ 246 + struct gg_svg_transform *pt; 247 + struct gg_svg_transform *ptn; 248 + struct gg_svg_gradient_stop *ps; 249 + struct gg_svg_gradient_stop *psn; 250 + if (p->id != NULL) 251 + free (p->id); 252 + if (p->xlink_href != NULL) 253 + free (p->xlink_href); 254 + pt = p->first_trans; 255 + while (pt) 256 + { 257 + ptn = pt->next; 258 + gg_svg_free_transform (pt); 259 + pt = ptn; 260 + } 261 + ps = p->first_stop; 262 + while (ps) 263 + { 264 + psn = ps->next; 265 + gg_svg_free_gradient_stop (ps); 266 + ps = psn; 267 + } 268 + free (p); 269 +} 270 + 271 +GGRAPH_PRIVATE void 272 +gg_svg_free_document (struct gg_svg_document *p) 273 +{ 274 +/* freeing an SVG Document */ 275 + struct gg_svg_item *pi; 276 + struct gg_svg_item *pin; 277 + struct gg_svg_gradient *pg; 278 + struct gg_svg_gradient *pgn; 279 + pi = p->first; 280 + while (pi) 281 + { 282 + pin = pi->next; 283 + if (pi->type == GG_SVG_ITEM_GROUP) 284 + gg_svg_free_group ((struct gg_svg_group *) (pi->pointer)); 285 + if (pi->type == GG_SVG_ITEM_SHAPE) 286 + gg_svg_free_shape ((struct gg_svg_shape *) (pi->pointer)); 287 + if (pi->type == GG_SVG_ITEM_USE) 288 + gg_svg_free_use ((struct gg_svg_use *) (pi->pointer)); 289 + if (pi->type == GG_SVG_ITEM_CLIP) 290 + gg_svg_free_clip ((struct gg_svg_clip *) (pi->pointer)); 291 + free (pi); 292 + pi = pin; 293 + } 294 + pg = p->first_grad; 295 + while (pg) 296 + { 297 + pgn = pg->next; 298 + gg_svg_free_gradient (pg); 299 + pg = pgn; 300 + } 301 + free (p); 302 +} 303 + 304 +GGRAPH_PRIVATE struct gg_svg_matrix * 305 +gg_svg_alloc_matrix (double a, double b, double c, double d, double e, double f) 306 +{ 307 +/* allocating and initializing an SVG Matrix */ 308 + struct gg_svg_matrix *p = malloc (sizeof (struct gg_svg_matrix)); 309 + p->a = a; 310 + p->b = b; 311 + p->c = c; 312 + p->d = d; 313 + p->e = e; 314 + p->f = f; 315 + return p; 316 +} 317 + 318 +GGRAPH_PRIVATE struct gg_svg_matrix * 319 +gg_svg_clone_matrix (struct gg_svg_matrix *in) 320 +{ 321 +/* cloning an SVG Matrix */ 322 + struct gg_svg_matrix *p = malloc (sizeof (struct gg_svg_matrix)); 323 + p->a = in->a; 324 + p->b = in->b; 325 + p->c = in->c; 326 + p->d = in->d; 327 + p->e = in->e; 328 + p->f = in->f; 329 + return p; 330 +} 331 + 332 +GGRAPH_PRIVATE struct gg_svg_translate * 333 +gg_svg_alloc_translate (double tx, double ty) 334 +{ 335 +/* allocating and initializing an SVG Translate */ 336 + struct gg_svg_translate *p = malloc (sizeof (struct gg_svg_translate)); 337 + p->tx = tx; 338 + p->ty = ty; 339 + return p; 340 +} 341 + 342 +GGRAPH_PRIVATE struct gg_svg_translate * 343 +gg_svg_clone_translate (struct gg_svg_translate *in) 344 +{ 345 +/* cloning an SVG Translate */ 346 + struct gg_svg_translate *p = malloc (sizeof (struct gg_svg_translate)); 347 + p->tx = in->tx; 348 + p->ty = in->ty; 349 + return p; 350 +} 351 + 352 +GGRAPH_PRIVATE struct gg_svg_scale * 353 +gg_svg_alloc_scale (double sx, double sy) 354 +{ 355 +/* allocating and initializing an SVG Scale */ 356 + struct gg_svg_scale *p = malloc (sizeof (struct gg_svg_scale)); 357 + p->sx = sx; 358 + p->sy = sy; 359 + return p; 360 +} 361 + 362 +GGRAPH_PRIVATE struct gg_svg_scale * 363 +gg_svg_clone_scale (struct gg_svg_scale *in) 364 +{ 365 +/* cloning an SVG Scale */ 366 + struct gg_svg_scale *p = malloc (sizeof (struct gg_svg_scale)); 367 + p->sx = in->sx; 368 + p->sy = in->sy; 369 + return p; 370 +} 371 + 372 +GGRAPH_PRIVATE struct gg_svg_rotate * 373 +gg_svg_alloc_rotate (double angle, double cx, double cy) 374 +{ 375 +/* allocating and initializing an SVG Scale */ 376 + struct gg_svg_rotate *p = malloc (sizeof (struct gg_svg_rotate)); 377 + p->angle = angle; 378 + p->cx = cx; 379 + p->cy = cy; 380 + return p; 381 +} 382 + 383 +GGRAPH_PRIVATE struct gg_svg_rotate * 384 +gg_svg_clone_rotate (struct gg_svg_rotate *in) 385 +{ 386 +/* cloning an SVG Scale */ 387 + struct gg_svg_rotate *p = malloc (sizeof (struct gg_svg_rotate)); 388 + p->angle = in->angle; 389 + p->cx = in->cx; 390 + p->cy = in->cy; 391 + return p; 392 +} 393 + 394 +GGRAPH_PRIVATE struct gg_svg_skew * 395 +gg_svg_alloc_skew (double angle) 396 +{ 397 +/* allocating and initializing an SVG Skew */ 398 + struct gg_svg_skew *p = malloc (sizeof (struct gg_svg_skew)); 399 + p->angle = angle; 400 + return p; 401 +} 402 + 403 +GGRAPH_PRIVATE struct gg_svg_skew * 404 +gg_svg_clone_skew (struct gg_svg_skew *in) 405 +{ 406 +/* cloning an SVG Skew */ 407 + struct gg_svg_skew *p = malloc (sizeof (struct gg_svg_skew)); 408 + p->angle = in->angle; 409 + return p; 410 +} 411 + 412 +GGRAPH_PRIVATE struct gg_svg_transform * 413 +gg_svg_alloc_transform (int type, void *data) 414 +{ 415 +/* allocating and initializing an empty SVG Transform */ 416 + struct gg_svg_transform *p = malloc (sizeof (struct gg_svg_transform)); 417 + p->type = type; 418 + p->data = data; 419 + p->next = NULL; 420 + return p; 421 +} 422 + 423 +GGRAPH_PRIVATE struct gg_svg_transform * 424 +gg_svg_clone_transform (struct gg_svg_transform *in) 425 +{ 426 +/* cloning SVG Transform */ 427 + struct gg_svg_matrix *matrix; 428 + struct gg_svg_translate *translate; 429 + struct gg_svg_scale *scale; 430 + struct gg_svg_rotate *rotate; 431 + struct gg_svg_skew *skew; 432 + struct gg_svg_transform *p = malloc (sizeof (struct gg_svg_transform)); 433 + p->type = in->type; 434 + switch (in->type) 435 + { 436 + case GG_SVG_MATRIX: 437 + matrix = in->data; 438 + p->data = gg_svg_clone_matrix (matrix); 439 + break; 440 + case GG_SVG_TRANSLATE: 441 + translate = in->data; 442 + p->data = gg_svg_clone_translate (translate); 443 + break; 444 + case GG_SVG_SCALE: 445 + scale = in->data; 446 + p->data = gg_svg_clone_scale (scale); 447 + break; 448 + case GG_SVG_ROTATE: 449 + rotate = in->data; 450 + p->data = gg_svg_clone_rotate (rotate); 451 + break; 452 + case GG_SVG_SKEW_X: 453 + case GG_SVG_SKEW_Y: 454 + skew = in->data; 455 + p->data = gg_svg_clone_skew (skew); 456 + break; 457 + }; 458 + p->next = NULL; 459 + return p; 460 +} 461 + 462 +GGRAPH_PRIVATE struct gg_svg_rect * 463 +gg_svg_alloc_rect (double x, double y, double width, double height, double rx, 464 + double ry) 465 +{ 466 +/* allocating and initializing an SVG Rect */ 467 + struct gg_svg_rect *p = malloc (sizeof (struct gg_svg_rect)); 468 + p->x = x; 469 + p->y = y; 470 + p->width = width; 471 + p->height = height; 472 + p->rx = rx; 473 + p->ry = ry; 474 + return p; 475 +} 476 + 477 +GGRAPH_PRIVATE struct gg_svg_rect * 478 +gg_svg_clone_rect (struct gg_svg_rect *in) 479 +{ 480 +/* cloning an SVG Rect */ 481 + struct gg_svg_rect *p = malloc (sizeof (struct gg_svg_rect)); 482 + p->x = in->x; 483 + p->y = in->y; 484 + p->width = in->width; 485 + p->height = in->height; 486 + p->rx = in->rx; 487 + p->ry = in->ry; 488 + return p; 489 +} 490 + 491 +GGRAPH_PRIVATE struct gg_svg_circle * 492 +gg_svg_alloc_circle (double cx, double cy, double r) 493 +{ 494 +/* allocating and initializing an SVG Circle */ 495 + struct gg_svg_circle *p = malloc (sizeof (struct gg_svg_circle)); 496 + p->cx = cx; 497 + p->cy = cy; 498 + p->r = r; 499 + return p; 500 +} 501 + 502 +GGRAPH_PRIVATE struct gg_svg_circle * 503 +gg_svg_clone_circle (struct gg_svg_circle *in) 504 +{ 505 +/* cloning an SVG Circle */ 506 + struct gg_svg_circle *p = malloc (sizeof (struct gg_svg_circle)); 507 + p->cx = in->cx; 508 + p->cy = in->cy; 509 + p->r = in->r; 510 + return p; 511 +} 512 + 513 +GGRAPH_PRIVATE struct gg_svg_ellipse * 514 +gg_svg_alloc_ellipse (double cx, double cy, double rx, double ry) 515 +{ 516 +/* allocating and initializing an SVG Ellipse */ 517 + struct gg_svg_ellipse *p = malloc (sizeof (struct gg_svg_ellipse)); 518 + p->cx = cx; 519 + p->cy = cy; 520 + p->rx = rx; 521 + p->ry = ry; 522 + return p; 523 +} 524 + 525 +GGRAPH_PRIVATE struct gg_svg_ellipse * 526 +gg_svg_clone_ellipse (struct gg_svg_ellipse *in) 527 +{ 528 +/* cloning an SVG Ellipse */ 529 + struct gg_svg_ellipse *p = malloc (sizeof (struct gg_svg_ellipse)); 530 + p->cx = in->cx; 531 + p->cy = in->cy; 532 + p->rx = in->rx; 533 + p->ry = in->ry; 534 + return p; 535 +} 536 + 537 +GGRAPH_PRIVATE struct gg_svg_line * 538 +gg_svg_alloc_line (double x1, double y1, double x2, double y2) 539 +{ 540 +/* allocating and initializing an SVG Line */ 541 + struct gg_svg_line *p = malloc (sizeof (struct gg_svg_line)); 542 + p->x1 = x1; 543 + p->y1 = y1; 544 + p->x2 = x2; 545 + p->y2 = y2; 546 + return p; 547 +} 548 + 549 +GGRAPH_PRIVATE struct gg_svg_line * 550 +gg_svg_clone_line (struct gg_svg_line *in) 551 +{ 552 +/* cloning an SVG Line */ 553 + struct gg_svg_line *p = malloc (sizeof (struct gg_svg_line)); 554 + p->x1 = in->x1; 555 + p->y1 = in->y1; 556 + p->x2 = in->x2; 557 + p->y2 = in->y2; 558 + return p; 559 +} 560 + 561 +GGRAPH_PRIVATE struct gg_svg_polyline * 562 +gg_svg_alloc_polyline (int points, double *x, double *y) 563 +{ 564 +/* allocating and initializing an SVG Polyline */ 565 + struct gg_svg_polyline *p = malloc (sizeof (struct gg_svg_polyline)); 566 + p->points = points; 567 + p->x = x; 568 + p->y = y; 569 + return p; 570 +} 571 + 572 +GGRAPH_PRIVATE struct gg_svg_polyline * 573 +gg_svg_clone_polyline (struct gg_svg_polyline *in) 574 +{ 575 +/* cloning an SVG Polyline */ 576 + int iv; 577 + struct gg_svg_polyline *p = malloc (sizeof (struct gg_svg_polyline)); 578 + p->points = in->points; 579 + p->x = malloc (sizeof (double) * in->points); 580 + p->y = malloc (sizeof (double) * in->points); 581 + for (iv = 0; iv < in->points; iv++) 582 + { 583 + *(p->x + iv) = *(in->x + iv); 584 + *(p->y + iv) = *(in->y + iv); 585 + } 586 + return p; 587 +} 588 + 589 +GGRAPH_PRIVATE struct gg_svg_polygon * 590 +gg_svg_alloc_polygon (int points, double *x, double *y) 591 +{ 592 +/* allocating and initializing an SVG Polygon */ 593 + struct gg_svg_polygon *p = malloc (sizeof (struct gg_svg_polygon)); 594 + p->points = points; 595 + p->x = x; 596 + p->y = y; 597 + return p; 598 +} 599 + 600 +GGRAPH_PRIVATE struct gg_svg_polygon * 601 +gg_svg_clone_polygon (struct gg_svg_polygon *in) 602 +{ 603 +/* cloning an SVG Polygon */ 604 + int iv; 605 + struct gg_svg_polygon *p = malloc (sizeof (struct gg_svg_polygon)); 606 + p->points = in->points; 607 + p->x = malloc (sizeof (double) * in->points); 608 + p->y = malloc (sizeof (double) * in->points); 609 + for (iv = 0; iv < in->points; iv++) 610 + { 611 + *(p->x + iv) = *(in->x + iv); 612 + *(p->y + iv) = *(in->y + iv); 613 + } 614 + return p; 615 +} 616 + 617 +GGRAPH_PRIVATE struct gg_svg_path_move * 618 +gg_svg_alloc_path_move (double x, double y) 619 +{ 620 +/* allocating and initializing an SVG Path MoveTo or LineTo */ 621 + struct gg_svg_path_move *p = malloc (sizeof (struct gg_svg_path_move)); 622 + p->x = x; 623 + p->y = y; 624 + return p; 625 +} 626 + 627 +GGRAPH_PRIVATE struct gg_svg_path_move * 628 +gg_svg_clone_path_move (struct gg_svg_path_move *in) 629 +{ 630 +/* cloning an SVG Path MoveTo or LineTo */ 631 + struct gg_svg_path_move *p = malloc (sizeof (struct gg_svg_path_move)); 632 + p->x = in->x; 633 + p->y = in->y; 634 + return p; 635 +} 636 + 637 +GGRAPH_PRIVATE struct gg_svg_path_bezier * 638 +gg_svg_alloc_path_bezier (double x1, double y1, double x2, double y2, double x, 639 + double y) 640 +{ 641 +/* allocating and initializing an SVG Bezier Curve */ 642 + struct gg_svg_path_bezier *p = malloc (sizeof (struct gg_svg_path_bezier)); 643 + p->x1 = x1; 644 + p->y1 = y1; 645 + p->x2 = x2; 646 + p->y2 = y2; 647 + p->x = x; 648 + p->y = y; 649 + return p; 650 +} 651 + 652 +GGRAPH_PRIVATE struct gg_svg_path_bezier * 653 +gg_svg_clone_path_bezier (struct gg_svg_path_bezier *in) 654 +{ 655 +/* cloning an SVG Bezier Curve */ 656 + struct gg_svg_path_bezier *p = malloc (sizeof (struct gg_svg_path_bezier)); 657 + p->x1 = in->x1; 658 + p->y1 = in->y1; 659 + p->x2 = in->x2; 660 + p->y2 = in->y2; 661 + p->x = in->x; 662 + p->y = in->y; 663 + return p; 664 +} 665 + 666 +GGRAPH_PRIVATE struct gg_svg_path_ellipt_arc * 667 +gg_svg_alloc_path_ellipt_arc (double rx, double ry, double rotation, 668 + int large_arc, int sweep, double x, double y) 669 +{ 670 +/* allocating and initializing an SVG Elliptic Arc */ 671 + struct gg_svg_path_ellipt_arc *p = 672 + malloc (sizeof (struct gg_svg_path_ellipt_arc)); 673 + p->rx = rx; 674 + p->ry = ry; 675 + p->rotation = rotation; 676 + if (large_arc == 0) 677 + p->large_arc = 0; 678 + else 679 + p->large_arc = 1; 680 + if (sweep == 0) 681 + p->sweep = 0; 682 + else 683 + p->sweep = 1; 684 + p->x = x; 685 + p->y = y; 686 + return p; 687 +} 688 + 689 +GGRAPH_PRIVATE struct gg_svg_path_ellipt_arc * 690 +gg_svg_clone_path_ellipt_arc (struct gg_svg_path_ellipt_arc *in) 691 +{ 692 +/* cloning an SVG Elliptic Arc */ 693 + struct gg_svg_path_ellipt_arc *p = 694 + malloc (sizeof (struct gg_svg_path_ellipt_arc)); 695 + p->rx = in->rx; 696 + p->ry = in->ry; 697 + p->rotation = in->rotation; 698 + p->large_arc = in->large_arc; 699 + p->sweep = in->sweep; 700 + p->x = in->x; 701 + p->y = in->y; 702 + return p; 703 +} 704 + 705 +GGRAPH_PRIVATE struct gg_svg_path_item * 706 +gg_svg_alloc_path_item (int type, void *data) 707 +{ 708 +/* allocating and initializing an empty SVG Path item */ 709 + struct gg_svg_path_item *p = malloc (sizeof (struct gg_svg_path_item)); 710 + p->type = type; 711 + p->data = data; 712 + p->next = NULL; 713 + return p; 714 +} 715 + 716 +GGRAPH_PRIVATE void 717 +gg_svg_add_path_item (struct gg_svg_path *path, int type, void *data) 718 +{ 719 +/* add a Command to an SVG Path */ 720 + struct gg_svg_path_item *p = gg_svg_alloc_path_item (type, data); 721 + if (path->first == NULL) 722 + path->first = p; 723 + if (path->last != NULL) 724 + path->last->next = p; 725 + path->last = p; 726 +} 727 + 728 +GGRAPH_PRIVATE struct gg_svg_path * 729 +gg_svg_alloc_path (void) 730 +{ 731 +/* allocating and initializing an empty SVG Path */ 732 + struct gg_svg_path *p = malloc (sizeof (struct gg_svg_path)); 733 + p->first = NULL; 734 + p->last = NULL; 735 + p->error = 0; 736 + return p; 737 +} 738 + 739 +GGRAPH_PRIVATE struct gg_svg_path * 740 +gg_svg_clone_path (struct gg_svg_path *in) 741 +{ 742 +/* cloning an empty SVG Path */ 743 + struct gg_svg_path_move *move; 744 + struct gg_svg_path_bezier *bezier; 745 + struct gg_svg_path_ellipt_arc *arc; 746 + struct gg_svg_path_item *pp; 747 + struct gg_svg_path *p = malloc (sizeof (struct gg_svg_path)); 748 + p->first = NULL; 749 + p->last = NULL; 750 + pp = in->first; 751 + while (pp != NULL) 752 + { 753 + switch (pp->type) 754 + { 755 + case GG_SVG_MOVE_TO: 756 + case GG_SVG_LINE_TO: 757 + move = gg_svg_clone_path_move (pp->data); 758 + gg_svg_add_path_item (p, pp->type, move); 759 + break; 760 + case GG_SVG_CURVE_3: 761 + case GG_SVG_CURVE_4: 762 + bezier = gg_svg_clone_path_bezier (pp->data); 763 + gg_svg_add_path_item (p, pp->type, bezier); 764 + break; 765 + case GG_SVG_ELLIPT_ARC: 766 + arc = gg_svg_clone_path_ellipt_arc (pp->data); 767 + gg_svg_add_path_item (p, pp->type, arc); 768 + break; 769 + case GG_SVG_CLOSE_PATH: 770 + gg_svg_add_path_item (p, pp->type, NULL); 771 + break; 772 + }; 773 + pp = pp->next; 774 + } 775 + p->error = in->error; 776 + return p; 777 +} 778 + 779 +GGRAPH_PRIVATE void 780 +gg_svg_add_clip_url (struct gg_svg_style *style, const char *url) 781 +{ 782 +/* adding an URL (ClipPath ref) to some Style */ 783 + int len; 784 + if (style->clip_url != NULL) 785 + free (style->clip_url); 786 + if (url == NULL) 787 + { 788 + style->clip_url = NULL; 789 + return; 790 + } 791 + len = strlen (url); 792 + style->clip_url = malloc (len + 1); 793 + strcpy (style->clip_url, url); 794 +} 795 + 796 +GGRAPH_PRIVATE void 797 +gg_svg_add_fill_gradient_url (struct gg_svg_style *style, const char *url) 798 +{ 799 +/* adding an URL (Fill Gradient ref) to some Style */ 800 + int len; 801 + if (style->fill_url != NULL) 802 + free (style->fill_url); 803 + if (url == NULL) 804 + { 805 + style->fill_url = NULL; 806 + return; 807 + } 808 + len = strlen (url); 809 + style->fill_url = malloc (len + 1); 810 + strcpy (style->fill_url, url); 811 +} 812 + 813 +GGRAPH_PRIVATE void 814 +gg_svg_add_stroke_gradient_url (struct gg_svg_style *style, const char *url) 815 +{ 816 +/* adding an URL (Stroke Gradient ref) to some Style */ 817 + int len; 818 + if (style->stroke_url != NULL) 819 + free (style->stroke_url); 820 + if (url == NULL) 821 + { 822 + style->stroke_url = NULL; 823 + return; 824 + } 825 + len = strlen (url); 826 + style->stroke_url = malloc (len + 1); 827 + strcpy (style->stroke_url, url); 828 +} 829 + 830 +GGRAPH_PRIVATE struct gg_svg_shape * 831 +gg_svg_alloc_shape (int type, void *data, struct gg_svg_group *parent) 832 +{ 833 +/* allocating and initializing an empty SVG Shape */ 834 + struct gg_svg_shape *p = malloc (sizeof (struct gg_svg_shape)); 835 + p->id = NULL; 836 + p->type = type; 837 + p->data = data; 838 + p->parent = parent; 839 + p->style.visibility = -1; 840 + p->style.opacity = 1.0; 841 + p->style.fill = -1; 842 + p->style.no_fill = -1; 843 + p->style.fill_rule = -1; 844 + p->style.fill_url = NULL; 845 + p->style.fill_pointer = NULL; 846 + p->style.fill_red = -1.0; 847 + p->style.fill_green = -1.0; 848 + p->style.fill_blue = -1.0; 849 + p->style.fill_opacity = -1.0; 850 + p->style.stroke = -1; 851 + p->style.no_stroke = -1; 852 + p->style.stroke_width = -1.0; 853 + p->style.stroke_linecap = -1; 854 + p->style.stroke_linejoin = -1; 855 + p->style.stroke_miterlimit = -1.0; 856 + p->style.stroke_dashitems = 0; 857 + p->style.stroke_dasharray = NULL; 858 + p->style.stroke_dashoffset = 0.0; 859 + p->style.stroke_url = NULL; 860 + p->style.stroke_pointer = NULL; 861 + p->style.stroke_red = -1.0; 862 + p->style.stroke_green = -1.0; 863 + p->style.stroke_blue = -1.0; 864 + p->style.stroke_opacity = -1.0; 865 + p->style.clip_url = NULL; 866 + p->style.clip_pointer = NULL; 867 + p->first_trans = NULL; 868 + p->last_trans = NULL; 869 + p->is_defs = 0; 870 + p->is_flow_root = 0; 871 + p->next = NULL; 872 + return p; 873 +} 874 + 875 +GGRAPH_PRIVATE struct gg_svg_shape * 876 +gg_svg_clone_shape (struct gg_svg_shape *in, struct gg_svg_use *use) 877 +{ 878 +/* cloning an SVG Shape */ 879 + struct gg_svg_rect *rect; 880 + struct gg_svg_circle *circle; 881 + struct gg_svg_ellipse *ellipse; 882 + struct gg_svg_line *line; 883 + struct gg_svg_polyline *polyline; 884 + struct gg_svg_polygon *polygon; 885 + struct gg_svg_path *path; 886 + struct gg_svg_transform *pt; 887 + struct gg_svg_transform *trans; 888 + struct gg_svg_shape *out = malloc (sizeof (struct gg_svg_shape)); 889 + out->id = NULL; 890 + out->type = in->type; 891 + switch (in->type) 892 + { 893 + case GG_SVG_RECT: 894 + rect = in->data; 895 + out->data = gg_svg_clone_rect (rect); 896 + break; 897 + case GG_SVG_CIRCLE: 898 + circle = in->data; 899 + out->data = gg_svg_clone_circle (circle); 900 + break; 901 + case GG_SVG_ELLIPSE: 902 + ellipse = in->data; 903 + out->data = gg_svg_clone_ellipse (ellipse); 904 + break; 905 + case GG_SVG_LINE: 906 + line = in->data; 907 + out->data = gg_svg_clone_line (line); 908 + break; 909 + case GG_SVG_POLYLINE: 910 + polyline = in->data; 911 + out->data = gg_svg_clone_polyline (polyline); 912 + break; 913 + case GG_SVG_POLYGON: 914 + polygon = in->data; 915 + out->data = gg_svg_clone_polygon (polygon); 916 + break; 917 + case GG_SVG_PATH: 918 + path = in->data; 919 + out->data = gg_svg_clone_path (path); 920 + break; 921 + } 922 + if (use != NULL) 923 + out->parent = use->parent; 924 + else 925 + out->parent = in->parent; 926 + out->style.visibility = in->style.visibility; 927 + out->style.opacity = in->style.opacity; 928 + out->style.fill = in->style.fill; 929 + out->style.no_fill = in->style.no_fill; 930 + out->style.fill_rule = in->style.fill_rule; 931 + out->style.fill_url = NULL; 932 + out->style.fill_pointer = NULL; 933 + if (in->style.fill_url != NULL) 934 + gg_svg_add_fill_gradient_url (&(out->style), in->style.fill_url); 935 + out->style.fill_red = in->style.fill_red; 936 + out->style.fill_green = in->style.fill_green; 937 + out->style.fill_blue = in->style.fill_blue; 938 + out->style.fill_opacity = in->style.fill_opacity; 939 + out->style.stroke = in->style.stroke; 940 + out->style.no_stroke = in->style.no_stroke; 941 + out->style.stroke_width = in->style.stroke_width; 942 + out->style.stroke_linecap = in->style.stroke_linecap; 943 + out->style.stroke_linejoin = in->style.stroke_linejoin; 944 + out->style.stroke_miterlimit = in->style.stroke_miterlimit; 945 + out->style.stroke_dashitems = 0; 946 + out->style.stroke_dasharray = NULL; 947 + if (in->style.stroke_dashitems > 0) 948 + { 949 + out->style.stroke_dashitems = in->style.stroke_dashitems; 950 + if (out->style.stroke_dasharray != NULL) 951 + free (out->style.stroke_dasharray); 952 + out->style.stroke_dasharray = NULL; 953 + if (in->style.stroke_dashitems > 0) 954 + { 955 + int i; 956 + out->style.stroke_dasharray = 957 + malloc (sizeof (double) * in->style.stroke_dashitems); 958 + for (i = 0; i < in->style.stroke_dashitems; i++) 959 + out->style.stroke_dasharray[i] = 960 + in->style.stroke_dasharray[i]; 961 + } 962 + out->style.stroke_dashoffset = in->style.stroke_dashoffset; 963 + } 964 + out->style.stroke_url = NULL; 965 + out->style.stroke_pointer = NULL; 966 + if (in->style.stroke_url != NULL) 967 + gg_svg_add_stroke_gradient_url (&(out->style), in->style.stroke_url); 968 + out->style.stroke_red = in->style.stroke_red; 969 + out->style.stroke_green = in->style.stroke_green; 970 + out->style.stroke_blue = in->style.stroke_blue; 971 + out->style.stroke_opacity = in->style.stroke_opacity; 972 + out->style.clip_url = NULL; 973 + out->style.clip_pointer = NULL; 974 + if (in->style.clip_url != NULL) 975 + gg_svg_add_clip_url (&(out->style), in->style.clip_url); 976 + out->first_trans = NULL; 977 + out->last_trans = NULL; 978 + pt = in->first_trans; 979 + while (pt) 980 + { 981 + /* clonig all transformations */ 982 + trans = gg_svg_clone_transform (pt); 983 + if (out->first_trans == NULL) 984 + out->first_trans = trans; 985 + if (out->last_trans != NULL) 986 + out->last_trans->next = trans; 987 + out->last_trans = trans; 988 + pt = pt->next; 989 + } 990 + out->is_defs = 0; 991 + out->is_flow_root = 0; 992 + out->next = NULL; 993 + if (use != NULL) 994 + { 995 + /* adding the Use-level defs */ 996 + pt = use->first_trans; 997 + while (pt) 998 + { 999 + /* clonig all Use transformations */ 1000 + trans = gg_svg_clone_transform (pt); 1001 + if (out->first_trans == NULL) 1002 + out->first_trans = trans; 1003 + if (out->last_trans != NULL) 1004 + out->last_trans->next = trans; 1005 + out->last_trans = trans; 1006 + pt = pt->next; 1007 + } 1008 + if (use->x != DBL_MAX || use->y != DBL_MAX) 1009 + { 1010 + /* adding the implict Use Translate transformation */ 1011 + struct gg_svg_translate *translate = NULL; 1012 + if (use->x != DBL_MAX && use->y != DBL_MAX) 1013 + translate = gg_svg_alloc_translate (use->x, use->y); 1014 + else if (use->x != DBL_MAX) 1015 + translate = gg_svg_alloc_translate (use->x, 0.0); 1016 + else if (use->y != DBL_MAX) 1017 + translate = gg_svg_alloc_translate (0.0, use->y); 1018 + trans = gg_svg_alloc_transform (GG_SVG_TRANSLATE, translate); 1019 + if (out->first_trans == NULL) 1020 + out->first_trans = trans; 1021 + if (out->last_trans != NULL) 1022 + out->last_trans->next = trans; 1023 + out->last_trans = trans; 1024 + } 1025 + /* Use-level styles */ 1026 + if (use->style.visibility >= 0) 1027 + out->style.visibility = use->style.visibility; 1028 + out->style.opacity = use->style.opacity; 1029 + if (use->style.fill >= 0) 1030 + out->style.fill = use->style.fill; 1031 + if (use->style.no_fill >= 0) 1032 + out->style.no_fill = use->style.no_fill; 1033 + if (use->style.fill_rule >= 0) 1034 + out->style.fill_rule = use->style.fill_rule; 1035 + if (use->style.fill_url != NULL) 1036 + gg_svg_add_fill_gradient_url (&(out->style), use->style.fill_url); 1037 + if (use->style.fill_red >= 0.0) 1038 + out->style.fill_red = use->style.fill_red; 1039 + if (use->style.fill_green >= 0.0) 1040 + out->style.fill_green = use->style.fill_green; 1041 + if (use->style.fill_blue >= 0.0) 1042 + out->style.fill_blue = use->style.fill_blue; 1043 + if (use->style.fill_opacity >= 0.0) 1044 + out->style.fill_opacity = use->style.fill_opacity; 1045 + if (use->style.stroke >= 0) 1046 + out->style.stroke = use->style.stroke; 1047 + if (use->style.no_stroke >= 0) 1048 + out->style.no_stroke = use->style.no_stroke; 1049 + if (use->style.stroke_width >= 0.0) 1050 + out->style.stroke_width = use->style.stroke_width; 1051 + if (use->style.stroke_linecap >= 0) 1052 + out->style.stroke_linecap = use->style.stroke_linecap; 1053 + if (use->style.stroke_linejoin >= 0) 1054 + out->style.stroke_linejoin = use->style.stroke_linejoin; 1055 + if (use->style.stroke_miterlimit >= 0.0) 1056 + out->style.stroke_miterlimit = use->style.stroke_miterlimit; 1057 + if (use->style.stroke_dashitems > 0) 1058 + { 1059 + out->style.stroke_dashitems = use->style.stroke_dashitems; 1060 + if (out->style.stroke_dasharray != NULL) 1061 + free (out->style.stroke_dasharray); 1062 + out->style.stroke_dasharray = NULL; 1063 + if (use->style.stroke_dashitems > 0) 1064 + { 1065 + int i; 1066 + out->style.stroke_dasharray = 1067 + malloc (sizeof (double) * 1068 + use->style.stroke_dashitems); 1069 + for (i = 0; i < use->style.stroke_dashitems; i++) 1070 + out->style.stroke_dasharray[i] = 1071 + use->style.stroke_dasharray[i]; 1072 + } 1073 + out->style.stroke_dashoffset = use->style.stroke_dashoffset; 1074 + } 1075 + if (use->style.stroke_url != NULL) 1076 + gg_svg_add_stroke_gradient_url (&(out->style), 1077 + use->style.stroke_url); 1078 + if (use->style.stroke_red >= 0.0) 1079 + out->style.stroke_red = use->style.stroke_red; 1080 + if (use->style.stroke_green >= 0.0) 1081 + out->style.stroke_green = use->style.stroke_green; 1082 + if (use->style.stroke_blue >= 0.0) 1083 + out->style.stroke_blue = use->style.stroke_blue; 1084 + if (use->style.stroke_opacity >= 0.0) 1085 + out->style.stroke_opacity = use->style.stroke_opacity; 1086 + if (use->style.clip_url != NULL) 1087 + gg_svg_add_clip_url (&(out->style), use->style.clip_url); 1088 + } 1089 + return out; 1090 +} 1091 + 1092 +GGRAPH_PRIVATE void 1093 +gg_svg_add_shape_id (struct gg_svg_shape *shape, const char *id) 1094 +{ 1095 +/* setting the ID for some Shape */ 1096 + int len = strlen (id); 1097 + if (shape->id != NULL) 1098 + free (shape->id); 1099 + shape->id = malloc (len + 1); 1100 + strcpy (shape->id, id); 1101 +} 1102 + 1103 +GGRAPH_PRIVATE struct gg_svg_use * 1104 +gg_svg_alloc_use (void *parent, const char *xlink_href, double x, double y, 1105 + double width, double height) 1106 +{ 1107 +/* allocating and initializing an empty SVG Use (xlink:href) */ 1108 + int len = strlen (xlink_href); 1109 + struct gg_svg_use *p = malloc (sizeof (struct gg_svg_use)); 1110 + p->xlink_href = malloc (len + 1); 1111 + strcpy (p->xlink_href, xlink_href); 1112 + p->x = x; 1113 + p->y = y; 1114 + p->width = width; 1115 + p->height = height; 1116 + p->parent = parent; 1117 + p->style.visibility = -1; 1118 + p->style.opacity = 1.0; 1119 + p->style.fill = -1; 1120 + p->style.no_fill = -1; 1121 + p->style.fill_rule = -1; 1122 + p->style.fill_url = NULL; 1123 + p->style.fill_pointer = NULL; 1124 + p->style.fill_red = -1.0; 1125 + p->style.fill_green = -1.0; 1126 + p->style.fill_blue = -1.0; 1127 + p->style.fill_opacity = -1.0; 1128 + p->style.stroke = -1; 1129 + p->style.no_stroke = -1; 1130 + p->style.stroke_width = -1.0; 1131 + p->style.stroke_linecap = -1; 1132 + p->style.stroke_linejoin = -1; 1133 + p->style.stroke_miterlimit = -1.0; 1134 + p->style.stroke_dashitems = 0; 1135 + p->style.stroke_dasharray = NULL; 1136 + p->style.stroke_dashoffset = 0.0; 1137 + p->style.stroke_url = NULL; 1138 + p->style.stroke_pointer = NULL; 1139 + p->style.stroke_red = -1.0; 1140 + p->style.stroke_green = -1.0; 1141 + p->style.stroke_blue = -1.0; 1142 + p->style.stroke_opacity = -1.0; 1143 + p->style.clip_url = NULL; 1144 + p->style.clip_pointer = NULL; 1145 + p->first_trans = NULL; 1146 + p->last_trans = NULL; 1147 + p->next = NULL; 1148 + return p; 1149 +} 1150 + 1151 +GGRAPH_PRIVATE struct gg_svg_use * 1152 +gg_svg_clone_use (struct gg_svg_use *in) 1153 +{ 1154 +/* cloning an SVG Use (xlink:href) */ 1155 + struct gg_svg_transform *pt; 1156 + struct gg_svg_transform *trans; 1157 + int len = strlen (in->xlink_href); 1158 + struct gg_svg_use *out = malloc (sizeof (struct gg_svg_use)); 1159 + out->xlink_href = malloc (len + 1); 1160 + strcpy (out->xlink_href, in->xlink_href); 1161 + out->x = in->x; 1162 + out->y = in->y; 1163 + out->width = in->width; 1164 + out->height = in->height; 1165 + out->parent = in->parent; 1166 + out->style.visibility = in->style.visibility; 1167 + out->style.opacity = in->style.opacity; 1168 + out->style.fill = in->style.fill; 1169 + out->style.no_fill = in->style.no_fill; 1170 + out->style.fill_rule = in->style.fill_rule; 1171 + out->style.fill_url = NULL; 1172 + out->style.fill_pointer = NULL; 1173 + if (in->style.fill_url != NULL) 1174 + gg_svg_add_fill_gradient_url (&(out->style), in->style.fill_url); 1175 + out->style.fill_red = in->style.fill_red; 1176 + out->style.fill_green = in->style.fill_green; 1177 + out->style.fill_blue = in->style.fill_blue; 1178 + out->style.fill_opacity = in->style.fill_opacity; 1179 + out->style.stroke = in->style.stroke; 1180 + out->style.no_stroke = in->style.no_stroke; 1181 + out->style.stroke_width = in->style.stroke_width; 1182 + out->style.stroke_linecap = in->style.stroke_linecap; 1183 + out->style.stroke_linejoin = in->style.stroke_linejoin; 1184 + out->style.stroke_miterlimit = in->style.stroke_miterlimit; 1185 + out->style.stroke_dashitems = 0; 1186 + out->style.stroke_dasharray = NULL; 1187 + if (in->style.stroke_dashitems > 0) 1188 + { 1189 + out->style.stroke_dashitems = in->style.stroke_dashitems; 1190 + if (out->style.stroke_dasharray != NULL) 1191 + free (out->style.stroke_dasharray); 1192 + out->style.stroke_dasharray = NULL; 1193 + if (in->style.stroke_dashitems > 0) 1194 + { 1195 + int i; 1196 + out->style.stroke_dasharray = 1197 + malloc (sizeof (double) * in->style.stroke_dashitems); 1198 + for (i = 0; i < in->style.stroke_dashitems; i++) 1199 + out->style.stroke_dasharray[i] = 1200 + in->style.stroke_dasharray[i]; 1201 + } 1202 + out->style.stroke_dashoffset = in->style.stroke_dashoffset; 1203 + } 1204 + out->style.stroke_url = NULL; 1205 + out->style.stroke_pointer = NULL; 1206 + if (in->style.stroke_url != NULL) 1207 + gg_svg_add_stroke_gradient_url (&(out->style), in->style.stroke_url); 1208 + out->style.stroke_red = in->style.stroke_red; 1209 + out->style.stroke_green = in->style.stroke_green; 1210 + out->style.stroke_blue = in->style.stroke_blue; 1211 + out->style.stroke_opacity = in->style.stroke_opacity; 1212 + out->style.clip_url = NULL; 1213 + out->style.clip_pointer = NULL; 1214 + if (in->style.clip_url != NULL) 1215 + gg_svg_add_clip_url (&(out->style), in->style.clip_url); 1216 + out->first_trans = NULL; 1217 + out->last_trans = NULL; 1218 + pt = in->first_trans; 1219 + while (pt) 1220 + { 1221 + /* clonig all transformations */ 1222 + trans = gg_svg_clone_transform (pt); 1223 + if (out->first_trans == NULL) 1224 + out->first_trans = trans; 1225 + if (out->last_trans != NULL) 1226 + out->last_trans->next = trans; 1227 + out->last_trans = trans; 1228 + pt = pt->next; 1229 + } 1230 + out->next = NULL; 1231 + return out; 1232 +} 1233 + 1234 +GGRAPH_PRIVATE struct gg_svg_group * 1235 +gg_svg_alloc_group (void) 1236 +{ 1237 +/* allocating and initializing an empty SVG Group <g> */ 1238 + struct gg_svg_group *p = malloc (sizeof (struct gg_svg_group)); 1239 + p->id = NULL; 1240 + p->style.visibility = -1; 1241 + p->style.opacity = 1.0; 1242 + p->style.fill = -1; 1243 + p->style.no_fill = -1; 1244 + p->style.fill_rule = -1; 1245 + p->style.fill_url = NULL; 1246 + p->style.fill_pointer = NULL; 1247 + p->style.fill_red = -1.0; 1248 + p->style.fill_green = -1.0; 1249 + p->style.fill_blue = -1.0; 1250 + p->style.fill_opacity = -1.0; 1251 + p->style.stroke = -1; 1252 + p->style.no_stroke = -1; 1253 + p->style.stroke_width = -1.0; 1254 + p->style.stroke_linecap = -1; 1255 + p->style.stroke_linejoin = -1; 1256 + p->style.stroke_miterlimit = -1.0; 1257 + p->style.stroke_dashitems = 0; 1258 + p->style.stroke_dasharray = NULL; 1259 + p->style.stroke_dashoffset = 0.0; 1260 + p->style.stroke_url = NULL; 1261 + p->style.stroke_pointer = NULL; 1262 + p->style.stroke_red = -1.0; 1263 + p->style.stroke_green = -1.0; 1264 + p->style.stroke_blue = -1.0; 1265 + p->style.stroke_opacity = -1.0; 1266 + p->style.clip_url = NULL; 1267 + p->style.clip_pointer = NULL; 1268 + p->parent = NULL; 1269 + p->first = NULL; 1270 + p->last = NULL; 1271 + p->first_trans = NULL; 1272 + p->last_trans = NULL; 1273 + p->is_defs = 0; 1274 + p->is_flow_root = 0; 1275 + p->next = NULL; 1276 + return p; 1277 +} 1278 + 1279 +GGRAPH_PRIVATE struct gg_svg_group * 1280 +gg_svg_clone_group (struct gg_svg_group *in, struct gg_svg_use *use) 1281 +{ 1282 +/* cloning an SVG Group */ 1283 + struct gg_svg_transform *pt; 1284 + struct gg_svg_transform *trans; 1285 + struct gg_svg_item *item; 1286 + struct gg_svg_item *itm; 1287 + struct gg_svg_group *out = malloc (sizeof (struct gg_svg_group)); 1288 + out->id = NULL; 1289 + out->style.visibility = in->style.visibility; 1290 + out->style.opacity = in->style.opacity; 1291 + out->style.fill = in->style.fill; 1292 + out->style.no_fill = in->style.no_fill; 1293 + out->style.fill_rule = in->style.fill_rule; 1294 + out->style.fill_url = NULL; 1295 + out->style.fill_pointer = NULL; 1296 + if (in->style.fill_url != NULL) 1297 + gg_svg_add_fill_gradient_url (&(out->style), in->style.fill_url); 1298 + out->style.fill_red = in->style.fill_red; 1299 + out->style.fill_green = in->style.fill_green; 1300 + out->style.fill_blue = in->style.fill_blue; 1301 + out->style.fill_opacity = in->style.fill_opacity; 1302 + out->style.stroke = in->style.stroke; 1303 + out->style.no_stroke = in->style.no_stroke; 1304 + out->style.stroke_width = in->style.stroke_width; 1305 + out->style.stroke_linecap = in->style.stroke_linecap; 1306 + out->style.stroke_linejoin = in->style.stroke_linejoin; 1307 + out->style.stroke_miterlimit = in->style.stroke_miterlimit; 1308 + out->style.stroke_dashitems = 0; 1309 + out->style.stroke_dasharray = NULL; 1310 + if (in->style.stroke_dashitems > 0) 1311 + { 1312 + out->style.stroke_dashitems = in->style.stroke_dashitems; 1313 + if (out->style.stroke_dasharray != NULL) 1314 + free (out->style.stroke_dasharray); 1315 + out->style.stroke_dasharray = NULL; 1316 + if (in->style.stroke_dashitems > 0) 1317 + { 1318 + int i; 1319 + out->style.stroke_dasharray = 1320 + malloc (sizeof (double) * in->style.stroke_dashitems); 1321 + for (i = 0; i < in->style.stroke_dashitems; i++) 1322 + out->style.stroke_dasharray[i] = 1323 + in->style.stroke_dasharray[i]; 1324 + } 1325 + out->style.stroke_dashoffset = in->style.stroke_dashoffset; 1326 + } 1327 + out->style.stroke_url = NULL; 1328 + out->style.stroke_pointer = NULL; 1329 + if (in->style.stroke_url != NULL) 1330 + gg_svg_add_stroke_gradient_url (&(out->style), in->style.stroke_url); 1331 + out->style.stroke_red = in->style.stroke_red; 1332 + out->style.stroke_green = in->style.stroke_green; 1333 + out->style.stroke_blue = in->style.stroke_blue; 1334 + out->style.stroke_opacity = in->style.stroke_opacity; 1335 + out->style.clip_url = NULL; 1336 + out->style.clip_pointer = NULL; 1337 + if (in->style.clip_url != NULL) 1338 + gg_svg_add_clip_url (&(out->style), in->style.clip_url); 1339 + if (use != NULL) 1340 + out->parent = use->parent; 1341 + else 1342 + out->parent = in->parent; 1343 + out->first = NULL; 1344 + out->last = NULL; 1345 + out->is_defs = 0; 1346 + out->is_flow_root = 0; 1347 + item = in->first; 1348 + while (item) 1349 + { 1350 + /* looping on Group Items */ 1351 + itm = gg_svg_clone_item (item); 1352 + gg_svg_set_group_parent (itm, out); 1353 + if (out->first == NULL) 1354 + out->first = itm; 1355 + if (out->last != NULL) 1356 + out->last->next = itm; 1357 + out->last = itm; 1358 + item = item->next; 1359 + } 1360 + out->first_trans = NULL; 1361 + out->last_trans = NULL; 1362 + out->next = NULL; 1363 + if (use != NULL) 1364 + { 1365 + /* adding the Use-level defs */ 1366 + pt = use->first_trans; 1367 + while (pt) 1368 + { 1369 + /* clonig all Use transformations */ 1370 + trans = gg_svg_clone_transform (pt); 1371 + if (out->first_trans == NULL) 1372 + out->first_trans = trans; 1373 + if (out->last_trans != NULL) 1374 + out->last_trans->next = trans; 1375 + out->last_trans = trans; 1376 + pt = pt->next; 1377 + } 1378 + } 1379 + pt = in->first_trans; 1380 + while (pt) 1381 + { 1382 + /* clonig all transformations */ 1383 + trans = gg_svg_clone_transform (pt); 1384 + if (out->first_trans == NULL) 1385 + out->first_trans = trans; 1386 + if (out->last_trans != NULL) 1387 + out->last_trans->next = trans; 1388 + out->last_trans = trans; 1389 + pt = pt->next; 1390 + } 1391 + if (use != NULL) 1392 + { 1393 + /* adding the Use-level defs */ 1394 + if (use->x != DBL_MAX || use->y != DBL_MAX) 1395 + { 1396 + /* adding the implict Use Translate transformation */ 1397 + struct gg_svg_translate *translate = NULL; 1398 + if (use->x != DBL_MAX && use->y != DBL_MAX) 1399 + translate = gg_svg_alloc_translate (use->x, use->y); 1400 + else if (use->x != DBL_MAX) 1401 + translate = gg_svg_alloc_translate (use->x, 0.0); 1402 + else if (use->y != DBL_MAX) 1403 + translate = gg_svg_alloc_translate (0.0, use->y); 1404 + trans = gg_svg_alloc_transform (GG_SVG_TRANSLATE, translate); 1405 + if (out->first_trans == NULL) 1406 + out->first_trans = trans; 1407 + if (out->last_trans != NULL) 1408 + out->last_trans->next = trans; 1409 + out->last_trans = trans; 1410 + } 1411 + /* Use-level styles */ 1412 + if (use->style.visibility >= 0) 1413 + out->style.visibility = use->style.visibility; 1414 + out->style.opacity = use->style.opacity; 1415 + if (use->style.fill >= 0) 1416 + out->style.fill = use->style.fill; 1417 + if (use->style.no_fill >= 0) 1418 + out->style.no_fill = use->style.no_fill; 1419 + if (use->style.fill_rule >= 0) 1420 + out->style.fill_rule = use->style.fill_rule; 1421 + if (use->style.fill_url != NULL) 1422 + gg_svg_add_fill_gradient_url (&(out->style), use->style.fill_url); 1423 + if (use->style.fill_red >= 0.0) 1424 + out->style.fill_red = use->style.fill_red; 1425 + if (use->style.fill_green >= 0.0) 1426 + out->style.fill_green = use->style.fill_green; 1427 + if (use->style.fill_blue >= 0.0) 1428 + out->style.fill_blue = use->style.fill_blue; 1429 + if (use->style.fill_opacity >= 0.0) 1430 + out->style.fill_opacity = use->style.fill_opacity; 1431 + if (use->style.stroke >= 0) 1432 + out->style.stroke = use->style.stroke; 1433 + if (use->style.no_stroke >= 0) 1434 + out->style.no_stroke = use->style.no_stroke; 1435 + if (use->style.stroke_width >= 0.0) 1436 + out->style.stroke_width = use->style.stroke_width; 1437 + if (use->style.stroke_linecap >= 0) 1438 + out->style.stroke_linecap = use->style.stroke_linecap; 1439 + if (use->style.stroke_linejoin >= 0) 1440 + out->style.stroke_linejoin = use->style.stroke_linejoin; 1441 + if (use->style.stroke_miterlimit >= 0.0) 1442 + out->style.stroke_miterlimit = use->style.stroke_miterlimit; 1443 + if (in->style.stroke_dashitems > 0) 1444 + { 1445 + out->style.stroke_dashitems = use->style.stroke_dashitems; 1446 + if (out->style.stroke_dasharray != NULL) 1447 + free (out->style.stroke_dasharray); 1448 + out->style.stroke_dasharray = NULL; 1449 + if (use->style.stroke_dashitems > 0) 1450 + { 1451 + int i; 1452 + out->style.stroke_dasharray = 1453 + malloc (sizeof (double) * 1454 + use->style.stroke_dashitems); 1455 + for (i = 0; i < use->style.stroke_dashitems; i++) 1456 + out->style.stroke_dasharray[i] = 1457 + use->style.stroke_dasharray[i]; 1458 + } 1459 + out->style.stroke_dashoffset = use->style.stroke_dashoffset; 1460 + } 1461 + if (use->style.stroke_url != NULL) 1462 + gg_svg_add_stroke_gradient_url (&(out->style), 1463 + use->style.stroke_url); 1464 + if (use->style.stroke_red >= 0.0) 1465 + out->style.stroke_red = use->style.stroke_red; 1466 + if (use->style.stroke_green >= 0.0) 1467 + out->style.stroke_green = use->style.stroke_green; 1468 + if (use->style.stroke_blue >= 0.0) 1469 + out->style.stroke_blue = use->style.stroke_blue; 1470 + if (use->style.stroke_opacity >= 0.0) 1471 + out->style.stroke_opacity = use->style.stroke_opacity; 1472 + if (use->style.clip_url != NULL) 1473 + gg_svg_add_clip_url (&(out->style), use->style.clip_url); 1474 + } 1475 + out->next = NULL; 1476 + return out; 1477 +} 1478 + 1479 +GGRAPH_PRIVATE struct gg_svg_clip * 1480 +gg_svg_alloc_clip (void) 1481 +{ 1482 +/* allocating and initializing an empty SVG ClipPath */ 1483 + struct gg_svg_clip *p = malloc (sizeof (struct gg_svg_clip)); 1484 + p->id = NULL; 1485 + p->first = NULL; 1486 + p->last = NULL; 1487 + p->next = NULL; 1488 + return p; 1489 +} 1490 + 1491 +GGRAPH_PRIVATE struct gg_svg_clip * 1492 +gg_svg_clone_clip (struct gg_svg_clip *in) 1493 +{ 1494 +/* cloning an SVG ClipPath */ 1495 + struct gg_svg_item *item; 1496 + struct gg_svg_item *itm; 1497 + struct gg_svg_clip *out = malloc (sizeof (struct gg_svg_clip)); 1498 + out->id = NULL; 1499 + out->first = NULL; 1500 + out->last = NULL; 1501 + item = in->first; 1502 + while (item) 1503 + { 1504 + /* looping on Group Items */ 1505 + itm = gg_svg_clone_item (item); 1506 + if (out->first == NULL) 1507 + out->first = itm; 1508 + if (out->last != NULL) 1509 + out->last->next = itm; 1510 + out->last = itm; 1511 + item = item->next; 1512 + } 1513 + out->next = NULL; 1514 + return out; 1515 +} 1516 + 1517 +GGRAPH_PRIVATE void 1518 +gg_svg_add_group_id (struct gg_svg_group *group, const char *id) 1519 +{ 1520 +/* setting the ID for some Group */ 1521 + int len = strlen (id); 1522 + if (group->id != NULL) 1523 + free (group->id); 1524 + group->id = malloc (len + 1); 1525 + strcpy (group->id, id); 1526 +} 1527 + 1528 +GGRAPH_PRIVATE void 1529 +gg_svg_add_clip_id (struct gg_svg_clip *clip, const char *id) 1530 +{ 1531 +/* setting the ID for some ClipPath */ 1532 + int len = strlen (id); 1533 + if (clip->id != NULL) 1534 + free (clip->id); 1535 + clip->id = malloc (len + 1); 1536 + strcpy (clip->id, id); 1537 +} 1538 + 1539 +GGRAPH_PRIVATE struct gg_svg_item * 1540 +gg_svg_alloc_item (int type, void *pointer) 1541 +{ 1542 +/* allocating and initializing an empty SVG item */ 1543 + struct gg_svg_item *p = malloc (sizeof (struct gg_svg_item)); 1544 + p->type = type; 1545 + p->pointer = pointer; 1546 + p->next = NULL; 1547 + return p; 1548 +} 1549 + 1550 +GGRAPH_PRIVATE struct gg_svg_item * 1551 +gg_svg_clone_item (struct gg_svg_item *in) 1552 +{ 1553 +/* cloning an SVG item */ 1554 + struct gg_svg_group *group; 1555 + struct gg_svg_shape *shape; 1556 + struct gg_svg_use *use; 1557 + struct gg_svg_clip *clip; 1558 + struct gg_svg_item *p = malloc (sizeof (struct gg_svg_item)); 1559 + p->type = in->type; 1560 + switch (in->type) 1561 + { 1562 + case GG_SVG_ITEM_GROUP: 1563 + group = in->pointer; 1564 + p->pointer = gg_svg_clone_group (group, NULL); 1565 + break; 1566 + case GG_SVG_ITEM_SHAPE: 1567 + shape = in->pointer; 1568 + p->pointer = gg_svg_clone_shape (shape, NULL); 1569 + break; 1570 + case GG_SVG_ITEM_USE: 1571 + use = in->pointer; 1572 + p->pointer = gg_svg_clone_use (use); 1573 + case GG_SVG_ITEM_CLIP: 1574 + clip = in->pointer; 1575 + p->pointer = gg_svg_clone_clip (clip); 1576 + break; 1577 + }; 1578 + p->next = NULL; 1579 + return p; 1580 +} 1581 + 1582 +GGRAPH_PRIVATE void 1583 +gg_svg_set_group_parent (struct gg_svg_item *item, struct gg_svg_group *grp) 1584 +{ 1585 +/* cloning an SVG item */ 1586 + struct gg_svg_group *group; 1587 + struct gg_svg_shape *shape; 1588 + struct gg_svg_use *use; 1589 + switch (item->type) 1590 + { 1591 + case GG_SVG_ITEM_GROUP: 1592 + group = item->pointer; 1593 + group->parent = grp; 1594 + break; 1595 + case GG_SVG_ITEM_SHAPE: 1596 + shape = item->pointer; 1597 + shape->parent = grp; 1598 + break; 1599 + case GG_SVG_ITEM_USE: 1600 + use = item->pointer; 1601 + use->parent = grp; 1602 + break; 1603 + }; 1604 +} 1605 + 1606 +GGRAPH_PRIVATE struct gg_svg_gradient_stop * 1607 +gg_svg_alloc_gradient_stop (double offset, double red, double green, 1608 + double blue, double opacity) 1609 +{ 1610 +/* allocating and initializing an SVG GradientStop */ 1611 + struct gg_svg_gradient_stop *p = 1612 + malloc (sizeof (struct gg_svg_gradient_stop)); 1613 + p->offset = offset; 1614 + p->red = red; 1615 + p->green = green; 1616 + p->blue = blue; 1617 + p->opacity = opacity; 1618 + p->next = NULL; 1619 + return p; 1620 +} 1621 + 1622 +GGRAPH_PRIVATE struct gg_svg_gradient_stop * 1623 +gg_svg_clone_gradient_stop (struct gg_svg_gradient_stop *in) 1624 +{ 1625 +/* cloning an SVG GradientStop */ 1626 + struct gg_svg_gradient_stop *out = 1627 + malloc (sizeof (struct gg_svg_gradient_stop)); 1628 + out->offset = in->offset; 1629 + out->red = in->red; 1630 + out->green = in->green; 1631 + out->blue = in->blue; 1632 + out->opacity = in->opacity; 1633 + out->next = NULL; 1634 + return out; 1635 +} 1636 + 1637 +GGRAPH_PRIVATE struct gg_svg_gradient * 1638 +gg_svg_alloc_gradient (void) 1639 +{ 1640 +/* allocating and initializing an empty SVG Gradient */ 1641 + struct gg_svg_gradient *p = malloc (sizeof (struct gg_svg_gradient)); 1642 + p->type = -1; 1643 + p->id = NULL; 1644 + p->xlink_href = NULL; 1645 + p->gradient_units = -1; 1646 + p->x1 = DBL_MAX; 1647 + p->y1 = DBL_MAX; 1648 + p->x2 = DBL_MAX; 1649 + p->y2 = DBL_MAX; 1650 + p->cx = DBL_MAX; 1651 + p->cy = DBL_MAX; 1652 + p->fx = DBL_MAX; 1653 + p->fy = DBL_MAX; 1654 + p->r = DBL_MAX; 1655 + p->first_trans = NULL; 1656 + p->last_trans = NULL; 1657 + p->first_stop = NULL; 1658 + p->last_stop = NULL; 1659 + p->next = NULL; 1660 + p->prev = NULL; 1661 + return p; 1662 +} 1663 + 1664 +GGRAPH_PRIVATE struct gg_svg_gradient * 1665 +gg_svg_clone_gradient (struct gg_svg_gradient *in, struct gg_svg_gradient *old) 1666 +{ 1667 +/* cloning an SVG Gradient */ 1668 + struct gg_svg_transform *pt; 1669 + struct gg_svg_transform *trans; 1670 + struct gg_svg_gradient_stop *ps; 1671 + struct gg_svg_gradient_stop *stop; 1672 + int len; 1673 + struct gg_svg_gradient *out = malloc (sizeof (struct gg_svg_gradient)); 1674 + out->type = old->type; 1675 + out->id = NULL; 1676 + out->xlink_href = NULL; 1677 + if (old->id != NULL) 1678 + { 1679 + len = strlen (old->id); 1680 + out->id = malloc (len + 1); 1681 + strcpy (out->id, old->id); 1682 + } 1683 + if (old->xlink_href != NULL) 1684 + { 1685 + len = strlen (old->xlink_href); 1686 + out->xlink_href = malloc (len + 1); 1687 + strcpy (out->xlink_href, old->xlink_href); 1688 + } 1689 + out->gradient_units = in->gradient_units; 1690 + if (old->gradient_units >= 0) 1691 + out->gradient_units = old->gradient_units; 1692 + out->x1 = in->x1; 1693 + if (old->x1 != DBL_MAX) 1694 + out->x1 = old->x1; 1695 + out->y1 = in->y1; 1696 + if (old->y1 != DBL_MAX) 1697 + out->y1 = old->y1; 1698 + out->x2 = in->x2; 1699 + if (old->x2 != DBL_MAX) 1700 + out->x2 = old->x2; 1701 + out->y2 = in->y2; 1702 + if (old->y2 != DBL_MAX) 1703 + out->y2 = old->y2; 1704 + out->cx = in->cx; 1705 + if (old->cx != DBL_MAX) 1706 + out->cx = old->cx; 1707 + out->cy = in->cy; 1708 + if (old->cy != DBL_MAX) 1709 + out->cy = old->cy; 1710 + out->fx = in->fx; 1711 + if (old->fx != DBL_MAX) 1712 + out->fx = old->fx; 1713 + out->fy = in->fy; 1714 + if (old->fy != DBL_MAX) 1715 + out->fy = old->fy; 1716 + out->r = in->r; 1717 + if (old->r != DBL_MAX) 1718 + out->r = old->r; 1719 + out->first_trans = NULL; 1720 + out->last_trans = NULL; 1721 + out->first_stop = NULL; 1722 + out->last_stop = NULL; 1723 + pt = in->first_trans; 1724 + while (pt) 1725 + { 1726 + /* clonig all inherited transformations */ 1727 + trans = gg_svg_clone_transform (pt); 1728 + if (out->first_trans == NULL) 1729 + out->first_trans = trans; 1730 + if (out->last_trans != NULL) 1731 + out->last_trans->next = trans; 1732 + out->last_trans = trans; 1733 + pt = pt->next; 1734 + } 1735 + pt = old->first_trans; 1736 + while (pt) 1737 + { 1738 + /* clonig all direct transformations */ 1739 + trans = gg_svg_clone_transform (pt); 1740 + if (out->first_trans == NULL) 1741 + out->first_trans = trans; 1742 + if (out->last_trans != NULL) 1743 + out->last_trans->next = trans; 1744 + out->last_trans = trans; 1745 + pt = pt->next; 1746 + } 1747 + ps = in->first_stop; 1748 + while (ps) 1749 + { 1750 + /* clonig all inherited Stops */ 1751 + stop = gg_svg_clone_gradient_stop (ps); 1752 + if (out->first_stop == NULL) 1753 + out->first_stop = stop; 1754 + if (out->last_stop != NULL) 1755 + out->last_stop->next = stop; 1756 + out->last_stop = stop; 1757 + ps = ps->next; 1758 + } 1759 + ps = old->first_stop; 1760 + while (ps) 1761 + { 1762 + /* clonig all inherited Stops */ 1763 + stop = gg_svg_clone_gradient_stop (ps); 1764 + if (out->first_stop == NULL) 1765 + out->first_stop = stop; 1766 + if (out->last_stop != NULL) 1767 + out->last_stop->next = stop; 1768 + out->last_stop = stop; 1769 + ps = ps->next; 1770 + } 1771 + out->next = NULL; 1772 + out->prev = NULL; 1773 + return out; 1774 +} 1775 + 1776 +GGRAPH_PRIVATE struct gg_svg_document * 1777 +gg_svg_alloc_document (void) 1778 +{ 1779 +/* allocating and initializing an empty SVG Document */ 1780 + struct gg_svg_document *p = malloc (sizeof (struct gg_svg_document)); 1781 + p->signature = GG_GRAPHICS_SVG_MAGIC_SIGNATURE; 1782 + p->width = 0.0; 1783 + p->height = 0.0; 1784 + p->viewbox_x = DBL_MIN; 1785 + p->viewbox_y = DBL_MIN; 1786 + p->viewbox_width = DBL_MIN; 1787 + p->viewbox_height = DBL_MIN; 1788 + p->first = NULL; 1789 + p->last = NULL; 1790 + p->first_grad = NULL; 1791 + p->last_grad = NULL; 1792 + p->current_group = NULL; 1793 + p->current_shape = NULL; 1794 + p->current_clip = NULL; 1795 + p->defs_count = 0; 1796 + p->flow_root_count = 0; 1797 + return p; 1798 +} 1799 + 1800 +GGRAPH_PRIVATE void 1801 +gg_svg_close_group (struct gg_svg_document *gg_svg_doc) 1802 +{ 1803 +/* closing the current SVG Group */ 1804 + struct gg_svg_group *group = gg_svg_doc->current_group; 1805 + gg_svg_doc->current_group = group->parent; 1806 +} 1807 + 1808 +GGRAPH_PRIVATE void 1809 +gg_svg_insert_group (struct gg_svg_document *gg_svg_doc) 1810 +{ 1811 +/* inserting a new Group into the SVG Document */ 1812 + struct gg_svg_item *item; 1813 + struct gg_svg_group *parent; 1814 + struct gg_svg_group *group = gg_svg_alloc_group (); 1815 + if (gg_svg_doc->current_group != NULL) 1816 + { 1817 + /* nested group */ 1818 + parent = gg_svg_doc->current_group; 1819 + group->parent = parent; 1820 + if (gg_svg_doc->defs_count > 0) 1821 + group->is_defs = 1; 1822 + if (gg_svg_doc->flow_root_count > 0) 1823 + group->is_flow_root = 1; 1824 + item = gg_svg_alloc_item (GG_SVG_ITEM_GROUP, group); 1825 + if (parent->first == NULL) 1826 + parent->first = item; 1827 + if (parent->last != NULL) 1828 + parent->last->next = item; 1829 + parent->last = item; 1830 + gg_svg_doc->current_group = group; 1831 + return; 1832 + } 1833 + if (gg_svg_doc->current_clip != NULL) 1834 + { 1835 + /* ClipPath group */ 1836 + if (gg_svg_doc->defs_count > 0) 1837 + group->is_defs = 1; 1838 + if (gg_svg_doc->flow_root_count > 0) 1839 + group->is_flow_root = 1; 1840 + item = gg_svg_alloc_item (GG_SVG_ITEM_GROUP, group); 1841 + if (gg_svg_doc->current_clip->first == NULL) 1842 + gg_svg_doc->current_clip->first = item; 1843 + if (gg_svg_doc->current_clip->last != NULL) 1844 + gg_svg_doc->current_clip->last->next = item; 1845 + gg_svg_doc->current_clip->last = item; 1846 + gg_svg_doc->current_group = group; 1847 + return; 1848 + } 1849 +/* first level Group */ 1850 + parent = gg_svg_doc->current_group; 1851 + group->parent = parent; 1852 + if (gg_svg_doc->defs_count > 0) 1853 + group->is_defs = 1; 1854 + if (gg_svg_doc->flow_root_count > 0) 1855 + group->is_flow_root = 1; 1856 + item = gg_svg_alloc_item (GG_SVG_ITEM_GROUP, group); 1857 + if (gg_svg_doc->first == NULL) 1858 + gg_svg_doc->first = item; 1859 + if (gg_svg_doc->last != NULL) 1860 + gg_svg_doc->last->next = item; 1861 + gg_svg_doc->last = item; 1862 + gg_svg_doc->current_group = group; 1863 +} 1864 + 1865 +GGRAPH_PRIVATE void 1866 +gg_svg_close_clip (struct gg_svg_document *gg_svg_doc) 1867 +{ 1868 +/* closing the current SVG ClipPath */ 1869 + gg_svg_doc->current_clip = NULL; 1870 +} 1871 + 1872 +GGRAPH_PRIVATE void 1873 +gg_svg_insert_clip (struct gg_svg_document *gg_svg_doc) 1874 +{ 1875 +/* inserting a new ClipPath into the SVG Document */ 1876 + struct gg_svg_item *item; 1877 + struct gg_svg_clip *clip = gg_svg_alloc_clip (); 1878 + item = gg_svg_alloc_item (GG_SVG_ITEM_CLIP, clip); 1879 + if (gg_svg_doc->first == NULL) 1880 + gg_svg_doc->first = item; 1881 + if (gg_svg_doc->last != NULL) 1882 + gg_svg_doc->last->next = item; 1883 + gg_svg_doc->last = item; 1884 + gg_svg_doc->current_clip = clip; 1885 +} 1886 + 1887 +GGRAPH_PRIVATE struct gg_svg_use * 1888 +gg_svg_insert_use (struct gg_svg_document *gg_svg_doc, const char *xlink_href, 1889 + double x, double y, double width, double height) 1890 +{ 1891 +/* inserting a new Use (xlink:href) into the SVG Document */ 1892 + struct gg_svg_use *use; 1893 + struct gg_svg_group *group; 1894 + struct gg_svg_clip *clip; 1895 + struct gg_svg_item *item; 1896 + 1897 + if (gg_svg_doc->current_group == NULL && gg_svg_doc->current_clip == NULL) 1898 + { 1899 + /* inserting directly into the Document */ 1900 + use = gg_svg_alloc_use (NULL, xlink_href, x, y, width, height); 1901 + item = gg_svg_alloc_item (GG_SVG_ITEM_USE, use); 1902 + if (gg_svg_doc->first == NULL) 1903 + gg_svg_doc->first = item; 1904 + if (gg_svg_doc->last != NULL) 1905 + gg_svg_doc->last->next = item; 1906 + gg_svg_doc->last = item; 1907 + } 1908 + else if (gg_svg_doc->current_clip != NULL) 1909 + { 1910 + /* inserting into the current ClipPath */ 1911 + clip = gg_svg_doc->current_clip; 1912 + use = gg_svg_alloc_use (clip, xlink_href, x, y, width, height); 1913 + item = gg_svg_alloc_item (GG_SVG_ITEM_USE, use); 1914 + if (clip->first == NULL) 1915 + clip->first = item; 1916 + if (clip->last != NULL) 1917 + clip->last->next = item; 1918 + clip->last = item; 1919 + } 1920 + else if (gg_svg_doc->current_group != NULL) 1921 + { 1922 + /* inserting into the current Group */ 1923 + group = gg_svg_doc->current_group; 1924 + use = gg_svg_alloc_use (group, xlink_href, x, y, width, height); 1925 + item = gg_svg_alloc_item (GG_SVG_ITEM_USE, use); 1926 + if (group->first == NULL) 1927 + group->first = item; 1928 + if (group->last != NULL) 1929 + group->last->next = item; 1930 + group->last = item; 1931 + } 1932 + return use; 1933 +} 1934 + 1935 +GGRAPH_PRIVATE void 1936 +gg_svg_insert_shape (struct gg_svg_document *gg_svg_doc, int type, void *data) 1937 +{ 1938 +/* inserting a new Shape into the SVG Document */ 1939 + struct gg_svg_group *group; 1940 + struct gg_svg_shape *shape; 1941 + struct gg_svg_clip *clip; 1942 + struct gg_svg_item *item; 1943 + 1944 + if (gg_svg_doc->current_group == NULL && gg_svg_doc->current_clip == NULL) 1945 + { 1946 + /* inserting directly into the Document */ 1947 + shape = gg_svg_alloc_shape (type, data, NULL); 1948 + if (gg_svg_doc->defs_count > 0) 1949 + shape->is_defs = 1; 1950 + if (gg_svg_doc->flow_root_count > 0) 1951 + shape->is_flow_root = 1; 1952 + item = gg_svg_alloc_item (GG_SVG_ITEM_SHAPE, shape); 1953 + if (gg_svg_doc->first == NULL) 1954 + gg_svg_doc->first = item; 1955 + if (gg_svg_doc->last != NULL) 1956 + gg_svg_doc->last->next = item; 1957 + gg_svg_doc->last = item; 1958 + } 1959 + else if (gg_svg_doc->current_group != NULL) 1960 + { 1961 + /* inserting into the current Group */ 1962 + group = gg_svg_doc->current_group; 1963 + shape = gg_svg_alloc_shape (type, data, group); 1964 + if (gg_svg_doc->defs_count > 0) 1965 + shape->is_defs = 1; 1966 + if (gg_svg_doc->flow_root_count > 0) 1967 + shape->is_flow_root = 1; 1968 + item = gg_svg_alloc_item (GG_SVG_ITEM_SHAPE, shape); 1969 + if (group->first == NULL) 1970 + group->first = item; 1971 + if (group->last != NULL) 1972 + group->last->next = item; 1973 + group->last = item; 1974 + } 1975 + else if (gg_svg_doc->current_clip != NULL) 1976 + { 1977 + /* inserting into the current ClipPath */ 1978 + clip = gg_svg_doc->current_clip; 1979 + shape = gg_svg_alloc_shape (type, data, NULL); 1980 + if (gg_svg_doc->defs_count > 0) 1981 + shape->is_defs = 1; 1982 + if (gg_svg_doc->flow_root_count > 0) 1983 + shape->is_flow_root = 1; 1984 + item = gg_svg_alloc_item (GG_SVG_ITEM_SHAPE, shape); 1985 + if (clip->first == NULL) 1986 + clip->first = item; 1987 + if (clip->last != NULL) 1988 + clip->last->next = item; 1989 + clip->last = item; 1990 + } 1991 + gg_svg_doc->current_shape = shape; 1992 +} 1993 + 1994 +GGRAPH_PRIVATE void 1995 +gg_svg_insert_gradient_stop (struct gg_svg_gradient *gradient, 1996 + double offset, double red, double green, 1997 + double blue, double opacity) 1998 +{ 1999 +/* inserting a Stop into a Gradient */ 2000 + struct gg_svg_gradient_stop *stop = 2001 + gg_svg_alloc_gradient_stop (offset, red, green, blue, opacity); 2002 + if (gradient->first_stop == NULL) 2003 + gradient->first_stop = stop; 2004 + if (gradient->last_stop != NULL) 2005 + gradient->last_stop->next = stop; 2006 + gradient->last_stop = stop; 2007 +} 2008 + 2009 +GGRAPH_PRIVATE struct gg_svg_gradient * 2010 +gg_svg_insert_linear_gradient (struct gg_svg_document *gg_svg_doc, 2011 + const char *id, const char *xlink_href, 2012 + double x1, double y1, double x2, double y2, 2013 + int units) 2014 +{ 2015 +/* inserting a new Linear Gradient into the SVG Document */ 2016 + int len; 2017 + struct gg_svg_gradient *gradient = gg_svg_alloc_gradient (); 2018 + gradient->type = GG_SVG_LINEAR_GRADIENT; 2019 + gradient->id = NULL; 2020 + if (id != NULL) 2021 + { 2022 + len = strlen (id); 2023 + gradient->id = malloc (len + 1); 2024 + strcpy (gradient->id, id); 2025 + } 2026 + gradient->xlink_href = NULL; 2027 + if (xlink_href != NULL) 2028 + { 2029 + len = strlen (xlink_href); 2030 + gradient->xlink_href = malloc (len + 1); 2031 + strcpy (gradient->xlink_href, xlink_href); 2032 + } 2033 + gradient->gradient_units = units; 2034 + gradient->x1 = x1; 2035 + gradient->y1 = y1; 2036 + gradient->x2 = x2; 2037 + gradient->y2 = y2; 2038 + gradient->prev = gg_svg_doc->last_grad; 2039 + if (gg_svg_doc->first_grad == NULL) 2040 + gg_svg_doc->first_grad = gradient; 2041 + if (gg_svg_doc->last_grad != NULL) 2042 + gg_svg_doc->last_grad->next = gradient; 2043 + gg_svg_doc->last_grad = gradient; 2044 + return gradient; 2045 +} 2046 + 2047 +GGRAPH_PRIVATE struct gg_svg_gradient * 2048 +gg_svg_insert_radial_gradient (struct gg_svg_document *gg_svg_doc, 2049 + const char *id, const char *xlink_href, 2050 + double cx, double cy, double fx, double fy, 2051 + double r, int units) 2052 +{ 2053 +/* inserting a new Linear Gradient into the SVG Document */ 2054 + int len; 2055 + struct gg_svg_gradient *gradient = gg_svg_alloc_gradient (); 2056 + gradient->type = GG_SVG_RADIAL_GRADIENT; 2057 + gradient->id = NULL; 2058 + if (id != NULL) 2059 + { 2060 + len = strlen (id); 2061 + gradient->id = malloc (len + 1); 2062 + strcpy (gradient->id, id); 2063 + } 2064 + gradient->xlink_href = NULL; 2065 + if (xlink_href != NULL) 2066 + { 2067 + len = strlen (xlink_href); 2068 + gradient->xlink_href = malloc (len + 1); 2069 + strcpy (gradient->xlink_href, xlink_href); 2070 + } 2071 + gradient->gradient_units = units; 2072 + gradient->cx = cx; 2073 + gradient->cy = cy; 2074 + gradient->fx = fx; 2075 + gradient->fy = fy; 2076 + gradient->r = r; 2077 + gradient->prev = gg_svg_doc->last_grad; 2078 + if (gg_svg_doc->first_grad == NULL) 2079 + gg_svg_doc->first_grad = gradient; 2080 + if (gg_svg_doc->last_grad != NULL) 2081 + gg_svg_doc->last_grad->next = gradient; 2082 + gg_svg_doc->last_grad = gradient; 2083 + return gradient; 2084 +}
Added src/gaiagraphics_svg_xml.c.
1 +/* 2 +/ gaiagraphics_gg_svg_xml.c 3 +/ 4 +/ SVG - XML parsing methods 5 +/ 6 +/ version 1.0, 2013 February 10 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2013 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdlib.h> 28 +#include <stdio.h> 29 +#include <string.h> 30 +#include <math.h> 31 +#include <float.h> 32 + 33 +#include <libxml/parser.h> 34 + 35 +#include "gaiagraphics.h" 36 +#include "gaiagraphics_internals.h" 37 + 38 +struct gg_svg_dyn_point 39 +{ 40 +/* a temporary struct storing a Point */ 41 + double x; 42 + double y; 43 + struct gg_svg_dyn_point *next; 44 +}; 45 + 46 +struct gg_svg_dyn_points 47 +{ 48 +/* a linked list of temporary Points */ 49 + struct gg_svg_dyn_point *first; 50 + struct gg_svg_dyn_point *last; 51 + int points; 52 +}; 53 + 54 +static void 55 +gg_svg_free_dyn_points (struct gg_svg_dyn_points *dyn) 56 +{ 57 +/* freeing the auxiliary DynPoints */ 58 + struct gg_svg_dyn_point *pn; 59 + struct gg_svg_dyn_point *p = dyn->first; 60 + while (p) 61 + { 62 + pn = p->next; 63 + free (p); 64 + p = pn; 65 + } 66 +} 67 + 68 +static void 69 +gg_svg_add_point (struct gg_svg_dyn_points *dyn, double x, double y) 70 +{ 71 + struct gg_svg_dyn_point *p = malloc (sizeof (struct gg_svg_dyn_point)); 72 + p->x = x; 73 + p->y = y; 74 + p->next = NULL; 75 + if (dyn->first == NULL) 76 + dyn->first = p; 77 + if (dyn->last != NULL) 78 + dyn->last->next = p; 79 + dyn->last = p; 80 + dyn->points += 1; 81 +} 82 + 83 +static void 84 +gg_svg_parse_points (const char *str, int *points, double **p_x, double **p_y) 85 +{ 86 +/* attempting to parse a list of Coordinates */ 87 + char value[1024]; 88 + char *p_out = value; 89 + const char *p_in = str; 90 + double x; 91 + double y; 92 + char xy = 'x'; 93 + struct gg_svg_dyn_points dyn; 94 + 95 + dyn.points = 0; 96 + dyn.first = NULL; 97 + dyn.last = NULL; 98 + 99 + while (1) 100 + { 101 + /* scanning the XML string */ 102 + if (*p_in == '\0') 103 + { 104 + /* string end */ 105 + *p_out = '\0'; 106 + if (*value != '\0') 107 + { 108 + if (xy == 'y') 109 + { 110 + y = atof (value); 111 + gg_svg_add_point (&dyn, x, y); 112 + xy = 'x'; 113 + } 114 + else 115 + x = atof (value); 116 + } 117 + break; 118 + } 119 + if (*p_in == '\n' || *p_in == ' ' || *p_in == '\t' || *p_in == '\r' 120 + || *p_in == ',') 121 + { 122 + /* delimiter */ 123 + *p_out = '\0'; 124 + if (*value != '\0') 125 + { 126 + if (xy == 'y') 127 + { 128 + y = atof (value); 129 + gg_svg_add_point (&dyn, x, y); 130 + xy = 'x'; 131 + } 132 + else 133 + x = atof (value); 134 + } 135 + if (*p_in == ',') 136 + xy = 'y'; 137 + p_out = value; 138 + p_in++; 139 + continue; 140 + } 141 + *p_out++ = *p_in++; 142 + } 143 + 144 + if (dyn.points > 0) 145 + { 146 + /* creating the coord arrays to be returned */ 147 + int iv = 0; 148 + struct gg_svg_dyn_point *p = dyn.first; 149 + double *xx = malloc (sizeof (double) * dyn.points); 150 + double *yy = malloc (sizeof (double) * dyn.points); 151 + while (p) 152 + { 153 + *(xx + iv) = p->x; 154 + *(yy + iv) = p->y; 155 + iv++; 156 + p = p->next; 157 + } 158 + *points = dyn.points; 159 + *p_x = xx; 160 + *p_y = yy; 161 + } 162 + else 163 + { 164 + /* returning an empty list of coords */ 165 + *points = 0; 166 + *p_x = NULL; 167 + *p_y = NULL; 168 + } 169 +/* freeing the DynPoints */ 170 + gg_svg_free_dyn_points (&dyn); 171 +} 172 + 173 +static double 174 +gg_svg_parse_hex_color (char hi, char lo) 175 +{ 176 +/* parsing and hex Color value */ 177 + double color = 0; 178 + switch (hi) 179 + { 180 + case '1': 181 + color = 16; 182 + break; 183 + case '2': 184 + color = 16 * 2; 185 + break; 186 + case '3': 187 + color = 16 * 3; 188 + break; 189 + case '4': 190 + color = 16 * 4; 191 + break; 192 + case '5': 193 + color = 16 * 5; 194 + break; 195 + case '6': 196 + color = 16 * 6; 197 + break; 198 + case '7': 199 + color = 16 * 7; 200 + break; 201 + case '8': 202 + color = 16 * 8; 203 + break; 204 + case '9': 205 + color = 16 * 9; 206 + break; 207 + case 'a': 208 + case 'A': 209 + color = 16 * 10; 210 + break; 211 + case 'b': 212 + case 'B': 213 + color = 16 * 11; 214 + break; 215 + case 'c': 216 + case 'C': 217 + color = 16 * 12; 218 + break; 219 + case 'd': 220 + case 'D': 221 + color = 16 * 13; 222 + break; 223 + case 'e': 224 + case 'E': 225 + color = 16 * 14; 226 + break; 227 + case 'f': 228 + case 'F': 229 + color = 16 * 15; 230 + break; 231 + }; 232 + switch (lo) 233 + { 234 + case '1': 235 + color += 1; 236 + break; 237 + case '2': 238 + color += 2; 239 + break; 240 + case '3': 241 + color += 3; 242 + break; 243 + case '4': 244 + color += 4; 245 + break; 246 + case '5': 247 + color += 5; 248 + break; 249 + case '6': 250 + color += 6; 251 + break; 252 + case '7': 253 + color += 7; 254 + break; 255 + case '8': 256 + color += 8; 257 + break; 258 + case '9': 259 + color += 9; 260 + break; 261 + case 'a': 262 + case 'A': 263 + color += 10; 264 + break; 265 + case 'b': 266 + case 'B': 267 + color += 11; 268 + break; 269 + case 'c': 270 + case 'C': 271 + color += 12; 272 + break; 273 + case 'd': 274 + case 'D': 275 + color += 13; 276 + break; 277 + case 'e': 278 + case 'E': 279 + color += 14; 280 + break; 281 + case 'f': 282 + case 'F': 283 + color += 15; 284 + break; 285 + }; 286 + return color / 255.0; 287 +} 288 + 289 +static void 290 +gg_svg_from_named_color (char *buf, const char *color) 291 +{ 292 +/* translating some CSS name into an hex RGB */ 293 + *buf = '\0'; 294 + if (strcmp (color, "black") == 0) 295 + strcpy (buf, "#000000"); 296 + else if (strcmp (color, "silver") == 0) 297 + strcpy (buf, "#C0C0C0"); 298 + else if (strcmp (color, "gray") == 0) 299 + strcpy (buf, "#808080"); 300 + else if (strcmp (color, "white") == 0) 301 + strcpy (buf, "#FFFFFF"); 302 + else if (strcmp (color, "maroon") == 0) 303 + strcpy (buf, "#800000"); 304 + else if (strcmp (color, "red") == 0) 305 + strcpy (buf, "#FF0000"); 306 + else if (strcmp (color, "purple") == 0) 307 + strcpy (buf, "#800080"); 308 + else if (strcmp (color, "fuchsia") == 0) 309 + strcpy (buf, "#FF00FF"); 310 + else if (strcmp (color, "green") == 0) 311 + strcpy (buf, "#008000"); 312 + else if (strcmp (color, "lime") == 0) 313 + strcpy (buf, "#00FF00"); 314 + else if (strcmp (color, "olive") == 0) 315 + strcpy (buf, "#808000"); 316 + else if (strcmp (color, "yellow") == 0) 317 + strcpy (buf, "#FFFF00"); 318 + else if (strcmp (color, "navy") == 0) 319 + strcpy (buf, "#000080"); 320 + else if (strcmp (color, "blue") == 0) 321 + strcpy (buf, "#0000FF"); 322 + else if (strcmp (color, "teal") == 0) 323 + strcpy (buf, "#008080"); 324 + else if (strcmp (color, "aqua") == 0) 325 + strcpy (buf, "#00FFFF"); 326 +} 327 + 328 +static int 329 +gg_svg_consume_float (const char **ptr, double *value) 330 +{ 331 +/* attempting to parse a Double value from a string */ 332 + char buf[1024]; 333 + char *p_out = buf; 334 + const char *p_in = *ptr; 335 + int count_e = 0; 336 + int count_pt = 0; 337 + if (ptr == NULL) 338 + return 0; 339 + if (*ptr == '\0') 340 + return 0; 341 + 342 + while (1) 343 + { 344 + if (*p_in == '\0') 345 + { 346 + *p_out = '\0'; 347 + *ptr = p_in; 348 + break; 349 + } 350 + if (p_out == buf) 351 + { 352 + if (*p_in == '-' || *p_in == '+') 353 + { 354 + *p_out++ = *p_in++; 355 + continue; 356 + } 357 + if (*p_in == ',' || *p_in == ' ' || *p_in == '\t' 358 + || *p_in == '\r' || *p_in == '\n') 359 + { 360 + p_in++; 361 + continue; 362 + } 363 + } 364 + if (*p_in >= '0' && *p_in <= '9') 365 + { 366 + *p_out++ = *p_in++; 367 + continue; 368 + } 369 + else if (*p_in == 'e' || *p_in == 'E') 370 + { 371 + count_e++; 372 + *p_out++ = *p_in++; 373 + if (*p_in == '-' || *p_in == '+') 374 + *p_out++ = *p_in++; 375 + continue; 376 + } 377 + else if (*p_in == '.') 378 + { 379 + count_pt++; 380 + *p_out++ = *p_in++; 381 + continue; 382 + } 383 + else 384 + { 385 + *p_out = '\0'; 386 + switch (*p_in) 387 + { 388 + /* SVG Path keyword - unput */ 389 + case 'C': 390 + case 'c': 391 + case 'S': 392 + case 's': 393 + case 'Q': 394 + case 'q': 395 + case 'T': 396 + case 't': 397 + case 'M': 398 + case 'm': 399 + case 'L': 400 + case 'l': 401 + case 'H': 402 + case 'h': 403 + case 'V': 404 + case 'v': 405 + case 'A': 406 + case 'a': 407 + case 'Z': 408 + case 'z': 409 + case '+': 410 + case '-': 411 + p_in--; 412 + break; 413 + }; 414 + break; 415 + } 416 + } 417 + if (count_pt > 1 || count_e > 1) 418 + return 0; 419 + if (*buf != '\0') 420 + { 421 + *value = atof (buf); 422 + *ptr = p_in; 423 + return 1; 424 + } 425 + return 0; 426 +} 427 + 428 +static void 429 +gg_svg_parse_path_d (struct gg_svg_path *path, const char *value) 430 +{ 431 +/* parsing an SVG Path <d> */ 432 + char keyword = '\0'; 433 + int count = 0; 434 + const char *p_in = value; 435 + double coord; 436 + double coord_array[7]; 437 + double first_x = DBL_MAX; 438 + double first_y = DBL_MAX; 439 + double last_x = DBL_MAX; 440 + double last_y = DBL_MAX; 441 + double bezier_reflect_x; 442 + double bezier_reflect_y; 443 + double x; 444 + double y; 445 + double x1; 446 + double y1; 447 + double x2; 448 + double y2; 449 + void *data; 450 + int last_m = 0; 451 + 452 + while (1) 453 + { 454 + if (*p_in == '\0') 455 + break; 456 + switch (*p_in) 457 + { 458 + case ' ': 459 + case '\t': 460 + case '\n': 461 + case '\r': 462 + break; 463 + case 'Z': 464 + case 'z': 465 + gg_svg_add_path_item (path, GG_SVG_CLOSE_PATH, NULL); 466 + last_x = first_x; 467 + last_y = first_y; 468 + keyword = '\0'; 469 + break; 470 + case 'C': 471 + case 'c': 472 + case 'S': 473 + case 's': 474 + case 'Q': 475 + case 'q': 476 + case 'T': 477 + case 't': 478 + keyword = *p_in; 479 + break; 480 + case 'M': 481 + case 'm': 482 + case 'L': 483 + case 'l': 484 + case 'H': 485 + case 'h': 486 + case 'V': 487 + case 'v': 488 + case 'A': 489 + case 'a': 490 + bezier_reflect_x = DBL_MAX; 491 + bezier_reflect_y = DBL_MAX; /* invalidating Bezier reflect point */ 492 + keyword = *p_in; 493 + break; 494 + case '0': 495 + case '1': 496 + case '2': 497 + case '3': 498 + case '4': 499 + case '5': 500 + case '6': 501 + case '7': 502 + case '8': 503 + case '9': 504 + case '.': 505 + case '+': 506 + case '-': 507 + if (!gg_svg_consume_float (&p_in, &coord)) 508 + { 509 + path->error = 1; 510 + return; 511 + } 512 + if (count < 7) 513 + coord_array[count] = coord; 514 + count++; 515 + break; 516 + default: 517 + path->error = 1; 518 + break; 519 + }; 520 + if (last_m && keyword == 'M') 521 + keyword = 'L'; 522 + if (last_m && keyword == 'm') 523 + keyword = 'l'; 524 + switch (keyword) 525 + { 526 + case 'M': 527 + if (count == 2) 528 + { 529 + /* SVG Path MoveTo - absolute */ 530 + data = 531 + gg_svg_alloc_path_move (coord_array[0], 532 + coord_array[1]); 533 + gg_svg_add_path_item (path, GG_SVG_MOVE_TO, data); 534 + count = 0; 535 + last_x = coord_array[0]; 536 + last_y = coord_array[1]; 537 + first_x = last_x; 538 + first_y = last_y; 539 + last_m = 1; 540 + } 541 + break; 542 + case 'm': 543 + if (count == 2) 544 + { 545 + /* SVG Path MoveTo - relative */ 546 + if (last_x == DBL_MAX || last_y == DBL_MAX) 547 + { 548 + /* assuming absolute coords */ 549 + x = coord_array[0]; 550 + y = coord_array[1]; 551 + } 552 + else 553 + { 554 + /* transforming relative coords into absolute */ 555 + x = last_x + coord_array[0]; 556 + y = last_y + coord_array[1]; 557 + } 558 + data = gg_svg_alloc_path_move (x, y); 559 + gg_svg_add_path_item (path, GG_SVG_MOVE_TO, data); 560 + count = 0; 561 + last_x = x; 562 + last_y = y; 563 + last_m = 1; 564 + first_x = last_x; 565 + first_y = last_y; 566 + } 567 + break; 568 + case 'L': 569 + if (count == 2) 570 + { 571 + /* SVG Path LineTo - absolute */ 572 + data = 573 + gg_svg_alloc_path_move (coord_array[0], 574 + coord_array[1]); 575 + gg_svg_add_path_item (path, GG_SVG_LINE_TO, data); 576 + count = 0; 577 + last_x = coord_array[0]; 578 + last_y = coord_array[1]; 579 + last_m = 0; 580 + } 581 + break; 582 + case 'l': 583 + if (count == 2) 584 + { 585 + /* SVG Path LineTo - relative */ 586 + if (last_x == DBL_MAX || last_y == DBL_MAX) 587 + { 588 + /* assuming absolute coords */ 589 + x = coord_array[0]; 590 + y = coord_array[1]; 591 + } 592 + else 593 + { 594 + /* transforming relative coords into absolute */ 595 + x = last_x + coord_array[0]; 596 + y = last_y + coord_array[1]; 597 + } 598 + data = gg_svg_alloc_path_move (x, y); 599 + gg_svg_add_path_item (path, GG_SVG_LINE_TO, data); 600 + count = 0; 601 + last_x = x; 602 + last_y = y; 603 + last_m = 0; 604 + } 605 + break; 606 + case 'H': 607 + if (count == 1) 608 + { 609 + /* SVG Path Horizontal LineTo - absolute */ 610 + data = gg_svg_alloc_path_move (coord_array[0], last_y); 611 + gg_svg_add_path_item (path, GG_SVG_LINE_TO, data); 612 + count = 0; 613 + last_x = coord_array[0]; 614 + last_m = 0; 615 + } 616 + break; 617 + case 'h': 618 + if (count == 1) 619 + { 620 + /* SVG Path Horizontal LineTo - relative */ 621 + if (last_x == DBL_MAX) 622 + { 623 + /* assuming absolute coords */ 624 + x = coord_array[0]; 625 + } 626 + else 627 + { 628 + /* transforming relative coords into absolute */ 629 + x = last_x + coord_array[0]; 630 + } 631 + data = gg_svg_alloc_path_move (x, last_y); 632 + gg_svg_add_path_item (path, GG_SVG_LINE_TO, data); 633 + count = 0; 634 + last_x = x; 635 + last_m = 0; 636 + } 637 + break; 638 + case 'V': 639 + if (count == 1) 640 + { 641 + /* SVG Path Vertical LineTo - absolute */ 642 + data = gg_svg_alloc_path_move (last_x, coord_array[0]); 643 + gg_svg_add_path_item (path, GG_SVG_LINE_TO, data); 644 + count = 0; 645 + last_y = coord_array[0]; 646 + last_m = 0; 647 + } 648 + break; 649 + case 'v': 650 + if (count == 1) 651 + { 652 + /* SVG Path Vertical LineTo - relative */ 653 + if (last_y == DBL_MAX) 654 + { 655 + /* assuming absolute coords */ 656 + y = coord_array[0]; 657 + } 658 + else 659 + { 660 + /* transforming relative coords into absolute */ 661 + y = last_y + coord_array[0]; 662 + } 663 + data = gg_svg_alloc_path_move (last_x, y); 664 + gg_svg_add_path_item (path, GG_SVG_LINE_TO, data); 665 + count = 0; 666 + last_y = y; 667 + last_m = 0; 668 + } 669 + break; 670 + case 'C': 671 + if (count == 6) 672 + { 673 + /* SVG Path Cubic Bezier CurveTo - absolute */ 674 + data = 675 + gg_svg_alloc_path_bezier (coord_array[0], 676 + coord_array[1], 677 + coord_array[2], 678 + coord_array[3], 679 + coord_array[4], 680 + coord_array[5]); 681 + gg_svg_add_path_item (path, GG_SVG_CURVE_3, data); 682 + count = 0; 683 + last_x = coord_array[4]; 684 + last_y = coord_array[5]; 685 + /* reflection of the second control point */ 686 + bezier_reflect_x = 687 + coord_array[4] - (coord_array[2] - coord_array[4]); 688 + bezier_reflect_y = 689 + coord_array[5] - (coord_array[3] - coord_array[5]); 690 + last_m = 0; 691 + } 692 + break; 693 + case 'c': 694 + if (count == 6) 695 + { 696 + /* SVG Path Cubic Bezier CurveTo - relative */ 697 + if (last_x == DBL_MAX || last_y == DBL_MAX) 698 + { 699 + /* assuming absolute coords */ 700 + x1 = coord_array[0]; 701 + y1 = coord_array[1]; 702 + x2 = coord_array[2]; 703 + y2 = coord_array[3]; 704 + x = coord_array[4]; 705 + y = coord_array[5]; 706 + } 707 + else 708 + { 709 + /* transforming relative coords into absolute */ 710 + x1 = last_x + coord_array[0]; 711 + y1 = last_y + coord_array[1]; 712 + x2 = last_x + coord_array[2]; 713 + y2 = last_y + coord_array[3]; 714 + x = last_x + coord_array[4]; 715 + y = last_y + coord_array[5]; 716 + } 717 + data = gg_svg_alloc_path_bezier (x1, y1, x2, y2, x, y); 718 + gg_svg_add_path_item (path, GG_SVG_CURVE_3, data); 719 + count = 0; 720 + last_x = x; 721 + last_y = y; 722 + /* reflection of the second control point */ 723 + bezier_reflect_x = x - (x2 - x); 724 + bezier_reflect_y = y - (y2 - y); 725 + last_m = 0; 726 + } 727 + break; 728 + case 'S': 729 + if (count == 4) 730 + { 731 + /* SVG Path Cubic Bezier CurveTo [short] - absolute */ 732 + if (bezier_reflect_x == DBL_MAX 733 + || bezier_reflect_y == DBL_MAX) 734 + { 735 + /* assuming the current point as Bezier reflected point */ 736 + bezier_reflect_x = coord_array[2]; 737 + bezier_reflect_y = coord_array[3]; 738 + } 739 + data = 740 + gg_svg_alloc_path_bezier (bezier_reflect_x, 741 + bezier_reflect_y, 742 + coord_array[0], 743 + coord_array[1], 744 + coord_array[2], 745 + coord_array[3]); 746 + gg_svg_add_path_item (path, GG_SVG_CURVE_3, data); 747 + count = 0; 748 + last_x = coord_array[2]; 749 + last_y = coord_array[3]; 750 + /* reflection of the second control point */ 751 + bezier_reflect_x = 752 + coord_array[2] - (coord_array[0] - coord_array[2]); 753 + bezier_reflect_y = 754 + coord_array[3] - (coord_array[1] - coord_array[3]); 755 + last_m = 0; 756 + } 757 + break; 758 + case 's': 759 + if (count == 4) 760 + { 761 + /* SVG Path Cubic Bezier CurveTo [short] - relative */ 762 + if (last_x == DBL_MAX || last_y == DBL_MAX) 763 + { 764 + /* assuming absolute coords */ 765 + x2 = coord_array[0]; 766 + y2 = coord_array[1]; 767 + x = coord_array[2]; 768 + y = coord_array[3]; 769 + } 770 + else 771 + { 772 + /* transforming relative coords into absolute */ 773 + x2 = last_x + coord_array[0]; 774 + y2 = last_y + coord_array[1]; 775 + x = last_x + coord_array[2]; 776 + y = last_y + coord_array[3]; 777 + } 778 + if (bezier_reflect_x == DBL_MAX 779 + || bezier_reflect_y == DBL_MAX) 780 + { 781 + /* assuming the current point as Bezier reflected point */ 782 + bezier_reflect_x = last_x; 783 + bezier_reflect_y = last_y; 784 + } 785 + data = 786 + gg_svg_alloc_path_bezier (bezier_reflect_x, 787 + bezier_reflect_y, x2, y2, x, 788 + y); 789 + gg_svg_add_path_item (path, GG_SVG_CURVE_3, data); 790 + count = 0; 791 + last_x = x; 792 + last_y = y; 793 + /* reflection of the second control point */ 794 + bezier_reflect_x = x - (x2 - x); 795 + bezier_reflect_y = y - (y2 - y); 796 + last_m = 0; 797 + } 798 + break; 799 + case 'Q': 800 + if (count == 4) 801 + { 802 + /* SVG Path Quadratic Bezier CurveTo - absolute */ 803 + data = 804 + gg_svg_alloc_path_bezier (coord_array[0], 805 + coord_array[1], 806 + coord_array[2], 807 + coord_array[3], 0.0, 0.0); 808 + gg_svg_add_path_item (path, GG_SVG_CURVE_4, data); 809 + count = 0; 810 + last_x = coord_array[2]; 811 + last_y = coord_array[3]; 812 + /* reflection of the control point */ 813 + bezier_reflect_x = 814 + coord_array[2] - (coord_array[0] - coord_array[2]); 815 + bezier_reflect_y = 816 + coord_array[3] - (coord_array[1] - coord_array[3]); 817 + last_m = 0; 818 + } 819 + break; 820 + case 'q': 821 + if (count == 4) 822 + { 823 + /* SVG Path Quadratic Bezier CurveTo - relative */ 824 + if (last_x == DBL_MAX || last_y == DBL_MAX) 825 + { 826 + /* assuming absolute coords */ 827 + x1 = coord_array[0]; 828 + y1 = coord_array[1]; 829 + x = coord_array[2]; 830 + y = coord_array[3]; 831 + } 832 + else 833 + { 834 + /* transforming relative coords into absolute */ 835 + x1 = last_x + coord_array[0]; 836 + y1 = last_y + coord_array[1]; 837 + x = last_x + coord_array[2]; 838 + y = last_y + coord_array[3]; 839 + } 840 + data = gg_svg_alloc_path_bezier (x1, y1, x, y, 0.0, 0.0); 841 + gg_svg_add_path_item (path, GG_SVG_CURVE_4, data); 842 + count = 0; 843 + last_x = x; 844 + last_y = y; 845 + /* reflection of the control point */ 846 + bezier_reflect_x = x - (x1 - x); 847 + bezier_reflect_y = y - (y1 - y); 848 + last_m = 0; 849 + } 850 + break; 851 + case 'T': 852 + if (count == 2) 853 + { 854 + /* SVG Path Quadratic Bezier CurveTo [short] - absolute */ 855 + if (bezier_reflect_x == DBL_MAX 856 + || bezier_reflect_y == DBL_MAX) 857 + { 858 + /* assuming the current point as Bezier reflected point */ 859 + bezier_reflect_x = coord_array[0]; 860 + bezier_reflect_y = coord_array[1]; 861 + } 862 + data = 863 + gg_svg_alloc_path_bezier (bezier_reflect_x, 864 + bezier_reflect_y, 865 + coord_array[0], 866 + coord_array[1], 0.0, 0.0); 867 + gg_svg_add_path_item (path, GG_SVG_CURVE_4, data); 868 + count = 0; 869 + last_x = coord_array[0]; 870 + last_y = coord_array[1]; 871 + /* reflection of the control point */ 872 + bezier_reflect_x = 873 + coord_array[0] - (bezier_reflect_x - coord_array[0]); 874 + bezier_reflect_y = 875 + coord_array[1] - (bezier_reflect_y - coord_array[1]); 876 + last_m = 0; 877 + } 878 + break; 879 + case 't': 880 + if (count == 2) 881 + { 882 + /* SVG Path Quadratic Bezier CurveTo [short] - relative */ 883 + if (last_x == DBL_MAX || last_y == DBL_MAX) 884 + { 885 + /* assuming absolute coords */ 886 + x = coord_array[0]; 887 + y = coord_array[1]; 888 + } 889 + else 890 + { 891 + /* transforming relative coords into absolute */ 892 + x = last_x + coord_array[0]; 893 + y = last_y + coord_array[1]; 894 + } 895 + if (bezier_reflect_x == DBL_MAX 896 + || bezier_reflect_y == DBL_MAX) 897 + { 898 + /* assuming the current point as Bezier reflected point */ 899 + bezier_reflect_x = x; 900 + bezier_reflect_y = y; 901 + } 902 + data = 903 + gg_svg_alloc_path_bezier (bezier_reflect_x, 904 + bezier_reflect_y, x, y, 0.0, 905 + 0.0); 906 + gg_svg_add_path_item (path, GG_SVG_CURVE_4, data); 907 + count = 0; 908 + last_x = x; 909 + last_y = y; 910 + /* reflection of the control point */ 911 + bezier_reflect_x = x - (bezier_reflect_x - x); 912 + bezier_reflect_y = y - (bezier_reflect_y - y); 913 + last_m = 0; 914 + } 915 + break; 916 + case 'A': 917 + if (count == 7) 918 + { 919 + /* SVG Path EllipticalArc - absolute */ 920 + data = 921 + gg_svg_alloc_path_ellipt_arc (coord_array[0], 922 + coord_array[1], 923 + coord_array[2], 924 + coord_array[3], 925 + coord_array[4], 926 + coord_array[5], 927 + coord_array[6]); 928 + gg_svg_add_path_item (path, GG_SVG_ELLIPT_ARC, data); 929 + count = 0; 930 + last_x = coord_array[5]; 931 + last_y = coord_array[6]; 932 + last_m = 0; 933 + } 934 + break; 935 + case 'a': 936 + if (count == 7) 937 + { 938 + /* SVG Path EllipticalArc - relative */ 939 + if (last_x == DBL_MAX || last_y == DBL_MAX) 940 + { 941 + /* assuming absolute coords */ 942 + x = coord_array[5]; 943 + y = coord_array[6]; 944 + } 945 + else 946 + { 947 + /* transforming relative coords into absolute */ 948 + x = last_x + coord_array[5]; 949 + y = last_y + coord_array[6]; 950 + } 951 + if (coord_array[0] == 0.0 || coord_array[1] == 0.0) 952 + { 953 + /* ZERO radius: defaulting to a straight line */ 954 + data = gg_svg_alloc_path_move (x, y); 955 + gg_svg_add_path_item (path, GG_SVG_LINE_TO, data); 956 + } 957 + else 958 + { 959 + data = 960 + gg_svg_alloc_path_ellipt_arc (coord_array[0], 961 + coord_array[1], 962 + coord_array[2], 963 + coord_array[3], 964 + coord_array[4], x, 965 + y); 966 + gg_svg_add_path_item (path, GG_SVG_ELLIPT_ARC, 967 + data); 968 + } 969 + count = 0; 970 + last_x = x; 971 + last_y = y; 972 + last_m = 0; 973 + } 974 + break; 975 + }; 976 + if (path->error) 977 + return; 978 + if (*p_in != '\0') 979 + p_in++; 980 + } 981 +} 982 + 983 +static void 984 +gg_svg_parse_display (struct gg_svg_style *style, const char *value) 985 +{ 986 +/* parsing an SVG Display attribute */ 987 + style->fill = 1; 988 + if (strcmp (value, "none") == 0) 989 + style->visibility = 0; 990 +} 991 + 992 +static void 993 +gg_svg_parse_visibility (struct gg_svg_style *style, const char *value) 994 +{ 995 +/* parsing an SVG Visibility attribute */ 996 + style->fill = 1; 997 + if (strcmp (value, "hidden") == 0) 998 + style->visibility = 0; 999 +} 1000 + 1001 +static int 1002 +gg_svg_parse_fill_gradient_url (struct gg_svg_style *style, const char *color) 1003 +{ 1004 +/* parsing an SVG FillColor attribute (URL) */ 1005 + int len = strlen (color); 1006 + if (strncmp (color, "url(#", 5) == 0 && *(color + len - 1) == ')') 1007 + { 1008 + char buf[1024]; 1009 + strcpy (buf, color + 5); 1010 + len = strlen (buf); 1011 + buf[len - 1] = '\0'; 1012 + gg_svg_add_fill_gradient_url (style, buf); 1013 + style->fill = 1; 1014 + return 1; 1015 + } 1016 + return 0; 1017 +} 1018 + 1019 +static void 1020 +gg_svg_parse_fill_color (struct gg_svg_style *style, const char *color) 1021 +{ 1022 +/* parsing an SVG FillColor attribute */ 1023 + int len = strlen (color); 1024 + char buf[16]; 1025 + const char *p_color = NULL; 1026 + if (strcmp (color, "none") == 0) 1027 + { 1028 + style->no_fill = 1; 1029 + return; 1030 + } 1031 + if (gg_svg_parse_fill_gradient_url (style, color) == 1) 1032 + return; 1033 + style->fill = 1; 1034 + if (*color == '#' && len >= 7) 1035 + p_color = color; 1036 + else if (*color == '#' && len == 4) 1037 + { 1038 + buf[0] = *(color + 0); 1039 + buf[1] = *(color + 1); 1040 + buf[2] = *(color + 1); 1041 + buf[3] = *(color + 2); 1042 + buf[4] = *(color + 2); 1043 + buf[5] = *(color + 3); 1044 + buf[6] = *(color + 3); 1045 + p_color = buf; 1046 + } 1047 + else 1048 + { 1049 + gg_svg_from_named_color (buf, color); 1050 + if (*buf != '\0') 1051 + p_color = buf; 1052 + else 1053 + p_color = NULL; 1054 + } 1055 + if (p_color == NULL) 1056 + p_color = "#000000"; 1057 + style->fill_red = gg_svg_parse_hex_color (*(p_color + 1), *(p_color + 2)); 1058 + style->fill_green = gg_svg_parse_hex_color (*(p_color + 3), *(p_color + 4)); 1059 + style->fill_blue = gg_svg_parse_hex_color (*(p_color + 5), *(p_color + 6)); 1060 +} 1061 + 1062 +static void 1063 +gg_svg_parse_fill_rule (struct gg_svg_style *style, const char *value) 1064 +{ 1065 +/* parsing an SVG FillRule attribute */ 1066 + style->fill = 1; 1067 + if (strcmp (value, "evenodd") == 0) 1068 + style->stroke_linecap = CAIRO_FILL_RULE_EVEN_ODD; 1069 +} 1070 + 1071 +static void 1072 +gg_svg_parse_fill_opacity (struct gg_svg_style *style, const char *value) 1073 +{ 1074 +/* parsing an SVG FillOpacity attribute */ 1075 + style->fill = 1; 1076 + style->fill_opacity = atof (value); 1077 + if (style->fill_opacity <= 0.0 || style->fill_opacity >= 1.0) 1078 + style->fill_opacity = 1.0; 1079 +} 1080 + 1081 +static int 1082 +gg_svg_parse_stroke_gradient_url (struct gg_svg_style *style, const char *color) 1083 +{ 1084 +/* parsing an SVG StrokeColor attribute (URL) */ 1085 + int len = strlen (color); 1086 + if (strncmp (color, "url(#", 5) == 0 && *(color + len - 1) == ')') 1087 + { 1088 + char buf[1024]; 1089 + strcpy (buf, color + 5); 1090 + len = strlen (buf); 1091 + buf[len - 1] = '\0'; 1092 + gg_svg_add_stroke_gradient_url (style, buf); 1093 + return 1; 1094 + } 1095 + return 0; 1096 +} 1097 + 1098 +static void 1099 +gg_svg_parse_stroke_color (struct gg_svg_style *style, const char *color) 1100 +{ 1101 +/* parsing an SVG StrokeColor attribute */ 1102 + int len = strlen (color); 1103 + char buf[16]; 1104 + const char *p_color = NULL; 1105 + style->stroke = 1; 1106 + if (strcmp (color, "none") == 0) 1107 + { 1108 + style->no_stroke = 1; 1109 + return; 1110 + } 1111 + if (gg_svg_parse_stroke_gradient_url (style, color) == 1) 1112 + return; 1113 + if (*color == '#' && len >= 7) 1114 + p_color = color; 1115 + else if (*color == '#' && len == 4) 1116 + { 1117 + buf[0] = *(color + 0); 1118 + buf[1] = *(color + 1); 1119 + buf[2] = *(color + 1); 1120 + buf[3] = *(color + 2); 1121 + buf[4] = *(color + 2); 1122 + buf[5] = *(color + 3); 1123 + buf[6] = *(color + 3); 1124 + p_color = buf; 1125 + } 1126 + else 1127 + { 1128 + gg_svg_from_named_color (buf, color); 1129 + if (*color != '\0') 1130 + p_color = buf; 1131 + } 1132 + if (p_color == NULL) 1133 + p_color = "#000000"; 1134 + style->stroke_red = gg_svg_parse_hex_color (*(p_color + 1), *(p_color + 2)); 1135 + style->stroke_green = 1136 + gg_svg_parse_hex_color (*(p_color + 3), *(p_color + 4)); 1137 + style->stroke_blue = 1138 + gg_svg_parse_hex_color (*(p_color + 5), *(p_color + 6)); 1139 +} 1140 + 1141 +static void 1142 +gg_svg_parse_stop_color (const char *color, double *red, double *green, 1143 + double *blue) 1144 +{ 1145 +/* parsing an SVG StopColor attribute */ 1146 + int len = strlen (color); 1147 + char buf[16]; 1148 + const char *p_color = NULL; 1149 + if (strcmp (color, "none") == 0) 1150 + { 1151 + *red = -1.0; 1152 + *green = -1.0; 1153 + *blue = -1.0; 1154 + return; 1155 + } 1156 + if (*color == '#' && len >= 7) 1157 + p_color = color; 1158 + else if (*color == '#' && len == 4) 1159 + { 1160 + buf[0] = *(color + 0); 1161 + buf[1] = *(color + 1); 1162 + buf[2] = *(color + 1); 1163 + buf[3] = *(color + 2); 1164 + buf[4] = *(color + 2); 1165 + buf[5] = *(color + 3); 1166 + buf[6] = *(color + 3); 1167 + p_color = buf; 1168 + } 1169 + else 1170 + { 1171 + gg_svg_from_named_color (buf, color); 1172 + if (*color != '\0') 1173 + p_color = buf; 1174 + } 1175 + if (p_color == NULL) 1176 + p_color = "#000000"; 1177 + *red = gg_svg_parse_hex_color (*(p_color + 1), *(p_color + 2)); 1178 + *green = gg_svg_parse_hex_color (*(p_color + 3), *(p_color + 4)); 1179 + *blue = gg_svg_parse_hex_color (*(p_color + 5), *(p_color + 6)); 1180 +} 1181 + 1182 +static void 1183 +gg_svg_parse_stroke_width (struct gg_svg_style *style, const char *value) 1184 +{ 1185 +/* parsing an SVG StrokeWidth attribute */ 1186 + style->stroke = 1; 1187 + style->stroke_width = atof (value); 1188 + if (style->stroke_width <= 0.0) 1189 + style->stroke_width = 1.0; 1190 +} 1191 + 1192 +static void 1193 +gg_svg_parse_stroke_linecap (struct gg_svg_style *style, const char *value) 1194 +{ 1195 +/* parsing an SVG StrokeLineCap attribute */ 1196 + style->stroke = 1; 1197 + if (strcmp (value, "round") == 0) 1198 + style->stroke_linecap = CAIRO_LINE_CAP_ROUND; 1199 + if (strcmp (value, "square") == 0) 1200 + style->stroke_linecap = CAIRO_LINE_CAP_SQUARE; 1201 +} 1202 + 1203 +static void 1204 +gg_svg_parse_stroke_linejoin (struct gg_svg_style *style, const char *value) 1205 +{ 1206 +/* parsing an SVG StrokeLineJoin attribute */ 1207 + style->stroke = 1; 1208 + if (strcmp (value, "round") == 0) 1209 + style->stroke_linejoin = CAIRO_LINE_JOIN_ROUND; 1210 + if (strcmp (value, "bevel") == 0) 1211 + style->stroke_linejoin = CAIRO_LINE_JOIN_BEVEL; 1212 +} 1213 + 1214 +static void 1215 +gg_svg_parse_stroke_miterlimit (struct gg_svg_style *style, const char *value) 1216 +{ 1217 +/* parsing an SVG MiterLimit attribute */ 1218 + style->stroke = 1; 1219 + style->stroke_miterlimit = atof (value); 1220 + if (style->stroke_miterlimit <= 0.0) 1221 + style->stroke_miterlimit = 10.0; 1222 +} 1223 + 1224 +static void 1225 +gg_svg_parse_stroke_dashoffset (struct gg_svg_style *style, const char *value) 1226 +{ 1227 +/* parsing an SVG DashOffset attribute */ 1228 + style->stroke = 1; 1229 + style->stroke_dashoffset = atof (value); 1230 +} 1231 + 1232 +static void 1233 +gg_svg_parse_stroke_dasharray (struct gg_svg_style *style, const char *value) 1234 +{ 1235 +/* parsing an SVG DashArray attribute */ 1236 + double dash_list[1024]; 1237 + int items = 0; 1238 + char token[1024]; 1239 + char *p_out = token; 1240 + const char *p_in = value; 1241 + if (style->stroke_dasharray != NULL) 1242 + free (style->stroke_dasharray); 1243 + style->stroke_dasharray = NULL; 1244 + style->stroke_dashitems = 0; 1245 + if (strcmp (value, "none") == 0) 1246 + return; 1247 + fprintf (stderr, "dash=%s\n", value); 1248 + while (1) 1249 + { 1250 + if (*p_in == ' ' || *p_in == ',' || *p_in == '\0') 1251 + { 1252 + *p_out++ = '\0'; 1253 + if (*token != '\0') 1254 + dash_list[items++] = atof (token); 1255 + if (*p_in == '\0') 1256 + break; 1257 + p_out = token; 1258 + p_in++; 1259 + continue; 1260 + } 1261 + *p_out++ = *p_in++; 1262 + } 1263 + if (items > 0) 1264 + { 1265 + int i; 1266 + if (items % 2 == 0) 1267 + { 1268 + /* even number */ 1269 + style->stroke_dashitems = items; 1270 + style->stroke_dasharray = malloc (sizeof (double) * items); 1271 + for (i = 0; i < items; i++) 1272 + style->stroke_dasharray[i] = dash_list[i]; 1273 + } 1274 + else 1275 + { 1276 + /* odd number: doubling */ 1277 + int o = 0; 1278 + style->stroke_dashitems = items * 2; 1279 + style->stroke_dasharray = malloc (sizeof (double) * items * 2); 1280 + for (i = 0; i < items; i++) 1281 + style->stroke_dasharray[o++] = dash_list[i]; 1282 + for (i = 0; i < items; i++) 1283 + style->stroke_dasharray[o++] = dash_list[i]; 1284 + } 1285 + } 1286 + style->stroke = 1; 1287 +} 1288 + 1289 +static void 1290 +gg_svg_parse_opacity (struct gg_svg_style *style, const char *value) 1291 +{ 1292 +/* parsing an SVG Opacity attribute */ 1293 + style->opacity = atof (value); 1294 + if (style->opacity <= 0.0 || style->opacity >= 1.0) 1295 + style->opacity = 1.0; 1296 +} 1297 + 1298 +static void 1299 +gg_svg_parse_stroke_opacity (struct gg_svg_style *style, const char *value) 1300 +{ 1301 +/* parsing an SVG StrokeOpacity attribute */ 1302 + style->stroke = 1; 1303 + style->stroke_opacity = atof (value); 1304 + if (style->stroke_opacity <= 0.0 || style->stroke_opacity >= 1.0) 1305 + style->stroke_opacity = 1.0; 1306 +} 1307 + 1308 +static void 1309 +gg_svg_parse_stop_opacity (const char *value, double *opacity) 1310 +{ 1311 +/* parsing an SVG Stop attribute */ 1312 + *opacity = atof (value); 1313 +} 1314 + 1315 +static void 1316 +gg_svg_split_css_token (struct gg_svg_style *style, char *value) 1317 +{ 1318 +/* parsing an SVG CSS Style definition - single item */ 1319 + char *p = value; 1320 + char *p_value = NULL; 1321 + while (*p != '\0') 1322 + { 1323 + if (*p == ':') 1324 + { 1325 + *p = '\0'; 1326 + p_value = p + 1; 1327 + break; 1328 + } 1329 + p++; 1330 + } 1331 + if (p_value == NULL) 1332 + return; 1333 + if (strcmp (value, "opacity") == 0) 1334 + gg_svg_parse_opacity (style, p_value); 1335 + else if (strcmp (value, "stroke") == 0) 1336 + gg_svg_parse_stroke_color (style, p_value); 1337 + else if (strcmp (value, "stroke-width") == 0) 1338 + gg_svg_parse_stroke_width (style, p_value); 1339 + else if (strcmp (value, "stroke-linecap") == 0) 1340 + gg_svg_parse_stroke_linecap (style, p_value); 1341 + else if (strcmp (value, "stroke-linejoin") == 0) 1342 + gg_svg_parse_stroke_linejoin (style, p_value); 1343 + else if (strcmp (value, "stroke-miterlimit") == 0) 1344 + gg_svg_parse_stroke_miterlimit (style, p_value); 1345 + else if (strcmp (value, "stroke-dasharray") == 0) 1346 + gg_svg_parse_stroke_dasharray (style, p_value); 1347 + else if (strcmp (value, "stroke-dashoffset") == 0) 1348 + gg_svg_parse_stroke_dashoffset (style, p_value); 1349 + else if (strcmp (value, "stroke-opacity") == 0) 1350 + gg_svg_parse_stroke_opacity (style, p_value); 1351 + else if (strcmp (value, "fill") == 0) 1352 + gg_svg_parse_fill_color (style, p_value); 1353 + else if (strcmp (value, "fill-rule") == 0) 1354 + gg_svg_parse_fill_rule (style, p_value); 1355 + else if (strcmp (value, "fill-opacity") == 0) 1356 + gg_svg_parse_fill_opacity (style, p_value); 1357 + else if (strcmp (value, "display") == 0) 1358 + gg_svg_parse_display (style, p_value); 1359 + else if (strcmp (value, "visibility") == 0) 1360 + gg_svg_parse_visibility (style, p_value); 1361 +} 1362 + 1363 +static void 1364 +gg_svg_parse_css (struct gg_svg_style *style, const char *value) 1365 +{ 1366 +/* parsing an SVG CSS Style definition */ 1367 + const char *p_in = value; 1368 + char token[128]; 1369 + char *p_out = token; 1370 + while (1) 1371 + { 1372 + if (*p_in == ' ' || *p_in == '\t' || *p_in == '\r' || *p_in == '\n') 1373 + { 1374 + p_in++; 1375 + continue; 1376 + } 1377 + if (*p_in == '\0') 1378 + { 1379 + *p_out = '\0'; 1380 + gg_svg_split_css_token (style, token); 1381 + break; 1382 + } 1383 + if (*p_in == ';') 1384 + { 1385 + *p_out = '\0'; 1386 + gg_svg_split_css_token (style, token); 1387 + p_out = token; 1388 + p_in++; 1389 + continue; 1390 + } 1391 + *p_out++ = *p_in++; 1392 + } 1393 +} 1394 + 1395 +static void 1396 +gg_svg_split_stop_token (char *value, double *red, double *green, double *blue, 1397 + double *opacity) 1398 +{ 1399 +/* parsing an SVG Stop Style definition - single item */ 1400 + char *p = value; 1401 + char *p_value = NULL; 1402 + while (*p != '\0') 1403 + { 1404 + if (*p == ':') 1405 + { 1406 + *p = '\0'; 1407 + p_value = p + 1; 1408 + break; 1409 + } 1410 + p++; 1411 + } 1412 + if (p_value == NULL) 1413 + return; 1414 + if (strcmp (value, "stop-color") == 0) 1415 + gg_svg_parse_stop_color (p_value, red, green, blue); 1416 + else if (strcmp (value, "stop-opacity") == 0) 1417 + gg_svg_parse_stop_opacity (p_value, opacity); 1418 +} 1419 + 1420 +static void 1421 +gg_svg_parse_stop_style (const char *value, double *red, double *green, 1422 + double *blue, double *opacity) 1423 +{ 1424 +/* parsing an SVG Stop-Style */ 1425 + const char *p_in = value; 1426 + char token[128]; 1427 + char *p_out = token; 1428 + while (1) 1429 + { 1430 + if (*p_in == ' ' || *p_in == '\t' || *p_in == '\r' || *p_in == '\n') 1431 + { 1432 + p_in++; 1433 + continue; 1434 + } 1435 + if (*p_in == '\0') 1436 + { 1437 + *p_out = '\0'; 1438 + gg_svg_split_stop_token (token, red, green, blue, opacity); 1439 + break; 1440 + } 1441 + if (*p_in == ';') 1442 + { 1443 + *p_out = '\0'; 1444 + gg_svg_split_stop_token (token, red, green, blue, opacity); 1445 + p_out = token; 1446 + p_in++; 1447 + continue; 1448 + } 1449 + *p_out++ = *p_in++; 1450 + } 1451 +} 1452 + 1453 +static void 1454 +gg_svg_parse_style (struct gg_svg_group *group, struct gg_svg_shape *shape, 1455 + struct gg_svg_use *use, struct _xmlAttr *attr) 1456 +{ 1457 +/* parsing SVG Style-related definitions */ 1458 + struct gg_svg_style *style = NULL; 1459 + if (group != NULL) 1460 + style = &(group->style); 1461 + else if (use != NULL) 1462 + style = &(use->style); 1463 + else 1464 + style = &(shape->style); 1465 + 1466 + while (attr) 1467 + { 1468 + if (attr->type == XML_ATTRIBUTE_NODE) 1469 + { 1470 + const char *value = NULL; 1471 + const char *name; 1472 + xmlNodePtr child = attr->children; 1473 + name = (const char *) (attr->name); 1474 + if (child) 1475 + value = (const char *) (child->content); 1476 + if (child && value) 1477 + { 1478 + if (strcmp (name, "style") == 0) 1479 + gg_svg_parse_css (style, value); 1480 + else if (strcmp (name, "stroke") == 0) 1481 + gg_svg_parse_stroke_color (style, value); 1482 + else if (strcmp (name, "stroke-width") == 0) 1483 + gg_svg_parse_stroke_width (style, value); 1484 + else if (strcmp (name, "stroke-linecap") == 0) 1485 + gg_svg_parse_stroke_linecap (style, value); 1486 + else if (strcmp (name, "stroke-linejoin") == 0) 1487 + gg_svg_parse_stroke_linejoin (style, value); 1488 + else if (strcmp (name, "stroke-miterlimit") == 0) 1489 + gg_svg_parse_stroke_miterlimit (style, value); 1490 + else if (strcmp (name, "stroke-dasharray") == 0) 1491 + gg_svg_parse_stroke_dasharray (style, value); 1492 + else if (strcmp (name, "stroke-dashoffset") == 0) 1493 + gg_svg_parse_stroke_dashoffset (style, value); 1494 + else if (strcmp (name, "stroke-opacity") == 0) 1495 + gg_svg_parse_stroke_opacity (style, value); 1496 + else if (strcmp (name, "fill") == 0) 1497 + gg_svg_parse_fill_color (style, value); 1498 + else if (strcmp (name, "fill-rule") == 0) 1499 + gg_svg_parse_fill_rule (style, value); 1500 + else if (strcmp (name, "fill-opacity") == 0) 1501 + gg_svg_parse_fill_opacity (style, value); 1502 + else if (strcmp (name, "display") == 0) 1503 + gg_svg_parse_display (style, value); 1504 + else if (strcmp (name, "visibility") == 0) 1505 + gg_svg_parse_visibility (style, value); 1506 + } 1507 + } 1508 + attr = attr->next; 1509 + } 1510 +} 1511 + 1512 +static void 1513 +gg_svg_parse_id (struct gg_svg_group *group, struct gg_svg_clip *clip, 1514 + struct gg_svg_shape *shape, struct _xmlAttr *attr) 1515 +{ 1516 +/* parsing SVG an eventual ID definitions */ 1517 + while (attr) 1518 + { 1519 + if (attr->type == XML_ATTRIBUTE_NODE) 1520 + { 1521 + const char *value = NULL; 1522 + const char *name; 1523 + xmlNodePtr child = attr->children; 1524 + name = (const char *) (attr->name); 1525 + if (child) 1526 + value = (const char *) (child->content); 1527 + if (child && value) 1528 + { 1529 + if (strcmp (name, "id") == 0) 1530 + { 1531 + if (group != NULL) 1532 + gg_svg_add_group_id (group, value); 1533 + if (clip != NULL) 1534 + gg_svg_add_clip_id (clip, value); 1535 + if (shape != NULL) 1536 + gg_svg_add_shape_id (shape, value); 1537 + } 1538 + } 1539 + } 1540 + attr = attr->next; 1541 + } 1542 +} 1543 + 1544 +static void 1545 +gg_svg_consume_whitespace (const char **ptr) 1546 +{ 1547 +/* consuming whitespaces and commas */ 1548 + const char *p = *ptr; 1549 + while (1) 1550 + { 1551 + if (*p == ' ' || *p == ',' || *p == '\t' || *p == '\r' || *p == '\n') 1552 + { 1553 + p++; 1554 + continue; 1555 + } 1556 + break; 1557 + } 1558 + *ptr = p; 1559 +} 1560 + 1561 +static int 1562 +gg_svg_find_transform_mode (const char **ptr) 1563 +{ 1564 + const char *p = *ptr; 1565 + if (strncmp (p, "matrix", 6) == 0) 1566 + { 1567 + *ptr += 6; 1568 + return GG_SVG_MATRIX; 1569 + } 1570 + if (strncmp (p, "translate", 9) == 0) 1571 + { 1572 + *ptr += 9; 1573 + return GG_SVG_TRANSLATE; 1574 + } 1575 + if (strncmp (p, "scale", 5) == 0) 1576 + { 1577 + *ptr += 5; 1578 + return GG_SVG_SCALE; 1579 + } 1580 + if (strncmp (p, "rotate", 6) == 0) 1581 + { 1582 + *ptr += 6; 1583 + return GG_SVG_ROTATE; 1584 + } 1585 + if (strncmp (p, "skewX", 5) == 0) 1586 + { 1587 + *ptr += 5; 1588 + return GG_SVG_SKEW_X; 1589 + } 1590 + if (strncmp (p, "skewY", 5) == 0) 1591 + { 1592 + *ptr += 5; 1593 + return GG_SVG_SKEW_Y; 1594 + } 1595 + return GG_SVG_UNKNOWN; 1596 +} 1597 + 1598 +static void * 1599 +gg_svg_parse_matrix (const char **ptr) 1600 +{ 1601 +/* parsing an SVG Matrix definition */ 1602 + const char *p = *ptr; 1603 + double a; 1604 + double b; 1605 + double c; 1606 + double d; 1607 + double e; 1608 + double f; 1609 + int err = 0; 1610 + if (!gg_svg_consume_float (&p, &a)) 1611 + err = 1; 1612 + gg_svg_consume_whitespace (&p); 1613 + if (!gg_svg_consume_float (&p, &b)) 1614 + err = 1; 1615 + gg_svg_consume_whitespace (&p); 1616 + if (!gg_svg_consume_float (&p, &c)) 1617 + err = 1; 1618 + gg_svg_consume_whitespace (&p); 1619 + if (!gg_svg_consume_float (&p, &d)) 1620 + err = 1; 1621 + gg_svg_consume_whitespace (&p); 1622 + if (!gg_svg_consume_float (&p, &e)) 1623 + err = 1; 1624 + gg_svg_consume_whitespace (&p); 1625 + if (!gg_svg_consume_float (&p, &f)) 1626 + err = 1; 1627 + gg_svg_consume_whitespace (&p); 1628 + if (*p == ')') 1629 + p++; 1630 + else 1631 + err = 1; 1632 + if (!err) 1633 + { 1634 + *ptr = p; 1635 + return gg_svg_alloc_matrix (a, b, c, d, e, f); 1636 + } 1637 + return NULL; 1638 +} 1639 + 1640 +static void * 1641 +gg_svg_parse_translate (const char **ptr) 1642 +{ 1643 +/* parsing an SVG Translate definition */ 1644 + const char *p = *ptr; 1645 + double tx; 1646 + double ty; 1647 + int err = 0; 1648 + if (!gg_svg_consume_float (&p, &tx)) 1649 + err = 1; 1650 + gg_svg_consume_whitespace (&p); 1651 + if (!gg_svg_consume_float (&p, &ty)) 1652 + ty = 0.0; 1653 + gg_svg_consume_whitespace (&p); 1654 + if (*p == ')') 1655 + p++; 1656 + else 1657 + err = 1; 1658 + if (!err) 1659 + { 1660 + *ptr = p; 1661 + return gg_svg_alloc_translate (tx, ty); 1662 + } 1663 + return NULL; 1664 +} 1665 + 1666 +static void * 1667 +gg_svg_parse_scale (const char **ptr) 1668 +{ 1669 +/* parsing an SVG Scale definition */ 1670 + const char *p = *ptr; 1671 + double sx; 1672 + double sy; 1673 + int err = 0; 1674 + if (!gg_svg_consume_float (&p, &sx)) 1675 + err = 1; 1676 + gg_svg_consume_whitespace (&p); 1677 + if (!gg_svg_consume_float (&p, &sy)) 1678 + sy = 0.0; 1679 + gg_svg_consume_whitespace (&p); 1680 + if (*p == ')') 1681 + p++; 1682 + else 1683 + err = 1; 1684 + if (!err) 1685 + { 1686 + *ptr = p; 1687 + if (sy == 0.0) 1688 + sy = sx; 1689 + return gg_svg_alloc_scale (sx, sy); 1690 + } 1691 + return NULL; 1692 +} 1693 + 1694 +static void * 1695 +gg_svg_parse_rotate (const char **ptr) 1696 +{ 1697 +/* parsing an SVG Rotate definition */ 1698 + const char *p = *ptr; 1699 + double angle; 1700 + double cx; 1701 + double cy; 1702 + int err = 0; 1703 + if (!gg_svg_consume_float (&p, &angle)) 1704 + err = 1; 1705 + gg_svg_consume_whitespace (&p); 1706 + if (!gg_svg_consume_float (&p, &cx)) 1707 + cx = 0.0; 1708 + gg_svg_consume_whitespace (&p); 1709 + if (!gg_svg_consume_float (&p, &cy)) 1710 + cy = 0.0; 1711 + gg_svg_consume_whitespace (&p); 1712 + if (*p == ')') 1713 + p++; 1714 + else 1715 + err = 1; 1716 + if (!err) 1717 + { 1718 + *ptr = p; 1719 + return gg_svg_alloc_rotate (angle, cx, cy); 1720 + } 1721 + return NULL; 1722 +} 1723 + 1724 +static void * 1725 +gg_svg_parse_skew (const char **ptr) 1726 +{ 1727 +/* parsing an SVG Skew definition */ 1728 + const char *p = *ptr; 1729 + double skew = 0.0; 1730 + int err = 0; 1731 + if (!gg_svg_consume_float (&p, &skew)) 1732 + err = 1; 1733 + if (!err) 1734 + { 1735 + *ptr = p; 1736 + return gg_svg_alloc_skew (skew); 1737 + } 1738 + return NULL; 1739 +} 1740 + 1741 +static void 1742 +gg_svg_parse_transform_str (struct gg_svg_group *group, 1743 + struct gg_svg_shape *shape, struct gg_svg_use *use, 1744 + struct gg_svg_gradient *gradient, const char *str) 1745 +{ 1746 +/* parsing an SVG Transform string */ 1747 + struct gg_svg_transform *trans; 1748 + const char *p_in = str; 1749 + int type; 1750 + void *data; 1751 + 1752 + while (1) 1753 + { 1754 + gg_svg_consume_whitespace (&p_in); 1755 + if (*p_in == '\0') 1756 + break; 1757 + type = gg_svg_find_transform_mode (&p_in); 1758 + if (type == GG_SVG_UNKNOWN) 1759 + break; 1760 + gg_svg_consume_whitespace (&p_in); 1761 + if (*p_in == '\0') 1762 + break; 1763 + if (*p_in != '(') 1764 + break; 1765 + p_in++; 1766 + switch (type) 1767 + { 1768 + case GG_SVG_MATRIX: 1769 + data = gg_svg_parse_matrix (&p_in); 1770 + break; 1771 + case GG_SVG_TRANSLATE: 1772 + data = gg_svg_parse_translate (&p_in); 1773 + break; 1774 + case GG_SVG_SCALE: 1775 + data = gg_svg_parse_scale (&p_in); 1776 + break; 1777 + case GG_SVG_ROTATE: 1778 + data = gg_svg_parse_rotate (&p_in); 1779 + break; 1780 + case GG_SVG_SKEW_X: 1781 + case GG_SVG_SKEW_Y: 1782 + data = gg_svg_parse_skew (&p_in); 1783 + break; 1784 + default: 1785 + data = NULL; 1786 + break; 1787 + }; 1788 + if (data == NULL) 1789 + { 1790 + fprintf (stderr, "Invalid <transform=\"%s\">\n", str); 1791 + return; 1792 + } 1793 + trans = gg_svg_alloc_transform (type, data); 1794 + if (group != NULL) 1795 + { 1796 + if (group->first_trans == NULL) 1797 + group->first_trans = trans; 1798 + if (group->last_trans != NULL) 1799 + group->last_trans->next = trans; 1800 + group->last_trans = trans; 1801 + } 1802 + else if (shape != NULL) 1803 + { 1804 + if (shape->first_trans == NULL) 1805 + shape->first_trans = trans; 1806 + if (shape->last_trans != NULL) 1807 + shape->last_trans->next = trans; 1808 + shape->last_trans = trans; 1809 + } 1810 + else if (use != NULL) 1811 + { 1812 + if (use->first_trans == NULL) 1813 + use->first_trans = trans; 1814 + if (use->last_trans != NULL) 1815 + use->last_trans->next = trans; 1816 + use->last_trans = trans; 1817 + } 1818 + else if (gradient != NULL) 1819 + { 1820 + if (gradient->first_trans == NULL) 1821 + gradient->first_trans = trans; 1822 + if (gradient->last_trans != NULL) 1823 + gradient->last_trans->next = trans; 1824 + gradient->last_trans = trans; 1825 + } 1826 + } 1827 +} 1828 + 1829 +static void 1830 +gg_svg_parse_transform (struct gg_svg_group *group, struct gg_svg_shape *shape, 1831 + struct gg_svg_use *use, 1832 + struct gg_svg_gradient *gradient, struct _xmlAttr *attr) 1833 +{ 1834 +/* parsing SVG Transform-related definitions */ 1835 + while (attr) 1836 + { 1837 + if (attr->type == XML_ATTRIBUTE_NODE) 1838 + { 1839 + const char *value = NULL; 1840 + const char *name; 1841 + xmlNodePtr child = attr->children; 1842 + name = (const char *) (attr->name); 1843 + if (child) 1844 + value = (const char *) (child->content); 1845 + if (child && value) 1846 + { 1847 + if (gradient == NULL) 1848 + { 1849 + if (strcmp (name, "transform") == 0) 1850 + gg_svg_parse_transform_str (group, shape, use, 1851 + NULL, value); 1852 + } 1853 + else 1854 + { 1855 + if (strcmp (name, "gradientTransform") == 0) 1856 + gg_svg_parse_transform_str (NULL, NULL, NULL, 1857 + gradient, value); 1858 + } 1859 + } 1860 + } 1861 + attr = attr->next; 1862 + } 1863 +} 1864 + 1865 +static void 1866 +gg_svg_parse_clip_url (struct gg_svg_style *style, const char *value) 1867 +{ 1868 +/* parsing an SVG clip-path attribute (URL) */ 1869 + int len = strlen (value); 1870 + if (strncmp (value, "url(#", 5) == 0 && *(value + len - 1) == ')') 1871 + { 1872 + char buf[1024]; 1873 + strcpy (buf, value + 5); 1874 + len = strlen (buf); 1875 + buf[len - 1] = '\0'; 1876 + gg_svg_add_clip_url (style, buf); 1877 + } 1878 +} 1879 + 1880 +static void 1881 +gg_svg_parse_clip_path (struct gg_svg_group *group, struct gg_svg_shape *shape, 1882 + struct gg_svg_use *use, struct _xmlAttr *attr) 1883 +{ 1884 +/* parsing SVG clip-path definitions */ 1885 + while (attr) 1886 + { 1887 + if (attr->type == XML_ATTRIBUTE_NODE) 1888 + { 1889 + const char *value = NULL; 1890 + const char *name; 1891 + xmlNodePtr child = attr->children; 1892 + name = (const char *) (attr->name); 1893 + if (child) 1894 + value = (const char *) (child->content); 1895 + if (child && value) 1896 + { 1897 + if (strcmp (name, "clip-path") == 0) 1898 + { 1899 + if (group != NULL) 1900 + gg_svg_parse_clip_url (&(group->style), value); 1901 + if (shape != NULL) 1902 + gg_svg_parse_clip_url (&(shape->style), value); 1903 + if (use != NULL) 1904 + gg_svg_parse_clip_url (&(use->style), value); 1905 + } 1906 + } 1907 + } 1908 + attr = attr->next; 1909 + } 1910 +} 1911 + 1912 +static void 1913 +gg_svg_parse_rect (struct gg_svg_document *gg_svg_doc, xmlNodePtr node) 1914 +{ 1915 +/* creating and initializing an SVG Rect struct */ 1916 + struct gg_svg_rect *rect; 1917 + struct _xmlAttr *attr; 1918 + double x = 0.0; 1919 + double y = 0.0; 1920 + double width = 0.0; 1921 + double height = 0.0; 1922 + double rx = -1.0; 1923 + double ry = -1.0; 1924 + 1925 + attr = node->properties; 1926 + while (attr) 1927 + { 1928 + if (attr->type == XML_ATTRIBUTE_NODE) 1929 + { 1930 + const char *value = NULL; 1931 + const char *name; 1932 + xmlNodePtr child = attr->children; 1933 + name = (const char *) (attr->name); 1934 + if (child) 1935 + value = (const char *) (child->content); 1936 + if (child && value) 1937 + { 1938 + if (strcmp (name, "x") == 0) 1939 + x = atof (value); 1940 + if (strcmp (name, "y") == 0) 1941 + y = atof (value); 1942 + if (strcmp (name, "width") == 0) 1943 + width = atof (value); 1944 + if (strcmp (name, "height") == 0) 1945 + height = atof (value); 1946 + if (strcmp (name, "rx") == 0) 1947 + rx = atof (value); 1948 + if (strcmp (name, "ry") == 0) 1949 + ry = atof (value); 1950 + } 1951 + } 1952 + attr = attr->next; 1953 + } 1954 + if (rx > 0.0 && ry <= 0.0) 1955 + ry = rx; 1956 + if (ry > 0.0 && rx <= 0.0) 1957 + rx = ry; 1958 + rect = gg_svg_alloc_rect (x, y, width, height, rx, ry); 1959 + gg_svg_insert_shape (gg_svg_doc, GG_SVG_RECT, rect); 1960 + gg_svg_parse_id (NULL, NULL, gg_svg_doc->current_shape, node->properties); 1961 + gg_svg_parse_style (NULL, gg_svg_doc->current_shape, NULL, 1962 + node->properties); 1963 + gg_svg_parse_transform (NULL, gg_svg_doc->current_shape, NULL, NULL, 1964 + node->properties); 1965 + gg_svg_parse_clip_path (NULL, gg_svg_doc->current_shape, NULL, 1966 + node->properties); 1967 +} 1968 + 1969 +static void 1970 +gg_svg_parse_circle (struct gg_svg_document *gg_svg_doc, xmlNodePtr node) 1971 +{ 1972 +/* creating and initializing an SVG Circle struct */ 1973 + struct gg_svg_circle *circle; 1974 + struct _xmlAttr *attr; 1975 + double cx = 0.0; 1976 + double cy = 0.0; 1977 + double r = 0.0; 1978 + 1979 + attr = node->properties; 1980 + while (attr) 1981 + { 1982 + if (attr->type == XML_ATTRIBUTE_NODE) 1983 + { 1984 + const char *value = NULL; 1985 + const char *name; 1986 + xmlNodePtr child = attr->children; 1987 + name = (const char *) (attr->name); 1988 + if (child) 1989 + value = (const char *) (child->content); 1990 + if (child && value) 1991 + { 1992 + if (strcmp (name, "cx") == 0) 1993 + cx = atof (value); 1994 + if (strcmp (name, "cy") == 0) 1995 + cy = atof (value); 1996 + if (strcmp (name, "r") == 0) 1997 + r = atof (value); 1998 + } 1999 + } 2000 + attr = attr->next; 2001 + } 2002 + circle = gg_svg_alloc_circle (cx, cy, r); 2003 + gg_svg_insert_shape (gg_svg_doc, GG_SVG_CIRCLE, circle); 2004 + gg_svg_parse_id (NULL, NULL, gg_svg_doc->current_shape, node->properties); 2005 + gg_svg_parse_style (NULL, gg_svg_doc->current_shape, NULL, 2006 + node->properties); 2007 + gg_svg_parse_transform (NULL, gg_svg_doc->current_shape, NULL, NULL, 2008 + node->properties); 2009 + gg_svg_parse_clip_path (NULL, gg_svg_doc->current_shape, NULL, 2010 + node->properties); 2011 +} 2012 + 2013 +static void 2014 +gg_svg_parse_ellipse (struct gg_svg_document *gg_svg_doc, xmlNodePtr node) 2015 +{ 2016 +/* creating and initializing an SVG Ellipse struct */ 2017 + struct gg_svg_ellipse *ellipse; 2018 + struct _xmlAttr *attr; 2019 + double cx = 0.0; 2020 + double cy = 0.0; 2021 + double rx = 0.0; 2022 + double ry = 0.0; 2023 + 2024 + attr = node->properties; 2025 + while (attr) 2026 + { 2027 + if (attr->type == XML_ATTRIBUTE_NODE) 2028 + { 2029 + const char *value = NULL; 2030 + const char *name; 2031 + xmlNodePtr child = attr->children; 2032 + name = (const char *) (attr->name); 2033 + if (child) 2034 + value = (const char *) (child->content); 2035 + if (child && value) 2036 + { 2037 + if (strcmp (name, "cx") == 0) 2038 + cx = atof (value); 2039 + if (strcmp (name, "cy") == 0) 2040 + cy = atof (value); 2041 + if (strcmp (name, "rx") == 0) 2042 + rx = atof (value); 2043 + if (strcmp (name, "ry") == 0) 2044 + ry = atof (value); 2045 + } 2046 + } 2047 + attr = attr->next; 2048 + } 2049 + ellipse = gg_svg_alloc_ellipse (cx, cy, rx, ry); 2050 + gg_svg_insert_shape (gg_svg_doc, GG_SVG_ELLIPSE, ellipse); 2051 + gg_svg_parse_id (NULL, NULL, gg_svg_doc->current_shape, node->properties); 2052 + gg_svg_parse_style (NULL, gg_svg_doc->current_shape, NULL, 2053 + node->properties); 2054 + gg_svg_parse_transform (NULL, gg_svg_doc->current_shape, NULL, NULL, 2055 + node->properties); 2056 + gg_svg_parse_clip_path (NULL, gg_svg_doc->current_shape, NULL, 2057 + node->properties); 2058 +} 2059 + 2060 +static void 2061 +gg_svg_parse_line (struct gg_svg_document *gg_svg_doc, xmlNodePtr node) 2062 +{ 2063 +/* creating and initializing an SVG Line struct */ 2064 + struct gg_svg_line *line; 2065 + struct _xmlAttr *attr; 2066 + double x1 = 0.0; 2067 + double y1 = 0.0; 2068 + double x2 = 0.0; 2069 + double y2 = 0.0; 2070 + 2071 + attr = node->properties; 2072 + while (attr) 2073 + { 2074 + if (attr->type == XML_ATTRIBUTE_NODE) 2075 + { 2076 + const char *value = NULL; 2077 + const char *name; 2078 + xmlNodePtr child = attr->children; 2079 + name = (const char *) (attr->name); 2080 + if (child) 2081 + value = (const char *) (child->content); 2082 + if (child && value) 2083 + { 2084 + if (strcmp (name, "x1") == 0) 2085 + x1 = atof (value); 2086 + if (strcmp (name, "y1") == 0) 2087 + y1 = atof (value); 2088 + if (strcmp (name, "x2") == 0) 2089 + x2 = atof (value); 2090 + if (strcmp (name, "y2") == 0) 2091 + y2 = atof (value); 2092 + } 2093 + } 2094 + attr = attr->next; 2095 + } 2096 + line = gg_svg_alloc_line (x1, y1, x2, y2); 2097 + gg_svg_insert_shape (gg_svg_doc, GG_SVG_LINE, line); 2098 + gg_svg_parse_id (NULL, NULL, gg_svg_doc->current_shape, node->properties); 2099 + gg_svg_parse_style (NULL, gg_svg_doc->current_shape, NULL, 2100 + node->properties); 2101 + gg_svg_parse_transform (NULL, gg_svg_doc->current_shape, NULL, NULL, 2102 + node->properties); 2103 + gg_svg_parse_clip_path (NULL, gg_svg_doc->current_shape, NULL, 2104 + node->properties); 2105 +} 2106 + 2107 +static void 2108 +gg_svg_parse_polyline (struct gg_svg_document *gg_svg_doc, xmlNodePtr node) 2109 +{ 2110 +/* creating and initializing an SVG Polyline struct */ 2111 + struct gg_svg_polyline *poly; 2112 + struct _xmlAttr *attr; 2113 + int points = 0; 2114 + double *x = NULL; 2115 + double *y = NULL; 2116 + 2117 + attr = node->properties; 2118 + while (attr) 2119 + { 2120 + if (attr->type == XML_ATTRIBUTE_NODE) 2121 + { 2122 + const char *value = NULL; 2123 + const char *name; 2124 + xmlNodePtr child = attr->children; 2125 + name = (const char *) (attr->name); 2126 + if (child) 2127 + value = (const char *) (child->content); 2128 + if (child && value) 2129 + { 2130 + if (strcmp (name, "points") == 0) 2131 + gg_svg_parse_points (value, &points, &x, &y); 2132 + } 2133 + } 2134 + attr = attr->next; 2135 + } 2136 + poly = gg_svg_alloc_polyline (points, x, y); 2137 + gg_svg_insert_shape (gg_svg_doc, GG_SVG_POLYLINE, poly); 2138 + gg_svg_parse_id (NULL, NULL, gg_svg_doc->current_shape, node->properties); 2139 + gg_svg_parse_style (NULL, gg_svg_doc->current_shape, NULL, 2140 + node->properties); 2141 + gg_svg_parse_transform (NULL, gg_svg_doc->current_shape, NULL, NULL, 2142 + node->properties); 2143 + gg_svg_parse_clip_path (NULL, gg_svg_doc->current_shape, NULL, 2144 + node->properties); 2145 +} 2146 + 2147 +static void 2148 +gg_svg_parse_polygon (struct gg_svg_document *gg_svg_doc, xmlNodePtr node) 2149 +{ 2150 +/* creating and initializing an SVG Polygon struct */ 2151 + struct gg_svg_polygon *poly; 2152 + struct _xmlAttr *attr; 2153 + int points = 0; 2154 + double *x = NULL; 2155 + double *y = NULL; 2156 + 2157 + attr = node->properties; 2158 + while (attr) 2159 + { 2160 + if (attr->type == XML_ATTRIBUTE_NODE) 2161 + { 2162 + const char *value = NULL; 2163 + const char *name; 2164 + xmlNodePtr child = attr->children; 2165 + name = (const char *) (attr->name); 2166 + if (child) 2167 + value = (const char *) (child->content); 2168 + if (child && value) 2169 + { 2170 + if (strcmp (name, "points") == 0) 2171 + gg_svg_parse_points (value, &points, &x, &y); 2172 + } 2173 + } 2174 + attr = attr->next; 2175 + } 2176 + poly = gg_svg_alloc_polygon (points, x, y); 2177 + gg_svg_insert_shape (gg_svg_doc, GG_SVG_POLYGON, poly); 2178 + gg_svg_parse_id (NULL, NULL, gg_svg_doc->current_shape, node->properties); 2179 + gg_svg_parse_style (NULL, gg_svg_doc->current_shape, NULL, 2180 + node->properties); 2181 + gg_svg_parse_transform (NULL, gg_svg_doc->current_shape, NULL, NULL, 2182 + node->properties); 2183 + gg_svg_parse_clip_path (NULL, gg_svg_doc->current_shape, NULL, 2184 + node->properties); 2185 +} 2186 + 2187 +static void 2188 +gg_svg_parse_path (struct gg_svg_document *gg_svg_doc, xmlNodePtr node) 2189 +{ 2190 +/* creating and initializing an SVG Path struct */ 2191 + struct gg_svg_path *path = gg_svg_alloc_path (); 2192 + struct _xmlAttr *attr; 2193 + 2194 + attr = node->properties; 2195 + while (attr) 2196 + { 2197 + if (attr->type == XML_ATTRIBUTE_NODE) 2198 + { 2199 + const char *value = NULL; 2200 + const char *name; 2201 + xmlNodePtr child = attr->children; 2202 + name = (const char *) (attr->name); 2203 + if (child) 2204 + value = (const char *) (child->content); 2205 + if (child && value) 2206 + { 2207 + if (strcmp (name, "d") == 0) 2208 + { 2209 + gg_svg_parse_path_d (path, value); 2210 + if (path->first == NULL || path->error) 2211 + { 2212 + /* invalid path */ 2213 + fprintf (stderr, "Invalid path d=\"%s\"\n", 2214 + value); 2215 + gg_svg_free_path (path); 2216 + return; 2217 + } 2218 + } 2219 + } 2220 + } 2221 + attr = attr->next; 2222 + } 2223 + gg_svg_insert_shape (gg_svg_doc, GG_SVG_PATH, path); 2224 + gg_svg_parse_id (NULL, NULL, gg_svg_doc->current_shape, node->properties); 2225 + gg_svg_parse_style (NULL, gg_svg_doc->current_shape, NULL, 2226 + node->properties); 2227 + gg_svg_parse_transform (NULL, gg_svg_doc->current_shape, NULL, NULL, 2228 + node->properties); 2229 + gg_svg_parse_clip_path (NULL, gg_svg_doc->current_shape, NULL, 2230 + node->properties); 2231 +} 2232 + 2233 +static void 2234 +gg_svg_parse_group (struct gg_svg_document *gg_svg_doc, xmlNodePtr node) 2235 +{ 2236 +/* creating and initializing an SVG Group struct */ 2237 + gg_svg_insert_group (gg_svg_doc); 2238 + gg_svg_parse_id (gg_svg_doc->current_group, NULL, NULL, node->properties); 2239 + gg_svg_parse_style (gg_svg_doc->current_group, NULL, NULL, 2240 + node->properties); 2241 + gg_svg_parse_transform (gg_svg_doc->current_group, NULL, NULL, NULL, 2242 + node->properties); 2243 + gg_svg_parse_clip_path (gg_svg_doc->current_group, NULL, NULL, 2244 + node->properties); 2245 +} 2246 + 2247 +static void 2248 +gg_svg_parse_clip (struct gg_svg_document *gg_svg_doc, xmlNodePtr node) 2249 +{ 2250 +/* creating and initializing an SVG ClipPath struct */ 2251 + gg_svg_insert_clip (gg_svg_doc); 2252 + gg_svg_parse_id (NULL, gg_svg_doc->current_clip, NULL, node->properties); 2253 +} 2254 + 2255 +static void 2256 +gg_svg_parse_use (struct gg_svg_document *gg_svg_doc, xmlNodePtr node) 2257 +{ 2258 +/* creating and initializing an SVG Use struct */ 2259 + const char *xlink_href = NULL; 2260 + double x = DBL_MAX; 2261 + double y = DBL_MAX; 2262 + double width = DBL_MAX; 2263 + double height = DBL_MAX; 2264 + struct gg_svg_use *use; 2265 + struct _xmlAttr *attr = node->properties; 2266 + 2267 + while (attr) 2268 + { 2269 + if (attr->type == XML_ATTRIBUTE_NODE) 2270 + { 2271 + const char *value = NULL; 2272 + const char *name; 2273 + xmlNodePtr child = attr->children; 2274 + name = (const char *) (attr->name); 2275 + if (child) 2276 + value = (const char *) (child->content); 2277 + if (child && value) 2278 + { 2279 + if (strcmp (name, "href") == 0) 2280 + xlink_href = value; 2281 + if (strcmp (name, "x") == 0) 2282 + x = atof (value); 2283 + if (strcmp (name, "y") == 0) 2284 + y = atof (value); 2285 + if (strcmp (name, "width") == 0) 2286 + width = atof (value); 2287 + if (strcmp (name, "height") == 0) 2288 + height = atof (value); 2289 + } 2290 + } 2291 + attr = attr->next; 2292 + } 2293 + if (xlink_href == NULL) 2294 + return; 2295 + 2296 + use = gg_svg_insert_use (gg_svg_doc, xlink_href, x, y, width, height); 2297 + gg_svg_parse_style (NULL, NULL, use, node->properties); 2298 + gg_svg_parse_transform (NULL, NULL, use, NULL, node->properties); 2299 + gg_svg_parse_clip_path (NULL, NULL, use, node->properties); 2300 +} 2301 + 2302 +static void 2303 +gg_svg_parse_gradient_stop (struct gg_svg_gradient *gradient, xmlNodePtr node) 2304 +{ 2305 +/* parsing an SVG Node - Gradient - Stop */ 2306 + while (node) 2307 + { 2308 + if (node->type == XML_ELEMENT_NODE) 2309 + { 2310 + const char *name = (const char *) (node->name); 2311 + if (strcmp (name, "stop") == 0) 2312 + { 2313 + double offset = DBL_MAX; 2314 + double red = -1.0; 2315 + double green = -1.0; 2316 + double blue = -1.0; 2317 + double opacity = -1.0; 2318 + struct _xmlAttr *attr = node->properties; 2319 + while (attr) 2320 + { 2321 + if (attr->type == XML_ATTRIBUTE_NODE) 2322 + { 2323 + const char *value = NULL; 2324 + const char *name; 2325 + xmlNodePtr child = attr->children; 2326 + name = (const char *) (attr->name); 2327 + if (child) 2328 + value = (const char *) (child->content); 2329 + if (child && value) 2330 + { 2331 + if (strcmp (name, "offset") == 0) 2332 + { 2333 + int percent = 0; 2334 + int i; 2335 + for (i = 0; 2336 + i < (int) strlen (value); 2337 + i++) 2338 + { 2339 + if (value[i] == '%') 2340 + percent = 1; 2341 + } 2342 + offset = atof (value); 2343 + if (percent) 2344 + offset /= 100.0; 2345 + if (offset < 0.0) 2346 + offset = 0.0; 2347 + if (offset > 1.0) 2348 + offset = 1.0; 2349 + } 2350 + if (strcmp (name, "style") == 0) 2351 + gg_svg_parse_stop_style (value, 2352 + &red, 2353 + &green, 2354 + &blue, 2355 + &opacity); 2356 + if (strcmp (name, "stop-color") == 0) 2357 + { 2358 + opacity = 1.0; 2359 + gg_svg_parse_stop_color (value, 2360 + &red, 2361 + &green, 2362 + &blue); 2363 + } 2364 + } 2365 + } 2366 + attr = attr->next; 2367 + } 2368 + gg_svg_insert_gradient_stop (gradient, offset, red, green, 2369 + blue, opacity); 2370 + } 2371 + } 2372 + node = node->next; 2373 + } 2374 +} 2375 + 2376 +static void 2377 +gg_svg_parse_linear_gradient (struct gg_svg_document *gg_svg_doc, 2378 + xmlNodePtr node) 2379 +{ 2380 +/* creating and initializing an SVG LinearGradient struct */ 2381 + const char *xlink_href = NULL; 2382 + const char *id = NULL; 2383 + double x1 = DBL_MAX; 2384 + double y1 = DBL_MAX; 2385 + double x2 = DBL_MAX; 2386 + double y2 = DBL_MAX; 2387 + int units = GG_SVG_BOUNDING_BOX; 2388 + struct gg_svg_gradient *gradient; 2389 + struct _xmlAttr *attr = node->properties; 2390 + 2391 + while (attr) 2392 + { 2393 + if (attr->type == XML_ATTRIBUTE_NODE) 2394 + { 2395 + const char *value = NULL; 2396 + const char *name; 2397 + xmlNodePtr child = attr->children; 2398 + name = (const char *) (attr->name); 2399 + if (child) 2400 + value = (const char *) (child->content); 2401 + if (child && value) 2402 + { 2403 + if (strcmp (name, "href") == 0) 2404 + xlink_href = value; 2405 + if (strcmp (name, "id") == 0) 2406 + id = value; 2407 + if (strcmp (name, "x1") == 0) 2408 + x1 = atof (value); 2409 + if (strcmp (name, "y1") == 0) 2410 + y1 = atof (value); 2411 + if (strcmp (name, "x2") == 0) 2412 + x2 = atof (value); 2413 + if (strcmp (name, "y2") == 0) 2414 + y2 = atof (value); 2415 + if (strcmp (name, "gradientUnits") == 0) 2416 + { 2417 + if (strcmp (value, "userSpaceOnUse") == 0) 2418 + units = GG_SVG_USER_SPACE; 2419 + } 2420 + } 2421 + } 2422 + attr = attr->next; 2423 + } 2424 + if (x1 == DBL_MAX) 2425 + x1 = gg_svg_doc->viewbox_x; 2426 + if (y1 == DBL_MAX) 2427 + y1 = gg_svg_doc->viewbox_y; 2428 + if (x2 == DBL_MAX) 2429 + x2 = gg_svg_doc->viewbox_width; 2430 + if (y2 == DBL_MAX) 2431 + y2 = y1; 2432 + 2433 + gradient = 2434 + gg_svg_insert_linear_gradient (gg_svg_doc, id, xlink_href, x1, y1, x2, 2435 + y2, units); 2436 + gg_svg_parse_gradient_stop (gradient, node->children); 2437 + gg_svg_parse_transform (NULL, NULL, NULL, gradient, node->properties); 2438 +} 2439 + 2440 +static void 2441 +gg_svg_parse_radial_gradient (struct gg_svg_document *gg_svg_doc, 2442 + xmlNodePtr node) 2443 +{ 2444 +/* creating and initializing an SVG RadialGradient struct */ 2445 + const char *xlink_href = NULL; 2446 + const char *id = NULL; 2447 + double cx = DBL_MAX; 2448 + double cy = DBL_MAX; 2449 + double fx = DBL_MAX; 2450 + double fy = DBL_MAX; 2451 + double r = DBL_MAX; 2452 + int units = GG_SVG_BOUNDING_BOX; 2453 + struct gg_svg_gradient *gradient; 2454 + struct _xmlAttr *attr = node->properties; 2455 + 2456 + while (attr) 2457 + { 2458 + if (attr->type == XML_ATTRIBUTE_NODE) 2459 + { 2460 + const char *value = NULL; 2461 + const char *name; 2462 + xmlNodePtr child = attr->children; 2463 + name = (const char *) (attr->name); 2464 + if (child) 2465 + value = (const char *) (child->content); 2466 + if (child && value) 2467 + { 2468 + if (strcmp (name, "href") == 0) 2469 + xlink_href = value; 2470 + if (strcmp (name, "id") == 0) 2471 + id = value; 2472 + if (strcmp (name, "cx") == 0) 2473 + cx = atof (value); 2474 + if (strcmp (name, "cy") == 0) 2475 + cy = atof (value); 2476 + if (strcmp (name, "fx") == 0) 2477 + fx = atof (value); 2478 + if (strcmp (name, "fy") == 0) 2479 + fy = atof (value); 2480 + if (strcmp (name, "r") == 0) 2481 + r = atof (value); 2482 + if (strcmp (name, "gradientUnits") == 0) 2483 + { 2484 + if (strcmp (value, "userSpaceOnUse") == 0) 2485 + units = GG_SVG_USER_SPACE; 2486 + } 2487 + } 2488 + } 2489 + attr = attr->next; 2490 + } 2491 + if (cx == DBL_MAX) 2492 + cx = gg_svg_doc->viewbox_width / 2.0; 2493 + if (cy == DBL_MAX) 2494 + cy = gg_svg_doc->viewbox_height / 2.0; 2495 + if (r == DBL_MAX) 2496 + r = gg_svg_doc->viewbox_width / 2.0; 2497 + if (fx == DBL_MAX) 2498 + fx = cx; 2499 + if (fy == DBL_MAX) 2500 + fy = cy; 2501 + 2502 + gradient = 2503 + gg_svg_insert_radial_gradient (gg_svg_doc, id, xlink_href, cx, cy, fx, 2504 + fy, r, units); 2505 + gg_svg_parse_gradient_stop (gradient, node->children); 2506 + gg_svg_parse_transform (NULL, NULL, NULL, gradient, node->properties); 2507 +} 2508 + 2509 +static void 2510 +gg_svg_parse_node (struct gg_svg_document *gg_svg_doc, xmlNodePtr node) 2511 +{ 2512 +/* parsing an SVG Node */ 2513 + while (node) 2514 + { 2515 + int is_group = 0; 2516 + int is_defs = 0; 2517 + int is_flow_root = 0; 2518 + int is_clip_path = 0; 2519 + if (node->type == XML_ELEMENT_NODE) 2520 + { 2521 + const char *name = (const char *) (node->name); 2522 + if (strcmp (name, "defs") == 0) 2523 + { 2524 + gg_svg_doc->defs_count += 1; 2525 + is_defs = 1; 2526 + } 2527 + if (strcmp (name, "flowRoot") == 0) 2528 + { 2529 + gg_svg_doc->flow_root_count += 1; 2530 + is_flow_root = 1; 2531 + } 2532 + if (strcmp (name, "clipPath") == 0) 2533 + { 2534 + gg_svg_parse_clip (gg_svg_doc, node); 2535 + is_clip_path = 1; 2536 + } 2537 + if (strcmp (name, "g") == 0) 2538 + { 2539 + gg_svg_parse_group (gg_svg_doc, node); 2540 + is_group = 1; 2541 + } 2542 + if (strcmp (name, "rect") == 0) 2543 + gg_svg_parse_rect (gg_svg_doc, node); 2544 + if (strcmp (name, "circle") == 0) 2545 + gg_svg_parse_circle (gg_svg_doc, node); 2546 + if (strcmp (name, "ellipse") == 0) 2547 + gg_svg_parse_ellipse (gg_svg_doc, node); 2548 + if (strcmp (name, "line") == 0) 2549 + gg_svg_parse_line (gg_svg_doc, node); 2550 + if (strcmp (name, "polyline") == 0) 2551 + gg_svg_parse_polyline (gg_svg_doc, node); 2552 + if (strcmp (name, "polygon") == 0) 2553 + gg_svg_parse_polygon (gg_svg_doc, node); 2554 + if (strcmp (name, "path") == 0) 2555 + gg_svg_parse_path (gg_svg_doc, node); 2556 + if (strcmp (name, "use") == 0) 2557 + gg_svg_parse_use (gg_svg_doc, node); 2558 + if (strcmp (name, "linearGradient") == 0) 2559 + gg_svg_parse_linear_gradient (gg_svg_doc, node); 2560 + if (strcmp (name, "radialGradient") == 0) 2561 + gg_svg_parse_radial_gradient (gg_svg_doc, node); 2562 + } 2563 + gg_svg_parse_node (gg_svg_doc, node->children); 2564 + if (is_group) 2565 + gg_svg_close_group (gg_svg_doc); 2566 + if (is_defs) 2567 + gg_svg_doc->defs_count -= 1; 2568 + if (is_flow_root) 2569 + gg_svg_doc->flow_root_count -= 1; 2570 + if (is_clip_path) 2571 + gg_svg_close_clip (gg_svg_doc); 2572 + node = node->next; 2573 + } 2574 +} 2575 + 2576 +static void 2577 +gg_svg_parse_viewbox (struct gg_svg_document *gg_svg_doc, const char *str) 2578 +{ 2579 +/* parsing an SVG ViewBox */ 2580 + double value; 2581 + const char *p = str; 2582 + if (!gg_svg_consume_float (&p, &value)) 2583 + return; 2584 + gg_svg_doc->viewbox_x = value; 2585 + if (!gg_svg_consume_float (&p, &value)) 2586 + return; 2587 + gg_svg_doc->viewbox_y = value; 2588 + if (!gg_svg_consume_float (&p, &value)) 2589 + return; 2590 + gg_svg_doc->viewbox_width = value; 2591 + if (!gg_svg_consume_float (&p, &value)) 2592 + return; 2593 + gg_svg_doc->viewbox_height = value; 2594 +} 2595 + 2596 +static void 2597 +gg_svg_parse_header (struct gg_svg_document *gg_svg_doc, struct _xmlAttr *attr) 2598 +{ 2599 +/* parsing the SVG header definitions */ 2600 + while (attr) 2601 + { 2602 + if (attr->type == XML_ATTRIBUTE_NODE) 2603 + { 2604 + const char *value = NULL; 2605 + const char *name; 2606 + xmlNodePtr child = attr->children; 2607 + name = (const char *) (attr->name); 2608 + if (child) 2609 + value = (const char *) (child->content); 2610 + if (child && value) 2611 + { 2612 + int len; 2613 + double factor = 1.0; 2614 + if (strcmp (name, "width") == 0) 2615 + { 2616 + len = strlen (value); 2617 + if (len > 3) 2618 + { 2619 + if (strcmp (value + len - 2, "mm") == 0) 2620 + factor = 72.0 / 25.4; 2621 + else if (strcmp (value + len - 2, "cm") == 0) 2622 + factor = 72.0 / 2.54; 2623 + else if (strcmp (value + len - 2, "in") == 0) 2624 + factor = 72.0; 2625 + else if (strcmp (value + len - 2, "pc") == 0) 2626 + factor = 72.0 / 6.0; 2627 + } 2628 + gg_svg_doc->width = atof (value) * factor; 2629 + } 2630 + if (strcmp (name, "height") == 0) 2631 + { 2632 + len = strlen (value); 2633 + if (len > 3) 2634 + { 2635 + if (strcmp (value + len - 2, "mm") == 0) 2636 + factor = 72.0 / 25.4; 2637 + else if (strcmp (value + len - 2, "cm") == 0) 2638 + factor = 72.0 / 2.54; 2639 + else if (strcmp (value + len - 2, "in") == 0) 2640 + factor = 72.0; 2641 + else if (strcmp (value + len - 2, "pc") == 0) 2642 + factor = 72.0 / 6.0; 2643 + } 2644 + gg_svg_doc->height = atof (value) * factor; 2645 + } 2646 + if (strcmp (name, "viewBox") == 0) 2647 + gg_svg_parse_viewbox (gg_svg_doc, value); 2648 + } 2649 + } 2650 + attr = attr->next; 2651 + } 2652 +} 2653 + 2654 +GGRAPH_PRIVATE struct gg_svg_document * 2655 +gg_svg_parse_doc (const unsigned char *svg, int svg_len) 2656 +{ 2657 +/* attempting to parse the SVG Document */ 2658 + struct gg_svg_document *gg_svg_doc; 2659 + xmlNodePtr node; 2660 + xmlDocPtr xml_doc = 2661 + xmlReadMemory ((const char *) svg, svg_len, "noname.svg", NULL, 0); 2662 + if (xml_doc == NULL) 2663 + { 2664 + /* parsing error; not a well-formed XML */ 2665 + fprintf (stderr, "XML parsing error\n"); 2666 + return NULL; 2667 + } 2668 + gg_svg_doc = gg_svg_alloc_document (); 2669 + node = xmlDocGetRootElement (xml_doc); 2670 + gg_svg_parse_header (gg_svg_doc, node->properties); 2671 + gg_svg_parse_node (gg_svg_doc, node); 2672 + xmlFreeDoc (xml_doc); 2673 + return gg_svg_doc; 2674 +}
Added src/gaiagraphics_tiff.c.
1 +/* 2 +/ gaiagraphics_tiff.c 3 +/ 4 +/ TIFF auxiliary helpers 5 +/ 6 +/ version 1.0, 2010 July 20 7 +/ 8 +/ Author: Sandro Furieri a.furieri@lqt.it 9 +/ 10 +/ Copyright (C) 2010 Alessandro Furieri 11 +/ 12 +/ This program is free software: you can redistribute it and/or modify 13 +/ it under the terms of the GNU Lesser General Public License as published by 14 +/ the Free Software Foundation, either version 3 of the License, or 15 +/ (at your option) any later version. 16 +/ 17 +/ This program is distributed in the hope that it will be useful, 18 +/ but WITHOUT ANY WARRANTY; without even the implied warranty of 19 +/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 +/ GNU Lesser General Public License for more details. 21 +/ 22 +/ You should have received a copy of the GNU Lesser General Public License 23 +/ along with this program. If not, see <http://www.gnu.org/licenses/>. 24 +/ 25 +*/ 26 + 27 +#include <stdio.h> 28 +#include <math.h> 29 +#include <float.h> 30 +#include <string.h> 31 +#include <stdlib.h> 32 + 33 +/* 34 +/ the following patch supporting GeoTiff headers 35 +/ was kindly contributed by Brad Hards: 2011-09-02 36 +*/ 37 +#ifdef HAVE_GEOTIFF_GEOTIFF_H 38 +#include <geotiff/geotiff.h> 39 +#include <geotiff/xtiffio.h> 40 +#include <geotiff/geo_tiffp.h> 41 +#include <geotiff/geo_keyp.h> 42 +#include <geotiff/geovalues.h> 43 +#include <geotiff/geo_normalize.h> 44 +#elif HAVE_LIBGEOTIFF_GEOTIFF_H 45 +#include <libgeotiff/geotiff.h> 46 +#include <libgeotiff/xtiffio.h> 47 +#include <libgeotiff/geo_tiffp.h> 48 +#include <libgeotiff/geo_keyp.h> 49 +#include <libgeotiff/geovalues.h> 50 +#include <libgeotiff/geo_normalize.h> 51 +#else 52 +#include <geotiff.h> 53 +#include <xtiffio.h> 54 +#include <geo_tiffp.h> 55 +#include <geo_keyp.h> 56 +#include <geovalues.h> 57 +#include <geo_normalize.h> 58 +#endif 59 + 60 +#include "gaiagraphics.h" 61 +#include "gaiagraphics_internals.h" 62 + 63 +#define TIFF_TYPE_MONOCHROME 1 64 +#define TIFF_TYPE_PALETTE 2 65 +#define TIFF_TYPE_GRAYSCALE 3 66 +#define TIFF_TYPE_RGB 4 67 +#define TIFF_TYPE_GRID 5 68 + 69 +struct tiff_codec_data 70 +{ 71 +/* a struct used by TIFF codec */ 72 + int is_geotiff; 73 + int is_writer; 74 + TIFF *tiff_handle; 75 + GTIF *geotiff_handle; 76 + void *tiff_buffer; 77 + int is_tiled; 78 + int tiff_type; 79 +}; 80 + 81 +struct memfile 82 +{ 83 +/* a struct emulating a file [memory mapped] */ 84 + unsigned char *buffer; 85 + int malloc_block; 86 + tsize_t size; 87 + tsize_t eof; 88 + toff_t current; 89 +}; 90 + 91 +static void 92 +memory_realloc (struct memfile *mem, tsize_t req_size) 93 +{ 94 +/* expanding the allocated memory */ 95 + unsigned char *new_buffer; 96 + tsize_t new_size = mem->size; 97 + while (new_size < req_size) 98 + new_size += mem->malloc_block; 99 + new_buffer = realloc (mem->buffer, new_size); 100 + if (!new_buffer) 101 + return; 102 + mem->buffer = new_buffer; 103 + mem->size = new_size; 104 +} 105 + 106 +static tsize_t 107 +memory_readproc (thandle_t clientdata, tdata_t data, tsize_t size) 108 +{ 109 +/* emulating the read() function */ 110 + struct memfile *mem = clientdata; 111 + tsize_t len; 112 + if (mem->current >= (toff_t) mem->eof) 113 + return 0; 114 + len = size; 115 + if ((mem->current + size) >= (toff_t) mem->eof) 116 + len = (tsize_t) (mem->eof - mem->current); 117 + memcpy (data, mem->buffer + mem->current, len); 118 + mem->current += len; 119 + return len; 120 +} 121 + 122 +static tsize_t 123 +memory_writeproc (thandle_t clientdata, tdata_t data, tsize_t size) 124 +{ 125 +/* emulating the write() function */ 126 + struct memfile *mem = clientdata; 127 + if ((mem->current + size) >= (toff_t) mem->size) 128 + memory_realloc (mem, mem->current + size); 129 + if ((mem->current + size) >= (toff_t) mem->size) 130 + return -1; 131 + memcpy (mem->buffer + mem->current, (unsigned char *) data, size); 132 + mem->current += size; 133 + if (mem->current > (toff_t) mem->eof) 134 + mem->eof = (tsize_t) (mem->current); 135 + return size; 136 +} 137 + 138 +static toff_t 139 +memory_seekproc (thandle_t clientdata, toff_t offset, int whence) 140 +{ 141 +/* emulating the lseek() function */ 142 + struct memfile *mem = clientdata; 143 + switch (whence) 144 + { 145 + case SEEK_CUR: 146 + if ((int) (mem->current + offset) < 0) 147 + return (toff_t) - 1; 148 + mem->current += offset; 149 + if ((toff_t) mem->eof < mem->current) 150 + mem->eof = (tsize_t) (mem->current); 151 + break; 152 + case SEEK_END: 153 + if ((int) (mem->eof + offset) < 0) 154 + return (toff_t) - 1; 155 + mem->current = mem->eof + offset; 156 + if ((toff_t) mem->eof < mem->current) 157 + mem->eof = (tsize_t) (mem->current); 158 + break; 159 + case SEEK_SET: 160 + default: 161 + if ((int) offset < 0) 162 + return (toff_t) - 1; 163 + mem->current = offset; 164 + if ((toff_t) mem->eof < mem->current) 165 + mem->eof = (tsize_t) (mem->current); 166 + break; 167 + }; 168 + return mem->current; 169 +} 170 + 171 +static int 172 +closeproc (thandle_t clientdata) 173 +{ 174 +/* emulating the close() function */ 175 + if (clientdata) 176 + return 0; /* does absolutely nothing - required in order to suppress warnings */ 177 + return 0; 178 +} 179 + 180 +static toff_t 181 +memory_sizeproc (thandle_t clientdata) 182 +{ 183 +/* returning the pseudo-file current size */ 184 + struct memfile *mem = clientdata; 185 + return mem->eof; 186 +} 187 + 188 +static int 189 +mapproc (thandle_t clientdata, tdata_t * data, toff_t * offset) 190 +{ 191 + if (clientdata || data || offset) 192 + return 0; /* does absolutely nothing - required in order to suppress warnings */ 193 + return 0; 194 +} 195 + 196 +static void 197 +unmapproc (thandle_t clientdata, tdata_t data, toff_t offset) 198 +{ 199 + if (clientdata || data || offset) 200 + return; /* does absolutely nothing - required in order to suppress warnings */ 201 + return; 202 +} 203 + 204 +GGRAPH_PRIVATE int 205 +gg_image_infos_from_mem_tiff (int size, const void *data, 206 + gGraphImageInfosPtr * infos_handle) 207 +{ 208 +/* image infos from TIFF (memory cached) */ 209 + gGraphImageInfosPtr infos; 210 + uint16 bits_per_sample; 211 + uint16 samples_per_pixel; 212 + uint16 photometric; 213 + uint16 compression; 214 + uint16 sample_format; 215 + uint16 planar_config; 216 + uint32 width = 0; 217 + uint32 height = 0; 218 + uint32 rows_strip = 0; 219 + struct memfile clientdata; 220 + int is_tiled; 221 + uint32 tile_width; 222 + uint32 tile_height; 223 + int type; 224 + int gg_sample_format; 225 + TIFF *in = (TIFF *) 0; 226 + int max_palette = 0; 227 + unsigned char red[256]; 228 + unsigned char green[256]; 229 + unsigned char blue[256]; 230 + int i; 231 + *infos_handle = NULL; 232 + 233 +/* suppressing TIFF warnings */ 234 + TIFFSetWarningHandler (NULL); 235 + 236 +/* reading from memory */ 237 + clientdata.buffer = (unsigned char *) data; 238 + clientdata.size = size; 239 + clientdata.eof = size; 240 + clientdata.current = 0; 241 + in = TIFFClientOpen ("tiff", "r", &clientdata, memory_readproc, 242 + memory_writeproc, memory_seekproc, closeproc, 243 + memory_sizeproc, mapproc, unmapproc); 244 + if (in == NULL) 245 + return GGRAPH_TIFF_CODEC_ERROR; 246 + is_tiled = TIFFIsTiled (in); 247 +/* retrieving the TIFF dimensions */ 248 + TIFFGetField (in, TIFFTAG_IMAGELENGTH, &height); 249 + TIFFGetField (in, TIFFTAG_IMAGEWIDTH, &width); 250 + if (is_tiled) 251 + { 252 + TIFFGetField (in, TIFFTAG_TILEWIDTH, &tile_width); 253 + TIFFGetField (in, TIFFTAG_TILELENGTH, &tile_height); 254 + } 255 + else 256 + TIFFGetField (in, TIFFTAG_ROWSPERSTRIP, &rows_strip); 257 + TIFFGetField (in, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); 258 + if (TIFFGetField (in, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel) == 0) 259 + { 260 + /* attempting to recover badly formatted TIFFs */ 261 + samples_per_pixel = 1; 262 + } 263 + TIFFGetField (in, TIFFTAG_PHOTOMETRIC, &photometric); 264 + TIFFGetField (in, TIFFTAG_COMPRESSION, &compression); 265 + if (TIFFGetField (in, TIFFTAG_PLANARCONFIG, &planar_config) == 0) 266 + { 267 + /* attempting to recover badly formatted TIFFs */ 268 + planar_config = 1; 269 + } 270 + if (TIFFGetField (in, TIFFTAG_SAMPLEFORMAT, &sample_format) == 0) 271 + sample_format = SAMPLEFORMAT_UINT; 272 + if (planar_config == PLANARCONFIG_CONTIG) 273 + { 274 + if (sample_format == SAMPLEFORMAT_UINT) 275 + { 276 + if (bits_per_sample == 1 && samples_per_pixel == 1 277 + && photometric < 2) 278 + { 279 + type = GG_PIXEL_PALETTE; 280 + max_palette = 2; 281 + if (photometric == PHOTOMETRIC_MINISWHITE) 282 + { 283 + red[0] = 255; 284 + green[0] = 255; 285 + blue[0] = 255; 286 + red[1] = 0; 287 + green[1] = 0; 288 + blue[1] = 0; 289 + } 290 + else 291 + { 292 + red[0] = 0; 293 + green[0] = 0; 294 + blue[0] = 0; 295 + red[1] = 255; 296 + green[1] = 255; 297 + blue[1] = 255; 298 + } 299 + } 300 + else if (bits_per_sample == 8 && samples_per_pixel == 1 301 + && photometric == 3) 302 + { 303 + uint16 *plt_red; 304 + uint16 *plt_green; 305 + uint16 *plt_blue; 306 + type = GG_PIXEL_PALETTE; 307 + TIFFGetField (in, TIFFTAG_COLORMAP, &plt_red, &plt_green, 308 + &plt_blue); 309 + max_palette = 256; 310 + for (i = 0; i < max_palette; i++) 311 + { 312 + if (plt_red[i] < 256) 313 + red[i] = plt_red[i]; 314 + else 315 + red[i] = plt_red[i] / 256; 316 + if (plt_green[i] < 256) 317 + green[i] = plt_green[i]; 318 + else 319 + green[i] = plt_green[i] / 256; 320 + if (plt_blue[i] < 256) 321 + blue[i] = plt_blue[i]; 322 + else 323 + blue[i] = plt_blue[i] / 256; 324 + } 325 + } 326 + else if (bits_per_sample == 8 && samples_per_pixel == 1 327 + && photometric < 2) 328 + type = GG_PIXEL_GRAYSCALE; 329 + else if (bits_per_sample == 8 && samples_per_pixel == 3) 330 + type = GG_PIXEL_RGB; 331 + else 332 + type = GG_PIXEL_UNKNOWN; 333 + } 334 + else if (samples_per_pixel == 1) 335 + type = GG_PIXEL_GRID; 336 + else 337 + type = GG_PIXEL_UNKNOWN; 338 + } 339 + else 340 + type = GG_PIXEL_UNKNOWN; 341 + switch (sample_format) 342 + { 343 + case SAMPLEFORMAT_UINT: 344 + gg_sample_format = GGRAPH_SAMPLE_UINT; 345 + break; 346 + case SAMPLEFORMAT_INT: 347 + gg_sample_format = GGRAPH_SAMPLE_INT; 348 + break; 349 + case SAMPLEFORMAT_IEEEFP: 350 + gg_sample_format = GGRAPH_SAMPLE_FLOAT; 351 + break; 352 + default: 353 + gg_sample_format = GGRAPH_SAMPLE_UNKNOWN; 354 + break; 355 + }; 356 + infos = 357 + gg_image_infos_create (type, width, height, bits_per_sample, 358 + samples_per_pixel, gg_sample_format, NULL, NULL); 359 + if (!infos) 360 + return GGRAPH_INSUFFICIENT_MEMORY; 361 + if (is_tiled) 362 + { 363 + infos->tile_width = tile_width; 364 + infos->tile_height = tile_height; 365 + } 366 + else 367 + infos->rows_per_strip = rows_strip; 368 + switch (compression) 369 + { 370 + case COMPRESSION_NONE: 371 + infos->compression = GGRAPH_TIFF_COMPRESSION_NONE; 372 + break; 373 + case COMPRESSION_LZW: 374 + infos->compression = GGRAPH_TIFF_COMPRESSION_LZW; 375 + break; 376 + case COMPRESSION_DEFLATE: 377 + infos->compression = GGRAPH_TIFF_COMPRESSION_DEFLATE; 378 + break; 379 + case COMPRESSION_JPEG: 380 + infos->compression = GGRAPH_TIFF_COMPRESSION_JPEG; 381 + break; 382 + case COMPRESSION_CCITTFAX3: 383 + infos->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX3; 384 + break; 385 + case COMPRESSION_CCITTFAX4: 386 + infos->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX4; 387 + break; 388 + default: 389 + infos->compression = GGRAPH_TIFF_COMPRESSION_UNKNOWN; 390 + break; 391 + }; 392 + for (i = 0; i < max_palette; i++) 393 + { 394 + infos->palette_red[i] = red[i]; 395 + infos->palette_green[i] = green[i]; 396 + infos->palette_blue[i] = blue[i]; 397 + } 398 + infos->max_palette = max_palette; 399 + TIFFClose (in); 400 + *infos_handle = infos; 401 + return GGRAPH_OK; 402 +} 403 + 404 +GGRAPH_PRIVATE int 405 +gg_image_infos_from_tiff (const char *path, gGraphImageInfosPtr * infos_handle) 406 +{ 407 +/* image infos from TIFF */ 408 + gGraphImageInfosPtr infos; 409 + uint16 bits_per_sample; 410 + uint16 samples_per_pixel; 411 + uint16 photometric; 412 + uint16 compression; 413 + uint16 sample_format; 414 + uint16 planar_config; 415 + uint32 width = 0; 416 + uint32 height = 0; 417 + uint32 rows_strip = 0; 418 + int is_tiled; 419 + uint32 tile_width; 420 + uint32 tile_height; 421 + int type; 422 + int gg_sample_format; 423 + TIFF *in = (TIFF *) 0; 424 + int max_palette = 0; 425 + unsigned char red[256]; 426 + unsigned char green[256]; 427 + unsigned char blue[256]; 428 + int i; 429 + *infos_handle = NULL; 430 + 431 +/* suppressing TIFF warnings */ 432 + TIFFSetWarningHandler (NULL); 433 + 434 +/* reading from file */ 435 + in = TIFFOpen (path, "r"); 436 + if (in == NULL) 437 + return GGRAPH_TIFF_CODEC_ERROR; 438 + is_tiled = TIFFIsTiled (in); 439 +/* retrieving the TIFF dimensions */ 440 + TIFFGetField (in, TIFFTAG_IMAGELENGTH, &height); 441 + TIFFGetField (in, TIFFTAG_IMAGEWIDTH, &width); 442 + if (is_tiled) 443 + { 444 + TIFFGetField (in, TIFFTAG_TILEWIDTH, &tile_width); 445 + TIFFGetField (in, TIFFTAG_TILELENGTH, &tile_height); 446 + } 447 + else 448 + TIFFGetField (in, TIFFTAG_ROWSPERSTRIP, &rows_strip); 449 + TIFFGetField (in, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); 450 + if (TIFFGetField (in, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel) == 0) 451 + { 452 + /* attempting to recover badly formatted TIFFs */ 453 + samples_per_pixel = 1; 454 + } 455 + TIFFGetField (in, TIFFTAG_PHOTOMETRIC, &photometric); 456 + TIFFGetField (in, TIFFTAG_COMPRESSION, &compression); 457 + if (TIFFGetField (in, TIFFTAG_PLANARCONFIG, &planar_config) == 0) 458 + { 459 + /* attempting to recover badly formatted TIFFs */ 460 + planar_config = 1; 461 + } 462 + if (TIFFGetField (in, TIFFTAG_SAMPLEFORMAT, &sample_format) == 0) 463 + sample_format = SAMPLEFORMAT_UINT; 464 + if (planar_config == PLANARCONFIG_CONTIG) 465 + { 466 + if (sample_format == SAMPLEFORMAT_UINT) 467 + { 468 + if (bits_per_sample == 1 && samples_per_pixel == 1 469 + && photometric < 2) 470 + { 471 + type = GG_PIXEL_PALETTE; 472 + max_palette = 2; 473 + if (photometric == PHOTOMETRIC_MINISWHITE) 474 + { 475 + red[0] = 255; 476 + green[0] = 255; 477 + blue[0] = 255; 478 + red[1] = 0; 479 + green[1] = 0; 480 + blue[1] = 0; 481 + } 482 + else 483 + { 484 + red[0] = 0; 485 + green[0] = 0; 486 + blue[0] = 0; 487 + red[1] = 255; 488 + green[1] = 255; 489 + blue[1] = 255; 490 + } 491 + } 492 + else if (bits_per_sample == 8 && samples_per_pixel == 1 493 + && photometric == 3) 494 + { 495 + uint16 *plt_red; 496 + uint16 *plt_green; 497 + uint16 *plt_blue; 498 + type = GG_PIXEL_PALETTE; 499 + TIFFGetField (in, TIFFTAG_COLORMAP, &plt_red, &plt_green, 500 + &plt_blue); 501 + max_palette = 256; 502 + for (i = 0; i < max_palette; i++) 503 + { 504 + if (plt_red[i] < 256) 505 + red[i] = plt_red[i]; 506 + else 507 + red[i] = plt_red[i] / 256; 508 + if (plt_green[i] < 256) 509 + green[i] = plt_green[i]; 510 + else 511 + green[i] = plt_green[i] / 256; 512 + if (plt_blue[i] < 256) 513 + blue[i] = plt_blue[i]; 514 + else 515 + blue[i] = plt_blue[i] / 256; 516 + } 517 + } 518 + else if (bits_per_sample == 8 && samples_per_pixel == 1 519 + && photometric < 2) 520 + type = GG_PIXEL_GRAYSCALE; 521 + else if (bits_per_sample == 8 && samples_per_pixel == 3) 522 + type = GG_PIXEL_RGB; 523 + else 524 + type = GG_PIXEL_UNKNOWN; 525 + } 526 + else if (samples_per_pixel == 1) 527 + type = GG_PIXEL_GRID; 528 + else 529 + type = GG_PIXEL_UNKNOWN; 530 + } 531 + else 532 + type = GG_PIXEL_UNKNOWN; 533 + switch (sample_format) 534 + { 535 + case SAMPLEFORMAT_UINT: 536 + gg_sample_format = GGRAPH_SAMPLE_UINT; 537 + break; 538 + case SAMPLEFORMAT_INT: 539 + gg_sample_format = GGRAPH_SAMPLE_INT; 540 + break; 541 + case SAMPLEFORMAT_IEEEFP: 542 + gg_sample_format = GGRAPH_SAMPLE_FLOAT; 543 + break; 544 + default: 545 + gg_sample_format = GGRAPH_SAMPLE_UNKNOWN; 546 + break; 547 + }; 548 + infos = 549 + gg_image_infos_create (type, width, height, bits_per_sample, 550 + samples_per_pixel, gg_sample_format, NULL, NULL); 551 + if (!infos) 552 + return GGRAPH_INSUFFICIENT_MEMORY; 553 + if (is_tiled) 554 + { 555 + infos->tile_width = tile_width; 556 + infos->tile_height = tile_height; 557 + } 558 + else 559 + infos->rows_per_strip = rows_strip; 560 + switch (compression) 561 + { 562 + case COMPRESSION_NONE: 563 + infos->compression = GGRAPH_TIFF_COMPRESSION_NONE; 564 + break; 565 + case COMPRESSION_LZW: 566 + infos->compression = GGRAPH_TIFF_COMPRESSION_LZW; 567 + break; 568 + case COMPRESSION_DEFLATE: 569 + infos->compression = GGRAPH_TIFF_COMPRESSION_DEFLATE; 570 + break; 571 + case COMPRESSION_JPEG: 572 + infos->compression = GGRAPH_TIFF_COMPRESSION_JPEG; 573 + break; 574 + case COMPRESSION_CCITTFAX3: 575 + infos->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX3; 576 + break; 577 + case COMPRESSION_CCITTFAX4: 578 + infos->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX4; 579 + break; 580 + default: 581 + infos->compression = GGRAPH_TIFF_COMPRESSION_UNKNOWN; 582 + break; 583 + }; 584 + for (i = 0; i < max_palette; i++) 585 + { 586 + infos->palette_red[i] = red[i]; 587 + infos->palette_green[i] = green[i]; 588 + infos->palette_blue[i] = blue[i]; 589 + } 590 + infos->max_palette = max_palette; 591 + TIFFClose (in); 592 + *infos_handle = infos; 593 + return GGRAPH_OK; 594 +} 595 + 596 +GGRAPH_PRIVATE int 597 +gg_image_infos_from_geo_tiff (const char *path, 598 + gGraphImageInfosPtr * infos_handle) 599 +{ 600 +/* image infos from GeoTIFF */ 601 + gGraphImageInfosPtr infos; 602 + uint16 bits_per_sample; 603 + uint16 samples_per_pixel; 604 + uint16 photometric; 605 + uint16 compression; 606 + uint16 sample_format; 607 + uint16 planar_config; 608 + uint32 width = 0; 609 + uint32 height = 0; 610 + uint32 rows_strip = 0; 611 + int is_tiled; 612 + uint32 tile_width; 613 + uint32 tile_height; 614 + int type; 615 + int gg_sample_format; 616 + int epsg = -1; 617 + double cx; 618 + double cy; 619 + double upper_left_x; 620 + double upper_left_y; 621 + double upper_right_x; 622 + double lower_left_y; 623 + double pixel_x; 624 + double pixel_y; 625 + char srs_name[1024]; 626 + char proj4text[1024]; 627 + TIFF *in = (TIFF *) 0; 628 + GTIF *gtif = (GTIF *) 0; 629 + GTIFDefn definition; 630 + int max_palette = 0; 631 + unsigned char red[256]; 632 + unsigned char green[256]; 633 + unsigned char blue[256]; 634 + int i; 635 + *infos_handle = NULL; 636 + 637 +/* suppressing TIFF warnings */ 638 + TIFFSetWarningHandler (NULL); 639 + 640 +/* reading from file */ 641 + in = XTIFFOpen (path, "r"); 642 + if (in == NULL) 643 + return GGRAPH_GEOTIFF_CODEC_ERROR; 644 + gtif = GTIFNew (in); 645 + if (gtif == NULL) 646 + goto error; 647 + 648 + if (!GTIFGetDefn (gtif, &definition)) 649 + goto error; 650 +/* retrieving the EPSG code */ 651 + if (definition.PCS == 32767) 652 + { 653 + if (definition.GCS != 32767) 654 + epsg = definition.GCS; 655 + } 656 + else 657 + epsg = definition.PCS; 658 + *srs_name = '\0'; 659 + if (definition.PCS == 32767) 660 + { 661 + /* Get the GCS name if possible */ 662 + char *pszName = NULL; 663 + GTIFGetGCSInfo (definition.GCS, &pszName, NULL, NULL, NULL); 664 + if (pszName != NULL) 665 + strcpy (srs_name, pszName); 666 + CPLFree (pszName); 667 + } 668 + else 669 + { 670 + /* Get the PCS name if possible */ 671 + char *pszPCSName = NULL; 672 + GTIFGetPCSInfo (definition.PCS, &pszPCSName, NULL, NULL, NULL); 673 + if (pszPCSName != NULL) 674 + strcpy (srs_name, pszPCSName); 675 + CPLFree (pszPCSName); 676 + } 677 +/* retrieving the PROJ.4 params */ 678 + strcpy (proj4text, GTIFGetProj4Defn (&definition)); 679 + 680 + is_tiled = TIFFIsTiled (in); 681 +/* retrieving the TIFF dimensions */ 682 + TIFFGetField (in, TIFFTAG_IMAGELENGTH, &height); 683 + TIFFGetField (in, TIFFTAG_IMAGEWIDTH, &width); 684 + if (is_tiled) 685 + { 686 + TIFFGetField (in, TIFFTAG_TILEWIDTH, &tile_width); 687 + TIFFGetField (in, TIFFTAG_TILELENGTH, &tile_height); 688 + } 689 + else 690 + TIFFGetField (in, TIFFTAG_ROWSPERSTRIP, &rows_strip); 691 + TIFFGetField (in, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); 692 + if (TIFFGetField (in, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel) == 0) 693 + { 694 + /* attempting to recover badly formatted TIFFs */ 695 + samples_per_pixel = 1; 696 + } 697 + TIFFGetField (in, TIFFTAG_PHOTOMETRIC, &photometric); 698 + TIFFGetField (in, TIFFTAG_COMPRESSION, &compression); 699 + if (TIFFGetField (in, TIFFTAG_PLANARCONFIG, &planar_config) == 0) 700 + { 701 + /* attempting to recover badly formatted TIFFs */ 702 + planar_config = PLANARCONFIG_CONTIG; 703 + } 704 + if (TIFFGetField (in, TIFFTAG_SAMPLEFORMAT, &sample_format) == 0) 705 + sample_format = SAMPLEFORMAT_UINT; 706 + if (planar_config == PLANARCONFIG_CONTIG) 707 + { 708 + if (sample_format == SAMPLEFORMAT_UINT) 709 + { 710 + if (bits_per_sample == 1 && samples_per_pixel == 1 711 + && photometric < 2) 712 + { 713 + type = GG_PIXEL_PALETTE; 714 + max_palette = 2; 715 + if (photometric == PHOTOMETRIC_MINISWHITE) 716 + { 717 + red[0] = 255; 718 + green[0] = 255; 719 + blue[0] = 255; 720 + red[1] = 0; 721 + green[1] = 0; 722 + blue[1] = 0; 723 + } 724 + else 725 + { 726 + red[0] = 0; 727 + green[0] = 0; 728 + blue[0] = 0; 729 + red[1] = 255; 730 + green[1] = 255; 731 + blue[1] = 255; 732 + } 733 + } 734 + else if (bits_per_sample == 8 && samples_per_pixel == 1 735 + && photometric == 3) 736 + { 737 + uint16 *plt_red; 738 + uint16 *plt_green; 739 + uint16 *plt_blue; 740 + type = GG_PIXEL_PALETTE; 741 + TIFFGetField (in, TIFFTAG_COLORMAP, &plt_red, &plt_green, 742 + &plt_blue); 743 + max_palette = 256; 744 + for (i = 0; i < max_palette; i++) 745 + { 746 + if (plt_red[i] < 256) 747 + red[i] = plt_red[i]; 748 + else 749 + red[i] = plt_red[i] / 256; 750 + if (plt_green[i] < 256) 751 + green[i] = plt_green[i]; 752 + else 753 + green[i] = plt_green[i] / 256; 754 + if (plt_blue[i] < 256) 755 + blue[i] = plt_blue[i]; 756 + else 757 + blue[i] = plt_blue[i] / 256; 758 + } 759 + } 760 + else if (bits_per_sample == 8 && samples_per_pixel == 1 761 + && photometric < 2) 762 + type = GG_PIXEL_GRAYSCALE; 763 + else if (bits_per_sample == 8 && samples_per_pixel == 3) 764 + type = GG_PIXEL_RGB; 765 + else 766 + type = GG_PIXEL_UNKNOWN; 767 + } 768 + else if (samples_per_pixel == 1) 769 + type = GG_PIXEL_GRID; 770 + else 771 + type = GG_PIXEL_UNKNOWN; 772 + } 773 + else 774 + type = GG_PIXEL_UNKNOWN; 775 + switch (sample_format) 776 + { 777 + case SAMPLEFORMAT_UINT: 778 + gg_sample_format = GGRAPH_SAMPLE_UINT; 779 + break; 780 + case SAMPLEFORMAT_INT: 781 + gg_sample_format = GGRAPH_SAMPLE_INT; 782 + break; 783 + case SAMPLEFORMAT_IEEEFP: 784 + gg_sample_format = GGRAPH_SAMPLE_FLOAT; 785 + break; 786 + default: 787 + gg_sample_format = GGRAPH_SAMPLE_UNKNOWN; 788 + break; 789 + }; 790 + 791 +/* computing the corners coords */ 792 + cx = 0.0; 793 + cy = 0.0; 794 + GTIFImageToPCS (gtif, &cx, &cy); 795 + upper_left_x = cx; 796 + upper_left_y = cy; 797 + cx = 0.0; 798 + cy = height; 799 + GTIFImageToPCS (gtif, &cx, &cy); 800 + lower_left_y = cy; 801 + cx = width; 802 + cy = 0.0; 803 + GTIFImageToPCS (gtif, &cx, &cy); 804 + upper_right_x = cx; 805 + cx = width; 806 + cy = height; 807 + GTIFImageToPCS (gtif, &cx, &cy); 808 +/* computing the pixel size */ 809 + pixel_x = (upper_right_x - upper_left_x) / (double) width; 810 + pixel_y = (upper_left_y - lower_left_y) / (double) height; 811 + 812 + infos = 813 + gg_image_infos_create (type, width, height, bits_per_sample, 814 + samples_per_pixel, gg_sample_format, srs_name, 815 + proj4text); 816 + if (!infos) 817 + return GGRAPH_INSUFFICIENT_MEMORY; 818 + if (is_tiled) 819 + { 820 + infos->tile_width = tile_width; 821 + infos->tile_height = tile_height; 822 + } 823 + else 824 + infos->rows_per_strip = rows_strip; 825 + switch (compression) 826 + { 827 + case COMPRESSION_NONE: 828 + infos->compression = GGRAPH_TIFF_COMPRESSION_NONE; 829 + break; 830 + case COMPRESSION_LZW: 831 + infos->compression = GGRAPH_TIFF_COMPRESSION_LZW; 832 + break; 833 + case COMPRESSION_DEFLATE: 834 + infos->compression = GGRAPH_TIFF_COMPRESSION_DEFLATE; 835 + break; 836 + case COMPRESSION_JPEG: 837 + infos->compression = GGRAPH_TIFF_COMPRESSION_JPEG; 838 + break; 839 + case COMPRESSION_CCITTFAX3: 840 + infos->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX3; 841 + break; 842 + case COMPRESSION_CCITTFAX4: 843 + infos->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX4; 844 + break; 845 + default: 846 + infos->compression = GGRAPH_TIFF_COMPRESSION_UNKNOWN; 847 + break; 848 + }; 849 + for (i = 0; i < max_palette; i++) 850 + { 851 + infos->palette_red[i] = red[i]; 852 + infos->palette_green[i] = green[i]; 853 + infos->palette_blue[i] = blue[i]; 854 + } 855 + infos->max_palette = max_palette; 856 + infos->is_georeferenced = 1; 857 + infos->srid = epsg; 858 + infos->upper_left_x = upper_left_x; 859 + infos->upper_left_y = upper_left_y; 860 + infos->pixel_x_size = pixel_x; 861 + infos->pixel_y_size = pixel_y; 862 + TIFFClose (in); 863 + GTIFFree (gtif); 864 + *infos_handle = infos; 865 + return GGRAPH_OK; 866 + 867 + error: 868 + XTIFFClose (in); 869 + if (gtif) 870 + GTIFFree (gtif); 871 + return GGRAPH_GEOTIFF_CODEC_ERROR; 872 +} 873 + 874 +static int 875 +common_read_from_tiff_grid (TIFF * in, gGraphImagePtr img, uint32 width, 876 + uint32 height, int is_tiled, int gg_sample_format, 877 + uint16 bits_per_sample, uint32 tile_width, 878 + uint32 tile_height, uint32 rows_strip) 879 +{ 880 +/* common utility: decoding a TIFF raster [GRID] */ 881 + unsigned char *raster = NULL; 882 + int x; 883 + int y; 884 + int i; 885 + int img_y; 886 + int strip_no; 887 + int effective_strip; 888 + int tile_x; 889 + int tile_y; 890 + unsigned char *p_in; 891 + unsigned char *p_out; 892 + int ret = GGRAPH_TIFF_CODEC_ERROR; 893 + 894 + if (is_tiled) 895 + { 896 + if (gg_sample_format == GGRAPH_SAMPLE_FLOAT) 897 + { 898 + if (bits_per_sample == 32) 899 + { 900 + /* float */ 901 + raster = malloc (4 * tile_width * tile_height); 902 + } 903 + else 904 + { 905 + /* double */ 906 + raster = malloc (8 * tile_width * tile_height); 907 + } 908 + } 909 + else 910 + { 911 + if (bits_per_sample == 8) 912 + { 913 + /* 8bit Int */ 914 + raster = malloc (tile_width * tile_height); 915 + } 916 + else if (bits_per_sample == 16) 917 + { 918 + /* 16bit Int */ 919 + raster = malloc (2 * tile_width * tile_height); 920 + } 921 + else 922 + { 923 + /* 32bit Int */ 924 + raster = malloc (4 * tile_width * tile_height); 925 + } 926 + } 927 + } 928 + else 929 + { 930 + if (gg_sample_format == GGRAPH_SAMPLE_FLOAT) 931 + { 932 + if (bits_per_sample == 32) 933 + { 934 + /* float */ 935 + raster = malloc (4 * width * rows_strip); 936 + } 937 + else 938 + { 939 + /* double */ 940 + raster = malloc (8 * width * rows_strip); 941 + } 942 + } 943 + else 944 + { 945 + if (bits_per_sample == 8) 946 + { 947 + /* 8bit Int */ 948 + raster = malloc (width * rows_strip); 949 + } 950 + else if (bits_per_sample == 16) 951 + { 952 + /* 16bit Int */ 953 + raster = malloc (2 * width * rows_strip); 954 + } 955 + else 956 + { 957 + /* 32bit Int */ 958 + raster = malloc (4 * width * rows_strip); 959 + } 960 + } 961 + } 962 + 963 + ret = GGRAPH_TIFF_CODEC_ERROR; 964 + if (is_tiled) 965 + { 966 + for (tile_y = 0; tile_y < (int) height; tile_y += tile_height) 967 + { 968 + /* scanning tiles by row */ 969 + for (tile_x = 0; tile_x < (int) width; tile_x += tile_width) 970 + { 971 + /* reading a TIFF tile */ 972 + if (!TIFFReadTile (in, raster, tile_x, tile_y, 0, 0)) 973 + goto error; 974 + for (y = 0; y < (int) tile_height; y++) 975 + { 976 + img_y = tile_y + y; 977 + if (img_y >= (int) height) 978 + continue; 979 + p_in = raster + (tile_width * y * img->pixel_size); 980 + p_out = 981 + img->pixels + (img_y * img->scanline_width) + 982 + (tile_x * img->pixel_size); 983 + for (x = 0; x < (int) tile_width; x++) 984 + { 985 + if (tile_x + x >= (int) width) 986 + break; 987 + for (i = 0; i < img->pixel_size; i++) 988 + *p_out++ = *p_in++; 989 + } 990 + } 991 + } 992 + } 993 + } 994 + else 995 + { 996 + for (strip_no = 0; strip_no < (int) height; strip_no += rows_strip) 997 + { 998 + /* reading a TIFF strip */ 999 + if (!TIFFReadScanline (in, raster, strip_no, 0)) 1000 + goto error; 1001 + effective_strip = rows_strip; 1002 + if ((strip_no + rows_strip) > height) 1003 + effective_strip = height - strip_no; 1004 + 1005 + for (y = 0; y < effective_strip; y++) 1006 + { 1007 + img_y = strip_no + y; 1008 + p_in = raster; 1009 + p_out = img->pixels + (img_y * img->scanline_width); 1010 + for (x = 0; x < (int) width; x++) 1011 + { 1012 + for (i = 0; i < img->pixel_size; i++) 1013 + *p_out++ = *p_in++; 1014 + } 1015 + } 1016 + } 1017 + } 1018 + free (raster); 1019 + return GGRAPH_OK; 1020 + 1021 + error: 1022 + if (raster) 1023 + free (raster); 1024 + return ret; 1025 +} 1026 + 1027 +static int 1028 +common_read_from_tiff (TIFF * in, gGraphImagePtr img, uint32 width, 1029 + uint32 height, int is_tiled, int type, 1030 + int gg_sample_format, uint16 bits_per_sample, 1031 + uint32 tile_width, uint32 tile_height, uint32 rows_strip) 1032 +{ 1033 +/* common utility: decoding a TIFF raster */ 1034 + uint32 *raster = NULL; 1035 + uint32 *scanline; 1036 + int x; 1037 + int y; 1038 + int img_y; 1039 + int strip_no; 1040 + int effective_strip; 1041 + uint32 pixel; 1042 + int tile_x; 1043 + int tile_y; 1044 + unsigned char red; 1045 + unsigned char green; 1046 + unsigned char blue; 1047 + unsigned char index; 1048 + unsigned char *p_out; 1049 + int ret = GGRAPH_TIFF_CODEC_ERROR; 1050 + 1051 + if (type == GG_PIXEL_GRID) 1052 + return common_read_from_tiff_grid (in, img, width, height, is_tiled, 1053 + gg_sample_format, bits_per_sample, 1054 + tile_width, tile_height, rows_strip); 1055 + 1056 +/* allocating read buffer [plain ordinary image] */ 1057 + if (is_tiled) 1058 + raster = malloc (sizeof (uint32) * tile_width * tile_height); 1059 + else 1060 + raster = malloc (sizeof (uint32) * width * rows_strip); 1061 + if (!raster) 1062 + { 1063 + gg_image_destroy (img); 1064 + ret = GGRAPH_INSUFFICIENT_MEMORY; 1065 + goto error; 1066 + } 1067 + 1068 + ret = GGRAPH_TIFF_CODEC_ERROR; 1069 + if (is_tiled) 1070 + { 1071 + for (tile_y = 0; tile_y < (int) height; tile_y += tile_height) 1072 + { 1073 + /* scanning tiles by row */ 1074 + for (tile_x = 0; tile_x < (int) width; tile_x += tile_width) 1075 + { 1076 + /* reading a TIFF tile */ 1077 + if (!TIFFReadRGBATile (in, tile_x, tile_y, raster)) 1078 + goto error; 1079 + for (y = 0; y < (int) tile_height; y++) 1080 + { 1081 + img_y = tile_y + (tile_height - y) - 1; 1082 + if (img_y >= (int) height) 1083 + continue; 1084 + scanline = raster + (tile_width * y); 1085 + for (x = 0; x < (int) tile_width; x++) 1086 + { 1087 + if (tile_x + x >= (int) width) 1088 + break; 1089 + p_out = 1090 + img->pixels + 1091 + (img_y * img->scanline_width) + 1092 + ((tile_x + x) * img->pixel_size); 1093 + pixel = scanline[x]; 1094 + red = TIFFGetR (pixel); 1095 + green = TIFFGetG (pixel); 1096 + blue = TIFFGetB (pixel); 1097 + if (img->pixel_format == GG_PIXEL_PALETTE) 1098 + { 1099 + /* PALETTE image */ 1100 + index = 1101 + gg_match_palette (img, red, green, 1102 + blue); 1103 + *p_out++ = index; 1104 + } 1105 + else if (img->pixel_format == 1106 + GG_PIXEL_GRAYSCALE) 1107 + { 1108 + /* GRAYSCALE image */ 1109 + *p_out++ = red; 1110 + } 1111 + else 1112 + { 1113 + /* should be an RGB image */ 1114 + *p_out++ = red; 1115 + *p_out++ = green; 1116 + *p_out++ = blue; 1117 + } 1118 + } 1119 + } 1120 + } 1121 + } 1122 + } 1123 + else 1124 + { 1125 + for (strip_no = 0; strip_no < (int) height; strip_no += rows_strip) 1126 + { 1127 + /* reading a TIFF strip */ 1128 + if (!TIFFReadRGBAStrip (in, strip_no, raster)) 1129 + goto error; 1130 + effective_strip = rows_strip; 1131 + if ((strip_no + rows_strip) > height) 1132 + effective_strip = height - strip_no; 1133 + 1134 + for (y = 0; y < effective_strip; y++) 1135 + { 1136 + img_y = strip_no + ((effective_strip - y) - 1); 1137 + scanline = raster + (width * y); 1138 + p_out = img->pixels + (img_y * img->scanline_width); 1139 + for (x = 0; x < (int) width; x++) 1140 + { 1141 + pixel = scanline[x]; 1142 + red = TIFFGetR (pixel); 1143 + green = TIFFGetG (pixel); 1144 + blue = TIFFGetB (pixel); 1145 + if (img->pixel_format == GG_PIXEL_PALETTE) 1146 + { 1147 + /* PALETTE image */ 1148 + index = 1149 + gg_match_palette (img, red, green, blue); 1150 + *p_out++ = index; 1151 + } 1152 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 1153 + { 1154 + /* GRAYSCALE image */ 1155 + *p_out++ = red; 1156 + } 1157 + else 1158 + { 1159 + /* should be an RGB image */ 1160 + *p_out++ = red; 1161 + *p_out++ = green; 1162 + *p_out++ = blue; 1163 + } 1164 + } 1165 + } 1166 + } 1167 + } 1168 + free (raster); 1169 + return GGRAPH_OK; 1170 + 1171 + error: 1172 + if (raster) 1173 + free (raster); 1174 + return ret; 1175 +} 1176 + 1177 +GGRAPH_PRIVATE int 1178 +gg_image_from_mem_tiff (int size, const void *data, 1179 + gGraphImagePtr * image_handle) 1180 +{ 1181 +/* decoding a TIFF (memory cached) */ 1182 + gGraphImagePtr img = NULL; 1183 + uint16 bits_per_sample; 1184 + uint16 samples_per_pixel; 1185 + uint16 photometric; 1186 + uint16 compression; 1187 + uint16 planar_config; 1188 + uint16 sample_format; 1189 + uint32 width = 0; 1190 + uint32 height = 0; 1191 + uint32 rows_strip = 0; 1192 + struct memfile clientdata; 1193 + int is_tiled; 1194 + uint32 tile_width; 1195 + uint32 tile_height; 1196 + int type; 1197 + int gg_sample_format; 1198 + int ret = GGRAPH_TIFF_CODEC_ERROR; 1199 + TIFF *in = (TIFF *) 0; 1200 + *image_handle = NULL; 1201 + 1202 +/* suppressing TIFF warnings */ 1203 + TIFFSetWarningHandler (NULL); 1204 + 1205 +/* reading from memory */ 1206 + clientdata.buffer = (unsigned char *) data; 1207 + clientdata.size = size; 1208 + clientdata.eof = size; 1209 + clientdata.current = 0; 1210 + in = TIFFClientOpen ("tiff", "r", &clientdata, memory_readproc, 1211 + memory_writeproc, memory_seekproc, closeproc, 1212 + memory_sizeproc, mapproc, unmapproc); 1213 + if (in == NULL) 1214 + return GGRAPH_TIFF_CODEC_ERROR; 1215 + is_tiled = TIFFIsTiled (in); 1216 +/* retrieving the TIFF dimensions */ 1217 + TIFFGetField (in, TIFFTAG_IMAGELENGTH, &height); 1218 + TIFFGetField (in, TIFFTAG_IMAGEWIDTH, &width); 1219 + if (is_tiled) 1220 + { 1221 + TIFFGetField (in, TIFFTAG_TILEWIDTH, &tile_width); 1222 + TIFFGetField (in, TIFFTAG_TILELENGTH, &tile_height); 1223 + } 1224 + else 1225 + TIFFGetField (in, TIFFTAG_ROWSPERSTRIP, &rows_strip); 1226 + TIFFGetField (in, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); 1227 + if (TIFFGetField (in, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel) == 0) 1228 + { 1229 + /* attempting to recover badly formatted TIFFs */ 1230 + samples_per_pixel = 1; 1231 + } 1232 + TIFFGetField (in, TIFFTAG_PHOTOMETRIC, &photometric); 1233 + TIFFGetField (in, TIFFTAG_COMPRESSION, &compression); 1234 + if (TIFFGetField (in, TIFFTAG_PLANARCONFIG, &planar_config) == 0) 1235 + { 1236 + /* attempting to recover badly formatted TIFFs */ 1237 + planar_config = PLANARCONFIG_CONTIG; 1238 + } 1239 + if (TIFFGetField (in, TIFFTAG_SAMPLEFORMAT, &sample_format) == 0) 1240 + sample_format = SAMPLEFORMAT_UINT; 1241 + if (planar_config == PLANARCONFIG_CONTIG) 1242 + { 1243 + if (sample_format == SAMPLEFORMAT_UINT) 1244 + { 1245 + if (bits_per_sample == 1 && samples_per_pixel == 1) 1246 + type = GG_PIXEL_PALETTE; 1247 + else if (bits_per_sample == 8 && samples_per_pixel == 1 1248 + && photometric == 3) 1249 + type = GG_PIXEL_PALETTE; 1250 + else if (bits_per_sample == 8 && samples_per_pixel == 1 1251 + && photometric < 2) 1252 + type = GG_PIXEL_GRAYSCALE; 1253 + else if (bits_per_sample == 8 && samples_per_pixel == 3) 1254 + type = GG_PIXEL_RGB; 1255 + else 1256 + type = GG_PIXEL_UNKNOWN; 1257 + } 1258 + else if (samples_per_pixel == 1) 1259 + type = GG_PIXEL_GRID; 1260 + else 1261 + type = GG_PIXEL_UNKNOWN; 1262 + } 1263 + else 1264 + type = GG_PIXEL_UNKNOWN; 1265 + switch (sample_format) 1266 + { 1267 + case SAMPLEFORMAT_UINT: 1268 + gg_sample_format = GGRAPH_SAMPLE_UINT; 1269 + break; 1270 + case SAMPLEFORMAT_INT: 1271 + gg_sample_format = GGRAPH_SAMPLE_INT; 1272 + break; 1273 + case SAMPLEFORMAT_IEEEFP: 1274 + gg_sample_format = GGRAPH_SAMPLE_FLOAT; 1275 + break; 1276 + default: 1277 + gg_sample_format = GGRAPH_SAMPLE_UNKNOWN; 1278 + break; 1279 + }; 1280 + if (type == GG_PIXEL_UNKNOWN) 1281 + { 1282 + ret = GGRAPH_UNSUPPORTED_TIFF_LAYOUT; 1283 + goto error; 1284 + } 1285 + 1286 + img = 1287 + gg_image_create (type, width, height, bits_per_sample, 1288 + samples_per_pixel, gg_sample_format, NULL, NULL); 1289 + if (!img) 1290 + { 1291 + ret = GGRAPH_INSUFFICIENT_MEMORY; 1292 + goto error; 1293 + } 1294 + if (is_tiled) 1295 + { 1296 + img->tile_width = tile_width; 1297 + img->tile_height = tile_height; 1298 + } 1299 + else 1300 + img->rows_per_strip = rows_strip; 1301 + switch (compression) 1302 + { 1303 + case COMPRESSION_NONE: 1304 + img->compression = GGRAPH_TIFF_COMPRESSION_NONE; 1305 + break; 1306 + case COMPRESSION_LZW: 1307 + img->compression = GGRAPH_TIFF_COMPRESSION_LZW; 1308 + break; 1309 + case COMPRESSION_DEFLATE: 1310 + img->compression = GGRAPH_TIFF_COMPRESSION_DEFLATE; 1311 + break; 1312 + case COMPRESSION_JPEG: 1313 + img->compression = GGRAPH_TIFF_COMPRESSION_JPEG; 1314 + break; 1315 + case COMPRESSION_CCITTFAX3: 1316 + img->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX3; 1317 + break; 1318 + case COMPRESSION_CCITTFAX4: 1319 + img->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX4; 1320 + break; 1321 + default: 1322 + img->compression = GGRAPH_TIFF_COMPRESSION_UNKNOWN; 1323 + break; 1324 + }; 1325 + 1326 + ret = 1327 + common_read_from_tiff (in, img, width, height, is_tiled, type, 1328 + gg_sample_format, bits_per_sample, tile_width, 1329 + tile_height, rows_strip); 1330 + if (ret != GGRAPH_OK) 1331 + goto error; 1332 + 1333 + TIFFClose (in); 1334 + *image_handle = img; 1335 + return GGRAPH_OK; 1336 + 1337 + error: 1338 + TIFFClose (in); 1339 + if (img) 1340 + gGraphDestroyImage (img); 1341 + return ret; 1342 +} 1343 + 1344 +GGRAPH_PRIVATE int 1345 +gg_image_strip_prepare_from_tiff (const char *path, 1346 + gGraphStripImagePtr * image_handle) 1347 +{ 1348 +/* preparing to decode a TIFF [by meta-strips] */ 1349 + gGraphStripImagePtr img = NULL; 1350 + uint16 bits_per_sample; 1351 + uint16 samples_per_pixel; 1352 + uint16 photometric; 1353 + uint16 compression; 1354 + uint16 planar_config; 1355 + uint16 sample_format; 1356 + uint32 width = 0; 1357 + uint32 height = 0; 1358 + uint32 rows_strip = 0; 1359 + int is_tiled; 1360 + uint32 tile_width; 1361 + uint32 tile_height; 1362 + int type; 1363 + int gg_sample_format; 1364 + struct tiff_codec_data *tiff_codec = NULL; 1365 + tsize_t buf_size; 1366 + void *tiff_buffer = NULL; 1367 + int ret = GGRAPH_TIFF_CODEC_ERROR; 1368 + TIFF *in = (TIFF *) 0; 1369 + *image_handle = NULL; 1370 + 1371 +/* suppressing TIFF warnings */ 1372 + TIFFSetWarningHandler (NULL); 1373 + 1374 +/* reading from file */ 1375 + in = TIFFOpen (path, "r"); 1376 + if (in == NULL) 1377 + return GGRAPH_TIFF_CODEC_ERROR; 1378 + is_tiled = TIFFIsTiled (in); 1379 +/* retrieving the TIFF dimensions */ 1380 + TIFFGetField (in, TIFFTAG_IMAGELENGTH, &height); 1381 + TIFFGetField (in, TIFFTAG_IMAGEWIDTH, &width); 1382 + if (is_tiled) 1383 + { 1384 + TIFFGetField (in, TIFFTAG_TILEWIDTH, &tile_width); 1385 + TIFFGetField (in, TIFFTAG_TILELENGTH, &tile_height); 1386 + } 1387 + else 1388 + TIFFGetField (in, TIFFTAG_ROWSPERSTRIP, &rows_strip); 1389 + TIFFGetField (in, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); 1390 + if (TIFFGetField (in, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel) == 0) 1391 + { 1392 + /* attempting to recover badly formatted TIFFs */ 1393 + samples_per_pixel = 1; 1394 + } 1395 + TIFFGetField (in, TIFFTAG_PHOTOMETRIC, &photometric); 1396 + TIFFGetField (in, TIFFTAG_COMPRESSION, &compression); 1397 + if (TIFFGetField (in, TIFFTAG_PLANARCONFIG, &planar_config) == 0) 1398 + { 1399 + /* attempting to recover badly formatted TIFFs */ 1400 + planar_config = PLANARCONFIG_CONTIG; 1401 + } 1402 + if (TIFFGetField (in, TIFFTAG_SAMPLEFORMAT, &sample_format) == 0) 1403 + sample_format = SAMPLEFORMAT_UINT; 1404 + if (planar_config == PLANARCONFIG_CONTIG) 1405 + { 1406 + if (sample_format == SAMPLEFORMAT_UINT) 1407 + { 1408 + if (bits_per_sample == 1 && samples_per_pixel == 1) 1409 + type = GG_PIXEL_PALETTE; 1410 + else if (bits_per_sample == 8 && samples_per_pixel == 1 1411 + && photometric == 3) 1412 + type = GG_PIXEL_PALETTE; 1413 + else if (bits_per_sample == 8 && samples_per_pixel == 1 1414 + && photometric < 2) 1415 + type = GG_PIXEL_GRAYSCALE; 1416 + else if (bits_per_sample == 8 && samples_per_pixel == 3) 1417 + type = GG_PIXEL_RGB; 1418 + else 1419 + type = GG_PIXEL_UNKNOWN; 1420 + } 1421 + else if (samples_per_pixel == 1) 1422 + type = GG_PIXEL_GRID; 1423 + else 1424 + type = GG_PIXEL_UNKNOWN; 1425 + } 1426 + else 1427 + type = GG_PIXEL_UNKNOWN; 1428 + switch (sample_format) 1429 + { 1430 + case SAMPLEFORMAT_UINT: 1431 + gg_sample_format = GGRAPH_SAMPLE_UINT; 1432 + break; 1433 + case SAMPLEFORMAT_INT: 1434 + gg_sample_format = GGRAPH_SAMPLE_INT; 1435 + break; 1436 + case SAMPLEFORMAT_IEEEFP: 1437 + gg_sample_format = GGRAPH_SAMPLE_FLOAT; 1438 + break; 1439 + default: 1440 + gg_sample_format = GGRAPH_SAMPLE_UNKNOWN; 1441 + break; 1442 + }; 1443 + if (type == GG_PIXEL_UNKNOWN) 1444 + { 1445 + ret = GGRAPH_UNSUPPORTED_TIFF_LAYOUT; 1446 + goto error; 1447 + } 1448 + 1449 + img = 1450 + gg_strip_image_create (NULL, GGRAPH_IMAGE_TIFF, type, width, height, 1451 + bits_per_sample, samples_per_pixel, 1452 + gg_sample_format, NULL, NULL); 1453 + if (!img) 1454 + { 1455 + ret = GGRAPH_INSUFFICIENT_MEMORY; 1456 + goto error; 1457 + } 1458 + if (is_tiled) 1459 + { 1460 + img->tile_width = tile_width; 1461 + img->tile_height = tile_height; 1462 + } 1463 + else 1464 + img->rows_per_strip = rows_strip; 1465 + switch (compression) 1466 + { 1467 + case COMPRESSION_NONE: 1468 + img->compression = GGRAPH_TIFF_COMPRESSION_NONE; 1469 + break; 1470 + case COMPRESSION_LZW: 1471 + img->compression = GGRAPH_TIFF_COMPRESSION_LZW; 1472 + break; 1473 + case COMPRESSION_DEFLATE: 1474 + img->compression = GGRAPH_TIFF_COMPRESSION_DEFLATE; 1475 + break; 1476 + case COMPRESSION_JPEG: 1477 + img->compression = GGRAPH_TIFF_COMPRESSION_JPEG; 1478 + break; 1479 + case COMPRESSION_CCITTFAX3: 1480 + img->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX3; 1481 + break; 1482 + case COMPRESSION_CCITTFAX4: 1483 + img->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX4; 1484 + break; 1485 + default: 1486 + img->compression = GGRAPH_TIFF_COMPRESSION_UNKNOWN; 1487 + break; 1488 + }; 1489 + if (photometric == PHOTOMETRIC_PALETTE) 1490 + { 1491 + /* populating the palette */ 1492 + int i; 1493 + uint16 *red; 1494 + uint16 *green; 1495 + uint16 *blue; 1496 + TIFFGetField (in, TIFFTAG_COLORMAP, &red, &green, &blue); 1497 + switch (bits_per_sample) 1498 + { 1499 + case 1: 1500 + img->max_palette = 2; 1501 + break; 1502 + case 2: 1503 + img->max_palette = 4; 1504 + break; 1505 + case 3: 1506 + img->max_palette = 8; 1507 + break; 1508 + case 4: 1509 + img->max_palette = 16; 1510 + break; 1511 + case 5: 1512 + img->max_palette = 32; 1513 + break; 1514 + case 6: 1515 + img->max_palette = 64; 1516 + break; 1517 + case 7: 1518 + img->max_palette = 128; 1519 + break; 1520 + default: 1521 + img->max_palette = 256; 1522 + break; 1523 + }; 1524 + for (i = 0; i < img->max_palette; i++) 1525 + { 1526 + unsigned char r; 1527 + unsigned char g; 1528 + unsigned char b; 1529 + if (red[i] < 256) 1530 + r = red[i]; 1531 + else 1532 + r = red[i] / 256; 1533 + if (green[i] < 256) 1534 + g = green[i]; 1535 + else 1536 + g = green[i] / 256; 1537 + if (blue[i] < 256) 1538 + b = blue[i]; 1539 + else 1540 + b = blue[i] / 256; 1541 + img->palette_red[i] = r; 1542 + img->palette_green[i] = g; 1543 + img->palette_blue[i] = b; 1544 + } 1545 + } 1546 + if (bits_per_sample == 1 && img->max_palette == 0) 1547 + { 1548 + /* populating a monochrome palette */ 1549 + if (photometric == PHOTOMETRIC_MINISBLACK) 1550 + { 1551 + img->palette_red[0] = 0; 1552 + img->palette_green[0] = 0; 1553 + img->palette_blue[0] = 0; 1554 + img->palette_red[1] = 255; 1555 + img->palette_green[1] = 255; 1556 + img->palette_blue[1] = 255; 1557 + img->max_palette = 2; 1558 + } 1559 + else 1560 + { 1561 + img->palette_red[0] = 255; 1562 + img->palette_green[0] = 255; 1563 + img->palette_blue[0] = 255; 1564 + img->palette_red[1] = 0; 1565 + img->palette_green[1] = 0; 1566 + img->palette_blue[1] = 0; 1567 + img->max_palette = 2; 1568 + } 1569 + } 1570 + 1571 +/* setting up the TIFF codec struct */ 1572 + tiff_codec = malloc (sizeof (struct tiff_codec_data)); 1573 + if (!tiff_codec) 1574 + goto error; 1575 + tiff_codec->is_geotiff = 0; 1576 + tiff_codec->is_writer = 0; 1577 + tiff_codec->tiff_handle = in; 1578 + tiff_codec->geotiff_handle = (GTIF *) 0; 1579 + tiff_codec->tiff_buffer = NULL; 1580 + tiff_codec->is_tiled = is_tiled; 1581 + img->codec_data = tiff_codec; 1582 + 1583 +/* allocating the TIFF read buffer */ 1584 + if (type == GG_PIXEL_GRID) 1585 + { 1586 + if (is_tiled) 1587 + buf_size = TIFFTileSize (in); 1588 + else 1589 + buf_size = TIFFScanlineSize (in); 1590 + } 1591 + else 1592 + { 1593 + if (is_tiled) 1594 + buf_size = sizeof (uint32) * tile_width * tile_height; 1595 + else 1596 + buf_size = sizeof (uint32) * width * rows_strip; 1597 + } 1598 + tiff_buffer = malloc (buf_size); 1599 + if (!tiff_buffer) 1600 + goto error; 1601 + tiff_codec->tiff_buffer = tiff_buffer; 1602 + 1603 + *image_handle = img; 1604 + return GGRAPH_OK; 1605 + 1606 + error: 1607 + TIFFClose (in); 1608 + if (img) 1609 + gGraphDestroyImage (img); 1610 + return ret; 1611 +} 1612 + 1613 +GGRAPH_PRIVATE int 1614 +gg_image_strip_prepare_from_geotiff (const char *path, 1615 + gGraphStripImagePtr * image_handle) 1616 +{ 1617 +/* preparing to decode a GeoTIFF [by meta-strips] */ 1618 + gGraphStripImagePtr img = NULL; 1619 + uint16 bits_per_sample; 1620 + uint16 samples_per_pixel; 1621 + uint16 photometric; 1622 + uint16 compression; 1623 + uint16 planar_config; 1624 + uint16 sample_format; 1625 + uint32 width = 0; 1626 + uint32 height = 0; 1627 + uint32 rows_strip = 0; 1628 + int is_tiled; 1629 + uint32 tile_width; 1630 + uint32 tile_height; 1631 + int type; 1632 + int gg_sample_format; 1633 + int epsg = -1; 1634 + double cx; 1635 + double cy; 1636 + double upper_left_x; 1637 + double upper_left_y; 1638 + double upper_right_x; 1639 + double lower_left_y; 1640 + double pixel_x; 1641 + double pixel_y; 1642 + char srs_name[1024]; 1643 + char proj4text[1024]; 1644 + struct tiff_codec_data *tiff_codec = NULL; 1645 + tsize_t buf_size; 1646 + void *tiff_buffer = NULL; 1647 + int ret = GGRAPH_TIFF_CODEC_ERROR; 1648 + TIFF *in = (TIFF *) 0; 1649 + GTIF *gtif = (GTIF *) 0; 1650 + GTIFDefn definition; 1651 + *image_handle = NULL; 1652 + 1653 +/* suppressing TIFF warnings */ 1654 + TIFFSetWarningHandler (NULL); 1655 + 1656 +/* reading from file */ 1657 + in = XTIFFOpen (path, "r"); 1658 + if (in == NULL) 1659 + return GGRAPH_GEOTIFF_CODEC_ERROR; 1660 + gtif = GTIFNew (in); 1661 + if (gtif == NULL) 1662 + goto error; 1663 + 1664 + if (!GTIFGetDefn (gtif, &definition)) 1665 + goto error; 1666 + 1667 +/* retrieving the EPSG code */ 1668 + if (definition.PCS == 32767) 1669 + { 1670 + if (definition.GCS != 32767) 1671 + epsg = definition.GCS; 1672 + } 1673 + else 1674 + epsg = definition.PCS; 1675 + *srs_name = '\0'; 1676 + if (definition.PCS == 32767) 1677 + { 1678 + /* Get the GCS name if possible */ 1679 + char *pszName = NULL; 1680 + GTIFGetGCSInfo (definition.GCS, &pszName, NULL, NULL, NULL); 1681 + if (pszName != NULL) 1682 + strcpy (srs_name, pszName); 1683 + CPLFree (pszName); 1684 + } 1685 + else 1686 + { 1687 + /* Get the PCS name if possible */ 1688 + char *pszPCSName = NULL; 1689 + GTIFGetPCSInfo (definition.PCS, &pszPCSName, NULL, NULL, NULL); 1690 + if (pszPCSName != NULL) 1691 + strcpy (srs_name, pszPCSName); 1692 + CPLFree (pszPCSName); 1693 + } 1694 +/* retrieving the PROJ.4 params */ 1695 + strcpy (proj4text, GTIFGetProj4Defn (&definition)); 1696 + 1697 + is_tiled = TIFFIsTiled (in); 1698 +/* retrieving the TIFF dimensions */ 1699 + TIFFGetField (in, TIFFTAG_IMAGELENGTH, &height); 1700 + TIFFGetField (in, TIFFTAG_IMAGEWIDTH, &width); 1701 + if (is_tiled) 1702 + { 1703 + TIFFGetField (in, TIFFTAG_TILEWIDTH, &tile_width); 1704 + TIFFGetField (in, TIFFTAG_TILELENGTH, &tile_height); 1705 + } 1706 + else 1707 + TIFFGetField (in, TIFFTAG_ROWSPERSTRIP, &rows_strip); 1708 + TIFFGetField (in, TIFFTAG_BITSPERSAMPLE, &bits_per_sample); 1709 + if (TIFFGetField (in, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel) == 0) 1710 + { 1711 + /* attempting to recover badly formatted TIFFs */ 1712 + samples_per_pixel = 1; 1713 + } 1714 + TIFFGetField (in, TIFFTAG_PHOTOMETRIC, &photometric); 1715 + TIFFGetField (in, TIFFTAG_COMPRESSION, &compression); 1716 + if (TIFFGetField (in, TIFFTAG_PLANARCONFIG, &planar_config) == 0) 1717 + { 1718 + /* attempting to recover badly formatted TIFFs */ 1719 + planar_config = PLANARCONFIG_CONTIG; 1720 + } 1721 + if (TIFFGetField (in, TIFFTAG_SAMPLEFORMAT, &sample_format) == 0) 1722 + sample_format = SAMPLEFORMAT_UINT; 1723 + if (planar_config == PLANARCONFIG_CONTIG) 1724 + { 1725 + if (sample_format == SAMPLEFORMAT_UINT) 1726 + { 1727 + if (bits_per_sample == 1 && samples_per_pixel == 1) 1728 + type = GG_PIXEL_PALETTE; 1729 + else if (bits_per_sample == 8 && samples_per_pixel == 1 1730 + && photometric == 3) 1731 + type = GG_PIXEL_PALETTE; 1732 + else if (bits_per_sample == 8 && samples_per_pixel == 1 1733 + && photometric < 2) 1734 + type = GG_PIXEL_GRAYSCALE; 1735 + else if (bits_per_sample == 8 && samples_per_pixel == 3) 1736 + type = GG_PIXEL_RGB; 1737 + else 1738 + type = GG_PIXEL_UNKNOWN; 1739 + } 1740 + else if (samples_per_pixel == 1) 1741 + type = GG_PIXEL_GRID; 1742 + else 1743 + type = GG_PIXEL_UNKNOWN; 1744 + } 1745 + else 1746 + type = GG_PIXEL_UNKNOWN; 1747 + switch (sample_format) 1748 + { 1749 + case SAMPLEFORMAT_UINT: 1750 + gg_sample_format = GGRAPH_SAMPLE_UINT; 1751 + break; 1752 + case SAMPLEFORMAT_INT: 1753 + gg_sample_format = GGRAPH_SAMPLE_INT; 1754 + break; 1755 + case SAMPLEFORMAT_IEEEFP: 1756 + gg_sample_format = GGRAPH_SAMPLE_FLOAT; 1757 + break; 1758 + default: 1759 + gg_sample_format = GGRAPH_SAMPLE_UNKNOWN; 1760 + break; 1761 + }; 1762 + 1763 +/* computing the corners coords */ 1764 + cx = 0.0; 1765 + cy = 0.0; 1766 + GTIFImageToPCS (gtif, &cx, &cy); 1767 + upper_left_x = cx; 1768 + upper_left_y = cy; 1769 + cx = 0.0; 1770 + cy = height; 1771 + GTIFImageToPCS (gtif, &cx, &cy); 1772 + lower_left_y = cy; 1773 + cx = width; 1774 + cy = 0.0; 1775 + GTIFImageToPCS (gtif, &cx, &cy); 1776 + upper_right_x = cx; 1777 + cx = width; 1778 + cy = height; 1779 + GTIFImageToPCS (gtif, &cx, &cy); 1780 +/* computing the pixel size */ 1781 + pixel_x = (upper_right_x - upper_left_x) / (double) width; 1782 + pixel_y = (upper_left_y - lower_left_y) / (double) height; 1783 + if (type == GG_PIXEL_UNKNOWN) 1784 + { 1785 + ret = GGRAPH_UNSUPPORTED_TIFF_LAYOUT; 1786 + goto error; 1787 + } 1788 + 1789 + img = 1790 + gg_strip_image_create (NULL, GGRAPH_IMAGE_TIFF, type, width, height, 1791 + bits_per_sample, samples_per_pixel, 1792 + gg_sample_format, srs_name, proj4text); 1793 + if (!img) 1794 + { 1795 + ret = GGRAPH_INSUFFICIENT_MEMORY; 1796 + goto error; 1797 + } 1798 + if (is_tiled) 1799 + { 1800 + img->tile_width = tile_width; 1801 + img->tile_height = tile_height; 1802 + } 1803 + else 1804 + img->rows_per_strip = rows_strip; 1805 + img->is_georeferenced = 1; 1806 + img->srid = epsg; 1807 + img->upper_left_x = upper_left_x; 1808 + img->upper_left_y = upper_left_y; 1809 + img->pixel_x_size = pixel_x; 1810 + img->pixel_y_size = pixel_y; 1811 + switch (compression) 1812 + { 1813 + case COMPRESSION_NONE: 1814 + img->compression = GGRAPH_TIFF_COMPRESSION_NONE; 1815 + break; 1816 + case COMPRESSION_LZW: 1817 + img->compression = GGRAPH_TIFF_COMPRESSION_LZW; 1818 + break; 1819 + case COMPRESSION_DEFLATE: 1820 + img->compression = GGRAPH_TIFF_COMPRESSION_DEFLATE; 1821 + break; 1822 + case COMPRESSION_JPEG: 1823 + img->compression = GGRAPH_TIFF_COMPRESSION_JPEG; 1824 + break; 1825 + case COMPRESSION_CCITTFAX3: 1826 + img->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX3; 1827 + break; 1828 + case COMPRESSION_CCITTFAX4: 1829 + img->compression = GGRAPH_TIFF_COMPRESSION_CCITTFAX4; 1830 + break; 1831 + default: 1832 + img->compression = GGRAPH_TIFF_COMPRESSION_UNKNOWN; 1833 + break; 1834 + }; 1835 + if (photometric == PHOTOMETRIC_PALETTE) 1836 + { 1837 + /* populating the palette */ 1838 + int i; 1839 + uint16 *red; 1840 + uint16 *green; 1841 + uint16 *blue; 1842 + TIFFGetField (in, TIFFTAG_COLORMAP, &red, &green, &blue); 1843 + switch (bits_per_sample) 1844 + { 1845 + case 2: 1846 + img->max_palette = 4; 1847 + break; 1848 + case 3: 1849 + img->max_palette = 8; 1850 + break; 1851 + case 4: 1852 + img->max_palette = 16; 1853 + break; 1854 + case 5: 1855 + img->max_palette = 32; 1856 + break; 1857 + case 6: 1858 + img->max_palette = 64; 1859 + break; 1860 + case 7: 1861 + img->max_palette = 128; 1862 + break; 1863 + default: 1864 + img->max_palette = 256; 1865 + break; 1866 + }; 1867 + for (i = 0; i < img->max_palette; i++) 1868 + { 1869 + unsigned char r; 1870 + unsigned char g; 1871 + unsigned char b; 1872 + if (red[i] < 256) 1873 + r = red[i]; 1874 + else 1875 + r = red[i] / 256; 1876 + if (green[i] < 256) 1877 + g = green[i]; 1878 + else 1879 + g = green[i] / 256; 1880 + if (blue[i] < 256) 1881 + b = blue[i]; 1882 + else 1883 + b = blue[i] / 256; 1884 + img->palette_red[i] = r; 1885 + img->palette_green[i] = g; 1886 + img->palette_blue[i] = b; 1887 + } 1888 + } 1889 + if (bits_per_sample == 1 && img->max_palette == 0) 1890 + { 1891 + /* populating a monochrome palette */ 1892 + if (photometric == PHOTOMETRIC_MINISBLACK) 1893 + { 1894 + img->palette_red[0] = 0; 1895 + img->palette_green[0] = 0; 1896 + img->palette_blue[0] = 0; 1897 + img->palette_red[1] = 255; 1898 + img->palette_green[1] = 255; 1899 + img->palette_blue[1] = 255; 1900 + img->max_palette = 2; 1901 + } 1902 + else 1903 + { 1904 + img->palette_red[0] = 255; 1905 + img->palette_green[0] = 255; 1906 + img->palette_blue[0] = 255; 1907 + img->palette_red[1] = 0; 1908 + img->palette_green[1] = 0; 1909 + img->palette_blue[1] = 0; 1910 + img->max_palette = 2; 1911 + } 1912 + } 1913 + 1914 +/* setting up the TIFF codec struct */ 1915 + tiff_codec = malloc (sizeof (struct tiff_codec_data)); 1916 + if (!tiff_codec) 1917 + goto error; 1918 + tiff_codec->is_geotiff = 1; 1919 + tiff_codec->is_writer = 0; 1920 + tiff_codec->tiff_handle = in; 1921 + tiff_codec->geotiff_handle = gtif; 1922 + tiff_codec->tiff_buffer = NULL; 1923 + tiff_codec->is_tiled = is_tiled; 1924 + img->codec_data = tiff_codec; 1925 + 1926 +/* allocating the TIFF read buffer */ 1927 + if (type == GG_PIXEL_GRID) 1928 + { 1929 + if (is_tiled) 1930 + buf_size = TIFFTileSize (in); 1931 + else 1932 + buf_size = TIFFScanlineSize (in); 1933 + } 1934 + else 1935 + { 1936 + if (is_tiled) 1937 + buf_size = sizeof (uint32) * tile_width * tile_height; 1938 + else 1939 + buf_size = sizeof (uint32) * width * rows_strip; 1940 + } 1941 + tiff_buffer = malloc (buf_size); 1942 + if (!tiff_buffer) 1943 + goto error; 1944 + tiff_codec->tiff_buffer = tiff_buffer; 1945 + 1946 + *image_handle = img; 1947 + return GGRAPH_OK; 1948 + 1949 + error: 1950 + XTIFFClose (in); 1951 + if (gtif) 1952 + GTIFFree (gtif); 1953 + if (img) 1954 + gGraphDestroyImage (img); 1955 + return ret; 1956 +} 1957 + 1958 +GGRAPH_PRIVATE void 1959 +gg_tiff_codec_destroy (void *p) 1960 +{ 1961 +/* destroyng the TIFF codec data */ 1962 + struct tiff_codec_data *codec = (struct tiff_codec_data *) p; 1963 + if (!codec) 1964 + return; 1965 + if (codec->is_geotiff) 1966 + { 1967 + XTIFFClose (codec->tiff_handle); 1968 + GTIFFree (codec->geotiff_handle); 1969 + } 1970 + else 1971 + TIFFClose (codec->tiff_handle); 1972 + if (codec->tiff_buffer) 1973 + free (codec->tiff_buffer); 1974 + free (codec); 1975 +} 1976 + 1977 +static int 1978 +common_strip_read_from_tiff_grid (TIFF * in, void *tiff_buffer, 1979 + gGraphStripImagePtr img, uint32 width, 1980 + uint32 height, int is_tiled, 1981 + uint32 tile_width, uint32 tile_height) 1982 +{ 1983 +/* common utility: decoding a TIFF raster [GRID] by meta-strip */ 1984 + void *raster = tiff_buffer; 1985 + int x; 1986 + int y; 1987 + int strip_no; 1988 + int tile_x; 1989 + int tile_y; 1990 + char *p_in_int8; 1991 + char *p_out_int8; 1992 + unsigned char *p_in_uint8; 1993 + unsigned char *p_out_uint8; 1994 + short *p_in_int16; 1995 + short *p_out_int16; 1996 + unsigned short *p_in_uint16; 1997 + unsigned short *p_out_uint16; 1998 + int *p_in_int32; 1999 + int *p_out_int32; 2000 + unsigned int *p_in_uint32; 2001 + unsigned int *p_out_uint32; 2002 + float *p_in_flt; 2003 + float *p_out_flt; 2004 + double *p_in_dbl; 2005 + double *p_out_dbl; 2006 + int begin_row = img->next_row; 2007 + int end_row = img->next_row + img->rows_per_block; 2008 + 2009 + if (end_row > img->height) 2010 + end_row = img->height; 2011 + 2012 + if (is_tiled) 2013 + { 2014 + for (tile_y = 0; tile_y < (int) height; tile_y += tile_height) 2015 + { 2016 + /* scanning tiles by row */ 2017 + if ((tile_y + tile_height) <= (uint32) begin_row) 2018 + continue; 2019 + if (tile_y >= end_row) 2020 + break; 2021 + for (tile_x = 0; tile_x < (int) width; tile_x += tile_width) 2022 + { 2023 + /* reading a TIFF tile */ 2024 + if (!TIFFReadTile (in, raster, tile_x, tile_y, 0, 0)) 2025 + return GGRAPH_TIFF_CODEC_ERROR; 2026 + for (y = 0; y < (int) tile_height; y++) 2027 + { 2028 + if ((tile_y + y) < begin_row) 2029 + continue; 2030 + if ((tile_y + y) >= end_row) 2031 + continue; 2032 + switch (img->sample_format) 2033 + { 2034 + case GGRAPH_SAMPLE_INT: 2035 + switch (img->bits_per_sample) 2036 + { 2037 + case 8: 2038 + p_in_int8 = raster; 2039 + p_in_int8 += y * tile_width; 2040 + break; 2041 + case 16: 2042 + p_in_int16 = raster; 2043 + p_in_int16 += y * tile_width; 2044 + break; 2045 + case 32: 2046 + p_in_int32 = raster; 2047 + p_in_int32 += y * tile_width; 2048 + break; 2049 + }; 2050 + break; 2051 + case GGRAPH_SAMPLE_UINT: 2052 + switch (img->bits_per_sample) 2053 + { 2054 + case 8: 2055 + p_in_uint8 = raster; 2056 + p_in_uint8 += y * tile_width; 2057 + break; 2058 + case 16: 2059 + p_in_uint16 = raster; 2060 + p_in_uint16 += y * tile_width; 2061 + break; 2062 + case 32: 2063 + p_in_uint32 = raster; 2064 + p_in_uint32 += y * tile_width; 2065 + break; 2066 + }; 2067 + break; 2068 + case GGRAPH_SAMPLE_FLOAT: 2069 + switch (img->bits_per_sample) 2070 + { 2071 + case 32: 2072 + p_in_flt = raster; 2073 + p_in_flt += y * tile_width; 2074 + break; 2075 + case 64: 2076 + p_in_dbl = raster; 2077 + p_in_dbl += y * tile_width; 2078 + break; 2079 + } 2080 + break; 2081 + }; 2082 + for (x = 0; x < (int) tile_width; x++) 2083 + { 2084 + if (tile_x + x >= (int) width) 2085 + break; 2086 + switch (img->sample_format) 2087 + { 2088 + case GGRAPH_SAMPLE_INT: 2089 + switch (img->bits_per_sample) 2090 + { 2091 + case 8: 2092 + p_out_int8 = 2093 + (char *) (img->pixels); 2094 + p_out_int8 += 2095 + (img->width * 2096 + ((tile_y + y) - begin_row)) + 2097 + (tile_x + x); 2098 + *p_out_int8 = *p_in_int8++; 2099 + break; 2100 + case 16: 2101 + p_out_int16 = 2102 + (short *) (img->pixels); 2103 + p_out_int16 += 2104 + (img->width * 2105 + ((tile_y + y) - begin_row)) + 2106 + (tile_x + x); 2107 + *p_out_int16 = *p_in_int16++; 2108 + break; 2109 + case 32: 2110 + p_out_int32 = 2111 + (int *) (img->pixels); 2112 + p_out_int32 += 2113 + (img->width * 2114 + ((tile_y + y) - begin_row)) + 2115 + (tile_x + x); 2116 + *p_out_int32 = *p_in_int32++; 2117 + break; 2118 + }; 2119 + break; 2120 + case GGRAPH_SAMPLE_UINT: 2121 + switch (img->bits_per_sample) 2122 + { 2123 + case 8: 2124 + p_out_uint8 = 2125 + (unsigned char 2126 + *) (img->pixels); 2127 + p_out_uint8 += 2128 + (img->width * 2129 + ((tile_y + y) - begin_row)) + 2130 + (tile_x + x); 2131 + *p_out_uint8 = *p_in_uint8++; 2132 + break; 2133 + case 16: 2134 + p_out_uint16 = 2135 + (unsigned short 2136 + *) (img->pixels); 2137 + p_out_uint16 += 2138 + (img->width * 2139 + ((tile_y + y) - begin_row)) + 2140 + (tile_x + x); 2141 + *p_out_uint16 = *p_in_uint16++; 2142 + break; 2143 + case 32: 2144 + p_out_uint32 = 2145 + (unsigned int 2146 + *) (img->pixels); 2147 + p_out_uint32 += 2148 + (img->width * 2149 + ((tile_y + y) - begin_row)) + 2150 + (tile_x + x); 2151 + *p_out_uint32 = *p_in_uint32++; 2152 + break; 2153 + } 2154 + break; 2155 + case GGRAPH_SAMPLE_FLOAT: 2156 + switch (img->bits_per_sample) 2157 + { 2158 + case 32: 2159 + p_out_flt = 2160 + (float *) (img->pixels); 2161 + p_out_flt += 2162 + (img->width * 2163 + ((tile_y + y) - begin_row)) + 2164 + (tile_x + x); 2165 + *p_out_flt = *p_in_flt++; 2166 + break; 2167 + case 64: 2168 + p_out_dbl = 2169 + (double *) (img->pixels); 2170 + p_out_dbl += 2171 + (img->width * 2172 + ((tile_y + y) - begin_row)) + 2173 + (tile_x + x); 2174 + *p_out_dbl = *p_in_dbl++; 2175 + break; 2176 + }; 2177 + break; 2178 + }; 2179 + } 2180 + } 2181 + } 2182 + } 2183 + img->next_row += end_row - begin_row; 2184 + img->current_available_rows = end_row - begin_row; 2185 + } 2186 + else 2187 + { 2188 + for (strip_no = begin_row; strip_no < end_row; strip_no++) 2189 + { 2190 + /* reading a TIFF strip */ 2191 + if (!TIFFReadScanline (in, raster, strip_no, 0)) 2192 + return GGRAPH_TIFF_CODEC_ERROR; 2193 + switch (img->sample_format) 2194 + { 2195 + case GGRAPH_SAMPLE_INT: 2196 + switch (img->bits_per_sample) 2197 + { 2198 + case 8: 2199 + p_in_int8 = raster; 2200 + p_out_int8 = (char *) (img->pixels); 2201 + p_out_int8 += img->width * (strip_no - begin_row); 2202 + break; 2203 + case 16: 2204 + p_in_int16 = raster; 2205 + p_out_int16 = (short *) (img->pixels); 2206 + p_out_int16 += img->width * (strip_no - begin_row); 2207 + break; 2208 + case 32: 2209 + p_in_int32 = raster; 2210 + p_out_int32 = (int *) (img->pixels); 2211 + p_out_int32 += img->width * (strip_no - begin_row); 2212 + break; 2213 + }; 2214 + break; 2215 + case GGRAPH_SAMPLE_UINT: 2216 + switch (img->bits_per_sample) 2217 + { 2218 + case 8: 2219 + p_in_uint8 = raster; 2220 + p_out_uint8 = (unsigned char *) (img->pixels); 2221 + p_out_uint8 += img->width * (strip_no - begin_row); 2222 + break; 2223 + case 16: 2224 + p_in_uint16 = raster; 2225 + p_out_uint16 = (unsigned short *) (img->pixels); 2226 + p_out_uint16 += img->width * (strip_no - begin_row); 2227 + break; 2228 + case 32: 2229 + p_in_uint32 = raster; 2230 + p_out_uint32 = (unsigned int *) (img->pixels); 2231 + p_out_uint32 += img->width * (strip_no - begin_row); 2232 + break; 2233 + }; 2234 + break; 2235 + case GGRAPH_SAMPLE_FLOAT: 2236 + switch (img->bits_per_sample) 2237 + { 2238 + case 32: 2239 + p_in_flt = raster; 2240 + p_out_flt = (float *) (img->pixels); 2241 + p_out_flt += img->width * (strip_no - begin_row); 2242 + break; 2243 + case 64: 2244 + p_in_dbl = raster; 2245 + p_out_dbl = (double *) (img->pixels); 2246 + p_out_dbl += img->width * (strip_no - begin_row); 2247 + break; 2248 + } 2249 + break; 2250 + }; 2251 + for (x = 0; x < (int) width; x++) 2252 + { 2253 + switch (img->sample_format) 2254 + { 2255 + case GGRAPH_SAMPLE_INT: 2256 + switch (img->bits_per_sample) 2257 + { 2258 + case 8: 2259 + *p_out_int8++ = *p_in_int8++; 2260 + break; 2261 + case 16: 2262 + *p_out_int16++ = *p_in_int16++; 2263 + break; 2264 + case 32: 2265 + *p_out_int32++ = *p_in_int32++; 2266 + break; 2267 + }; 2268 + break; 2269 + case GGRAPH_SAMPLE_UINT: 2270 + switch (img->bits_per_sample) 2271 + { 2272 + case 8: 2273 + *p_out_uint8++ = *p_in_uint8++; 2274 + break; 2275 + case 16: 2276 + *p_out_uint16++ = *p_in_uint16++; 2277 + break; 2278 + case 32: 2279 + *p_out_uint32++ = *p_in_uint32++; 2280 + break; 2281 + } 2282 + break; 2283 + case GGRAPH_SAMPLE_FLOAT: 2284 + switch (img->bits_per_sample) 2285 + { 2286 + case 32: 2287 + *p_out_flt++ = *p_in_flt++; 2288 + break; 2289 + case 64: 2290 + *p_out_dbl++ = *p_in_dbl++; 2291 + break; 2292 + }; 2293 + break; 2294 + }; 2295 + } 2296 + } 2297 + img->next_row += end_row - begin_row; 2298 + img->current_available_rows = end_row - begin_row; 2299 + } 2300 + return GGRAPH_OK; 2301 +} 2302 + 2303 +GGRAPH_PRIVATE unsigned char 2304 +gg_match_strip_palette (const gGraphStripImagePtr img, unsigned char r, 2305 + unsigned char g, unsigned char b) 2306 +{ 2307 +/* handling palette colors */ 2308 + int index; 2309 + double min_dist = DBL_MAX; 2310 + double dist; 2311 + int min_index; 2312 + for (index = 0; index < img->max_palette; index++) 2313 + { 2314 + /* searching if already defined */ 2315 + if (img->palette_red[index] == r && img->palette_green[index] == g 2316 + && img->palette_blue[index] == b) 2317 + return (unsigned char) index; 2318 + } 2319 + if (img->max_palette < 255) 2320 + { 2321 + /* inserting a new palette entry */ 2322 + unsigned char i = img->max_palette; 2323 + img->max_palette += 1; 2324 + img->palette_red[i] = r; 2325 + img->palette_green[i] = g; 2326 + img->palette_blue[i] = b; 2327 + return i; 2328 + } 2329 +/* all right, the palette is already fully populated */ 2330 + for (index = 0; index < img->max_palette; index++) 2331 + { 2332 + /* computing the minimal euclidean distance */ 2333 + dist = 2334 + sqrt (((img->palette_red[index] - r) * (img->palette_red[index] - 2335 + r)) + 2336 + ((img->palette_green[index] - 2337 + g) * (img->palette_green[index] - g)) + 2338 + ((img->palette_blue[index] - 2339 + b) * (img->palette_blue[index] - b))); 2340 + if (dist < min_dist) 2341 + { 2342 + min_dist = dist; 2343 + min_index = index; 2344 + } 2345 + } 2346 + return (unsigned char) min_index; 2347 +} 2348 + 2349 +static int 2350 +common_strip_read_from_tiff (TIFF * in, void *tiff_buffer, 2351 + gGraphStripImagePtr img, uint32 width, 2352 + uint32 height, int is_tiled, int type, 2353 + uint32 tile_width, uint32 tile_height, 2354 + uint32 rows_strip) 2355 +{ 2356 +/* common utility: decoding a TIFF raster [by meta-strip] */ 2357 + uint32 *raster = tiff_buffer; 2358 + uint32 *scanline; 2359 + int x; 2360 + int y; 2361 + int img_y; 2362 + int strip_no; 2363 + uint32 pixel; 2364 + int tile_x; 2365 + int tile_y; 2366 + unsigned char red; 2367 + unsigned char green; 2368 + unsigned char blue; 2369 + unsigned char index; 2370 + unsigned char *p_out; 2371 + int begin_row = img->next_row; 2372 + int end_row = img->next_row + img->rows_per_block; 2373 + 2374 + if (type == GG_PIXEL_GRID) 2375 + return common_strip_read_from_tiff_grid (in, tiff_buffer, img, width, 2376 + height, is_tiled, tile_width, 2377 + tile_height); 2378 + 2379 + if (end_row > img->height) 2380 + end_row = img->height; 2381 + 2382 + if (is_tiled) 2383 + { 2384 + for (tile_y = 0; tile_y < (int) height; tile_y += tile_height) 2385 + { 2386 + /* scanning tiles by row */ 2387 + if ((tile_y + tile_height) <= (uint32) begin_row) 2388 + continue; 2389 + if (tile_y >= end_row) 2390 + break; 2391 + for (tile_x = 0; tile_x < (int) width; tile_x += tile_width) 2392 + { 2393 + /* reading a TIFF tile */ 2394 + if (!TIFFReadRGBATile (in, tile_x, tile_y, raster)) 2395 + return GGRAPH_TIFF_CODEC_ERROR; 2396 + for (y = 0; y < (int) tile_height; y++) 2397 + { 2398 + img_y = tile_y + (tile_height - y) - 1; 2399 + if (img_y < begin_row) 2400 + continue; 2401 + if (img_y >= end_row) 2402 + continue; 2403 + scanline = raster + (y * tile_width); 2404 + for (x = 0; x < (int) tile_width; x++) 2405 + { 2406 + if (tile_x + x >= (int) width) 2407 + break; 2408 + p_out = 2409 + img->pixels + 2410 + (img->scanline_width * 2411 + (img_y - begin_row)); 2412 + p_out += (tile_x + x) * img->pixel_size; 2413 + pixel = scanline[x]; 2414 + red = TIFFGetR (pixel); 2415 + green = TIFFGetG (pixel); 2416 + blue = TIFFGetB (pixel); 2417 + if (img->pixel_format == GG_PIXEL_PALETTE) 2418 + { 2419 + /* PALETTE image */ 2420 + index = 2421 + gg_match_strip_palette (img, red, 2422 + green, 2423 + blue); 2424 + *p_out++ = index; 2425 + } 2426 + else if (img->pixel_format == 2427 + GG_PIXEL_GRAYSCALE) 2428 + { 2429 + /* GRAYSCALE image */ 2430 + *p_out++ = red; 2431 + } 2432 + else 2433 + { 2434 + /* should be an RGB image */ 2435 + *p_out++ = red; 2436 + *p_out++ = green; 2437 + *p_out++ = blue; 2438 + } 2439 + } 2440 + } 2441 + } 2442 + } 2443 + img->next_row += end_row - begin_row; 2444 + img->current_available_rows = end_row - begin_row; 2445 + } 2446 + else 2447 + { 2448 + for (strip_no = 0; strip_no < (int) height; strip_no += rows_strip) 2449 + { 2450 + /* reading a TIFF strip */ 2451 + int effective_strip = rows_strip; 2452 + if ((strip_no + rows_strip) <= (uint32) begin_row) 2453 + continue; 2454 + if (strip_no >= end_row) 2455 + break; 2456 + if (!TIFFReadRGBAStrip (in, strip_no, raster)) 2457 + return GGRAPH_TIFF_CODEC_ERROR; 2458 + if ((strip_no + rows_strip) > height) 2459 + effective_strip = height - strip_no; 2460 + for (y = 0; y < (int) effective_strip; y++) 2461 + { 2462 + img_y = (strip_no + effective_strip) - (y + 1); 2463 + if (img_y < begin_row) 2464 + continue; 2465 + if (img_y >= end_row) 2466 + continue; 2467 + scanline = raster + (y * width); 2468 + p_out = 2469 + img->pixels + 2470 + (img->scanline_width * (img_y - begin_row)); 2471 + for (x = 0; x < (int) width; x++) 2472 + { 2473 + pixel = scanline[x]; 2474 + red = TIFFGetR (pixel); 2475 + green = TIFFGetG (pixel); 2476 + blue = TIFFGetB (pixel); 2477 + if (img->pixel_format == GG_PIXEL_PALETTE) 2478 + { 2479 + /* PALETTE image */ 2480 + index = 2481 + gg_match_strip_palette (img, red, green, 2482 + blue); 2483 + *p_out++ = index; 2484 + } 2485 + else if (img->pixel_format == GG_PIXEL_GRAYSCALE) 2486 + { 2487 + /* GRAYSCALE image */ 2488 + *p_out++ = red; 2489 + } 2490 + else 2491 + { 2492 + /* should be an RGB image */ 2493 + *p_out++ = red; 2494 + *p_out++ = green; 2495 + *p_out++ = blue; 2496 + } 2497 + } 2498 + } 2499 + } 2500 + img->next_row += end_row - begin_row; 2501 + img->current_available_rows = end_row - begin_row; 2502 + } 2503 + return GGRAPH_OK; 2504 +} 2505 + 2506 +GGRAPH_PRIVATE int 2507 +gg_image_strip_read_from_tiff (gGraphStripImagePtr img, int *progress) 2508 +{ 2509 +/* decoding a TIFF [by meta-strip] */ 2510 + struct tiff_codec_data *tiff_codec = 2511 + (struct tiff_codec_data *) (img->codec_data); 2512 + uint32 width = img->width; 2513 + uint32 height = img->height; 2514 + uint32 rows_strip = img->rows_per_strip; 2515 + int is_tiled = tiff_codec->is_tiled; 2516 + uint32 tile_width = img->tile_width; 2517 + uint32 tile_height = img->tile_height; 2518 + int type = img->pixel_format; 2519 + TIFF *in = tiff_codec->tiff_handle; 2520 + 2521 + int ret = 2522 + common_strip_read_from_tiff (in, tiff_codec->tiff_buffer, img, width, 2523 + height, is_tiled, type, tile_width, 2524 + tile_height, rows_strip); 2525 + 2526 + if (ret == GGRAPH_OK && progress != NULL) 2527 + *progress = 2528 + (int) (((double) (img->next_row + 1) * 100.0) / 2529 + (double) (img->height)); 2530 + return ret; 2531 +} 2532 + 2533 +GGRAPH_PRIVATE int 2534 +gg_image_prepare_to_tiff_by_strip (const gGraphStripImagePtr img, 2535 + const char *path, int layout, int tile_width, 2536 + int tile_height, int rows_per_strip, 2537 + int color_model, int bits_per_sample, 2538 + int sample_format, int num_palette, 2539 + unsigned char *red, unsigned char *green, 2540 + unsigned char *blue, int compression) 2541 +{ 2542 +/* preparing to export a TIFF [by meta-strips] */ 2543 + TIFF *out = (TIFF *) 0; 2544 + uint16 r_plt[256]; 2545 + uint16 g_plt[256]; 2546 + uint16 b_plt[256]; 2547 + int i; 2548 + int tiff_type; 2549 + tsize_t buf_size; 2550 + void *tiff_buffer = NULL; 2551 + struct tiff_codec_data *tiff_codec = NULL; 2552 + 2553 +/* suppressing TIFF warnings */ 2554 + TIFFSetWarningHandler (NULL); 2555 + 2556 +/* writing to file */ 2557 + out = TIFFOpen (path, "w"); 2558 + if (out == NULL) 2559 + goto error; 2560 + 2561 +/* setting up the TIFF headers */ 2562 + TIFFSetField (out, TIFFTAG_SUBFILETYPE, 0); 2563 + TIFFSetField (out, TIFFTAG_IMAGEWIDTH, img->width); 2564 + TIFFSetField (out, TIFFTAG_IMAGELENGTH, img->height); 2565 + TIFFSetField (out, TIFFTAG_XRESOLUTION, 300.0); 2566 + TIFFSetField (out, TIFFTAG_YRESOLUTION, 300.0); 2567 + TIFFSetField (out, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); 2568 + TIFFSetField (out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); 2569 + TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); 2570 + if (color_model == GGRAPH_COLORSPACE_PALETTE) 2571 + { 2572 + if (num_palette == 2) 2573 + { 2574 + if ((red[0] == 255 && green[0] == 255 && blue[0] == 255 2575 + && red[1] == 0 && green[1] == 0 && blue[1] == 0) 2576 + || (red[0] == 0 && green[0] == 0 && blue[0] == 0 2577 + && red[1] == 255 && green[1] == 255 && blue[1] == 255)) 2578 + { 2579 + /* MONOCHROME */ 2580 + tiff_type = TIFF_TYPE_MONOCHROME; 2581 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, 2582 + SAMPLEFORMAT_UINT); 2583 + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 1); 2584 + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, 1); 2585 + TIFFSetField (out, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB); 2586 + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, 2587 + PHOTOMETRIC_MINISWHITE); 2588 + if (compression == GGRAPH_TIFF_COMPRESSION_CCITTFAX3) 2589 + TIFFSetField (out, TIFFTAG_COMPRESSION, 2590 + COMPRESSION_CCITTFAX3); 2591 + else if (compression == GGRAPH_TIFF_COMPRESSION_CCITTFAX4) 2592 + TIFFSetField (out, TIFFTAG_COMPRESSION, 2593 + COMPRESSION_CCITTFAX4); 2594 + else 2595 + TIFFSetField (out, TIFFTAG_COMPRESSION, 2596 + COMPRESSION_NONE); 2597 + goto header_done; 2598 + } 2599 + } 2600 + /* PALETTE */ 2601 + tiff_type = TIFF_TYPE_PALETTE; 2602 + for (i = 0; i < img->max_palette; i++) 2603 + { 2604 + r_plt[i] = img->palette_red[i] * 256; 2605 + g_plt[i] = img->palette_green[i] * 256; 2606 + b_plt[i] = img->palette_blue[i] * 256; 2607 + } 2608 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); 2609 + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 1); 2610 + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, 8); 2611 + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE); 2612 + TIFFSetField (out, TIFFTAG_COLORMAP, r_plt, g_plt, b_plt); 2613 + if (compression == GGRAPH_TIFF_COMPRESSION_LZW) 2614 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_LZW); 2615 + else if (compression == GGRAPH_TIFF_COMPRESSION_DEFLATE) 2616 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); 2617 + else 2618 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); 2619 + } 2620 + if (color_model == GGRAPH_COLORSPACE_GRAYSCALE) 2621 + { 2622 + /* GRAYSCALE */ 2623 + tiff_type = TIFF_TYPE_GRAYSCALE; 2624 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); 2625 + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 1); 2626 + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, 8); 2627 + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); 2628 + if (compression == GGRAPH_TIFF_COMPRESSION_LZW) 2629 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_LZW); 2630 + else if (compression == GGRAPH_TIFF_COMPRESSION_DEFLATE) 2631 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); 2632 + else if (compression == GGRAPH_TIFF_COMPRESSION_JPEG) 2633 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_JPEG); 2634 + else 2635 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); 2636 + } 2637 + if (color_model == GGRAPH_COLORSPACE_TRUECOLOR 2638 + || color_model == GGRAPH_COLORSPACE_TRUECOLOR_ALPHA) 2639 + { 2640 + /* RGB */ 2641 + tiff_type = TIFF_TYPE_RGB; 2642 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); 2643 + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 3); 2644 + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, 8); 2645 + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); 2646 + if (compression == GGRAPH_TIFF_COMPRESSION_LZW) 2647 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_LZW); 2648 + else if (compression == GGRAPH_TIFF_COMPRESSION_DEFLATE) 2649 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); 2650 + else if (compression == GGRAPH_TIFF_COMPRESSION_JPEG) 2651 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_JPEG); 2652 + else 2653 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); 2654 + } 2655 + if (color_model == GGRAPH_COLORSPACE_GRID) 2656 + { 2657 + /* GRID data */ 2658 + 2659 + tiff_type = TIFF_TYPE_GRID; 2660 + if (sample_format == GGRAPH_SAMPLE_INT) 2661 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); 2662 + if (sample_format == GGRAPH_SAMPLE_UINT) 2663 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); 2664 + if (sample_format == GGRAPH_SAMPLE_FLOAT) 2665 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); 2666 + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 1); 2667 + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, bits_per_sample); 2668 + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); 2669 + if (compression == GGRAPH_TIFF_COMPRESSION_LZW) 2670 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_LZW); 2671 + else if (compression == GGRAPH_TIFF_COMPRESSION_DEFLATE) 2672 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); 2673 + else 2674 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); 2675 + } 2676 + 2677 + header_done: 2678 + TIFFSetField (out, TIFFTAG_SOFTWARE, "GaiaGraphics-tools"); 2679 + if (layout == GGRAPH_TIFF_LAYOUT_TILES) 2680 + { 2681 + TIFFSetField (out, TIFFTAG_TILEWIDTH, tile_width); 2682 + TIFFSetField (out, TIFFTAG_TILELENGTH, tile_height); 2683 + } 2684 + else 2685 + TIFFSetField (out, TIFFTAG_ROWSPERSTRIP, rows_per_strip); 2686 + 2687 +/* setting up the TIFF codec struct */ 2688 + tiff_codec = malloc (sizeof (struct tiff_codec_data)); 2689 + if (!tiff_codec) 2690 + goto error; 2691 + tiff_codec->is_geotiff = 0; 2692 + tiff_codec->is_writer = 1; 2693 + tiff_codec->tiff_handle = out; 2694 + tiff_codec->geotiff_handle = (GTIF *) 0; 2695 + tiff_codec->tiff_buffer = NULL; 2696 + if (layout == GGRAPH_TIFF_LAYOUT_TILES) 2697 + tiff_codec->is_tiled = 1; 2698 + else 2699 + tiff_codec->is_tiled = 0; 2700 + tiff_codec->tiff_type = tiff_type; 2701 + img->codec_data = tiff_codec; 2702 + 2703 +/* allocating the TIFF write buffer */ 2704 + if (img->pixel_format == GG_PIXEL_GRID) 2705 + { 2706 + if (tiff_codec->is_tiled) 2707 + buf_size = TIFFTileSize (out); 2708 + else 2709 + buf_size = TIFFScanlineSize (out); 2710 + } 2711 + else 2712 + { 2713 + if (tiff_codec->is_tiled) 2714 + buf_size = TIFFTileSize (out); 2715 + else 2716 + buf_size = TIFFScanlineSize (out); 2717 + } 2718 + tiff_buffer = malloc (buf_size); 2719 + if (!tiff_buffer) 2720 + goto error; 2721 + tiff_codec->tiff_buffer = tiff_buffer; 2722 + 2723 + return GGRAPH_OK; 2724 + 2725 + error: 2726 + if (out) 2727 + TIFFClose (out); 2728 + return GGRAPH_TIFF_CODEC_ERROR; 2729 +} 2730 + 2731 +static int 2732 +is_projected_srs (const char *proj4text) 2733 +{ 2734 +/* checks if this one is a PCS SRS */ 2735 + if (proj4text == NULL) 2736 + return 1; 2737 + if (strlen (proj4text) > 14) 2738 + { 2739 + if (strncmp (proj4text, "+proj=longlat ", 14) == 0) 2740 + return 0; 2741 + } 2742 + return 1; 2743 +} 2744 + 2745 +GGRAPH_PRIVATE int 2746 +gg_image_prepare_to_geotiff_by_strip (const gGraphStripImagePtr img, 2747 + const char *path, int layout, 2748 + int tile_width, int tile_height, 2749 + int rows_per_strip, int color_model, 2750 + int bits_per_sample, int sample_format, 2751 + int num_palette, unsigned char *red, 2752 + unsigned char *green, unsigned char *blue, 2753 + int compression) 2754 +{ 2755 +/* preparing to export a GeoTIFF [by meta-strips] */ 2756 + TIFF *out = (TIFF *) 0; 2757 + GTIF *gtif = (GTIF *) 0; 2758 + double tiepoint[6]; 2759 + double pixsize[3]; 2760 + uint16 r_plt[256]; 2761 + uint16 g_plt[256]; 2762 + uint16 b_plt[256]; 2763 + int i; 2764 + int tiff_type; 2765 + tsize_t buf_size; 2766 + void *tiff_buffer = NULL; 2767 + struct tiff_codec_data *tiff_codec = NULL; 2768 + 2769 +/* suppressing TIFF warnings */ 2770 + TIFFSetWarningHandler (NULL); 2771 + 2772 +/* writing to file */ 2773 + out = XTIFFOpen (path, "w"); 2774 + if (out == NULL) 2775 + goto error; 2776 + gtif = GTIFNew (out); 2777 + if (!gtif) 2778 + goto error; 2779 + 2780 +/* setting up the TIFF headers */ 2781 + TIFFSetField (out, TIFFTAG_SUBFILETYPE, 0); 2782 + TIFFSetField (out, TIFFTAG_IMAGEWIDTH, img->width); 2783 + TIFFSetField (out, TIFFTAG_IMAGELENGTH, img->height); 2784 + TIFFSetField (out, TIFFTAG_XRESOLUTION, 300.0); 2785 + TIFFSetField (out, TIFFTAG_YRESOLUTION, 300.0); 2786 + TIFFSetField (out, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); 2787 + TIFFSetField (out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); 2788 + TIFFSetField (out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); 2789 + if (color_model == GGRAPH_COLORSPACE_PALETTE) 2790 + { 2791 + if (num_palette == 2) 2792 + { 2793 + if ((red[0] == 255 && green[0] == 255 && blue[0] == 255 2794 + && red[1] == 0 && green[1] == 0 && blue[1] == 0) 2795 + || (red[0] == 0 && green[0] == 0 && blue[0] == 0 2796 + && red[1] == 255 && green[1] == 255 && blue[1] == 255)) 2797 + { 2798 + /* MONOCHROME */ 2799 + tiff_type = TIFF_TYPE_MONOCHROME; 2800 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, 2801 + SAMPLEFORMAT_UINT); 2802 + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 1); 2803 + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, 1); 2804 + TIFFSetField (out, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB); 2805 + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, 2806 + PHOTOMETRIC_MINISWHITE); 2807 + if (compression == GGRAPH_TIFF_COMPRESSION_CCITTFAX3) 2808 + TIFFSetField (out, TIFFTAG_COMPRESSION, 2809 + COMPRESSION_CCITTFAX3); 2810 + else if (compression == GGRAPH_TIFF_COMPRESSION_CCITTFAX4) 2811 + TIFFSetField (out, TIFFTAG_COMPRESSION, 2812 + COMPRESSION_CCITTFAX4); 2813 + else 2814 + TIFFSetField (out, TIFFTAG_COMPRESSION, 2815 + COMPRESSION_NONE); 2816 + goto header_done; 2817 + } 2818 + } 2819 + /* PALETTE */ 2820 + tiff_type = TIFF_TYPE_PALETTE; 2821 + for (i = 0; i < img->max_palette; i++) 2822 + { 2823 + r_plt[i] = img->palette_red[i] * 256; 2824 + g_plt[i] = img->palette_green[i] * 256; 2825 + b_plt[i] = img->palette_blue[i] * 256; 2826 + } 2827 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); 2828 + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 1); 2829 + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, 8); 2830 + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE); 2831 + TIFFSetField (out, TIFFTAG_COLORMAP, r_plt, g_plt, b_plt); 2832 + if (compression == GGRAPH_TIFF_COMPRESSION_LZW) 2833 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_LZW); 2834 + else if (compression == GGRAPH_TIFF_COMPRESSION_DEFLATE) 2835 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); 2836 + else 2837 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); 2838 + } 2839 + if (color_model == GGRAPH_COLORSPACE_GRAYSCALE) 2840 + { 2841 + /* GRAYSCALE */ 2842 + tiff_type = TIFF_TYPE_GRAYSCALE; 2843 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); 2844 + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 1); 2845 + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, 8); 2846 + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); 2847 + if (compression == GGRAPH_TIFF_COMPRESSION_LZW) 2848 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_LZW); 2849 + else if (compression == GGRAPH_TIFF_COMPRESSION_DEFLATE) 2850 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); 2851 + else if (compression == GGRAPH_TIFF_COMPRESSION_JPEG) 2852 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_JPEG); 2853 + else 2854 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); 2855 + } 2856 + if (color_model == GGRAPH_COLORSPACE_TRUECOLOR 2857 + || color_model == GGRAPH_COLORSPACE_TRUECOLOR_ALPHA) 2858 + { 2859 + /* RGB */ 2860 + tiff_type = TIFF_TYPE_RGB; 2861 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); 2862 + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 3); 2863 + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, 8); 2864 + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); 2865 + if (compression == GGRAPH_TIFF_COMPRESSION_LZW) 2866 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_LZW); 2867 + else if (compression == GGRAPH_TIFF_COMPRESSION_DEFLATE) 2868 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); 2869 + else if (compression == GGRAPH_TIFF_COMPRESSION_JPEG) 2870 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_JPEG); 2871 + else 2872 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); 2873 + } 2874 + if (color_model == GGRAPH_COLORSPACE_GRID) 2875 + { 2876 + /* GRID data */ 2877 + 2878 + tiff_type = TIFF_TYPE_GRID; 2879 + if (sample_format == GGRAPH_SAMPLE_INT) 2880 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); 2881 + if (sample_format == GGRAPH_SAMPLE_UINT) 2882 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); 2883 + if (sample_format == GGRAPH_SAMPLE_FLOAT) 2884 + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); 2885 + TIFFSetField (out, TIFFTAG_SAMPLESPERPIXEL, 1); 2886 + TIFFSetField (out, TIFFTAG_BITSPERSAMPLE, bits_per_sample); 2887 + TIFFSetField (out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); 2888 + if (compression == GGRAPH_TIFF_COMPRESSION_LZW) 2889 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_LZW); 2890 + else if (compression == GGRAPH_TIFF_COMPRESSION_DEFLATE) 2891 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); 2892 + else 2893 + TIFFSetField (out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); 2894 + } 2895 + 2896 + header_done: 2897 + TIFFSetField (out, TIFFTAG_SOFTWARE, "GaiaGraphics-tools"); 2898 + if (layout == GGRAPH_TIFF_LAYOUT_TILES) 2899 + { 2900 + TIFFSetField (out, TIFFTAG_TILEWIDTH, tile_width); 2901 + TIFFSetField (out, TIFFTAG_TILELENGTH, tile_height); 2902 + } 2903 + else 2904 + TIFFSetField (out, TIFFTAG_ROWSPERSTRIP, rows_per_strip); 2905 + 2906 +/* setting up the GeoTIFF Tags */ 2907 + pixsize[0] = img->pixel_x_size; 2908 + pixsize[1] = img->pixel_y_size; 2909 + pixsize[2] = 0.0; 2910 + TIFFSetField (out, GTIFF_PIXELSCALE, 3, pixsize); 2911 + tiepoint[0] = 0.0; 2912 + tiepoint[1] = 0.0; 2913 + tiepoint[2] = 0.0; 2914 + tiepoint[3] = img->upper_left_x; 2915 + tiepoint[4] = img->upper_left_y; 2916 + tiepoint[5] = 0.0; 2917 + TIFFSetField (out, GTIFF_TIEPOINTS, 6, tiepoint); 2918 + if (img->srs_name != NULL) 2919 + TIFFSetField (out, GTIFF_ASCIIPARAMS, img->srs_name); 2920 + if (img->proj4text != NULL) 2921 + GTIFSetFromProj4 (gtif, img->proj4text); 2922 + if (img->srs_name != NULL) 2923 + GTIFKeySet (gtif, GTCitationGeoKey, TYPE_ASCII, 0, img->srs_name); 2924 + if (is_projected_srs (img->proj4text)) 2925 + GTIFKeySet (gtif, ProjectedCSTypeGeoKey, TYPE_SHORT, 1, img->srid); 2926 + GTIFWriteKeys (gtif); 2927 + 2928 +/* setting up the TIFF codec struct */ 2929 + tiff_codec = malloc (sizeof (struct tiff_codec_data)); 2930 + if (!tiff_codec) 2931 + goto error; 2932 + tiff_codec->is_geotiff = 0; 2933 + tiff_codec->is_writer = 1; 2934 + tiff_codec->tiff_handle = out; 2935 + tiff_codec->geotiff_handle = (GTIF *) 0; 2936 + tiff_codec->tiff_buffer = NULL; 2937 + if (layout == GGRAPH_TIFF_LAYOUT_TILES) 2938 + tiff_codec->is_tiled = 1; 2939 + else 2940 + tiff_codec->is_tiled = 0; 2941 + tiff_codec->tiff_type = tiff_type; 2942 + img->codec_data = tiff_codec; 2943 + 2944 +/* allocating the TIFF write buffer */ 2945 + if (img->pixel_format == GG_PIXEL_GRID) 2946 + { 2947 + if (tiff_codec->is_tiled) 2948 + buf_size = TIFFTileSize (out); 2949 + else 2950 + buf_size = TIFFScanlineSize (out); 2951 + } 2952 + else 2953 + { 2954 + if (tiff_codec->is_tiled) 2955 + buf_size = TIFFTileSize (out); 2956 + else 2957 + buf_size = TIFFScanlineSize (out); 2958 + } 2959 + tiff_buffer = malloc (buf_size); 2960 + if (!tiff_buffer) 2961 + goto error; 2962 + tiff_codec->tiff_buffer = tiff_buffer; 2963 + 2964 + return GGRAPH_OK; 2965 + 2966 + error: 2967 + if (gtif) 2968 + GTIFFree (gtif); 2969 + if (out) 2970 + XTIFFClose (out); 2971 + return GGRAPH_TIFF_CODEC_ERROR; 2972 +} 2973 + 2974 +static int 2975 +tiff_write_tile_grid (const gGraphStripImagePtr img) 2976 +{ 2977 +/* scanline(s) TIFF compression [tiles] GRID data */ 2978 + struct tiff_codec_data *tiff_codec = 2979 + (struct tiff_codec_data *) (img->codec_data); 2980 + TIFF *out = tiff_codec->tiff_handle; 2981 + int tile_width = img->tile_width; 2982 + int tile_height = img->tile_height; 2983 + int row; 2984 + int col; 2985 + void *tile = tiff_codec->tiff_buffer; 2986 + char *p_in_int8; 2987 + char *p_out_int8; 2988 + unsigned char *p_in_uint8; 2989 + unsigned char *p_out_uint8; 2990 + short *p_in_int16; 2991 + short *p_out_int16; 2992 + unsigned short *p_in_uint16; 2993 + unsigned short *p_out_uint16; 2994 + int *p_in_int32; 2995 + int *p_out_int32; 2996 + unsigned int *p_in_uint32; 2997 + unsigned int *p_out_uint32; 2998 + float *p_in_flt; 2999 + float *p_out_flt; 3000 + double *p_in_dbl; 3001 + double *p_out_dbl; 3002 + uint32 tile_x; 3003 + uint32 tile_y; 3004 + int num_rows; 3005 + int num_cols; 3006 + 3007 + tile_y = img->next_row; 3008 + if (tile_y + tile_height > (uint32) (img->height)) 3009 + num_rows = img->height - tile_y; 3010 + else 3011 + num_rows = tile_height; 3012 + if (num_rows != img->current_available_rows) 3013 + return GGRAPH_TIFF_CODEC_ERROR; 3014 + 3015 + for (tile_x = 0; tile_x < (uint32) (img->width); tile_x += tile_width) 3016 + { 3017 + /* feeding a tile */ 3018 + if (tile_x + tile_width > (uint32) (img->width)) 3019 + num_cols = img->width - tile_x; 3020 + else 3021 + num_cols = tile_width; 3022 + for (row = 0; row < num_rows; row++) 3023 + { 3024 + switch (img->sample_format) 3025 + { 3026 + case GGRAPH_SAMPLE_UINT: 3027 + switch (img->bits_per_sample) 3028 + { 3029 + case 8: 3030 + p_out_uint8 = tile; 3031 + p_out_uint8 += (row * tile_width); 3032 + p_in_uint8 = (unsigned char *) (img->pixels); 3033 + p_in_uint8 += (row * img->width) + tile_x; 3034 + break; 3035 + case 16: 3036 + p_out_uint16 = tile; 3037 + p_out_uint16 += (row * tile_width); 3038 + p_in_uint16 = (unsigned short *) (img->pixels); 3039 + p_in_uint16 += (row * img->width) + tile_x; 3040 + break; 3041 + case 32: 3042 + p_out_uint32 = tile; 3043 + p_out_uint32 += (row * tile_width); 3044 + p_in_uint32 = (unsigned int *) (img->pixels); 3045 + p_in_uint32 += (row * img->width) + tile_x; 3046 + break; 3047 + }; 3048 + break; 3049 + case GGRAPH_SAMPLE_INT: 3050 + switch (img->bits_per_sample) 3051 + { 3052 + case 8: 3053 + p_out_int8 = tile; 3054 + p_out_int8 += (row * tile_width); 3055 + p_in_int8 = (char *) (img->pixels); 3056 + p_in_int8 += (row * img->width) + tile_x; 3057 + break; 3058 + case 16: 3059 + p_out_int16 = tile; 3060 + p_out_int16 += (row * tile_width); 3061 + p_in_int16 = (short *) (img->pixels); 3062 + p_in_int16 += (row * img->width) + tile_x; 3063 + break; 3064 + case 32: 3065 + p_out_int32 = tile; 3066 + p_out_int32 += (row * tile_width); 3067 + p_in_int32 = (int *) (img->pixels); 3068 + p_in_int32 += (row * img->width) + tile_x; 3069 + break; 3070 + }; 3071 + break; 3072 + case GGRAPH_SAMPLE_FLOAT: 3073 + switch (img->bits_per_sample) 3074 + { 3075 + case 32: 3076 + p_out_flt = tile; 3077 + p_out_flt += (row * tile_width); 3078 + p_in_flt = (float *) (img->pixels); 3079 + p_in_flt += (row * img->width) + tile_x; 3080 + break; 3081 + case 64: 3082 + p_out_dbl = tile; 3083 + p_out_dbl += (row * tile_width); 3084 + p_in_dbl = (double *) (img->pixels); 3085 + p_in_dbl += (row * img->width) + tile_x; 3086 + break; 3087 + }; 3088 + break; 3089 + }; 3090 + for (col = 0; col < num_cols; col++) 3091 + { 3092 + switch (img->sample_format) 3093 + { 3094 + case GGRAPH_SAMPLE_UINT: 3095 + switch (img->bits_per_sample) 3096 + { 3097 + case 8: 3098 + *p_out_uint8++ = *p_in_uint8++; 3099 + break; 3100 + case 16: 3101 + *p_out_uint16++ = *p_in_uint16++; 3102 + break; 3103 + case 32: 3104 + *p_out_uint32++ = *p_in_uint32++; 3105 + break; 3106 + }; 3107 + break; 3108 + case GGRAPH_SAMPLE_INT: 3109 + switch (img->bits_per_sample) 3110 + { 3111 + case 8: 3112 + *p_out_int8++ = *p_in_int8++; 3113 + break; 3114 + case 16: 3115 + *p_out_int16++ = *p_in_int16++; 3116 + break; 3117 + case 32: 3118 + *p_out_int32++ = *p_in_int32++; 3119 + break; 3120 + }; 3121 + break; 3122 + case GGRAPH_SAMPLE_FLOAT: 3123 + switch (img->bits_per_sample) 3124 + { 3125 + case 32: 3126 + *p_out_flt++ = *p_in_flt++; 3127 + break; 3128 + case 16: 3129 + *p_out_dbl++ = *p_in_dbl++; 3130 + break; 3131 + }; 3132 + break; 3133 + }; 3134 + } 3135 + } 3136 + if (TIFFWriteTile (out, tile, tile_x, tile_y, 0, 0) < 0) 3137 + return GGRAPH_TIFF_CODEC_ERROR; 3138 + } 3139 + img->next_row += num_rows; 3140 + return GGRAPH_OK; 3141 +} 3142 + 3143 +static int 3144 +tiff_write_strip_grid (const gGraphStripImagePtr img) 3145 +{ 3146 +/* scanline(s) TIFF compression [strips] GRID data */ 3147 + struct tiff_codec_data *tiff_codec = 3148 + (struct tiff_codec_data *) (img->codec_data); 3149 + TIFF *out = tiff_codec->tiff_handle; 3150 + int row; 3151 + int col; 3152 + void *scanline = tiff_codec->tiff_buffer; 3153 + char *p_in_int8; 3154 + char *p_out_int8; 3155 + unsigned char *p_in_uint8; 3156 + unsigned char *p_out_uint8; 3157 + short *p_in_int16; 3158 + short *p_out_int16; 3159 + unsigned short *p_in_uint16; 3160 + unsigned short *p_out_uint16; 3161 + int *p_in_int32; 3162 + int *p_out_int32; 3163 + unsigned int *p_in_uint32; 3164 + unsigned int *p_out_uint32; 3165 + float *p_in_flt; 3166 + float *p_out_flt; 3167 + double *p_in_dbl; 3168 + double *p_out_dbl; 3169 + 3170 + for (row = 0; row < img->current_available_rows; row++) 3171 + { 3172 + switch (img->sample_format) 3173 + { 3174 + case GGRAPH_SAMPLE_UINT: 3175 + switch (img->bits_per_sample) 3176 + { 3177 + case 8: 3178 + p_in_uint8 = (unsigned char *) (img->pixels); 3179 + p_in_uint8 += row * img->width; 3180 + p_out_uint8 = scanline; 3181 + break; 3182 + case 16: 3183 + p_in_uint16 = (unsigned short *) (img->pixels); 3184 + p_in_uint16 += row * img->width; 3185 + p_out_uint16 = scanline; 3186 + break; 3187 + case 32: 3188 + p_in_uint32 = (unsigned int *) (img->pixels); 3189 + p_in_uint32 += row * img->width; 3190 + p_out_uint32 = scanline; 3191 + break; 3192 + }; 3193 + break; 3194 + case GGRAPH_SAMPLE_INT: 3195 + switch (img->bits_per_sample) 3196 + { 3197 + case 8: 3198 + p_in_int8 = (char *) (img->pixels); 3199 + p_in_int8 += row * img->width; 3200 + p_out_int8 = scanline; 3201 + break; 3202 + case 16: 3203 + p_in_int16 = (short *) (img->pixels); 3204 + p_in_int16 += row * img->width; 3205 + p_out_int16 = scanline; 3206 + break; 3207 + case 32: 3208 + p_in_int32 = (int *) (img->pixels); 3209 + p_in_int32 += row * img->width; 3210 + p_out_int32 = scanline; 3211 + break; 3212 + }; 3213 + break; 3214 + case GGRAPH_SAMPLE_FLOAT: 3215 + switch (img->bits_per_sample) 3216 + { 3217 + case 32: 3218 + p_in_flt = (float *) (img->pixels); 3219 + p_in_flt += row * img->width; 3220 + p_out_flt = scanline; 3221 + break; 3222 + case 64: 3223 + p_in_dbl = (double *) (img->pixels); 3224 + p_in_dbl += row * img->width; 3225 + p_out_dbl = scanline; 3226 + break; 3227 + }; 3228 + break; 3229 + }; 3230 + for (col = 0; col < img->width; col++) 3231 + { 3232 + switch (img->sample_format) 3233 + { 3234 + case GGRAPH_SAMPLE_UINT: 3235 + switch (img->bits_per_sample) 3236 + { 3237 + case 8: 3238 + *p_out_uint8++ = *p_in_uint8++; 3239 + break; 3240 + case 16: 3241 + *p_out_uint16++ = *p_in_uint16++; 3242 + break; 3243 + case 32: 3244 + *p_out_uint32++ = *p_in_uint32++; 3245 + break; 3246 + }; 3247 + break; 3248 + case GGRAPH_SAMPLE_INT: 3249 + switch (img->bits_per_sample) 3250 + { 3251 + case 8: 3252 + *p_out_int8++ = *p_in_int8++; 3253 + break; 3254 + case 16: 3255 + *p_out_int16++ = *p_in_int16++; 3256 + break; 3257 + case 32: 3258 + *p_out_int32++ = *p_in_int32++; 3259 + break; 3260 + }; 3261 + break; 3262 + case GGRAPH_SAMPLE_FLOAT: 3263 + switch (img->bits_per_sample) 3264 + { 3265 + case 32: 3266 + *p_out_flt++ = *p_in_flt++; 3267 + break; 3268 + case 16: 3269 + *p_out_dbl++ = *p_in_dbl++; 3270 + break; 3271 + }; 3272 + break; 3273 + }; 3274 + } 3275 + if (TIFFWriteScanline (out, scanline, img->next_row + row, 0) < 0) 3276 + return GGRAPH_TIFF_CODEC_ERROR; 3277 + } 3278 + img->next_row += img->current_available_rows; 3279 + return GGRAPH_OK; 3280 +} 3281 + 3282 +static int 3283 +tiff_write_tile_monochrome (const gGraphStripImagePtr img) 3284 +{ 3285 +/* scanline(s) TIFF compression [tiles] MONOCHROME */ 3286 + struct tiff_codec_data *tiff_codec = 3287 + (struct tiff_codec_data *) (img->codec_data); 3288 + TIFF *out = tiff_codec->tiff_handle; 3289 + int tile_width = img->tile_width; 3290 + int tile_height = img->tile_height; 3291 + int row; 3292 + int col; 3293 + int pixel; 3294 + unsigned char byte; 3295 + int pos; 3296 + unsigned char *tile = tiff_codec->tiff_buffer; 3297 + unsigned char *line_ptr; 3298 + uint32 tile_x; 3299 + uint32 tile_y; 3300 + int num_rows; 3301 + int num_cols; 3302 + tsize_t scan_bytes = TIFFTileSize (out) / tile_height; 3303 + 3304 + tile_y = img->next_row; 3305 + if (tile_y + tile_height > (uint32) (img->height)) 3306 + num_rows = img->height - tile_y; 3307 + else 3308 + num_rows = tile_height; 3309 + if (num_rows != img->current_available_rows) 3310 + return GGRAPH_TIFF_CODEC_ERROR; 3311 + 3312 + for (tile_x = 0; tile_x < (uint32) (img->width); tile_x += tile_width) 3313 + { 3314 + /* feeding a tile */ 3315 + if (tile_x + tile_width > (uint32) (img->width)) 3316 + num_cols = img->width - tile_x; 3317 + else 3318 + num_cols = tile_width; 3319 + for (row = 0; row < num_rows; row++) 3320 + { 3321 + unsigned char *p_in; 3322 + byte = 0x00; 3323 + pos = 0; 3324 + line_ptr = tile + (row * scan_bytes); 3325 + for (col = 0; col < num_cols; col++) 3326 + { 3327 + p_in = img->pixels + (row * img->scanline_width) + 3328 + ((tile_x + col) * img->pixel_size); 3329 + pixel = img->palette_red[*p_in]; /* expected to be a PALETTE image */ 3330 + if (pixel == 0) 3331 + { 3332 + /* handling a black pixel */ 3333 + switch (pos) 3334 + { 3335 + case 0: 3336 + byte |= 0x80; 3337 + break; 3338 + case 1: 3339 + byte |= 0x40; 3340 + break; 3341 + case 2: 3342 + byte |= 0x20; 3343 + break; 3344 + case 3: 3345 + byte |= 0x10; 3346 + break; 3347 + case 4: 3348 + byte |= 0x08; 3349 + break; 3350 + case 5: 3351 + byte |= 0x04; 3352 + break; 3353 + case 6: 3354 + byte |= 0x02; 3355 + break; 3356 + case 7: 3357 + byte |= 0x01; 3358 + break; 3359 + }; 3360 + } 3361 + pos++; 3362 + if (pos > 7) 3363 + { 3364 + /* exporting an octet */ 3365 + *line_ptr++ = byte; 3366 + byte = 0x00; 3367 + pos = 0; 3368 + } 3369 + } 3370 + if (pos > 0) /* exporting the last octet */ 3371 + *line_ptr++ = byte; 3372 + } 3373 + if (TIFFWriteTile (out, tile, tile_x, tile_y, 0, 0) < 0) 3374 + return GGRAPH_TIFF_CODEC_ERROR; 3375 + } 3376 + img->next_row += num_rows; 3377 + return GGRAPH_OK; 3378 +} 3379 + 3380 +static int 3381 +tiff_write_strip_monochrome (const gGraphStripImagePtr img) 3382 +{ 3383 +/* scanline(s) TIFF compression [strips] MONOCHROME */ 3384 + struct tiff_codec_data *tiff_codec = 3385 + (struct tiff_codec_data *) (img->codec_data); 3386 + TIFF *out = tiff_codec->tiff_handle; 3387 + int row; 3388 + int col; 3389 + int pixel; 3390 + unsigned char byte; 3391 + int pos; 3392 + unsigned char *scanline = tiff_codec->tiff_buffer; 3393 + unsigned char *line_ptr; 3394 + for (row = 0; row < img->current_available_rows; row++) 3395 + { 3396 + unsigned char *p_in = img->pixels + (row * img->scanline_width); 3397 + line_ptr = scanline; 3398 + for (col = 0; col < img->width; col++) 3399 + byte = 0x00; 3400 + pos = 0; 3401 + for (col = 0; col < img->width; col++) 3402 + { 3403 + pixel = img->palette_red[*p_in++]; /* expected to be a PALETTE image */ 3404 + if (pixel == 0) 3405 + { 3406 + /* handling a black pixel */ 3407 + switch (pos) 3408 + { 3409 + case 0: 3410 + byte |= 0x80; 3411 + break; 3412 + case 1: 3413 + byte |= 0x40; 3414 + break; 3415 + case 2: 3416 + byte |= 0x20; 3417 + break; 3418 + case 3: 3419 + byte |= 0x10; 3420 + break; 3421 + case 4: 3422 + byte |= 0x08; 3423 + break; 3424 + case 5: 3425 + byte |= 0x04; 3426 + break; 3427 + case 6: 3428 + byte |= 0x02; 3429 + break; 3430 + case 7: 3431 + byte |= 0x01; 3432 + break; 3433 + }; 3434 + } 3435 + pos++; 3436 + if (pos > 7) 3437 + { 3438 + /* exporting an octet */ 3439 + *line_ptr++ = byte; 3440 + byte = 0x00; 3441 + pos = 0; 3442 + } 3443 + } 3444 + if (pos > 0) /* exporting the last octet */ 3445 + *line_ptr++ = byte; 3446 + if (TIFFWriteScanline (out, scanline, img->next_row + row, 0) < 0) 3447 + return GGRAPH_TIFF_CODEC_ERROR; 3448 + } 3449 + img->next_row += img->current_available_rows; 3450 + return GGRAPH_OK; 3451 +} 3452 + 3453 +static int 3454 +tiff_write_tile_palette (const gGraphStripImagePtr img) 3455 +{ 3456 +/* scanline(s) TIFF compression [tiles] PALETTE */ 3457 + struct tiff_codec_data *tiff_codec = 3458 + (struct tiff_codec_data *) (img->codec_data); 3459 + TIFF *out = tiff_codec->tiff_handle; 3460 + int tile_width = img->tile_width; 3461 + int tile_height = img->tile_height; 3462 + int row; 3463 + int col; 3464 + unsigned char *tile = tiff_codec->tiff_buffer; 3465 + unsigned char *line_ptr; 3466 + uint32 tile_x; 3467 + uint32 tile_y; 3468 + int num_rows; 3469 + int num_cols; 3470 + 3471 + tile_y = img->next_row; 3472 + if (tile_y + tile_height > (uint32) (img->height)) 3473 + num_rows = img->height - tile_y; 3474 + else 3475 + num_rows = tile_height; 3476 + if (num_rows != img->current_available_rows) 3477 + return GGRAPH_TIFF_CODEC_ERROR; 3478 + 3479 + for (tile_x = 0; tile_x < (uint32) (img->width); tile_x += tile_width) 3480 + { 3481 + /* feeding a tile */ 3482 + if (tile_x + tile_width > (uint32) (img->width)) 3483 + num_cols = img->width - tile_x; 3484 + else 3485 + num_cols = tile_width; 3486 + for (row = 0; row < num_rows; row++) 3487 + { 3488 + unsigned char *p_in; 3489 + line_ptr = tile + (row * tile_width); 3490 + for (col = 0; col < num_cols; col++) 3491 + { 3492 + p_in = img->pixels + (row * img->scanline_width) + 3493 + ((tile_x + col) * img->pixel_size); 3494 + *line_ptr++ = *p_in++; /* expected to be a PALETTE image anyway */ 3495 + } 3496 + } 3497 + if (TIFFWriteTile (out, tile, tile_x, tile_y, 0, 0) < 0) 3498 + return GGRAPH_TIFF_CODEC_ERROR; 3499 + } 3500 + img->next_row += num_rows; 3501 + return GGRAPH_OK; 3502 +} 3503 + 3504 +static int 3505 +tiff_write_strip_palette (const gGraphStripImagePtr img) 3506 +{ 3507 +/* scanline(s) TIFF compression [strips] PALETTE */ 3508 + struct tiff_codec_data *tiff_codec = 3509 + (struct tiff_codec_data *) (img->codec_data); 3510 + TIFF *out = tiff_codec->tiff_handle; 3511 + int row; 3512 + int col; 3513 + unsigned char *scanline = tiff_codec->tiff_buffer; 3514 + unsigned char *line_ptr; 3515 + for (row = 0; row < img->current_available_rows; row++) 3516 + { 3517 + unsigned char *p_in = img->pixels + (row * img->scanline_width); 3518 + line_ptr = scanline; 3519 + for (col = 0; col < img->width; col++) 3520 + *line_ptr++ = *p_in++; /* expected to be a PALETTE image anyway */ 3521 + if (TIFFWriteScanline (out, scanline, img->next_row + row, 0) < 0) 3522 + return GGRAPH_TIFF_CODEC_ERROR; 3523 + } 3524 + img->next_row += img->current_available_rows; 3525 + return GGRAPH_OK; 3526 +} 3527 + 3528 +static int 3529 +tiff_write_tile_grayscale (const gGraphStripImagePtr img) 3530 +{ 3531 +/* scanline(s) TIFF compression [tiles] GRAYSCALE */ 3532 + struct tiff_codec_data *tiff_codec = 3533 + (struct tiff_codec_data *) (img->codec_data); 3534 + TIFF *out = tiff_codec->tiff_handle; 3535 + int tile_width = img->tile_width; 3536 + int tile_height = img->tile_height; 3537 + int row; 3538 + int col; 3539 + unsigned char *tile = tiff_codec->tiff_buffer; 3540 + unsigned char *line_ptr; 3541 + uint32 tile_x; 3542 + uint32 tile_y; 3543 + int num_rows; 3544 + int num_cols; 3545 + 3546 + tile_y = img->next_row; 3547 + if (tile_y + tile_height > (uint32) (img->height)) 3548 + num_rows = img->height - tile_y; 3549 + else 3550 + num_rows = tile_height; 3551 + if (num_rows != img->current_available_rows) 3552 + return GGRAPH_TIFF_CODEC_ERROR; 3553 + 3554 + for (tile_x = 0; tile_x < (uint32) (img->width); tile_x += tile_width) 3555 + { 3556 + /* feeding a tile */ 3557 + if (tile_x + tile_width > (uint32) (img->width)) 3558 + num_cols = img->width - tile_x; 3559 + else 3560 + num_cols = tile_width; 3561 + for (row = 0; row < num_rows; row++) 3562 + { 3563 + unsigned char *p_in; 3564 + line_ptr = tile + (row * tile_width); 3565 + for (col = 0; col < num_cols; col++) 3566 + { 3567 + p_in = img->pixels + (row * img->scanline_width) + 3568 + ((tile_x + col) * img->pixel_size); 3569 + *line_ptr++ = *p_in++; /* expected to be a GRAYSCALE image anyway */ 3570 + } 3571 + } 3572 + if (TIFFWriteTile (out, tile, tile_x, tile_y, 0, 0) < 0) 3573 + return GGRAPH_TIFF_CODEC_ERROR; 3574 + } 3575 + img->next_row += num_rows; 3576 + return GGRAPH_OK; 3577 +} 3578 + 3579 +static int 3580 +tiff_write_strip_grayscale (const gGraphStripImagePtr img) 3581 +{ 3582 +/* scanline(s) TIFF compression [strips] GRAYSCALE */ 3583 + struct tiff_codec_data *tiff_codec = 3584 + (struct tiff_codec_data *) (img->codec_data); 3585 + TIFF *out = tiff_codec->tiff_handle; 3586 + int row; 3587 + int col; 3588 + unsigned char *scanline = tiff_codec->tiff_buffer; 3589 + unsigned char *line_ptr; 3590 + 3591 + for (row = 0; row < img->current_available_rows; row++) 3592 + { 3593 + unsigned char *p_in = img->pixels + (row * img->scanline_width); 3594 + line_ptr = scanline; 3595 + for (col = 0; col < img->width; col++) 3596 + *line_ptr++ = *p_in++; /* expected to be a GRAYSCALE image anyway */ 3597 + if (TIFFWriteScanline (out, scanline, img->next_row + row, 0) < 0) 3598 + return GGRAPH_TIFF_CODEC_ERROR; 3599 + } 3600 + img->next_row += img->current_available_rows; 3601 + return GGRAPH_OK; 3602 +} 3603 + 3604 +static int 3605 +tiff_write_tile_rgb (const gGraphStripImagePtr img) 3606 +{ 3607 +/* scanline(s) TIFF compression [tiles] RGB */ 3608 + struct tiff_codec_data *tiff_codec = 3609 + (struct tiff_codec_data *) (img->codec_data); 3610 + TIFF *out = tiff_codec->tiff_handle; 3611 + int tile_width = img->tile_width; 3612 + int tile_height = img->tile_height; 3613 + int row; 3614 + int col; 3615 + unsigned char *tile = tiff_codec->tiff_buffer; 3616 + unsigned char *line_ptr; 3617 + uint32 tile_x; 3618 + uint32 tile_y; 3619 + int num_rows; 3620 + int num_cols; 3621 + 3622 + tile_y = img->next_row; 3623 + if (tile_y + tile_height > (uint32) (img->height)) 3624 + num_rows = img->height - tile_y; 3625 + else 3626 + num_rows = tile_height; 3627 + if (num_rows != img->current_available_rows) 3628 + return GGRAPH_TIFF_CODEC_ERROR; 3629 + 3630 + for (tile_x = 0; tile_x < (uint32) (img->width); tile_x += tile_width) 3631 + { 3632 + /* feeding a tile */ 3633 + if (tile_x + tile_width > (uint32) (img->width)) 3634 + num_cols = img->width - tile_x; 3635 + else 3636 + num_cols = tile_width; 3637 + for (row = 0; row < num_rows; row++) 3638 + { 3639 + unsigned char *p_in; 3640 + unsigned char r; 3641 + unsigned char g; 3642 + unsigned char b; 3643 + line_ptr = tile + (row * tile_width * 3); 3644 + for (col = 0; col < num_cols; col++) 3645 + { 3646 + p_in = 3647 + img->pixels + 3648 + (row * img->scanline_width) + 3649 + ((tile_x + col) * img->pixel_size); 3650 + if (img->pixel_format == GG_PIXEL_RGB) 3651 + { 3652 + r = *p_in++; 3653 + g = *p_in++; 3654 + b = *p_in++; 3655 + } 3656 + else if (img->pixel_format == GG_PIXEL_RGBA) 3657 + { 3658 + r = *p_in++; 3659 + g = *p_in++; 3660 + b = *p_in++; 3661 + p_in++; /* skipping Alpha */ 3662 + } 3663 + else if (img->pixel_format == GG_PIXEL_ARGB) 3664 + { 3665 + p_in++; /* skipping Alpha */ 3666 + r = *p_in++; 3667 + g = *p_in++; 3668 + b = *p_in++; 3669 + } 3670 + else if (img->pixel_format == GG_PIXEL_BGR) 3671 + { 3672 + b = *p_in++; 3673 + g = *p_in++; 3674 + r = *p_in++; 3675 + } 3676 + else if (img->pixel_format == GG_PIXEL_BGRA) 3677 + { 3678 + b = *p_in++; 3679 + g = *p_in++; 3680 + r = *p_in++; 3681 + p_in++; /* skipping Alpha */ 3682 + } 3683 + *line_ptr++ = r; 3684 + *line_ptr++ = g; 3685 + *line_ptr++ = b; 3686 + } 3687 + } 3688 + if (TIFFWriteTile (out, tile, tile_x, tile_y, 0, 0) < 0) 3689 + return GGRAPH_TIFF_CODEC_ERROR; 3690 + } 3691 + img->next_row += num_rows; 3692 + return GGRAPH_OK; 3693 +} 3694 + 3695 +static int 3696 +tiff_write_strip_rgb (const gGraphStripImagePtr img) 3697 +{ 3698 +/* scanline(s) TIFF compression [strips] RGB */ 3699 + struct tiff_codec_data *tiff_codec = 3700 + (struct tiff_codec_data *) (img->codec_data); 3701 + TIFF *out = tiff_codec->tiff_handle; 3702 + int row; 3703 + int col; 3704 + unsigned char *scanline = tiff_codec->tiff_buffer; 3705 + unsigned char *line_ptr; 3706 + 3707 + for (row = 0; row < img->current_available_rows; row++) 3708 + { 3709 + unsigned char *p_in = img->pixels + (row * img->scanline_width); 3710 + unsigned char r; 3711 + unsigned char g; 3712 + unsigned char b; 3713 + line_ptr = scanline; 3714 + for (col = 0; col < img->width; col++) 3715 + { 3716 + if (img->pixel_format == GG_PIXEL_RGB) 3717 + { 3718 + r = *p_in++; 3719 + g = *p_in++; 3720 + b = *p_in++; 3721 + } 3722 + else if (img->pixel_format == GG_PIXEL_RGBA) 3723 + { 3724 + r = *p_in++; 3725 + g = *p_in++; 3726 + b = *p_in++; 3727 + p_in++; /* skipping Alpha */ 3728 + } 3729 + else if (img->pixel_format == GG_PIXEL_ARGB) 3730 + { 3731 + p_in++; /* skipping Alpha */ 3732 + r = *p_in++; 3733 + g = *p_in++; 3734 + b = *p_in++; 3735 + } 3736 + else if (img->pixel_format == GG_PIXEL_BGR) 3737 + { 3738 + b = *p_in++; 3739 + g = *p_in++; 3740 + r = *p_in++; 3741 + } 3742 + else if (img->pixel_format == GG_PIXEL_BGRA) 3743 + { 3744 + b = *p_in++; 3745 + g = *p_in++; 3746 + r = *p_in++; 3747 + p_in++; 3748 + } 3749 + *line_ptr++ = r; 3750 + *line_ptr++ = g; 3751 + *line_ptr++ = b; 3752 + } 3753 + if (TIFFWriteScanline (out, scanline, img->next_row + row, 0) < 0) 3754 + return GGRAPH_TIFF_CODEC_ERROR; 3755 + } 3756 + img->next_row += img->current_available_rows; 3757 + return GGRAPH_OK; 3758 +} 3759 + 3760 +GGRAPH_PRIVATE int 3761 +gg_image_write_to_tiff_by_strip (const gGraphStripImagePtr img, int *progress) 3762 +{ 3763 +/* scanline(s) TIFF compression [by strip] */ 3764 + int ret; 3765 + struct tiff_codec_data *tiff_codec = 3766 + (struct tiff_codec_data *) (img->codec_data); 3767 + if (tiff_codec->tiff_type == TIFF_TYPE_RGB) 3768 + { 3769 + if (tiff_codec->is_tiled) 3770 + ret = tiff_write_tile_rgb (img); 3771 + else 3772 + ret = tiff_write_strip_rgb (img); 3773 + } 3774 + if (tiff_codec->tiff_type == TIFF_TYPE_GRAYSCALE) 3775 + { 3776 + if (tiff_codec->is_tiled) 3777 + ret = tiff_write_tile_grayscale (img); 3778 + else 3779 + ret = tiff_write_strip_grayscale (img); 3780 + } 3781 + if (tiff_codec->tiff_type == TIFF_TYPE_PALETTE) 3782 + { 3783 + if (tiff_codec->is_tiled) 3784 + ret = tiff_write_tile_palette (img); 3785 + else 3786 + ret = tiff_write_strip_palette (img); 3787 + } 3788 + if (tiff_codec->tiff_type == TIFF_TYPE_MONOCHROME) 3789 + { 3790 + if (tiff_codec->is_tiled) 3791 + ret = tiff_write_tile_monochrome (img); 3792 + else 3793 + ret = tiff_write_strip_monochrome (img); 3794 + } 3795 + if (tiff_codec->tiff_type == TIFF_TYPE_GRID) 3796 + { 3797 + if (tiff_codec->is_tiled) 3798 + ret = tiff_write_tile_grid (img); 3799 + else 3800 + ret = tiff_write_strip_grid (img); 3801 + } 3802 + if (ret == GGRAPH_OK && progress != NULL) 3803 + *progress = 3804 + (int) (((double) (img->next_row + 1) * 100.0) / 3805 + (double) (img->height)); 3806 + return ret; 3807 +}